<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

<<option txtUserName>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

----
Also see [[AdvancedOptions]]
<<importTiddlers>>

!!! Definition
Suppose $k$ is a commutative unital ring.  The algebraic $n$-simplex, denoted $\Delta^n_s\;$ is the affine scheme defined by 
\[
\Delta^n_s := \mathrm{Spec} k[x_0,\ldots,x_{n}]/(\sum_{i=0}^n x_i = 1). 
\]
!!! Properties
* The scheme $\Delta^n_s\;$ is (non-canonically) isomorphic to ${\mathbb A}^n$.
* The various projection maps make $\Delta^{\bullet}_s\;$ into a cosimplicial scheme.  
I've included links to audio or video presentations about motivic homotopy theory.
!!!! MSRI 1998
* [[F. Morel - The Steenrod Algebra|http://www.msri.org/communications/ln/msri/1998/homotopy/morel/1/index.html]]
* [[F. Morel - Basic facts and problems in the homotopy theory of algebraic varieties|http://www.msri.org/communications/ln/msri/1998/homotopy/morel/2/index.html]]
* [[F. Morel - Grothendieck-Witt rings of quadratic forms in the homotopy theory of algebraic varieties|http://www.msri.org/communications/ln/msri/1998/homotopy/morel/3/index.html]]
* [[V. Voevodsky - Introduction to homotopy theory I|http://www.msri.org/communications/ln/msri/1998/homotopy/voevodsky/1/index.html]]
* [[V. Voevodsky - Introduction to homotopy theory II - Algebraic Cobordism|http://www.msri.org/communications/ln/msri/1998/homotopy/voevodsky/3/index.html]]
* [[V. Voevodsky - Degree formula|http://www.msri.org/communications/ln/msri/1998/homotopy/voevodsky/4/index.html]]
!!!! Fields Institute 2007
* [[F. Morel - Lecture series: Structure and computations of A¹-homotopy sheaves, with applications]]
!!!! Colloque Grothendieck IHES 2009
* [[V. Voevodsky - The Bloch-Kato conjecture|http://www.dailymotion.com/tag/Grothendieck/video/x8jeme_colloque-grothendieck-vladimir-voev_tech]]
There are a number of triangulated categories that can be called ${\mathbb A}^1$-derived categories depending on context.  

!!! Definition/Construction
Equip the category ${\mathcal Sm}_k$ with the structure of a site by endowing it with the Nisnevich topology.  Let ${\mathcal Ab}_k$ be the abelian category of Nisnevich sheaves of abelian groups on ${\mathcal Sm}_k$.  Let $D_{-}{\mathcal Ab}_k$ be the derived category of bounded below chain complexes of abelian groups (following the conventions in the subject, complexes have differential of degree $-1$).  Say that a complex $A$ is ${\mathbb A}^1$-local if for any smooth scheme $U$ and any integer $i$, the induced map
\[
{\mathbb H}^i_{Nis}(U,A) \to {\mathbb H}^i(U \times {\mathbb A}^1,A)
\]
induced by pullback along the projection $U \times {\mathbb A}^1 \to U$ is a bijection.  Say that a morphism of complexes $f: B \to B'$ is an ${\mathbb A}^1$-weak equivalence if for any ${\mathbb A}^1$-local complex $A$, the map
\[
Hom_{D_{-}{\mathcal Ab}_k}(B',A) \to Hom_{D_{-}{\mathcal Ab}_k}(B,A)
\] 
is a bijection.  The ''effective ${\mathbb A}^1$-derived category'', denoted $D_{{\mathbb A}^1}^{eff}(k)$ is obtained by localizing $D_{-}{\mathcal Ab}_k$ at the class of ${\mathbb A}^1$-weak equivalences.  

!!! Properties
* There is a [[Hurewicz functor]] from ${\mathcal H}(k) \to D_{{\mathbb A}^1}^{eff}(k)$ where ${\mathcal H}(k)$ is the unstable ${\mathbb A}^1$[[-homotopy category|A¹-homotopy category]]; this induces the homomorphism in the [[A¹-Hurewicz theorem]] and is part of an adjunction between these two categories.
* Given a sheaf of abelian groups $A$ viewed as a complex situated in degree $0$, to say that $A$ is ${\mathbb A}^1$-local as a complex is precisely to say that $A$ is [[Strictly A¹-invariant]].
* Morel proved the [[stable A¹-connectivity theorem|Stable A¹-connectivity theorem]] asserting that the ${\mathbb A}^1$-localization of a $(-1)$-connected complex remains $(-1)$-connected. 
* The ${\mathbb A}^1$-derived category admits a natural $t$-structure called the [[homotopy t-structure|Homotopy t-structure]]; this is a consequence of the [[stable A¹-connectivity theorem|Stable A¹-connectivity theorem]].
* The concept of ${\mathbb A}^1$[[-homology|A¹-homology]] is naturally defined using the ${\mathbb A}^1$-derived category.  
* Working ``stably" and rationally in the etale topology, the ${\mathbb A}^1$-derived category can be used as a ``transfer-free" construction of [[Voevodsky's derived category of motives|Derived category of mixed motives]].  
!!! Summary
The (unstable) ${\mathbb A}^1$-Hurewicz theorem relates the first non-vanishing ${\mathbb A}^1$[[-homotopy (sheaf of) group(s)|A¹-homotopy groups]] of a highly ${\mathbb A}^1$-connected space with a corresponding ${\mathbb A}^1$[[-homology (sheaf of) groups|A¹-homology]].  

<part Hurewiczhomomorphism>
!!! The ${\mathbb A}^1$-Hurewicz homomorphism
For the set-up recall that if $({\mathcal X},x)\;$ is a [[pointed space|Motivic space]] and $C_*^{{\mathbb A}^1}({\mathcal X})$ denotes the ${\mathbb A}^1$-singular complex of ${\mathcal X}$, we can consider the [[pointed space|Motivic space]] $K(C_*^{{\mathbb A}^1}({\mathcal X}))$, i.e., the [[Eilenberg-MacLane sheaf]] associated with the complex $C_*^{{\mathbb A}^1}({\mathcal X})$.  There is a canonical adjunction map 
\[
{\mathcal X} \to K(C_*^{{\mathbb A}^1}({\mathcal X})),
\] 
coming from the [[sheaf-theoretic Dold-Kan correspondence|Sheaf theoretic Dold-Kan correspondence]] that one might call the //space level// Hurewicz homomorphism.  The ${\mathbb A}^1$-homotopy (sheaves of) groups of $K(C_*^{{\mathbb A}^1}({\mathcal X}))$ can be identified with the ${\mathbb A}^1$-homology (sheaves of) groups of ${\mathcal X}$ and by functoriality there are induced morphisms
\[
\pi_i^{{\mathbb A}^1}({\mathcal X},x) \to H_i^{{\mathbb A}^1}({\mathcal X})
\]
that one calls Hurewicz homomorphisms.</part>

<part Statement>
!!! ${\mathbb A}^1$-Hurewicz theorem
__''Theorem''__ (Morel): Suppose $({\mathcal X},x)\;$ is a pointed ${\mathbb A}^1$-$n$-connected space.
* If $n > 0$, then the Hurewicz homomorphism $\pi_{n+1}^{{\mathbb A}^1}({\mathcal X},x) \to H_{n+1}^{{\mathbb A}^1}({\mathcal X})$ is an isomorphism.
* If $n = 0$, then the Hurewicz homomorphism $\pi_1^{{\mathbb A}^1}({\mathcal X},x) \to H_1^{{\mathbb A}^1}({\mathcal X})$ is the initial morphism from $\pi_1^{{\mathbb A}^1}({\mathcal X})$ to a strictly ${\mathbb A}^1$[[-invariant sheaf of groups|Strictly A¹-invariant]].  
* If furthermore $\pi_1^{{\mathbb A}^1}({\mathcal X})$ is known to be strictly ${\mathbb A}^1$-invariant, then the Hurewicz homomorphism $\pi_1^{{\mathbb A}^1}({\mathcal X},x) \to H_1^{{\mathbb A}^1}({\mathcal X})$ is an isomorphism.</part>

!!! Remarks
* By a theorem of Morel, strongly ${\mathbb A}^1$-invariant sheaves of //abelian// groups are known to be strictly ${\mathbb A}^1$-invariant.
* It is not (at the moment) known whether, for $n = 0$, the Hurewicz homomorphism identifies $H_1^{{\mathbb A}^1}({\mathcal X})$ as the commutator subsheaf of groups of $\pi_1^{{\mathbb A}^1}({\mathcal X},x)$.
Suppose $f: {\mathcal X} \to {\mathcal Y}$ is a morphism of [[spaces|Motivic space]].  The ${\mathbb A}^1$-Whitehead theorem gives a way to detect whether $f$ is an ${\mathbb A}^1$[[-weak equivalence|A¹-weak equivalence]] using ${\mathbb A}^1$[[-homotopy groups|A¹-homotopy groups]].

''Theorem'': A morphism $f: {\mathcal X} \to {\mathcal Y}$ of pointed ${\mathbb A}^1$-connected spaces is an ${\mathbb A}^1$-weak equivalence if and only if the induced maps
\[
f_*: \pi_i^{{\mathbb A}^1}({\mathcal X}) \to \pi_i^{{\mathbb A}^1}({\mathcal Y})
\]
are isomorphisms for any $i > 0$.  

//Proof.// Suppose $Ex_{{\mathbb A}^1}$ denotes a ${\mathbb A}^1$-fibrant replacement functor.  In particular, the map ${\mathcal X} \to Ex_{{\mathbb A}^1}({\mathcal X})$ is a monomorphism and ${\mathbb A}^1$[[-weak equivalence|A¹-weak equivalence]], and $Ex_{{\mathbb A}^1}({\mathcal X})$ is fibrant ${\mathbb A}^1$[[-local|A¹-local]].  Thus, the morphism $f$ is an ${\mathbb A}^1$-weak equivalence if and only if the induced map $Ex_{{\mathbb A}^1}({\mathcal X}) \to Ex_{{\mathbb A}^1}({\mathcal Y})$ is a weak equivalence of simplicial sheaves.  The result now follows from the definition of ${\mathbb A}^1$-homotopy groups together with the fact that simplicial weak equivalences can be checked stalkwise.  
''Author(s)'': F. Morel
''Publication information'': International Congress of Mathematicians. Vol. II, 1035-1059, Eur. Math. Soc., Zürich, 2006.
''Link'': [[Journal|http://www.icm2006.org/proceedings/Vol_II/contents/ICM_Vol_2_49.pdf]]

''Abstract'': We present some recent results in ${\mathbb A}^1$-algebraic topology, which means both in the ${\mathbb A}^1$-homotopy theory of schemes and its relationship with algebraic geometry. This refers to the classical relationship between homotopy theory and (differential) topology. We explain several examples of `motivic' versions of classical results: the theory of the Brouwer degree, the classification of ${\mathbb A}^1$-coverings through the ${\mathbb A}^1$-fundamental group, the Hurewicz Theorem and the ${\mathbb A}^1$-homotopy of algebraic spheres, and the ${\mathbb A}^1$-homotopy classification of vector bundles. We also give some applications and perspectives.

''Notes'':
''Author(s)'': F. Morel
''Journal'': //Preprint// (2006)
''Link'': [[Author's homepage (.PDF)|http://www.mathematik.uni-muenchen.de/~morel/A1homotopy.pdf]]
''Abstract'':  No abstract, long introduction. 

''Notes'':
!!! Definition
Let $k$ be a Noetherian scheme.  Suppose ${\mathcal X}$ is a [[simplicial space|Motivic space]].  The __sheaf of ${\mathbb A}^1$-connected components of ${\mathcal X}$__, denoted $\pi_0^{{\mathbb A}^1}({\mathcal X})\;$ is the object of ${\mathcal Shv}_{Nis}({\mathcal Sm}_k)\;$ associated with the presheaf
\[
U \mapsto [U,{\mathcal X}]_{{\mathbb A}^1},
\] where $[U,{\mathcal X}]_{{\mathbb A}^1}$ denotes the set of ${\mathbb A}^1$-homotopy classes of maps from $U$ to $X$.  

A simplicial space ${\mathcal X}$ (as above) is __${\mathbb A}^1$-connected__ if one has $\pi_0^{{\mathbb A}^1}({\mathcal X}) = \ast$, where $\ast$ is the final object of ${\mathcal Spc}_k$.  

A simplicial space ${\mathcal X}$ is __${\mathbb A}^1$-disconnected__ if it is not ${\mathbb A}^1$-connected.  

!!! Properties
One of the most important results about ${\mathbb A}^1$-connectedness is the following result, sometimes called the unstable ${\mathbb A}^1$-connectivity theorem (see [[A¹-homotopy theory of schemes|MoVo99]] Section 2 Corollary 3.22).

''Theorem'' (Morel,Voevodsky): Suppose ${\mathcal X}$ is [[simplicial space|Motivic space]].  Suppose $f: {\mathcal X} \to {\mathcal X}'$ is an ${\mathbb A}^1$[[-weak equivalence|A¹-weak equivalence]] with ${\mathcal X}'$ an ${\mathbb A}^1$[[-local space|A¹-local]].  Suppose ${\mathcal X}_0$ denotes the sheaf of $0$-simplices of ${\mathcal X}$.  The induced morphism
\[
{\mathcal X}_0 \to \pi_0^{{\mathbb A}^1}({\mathcal X})
\]
is an epimorphism.  In particular, if ${\mathcal X}$ is simplicially connected, then it is ${\mathbb A}^1$-connected.  

* An immediate corollary of this result is that if ${\mathcal X}$ is ${\mathbb A}^1$-connected, then ${\mathcal X}$ has a non-trivial $k$-rational point.  

!!! Connections with geometry
Suppose now that $k$ is a field.  It was originally hoped that ${\mathbb A}^1$-connectedness would be closely connected with rational connectedness in the sense of Campana, Kollar, Miyaoka, and Mori.  
  
''Definition'': A simplicial space ${\mathcal X}$ is __${\mathbb A}^1$-chain connected__ if the following holds.  For any (possibly trivial) separable finitely generated field extension $L/k$, and any two elements of $x,y \in {\mathcal X}(\mathrm{Spec} L)$, there exist a chain of morphisms 
\[
f_i: {\mathbb A}^1_L \to {\mathcal X} \;\;\;\;\;\; i = 0,\ldots,n-1
\] and elements $x_0,\ldots,x_n \in {\mathcal X}(\mathrm{Spec} L)$ such that $x_0 = x$, $x_n = y$, and $f_i(0) = x_i$, and $f_i(1) = x_{i+1}$.

One has the following result relating ${\mathbb A}^1$-chain connectedness with ${\mathbb A}^1$-connectedness.  

''Proposition'' (Asok, Doran): If ${\mathcal X}$ is an ${\mathbb A}^1$-chain connected simplicial space, then ${\mathcal X}$ is ${\mathbb A}^1$-connected.  

Furthermore, one can prove a converse to this result. 

''Theorem'' (Asok, Morel): If $X$ is a smooth proper ${\mathbb A}^1$-connected scheme, then $X$ is ${\mathbb A}^1$-chain connected.  

Using the definition of retract rationality and the weak factorization theorem, one can prove the following result.   

''Theorem'' (Asok, Morel): If $X$ is a [[retract|Retract k-rational]] $k$-rational smooth proper scheme over a field having characteristic $0$, then $X$ is ${\mathbb A}^1$-connected.  

!!! Examples
* For infinite fields $k$, any smooth scheme $X$ admitting an open affine cover by schemes isomorphic to affine spaces is ${\mathbb A}^1$-connected.     
* Smooth varieties that are ${\mathbb A}^1$[[-rigid|A¹-rigid]], and not isomorphic to a point, are ${\mathbb A}^1$-disconnected.  
!!! Definition
A space ${\mathcal X}$ is said to be ${\mathbb A}^1$-__contractible__ if the canonical morphism ${\mathcal X} \to \ast$ (to the ``point," i.e., the final object of the category of [[simplicial spaces|Motivic space]]) is an ${\mathbb A}^1$-[[weak equivalence|A¹-weak equivalence]].  

!!! Examples
* By construction ${\mathbb A}^n$ is ${\mathbb A}^1$-contractible.  
* Given a (split) unipotent group $U$ acting (scheme-theoretically) freely on affine space ${\mathbb A}^n$ such a quotient ${\mathbb A}^n/U$ exists as a scheme, the quotient $Y = {\mathbb A}^n / U$ is ${\mathbb A}^1$-contractible.  Many examples exist where $Y$ is not isomorphic to affine space.  For example, take the quadric $Q_4$ defined as a hypersurface in ${\mathbb A}^5$ by the equation \[x_1x_4 - x_2x_3 = x_5(x_5+1).\]  Let $E_2$ denote the codimension $2$ closed subscheme (isomorphic to ${\mathbb A}^2$) of $Q_4$ defined by the conditions $x_1 = x_2 = 0$, $x_5 = -1$.  Then $Q_4 \setminus E$ is an ${\mathbb A}^1$-contractible smooth scheme over ${\mathrm{Spec}} {\mathbb Z}$, and can't be isomorphic to affine space as it is quasi-affine yet not affine.  For more constructions of this form, see the paper [[Unipotent quotients and some A¹-contractible smooth schemes|index.html#%5B%5BOn%20unipotent%20quotients%20and%20some%20A%C2%B9-%20contractible%20smooth%20schemes%5D%5D]] by A. Asok and B. Doran.  
* Generalizing this construction, consider the smooth affine quadric hypersurface defined by the equation \[x_1x_{m+1} + \cdots + x_{m}x_{2m} = x_{2m+1}(1+ x_{2m+1}).\] The complement of the closed subscheme $E_m$ defined by $x_1 = \cdots = x_m = 0$ and $x_{2m+1} = -1$, which we will denote $X_{2m}$ can be shown to be ${\mathbb A}^1$-contractible.  For $m > 2$, this ${\mathbb A}^1$-contractible smooth scheme cannot be realized as a quotient of affine space by the free action of a unipotent group.  These examples are useful in connection with geometric representation of [[motivic spheres|Motivic sphere]] and are studied in the paper [[Homotopy theory of smooth affine quadrics|index.html#%5B%5BHomotopy%20theory%20of%20smooth%20affine%20quadrics%20revisited%5D%5D]] by A. Asok and B. Doran. 
* If $G$ is a linear algebraic group over a field $k$, Morel and Voevodsky construct a model for the [[classifying space|Classifying space]] $BG$ of $G$.  To do this, choose a faithful $k$-rational representation $(V,\rho)$ of $G$.  The group $G$ acts on $V^{\oplus N}$ diagonally.  One can show that, for $N > \dim V$, there is a dense open subset $V_N$ of $V^{\oplus N}$ where $G$ acts scheme-theoretically freely and a quotient $V_N/G$ exists as a smooth scheme.  The inclusion $V^{\oplus N} \hookrightarrow V^{\oplus N+1}$ (as the first $N$ summands) induces a closed immersion $V_N/G \to V_{N+1}/G$.  We let $EG(\rho) = {\mathrm{colim}}_N V_N$ and $BG(\rho) = {\mathrm{colim}}_N V_N/G$.  One can show that $EG(\rho)$ is ${\mathbb A}^1$-contractible.  
!!! Definition
A morphism $f: {\mathcal X} \to {\mathcal Y}$ of [[spaces|Motivic space]] makes ${\mathcal X}$ into an ${\mathbb A}^1$-cover of ${\mathcal Y}$ if it has the //unique// right lifting property for any map $j: {\mathcal A} \to {\mathcal B}$ that is both a monomorphism and an ${\mathbb A}^1$-[[weak equivalence|A¹-weak equivalence]]. If furthermore, ${\mathcal X}$ and ${\mathcal Y}$ are ${\mathbb A}^1$[[-connected|A¹-connected]], then we'll say that $f$ makes ${\mathcal X}$ an ${\mathbb A}^1$-covering space of ${\mathcal Y}$.  

!!! Properties
Note that by definition, an ${\mathbb A}^1$-cover is automatically an ${\mathbb A}^1$[[-fibration|A¹-fibration]].  Furthermore, ${\mathbb A}^1$-covers behave in much the same fashion as ordinary covers.
* If $f: {\mathcal X}' \to {\mathcal X}$ is an ${\mathbb A}^1$-cover, $g: {\mathcal Y} \to {\mathcal X}$ is any morphism, and $f'$ denotes the pullback of $f$ along $g$, then $f': {\mathcal X}' \times_{{\mathcal X}} {\mathcal Y} \to {\mathcal Y}$ is an ${\mathbb A}^1$-cover. 
* If $f: {\mathcal X}'' \to {\mathcal X}'$ and $g: {\mathcal X}' \to {\mathcal X}$ are ${\mathbb A}^1$-covers, then the composite $fg: {\mathcal X}'' \to {\mathcal X}$ is an ${\mathbb A}^1$-cover.  
* If $f': {\mathcal X}' \to {\mathcal X}$ and $f'': {\mathcal X}'' \to {\mathcal X}$ are ${\mathbb A}^1$-covers, and $h: {\mathcal X}'' \to {\mathcal X}'$ is a morphism commuting with $f''$ and $f'$ that is an ${\mathbb A}^1$-weak equivalence, then $h$ is an isomorphism. 
Furthermore, just as in ordinary topology, any pointed ${\mathbb A}^1$-connected space admits a ``universal ${\mathbb A}^1$[[-covering space|A¹-universal covering space]]". 

''Theorem'' (Morel): Given any pointed ${\mathbb A}^1$[[-connected space|A¹-connected]] $({\mathcal X},x)$, there exists a unique up to unique isomorphism pointed ${\mathbb A}^1$-simply connected ${\mathbb A}^1$-covering space $\tilde{{\mathcal X}} \to {\mathcal X}$. The space $\tilde{{\mathcal X}}$ is a $\pi_1^{{\mathbb A}^1}({\mathcal X})$-torsor over ${\mathcal X}$.  

!!! Examples
If $G$ is a [[strongly|Strongly A¹-invariant]] ${\mathbb A}^1$-invariant sheaf of groups, and ${\mathcal X}$ is a space, then any $G$-torsor ${\mathcal P} \to {\mathcal X}$ is an ${\mathbb A}^1$-cover of ${\mathcal X}$.  In particular, if $X$ is a smooth scheme, and $T$ is a torus, then any $T$-torsor over $X$ is an ${\mathbb A}^1$-cover.  
!!! Definition
A morphism $f: {\mathcal X} \to {\mathcal Y}$ of [[spaces|Motivic space]] is an ${\mathbb A}^1$-__fibration__ if it has the right lifting property for any map $j: {\mathcal A} \to {\mathcal B}$ that is both a monomorphism and an ${\mathbb A}^1$-[[weak equivalence|A¹-weak equivalence]].  

An __${\mathbb A}^1$-acyclic fibration__ is an ${\mathbb A}^1$-fibration that is also an ${\mathbb A}^1$-weak equivalence.  

!!! Examples
An ${\mathbb A}^1$[[-cover|A¹-covering space]] is an example of an ${\mathbb A}^1$-fibration.
!!! Definition
Suppose ${\mathcal X}$ is a [[motivic space|Motivic space]].  Let $D_{{\mathbb A}^1}(k)$ denoted the ${\mathbb A}^1$[[-derived category|A¹-Derived category]], which is obtained by localizing the derived category of Nisnevich sheaves of abelian groups at ${\mathbb A}^1$-weak equivalences in a manner analogous to the way the ${\mathbb A}^1$[[-homotopy category|A¹-homotopy category]] is obtained from the [[simplicial homotopy category|Simplicial homotopy category]] by localizing at ${\mathbb A}^1$-weak equivalences.

Let $Z({\mathcal X})$ denote the free sheaf of abelian groups on the simplices of ${\mathcal X}$.  We let $C_{*}(Z({\mathcal X}))\;$ denote the [[normalized chain complex|Normalized chain complex]] associated with $Z({\mathcal X})$, which is a chain complex of Nisnevich sheaves of abelian groups.  Let $C_*^{{\mathbb A}^1}({\mathcal X})\;$ denote the ${\mathbb A}^1$-localization of $C_{*}(Z({\mathcal X}))$; this complex is called the __${\mathbb A}^1$-singular chain complex of ${\mathcal X}$__.  The __${\mathbb A}^1$-homology sheaves of groups of ${\mathcal X}$__ are defined by the formulae:
\[
H_i^{{\mathbb A}^1}({\mathcal X}) := H_i(C_*^{{\mathbb A}^1}({\mathcal X})).
\]
These sheaves of groups are covariantly functorial in ${\mathcal X}$. 

Suppose $({\mathcal X},x)\;$ is a pointed space.  The canonical map ${\mathcal X} \to {\mathrm{Spec}}\;k$ induces a map $C_*^{{\mathbb A}^1}({\mathcal X}) \to {\mathbb Z}\;$ that is split by the point $x: {\mathrm{Spec}}\;k \to {\mathcal X}$.  We denote by $\tilde{C}_*^{{\mathbb A}^1}({\mathcal X})\;$ the kernel of this projection map, which we refer to as the __reduced ${\mathbb A}^1$-singular chain complex__.  The reduced ${\mathbb A}^1$-homology groups of ${\mathcal X}$ are defined by the formulae:
\[
\tilde{H}_i^{{\mathbb A}^1}(X) := H_i(\tilde{C}_*^{{\mathbb A}^1}({\mathcal X})).
\]

!!! Properties
Suppose $({\mathcal X},x)$ is a pointed space.  Essentially by their definition, the ${\mathbb A}^1$-homology commute with simplicial suspension.  In other words, the natural map 
\[
\tilde{H}_i^{{\mathbb A}^1}({\mathcal X}) \to \tilde{H}_{i+1}^{{\mathbb A}^1}(S^1_s \wedge {\mathcal X})
\]
is an isomorphism.  
The ${\mathbb A}^1$-homology groups of a space ${\mathcal X}$ are strictly ${\mathbb A}^1$[[-invariant|Strictly A¹-invariant]] Nisnevich sheaves of groups.  For any such space, $H_i^{{\mathbb A}^1}({\mathcal X})$ is known to vanish for $i < 0$.  There is a [[Mayer-Vietoris sequence|Mayer-Vietoris for A¹-homology]] for ${\mathbb A}^1$-homology groups associated with an open cover of a smooth scheme $X$.  The ${\mathbb A}^1$-homology groups (or rather their reduced analogs) are the recipients of the ${\mathbb A}^1$[[-Hurewicz  homomorphism|A¹-Hurewicz theorem/Hurewiczhomomorphism]]:
\[
\pi_i^{{\mathbb A}^1}({\mathcal X},x) \to H_i^{{\mathbb A}^1}({\mathcal X}).
\] 
There is also a corresponding [[Hurewicz theorem|A¹-Hurewicz theorem/Statement]] in ${\mathbb A}^1$-homotopy theory.
If $X$ is a smooth scheme, there are maps
\[
H_i^{{\mathbb A}^1}(X) \to H_i^{S}(X)
\]
to the [[Suslin homology sheaves|Suslin homology]].  

!!! Conjectural properties
If $X$ is a smooth scheme over a field of dimension $n$, then the groups $H_i^{{\mathbb A}^1}(X)$ are expected to vanish for $i > 2n$.  If furthermore $X$ is affine, then one expects that $H_i^{{\mathbb A}^1}(X)$ will vanish for $i > n$.  
An ${\mathbb A}^1$-homotopy category is a framework in which one can apply many ideas from homotopy theory to study (smooth) schemes.  The distinguishing feature of such a homotopy category, which justifies prefixing ``${\mathbb A}^1$" to ``homotopy category," is that in the resulting category, one formally inverts all projection morphisms of the form $X \times {\mathbb A}^1 \to X$ for a smooth scheme $X$.  Rather than being a single object, there are various models that are [[equivalent|Quillen equivalence]] from the standpoint of the theory of [[model categories|Model category]].  However, sometimes people speak of ''the'' ${\mathbb A}^1$-homotopy category, which probably refers to the model constructed by Morel and Voevodsky in the paper [[A¹-homotopy theory of schemes|MoVo99]].  Nevertheless, various models have been exploited to different ends.

* <<slider chkConstructionidea ./Ideaofconstruction "Construction of A¹-homotopy categories: general idea" "Idea of the construction">> 
* <<slider chkInjectivelocal ./Injectivelocal "The Morel-Voevodsky construction: definition and properties" "The Morel-Voevodsky construction: definition and properties">>
* <<slider chktobeaddeda1homotopycategory ./Tobeadded "Things to add" "Discussion regarding things to add.">>

<part Ideaofconstruction hidden>
!!! Idea of construction
* Start with ${\mathcal Sm}_S$: here $S$ is a Noetherian base scheme of finite Krull dimensions, and an object of ${\mathcal Sm}_S$ is a scheme that is separated, smooth and has finite type over $S$. 
* Choose a complete and cocomplete (i.e., admitting all limits and colimits indexed by small diagram categories) category ${\mathcal Spc}_S$ admitting a (close-to) fully-faithful embedding ${\mathcal Sm}_S \to {\mathcal Spc}_S$, i.e., a convenient category of //spaces//.
** A ``standard" choice for ${\mathcal Spc}_S$ consists of presheaves or sheaves of sets over ${\mathcal Sm}_S$ (where sheaves are considered with respect to some fixed [[Grothendieck topology]]), and the functor is just the Yoneda embedding, which is fully-faithful if the topology considered is sub-canonical.  
** In practice, one does not consider just presheaves or sheaves of sets, but ${\mathcal C}$-valued presheaves or sheaves, for some category ${\mathcal C}$ that naturally has a built-in ``homotopy theory."  Most commonly, ${\mathcal C}$ is the category of simplicial sets, but models involving cubical sets or related constructions can be used.    
* Equip ${\mathcal Spc}_S$ with a [[model structure|Model category]] that amalgamates the homotopy theory of the previous point with the geometry of schemes.  
** The homotopy category associated with a given model structure only depends on the weak equivalences, and in practice the weak equivalences reflect some choice of Grothendieck topology on ${\mathcal Sm}_S$.
** At this stage different choices of topology are used to different ends.  The [[Nisnevich topology]] is frequently chosen for ${\mathbb A}^1$-homotopy theory, but one could also choose the [[étale topology]].  
** In conjunction with choosing ${\mathcal C}$ to be the category of simplicial sets, one obtains a [[simplicial homotopy category|Simplicial homotopy category]]. 
* Localize the model structure on ${\mathcal Spc}_S$ with respect to the class of morphisms of the form ${\mathcal X} \times {\mathbb A}^1 \to {\mathcal X}$.  
** Localizations of the required form are called [[left Bousfield localizations|Bousfield localization]].  If the model structure one chooses is sufficiently nice, general theory allows one to deduce that the required localized category exists.
</part>

<part Injectivelocal hidden>
!!! Definition (Morel-$$Voevodsky or injective local model structure)
The __${\mathbb A}^1$-homotopy category__, as constructed by Morel and Voevodsky in [[A¹-homotopy theory of schemes|MoVo99]], is the homotopy category for a [[model category structure|model category]] on $\Delta^{\circ} {\mathcal Spc}_S$ the category of [[simplicial spaces|Motivic space]] over a Noetherian base scheme $S$, i.e., the category of Nisnevich sheaves of simplicial sets on ${\mathcal Sm}_S$.  In this model structure, the weak equivalences are ${\mathbb A}^1$[[-weak equivalences|A¹-weak equivalence]], the cofibrations are ${\mathbb A}^1$[[-cofibrations|A¹-cofibration]], which are monomorphisms of simplicial sheaves, and the fibrations are ${\mathbb A}^1$[[-fibrations|A¹-fibration]], i.e., those morphism that have the right lifting property with respect to cofibrations that are ${\mathbb A}^1$-weak equivalences.  The homotopy category obtained by localizing at the class of ${\mathbb A}^1$-weak equivalences (which exists by the theory of [[model categories|model category]]) is usually denoted ${\mathcal H}(S)$. 

Similarly, if $\Delta^{\circ} {\mathcal Spc}_{S,\bullet}$ denotes the category of pointed simplicial spaces, then $\Delta^{\circ} {\mathcal Spc}_{S,\bullet}$ can be equipped with a model category structure analogous to the above.  In this model structure, weak equivalences, cofibrations and fibrations are defined to be those morphisms of pointed spaces where the underlying morphisms of simplicial spaces are ${\mathbb A}^1$-weak equivalences, ${\mathbb A}^1$-cofibrations or ${\mathbb A}^1$-fibrations.  These notions are called pointed ${\mathbb A}^1$-weak equivalences, etc.  The homotopy category obtained by localizing at this class of weak equivalences is called the __pointed ${\mathbb A}^1$-homotopy category__ and denoted ${\mathcal H}_{\bullet}(S)$.   

!!!! Properties
The injective local model structure described above is [[proper|Proper model category]] and [[simplicial|Simplicial model category]].
</part>  

<part Tobeadded hidden>
Things to add: various other models that have been used in the literature, projective model structure, different topologies; references</part>
!!! Definitions
Suppose ${\mathcal X}$ and ${\mathcal Y}$ are two [[spaces|Motivic space]].  The set of unpointed ${\mathbb A}^1$-homotopy classes of maps between ${\mathcal X}$ and ${\mathcal Y}$, is defined by 
\[
[{\mathcal X},{\mathcal Y}]_{{\mathbb A}^1}:= Hom_{{\mathcal H}(k)}({\mathcal X},{\mathcal Y}).
\]
If $({\mathcal X},x)$ and $({\mathcal Y},y)$ are pointed spaces, then the set of pointed ${\mathbb A}^1$-homotopy classes of maps between ${\mathcal X}$ and ${\mathcal Y}$, is defined by
\[
[({\mathcal X},x),({\mathcal Y},y)]_{{\mathbb A}^1} := Hom_{{\mathcal H}_{\bullet}(k)}(({\mathcal X},x),({\mathcal Y},y))
\]
In both cases, the sets in question can be computed by taking a simplicially fibrant and ${\mathbb A}^1$[[-local|A¹-local]] replacement of ${\mathcal Y}$ and computed homomorphisms in the corresponding simplicial homotopy category.  

!!! Properties
Note that there is always a map $[({\mathcal X},x),({\mathcal Y},y)]_{{\mathbb A}^1} \to [{\mathcal X},{\mathcal Y}]_{{\mathbb A}^1}$ gotten by ``forgetting base-points." If ${\mathcal X} = S^i_s$, we can say more about this comparison map.    
!!! Definition
Suppose $k$ is a Noetherian base scheme.  If ${\mathcal X}$ is a [[space|Motivic space]], the sheaf of ${\mathbb A}^1$[[-connected components|A¹-connected]], denoted $\pi_0^{{\mathbb A}^1}({\mathcal X})$ is the ([[Nisnevich]]) sheaf on ${\mathcal Sm}_k$ associated with the presheaf
\[
U \mapsto [U,{\mathcal X}]_{{\mathbb A}^1}
\]
where the last object is the set of [[(unpointed) A¹-homotopy classes of maps|A¹-homotopy classes of maps]] from $U$ to ${\mathcal X}$.

If $({\mathcal X},x)$ is a [[pointed space|Motivic space], and $S^{i,j}$ is a [[motivic sphere|Motivic sphere]], then the (weighted) ${\mathbb A}^1$-homotopy sheaf of groups, denoted $\pi_{i,j}^{{\mathbb A}^1}({\mathcal X},x)$, is the Nisnevich sheaf on ${\mathcal Sm}_k$ associated with the presheaf
\[
U \mapsto [S^{i,j} \wedge U_+,({\mathcal X},x)]_{{\mathbb A}^1}
\]
where the last object is the set of [[pointed A¹-homotopy classes of maps|A¹-homotopy classes of maps]] from $S^{i,j} \wedge U_+$ to $({\mathcal X},x)$, and $U_+$ is $U$ with a disjoint basepoint attached.  If $j$ is $0$, we drop it from the notation and we write $\pi_i^{{\mathbb A}^1}({\mathcal X},x)$ to denote the corresponding sheaves; these last sheaves are usually referred to as the ${\mathbb A}^1$__-homotopy (sheaves of) groups of ${\mathcal X}$__, and the words //sheaf of// are often suppressed for terminological simplicity.  

!!! Basic properties
If $({\mathcal X},x)$ is a pointed space, then the sheaves $\pi_i^{{\mathbb A}^1}({\mathcal X},x)$ are sheaves of groups for $i > 0$, and sheaves of abelian groups for $i > 1$ justifying the terminology. 

The sheaves $\pi_i^{{\mathbb A}^1}({\mathcal X},x)$ detect ${\mathbb A}^1$[[-weak equivalences|A¹-weak equivalence]] via the ${\mathbb A}^1$[[-Whitehead theorem|A¹-Whitehead theorem]], which illustrates their importance in studying ${\mathbb A}^1$-homotopy types.   

Furthermore, the sheaves $\pi_i^{{\mathbb A}^1}({\mathcal X},x)$ have additional structure as summarized by the following deep theorem of Morel. Roughly speaking, this theorem states that the sheaves $\pi_i^{{\mathbb A}^1}({\mathcal X},x)$ are analogous to discrete groups in classical homotopy theory (in an appropriate sense).  

__''Theorem: (Morel)''__ Suppose $({\mathcal X},x)"$ is a pointed space.  If $i \geq 1$, the ${\mathbb A}^1$-homotopy groups $\pi_i^{{\mathbb A}^1}({\mathcal X},x)$ are [[strongly A¹-invariant|Strongly A¹-invariant]] and if $i \geq 2$ they are [[strictly A¹-invariant|Strictly A¹-invariant]] for $i \geq 2$. 

Various classical properties of homotopy groups have analogs in ${\mathbb A}^1$-homotopy theory, though the statements aren't (yet) identical to the corresponding results in topology.  Let us list some of these results. 
* There is an ${\mathbb A}^1$[[-Hurewicz theorem|A¹-Hurewicz theorem]] with target the ${\mathbb A}^1$[[-homology groups|A¹-homology]].
* There are Blakers-Massey style [[excision results|Excision for A¹-homotopy groups]] for removing high codimension closed subschemes from highly ${\mathbb A}^1$-connected smooth schemes.
* There is a version of the [[van Kampen theorem|A¹-van Kampen theorem]] (together with some of its generalizations).
* There is a version of [[covering space theory|A¹-covering space]] for the ${\mathbb A}^1$-fundamental group  

Furthermore, for pointed ${\mathbb A}^1$-connected spaces the weighted ${\mathbb A}^1$-homotopy groups can be described in terms of the ${\mathbb A}^1$-homotopy groups via a [[shifting|G_m-loop spaces]] construction.  

!!! Computations
* The space ${\mathbb A}^n - 0$ is $(n-2)$-${\mathbb A}^1$-connected if $n \geq 2$.  For any choice of base-point, one has $\pi_{n-1}^{{\mathbb A}^1}({\mathbb A}^n - 0) \cong \underline{{\mathbf K}}^{MW}_n$ where $\underline{{\mathbf K}}^{MW}_n$ is the $n$-th [[Milnor-Witt K-theory]] sheaf. 
* The above computation is related to the following definition.  Given a pointed sheaf of sets $({\mathcal S},s)$, the group $\pi_1^{{\mathbb A}^1}(\Sigma^1_s {\mathcal S})$ is called the [[free strongly|Free strongly A¹-invariant sheaf of groups]]-${\mathbb A}^1$-invariant sheaf of groups generated by ${\mathcal S}$.  For integers $n \geq 2$, there are related descriptions of $\pi_n^{{\mathbb A}^n}(\Sigma^n_s {\mathcal S})$ as the [[free strictly|Free strictly A¹-invariant sheaf of groups]]-${\mathbb A}^1$-invariant sheaf of groups generated by ${\mathcal S}$. 
With the foundations of [[unstable|Unstable A¹-homotopy theory]] and [[stable|Stable A¹-homotopy theory]] ${\mathbb A}^1$-homotopy theory detailed above, we can turn to applications of ${\mathbb A}^1$-homotopy theory to algebraic geometry; this interaction has been titled ${\mathbb A}^1$-[[algebraic topology|A¹-algebraic topology]] by F. Morel.  One of the main applications of ${\mathbb A}^1$-homotopy theory so far is to the proof of the [[Bloch-Kato conjecture]].  

In another direction, some of the [[deepest conjectures in algebraic geometry|http://en.wikipedia.org/wiki/Hodge_conjecture]] relate to the comparison between algebraically defined cohomology theories and topologically defined cohomology theories over fields that can be embedded in ${\mathbb C}$.  To compare ${\mathbb A}^1$-homotopy theory to various topologically defined concepts, it is useful to study ``realizations," i.e., functors from the ${\mathbb A}^1$[[-homotopy category|A¹-homotopy category]] to other homotopic categories. Several such functors are constructed in ${\mathbb A}^1$[[-homotopy theory of schemes|A¹-homotopy theory of schemes]].  These functors have been refined in the following papers. 
* Topological Hypercovers and ${\mathbb A}^1$-realizations by D. Dugger and D. Isaksen ([[Paper|http://www.math.uiuc.edu/K-theory/0528/]],[[Discussion|Topological Hypercovers and A¹-realizations]]).
* Etale realization on the ${\mathbb A}^1$-homotopy theory of schemes ([[Paper|http://www.math.uiuc.edu/K-theory/0495/]],[[Discussion|Etale realization on the A¹-homotopy theory of schemes]])
In his ICM address, Voevodsky suggested the problem of providing ``algebro-combinatorial" descriptions of ${\mathbb A}^1$-homotopy types.  Natural algebro-combinatorial invariants of motivic spaces are provided by ${\mathbb A}^1$[[-homotopy groups|A¹-homotopy groups]].  Computations of ${\mathbb A}^1$[[-homotopy groups|A¹-homotopy groups]] are (theoretically) easiest for spaces that are ``simple."  In topology, [[CW complexes|http://en.wikipedia.org/wiki/CW_complex]] are spaces that can be built up from spheres.  Cellularity (in both [[stable]] and [[unstable]] incarnations) has been studied in ${\mathbb A}^1$-homotopy theory in the following paper. 
* Motivic cell structures, by D. Dugger and D. Isaksen ([[Paper|http://www.math.uiuc.edu/K-theory/0660/]],[[Discussion|Motivic cell structures]] )
Of course, the simplest ``cellular" spaces are the [[motivic spheres|Motivic sphere]] themselves.  Morel has computed the first non-vanishing ${\mathbb A}^1$-homotopy group of various spheres.  The sphere $S^{n-1,n}$ can be represented by the smooth scheme ${\mathbb A}^n - 0$.  Furthermore, the space ${\mathbb A}^n - 0$ is ${\mathbb A}^1$[[-weakly equivalent|A¹-weak equivalence]] to the (odd-dimensional) hyperbolic affine quadric hypersurface.    There is a corresponding result for even-dimensional split affine quadrics, which have the ${\mathbb A}^1$-homotopy type of motivic spheres of the form $S^{n,n}$.  In all of these cases, the first non-vanishing ${\mathbb A}^1$-homotopy group has been computed in terms of [[Milnor-Witt K-theory]] sheaves.  

There is a version of [[covering space theory|http://en.wikipedia.org/wiki/Covering_space]] in ${\mathbb A}^1$-homotopy theory providing an interpretation for quotients of the ${\mathbb A}^1$[[-fundamental group|A¹-covering space]].  One can show that ${\mathbb A}^{n+1} - 0$ is an ${\mathbb A}^1$-covering space for ${\mathbb P}^n$.  This fact can be used to compute the ``next" non-vanishing ${\mathbb A}^1$-homotopy group of projective space.  This construction can be generalized to understand the ${\mathbb A}^1$-fundamental group and next non-vanishing homotopy group of a smooth proper toric variety.  

<html><center>(<a href="javascript:;" class="TiddlyLinkExisting" 
onclick="story.closeAllTiddlers();story.displayTiddler(null,'Stable A¹-homotopy theory');return 
false;"><b> Back </b></a>|<a href="javascript:;" class="TiddlyLinkExisting" 
onclick="story.closeAllTiddlers();story.displayTiddler(null,'Outlines of the theory');return 
false;"><b> Up </b></a>)</center></html>
''Author(s)'': F. Morel and V. Voevodsky
''Publication Information:'' Publ. Math. IHES (90) 1999-2001 pp. 45-143
''Link'': [[NUMDAM|http://www.numdam.org/numdam-bin/recherche?h=nc&id=PMIHES_1999__90__45_0&format=complete]]
''Abstract:''  In this paper we begin to develop a machinery which we call ${\mathbb A}^1$-homotopy theory of schemes. All our constructions are based on the intuitive feeling that if the category of algebraic varieties is in any way similar to the category of topological spaces then there should exist a homotopy theory of algebraic varieties where the affine line plays the role of the unit interval.

''Notes'': Here is an outline of the paper.  Comments are organized by section.  

!! Section 1 (Preface)
This section provides a one paragraph explanation of what the ${\mathbb A}^1$-homotopy category is and why it might be considered.  
!! Section 2 ([[Homotopy category of a site with interval|Section 2 of A¹-homotopy theory of schemes]])
Look to this section for generalities about constructing homotopy categories for categories of simplicial sheaves equipped with a notion of [[interval object]].  
!! Section 3 ([[The A¹-homotopy category of schemes over a base|Section 3 of A¹-homotopy theory of schemes]])
Material of the previous section is applied to consider a homotopy category for simplicial sheaves on the category of smooth schemes equipped with the Nisnevich topology and interval object given by the affine line. 
!! Section 4 ([[Classifying spaces of algebraic groups|Section 4 of A¹-homotopy theory of schemes]])
In this section, various classifying spaces of algebraic groups are constructed, and unstable representabillity of algebraic K-theory is proven.
!!! Definition
A sheaf of sets ${\mathcal S}$ (i.e., a [[space|Motivic space]]) is said to be ${\mathbb A}^1$-__invariant__ if for any smooth $k$-scheme $U$, the map of sets ${\mathcal S}(U) \to {\mathcal S}(U \times {\mathbb A}^1)$ is a bijection.  

!!! Equivalent characterization
''Lemma:'' A sheaf of sets ${\mathcal S}$ is ${\mathbb A}^1$-invariant if and only if ${\mathcal S}$ is ${\mathbb A}^1$-local.  
//Proof.// We use the fact that the canonical embedding ${\mathcal Shv}_{Nis}({\mathcal Sm}_k) \to {\mathcal H}_s({\mathcal Sm}_k)_{Nis}$ is fully-faithful (see ${\mathbb A}^1$[[-homotopy theory of schemes|MoVo99]] Remark 2.1.14).  If ${\mathcal S}$ is ${\mathbb A}^1$[[-local|A¹-local]], the result follows immediately from the definition.  If ${\mathcal S}$ is ${\mathbb A}^1$-invariant, we use the fact that any space admits a canonical resolution by coproducts of representables (see ${\mathbb A}^1$[[-homotopy theory of schemes|MoVo99]] Lemma 2.1.16).  

!!!! Applications
* This notion is useful in ${\mathbb A}^1$[[-covering space|A¹-covering space]] theory.  
* Conjecturally, if $k$ is a field, for any $k$-space ${\mathcal X}$, the sheaf of ${\mathbb A}^1$[[-connected components|A¹-connected]] $\pi_0^{{\mathbb A}^1}({\mathcal X})$ is ${\mathbb A}^1$-invariant.  
Suppose ${\mathcal X}$ is a [[space|Motivic space]].  Let ${\mathcal H}_s({\mathcal Sm}_k)_{Nis}\;$ denote the [[simplicial homotopy category|Simplicial homotopy category]]. Say that ${\mathcal X}$ is ${\mathbb A}^1$-__local__ if for any other space ${\mathcal Y}$, the map 
\[
[{\mathcal Y},{\mathcal X}]_s \to [{\mathcal Y} \times {\mathbb A}^1,{\mathcal X}]_s
\]
induced by pull-back along the projection ${\mathcal Y} \times {\mathbb A}^1 \to {\mathcal Y}\;$ is a bijection.
!!! Definition
An ${\mathbb A}^1$[[-resolution functor|A¹-resolution functor]] is a pair $(Ex_{{\mathbb A}^1}(\cdot),\theta)$ consisting of an endo-functor $Ex_{{\mathbb A}^1}(\cdot)$ of the category of [[simplicial spaces|Motivic space]], and a natural transformation $\theta: Id \to Ex_{{\mathbb A}^1}(\cdot)$ such that if ${\mathcal X}$ is any simplicial space, the map
\[
{\mathcal X} \to Ex_{{\mathbb A}^1}({\mathcal X}) 
\]
is an ${\mathbb A}^1$[[-acyclic cofibration|A¹-cofibration]], and $Ex_{{\mathbb A}^1}({\mathcal X})$ is ${\mathbb A}^1$[[-fibrant|A¹-fibration]].

!!! Construction
!!! Definition
Let $S$ be a Noetherian scheme.  A smooth $S$-scheme $X$ is said to be __${\mathbb A}^1$-rigid__ if for any smooth $S$-scheme $U$, the map
\[
Hom_{{\mathcal Sm}_S}(U,X) \to Hom_{{\mathcal Sm}_S}(U \times {\mathbb A}^1,X)
\]
induced by pull-back along the projection $p_{{\mathbb A}^1}: U \times {\mathbb A}^1 \to {\mathbb A}^1$ is a bijection.  

!!! Properties
* If a smooth $S$-scheme $X$ is ${\mathbb A}^1$-rigid, it is [[simplicially fibrant|Simplicially fibrant]] and ${\mathbb A}^1$[[-local|A¹-local]].
* As a consequence of the previous statement, if $X$ is ${\mathbb A}^1$-rigid, one knows that the canonical map $X \to \pi_0^{{\mathbb A}^1}(X)$ (see the discussion of ${\mathbb A}^1$[[-connectedness|A¹-connected]]) is an isomorphism of Nisnevich sheaves.  

!!! Examples
* If $C$ is a smooth curve over $S$ of genus $g \geq 1$, then $C$ is ${\mathbb A}^1$-rigid. 
* Abelian $S$-schemes are ${\mathbb A}^1$-rigid.  
* Products of ${\mathbb A}^1$-rigid schemes are ${\mathbb A}^1$-rigid.  

!!! Comments
The terminology ``${\mathbb A}^1$-rigid" seems to stem from rigidity in the topological sense (e.g., [[Mostow rigidity|http://en.wikipedia.org/wiki/Mostow_rigidity]] which implies homotopy types of hyperbolic manifolds determine their isometry type).  Thus, one might think of ${\mathbb A}^1$-rigidity as an algebraic form of hyperbolicity for smooth schemes.  In this direction, note that over ${\mathbb C}$, [[Brody hyperbolic|http://math.stanford.edu/~vakil/snowbird/izzetjun21.pdf]] varieties are ${\mathbb A}^1$-rigid. 
The __${\mathbb A}^1$-van Kampen theorem__ encodes the commutativity of the functor $\pi_1^{{\mathbb A}^1}(\cdot)$ on pointed spaces with formation of colimits.  The simplest form of the theorem takes the following form. 

''Theorem'' (Morel):
Let $k$ be a field.  Suppose $U$ and $V$ are ${\mathbb A}^1$-connected $k$-schemes such that $X := U \cup V$ and $U \cap V$ are also ${\mathbb A}^1$-connected.  Fix a base-point $x \in U \cap V(k)$. Then $\pi_1^{{\mathbb A}^1}(X,x)$ is a push-out of the diagram
\[
\pi_1^{{\mathbb A}^1}(U,x) \leftarrow \pi_1^{{\mathbb A}^1}(U \cap V,x) \rightarrow \pi_1^{{\mathbb A}^1}(V,x).
\]
Because the category of [[strongly|Strongly A¹-invariant]] ${\mathbb A}^1$-invariant sheaves of groups has  finite colimits, this push-out exists, and is usually denoted by 
\[
\pi_1^{{\mathbb A}^1}(U,x) \star_{\pi_1^{{\mathbb A}^1}(U \cap V,x)} \pi_1^{{\mathbb A}^1}(V,x).
\] 

There is a generalization involving the ${\mathbb A}^1$-fundamental groupoid as well.  
!!! Definition

Suppose ${\mathcal X}$ and ${\mathcal Y}$ are (simplicial) [[spaces|Motivic space]].  A morphism $f: {\mathcal X} \to {\mathcal Y}$ is called an ${\mathbb A}^1$-__weak equivalence__ if for any ${\mathbb A}^1$-[[local|A¹-local]] space ${\mathcal Z}$ the induced map on [[simplicial homotopy classes|Simplicial homotopy category]]
\[
Hom_{{\mathcal H}_s({\mathcal Sm}_k)_{Nis}}({\mathcal Y},{\mathcal Z}) \to Hom_{{\mathcal H}_s({\mathcal Sm}_k)_{Nis}}({\mathcal X},{\mathcal Z})
\]
is a bijection.  

Similarly, if $({\mathcal X},x)$ and $({\mathcal Y},y)$ are pointed (simplicial) [[spaces|Motivic space]], and $f: {\mathcal X} \to {\mathcal Y}$ is a morphism of pointed spaces, then $f$ is a __pointed ${\mathbb A}^1$-weak equivalence__ if the morphism $f$ of spaces obtained by forgetting the base-points is an ${\mathbb A}^1$-weak equivalence. 

!!! Examples
The projection morphism ${\mathbb A}^n \to \ast\;$ is an ${\mathbb A}^1$-weak equivalence.  More generally, if $f: X \to Y$ is a Zariski locally trivial morphism of smooth schemes with ${\mathbb A}^1$-[[contractible|A¹-contractible]] fibers (e.g., affine space fibers), then $f$ is an ${\mathbb A}^1$-weak equivalence.  

!!! Related topics
There is an ${\mathbb A}^1$[[-Whitehead theorem|A¹-Whitehead theorem]] that shows that ${\mathbb A}^1$[[-homotopy groups|A¹-homotopy groups]] detect ${\mathbb A}^1$-weak equivalences.  
More information on [[BibTeX|http://www.bibtex.org/]].
!!! Alphabetical Listing
[[A|Bibliography:A]] [[B|Bibliography:B]] [[C|Bibliography:C]] [[D|Bibliography:D]] [[E|Bibliography:E]] [[F|Bibliography:F]] [[G|Bibliography:G]] [[H|Bibliography:H]] [[I|Bibliography:I]] [[J|Bibliography:J]] [[K|Bibliography:K]] [[L|Bibliography:L]] [[M|Bibliography:M]] [[N|Bibliography:N]] [[O|Bibliography:O]] [[P|Bibliography:P]] [[Q|Bibliography:Q]] [[R|Bibliography:R]] [[S|Bibliography:S]] [[T|Bibliography:T]] [[U|Bibliography:U]] [[V|Bibliography:V]] [[W|Bibliography:W]] [[X|Bibliography:X]] [[Y|Bibliography:Y]] [[Z|Bibliography:Z]]
!!! Bibliography entries
Input bibliography entries in the following format:
|{{{Authors}}}|>|
|{{{Title}}}|>|
|{{{journal}}}, {{{jvol}}}, ({{{year}}}), {{{NUMBER}}}, {{{jpage}}}|>|
|ArXiv: [[ArXivLink|http://front.math.ucdavis.edu/%7B%7B%7Barxivlink%7D%7D%7D]] (if available)|>|
|MathSciNet: [[MathSciNetID|http://www.ams.org/mathscinet-getitem?mr={{{mathsciid}}}]] (if available)|>|
|Link to published version (if available)|>|

* There is still a lot of room for improvement here.  It would be nice to have a (say) python script that turned BibTeX entries into entries of the above (or related form).  Perhaps the format should be changed to look more like BibTeX? 
Morel, F. - [[MoVo99|MoVo99]]
Voevodsky, V. -  [[Vo98|Vo98]],[[MoVo99|MoVo99]]
!!! Statement of the conjecture

Suppose $k$ is a field and $\ell$ is a prime number different from the characteristic of $k$.  Fix a separable closure $k^{sep}$ of $k$, and let $\mu_{\ell}$ denote the group of $\ell$th roots of unity in $k^{sep}$.  One may consider $\mu_{\ell}$ as a $Gal(k^{sep}/k)$-module.  The $\ell$-th power map on the group $\mu_{\ell}$ gives rise to an exact sequence 
\[
1 \longrightarrow \mu_\ell \longrightarrow (k^{sep})^* \longrightarrow (k^{sep})^* \longrightarrow 1,
\]
called the Kummer sequence.  The boundary map of the associated long exact sequence of Galois cohomology groups determines a homomorphism
(1)\[
k^* \longrightarrow H^1(k,\mu_{\ell})
\] 

Bass and Tate proved that for any $a \in k^* - 1$, the cohomology class $(a) \wedge (1-a)$ lying in $H^2(k,\mu_{\ell}^{\otimes 2})$ is zero.  This implies that the map of (1) extends to a ring homomorphism 
(2) \[
T(k^*)/I \longrightarrow H^{\bullet}(k,\mu_{\ell}^{\otimes \bullet}
\]
where $T(k^*)$ is the tensor algebra of $k^*$ viewed as an abelian group, and $I$ is the ideal generated by elements of the form $a \otimes b$ for $a,b \in k^*$ satisfying $a + b = 1$.  The graded components of $T(k^*)/I$ are known as the [[Milnor K-groups]] of $k$, and the homomorphism of (2) is usually written:
(3)\[
K^{M}_{\bullet}(k) \longrightarrow H^\bullet(k,\mu_{\ell}^{\otimes \bullet})
\]
Let $K^{M}_{\bullet}(k)/\ell$ denote the quotient of $K^M_\bullet(k)$ by the ideal of elements divisible by $\ell$.  The map (3) then factors through a map
(4)\[
K_{\bullet}^M(k)/\ell \longrightarrow H^{\bullet}(k,\mu_{\ell}^{\otimes \bullet})
\] 
which is called the __norm residue homomorphism__.  The Bloch- Kato conjecture can then be stated as follows.  

//__''Conjecture (Bloch- Kato)''__: The norm residue homomorphism is an isomorphism.//

!!! History of the conjecture

If k is a field of characteristic unequal to 2, the norm residue homomorphism for $\ell = 2$ was studied in great detail by Milnor (see [[Algebraic K-theory and quadratic forms|http://resolver.sub.uni-goettingen.de/purl?GDZPPN002088274]]).  In particular Milnor writes on p. 340 ``I do not know any examples for which the [norm residue homomorphism] fails to be bijective."  For this reason, this case of the conjecture is often referred to as the Milnor conjecture.   

!!! History of the proof
/***
|''Name:''|BreadCrumbsPlugin|
|''Version:''|2.2.1 (05-July-2007)|
|''Author:''|AlanHecht|
|''Adapted By:''|[[Jack]]|
|''Type:''|Plugin|
!Description
This plugin creates an area at the top of the tiddler area that displays "breadcrumbs" of where you've been. This is especially useful for ~TWs using SinglePageMode by Eric Schulman.
!Usage
Just install the plugin and tag with systemConfig. Optionally position the following div in your PageTemplate to control the positioning of the breadcrumbs menu:
{{{
<div id='breadCrumbs'></div>
}}}
!Revision History
* Original by AlanHecht
* 2.0 Made 2.0.x compatible by [[Jack]]
* Made 2.0.10 compatible (onstart paramifier)
* Bugfix -> return false in onClickTiddlerLink()
* 2.2 Made 2.2.x compatible
!Code
***/

// // Use the following line to set the number of breadcrumbs to display before rotating them off the list.
//{{{
version.extensions.breadCrumbs = {major: 2, minor: 2, revision: 1, date: new Date("Jul 5, 2007")};
var crumbsToShow = 3;
var breadCrumbs = [];

onClickTiddlerLink_orig_breadCrumbs = onClickTiddlerLink;
onClickTiddlerLink = function(e){
 onClickTiddlerLink_orig_breadCrumbs(e);
 breadcrumbsAdd(e);
 return false;
}

restart_orig_breadCrumbs = restart;
function restart() {
 invokeParamifier(params,"onstart");
 var defaultParams = store.getTiddlerText("DefaultTiddlers").parseParams("open",null,false);
 invokeParamifier(defaultParams,"onstart");
 breadCrumbs = [];
 breadcrumbsRefresh();
 window.scrollTo(0,0);
 return false;
}

function breadcrumbsAdd(e) {
 var uniqueCrumb = true;
 var crumbIndex = 0;
 if (!e) var e = window.event;
 var target = resolveTarget(e);
 var thisCrumb="[["+resolveTarget(e).getAttribute("tiddlyLink")+"]]";
 var lastInactiveCrumb = breadCrumbs.length -(breadCrumbs.length < crumbsToShow ? breadCrumbs.length : crumbsToShow);
 for(t=lastInactiveCrumb; t<breadCrumbs.length; t++)
 if(breadCrumbs[t] == thisCrumb) {
 uniqueCrumb = false;
 crumbIndex = t+1;
 }
 if(uniqueCrumb)
 breadCrumbs.push(thisCrumb);
 else
 breadCrumbs = breadCrumbs.slice(0,crumbIndex);
 breadcrumbsRefresh(); 
}

function breadcrumbsRefresh() {
 
 if (!document.getElementById("breadCrumbs")) {
 // Create breadCrumbs div
 var ca = document.createElement("div");
 ca.id = "breadCrumbs";
 ca.style.visibility= "hidden";
 var targetArea = document.getElementById("tiddlerDisplay")||document.getElementById("storyDisplay");
 targetArea.parentNode.insertBefore(ca,targetArea);
 }

 var crumbArea = document.getElementById("breadCrumbs");
 crumbArea.style.visibility = "visible";
 removeChildren(crumbArea);
 createTiddlyButton(crumbArea,"Home",null,restart);
 crumbArea.appendChild(document.createTextNode(" > "));
 
 var crumbLine = "";
 var crumbCount = breadCrumbs.length;
 var firstCrumb = crumbCount -(crumbCount < crumbsToShow ? crumbCount : crumbsToShow);
 for(t=firstCrumb; t<crumbCount; t++) {
 if(t != firstCrumb)
 crumbLine += " > ";
 crumbLine += breadCrumbs[t];
 }
 wikify(crumbLine,crumbArea)
}


//}}}

Suppose $f: {\mathcal X} \to {\mathcal Y}$ is a morphism of spaces.  The __Cech simplical object associated with $f$__, or the __Cech complex of $f$__, denoted $\breve{C}(f)$ is the simplicial object whose $n$-th term is the $n+1$-fold fiber product ${\mathcal X} \times_{{\mathcal Y}} \cdots \times_{{\mathcal Y}} {\mathcal X}$ and where face and degeneracy maps are specified by projections and partial diagonals.  The morphism $f$ determines an augmentation $\breve{C}(f) \to {\mathcal Y}$.  
/***
|Name:|CloseOnCancelPlugin|
|Description:|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|
|Version:|3.0.1 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#CloseOnCancelPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.commands.cancelTiddler,{

	handler_mptw_orig_closeUnsaved: config.commands.cancelTiddler.handler,

	handler: function(event,src,title) {
		this.handler_mptw_orig_closeUnsaved(event,src,title);
		if (!store.tiddlerExists(title) && !store.isShadowTiddler(title))
			story.closeTiddler(title,true);
	 	return false;
	}

});

//}}}

Name: MptwBlue
Background: #fff
Foreground: #000
PrimaryPale: #cdf
PrimaryLight: #57c
PrimaryMid: #114
PrimaryDark: #012
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

!!! Alphabetical Listing
[[A|Concepts:A]] [[B|Concepts:B]] [[C|Concepts:C]] [[D|Concepts:D]] [[E|Concepts:E]] [[F|Concepts:F]] [[G|Concepts:G]] [[H|Concepts:H]] [[I|Concepts:I]] [[J|Concepts:J]] [[K|Concepts:K]] [[L|Concepts:L]] [[M|Concepts:M]] [[N|Concepts:N]] [[O|Concepts:O]] [[P|Concepts:P]] [[Q|Concepts:Q]] [[R|Concepts:R]] [[S|Concepts:S]] [[T|Concepts:T]] [[U|Concepts:U]] [[V|Concepts:V]] [[W|Concepts:W]] [[X|Concepts:X]] [[Y|Concepts:Y]] [[Z|Concepts:Z]]
* [[A¹-connected]]
* [[A¹-contractible]]
* [[A¹-covering space]]
* [[A¹-fibration]]
* [[A¹-homology]]
* [[A¹-homotopy category]]
* [[A¹-homotopy groups]]
* [[A¹-Hurewicz theorem]]
* [[A¹-invariant]]
* [[A¹-local]]
* [[A¹-resolution functor]]
* [[A¹-rigid]]
* [[A¹-weak equivalence]]
* [[A¹-Whitehead theorem]]
* [[Algebraic simplex]]
* [[Bloch-Kato conjecture]]
* [[Bloch higher Chow groups|Motivic cohomology]]
* [[Brown representability|Brown representability]]
* $\breve{C}\text{ech}$ 
** [[complex]]
** [[simplicial object|Cech simplicial object]]
* Classifying space
* <<slider chkCohomologyTheories "./CohomologyTheories" "Cohomology Theories" "Expand list of cohomology theories">>
* Cone
** [[Cone on a pointed space|Cone]]
* <<slider chkConjectures "./Conjectures" "Conjectures" "List of conjectures">>
* Connectedness
** [[A¹-connected]]
* Contractible
** [[A¹-contractible]]
* Covering space
** [[A¹-covering space]]

<part CohomologyTheories hidden>
* [[Algebraic cobordism]]
* [[Algebraic K-theory]]
* [[Algebraic Morava K-theories|Algebraic Morava K-theory]]
* [[Hermitian K-theory]]
* [[Motivic cohomology]]
* [[Oriented chow groups]]
</part>

<part Conjectures hidden>
* [[Bloch-Kato conjecture]]
* [[Friedlander-Milnor conjecture]]
* Milnor conjecture
** [[on the norm-residue homomorphism|Bloch-Kato conjecture]]
** [[on quadratic forms|Milnor's conjecture on quadratic forms]]
</part>
* Derived category
** [[A¹-Derived category]]
** [[Derived category of mixed motives|Triangulated category of motives]]
* Descent
** Cech descent
*** [[Nisnevich-Cech descent]]
*** [[Zariski-Cech descent]]
** [[Faithfully flat descent]]
** [[Hypercover descent]]
* Dold-Kan correspondence
** [[Sheaf theoretic Dold-Kan correspondence]]
* Eilenberg-MacLane space
** [[Eilenberg-MacLane sheaf]]
** [[Motivic Eilenberg-MacLane space]]
* Fibration
** [[A¹-fibration]]
** [[(Global) simplicial fibration]]
** [[(Local) simplicial fibration]]
* Filtration
** [[Slice filtration]]
* Free
** [[Strictly A¹-invariant sheaf of groups]]
** [[Strongly A¹-invariant sheaf of groups|Free strongly A¹-invariant sheaf of groups]]
* [[Friedlander-Milnor conjecture]]
* Fundamental group
** [[A¹-fundamental group|A¹-homotopy groups]]
* [[Grassmannian|Grassmannian]]
** [[Orthogonal grassmannian|Orthogonal grassmannian]]
** [[Quaternionic grassmannian|Quaternionic grassmannian]]
* [[Hermitian K-theory|Hermitian K-theory]]
* Homology
** [[A¹-homology]]
** [[Suslin homology]]
* [[Homotopy purity theorem]]
* Homotopy category
** [[A¹-homotopy category]]
** [[Simplicial homotopy category]]
* Homotopy groups
** [[A¹-homotopy groups]]
** [[Simplicial homotopy groups]]
* [[Hopf construction]]
* Hurewicz theorem
** [[A¹-Hurewicz theorem]]
* [[Hypercover]]
* [[Isomorphism conjecture|Friedlander-Milnor conjecture]]
* [[Join]]
* Kan
** [[Kan complex]]
** [[Kan fibration]]
* K-theory
** [[Algebraic K-theory]]
** [[Hermitian K-theory]]
** [[Milnor K-theory]]
** [[Milnor-Witt K-theory]]
** [[Symplectic K-theory]]
** [[Witt K-theory]]
* Localization
** Bousfield localization
*** [[A¹-local space|A¹-local]]
* Loop space
** [[Simplicial loop space]]
** ${\mathbb G}_m$-loop spaces
*** ${\mathbb G}_m$[[-loop sheaf|G_m-loop sheaf]]
*** ${\mathbb G}_m$[[-loop space|G_m-loop space]]
* <<slider chkMayerVietoris "./MayerVietoris" "Mayer-Vietoris">>
* <<slider chkMilnorconjecture "./MilnorConjecture" "Milnor conjecture">>
* [[Milnor-Witt K-theory]]
* [[Motivic cohomology]]
* [[Motivic complex]]
* [[Motivic sphere]]

<part MayerVietoris hidden>
* [[Mayer-Vietoris for A¹-homology]]
</part>

<part MilnorConjecture hidden>
* [[on the norm-residue homomorphism|Bloch-Kato conjecture]]
* [[on quadratic forms|Milnor's conjecture on quadratic forms]]
* [[Friedlander-Milnor conjecture]]
</part>
*[[Nerve]]
* [[Orthogonal grassmannian|Orthogonal grassmannian]]
* Projective space
** [[Projective line (A¹-fundamental group)|The A¹-fundamental group of the projective line]]
* [[Quaternionic grassmannian|Quaternionic grassmannian]]
* [[Rationally connected|Rationally connected variety]]
* Resolution functor
** The functor $Ex_{\infty}$-[[of Kan|Kan's resolution functor]]
** [[A¹-resolution functor]]
* Rigid
** [[A¹-rigid scheme|A¹-rigid]]
*[[Singular construction|The functor Sing_*]]
*[[Slice filtration]]
*[[Smash product]]
* Space
**[[Motivic space]]
* Spanier-$$Whitehead duality
* Sphere
**[[Sphere, motivic|Motivic sphere]]
*[[Suslin homology]]
*[[Stable A¹-connectivity property]]
*[[Stable A¹-connectivity theorem]]
*[[Stable A¹-homotopy theory]]
*[[Strictly A¹-invariant]]
*[[Strongly A¹-invariant]]
*[[Symplectic K-theory]]
* [[Thom isomorphism theorem|Homotopy purity theorem]]
* [[Thom space]]
* Topology
** cdh
** étale
** h
** [[Henselian|Nisnevich topology]]
** [[Nisnevich|Nisnevich topology]]
* [[Universe]]
* [[Unstable A¹-connectivity property]]
* [[Unstable A¹-homotopy theory]]
* van Kampen theorem
** [[A¹-van Kampen theorem]]
* variety
** [[direct factor of a rational variety|Factor rational variety]]
** [[rational|Rational variety]]
** [[rationally connected|Rationally connected variety]]
** [[retract rational|Retract rational variety]]
** [[stably rational|Stably rational variety]]
** [[unirational|Unirational variety]]
* Weak equivalence
** [[A¹-weak equivalence]]
* [[Wedge sum]]
* Whitehead theorem
** [[A¹-Whitehead theorem]]
* [[Witt K-theory]]
!!! Definition
The __cone__ on a pointed space $({\mathcal X},x),\;$ denoted $C({\mathcal X}),\;$ is the smash product ${\mathcal X} \wedge \Delta^1_s$ where $\Delta^1_s$ is the [[simplicial unit interval|Algebraic simplex]] pointed by $1$.  The __anticone__, denoted $C'({\mathcal X}),\;$ is defined similarly, except $\Delta^1_s$ is assumed pointed by $0$. 

!!! Properties
* Both the cone $C({\mathcal X})\;$ and the anticone $C'({\mathcal X})\;$ are contractible as objects in the simplicial homotopy category. 
* The cone can be realized as the [[join|Join]] ${\mathcal X} \ast pt$.


! List of contributors
* Aravind Asok - [[E-mail|mailto://aravind.asok( a t )gmail.com]], [[Web|http://www-rcf.usc.edu/~asok]]
! Instructions
# Get the password: e-mail one of the contributors to do so.
# Pick a username (and try to stick with it).
# Add your name to the list of contributors. 
# Download the wiki.  
# Edit the wiki. 
** At the moment, it's not clear if multiple users can edit simultaneously in a ``reasonable" fashion.  
***''Update:'' a ``locking" mechanism has been introduced to prevent multiple conflicting edits.  
***''Update:'' If you edit the file locally, use the ImportTiddlers feature at the main site to import your changes.  The plain ``upload" feature just replaces the file at the main site with your local file and thus can void changes made by other people.
***You can also use this feature to download updates to your local file.
** It is probably easiest to download the file, create tiddlers as necessary, and import the added tiddlers one by one.  
** Be sure to reload the file to make sure that you have the latest version.
# For help on editing, see [[the help wiki|http://tidhelp.tiddlyspot.com/]].
# Tex can be input as usual, though currently there is no support for macros; compile a list of problems [[here|TeX Issues]].
/***
|''Name:''|DataTiddlerPlugin|
|''Version:''|1.0.6 (2006-08-26)|
|''Source:''|http://tiddlywiki.abego-software.de/#DataTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
!Description
Enhance your tiddlers with structured data (such as strings, booleans, numbers, or even arrays and compound objects) that can be easily accessed and modified through named fields (in JavaScript code).

Such tiddler data can be used in various applications. E.g. you may create tables that collect data from various tiddlers. 

''//Example: "Table with all December Expenses"//''
{{{
<<forEachTiddler
    where
        'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'
    write
        '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\n"'
>>
}}}
//(This assumes that expenses are stored in tiddlers tagged with "expense".)//
<<forEachTiddler
    where
        'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'
    write
        '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\n"'
>>
For other examples see DataTiddlerExamples.




''Access and Modify Tiddler Data''

You can "attach" data to every tiddler by assigning a JavaScript value (such as a string, boolean, number, or even arrays and compound objects) to named fields. 

These values can be accessed and modified through the following Tiddler methods:
|!Method|!Example|!Description|
|{{{data(field)}}}|{{{t.data("age")}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|
|{{{data(field,defaultValue)}}}|{{{t.data("isVIP",false)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|
|{{{data()}}}|{{{t.data()}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|
|{{{setData(field,value)}}}|{{{t.setData("age",42)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|
|{{{setData(field,value,defaultValue)}}}|{{{t.setData("isVIP",flag,false)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|

Alternatively you may use the following functions to access and modify the data. In this case the tiddler argument is either a tiddler or the name of a tiddler.
|!Method|!Description|
|{{{DataTiddler.getData(tiddler,field)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|
|{{{DataTiddler.getData(tiddler,field,defaultValue)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|
|{{{DataTiddler.getDataObject(tiddler)}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|
|{{{DataTiddler.setData(tiddler,field,value)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|
|{{{DataTiddler.setData(tiddler,field,value,defaultValue)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|
//(For details on the various functions see the detailed comments in the source code.)//


''Data Representation in a Tiddler''

The data of a tiddler is stored as plain text in the tiddler's content/text, inside a "data" section that is framed by a {{{<data>...</data>}}} block. Inside the data section the information is stored in the [[JSON format|http://www.crockford.com/JSON/index.html]]. 

//''Data Section Example:''//
{{{
<data>{"isVIP":true,"user":"John Brown","age":34}</data>
}}}

The data section is not displayed when viewing the tiddler (see also "The showData Macro").

Beside the data section a tiddler may have all kind of other content.

Typically you will not access the data section text directly but use the methods given above. Nevertheless you may retrieve the text of the data section's content through the {{{DataTiddler.getDataText(tiddler)}}} function.


''Saving Changes''

The "setData" methods respect the "ForceMinorUpdate" and "AutoSave" configuration values. I.e. when "ForceMinorUpdate" is true changing a value using setData will not affect the "modifier" and "modified" attributes. With "AutoSave" set to true every setData will directly save the changes after a setData.


''Notifications''

No notifications are sent when a tiddler's data value is changed through the "setData" methods. 

''Escape Data Section''
In case that you want to use the text {{{<data>}}} or {{{</data>}}} in a tiddler text you must prefix the text with a tilde ('~'). Otherwise it may be wrongly considered as the data section. The tiddler text {{{~<data>}}} is displayed as {{{<data>}}}.


''The showData Macro''

By default the data of a tiddler (that is stored in the {{{<data>...</data>}}} section of the tiddler) is not displayed. If you want to display this data you may used the {{{<<showData ...>>}}} macro:

''Syntax:'' 
|>|{{{<<}}}''showData '' [''JSON''] [//tiddlerName//] {{{>>}}}|
|''JSON''|By default the data is rendered as a table with a "Name" and "Value" column. When defining ''JSON'' the data is rendered in JSON format|
|//tiddlerName//|Defines the tiddler holding the data to be displayed. When no tiddler is given the tiddler containing the showData macro is used. When the tiddler name contains spaces you must quote the name (or use the {{{[[...]]}}} syntax.)|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|


!Revision history
* v1.0.6 (2006-08-26) 
** Removed misleading comment
* v1.0.5 (2006-02-27) (Internal Release Only)
** Internal
*** Make "JSLint" conform
* v1.0.4 (2006-02-05)
** Bugfix: showData fails in TiddlyWiki 2.0
* v1.0.3 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.2 (2005-12-22)
** Enhancements:
*** Handle texts "<data>" or "</data>" more robust when used in a tiddler text or as a field value.
*** Improved (JSON) error messages.
** Bugs fixed: 
*** References are not updated when using the DataTiddler.
*** Changes to compound objects are not always saved.
*** "~</data>" is not rendered correctly (expected "</data>")
* v1.0.1 (2005-12-13)
** Features: 
*** The showData macro supports an optional "tiddlername" argument to specify the tiddler containing the data to be displayed
** Bugs fixed: 
*** A script immediately following a data section is deleted when the data is changed. (Thanks to GeoffS for reporting.)
* v1.0.0 (2005-12-12)
** initial version

!Code
***/
//{{{
//============================================================================
//============================================================================
//                           DataTiddlerPlugin
//============================================================================
//============================================================================

// Ensure that the DataTiddler Plugin is only installed once.
//
if (!version.extensions.DataTiddlerPlugin) {



version.extensions.DataTiddlerPlugin = {
    major: 1, minor: 0, revision: 6,
    date: new Date(2006, 7, 26), 
    type: 'plugin',
    source: "http://tiddlywiki.abego-software.de/#DataTiddlerPlugin"
};

// For backward compatibility with v1.2.x
//
if (!window.story) window.story=window; 
if (!TiddlyWiki.prototype.getTiddler) {
	TiddlyWiki.prototype.getTiddler = function(title) { 
		var t = this.tiddlers[title]; 
		return (t !== undefined && t instanceof Tiddler) ? t : null; 
	};
}

//============================================================================
// DataTiddler Class
//============================================================================

// ---------------------------------------------------------------------------
// Configurations and constants 
// ---------------------------------------------------------------------------

function DataTiddler() {
}

DataTiddler = {
    // Function to stringify a JavaScript value, producing the text for the data section content.
    // (Must match the implementation of DataTiddler.parse.)
    //
    stringify : null,
    

    // Function to parse the text for the data section content, producing a JavaScript value.
    // (Must match the implementation of DataTiddler.stringify.)
    //
    parse : null
};

// Ensure access for IE
window.DataTiddler = DataTiddler;

// ---------------------------------------------------------------------------
// Data Accessor and Mutator
// ---------------------------------------------------------------------------


// Returns the value of the given data field of the tiddler.
// When no such field is defined or its value is undefined
// the defaultValue is returned.
// 
// @param tiddler either a tiddler name or a tiddler
//
DataTiddler.getData = function(tiddler, field, defaultValue) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler;
    }

    return DataTiddler.getTiddlerDataValue(t, field, defaultValue);
};


// Sets the value of the given data field of the tiddler to
// the value. When the value is equal to the defaultValue
// no value is set (and the field is removed)
//
// Changing data of a tiddler will not trigger notifications.
// 
// @param tiddler either a tiddler name or a tiddler
//
DataTiddler.setData = function(tiddler, field, value, defaultValue) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler+ "("+t+")";
    }

    DataTiddler.setTiddlerDataValue(t, field, value, defaultValue);
};


// Returns the data object of the tiddler, with a property for every field.
//
// The properties of the returned data object may only be read and
// not be modified. To modify the data use DataTiddler.setData(...) 
// or the corresponding Tiddler method.
//
// If no data section is defined a new (empty) object is returned.
//
// @param tiddler either a tiddler name or a Tiddler
//
DataTiddler.getDataObject = function(tiddler) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler;
    }

    return DataTiddler.getTiddlerDataObject(t);
};

// Returns the text of the content of the data section of the tiddler.
//
// When no data section is defined for the tiddler null is returned 
//
// @param tiddler either a tiddler name or a Tiddler
// @return [may be null]
//
DataTiddler.getDataText = function(tiddler) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler;
    }

    return DataTiddler.readDataSectionText(t);
};


// ---------------------------------------------------------------------------
// Internal helper methods (must not be used by code from outside this plugin)
// ---------------------------------------------------------------------------

// Internal.
//
// The original JSONError is not very user friendly, 
// especially it does not define a toString() method
// Therefore we extend it here.
//
DataTiddler.extendJSONError = function(ex) {
	if (ex.name == 'JSONError') {
        ex.toString = function() {
			return ex.name + ": "+ex.message+" ("+ex.text+")";
		};
	}
	return ex;
};

// Internal.
//
// @param t a Tiddler
//
DataTiddler.getTiddlerDataObject = function(t) {
    if (t.dataObject === undefined) {
        var data = DataTiddler.readData(t);
        t.dataObject = (data) ? data : {};
    }
    
    return t.dataObject;
};


// Internal.
//
// @param tiddler a Tiddler
//
DataTiddler.getTiddlerDataValue = function(tiddler, field, defaultValue) {
    var value = DataTiddler.getTiddlerDataObject(tiddler)[field];
    return (value === undefined) ? defaultValue : value;
};


// Internal.
//
// @param tiddler a Tiddler
//
DataTiddler.setTiddlerDataValue = function(tiddler, field, value, defaultValue) {
    var data = DataTiddler.getTiddlerDataObject(tiddler);
    var oldValue = data[field];
	
    if (value == defaultValue) {
        if (oldValue !== undefined) {
            delete data[field];
            DataTiddler.save(tiddler);
        }
        return;
    }
    data[field] = value;
    DataTiddler.save(tiddler);
};

// Internal.
//
// Reads the data section from the tiddler's content and returns its text
// (as a String).
//
// Returns null when no data is defined.
//
// @param tiddler a Tiddler
// @return [may be null]
//
DataTiddler.readDataSectionText = function(tiddler) {
    var matches = DataTiddler.getDataTiddlerMatches(tiddler);
    if (matches === null || !matches[2]) {
        return null;
    }
    return matches[2];
};

// Internal.
//
// Reads the data section from the tiddler's content and returns it
// (as an internalized object).
//
// Returns null when no data is defined.
//
// @param tiddler a Tiddler
// @return [may be null]
//
DataTiddler.readData = function(tiddler) {
    var text = DataTiddler.readDataSectionText(tiddler);
	try {
	    return text ? DataTiddler.parse(text) : null;
	} catch(ex) {
		throw DataTiddler.extendJSONError(ex);
	}
};

// Internal.
// 
// Returns the serialized text of the data of the given tiddler, as it
// should be stored in the data section.
//
// @param tiddler a Tiddler
//
DataTiddler.getDataTextOfTiddler = function(tiddler) {
    var data = DataTiddler.getTiddlerDataObject(tiddler);
    return DataTiddler.stringify(data);
};


// Internal.
// 
DataTiddler.indexOfNonEscapedText = function(s, subString, startIndex) {
	var index = s.indexOf(subString, startIndex);
	while ((index > 0) && (s[index-1] == '~')) { 
		index = s.indexOf(subString, index+1);
	}
	return index;
};

// Internal.
//
DataTiddler.getDataSectionInfo = function(text) {
	// Special care must be taken to handle "<data>" and "</data>" texts inside
	// a data section. 
	// Also take care not to use an escaped <data> (i.e. "~<data>") as the start 
	// of a data section. (Same for </data>)

    // NOTE: we are explicitly searching for a data section that contains a JSON
    // string, i.e. framed with braces. This way we are little bit more robust in
    // case the tiddler contains unescaped texts "<data>" or "</data>". This must
    // be changed when using a different stringifier.

	var startTagText = "<data>{";
	var endTagText = "}</data>";

	var startPos = 0;

	// Find the first not escaped "<data>".
	var startDataTagIndex = DataTiddler.indexOfNonEscapedText(text, startTagText, 0);
	if (startDataTagIndex < 0) {
		return null;
	}

	// Find the *last* not escaped "</data>".
	var endDataTagIndex = text.indexOf(endTagText, startDataTagIndex);
	if (endDataTagIndex < 0) {
		return null;
	}
	var nextEndDataTagIndex;
	while ((nextEndDataTagIndex = text.indexOf(endTagText, endDataTagIndex+1)) >= 0) {
		endDataTagIndex = nextEndDataTagIndex;
	}

	return {
		prefixEnd: startDataTagIndex, 
		dataStart: startDataTagIndex+(startTagText.length)-1, 
		dataEnd: endDataTagIndex, 
		suffixStart: endDataTagIndex+(endTagText.length)
	};
};

// Internal.
// 
// Returns the "matches" of a content of a DataTiddler on the
// "data" regular expression. Return null when no data is defined
// in the tiddler content.
//
// Group 1: text before data section (prefix)
// Group 2: content of data section
// Group 3: text behind data section (suffix)
//
// @param tiddler a Tiddler
// @return [may be null] null when the tiddler contains no data section, otherwise see above.
//
DataTiddler.getDataTiddlerMatches = function(tiddler) {
	var text = tiddler.text;
	var info = DataTiddler.getDataSectionInfo(text);
	if (!info) {
		return null;
	}

	var prefix = text.substr(0,info.prefixEnd);
	var data = text.substr(info.dataStart, info.dataEnd-info.dataStart+1);
	var suffix = text.substr(info.suffixStart);
	
	return [text, prefix, data, suffix];
};


// Internal.
//
// Saves the data in a <data> block of the given tiddler (as a minor change). 
//
// The "chkAutoSave" and "chkForceMinorUpdate" options are respected. 
// I.e. the TiddlyWiki *file* is only saved when AutoSave is on.
//
// Notifications are not send. 
//
// This method should only be called when the data really has changed. 
//
// @param tiddler
//             the tiddler to be saved.
//
DataTiddler.save = function(tiddler) {

    var matches = DataTiddler.getDataTiddlerMatches(tiddler);

    var prefix;
    var suffix;
    if (matches === null) {
        prefix = tiddler.text;
        suffix = "";
    } else {
        prefix = matches[1];
        suffix = matches[3];
    }

    var dataText = DataTiddler.getDataTextOfTiddler(tiddler);
    var newText = 
            (dataText !== null) 
                ? prefix + "<data>" + dataText + "</data>" + suffix
                : prefix + suffix;
    if (newText != tiddler.text) {
        // make the change in the tiddlers text
        
        // ... see DataTiddler.MyTiddlerChangedFunction
        tiddler.isDataTiddlerChange = true;
        
        // ... do the action change
        tiddler.set(
                tiddler.title,
                newText,
                config.options.txtUserName, 
                config.options.chkForceMinorUpdate? undefined : new Date(),
                tiddler.tags);

        // ... see DataTiddler.MyTiddlerChangedFunction
        delete tiddler.isDataTiddlerChange;

        // Mark the store as dirty.
        store.dirty = true;
 
        // AutoSave if option is selected
        if(config.options.chkAutoSave) {
           saveChanges();
        }
    }
};

// Internal.
//
DataTiddler.MyTiddlerChangedFunction = function() {
    // Remove the data object from the tiddler when the tiddler is changed
    // by code other than DataTiddler code. 
    //
    // This is necessary since the data object is just a "cached version" 
    // of the data defined in the data section of the tiddler and the 
    // "external" change may have changed the content of the data section.
    // Thus we are not sure if the data object reflects the data section 
    // contents. 
    // 
    // By deleting the data object we ensure that the data object is 
    // reconstructed the next time it is needed, with the data defined by
    // the data section in the tiddler's text.
    
    // To indicate that a change is a "DataTiddler change" a temporary
    // property "isDataTiddlerChange" is added to the tiddler.
    if (this.dataObject && !this.isDataTiddlerChange) {
        delete this.dataObject;
    }
    
    // call the original code.
	DataTiddler.originalTiddlerChangedFunction.apply(this, arguments);
};


//============================================================================
// Formatters
//============================================================================

// This formatter ensures that "~<data>" is rendered as "<data>". This is used to 
// escape the "<data>" of a data section, just in case someone really wants to use
// "<data>" as a text in a tiddler and not start a data section.
//
// Same for </data>.
//
config.formatters.push( {
    name: "data-escape",
    match: "~<\\/?data>",

    handler: function(w) {
            w.outputText(w.output,w.matchStart + 1,w.nextMatch);
    }
} );


// This formatter ensures that <data>...</data> sections are not rendered.
//
config.formatters.push( {
    name: "data",
    match: "<data>",

    handler: function(w) {
		var info = DataTiddler.getDataSectionInfo(w.source);
		if (info && info.prefixEnd == w.matchStart) {
            w.nextMatch = info.suffixStart;
		} else {
			w.outputText(w.output,w.matchStart,w.nextMatch);
		}
    }
} );


//============================================================================
// Tiddler Class Extension
//============================================================================

// "Hijack" the changed method ---------------------------------------------------

DataTiddler.originalTiddlerChangedFunction = Tiddler.prototype.changed;
Tiddler.prototype.changed = DataTiddler.MyTiddlerChangedFunction;

// Define accessor methods -------------------------------------------------------

// Returns the value of the given data field of the tiddler. When no such field 
// is defined or its value is undefined the defaultValue is returned.
//
// When field is undefined (or null) the data object is returned. (See 
// DataTiddler.getDataObject.)
//
// @param field [may be null, undefined]
// @param defaultValue [may be null, undefined]
// @return [may be null, undefined]
//
Tiddler.prototype.data = function(field, defaultValue) {
    return (field) 
         ? DataTiddler.getTiddlerDataValue(this, field, defaultValue)
         : DataTiddler.getTiddlerDataObject(this);
};

// Sets the value of the given data field of the tiddler to the value. When the 
// value is equal to the defaultValue no value is set (and the field is removed).
//
// @param value [may be null, undefined]
// @param defaultValue [may be null, undefined]
//
Tiddler.prototype.setData = function(field, value, defaultValue) {
    DataTiddler.setTiddlerDataValue(this, field, value, defaultValue);
};


//============================================================================
// showData Macro
//============================================================================

config.macros.showData = {
     // Standard Properties
     label: "showData",
     prompt: "Display the values stored in the data section of the tiddler"
};

config.macros.showData.handler = function(place,macroName,params) {
    // --- Parsing ------------------------------------------

    var i = 0; // index running over the params
    // Parse the optional "JSON"
    var showInJSONFormat = false;
    if ((i < params.length) && params[i] == "JSON") {
        i++;
        showInJSONFormat = true;
    }
    
    var tiddlerName = story.findContainingTiddler(place).id.substr(7);
    if (i < params.length) {
        tiddlerName = params[i];
        i++;
    }

    // --- Processing ------------------------------------------
    try {
        if (showInJSONFormat) {
            this.renderDataInJSONFormat(place, tiddlerName);
        } else {
            this.renderDataAsTable(place, tiddlerName);
        }
    } catch (e) {
        this.createErrorElement(place, e);
    }
};

config.macros.showData.renderDataInJSONFormat = function(place,tiddlerName) {
    var text = DataTiddler.getDataText(tiddlerName);
    if (text) {
        createTiddlyElement(place,"pre",null,null,text);
    }
};

config.macros.showData.renderDataAsTable = function(place,tiddlerName) {
    var text = "|!Name|!Value|\n";
    var data = DataTiddler.getDataObject(tiddlerName);
    if (data) {
        for (var i in data) {
            var value = data[i];
            text += "|"+i+"|"+DataTiddler.stringify(value)+"|\n";
        }
    }
    
    wikify(text, place);
};


// Internal.
//
// Creates an element that holds an error message
// 
config.macros.showData.createErrorElement = function(place, exception) {
    var message = (exception.description) ? exception.description : exception.toString();
    return createTiddlyElement(place,"span",null,"showDataError","<<showData ...>>: "+message);
};

// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
    ".showDataError{color: #ffffff;background-color: #880000;}",
    "showData");


} // of "install only once"
// Used Globals (for JSLint) ==============

// ... TiddlyWiki Core
/*global 	createTiddlyElement, saveChanges, store, story, wikify */
// ... DataTiddler
/*global 	DataTiddler */
// ... JSON
/*global 	JSON */
			

/***
!JSON Code, used to serialize the data
***/
/*
Copyright (c) 2005 JSON.org

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The Software shall be used for Good, not Evil.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/

/*
    The global object JSON contains two methods.

    JSON.stringify(value) takes a JavaScript value and produces a JSON text.
    The value must not be cyclical.

    JSON.parse(text) takes a JSON text and produces a JavaScript value. It will
    throw a 'JSONError' exception if there is an error.
*/
var JSON = {
    copyright: '(c)2005 JSON.org',
    license: 'http://www.crockford.com/JSON/license.html',
/*
    Stringify a JavaScript value, producing a JSON text.
*/
    stringify: function (v) {
        var a = [];

/*
    Emit a string.
*/
        function e(s) {
            a[a.length] = s;
        }

/*
    Convert a value.
*/
        function g(x) {
            var c, i, l, v;

            switch (typeof x) {
            case 'object':
                if (x) {
                    if (x instanceof Array) {
                        e('[');
                        l = a.length;
                        for (i = 0; i < x.length; i += 1) {
                            v = x[i];
                            if (typeof v != 'undefined' &&
                                    typeof v != 'function') {
                                if (l < a.length) {
                                    e(',');
                                }
                                g(v);
                            }
                        }
                        e(']');
                        return;
                    } else if (typeof x.toString != 'undefined') {
                        e('{');
                        l = a.length;
                        for (i in x) {
                            v = x[i];
                            if (x.hasOwnProperty(i) &&
                                    typeof v != 'undefined' &&
                                    typeof v != 'function') {
                                if (l < a.length) {
                                    e(',');
                                }
                                g(i);
                                e(':');
                                g(v);
                            }
                        }
                        return e('}');
                    }
                }
                e('null');
                return;
            case 'number':
                e(isFinite(x) ? +x : 'null');
                return;
            case 'string':
                l = x.length;
                e('"');
                for (i = 0; i < l; i += 1) {
                    c = x.charAt(i);
                    if (c >= ' ') {
                        if (c == '\\' || c == '"') {
                            e('\\');
                        }
                        e(c);
                    } else {
                        switch (c) {
                            case '\b':
                                e('\\b');
                                break;
                            case '\f':
                                e('\\f');
                                break;
                            case '\n':
                                e('\\n');
                                break;
                            case '\r':
                                e('\\r');
                                break;
                            case '\t':
                                e('\\t');
                                break;
                            default:
                                c = c.charCodeAt();
                                e('\\u00' + Math.floor(c / 16).toString(16) +
                                    (c % 16).toString(16));
                        }
                    }
                }
                e('"');
                return;
            case 'boolean':
                e(String(x));
                return;
            default:
                e('null');
                return;
            }
        }
        g(v);
        return a.join('');
    },
/*
    Parse a JSON text, producing a JavaScript value.
*/
    parse: function (text) {
        var p = /^\s*(([,:{}\[\]])|"(\\.|[^\x00-\x1f"\\])*"|-?\d+(\.\d*)?([eE][+-]?\d+)?|true|false|null)\s*/,
            token,
            operator;

        function error(m, t) {
            throw {
                name: 'JSONError',
                message: m,
                text: t || operator || token
            };
        }

        function next(b) {
            if (b && b != operator) {
                error("Expected '" + b + "'");
            }
            if (text) {
                var t = p.exec(text);
                if (t) {
                    if (t[2]) {
                        token = null;
                        operator = t[2];
                    } else {
                        operator = null;
                        try {
                            token = eval(t[1]);
                        } catch (e) {
                            error("Bad token", t[1]);
                        }
                    }
                    text = text.substring(t[0].length);
                } else {
                    error("Unrecognized token", text);
                }
            } else {
                token = operator = undefined;
            }
        }


        function val() {
            var k, o;
            switch (operator) {
            case '{':
                next('{');
                o = {};
                if (operator != '}') {
                    for (;;) {
                        if (operator || typeof token != 'string') {
                            error("Missing key");
                        }
                        k = token;
                        next();
                        next(':');
                        o[k] = val();
                        if (operator != ',') {
                            break;
                        }
                        next(',');
                    }
                }
                next('}');
                return o;
            case '[':
                next('[');
                o = [];
                if (operator != ']') {
                    for (;;) {
                        o.push(val());
                        if (operator != ',') {
                            break;
                        }
                        next(',');
                    }
                }
                next(']');
                return o;
            default:
                if (operator !== null) {
                    error("Missing value");
                }
                k = token;
                next();
                return k;
            }
        }
        next();
        return val();
    }
};

/***
!Setup the data serialization
***/

DataTiddler.format = "JSON";
DataTiddler.stringify = JSON.stringify;
DataTiddler.parse = JSON.parse;

//}}}

[[Overview]] [[Login]]
Apologies are in order for things that have been left out or mistakes present.  The discussion presented here is by no means complete, and probably never will be.  If you would like to help eliminate the gaps or correct the mistakes, [[contribute|Contribute]]!
! Upcoming Events
* [[Workshop on Group Actions, Generalized Cohomology theories, and affine algebraic geometry|http://www.fields.utoronto.ca/programs/scientific/10-11/group_actions/index.html]] - Ottawa (4/22/11-4/24/2011)
* [[Motives and Milnor Conjecture Summer School|http://www.math.uiuc.edu/K-theory/Calendar/20110609/]] - Paris (6/9/11-6/17/11)
* [[Summer school on Rigidity and the Conjecture of Friedlander and Milnor|http://www-cgi.uni-regensburg.de/Fakultaeten/nat_Fak_I/GK/index.php]] - Regensburg (8/1/11-8/5/11)
* [[CIRM meeting on Géométrie arithmétique et motivique|http://www.cirm.univ-mrs.fr/index.html/spip.php?rubrique2&EX=info_rencontre&annee=2011&id_renc=431]] - Luminy (9/19/2011-9/23/2011)
! Past Events
* [[A¹-homotopy Theory and its Recent Developments|http://www.math.ias.edu/node/613]] - Program at the IAS (1/12/10-4/9/10) 
* [[Workshop on Motives V|http://www.kurims.kyoto-u.ac.jp/~gokun/motive2009_e.html]] - Worshop in Tokyo (12/14/09-12/18/09)
* [[Rational curves and A¹-homotopy theory]] - Program at [[AIM|http://www.aimath.org/ARCC/workshops/a1homotopy.html]] (10/5/09-10/9/09)
* [[Homotopy theory and applications|http://www.math.unl.edu/~siyengar2/Rowlee09.html]], University of Nebraska (4/3/09-4/5/09)
* [[11th NRW Topology Meeting|http://www.math.uni-bielefeld.de/~zaeper/11NRW_Topology_announcement.html]] - Bielefeld (5/8/09-5/9/09)
* [[Spaces of curves and their interaction with diophantine problems|http://www.math.columbia.edu/~dejong/conference.html]] - Columbia (6/1/09-6/5/09)
* [[Algebraic K-theory and motivic cohomology|http://www.mfo.de/]] - Oberwolfach (6/28/09-7/04/09) 
* [[Motivic homotopy theory|http://wwwmath.uni-muenster.de/sfb/about/veranst/index2009.html]] - Münster (7/27/09-7/31/09)
* [[Motives and Homotopy Theory of Schemes|http://www.mfo.de/cgi-bin/tagung_espe?type=21&tnr=1020]] - Workshop at Oberwolfach (5/16/10-5/22/10)
* [[Geometric aspects of motivic homotopy theory|http://www.hausdorff-center.uni-bonn.de/event/2010/MotivicHomotopy/]] - Bonn (9/6/10-9/10/10)
* [[AMS Special session on Homotopy theory and K-theory|http://www.ams.org/meetings/sectional/2170_program_ss10.html]] - UCLA (10/9/10-10/10/10)
* Motives Workshop - Tokyo (12/13/10-12/17/10)
* [[K-Theory and Motives|http://www.math.ucla.edu/~k-theory2010/]] - Los Angeles (03/22/2011-03/25/2011)
/***
|Name:|ExtentTagButtonPlugin|
|Description:|Adds a New tiddler button in the tag drop down|
|Version:|3.2 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#ExtendTagButtonPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{

window.onClickTag_mptw_orig = window.onClickTag;
window.onClickTag = function(e) {
	window.onClickTag_mptw_orig.apply(this,arguments);
	var tag = this.getAttribute("tag");
	var title = this.getAttribute("tiddler");
	// Thanks Saq, you're a genius :)
	var popup = Popup.stack[Popup.stack.length-1].popup;
	createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
	wikify("<<newTiddler label:'New tiddler' tag:'"+tag+"'>>",createTiddlyElement(popup,"li"));
	return false;
}

//}}}

Lectures by F. Morel at the fields institute in 2007.  These lectures discuss material contained in the paper ${\mathbb A}^1$[[-algebraic topology over a field|A¹-algebraic topology over a field]].

[[Lecture 1|http://www.fields.utoronto.ca/audio/06-07/crs-A1/morel/]] - (6 Mar. 2007)
[[Lecture 2|http://www.fields.utoronto.ca/audio/06-07/crs-A1/morel2/]] - (7 Mar. 2007)
[[Lecture 3|http://www.fields.utoronto.ca/audio/06-07/crs-A1/morel3/]] - (9 Mar. 2007)
[[Lecture 4|http://www.fields.utoronto.ca/audio/06-07/crs-A1/morel4/]] - (12 Mar. 2007)
[[Lecture 5|http://www.fields.utoronto.ca/audio/06-07/crs-A1/morel5/]] - (13 Mar. 2007)
[[Lecture 6|http://www.fields.utoronto.ca/audio/06-07/crs-A1/morel6/]] - (14 Mar. 2007)
!!! Definition
Suppose $k$ is a field and ${\mathcal Sm}_k$ denotes the category of schemes that are separated smooth and have finite type over $k$.  Given $X$ and $Y$ objects of ${\mathcal Sm}_k$, an //elementary correspondence// from $X$ to $Y$ is an irreducible closed subset $W \subset X \times Y$ whose associated integral subscheme is finite and surjective over a component of $X$.  Write $Cor_k(X,Y)$ for the free abelian group generated by elementary correspondences.  A //finite correspondence// from $X$ to $Y$ is an element of $Cor_k(X,Y)$.

We write ${\mathcal Cor}_k$ for the category whose objects are those of ${\mathcal Sm}_k$, but whose morphisms are finite correspondences.  Note that ${\mathcal Cor}_k$ is an additive category having $\emptyset$ as zero object.

!!! Properties
Finite correspondences are used in the definition of [[presheaves with transfers|Presheaf with transfers]].
/***
<<checkForDataTiddlerPlugin>>
|''Name:''|FormTiddlerPlugin|
|''Version:''|1.0.6 (2007-06-24)|
|''Source:''|http://tiddlywiki.abego-software.de/#FormTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
|''Macros:''|formTiddler, checkForDataTiddlerPlugin, newTiddlerWithForm|
|''Requires:''|DataTiddlerPlugin|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
!Description
Use form-based tiddlers to enter your tiddler data using text fields, listboxes, checkboxes etc. (All standard HTML Form input elements supported).

''Syntax:'' 
|>|{{{<<}}}''formTiddler'' //tiddlerName//{{{>>}}}|
|//tiddlerName//|The name of the FormTemplate tiddler to be used to edit the data of the tiddler containing the macro.|

|>|{{{<<}}}''newTiddlerWithForm'' //formTemplateName// //buttonLabel// [//titleExpression// [''askUser'']] {{{>>}}}|
|//formTemplateName//|The name of the tiddler that defines the form the new tiddler should use.|
|//buttonLabel//|The label of the button|
|//titleExpression//|A (quoted) JavaScript String expression that defines the title (/name) of the new tiddler.|
|''askUser''|Typically the user is not asked for the title when a title is specified (and not yet used). When ''askUser'' is given the user will be asked in any case. This may be used when the calculated title is just a suggestion that must be confirmed by the user|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|

For details and how to use the macros see the [[introduction|FormTiddler Introduction]] and the [[examples|FormTiddler Examples]].

!Revision history
* v1.0.6 (2007-06-24)
** Fixed problem when using SELECT component in Internet Explorer (thanks to MaikBoenig for reporting)
* v1.0.5 (2006-02-24)
** Removed "debugger;" instruction
* v1.0.4 (2006-02-07)
** Bug: On IE no data is written to data section when field values changed (thanks to KenGirard for reporting)
* v1.0.3 (2006-02-05)
** Bug: {{{"No form template specified in <<formTiddler>>"}}} when using formTiddler macro on InternetExplorer (thanks to KenGirard for reporting)
* v1.0.2 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.1 (2005-12-22)
** Features: 
*** Support InternetExplorer
*** Added newTiddlerWithForm Macro
* v1.0.0 (2005-12-14)
** initial version

!Code
***/
//{{{

//============================================================================
//============================================================================
//						FormTiddlerPlugin
//============================================================================
//============================================================================

if (!window.abego) window.abego = {};

abego.getOptionsValue = function(element,i) {
	var v = element.options[i].value;
	if (!v && element.options[i].text)
		v = element.options[i].text;
	return v;
};

version.extensions.FormTiddlerPlugin = {
	major: 1, minor: 0, revision: 5,
	date: new Date(2006, 2, 24), 
	type: 'plugin',
	source: "http://tiddlywiki.abego-software.de/#FormTiddlerPlugin"
};

// For backward compatibility with v1.2.x
//
if (!window.story) window.story=window; 
if (!TiddlyWiki.prototype.getTiddler) TiddlyWiki.prototype.getTiddler = function(title) { return t = this.tiddlers[title]; return (t != undefined && t instanceof Tiddler) ? t : null; } 

//============================================================================
// formTiddler Macro
//============================================================================

// -------------------------------------------------------------------------------
// Configurations and constants 
// -------------------------------------------------------------------------------

config.macros.formTiddler = {
	// Standard Properties
	label: "formTiddler",
	version: {major: 1, minor: 0, revision: 4, date: new Date(2006, 2, 7)},
	prompt: "Edit tiddler data using forms",

	// Define the "setters" that set the values of INPUT elements of a given type
	// (must match the corresponding "getter")
	setter: {  
		button:				function(e, value) {/*contains no data */ },
		checkbox:			function(e, value) {e.checked = value;},
		file:				function(e, value) {try {e.value = value;} catch(e) {/* ignore, possibly security error*/}},
		hidden:				function(e, value) {e.value = value;},
		password:			function(e, value) {e.value = value;},
		radio:				function(e, value) {e.checked = (e.value == value);},
		reset:				function(e, value) {/*contains no data */ },
		"select-one":		function(e, value) {config.macros.formTiddler.setSelectOneValue(e,value);},
		"select-multiple":	function(e, value) {config.macros.formTiddler.setSelectMultipleValue(e,value);},
		submit:				function(e, value) {/*contains no data */},
		text:				function(e, value) {e.value = value;},
		textarea:			function(e, value) {e.value = value;}
	},

	// Define the "getters" that return the value of INPUT elements of a given type
	// Return undefined to not store any data.
	getter: {  
		button:				function(e, value) {return undefined;},
		checkbox:			function(e, value) {return e.checked;},
		file:				function(e, value) {return e.value;},
		hidden:				function(e, value) {return e.value;},
		password:			function(e, value) {return e.value;},
		radio:				function(e, value) {return e.checked ? e.value : undefined;},
		reset:				function(e, value) {return undefined;},
		"select-one":		function(e, value) {return config.macros.formTiddler.getSelectOneValue(e);},
		"select-multiple":	function(e, value) {return config.macros.formTiddler.getSelectMultipleValue(e);},
		submit:				function(e, value) {return undefined;},
		text:				function(e, value) {return e.value;},
		textarea:			function(e, value) {return e.value;}
	}
};


// -------------------------------------------------------------------------------
// The formTiddler Macro Handler 
// -------------------------------------------------------------------------------

config.macros.formTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	if (!config.macros.formTiddler.checkForExtensions(place, macroName)) {
		return;
	}
	// --- Parsing ------------------------------------------

	var i = 0; // index running over the params

	// get the name of the form template tiddler
	var formTemplateName = undefined;
	if (i < params.length) {
		formTemplateName = params[i];
		i++;
	}

	if (!formTemplateName) {
		config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");
		return;
	}


	// --- Processing ------------------------------------------

	// Get the form template text. 
	// (This contains the INPUT elements for the form.)
	var formTemplateTiddler = store.getTiddler(formTemplateName);
	if (!formTemplateTiddler) {
		config.macros.formTiddler.createErrorElement(place, "Form template '" + formTemplateName + "' not found.");
		return;
	}
	var templateText = formTemplateTiddler.text;
	if(!templateText) {
		// Shortcut: when template text is empty we do nothing.
		return;
	}

	// Get the name of the tiddler containing this "formTiddler" macro
	// (i.e. the tiddler, that will be edited and that contains the data)
	var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(place);

	// Append a "form" element. 
	var formName = "form"+formTemplateName+"__"+tiddlerName;
	var e = document.createElement("form");
	e.setAttribute("name", formName);
	place.appendChild(e);

	// "Embed" the elements defined by the templateText (i.e. the INPUT elements) 
	// into the "form" element we just created
	wikify(templateText, e);

	// Initialize the INPUT elements.
	config.macros.formTiddler.initValuesAndHandlersInFormElements(formName, DataTiddler.getDataObject(tiddlerName));
}


// -------------------------------------------------------------------------------
// Form Data Access 
// -------------------------------------------------------------------------------

// Internal.
//
// Initialize the INPUT elements of the form with the values of their "matching"
// data fields in the tiddler. Also setup the onChange handler to ensure that
// changes in the INPUT elements are stored in the tiddler's data.
//
config.macros.formTiddler.initValuesAndHandlersInFormElements = function(formName, data) {
	// config.macros.formTiddler.trace("initValuesAndHandlersInFormElements(formName="+formName+", data="+data+")");

	// find the form
	var form = config.macros.formTiddler.findForm(formName);
	if (!form) {
		return;
	}

	try {
		var elems = form.elements;
		for (var i = 0; i < elems.length; i++) {
			var c = elems[i];
		
			var setter = config.macros.formTiddler.setter[c.type];
			if (setter) {
				var value = data[c.name];
				if (value != null) {
					setter(c, value);
				}
				c.onchange = onFormTiddlerChange;
			} else {
				config.macros.formTiddler.displayFormTiddlerError("No setter defined for INPUT element of type '"+c.type+"'. (Element '"+c.name+"' in form '"+formName+"')");
			}
		}
	} catch(e) {
		config.macros.formTiddler.displayFormTiddlerError("Error when updating elements with new formData. "+e);
	}
}


// Internal.
//
// @return [may be null]
//
config.macros.formTiddler.findForm = function(formName) {
	// We must manually iterate through the document's forms, since
	// IE does not support the "document[formName]" approach

	var forms = window.document.forms;
	for (var i = 0; i < forms.length; i++) {
		var form = forms[i];
		if (form.name == formName) {
			return form;
		}
	}

	return null;
}


// Internal.
//
config.macros.formTiddler.setSelectOneValue = function(element,value) {
	var n = element.options.length;
	for (var i = 0; i < n; i++) {
		element.options[i].selected = abego.getOptionsValue(element,i) == value;
	}
}

// Internal.
//
config.macros.formTiddler.setSelectMultipleValue = function(element,value) {
	var values = {};
	for (var i = 0; i < value.length; i++) {
		values[value[i]] = true;
	}
	
	var n = element.length;
	for (var i = 0; i < n; i++) {
		element.options[i].selected = !(!values[abego.getOptionsValue(element,i)]);
	}
}

// Internal.
//
config.macros.formTiddler.getSelectOneValue = function(element) {
	var i = element.selectedIndex;
	return (i >= 0) ? abego.getOptionsValue(element,i) : null;
}

// Internal.
//
config.macros.formTiddler.getSelectMultipleValue = function(element) {
	var values = [];
	var n = element.length;
	for (var i = 0; i < n; i++) {
		if (element.options[i].selected) {
			values.push(abego.getOptionsValue(element,i));
		}
	}
	return values;
}



// -------------------------------------------------------------------------------
// Helpers 
// -------------------------------------------------------------------------------

// Internal.
//
config.macros.formTiddler.checkForExtensions = function(place,macroName) {
	if (!version.extensions.DataTiddlerPlugin) {
		config.macros.formTiddler.createErrorElement(place, "<<" + macroName + ">> requires the DataTiddlerPlugin. (You can get it from http://tiddlywiki.abego-software.de/#DataTiddlerPlugin)");
		return false;
	}
	return true;
}

// Internal.
//
// Displays a trace message in the "TiddlyWiki" message pane.
// (used for debugging)
//
config.macros.formTiddler.trace = function(s) {
	displayMessage("Trace: "+s);
}

// Internal.
//
// Display some error message in the "TiddlyWiki" message pane.
//
config.macros.formTiddler.displayFormTiddlerError = function(s) {
	alert("FormTiddlerPlugin Error: "+s);
}

// Internal.
//
// Creates an element that holds an error message
// 
config.macros.formTiddler.createErrorElement = function(place, message) {
	return createTiddlyElement(place,"span",null,"formTiddlerError",message);
}

// Internal.
//
// Returns the name of the tiddler containing the given element.
// 
config.macros.formTiddler.getContainingTiddlerName = function(element) {
	return story.findContainingTiddler(element).id.substr(7);
}

// -------------------------------------------------------------------------------
// Event Handlers 
// -------------------------------------------------------------------------------

// This function must be called by the INPUT elements whenever their
// data changes. Typically this is done through an "onChange" handler.
//
function onFormTiddlerChange (e) {
	// config.macros.formTiddler.trace("onFormTiddlerChange "+e);

	if (!e) var e = window.event;

	var target = resolveTarget(e);
	var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(target);
	var getter = config.macros.formTiddler.getter[target.type];
	if (getter) {
		var value = getter(target);
		DataTiddler.setData(tiddlerName, target.name, value);
	} else {
		config.macros.formTiddler.displayFormTiddlerError("No getter defined for INPUT element of type '"+target.type+"'. (Element '"+target.name+"' used in tiddler '"+tiddlerName+"')");
	}
}

// ensure that the function can be used in HTML event handler
window.onFormTiddlerChange = onFormTiddlerChange;


// -------------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// -------------------------------------------------------------------------------

setStylesheet(
	".formTiddlerError{color: #ffffff;background-color: #880000;}",
	"formTiddler");


//============================================================================
// checkForDataTiddlerPlugin Macro
//============================================================================

config.macros.checkForDataTiddlerPlugin = {
	// Standard Properties
	label: "checkForDataTiddlerPlugin",
	version: {major: 1, minor: 0, revision: 0, date: new Date(2005, 12, 14)},
	prompt: "Check if the DataTiddlerPlugin exists"
}

config.macros.checkForDataTiddlerPlugin.handler = function(place,macroName,params) {
	config.macros.formTiddler.checkForExtensions(place, config.macros.formTiddler.label);
}



//============================================================================
// newTiddlerWithForm Macro
//============================================================================

config.macros.newTiddlerWithForm = {
	// Standard Properties
	label: "newTiddlerWithForm",
	version: {major: 1, minor: 0, revision: 1, date: new Date(2006, 1, 6)},
	prompt: "Creates a new Tiddler with a <<formTiddler ...>> macro"
}

config.macros.newTiddlerWithForm.handler = function(place,macroName,params) {
	// --- Parsing ------------------------------------------

	var i = 0; // index running over the params

	// get the name of the form template tiddler
	var formTemplateName = undefined;
	if (i < params.length) {
		formTemplateName = params[i];
		i++;
	}

	if (!formTemplateName) {
		config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");
		return;
	}

	// get the button label
	var buttonLabel = undefined;
	if (i < params.length) {
		buttonLabel = params[i];
		i++;
	}

	if (!buttonLabel) {
		config.macros.formTiddler.createErrorElement(place, "No button label specified in <<" + macroName + ">>.");
		return;
	}

	// get the (optional) tiddlerName script and "askUser"
	var tiddlerNameScript = undefined;
	var askUser = false;
	if (i < params.length) {
		tiddlerNameScript = params[i];
		i++;

		if (i < params.length && params[i] == "askUser") {
			askUser = true;
			i++;
		}
	}

	// --- Processing ------------------------------------------

	if(!readOnly) {
		var onClick = function() {
			var tiddlerName;
			if (tiddlerNameScript) {
				try {
					tiddlerName = eval(tiddlerNameScript);
				} catch (ex) {
				}
			}
			if (!tiddlerName || askUser) {
				tiddlerName = prompt("Please specify a tiddler name.", askUser ? tiddlerName : "");
			}
			while (tiddlerName && store.getTiddler(tiddlerName)) {
				tiddlerName = prompt("A tiddler named '"+tiddlerName+"' already exists.\n\n"+"Please specify a tiddler name.", tiddlerName);
			}

			// tiddlerName is either null (user canceled) or a name that is not yet in the store.
			if (tiddlerName) {
				var body = "<<formTiddler [["+formTemplateName+"]]>>";
				var tags = [];
				store.saveTiddler(tiddlerName,tiddlerName,body,config.options.txtUserName,new Date(),tags);
				story.displayTiddler(null,tiddlerName,1);
			}
		}

		createTiddlyButton(place,buttonLabel,buttonLabel,onClick);
    }
}

//}}}


/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])

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

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

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

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/
!!! Definition
Suppose $({\mathcal S},s)$ is a sheaf of pointed sets.  The __free strongly ${\mathbb A}^1$-invariant sheaf of groups generated by ${\mathcal S}$__, denoted $F_{{\mathbb A}^1}({\mathcal S})$ is the ${\mathbb A}^1$[[-homotopy group|A¹-homotopy groups]] defined by
\[
F_{{\mathbb A}^1}({\mathbb S}) := \pi_1^{{\mathbb A}^1}(\Sigma^1_s {\mathcal S}).
\] 
Thus, $F_{{\mathbb A}^1}(\cdot)$ defines a functor from the category of [[pointed spaces|Motivic space]] ${\mathcal Spc}_{k,\bullet}$ to the category of strongly ${\mathbb A}^1$-invariant sheaves of groups ${\mathcal Gr}^{{\mathbb A}^1}_k$.  

!!! Properties
The functor $F_{{\mathbb A}^1}(\cdot)$ is left adjoint to the forgetful functor ${\mathcal Gr}^{{\mathbb A}^1} \to {\mathcal Spc}_{k,\bullet}$.  To prove this, we will explicitly construct the necessary bijection.  There is a canonical map ${\mathcal S} \to \Omega^1_s \Sigma^1_s {\mathcal S}$ and a canonical map $\Omega^1_s \Sigma^1_s {\mathcal S} \to \pi_0^{{\mathbb A}^1}(\Omega^1_s \Sigma^1_s {\mathcal S})$.  Composing these maps induces a map ${\mathcal S} \to \pi_1^{{\mathbb A}^1}(\Sigma^1_s {\mathcal S})$.  

''Lemma'': The map 
\[
Hom_{{\mathcal Gr}}(\pi_1^{{\mathbb A}^1}(\Sigma^1_s{\mathcal S}),G) \to Hom_{{\mathcal Spc}_{k,\bullet}}(({\mathcal S},s),(G,1))
\]
induced by ${\mathcal S} \to \pi_1^{{\mathbb A}^1}(\Sigma^1_s {\mathcal S})$ is a bijection.

Suppose $G$ and $H$ are [[strongly|Strongly A¹-invariant]] ${\mathbb A}^1$-invariant sheaves of groups.  Let ${\mathcal Gr}_k$ denote the category of Nisnevich sheaves of groups.  We know that for any pointed ${\mathbb A}^1$-connected space $({\mathcal X},x)$, there is a canonical bijection
\[
[({\mathcal X},x),(BG,\ast)]_{{\mathbb A}^1} \to Hom_{{\mathcal Gr}_k}(\pi_1^{{\mathbb A}^1}({\mathcal X},x),G) 
\]
induced by the first stage of the [[Postnikov tower]].  Since $G$ is strongly ${\mathbb A}^1$-invariant, $BG$ is ${\mathbb A}^1$-local and so the canonical map 
\[
[({\mathcal X},x),(BG,\ast)]_s \to [({\mathcal X},x),(BG,\ast)]_{{\mathbb A}^1}
\] 
is a bijection.  Now, take ${\mathcal X} = \Sigma^1_s {\mathcal S}$, with $({\mathcal S},s)$ a pointed sheaf of sets.  The adjunction of simplicial looping and simplicial suspension give rise to a canonical bijection
\[
[\Sigma^1_s {\mathcal S},(BG,\ast)]_s \to [{\mathcal S},\Omega^1_s BG]_s.
\]
There is a canonical pointed morphism $\Omega^1_s BG \to G$ which induces a map
\[
[\Sigma^1_s {\mathcal S},(BG,\ast)] \to [({\mathcal S},s),(G,1)]_s.
\]
The map $\Omega^1_s BG \to G$ can be checked to be a (pointed) simplicial weak equivalence ($BG$ is locally fibrant, so it suffices to check this on stalks, where it reduces to the corresponding fact for simplicial sets).  Choosing the necessary inverses, we obtain a map
\[
Hom_{{\mathcal Gr}}(\pi_1^{{\mathbb A}^1}(\Sigma^1_s {\mathcal S}),G) \to [({\mathcal S},s),(G,1)]_s,
\]
which coincides with the map defined above.  Since $G$ is a sheaf of simplicial dimension $0$, the fact that the functor $Spc_{k,\bullet} \to {\mathcal H}_{s,\bullet}^{Nis}({\mathcal Sm}_k)$ is fully-faithful (see [[A¹-homotopy theory of schemes]] Remark 2.1.14) allows us to conclude that the map
\[
Hom_{{\mathcal Spc}_{k,\bullet}}(({\mathcal S},s),(G,1)) \to [({\mathcal S},s),(G,1)]_s
\] 
is a bijection.

 

!!! Examples
The most basic example of the above construction is for the pointed space ${\mathcal X} = ({\mathbb P}^1)$.  Here ${\mathbb P}^1$ admits an open cover by two sets isomorphic to ${\mathbb A}^1$, and with intersection ${\mathbb G}_m$.  There is a canonical map from the homotopy colimit to the colimit of the associated Mayer-Vietoris diagram: ${\mathbb A}^1 \leftarrow {\mathbb G}_m \rightarrow {\mathbb A}^1$ to the colimit of this diagram, i.e., a map $\Sigma^1_s {\mathbb G}_m \to {\mathbb P}^1$, that is an ${\mathbb A}^1$-weak equivalence.  Thus, $\pi_1^{{\mathbb A}^1}({\mathbb P}^1)$ is the free strongly ${\mathbb A}^1$-invariant sheaf of groups generated by the pointed set $({\mathbb G}_m,1)$. The current notation for this is:
\[
F_{{\mathbb A}^1}(1) := \pi_1^{{\mathbb A}^1}(\Sigma^1_s {\mathbb G}_m).
\]  
We will discuss this in: [[the A¹-fundamental group of the projective line|The A¹-fundamental group of the projective line]]. 
!!! Conjecture
Suppose $G$ is a complex Lie group, and $G^{\delta}$ denotes $G$ viewed as a discrete group.  The identity map $G^{\delta} \to G$ is a continuous group homomorphism, and induces a map $i: BG^{\delta} \to BG.\;$  For any integer $n \geq 0,\;$ the induced map on cohomology
\[
i^*: H^*(BG,{\mathbb Z}/n{\mathbb Z}) \to H^*(BG^{\delta},{\mathbb Z}/n{\mathbb Z})
\]
is an isomorphism.

!!! References
!!! Definition
Suppose $G$ is a Nisnevich [[sheaf of groups|Motivic space]] on ${\mathcal Sm}_S$.  The identity section $1_S: S \to {\mathbb G}_m$ induces for any smooth $S$-scheme $U$ a map 
\[
ev_1: G({\mathbb G}_m \times U) \to G(U).
\]  
The ${\mathbb G}_m$-[[loop sheaf|G_m-loop sheaf]] of $G$, denoted $G_{-1}$, is the sheaf associated with the presheaf whose sections over $U \in {\mathcal Sm}_S$ are defined by
\[
G_{-1}(U) := Ker(ev_1).   
\]
The construction $G \mapsto G_{-1}$ defines an endo-functor ${\mathcal Gr}_S \to {\mathcal Gr}_S$. 

!!! Properties
''Lemma'': The presheaf $U \mapsto G_{-1}(U)$ is already a Nisnevich sheaf.

//Proof//.  To see this, note that the sheaf whose sections over a smooth scheme $U$ are $G({\mathbb G}_m \times U)$ is the internal hom $\underline{Hom}_{{\mathcal Gr}_{k}}({\mathbb G}_m,G)$.  The map corresponding to the identity section can be identified with equalizer of the morphism of sheaves
\[
\underline{Hom}_{{\mathcal Gr}_k}({\mathbb G}_m,G) \to G
\]
and the trivial morphism. 

Suppose $k$ is a field in everything below. 

''Lemma'': If $G$ is a strongly ${\mathbb A}^1$[[-invariant sheaf of groups|Strongly A¹-invariant]], then $G_{-1}$ is also strongly ${\mathbb A}^1$-invariant.  

//Proof//.  The property that $G$ be a strongly ${\mathbb A}^1$[[-invariant sheaf|Strongly A¹-invariant]] of groups is equivalent to the property that the simplicial [[classifying space|Classifying space]] $B(G)$ be ${\mathbb A}^1$[[-local|A¹-local]].  Let $B(G)^f$ denote a fibrant model of $B(G)$.  Since the property of being ${\mathbb A}^1$-local is an invariant of the simplicial homotopy class of a space, the fact that $B(G)$ is ${\mathbb A}^1-local$ implies that $B(G)^f$ is ${\mathbb A}^1$-local and conversely.  Since $B(G)^f$ is simplicially fibrant and ${\mathbb A}^1$-local, it follows that the space $\underline{Hom}_{{\mathcal Spc}_{k,\bullet}}(({\mathbb G}_m,1),(B(G)^f,\ast))$ is also simplicially fibrant and ${\mathbb A}^1$-local.  Furthermore, this space is simplicially weakly equivalent to the ``total loop space" ${\mathbf R}\underline{Hom}({\mathbb G}_m,B(G))$.  

Using a method similar to the proof of [[A¹-homotopy theory of schemes]] Section 4 Corollary 3.2, we conclude that one has an isomorphism
\[
\pi_1^s(\underline{Hom}_{{\mathcal Spc}_{k,\bullet}}(({\mathbb G}_m,1),(B(G)^f,\ast))) \to G_{-1}
\]
and the higher simplicial homotopy sheaves of groups vanish.  Finally, we also claim that $\underline{Hom}_{{\mathcal Spc}_{k,\bullet}}(({\mathbb G}_m,1),(B(G)^f,\ast))$ is simplicially $0$-connected.  This last set can be identified with the Nisnevich sheaf associated with the presheaf $H^1_{Nis}({\mathbb G}_m \times U,G)$.  As this sheaf is a Nisnevich sheaf of groups, and $G$ is strongly ${\mathbb A}^1$-invariant, a base change argument shows that it suffices to prove that the sets $H^1_{Nis}({\mathbb G}_m,G)$ are all trivial for any separable finitely generated extension $F/k$.  One can prove this using an explicit computation using the [[truncated Cousin resolution|Truncated Cousin resolution]].   

''Lemma'': If
\[
1 \to G' \to G \to G'' \to 1 
\]
is a short exact sequence of strongly ${\mathbb A}^1$-invariant sheaf of groups, then the sequence obtained by applying the functor $(\cdot)_{-1}$, namely:
\[
G'_{-1} \to G_{-1} \to G''_{-1},
\]
is a short exact sequence of strongly ${\mathbb A}^1$-invariant sheaves of groups. 
!!! Definition
Suppose $({\mathcal X},x)$ is a pointed space.  The ${\mathbb G}_m$-loop space of ${\mathcal X}$ is the space 
\[
\Omega^1_t {\mathcal X} := \underline{Map}(({\mathbb G}_m,1),({\mathcal X},x)).
\]
To ``compute" $\Omega^1_t {\mathcal X}$, one must first take a simplicially fibrant replacement for ${\mathcal X}$.    

!!! Properties
''Proposition'' (Morel): If $({\mathcal X},x)$ is ${\mathbb A}^1$-connected, then so is $\Omega^1_t {\mathcal X}$.  
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>

See also [[MPTW]].

/***
|Name:|HideWhenPlugin|
|Description:|Allows conditional inclusion/exclusion in templates|
|Version:|3.1 ($Rev: 3919 $)|
|Date:|$Date: 2008-03-13 02:03:12 +1000 (Thu, 13 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}
***/
//{{{

window.hideWhenLastTest = false;

window.removeElementWhen = function(test,place) {
	window.hideWhenLastTest = test;
	if (test) {
		removeChildren(place);
		place.parentNode.removeChild(place);
	}
};


merge(config.macros,{

	hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( eval(paramString), place);
	}},

	showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !eval(paramString), place);
	}},

	hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAll(params), place);
	}},

	showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAll(params), place);
	}},

	hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAny(params), place);
	}},

	showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAny(params), place);
	}},

	hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAll(params), place);
	}},

	showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAll(params), place);
	}},

	hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);
	}},

	showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);
	}},

	hideWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.title == params[0], place);
	}},

	showWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.title != params[0], place);
	}},

	'else': { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !window.hideWhenLastTest, place);
	}}

});

//}}}

A timeline:

1964 - Letter from Grothendieck to Serre with the first mention of the theory of motives
1968 - Manin's paper ``Correspondencs, Motifs, and Monoidal Transformations" appears
1969 - Demazure's paper "[[Motifs des variétés algébriques|http://www.numdam.org/numdam-bin/fitem?id=SB_1969-1970__12__19_0]]" appears in Séminaire Bourbaki

1989 - Deligne's paper ``[[Le Groupe Fondamental de la droite projective moins trois points|http://www.math.ias.edu/files/deligne/GaloisGroups.pdf]]" appears in the proceedings of a workshop at MSRI on Galois groups over ${\mathbb Q}$
...
!!! Summary
The __Thom isomorphism theorem__, or __homotopy purity theorem__, proved in [[A¹-homotopy theory of schemes|MoVo99]] Section 3 Theorem 2.23 is a central result in ${\mathbb A}^1$-homotopy theory.  To state the theorem, one needs the notion of [[Thom space]] of a vector bundle.  

!!! Statement
__''Theorem''__: (Homotopy purity) Let $i: Z \to X$ be a closed embedding of smooth $S$-schemes.  Denote by 
\[
\nu_{Z/X}: {\mathcal N}_{Z/X} \to Z\] the normal bundle to $i$, and by $Th(\nu_{Z/X})$ its [[Thom space|Thom space/Definition]].  There is a canonical pointed ${\mathbb A}^1$[[-weak equivalence|A¹-weak equivalence]]
\[
X/(X - i(Z)) \cong Th(\nu_{Z/X}).  
\]

!!! Proof
The two key geometric ingredients of this proof are i) deformation to the normal cone, and ii) the fact that locally in the Nisnevich topology pairs $(Z,X)$ consisting of a smooth scheme $X$ and a smooth closed subscheme $Z \subset X$ are isomorphic to pairs of the form $({\mathbb A}^m,{\mathbb A}^n)$.  Point i) is used to define the ``canonical" morphism of the statement.  Point ii) is used together with some formal homotopy theoretic manipulations to reduce the proof to a suitable ``local" situation, where it is essentially clear by construction.  
<part Constructionofthemorphism>
!!!! Construction of the morphism
Let us begin by describing the canonical morphism of the statement.  

Let \[p_{X,Z}: B(X,Z) \to X \times {\mathbb A}^1\] denote the blow-up of $Z \times \{ 0 \}$ viewed as a closed subscheme of $X \times {\mathbb A}^1$ via $i$.  We also let \[f_{X,Z}: Z \times {\mathbb A}^1 \to B(X,Z)\] denote the canonical closed immersion that splits $p_{X,Z}$ over $Z \times {\mathbb A}^1$, and \[g_{X,Z}:X \to B(X,Z)\] the canonical closed immersion that splits $p_{X,Z}$ over $X \times \{ 1 \}$. For simplicity, we write $\nu$ for the normal bundle ${\mathcal N}_{Z/X} \to Z$ (suppressing $Z$ and $X$) and suppress $X,Z$ in in the morphisms $p,f$, and $g$. If $\epsilon$ denotes the trivial bundle over a smooth scheme, then there is a canonical isomorphism
\[
p^{-1}(Z \times \{ 0 \}) \to {\mathbb P}(\nu \oplus \epsilon). 
\]
This isomorphism induces an isomorphism 
\[
p^{-1}(Z \times \{ 0 \}) - f(Z \times \{ 0 \}) \to {\mathbb P}(\nu \oplus \epsilon) - {\mathbb P}(\epsilon),
\]
and thus an isomorphism of pointed spaces
\[
Th(\nu) \to p^{-1}(Z \times \{ 0 \})/p^{-1}(Z \times \{ 0 \}) - f(Z \times \{ 0 \}).
\]

The identifications
\[
g(X) \cap f(Z \times {\mathbb A}^1) = g(i(Z))
\]
and
\[
p^{-1}(Z \times \{ 0 \}) \cap f(Z \times {\mathbb A}^1) = f(Z \times \{ 0 \})
\]
give rise to monomorphisms
\[
\tilde{g}_{X,Z}: X/(X - Z) \to B(X,Z)/(B(X,Z) - f(Z \times {\mathbb A}^1))
\] 
and
\[
\alpha_{X,Z}: Th(\nu_{Z/X}) \to B(X,Z)/(B(X,Z) - f(Z \times {\mathbb A}^1)).
\]
The homotopy purity theorem then follows from the fact that the morphisms $\tilde{g}_{X,Z}$ and $\alpha_{X,Z}$ are ${\mathbb A}^1$[[-weak equivalences|A¹-weak equivalence]].</part>
!!! Definition
Given [[pointed spaces|Motivic space]] $({\mathcal X},x), ({\mathcal Y},y)$, and $({\mathcal Z},z)$, and a [[morphism of pointed spaces|Motivic space]] 
\[
f: {\mathcal X} \times {\mathcal Y} \to {\mathcal Z},
\] 
__the Hopf construction__ on $f$ is a morphism
\[
h(f): {\mathcal X} \ast {\mathcal Y} \to \Sigma^1_s {\mathcal Z}
\]
defined as follows.  The map $f$ defines a morphism of diagrams

<html><center><IMG src="http://www.yourequations.com/eq.latex?\begin{matrix} {\mathcal X} & \leftarrow {\mathcal X} \times {\mathcal Y} \rightarrow & {\mathcal X} \\ \downarrow & \downarrow & \downarrow \\ \ast & \leftarrow {\mathcal Z} \rightarrow & \ast \end{matrix}" alt="\begin{matrix} {\mathcal X} & \leftarrow {\mathcal X} \times {\mathcal Y} \rightarrow & {\mathcal X} \\ \downarrow & \downarrow & \downarrow \\ \ast & \leftarrow {\mathcal Z} \rightarrow & \ast \end{matrix}" class="eq_latex" align="middle" border="0"></center></html>
and thus induces a map of the homotopy colimits of the corresponding diagrams, which is the claimed morphism.  The homotopy colimit of the top row is the [[join|Join]] and the homotopy colimit of the bottow row is just $\Sigma^1_s {\mathcal Z}$.  

!!! Examples
The Hopf construction on the multiplication map $m: {\mathbb G}_m \times {\mathbb G}_m \to {\mathbb G}_m$ induces a map $h(m): \Sigma^1_s {\mathbb G}_m \wedge {\mathbb G}_m \to \Sigma^1_s {\mathbb G}_m$, i.e., a map
\[
\eta:= h(m): S^{1,2} \to S^{1,1}.
\]This morphism can be explicitly identified with the canonical ${\mathbb G}_m$-torsor ${\mathbb A}^2 \setminus 0 \to {\mathbb P}^1$.  

The Hopf construction on the multiplication map $m: SL_2 \times SL_2 \to SL_2$ induces a map $h(m): \Sigma^1_s SL_2 \wedge SL_2 \to \Sigma^1_s SL_2$.  Since the projection map $SL_2 \to {\mathbb A}^2 \setminus 0$ is an ${\mathbb A}^1$-weak equivalence, it follows that we have constructed a map
\[
\nu := h(m): S^{3,4} \to S^{2,2}.
\] This morphism can be explicitly identified with a morphism $Q_7 \to Q_4$, where $Q_i$ are explicit geometric models for [[motivic spheres|Motivic sphere]].  

There is also a morphism $S^{7,8} \to S^{4,4}$ coming from the multiplication map on the unit norm elements in a split octonion algebra.  
/***
|Name:|InstantTimestampPlugin|
|Description:|A handy way to insert timestamps in your tiddler content|
|Version:|1.0.10 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#InstantTimestampPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Usage
If you enter {ts} in your tiddler content (without the spaces) it will be replaced with a timestamp when you save the tiddler. Full list of formats:
* {ts} or {t} -> timestamp
* {ds} or {d} -> datestamp
* !ts or !t at start of line -> !!timestamp
* !ds or !d at start of line -> !!datestamp
(I added the extra ! since that's how I like it. Remove it from translations below if required)
!!Notes
* Change the timeFormat and dateFormat below to suit your preference.
* See also http://mptw2.tiddlyspot.com/#AutoCorrectPlugin
* You could invent other translations and add them to the translations array below.
***/
//{{{

config.InstantTimestamp = {

	// adjust to suit
	timeFormat: 'DD/0MM/YY 0hh:0mm',
	dateFormat: 'DD/0MM/YY',

	translations: [
		[/^!ts?$/img,  "'!!{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
		[/^!ds?$/img,  "'!!{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"],

		// thanks Adapted Cat
		[/\{ts?\}(?!\}\})/ig,"'{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
		[/\{ds?\}(?!\}\})/ig,"'{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"]
		
	],

	excludeTags: [
		"noAutoCorrect",
		"noTimestamp",
		"html",
		"CSS",
		"css",
		"systemConfig",
		"systemConfigDisabled",
		"zsystemConfig",
		"Plugins",
		"Plugin",
		"plugins",
		"plugin",
		"javascript",
		"code",
		"systemTheme",
		"systemPalette"
	],

	excludeTiddlers: [
		"StyleSheet",
		"StyleSheetLayout",
		"StyleSheetColors",
		"StyleSheetPrint"
		// more?
	]

}; 

TiddlyWiki.prototype.saveTiddler_mptw_instanttimestamp = TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {

	tags = tags ? tags : []; // just in case tags is null
	tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;
	var conf = config.InstantTimestamp;

	if ( !tags.containsAny(conf.excludeTags) && !conf.excludeTiddlers.contains(newTitle) ) {

		var now = new Date();
		var trans = conf.translations;
		for (var i=0;i<trans.length;i++) {
			newBody = newBody.replace(trans[i][0], eval(trans[i][1]));
		}
	}

	// TODO: use apply() instead of naming all args?
	return this.saveTiddler_mptw_instanttimestamp(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created);
}

// you can override these in StyleSheet 
setStylesheet(".ts,.ds { font-style:italic; }","instantTimestampStyles");

//}}}

!!! Definition
Given two [[spaces|Motivic space]] ${\mathcal X}$ and ${\mathcal Y}$, the __join__ of ${\mathcal X}$ and ${\mathcal Y}$, denoted ${\mathcal X} \ast {\mathcal Y}$ is the homotopy colimit of the diagram
\[
{\mathcal X} \leftarrow {\mathcal X} \times {\mathcal Y} \rightarrow {\mathcal Y}
\]
where the each arrow is the projection morphism.  

!!! Properties
''Lemma:'' If $({\mathcal X},x)$ and $({\mathcal Y},y)$ are [[pointed spaces|Motivic space]], the projections are morphisms of pointed spaces, and one has an ${\mathbb A}^1$-weak equivalence 
\[
{\mathcal X} \ast {\mathcal Y} \cong S^1_s \wedge {\mathcal X} \wedge {\mathcal Y}.
\] 
//Proof.// Recall that the [[cone|Cone]] on a pointed space $({\mathcal X},x)$, denoted $C({\mathcal X})$, is the smash product of ${\mathcal X} \wedge \Delta^1_s$ with the [[simplicial unit interval|Algebraic simplex]] $\Delta^1_s$ pointed by $1$.  The [[anticone|Cone]] on a pointed space $({\mathcal X},x)$, denoted $C'({\mathcal X})$, is the smash product ${\mathcal X} \wedge \Delta^1_s$, where the [[simplicial unit interval|Algebraic simplex]] is pointed by $0$.  Both the cone and the anticone on ${\mathcal X}$ are simplicially contractible.  If we include ${\mathcal X}$ in $C'({\mathcal X})$ as the image of ${\mathcal X} \times 0$, then the quotient $C'({\mathcal X})/{\mathcal X}$ is the simplicial suspension $S^1_s \wedge {\mathcal X}$.  

In any case, the homotopy colimit of the above diagram is simplicially weakly equivalent to the colimit of the diagram: 
\[
{\mathcal X} \times C'({\mathcal Y}) \leftarrow {\mathcal X} \times {\mathcal Y} \rightarrow C({\mathcal X}) \times {\mathcal Y}.
\]
The wedge sum $C({\mathcal X}) \wedge C'({\mathcal Y})$ is simplicially contractible and contained in the join.  The quotient ${\mathcal X} \ast {\mathcal Y}/C({\mathcal X}) \wedge C'({\mathcal Y})$ is $S^1_s \wedge {\mathcal X} \wedge {\mathcal Y}$.  

!!! Examples
The space ${\mathbb A}^m \setminus 0$ is the join of ${\mathbb A}^{m-1} \setminus 0$ and ${\mathbb G}_m$; this observation is useful in the study of [[motivic spheres|Motivic sphere]].  

The join is useful in defining the [[Hopf construction]]: Given [[pointed spaces|Motivic space]] $({\mathcal X},x), ({\mathcal Y},y)$, and $({\mathcal Z},z)$, and a [[morphism of pointed spaces|Motivic space]] 
\[
f: {\mathcal X} \times {\mathcal Y} \to {\mathcal Z},
\] 
the Hopf construction on $f$ provides a morphism
\[
h(f): {\mathcal X} \ast {\mathcal Y} \to \Sigma^1_s {\mathcal Z}.
\]
!!! Construction

Let $\Delta^n$ denote the $n$-simplex, which can be thought of as the simplicial set associated with the category $[n]$ (which we interchangeably think of as a poset).  The non-degenerate $m$-simplicies of $\Delta^n$ correspond to the monic ordinal number maps $[m] \to [n]$, and there is exactly one such map for each subset of $m+1$ elements of the set of objects of $[n]$.  The non-degenerate simplices of $\Delta^n$ give rise to a poset $P\Delta^n$.  Consider this poset as a category, and denote by $sd \Delta^n$ the simplicial set obtained by taking the [[nerve|Nerve]] of $P\Delta^n$: $N(P\Delta^n)$.  Here $sd$ stands for ``subdivision" and the geometric realization of $sd \Delta^n$ is the barycentric subdivision of the geometric realization of $\Delta^n$.  The above construction is functorial in the following sense.  A function $[m] \to [n]$ determines a morphism of posets $P\Delta^m \to P\Delta^n$ and thus a functor of the associated categories.  By the functoriality of the nerve construction, this induces a morphism
\[
sd \Delta^m \to sd \Delta^n
\]
Taken together, the collection $sd \Delta^{\bullet}$ form a cosimplicial simplicial set.  

Note that there are canonical maps $sd \Delta^n \to \Delta^n$ defined as follows  Indeed, there is a morphism of posets $P\Delta^n \to [n]$ given by taking the ``last vertex."  This construction defines a morphism of cosimplicial objects $sd \Delta^{\bullet} \to \Delta^{\bullet}$.  

Given a simplicial set, we set
\[
Ex(X) := Hom_{{\Delta^{\circ}\mathbb{Set}}}(sd \Delta^{\bullet},X),
\] 
where the simplicial structure is induced by the cosimplicial structure of $sd \Delta^{\bullet}$.  The morphism $sd \Delta^{\bullet} \to \Delta^{\bullet}$ induces a morphism of simplicial sets
\[
\eta: X \to Ex(X);  
\]
This last map can be viewed as the unit of an appropriate adjunction.  In any case, $Ex(\cdot)$ determines an endo-functor on the category of simplicial sets.  Let $Ex^n(\cdot)$ denote the $n$-fold iterate.  Then, given a simplicial set $X$, we can consider the tower
\[
X \to Ex(X) \to Ex^2(X) \to Ex^3(X) \to \cdots.
\]
We then define
\[
Ex^{\infty}(X) := \mathrm{colim}_n Ex^n(X)
\]
for the morphisms just defined.  This colimit exists because the category of simplicial sets admits colimits indexed by small diagrams.  
 
!!! Properties
''Theorem'': Suppose $X$ is a simplicial set.  
# The canonical map $X \to Ex^{\infty}(X)$ is a weak equivalence of simplicial sets. 
# The simplicial set $Ex^{\infty}(X)$ is a [[Kan complex]], i.e., a [[fibrant simplicial set|Kan complex]].  
# The functor $Ex^{\infty}$ preserves [[Kan fibrations|Kan fibration]]. 

Along the way to proving this theorem, one proves the following collection of lemmas.
''Lemma'': Suppose $X$ is a simplicial set.    
# The map $\eta: X \to Ex(X)$ is a $\pi_0$-isomorphism and induces a surjection on fundamental groupoids,
# The map $\eta: X \to Ex(X)$ inducs an isomorphism on integral homology.  

''Lemma'': The functor $Ex(\cdot)$ preserves [[Kan fibrations|Kan fibration]].  
/***
|Name:|LessBackupsPlugin|
|Description:|Intelligently limit the number of backup files you create|
|Version:|3.0.1 ($Rev: 2320 $)|
|Date:|$Date: 2007-06-18 22:37:46 +1000 (Mon, 18 Jun 2007) $|
|Source:|http://mptw.tiddlyspot.com/#LessBackupsPlugin|
|Author:|Simon Baird|
|Email:|simon.baird@gmail.com|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Description
You end up with just backup one per year, per month, per weekday, per hour, minute, and second.  So total number won't exceed about 200 or so. Can be reduced by commenting out the seconds/minutes/hours line from modes array
!!Notes
Works in IE and Firefox only.  Algorithm by Daniel Baird. IE specific code by by Saq Imtiaz.
***/
//{{{

var MINS  = 60 * 1000;
var HOURS = 60 * MINS;
var DAYS  = 24 * HOURS;

if (!config.lessBackups) {
	config.lessBackups = {
		// comment out the ones you don't want or set config.lessBackups.modes in your 'tweaks' plugin
		modes: [
			["YYYY",  365*DAYS], // one per year for ever
			["MMM",   31*DAYS],  // one per month
			["ddd",   7*DAYS],   // one per weekday
			//["d0DD",  1*DAYS],   // one per day of month
			["h0hh",  24*HOURS], // one per hour
			["m0mm",  1*HOURS],  // one per minute
			["s0ss",  1*MINS],   // one per second
			["latest",0]         // always keep last version. (leave this).
		]
	};
}

window.getSpecialBackupPath = function(backupPath) {

	var now = new Date();

	var modes = config.lessBackups.modes;

	for (var i=0;i<modes.length;i++) {

		// the filename we will try
		var specialBackupPath = backupPath.replace(/(\.)([0-9]+\.[0-9]+)(\.html)$/,
				'$1'+now.formatString(modes[i][0]).toLowerCase()+'$3')

		// open the file
		try {
			if (config.browser.isIE) {
				var fsobject = new ActiveXObject("Scripting.FileSystemObject")
				var fileExists  = fsobject.FileExists(specialBackupPath);
				if (fileExists) {
					var fileObject = fsobject.GetFile(specialBackupPath);
					var modDate = new Date(fileObject.DateLastModified).valueOf();
				}
			}
			else {
				netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
				var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
				file.initWithPath(specialBackupPath);
				var fileExists = file.exists();
				if (fileExists) {
					var modDate = file.lastModifiedTime;
				}
			}
		}
		catch(e) {
			// give up
			return backupPath;
		}

		// expiry is used to tell if it's an 'old' one. Eg, if the month is June and there is a
		// June file on disk that's more than an month old then it must be stale so overwrite
		// note that "latest" should be always written because the expiration period is zero (see above)
		var expiry = new Date(modDate + modes[i][1]);
		if (!fileExists || now > expiry)
			return specialBackupPath;
	}
}

// hijack the core function
window.getBackupPath_mptw_orig = window.getBackupPath;
window.getBackupPath = function(localPath) {
	return getSpecialBackupPath(getBackupPath_mptw_orig(localPath));
}

//}}}

/***
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Version:''|1.1.0|
|''Date:''|mar 17, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#LoadRemoteFileHijack|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
***/
//{{{
version.extensions.LoadRemoteFileThroughProxy = {
 major: 1, minor: 1, revision: 0, 
 date: new Date("mar 17, 2007"), 
 source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};

if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};

bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
{
 if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){ 
 url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
 }
 return bidix.core.loadRemoteFile(url,callback,params);
}
//}}}
<<tiddler TspotControls>>
MPTW is a distribution or edition of TiddlyWiki that includes a standard TiddlyWiki core packaged with some plugins designed to improve usability and provide a better way to organise your information. For more information see http://mptw.tiddlyspot.com/.
[[Login]] [[ImportTiddlers]] [[Overview]] [[Outline|Outlines of the theory]] [[Concepts]] [[Bibliography]] [[Questions/Requests]] [[Navigation/Help]] [[Disclaimer]]
''Proposition'': Suppose $X$ is a smooth scheme and $X = U \cup V$ is an open cover of $X$.  There is a long exact sequence in ${\mathbb A}^1$[[-homology|A¹-homology]] groups of the form
\[
\cdots \rightarrow H_i^{{\mathbb A}^1}(U \cup V) \to H_i^{{\mathbb A}^1}(U) \oplus H_i^{{\mathbb A}^1}(V) \to H_i^{{\mathbb A}^1}(X) \to H_{i-1}^{{\mathbb A}^1}(U \cup V) \rightarrow \cdots
\]
!!! Setup
Suppose $k$ is a field, and let $W(k)$ denote the [[Witt ring]] of quadratic forms over $k$.  Let $I \subset W(k)$ denote the ideal of even-dimensional forms (also called the [[fundamental ideal|Fundamental ideal in the Witt ring]]).  Consider the filtration of $W(k)$ by powers of $I$, and let $Gr_I^*(W(k))$ denote the graded ring associated with this filtration.

Sending $a \in k^*/(k^*)^2\;$ to the [[quadratic form|Quadratic form]] $\langle 1,-a \rangle$ determines a function $K^{M}_1(k)/2 = k^*/(k^*)^2 \to I$.  Since $\langle 1,-a \rangle + \langle 1,-b \rangle - \langle 1, -ab \rangle \in I^2$, the function above is a group homomorphism
\[
\varphi_1: K^{M}_1(k)/2 \to I/I^2;
\]
one may check that this group homomorphism is an isomorphism.  

The cup product of $a$ and $1-a$ corresponding to the Steinberg relation gets sent to the [[Pfister form]] $\langle \langle a, 1-a \rangle \rangle$, which is hyperbolic.  Thus, the map $\varphi_1$ of the previous paragraph extends to a homomorphism of graded rings
\[
\varphi: K^{M}_*(k)/2 \to Gr_I^{*}(W(k)).  
\]
Since $Gr_I^{*}(W(k))$ is generated by the first degree component, $\varphi$ is a surjective ring homomorphism.  

!!! Statement
__''Conjecture''__ (Milnor): The homomorphism 
\[
\varphi: K^{M}_*(k)/2 \to Gr_I^{*}(W(k))
\]
is an isomorphism of rings, i.e., $\varphi$ is injective. 

!!! Remarks
* J. Milnor established the conjecture in degree $2$. 
* M. Rost and A. Merkurjev-$$A. Suslin established the conjecture in degree $3$.
* M. Rost established the conjecture in degree $4$. 
* R. Elman and T.Y. Lam proved that $\varphi$ is injective on so-called pure symbols.
* D. Orlov, A. Vishik and V. Voevodsky established the conjecture in complete generality for fields $k$ having characteristic $0$ by utilizing Voevodsky's proof of the [[Milnor's conjecture on the mod 2 norm-residue homomorphism|Bloch-Kato conjecture]]. 
!!! Definition
Suppose $F$ is a field.  The __[[Milnor-Witt K-theory]]__ $K^{MW}_{\bullet}(F)$ is the graded, associative ring generated by symbols $[u]$ (of degree $+1$) for each non-zero element $u$ of $F$, and a symbol $\eta$ (of degree $-1$) subject to the following relations:
# (Steinberg relation) For each $a \in F^* - \{ 1 \}$, $[a]\cdot[1-a] = 0$.
# For each pair $(a,b) \in F^* \times F^*$, one has $[ab] = [a] + [b] + \eta \cdot [a]\cdot[b]$.
# For each $a \in F^*$, one has $\eta\cdot[a] = [a]\cdot\eta$.
# Finally, if we set $h = \eta \cdot [-1] + 2$, then $\eta \cdot h = 0$.   

The graded piece $K^{MW}_n(F)$ will be called the __$n$-th [[Milnor-Witt K-theory]] group of $F$__.  The group $K^{MW}_n(F)$ admits a presentation as the quotient of the abelian group generated by symbols of the form $[\eta^m,a_1,\ldots,a_r]$, where $(m,r)$ is a pair of natural numbers such that $n = r-m$, and $a_i$ are units, by the ideal generated by the following relations. 
# (Steinberg relation) If $i$ is an integer $\leq r-1$ and $a_i + a_{i+1} = 1$, then $[\eta^m,a_1,\ldots,a_r] = 0$
# For each pair $(a,b) \in F^* \times F^*$, and each natural number $i$\[
[\eta^m,a_1,\ldots,a_{i-1},ab,a_{i+1},\ldots,a_r] = [\eta^m,a_1,\ldots,a_{i-1},a,a_{i+1},\ldots,a_r] + [\eta^m,a_1,\ldots,a_{i-1},b,a_{i+1},\ldots,a_r] + [\eta^{m+1},a_1,\ldots,a_{i-1},a,b,a_{i+1},\ldots,a_r]
\]

# For each natural number $i$ \[[\eta^{m+2},a_1,\ldots,a_{i-1},-1,a_{i},\ldots,a_r] + 2[\eta^{m+1},a_1,\ldots,a_{i-1},a_{i},\ldots,a_r] = 0\]

//Notation.// For any $a \in F^*$, Morel also sets $\langle a \rangle := 1 + \eta \cdot [a]$.  In this notation $h = 1 + \langle -1 \rangle$.  

Below, we will recall the definition of residue homomorphisms for [[Milnor-Witt K-theory]] groups and construct the [[Milnor-Witt K-theory]] sheaves.  

!!! Properties
* The quotient ring $K^{MW}_\bullet(F)/(\eta)$ is, by construction, the [[Milnor K-theory]] of $F$.
* The quotient ring $K^{MW}_\bullet(F)/(h)$ is the [[Witt K-theory]] of $F$
* If the characteristic of $F$ is not $2$, then $K^{MW}_0(F)$ can be identified with the [[Grothendieck-Witt ring]] $GW(k)$ of isomorphism classes of quadratic forms over $F$.
!!! Basic information
|{{{Morel, F., and Voevodsky, V.}}}|>|
|{{{A¹-homotopy theory of schemes}}}|>|
|{{{ Inst. Hautes Études Sci. Publ. Math.}}}, {{{ No. 90}}}, ({{{1999}}}),  {{{45--143}}}|>|
|MathSciNet: [[MathSciNetID|http://www.ams.org/mathscinet-getitem?mr=MR1813224]]|>|
|[[Paper at NUMDAM|http://www.numdam.org/numdam-bin/recherche?h=nc&id=PMIHES_1999__90__45_0&format=complete]]|>|

!!! BibTeX
{{{
@article {MR1813224,
    AUTHOR = {Morel, Fabien and Voevodsky, Vladimir},
     TITLE = {{${\bf A}\sp 1$}-homotopy theory of schemes},
   JOURNAL = {Inst. Hautes \'Etudes Sci. Publ. Math.},
  FJOURNAL = {Institut des Hautes \'Etudes Scientifiques. Publications
              Math\'ematiques},
    NUMBER = {90},
      YEAR = {1999},
     PAGES = {45--143 (2001)},
      ISSN = {0073-8301},
     CODEN = {PMIHA6},
   MRCLASS = {14F35 (19E08)},
  MRNUMBER = {MR1813224 (2002f:14029)},
MRREVIEWER = {Marc Levine},
}
}}}

!!! Definition
Suppose $S$ is a Noetherian scheme of finite Krull dimension.  Consider the category ${\mathcal Sm}_S$ equipped with the Nisnevich topology.  We write ${\mathcal Shv}_{Nis}({\mathcal Sm}_S)$ for the category of Nisnevich sheaves of sets on this site.  A __motivic space__, or just a __space__ is an object in ${\mathcal Shv}_{Nis}({\mathcal Sm}_S)$.  A __simplicial motivic space__, or sometimes just __simplicial space__, is a simplicial object in the category of motivic spaces, i.e., an object of: $\Delta^{\circ}{\mathcal Shv}_{Nis}({\mathcal Sm}_S)$.  Sometimes one just writes ${\mathcal Spc}_S$ for the category of motivic spaces, and $\Delta^{\circ}{\mathcal Spc}_S$ for the category of simplicial motivic spaces.  Various other conventions exist in the literature.  

The category ${\mathcal Spc}_S$ has the space corresponding to $S$ as a final object.  If $S$ is clear from context, sometimes one writes $pt$ or $\ast$ for the final object.  A __pointed space__ is a pair $({\mathcal X},x)$ consisting of a space ${\mathcal X}$ together with a morphism $x: \ast \to {\mathcal X}$.  Pointed simplicial spaces are defined in a similar manner.  A morphism of pointed spaces $f: ({\mathcal X},x) \to ({\mathcal X},x')$ is a morphism of spaces $f: {\mathcal X} \to {\mathcal X}'$ such that the composite map $xf: \ast \to {\mathcal X} \to {\mathcal X}'$ coincides with $x'$.  We write ${\mathcal Spc}_{S,\bullet}$ for the category of pointed spaces and $\Delta^{\circ}{\mathcal Spc}_{S,\bullet}$ for the category of pointed simplicial spaces.  

A __group space__ is a group object in the category of spaces.  We write ${\mathcal Gr}_S$ for the category group spaces.  Similarly, we write ${\mathcal Ab}_S$ for the category of __abelian group spaces__.  Likewise $\Delta^{\circ}{\mathcal Gr}_S$ will denote the category of __simplicial group spaces__ and $\Delta^{\circ}{{\mathcal Ab}_S}$ for the category of __simplicial abelian groups__.  The latter is the source category for the sheaf-theoretic [[Dold-Kan correspondence]].   

!!! Properties
* Both the category of motivic spaces and simplicial motivic spaces have all small limits and colimits.  The same is true for the category of pointed spaces.   
* Given a smooth $S$-scheme $X$, the corresponding representable functor $Hom_{{\mathcal Sm}_S}(\cdot,X)$ is a Nisnevich sheaf (i.e., the Nisnevich topology is sub-canonical).  Thus, every smooth scheme $X$ determines a corresponding motivic space, which by abuse of notation is also denoted by $X$.  In fact, the Yoneda lemma then shows that the induced functor ${\mathcal Sm}_S \to {\mathcal Spc}_S$ is fully faithful.  
* There is a functor ${\mathcal Spc}_S \to \Delta^{\circ}{\mathcal Spc}_S$ sending a space to the corresponding constant simplicial space.  This functor is fully faithful.  

!!! Complements
Suppose ${\mathcal Sch}_S$ denotes the category whose objects are all (separated and finite type) $S$-schemes.  Sending such a scheme $X$ to the functor $Hom_{{\mathcal Sm}_S}(\cdot,X)$ determines a functor ${\mathcal Sch}_S \to {\mathcal Spc}_S$.  This functor is not fully-faithful. 
!!! Definitions
There are two ``circles" in [[A¹-homotopy theory|Unstable A¹-homotopy theory]].  The simplicial circle $S^1_s$ is the [[space|Motivic space]] ${\mathbb A}^1/ \{ 0,1 \}$ pointed by the image of $\{ 0,1 \}$ in the quotient; this space also has a description is an affine nodal cubic curve.  The simplicial n-sphere, denoted $S^n_s$, is the space obtained by taking the [[smash product|Smash product]] of $n$ copies of the simplicial circle.  The Tate circle is the sheaf associated with the multiplicative group ${\mathbb G}_m$ pointed by the identity element.  A general __motivic sphere__ is obtained by taking smash products of simplicial spheres and motivic spheres.  Various indexing conventions exist in the literature, though we write $S^{i,j}$ for the space obtained by forming the smash product of the simplicial $i$-sphere and $j$ copies of the Tate circle.  

!!! Geometric models
The spheres $S^{m,m}$ and $S^{m-1,m}$ are ${\mathbb A}^1$[[-weakly equivalent|A¹-weak equivalence]] to smooth affine schemes over $\mathrm{Spec} {\mathbb Z}$.  This is clear for $S^0_s$ and ${\mathbb G}_m$.

Choose coordinates $x_1,\ldots,x_{2m}$ on ${\mathbb A}^{2m}$. Take the smooth affine quadric hypersurfaces $Q_{2m-1} \subset {\mathbb A}^{2m}$ defined by the equation
\[
x_1 x_{m+1} + \ldots + x_{m}x_{2m} = 1.
\]

''Theorem:'' For any integer $m > 0$, the quadric $Q_{2m-1}$ is ${\mathbb A}^1$-weakly equivalent to $S^{m-1,m}$.

//Proof.// The projection onto $x_1,\ldots,x_m$ defines a morphism $Q_{2m} \to {\mathbb A}^m \setminus 0$ that one can check is Zariski locally trivial with fibers isomorphic to ${\mathbb A}^{m-1}$ (and in particular an ${\mathbb A}^1$[[-weak equivalence|A¹-weak equivalence]]).  To see that ${\mathbb A}^m \setminus 0$ has the required homotopy type, we use an induction argument.  

Cover ${\mathbb A}^m \setminus 0$ by the two Zariski open sets ${\mathbb A}^{m-1}\setminus 0 \times {\mathbb A}^1$ and ${\mathbb A}^m \times {\mathbb G}_m$.  Since the intersection of these two open sets is ${\mathbb A}^{m-1}\setminus 0 \times {\mathbb G}_m$, this presentation realizes ${\mathbb A}^m \setminus 0$ as the push-out of the diagram
\[
(1) \;\;\;\;\;\;\; {\mathbb A}^{m-1}\setminus 0 \times {\mathbb A}^1 \leftarrow {\mathbb A}^{m-1}\setminus 0 \times {\mathbb G}_m \rightarrow {\mathbb A}^m \times {\mathbb G}_m.
\]
There is the canonical map from the homotopy colimit of any diagram $D$ to the colimit of $D$.  If we compute the homotopy colimit of the diagram in (1) in the ${\mathbb A}^1$-homotopy category, we can shrink all copies of ${\mathbb A}^k$ to a point.  Thus, the homotopy colimit of the diagram just written is the homotopy colimit of 
\[
(2) \;\;\;\;\;\;\; {\mathbb A}^{m-1}\setminus 0 \leftarrow {\mathbb A}^{m-1}\setminus 0 \times {\mathbb G}_m \rightarrow {\mathbb G}_m.
\]
In the situation of (1), i.e., either the map to the left or the right is a cofibration, the canonical map from the homotopy colimit to the colimit is an ${\mathbb A}^1$[[-weak equivalence|A¹-weak equivalence]].  Now, we claim that the homotopy colimit of (2) is $S^{m-1,m}$.  To see this, we observe that the homotopy colimit in question is, by definition, the [[join|Join]] ${\mathbb A}^{m-1}\setminus 0 * {\mathbb G}_m$of ${\mathbb A}^{m-1}\setminus 0$ and ${\mathbb G}_m$.  An elementary result about the [[join|Join]] shows that it has the homotopy type of $S^1_s \wedge {\mathbb A}^{m} \setminus 0 \wedge {\mathbb G}_m$.  The result then follows immediately by induction on the dimension.      

Consider the hypersurface $Q_{2m}$ in ${\mathbb A}^{2m+1}$, with coordinates $x_1,\ldots,x_{2m+1}$ defined by the equation
\[
x_1x_{m+1} + \ldots + x{m}x_{2m} = x_{2m+1}(1+x_{2m+1}).
\]

''Theorem'' (Asok, Doran):  For any integer $m \geq 0$, the smooth affine scheme $Q_{2m}$ is ${\mathbb A}^1$-weakly equivalent to $S^{m,m}$.  

//Proof.// The hypersurface $Q_2$, defined by the equation $x_1x_2 = x_3(x_3+1)$, can be realized as the total space of a Zariski locally trivial ${\mathbb A}^1$-bundle over ${\mathbb P}^1$.  Indeed, an explicit invariant computation shows that the above hypersurfaces describes the quotient $SL_2/{\mathbb G}_m$.  Thus, the induced map is the map $SL_2/{\mathbb G}_m \to SL_2/B = {\mathbb P}^1$, where $B$ is the subgroup of upper-triangular matrices in $SL_2$. 

Consider the open cover of ${\mathbb P}^1$ by two open sets isomorphic to ${\mathbb A}^1$ with intersection ${\mathbb G}_m$.  The homotopy colimit of the diagram
\[
{\mathbb A}^1 \leftarrow {\mathbb G}_m \rightarrow {\mathbb A}^1
\]
computed in the ${\mathbb A}^1$-homotopy category is the same as the colimit of the diagram
\[
\ast \leftarrow {\mathbb G}_m \rightarrow C({\mathbb G}_m),
\]
where $C({\mathbb G}_m)$ is the [[cone|Cone]] on ${\mathbb G}_m$.  The colimit of this last diagram is exactly $\Sigma^1_s {\mathbb G}_m$.  The canonical map from the homotopy colimit to the colimit defines a map
\[
\Sigma^1_s {\mathbb G}_m \to {\mathbb P}^1,
\]
which by the same argument as in the previous theorem is an ${\mathbb A}^1$-weak equivalence.  

The general case is similar, but significantly more involved.  One covers $Q_{2m}$ by two ${\mathbb A}^1$[[-contractible|A¹-contractible]] open sets (that are quasi-affine yet not affine!) whose intersection can be shown to be ${\mathbb A}^1$-weakly equivalent to ${\mathbb A}^m \setminus 0$.  The argument just explained shows that the induced map $\Sigma^1_s {\mathbb A}^m \setminus 0 \to Q_{2m}$ is an ${\mathbb A}^1$-weak equivalence.  
Name: MptwBlack
Background: #000
Foreground: #fff
PrimaryPale: #333
PrimaryLight: #555
PrimaryMid: #888
PrimaryDark: #aaa
SecondaryPale: #111
SecondaryLight: #222
SecondaryMid: #555
SecondaryDark: #888
TertiaryPale: #222
TertiaryLight: #666
TertiaryMid: #888
TertiaryDark: #aaa
Error: #300

This is in progress. Help appreciated.


Name: MptwBlue
Background: #fff
Foreground: #000
PrimaryPale: #cdf
PrimaryLight: #57c
PrimaryMid: #114
PrimaryDark: #012
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

/***
|Name:|MptwConfigPlugin|
|Description:|Miscellaneous tweaks used by MPTW|
|Version:|1.0 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#MptwConfigPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#MptwConfigPlugin|
!!Note: instead of editing this you should put overrides in MptwUserConfigPlugin
***/
//{{{
var originalReadOnly = readOnly;
var originalShowBackstage = showBackstage;

config.options.chkHttpReadOnly = false; 		// means web visitors can experiment with your site by clicking edit
readOnly = false;								// needed because the above doesn't work any more post 2.1 (??)
showBackstage = true;							// show backstage for same reason

config.options.chkInsertTabs = true;    		// tab inserts a tab when editing a tiddler
config.views.wikified.defaultText = "";			// don't need message when a tiddler doesn't exist
config.views.editor.defaultText = "";			// don't need message when creating a new tiddler 

config.options.chkSaveBackups = true;			// do save backups
config.options.txtBackupFolder = 'twbackup';	// put backups in a backups folder

config.options.chkAutoSave = (window.location.protocol == "file:"); // do autosave if we're in local file

config.mptwVersion = "2.5.2";

config.macros.mptwVersion={handler:function(place){wikify(config.mptwVersion,place);}};

if (config.options.txtTheme == '')
	config.options.txtTheme = 'MptwTheme';

// add to default GettingStarted
config.shadowTiddlers.GettingStarted += "\n\nSee also [[MPTW]].";

// add select theme and palette controls in default OptionsPanel
config.shadowTiddlers.OptionsPanel = config.shadowTiddlers.OptionsPanel.replace(/(\n\-\-\-\-\nAlso see AdvancedOptions)/, "{{select{<<selectTheme>>\n<<selectPalette>>}}}$1");

// these are used by ViewTemplate
config.mptwDateFormat = 'DD/MM/YY';
config.mptwJournalFormat = 'Journal DD/MM/YY';

//}}}
Name: MptwGreen
Background: #fff
Foreground: #000
PrimaryPale: #9b9
PrimaryLight: #385
PrimaryMid: #031
PrimaryDark: #020
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

Name: MptwRed
Background: #fff
Foreground: #000
PrimaryPale: #eaa
PrimaryLight: #c55
PrimaryMid: #711
PrimaryDark: #500
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

|Name|MptwRounded|
|Description|Mptw Theme with some rounded corners (Firefox only)|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
|PageTemplate|MptwTheme##PageTemplate|
|StyleSheet|##StyleSheet|

!StyleSheet
/*{{{*/

[[MptwTheme##StyleSheet]]

.tiddler,
.sliderPanel,
.button,
.tiddlyLink,
.tabContents
{ -moz-border-radius: 1em; }

.tab {
	-moz-border-radius-topleft: 0.5em;
	-moz-border-radius-topright: 0.5em;
}
#topMenu {
	-moz-border-radius-bottomleft: 2em;
	-moz-border-radius-bottomright: 2em;
}

/*}}}*/

Name: MptwSmoke
Background: #fff
Foreground: #000
PrimaryPale: #aaa
PrimaryLight: #777
PrimaryMid: #111
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

|Name|MptwStandard|
|Description|Mptw Theme with the default TiddlyWiki PageLayout and Styles|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
Name: MptwTeal
Background: #fff
Foreground: #000
PrimaryPale: #B5D1DF
PrimaryLight: #618FA9
PrimaryMid: #1a3844
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #f8f8f8
TertiaryLight: #bbb
TertiaryMid: #999
TertiaryDark: #888
Error: #f88
|Name|MptwTheme|
|Description|Mptw Theme including custom PageLayout|
|PageTemplate|##PageTemplate|
|ViewTemplate|##ViewTemplate|
|EditTemplate|##EditTemplate|
|StyleSheet|##StyleSheet|

http://mptw.tiddlyspot.com/#MptwTheme ($Rev: 1829 $)

!PageTemplate
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
	<div class='headerShadow'>
		<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
		<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
	</div>
	<div class='headerForeground'>
		<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
		<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
	</div>
</div>
<!-- horizontal MainMenu -->
<div id='topMenu' refresh='content' tiddler='MainMenu'></div>
<!-- original MainMenu menu -->
<!-- <div id='mainMenu' refresh='content' tiddler='MainMenu'></div> -->
<div id='sidebar'>
	<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
	<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
	<div id='messageArea'></div>
	<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->

!ViewTemplate
<!--{{{-->
[[MptwTheme##ViewTemplateToolbar]]

<div class="tagglyTagged" macro="tags"></div>

<div class='titleContainer'>
	<span class='title' macro='view title'></span>
	<span macro="miniTag"></span>
</div>

<div class='subtitle'>
	(updated <span macro='view modified date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>
	by <span macro='view modifier link'></span>)
	<!--
	(<span macro='message views.wikified.createdPrompt'></span>
	<span macro='view created date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>)
	-->
</div>

<div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">
	<div class='viewer'><pre macro='view text'></pre></div>
</div>
<div macro="else">
	<div class='viewer' macro='view text wikified'></div>
</div>

<div class="tagglyTagging" macro="tagglyTagging"></div>

<!--}}}-->

!ViewTemplateToolbar
<!--{{{-->
<div class='toolbar'>
	<span macro="showWhenTagged systemConfig">
		<span macro="toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'"></span>
	</span>
	<span macro="showWhenTagged systemTheme"><span macro="applyTheme"></span></span>
	<span macro="showWhenTagged systemPalette"><span macro="applyPalette"></span></span>
	<span macro="showWhen tiddler.tags.contains('css') || tiddler.title == 'StyleSheet'"><span macro="refreshAll"></span></span>
	<span style="padding:1em;"></span>
	<span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler > fields syncing permalink references jump'></span> <span macro='newHere label:"new here"'></span>
	<span macro='newJournalHere {{config.mptwJournalFormat?config.mptwJournalFormat:"MM/0DD/YY"}}'></span>
</div>
<!--}}}-->

!EditTemplate
<!--{{{-->
<div class="toolbar" macro="toolbar +saveTiddler saveCloseTiddler closeOthers -cancelTiddler cancelCloseTiddler deleteTiddler"></div>
<div class="title" macro="view title"></div>
<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>
<div macro='annotations'></div>
<div class="editLabel">Content</div><div class="editor" macro="edit text"></div>
<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>
<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>
<!--}}}-->

!StyleSheet
/*{{{*/

/* a contrasting background so I can see where one tiddler ends and the other begins */
body {
	background: [[ColorPalette::TertiaryLight]];
}

/* sexy colours and font for the header */
.headerForeground {
	color: [[ColorPalette::PrimaryPale]];
}
.headerShadow, .headerShadow a {
	color: [[ColorPalette::PrimaryMid]];
}

/* separate the top menu parts */
.headerForeground, .headerShadow {
	padding: 1em 1em 0;
}

.headerForeground, .headerShadow {
	font-family: 'Trebuchet MS' sans-serif;
	font-weight:bold;
}
.headerForeground .siteSubtitle {
	color: [[ColorPalette::PrimaryLight]];
}
.headerShadow .siteSubtitle {
	color: [[ColorPalette::PrimaryMid]];
}

/* make shadow go and down right instead of up and left */
.headerShadow {
	left: 1px;
	top: 1px;
}

/* prefer monospace for editing */
.editor textarea, .editor input {
	font-family: 'Consolas' monospace;
	background-color:[[ColorPalette::TertiaryPale]];
}


/* sexy tiddler titles */
.title {
	font-size: 250%;
	color: [[ColorPalette::PrimaryLight]];
	font-family: 'Trebuchet MS' sans-serif;
}

/* more subtle tiddler subtitle */
.subtitle {
	padding:0px;
	margin:0px;
	padding-left:1em;
	font-size: 90%;
	color: [[ColorPalette::TertiaryMid]];
}
.subtitle .tiddlyLink {
	color: [[ColorPalette::TertiaryMid]];
}

/* a little bit of extra whitespace */
.viewer {
	padding-bottom:3px;
}

/* don't want any background color for headings */
h1,h2,h3,h4,h5,h6 {
	background-color: transparent;
	color: [[ColorPalette::Foreground]];
}

/* give tiddlers 3d style border and explicit background */
.tiddler {
	background: [[ColorPalette::Background]];
	border-right: 2px [[ColorPalette::TertiaryMid]] solid;
	border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;
	margin-bottom: 1em;
	padding:1em 2em 2em 1.5em;
}

/* make options slider look nicer */
#sidebarOptions .sliderPanel {
	border:solid 1px [[ColorPalette::PrimaryLight]];
}

/* the borders look wrong with the body background */
#sidebar .button {
	border-style: none;
}

/* this means you can put line breaks in SidebarOptions for readability */
#sidebarOptions br {
	display:none;
}
/* undo the above in OptionsPanel */
#sidebarOptions .sliderPanel br {
	display:inline;
}

/* horizontal main menu stuff */
#displayArea {
	margin: 1em 15.7em 0em 1em; /* use the freed up space */
}
#topMenu br {
	display: none;
}
#topMenu {
	background: [[ColorPalette::PrimaryMid]];
	color:[[ColorPalette::PrimaryPale]];
}
#topMenu {
	padding:2px;
}
#topMenu .button, #topMenu .tiddlyLink, #topMenu a {
	margin-left: 0.5em;
	margin-right: 0.5em;
	padding-left: 3px;
	padding-right: 3px;
	color: [[ColorPalette::PrimaryPale]];
	font-size: 100%;
}
#topMenu .button:hover, #topMenu .tiddlyLink:hover {
	background: [[ColorPalette::PrimaryDark]];
}

/* make 2.2 act like 2.1 with the invisible buttons */
.toolbar {
	visibility:hidden;
}
.selected .toolbar {
	visibility:visible;
}

/* experimental. this is a little borked in IE7 with the button 
 * borders but worth it I think for the extra screen realestate */
.toolbar { float:right; }

/* fix for TaggerPlugin. from sb56637. improved by FND */
.popup li .tagger a {
   display:inline;
}

/* makes theme selector look a little better */
#sidebarOptions .sliderPanel .select .button {
  padding:0.5em;
  display:block;
}
#sidebarOptions .sliderPanel .select br {
	display:none;
}

/* make it print a little cleaner */
@media print {
	#topMenu {
		display: none ! important;
	}
	/* not sure if we need all the importants */
	.tiddler {
		border-style: none ! important;
		margin:0px ! important;
		padding:0px ! important;
		padding-bottom:2em ! important;
	}
	.tagglyTagging .button, .tagglyTagging .hidebutton {
		display: none ! important;
	}
	.headerShadow {
		visibility: hidden ! important;
	}
	.tagglyTagged .quickopentag, .tagged .quickopentag {
		border-style: none ! important;
	}
	.quickopentag a.button, .miniTag {
		display: none ! important;
	}
}

/* get user styles specified in StyleSheet */
[[StyleSheet]]

/*}}}*/

|Name|MptwTrim|
|Description|Mptw Theme with a reduced header to increase useful space|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
|StyleSheet|MptwTheme##StyleSheet|
|PageTemplate|##PageTemplate|

!PageTemplate
<!--{{{-->

<!-- horizontal MainMenu -->
<div id='topMenu' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<span refresh='content' tiddler='SiteTitle' style="padding-left:1em;font-weight:bold;"></span>:
<span refresh='content' tiddler='MainMenu'></span>
</div>
<div id='sidebar'>
	<div id='sidebarOptions'>
		<div refresh='content' tiddler='SideBarOptions'></div>
		<div style="margin-left:0.1em;"
			macro='slider chkTabSliderPanel SideBarTabs {{"tabs \u00bb"}} "Show Timeline, All, Tags, etc"'></div>
	</div>
</div>
<div id='displayArea'>
	<div id='messageArea'></div>
	<div id='tiddlerDisplay'></div>
</div>

For upgrading. See [[ImportTiddlers]].
URL: http://mptw.tiddlyspot.com/upgrade.html
/***
|Description:|A place to put your config tweaks so they aren't overwritten when you upgrade MPTW|
See http://www.tiddlywiki.org/wiki/Configuration_Options for other options you can set. In some cases where there are clashes with other plugins it might help to rename this to zzMptwUserConfigPlugin so it gets executed last.
***/
//{{{

// example: set your preferred date format
//config.mptwDateFormat = 'MM/0DD/YY';
//config.mptwJournalFormat = 'Journal MM/0DD/YY';

// example: set the theme you want to start with
//config.options.txtTheme = 'MptwRoundTheme';

// example: switch off autosave, switch on backups and set a backup folder
//config.options.chkSaveBackups = true;
//config.options.chkAutoSave = false;
//config.options.txtBackupFolder = 'backups';

// uncomment to disable 'new means new' functionality for the new journal macro
//config.newMeansNewForJournalsToo = false;

//}}}
!!! Some hints on navigating a [[Tiddlywiki|http://www.tiddlywiki.com]]:
* Internal links are called [[Wikiwords]] and the target of the link (i.e., the actual text) is called the [[Wikientry]].
** They appear in boldface (e.g., [[Overview]]) 
** Clicking on a topic in the main menu (on the left hand side of the screen) opens it at the top of the screen.
** Clicking on a single Wikiword in the body of the text opens it immediately below the currently open Wikientry.
** Clicking on a Tag gives a pop-up menu of all Wikiwords marked with that tag.  If you click on ``Open All" the resulting Wikientries are opened in sequence below the currently open wikientry.  
* External links, which appear underlined (e.g., [[Tiddlywiki|http://www.tiddlywiki.com]]) are opened in new Tabs
* Below the title bar is a [[history|BreadCrumbsPlugin]] of Wikientries that you've visited (for convenient navigation).  
* Certain pages have additional ''Back'', ''Up,'' and ''Forward'' buttons that close all Wikientries except for the target of the link.  

!!! Some notes on how to work with [[LaTeX|http://www.latex-project.org/]] in TiddlyWiki
There are two flavors of [[LaTeX|http://www.latex-project.org/]] support that have been implemented in this Tiddlywiki.  First, and most simply, the [[jsMath plugin|http://bob.mcelrath.org/tiddlyjsmath-2.0.3.html]] (see [[here|Plugin: jsMath]] for the actual plugin) developed by [[Bob McElrath|http://bob.mcelrath.org/]] is used.  Some fonts aren't rendered properly using this method.  

Second, [[LaTeX|http://www.latex-project.org/]] can be imported into Tiddlywiki using the [[LaTeXRender|http://forum.yourequations.com/]] plugin (which is the same technology used in wordpress).  Here is a sample of the syntax.   
{{{
<html> $ $ your_latex $ $ </html>
}}}
though you'll have to remove the spaces.  For more details about functionality (e.g., changing font size, etc.) go to the [[LaTeXRender|http://forum.yourequations.com/]] support pages.  Because of font and functionality issues (arrows are sometimes displayed poorly, certain functions are not implemented), this option is sometimes nicer than the corresponding LaTeX plugin.

!!! Some added functionality
Other plugins used here have been downloded from [[Abego Extensions|http://tiddlywiki.abego-software.de/]].  These include
* [[YourSearchPlugin]], which provides enhanced search capabilities, and
* [[PartTiddlerPlugin]], which provides various features including the ability to link to fragment of an existing tiddler (rather than the whole tiddler).

!!! Tutorials etc.
Here is a [[link|http://www.giffmex.org/twfortherestofus.html]] to another TiddlyWiki tutorial.  
!!! Definition
Suppose ${\mathcal C}$ is a small category.  The [[nerve|Nerve]] of ${\mathcal C}$ is a simplicial set, denoted either $B{\mathcal C}$ or $N({\mathcal C})$ defined as follows.  Let $[n]$ denote the category associated with the ordered set of integers $\{0,\ldots,n\}$, i.e., objects of $[n]$ are elements of this set and there is one non-identity morphism $i \to j$ when $i \leq j$.  We then set
\[
N({\mathcal C})_k := Fun([k],{\mathcal C}),
\]  
where $Fun([k],{\mathcal C})$ denotes the //set// of functors from $[k]$ to ${\mathcal C}$.  The functors $[i] \to [j]$ induce the face and degeneracy maps on $N({\mathcal C})$.  The simplicial set $B{\mathcal C}$ is also called the classifying simplicial set of ${\mathcal C}$.  

Roughly speaking, the set $N({\mathcal C})_k$ consists of composable strings of arrows in ${\mathcal C}$ of length $k$.  The face map $d_i$ can be thought of as composition at the $i$th object, i.e., it sends a composable string of the form:
\[
C_0 \to C_1 \cdots \to C_{i-1} \to C_i \to C_{i+1} \to \cdots \to C_k
\]  
to
\[
C_0 \to C_1 \cdots \to C_{i-1} \to C_{i+1} \to \cdots \to C_k.
\]
Similarly, the degeneracy map $s_i$ includes an identity map at $C_i$.  

!!! Properties
Given two small categories ${\mathcal C}$ and ${\mathcal D}$, a functor $F: {\mathcal C} \to {\mathcal D}$ induces a morphism of simplicial sets
\[
N(F): N({\mathcal C}) \to N({\mathcal D}).  
\]

If ${\mathcal G}$ is an internal groupoid in the category of sets, then the classifying simplicial set $B{\mathcal G}$, i.e., $N({\mathcal G})$ is a [[Kan complex]], i.e., a [[fibrant simplicial set]].  
/***
|Name:|NewHerePlugin|
|Description:|Creates the new here and new journal macros|
|Version:|3.0 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#NewHerePlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.macros, {
	newHere: {
		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
		}
	},
	newJournalHere: {
		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			wikify("<<newJournal "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
		}
	}
});

//}}}

/***
|Name:|NewMeansNewPlugin|
|Description:|If 'New Tiddler' already exists then create 'New Tiddler (1)' and so on|
|Version:|1.1.1 ($Rev: 2263 $)|
|Date:|$Date: 2007-06-13 04:22:32 +1000 (Wed, 13 Jun 2007) $|
|Source:|http://mptw.tiddlyspot.com/empty.html#NewMeansNewPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Note: I think this should be in the core
***/
//{{{

// change this or set config.newMeansNewForJournalsToo it in MptwUuserConfigPlugin
if (config.newMeansNewForJournalsToo == undefined) config.newMeansNewForJournalsToo = true;

String.prototype.getNextFreeName = function() {
       var numberRegExp = / \(([0-9]+)\)$/;
       var match = numberRegExp.exec(this);
       if (match) {
               var num = parseInt(match[1]) + 1;
               return this.replace(numberRegExp," ("+num+")");
       }
       else {
               return this + " (1)";
       }
}

config.macros.newTiddler.checkForUnsaved = function(newName) {
	var r = false;
	story.forEachTiddler(function(title,element) {
		if (title == newName)
			r = true;
	});
	return r;
}

config.macros.newTiddler.getName = function(newName) {
       while (store.getTiddler(newName) || config.macros.newTiddler.checkForUnsaved(newName))
               newName = newName.getNextFreeName();
       return newName;
}


config.macros.newTiddler.onClickNewTiddler = function()
{
	var title = this.getAttribute("newTitle");
	if(this.getAttribute("isJournal") == "true") {
		title = new Date().formatString(title.trim());
	}

	// ---- these three lines should be the only difference between this and the core onClickNewTiddler
	if (config.newMeansNewForJournalsToo || this.getAttribute("isJournal") != "true")
		title = config.macros.newTiddler.getName(title);

	var params = this.getAttribute("params");
	var tags = params ? params.split("|") : [];
	var focus = this.getAttribute("newFocus");
	var template = this.getAttribute("newTemplate");
	var customFields = this.getAttribute("customFields");
	if(!customFields && !store.isShadowTiddler(title))
		customFields = String.encodeHashMap(config.defaultCustomFields);
	story.displayTiddler(null,title,template,false,null,null);
	var tiddlerElem = story.getTiddler(title);
	if(customFields)
		story.addCustomFields(tiddlerElem,customFields);
	var text = this.getAttribute("newText");
	if(typeof text == "string")
		story.getTiddlerField(title,"text").value = text.format([title]);
	for(var t=0;t<tags.length;t++)
		story.setTiddlerTag(title,tags[t],+1);
	story.focusTiddler(title,focus);
	return false;
};

//}}}

!!! Definition

Suppose $X$ is a scheme.  A family of morphisms $\{ u_{\alpha}: U_{\alpha} \to X \}\;$ is a __Nisnevich cover__ of $X$ if 
* the morphism $\coprod_{\alpha} U_\alpha \to X \;\;$ is surjective (i.e., the $u_\alpha$ are jointly surjective), 
* each $u_{\alpha}$ is an etale morphism, and
* for every point $x$ of $X$, there is an index $\alpha$ and a point $u$ of $U_{\alpha}$ mapping to $x$ such that the induced map on residue fields $\kappa(x) \to \kappa(u)\;$ is an isomorphism. 
The Nisnevich covers define a pretopology on either the category of schemes over $k$ (i.e., ${\mathcal Sch}_k$) or [[smooth schemes|Smooth scheme]] over $k$: (i.e., ${\mathcal Sm}_k$).  The associated topology is called the __Nisnevich topology__.  Nisnevich referred to this topology as the __completely decomposed__ or cd-topology on schemes.   

!!! Examples
* Since open immersions are etale, all Zariski covers are Nisnevich covers. 
* Let $k$ be a field, and let $a \in k$.  Let $j: U:= {\mathbb A}^1 \setminus a\to {\mathbb A}^1$ and let $p: V := {\mathbb A}^1 \setminus 0 \to {\mathbb A}^1$ be the map obtained by composition of the squaring map $z \mapsto z^2$ from ${\mathbb A}^1 \setminus 0 \to {\mathbb A}^1 \setminus 0$ and the open immersion ${\mathbb A}^1 \setminus 0 \to {\mathbb A}^1$.  If the characteristic of $k$ is not $2$, and $a$ is an element of $(k^*)^2$, then the map $j \coprod p: U \coprod V \to {\mathbb A}^1\;$ is a Nisnevich cover that is not a Zariski cover.  

!!! Properties
* The Nisnevich topology is sub-canonical, i.e., every representable pre-sheaf is a sheaf.  
* Given a scheme $X$, the Nisnevich cohomological dimension of $X$ is the Krull dimension of $X$.  
* The spectrum of a field has no non-trivial Nisnevich cohomology. 
* Every smooth pair $(X,Z)$ is locally equivalent in the Nisnevich topology to a pair of the form ${\mathbb A}^n,{\mathbb A}^m$.

!!! References
Nisnevich studies his eponymous topology in //[[The completely decomposed topology on schemes and associated descent spectral sequences in algebraic K-theory]]//.

The Nisnevich topology was also introduced by Kato and Saito in their study of class field theory for higher dimensional schemes; they referred to the topology as the Henselian topology /* include references*/

The foundational reference for the construction of the ${\mathbb A}^1$[[-homotopy category|A¹-homotopy category]] (and thus //unstable// ${\mathbb A}^1$-homotopy theory) is the paper 
* ${\mathbb A}^1$[[-homotopy theory of schemes|MoVo99]], by F. Morel and V. Voevodsky ([[Paper at NUMDAM|http://www.numdam.org/numdam-bin/recherche?h=nc&id=PMIHES_1999__90__45_0&format=complete]]).
We'll divide our discussion into the following four categories:
* [[Surveys on foundational material]]
* [[Unstable A¹-homotopy theory]]
* [[Stable A¹-homotopy theory]]
* [[A¹-homotopy theory and algebraic geometry]]
* [[History]]
Motivic or ${\mathbb A}^1$-homotopy theory is a homotopy theory for smooth algebraic varieties where the affine line plays the role of the unit interval in ordinary topology. Below are a collection of resources that will, hopefully, help people learn about ${\mathbb A}^1$-homotopy theory.  Besides providing a beautiful, coherent framework for diverse cohomology theories in algebraic geometry (e.g., [[algebraic K-theory|Algebraic K-theory]], Bloch higher Chow groups a.k.a. [[motivic cohomology|Motivic cohomology]]) ${\mathbb A}^1$-homotopy theory has had some spectacular success in providing more detailed understanding of the relationship between arithmetic and geometric properties of algebraic varieties.  For example, ${\mathbb A}^1$-homotopy theory provides the necessary framework and techniques for Voevodsky's celebrated proof of the [[Milnor conjecture|http://en.wikipedia.org/wiki/Milnor_conjecture]], and the proof of its generalization the [[Bloch-Kato conjecture]].
* [[Preliminaries]]
* [[Audio or Video recordings]]
* [[Outlines of the theory]]
* [[Concept list|Concepts]]
* [[Events]]
* [[Contribute]]
* <<slider chkDisclaimer "Disclaimer" "Disclaimer">>
Partial support provided by NSF Award DMS-0900813.
/***
|<html><a name="Top"/></html>''Name:''|PartTiddlerPlugin|
|''Version:''|1.0.9 (2007-07-14)|
|''Source:''|http://tiddlywiki.abego-software.de/#PartTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
|''CoreVersion:''|2.1.3|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
!Table of Content<html><a name="TOC"/></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Description',null, event)">Description, Syntax</a></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Applications',null, event)">Applications</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('LongTiddler',null, event)">Refering to Paragraphs of a Longer Tiddler</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Citation',null, event)">Citation Index</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('TableCells',null, event)">Creating "multi-line" Table Cells</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Tabs',null, event)">Creating Tabs</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Sliders',null, event)">Using Sliders</a></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Revisions',null, event)">Revision History</a></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Code',null, event)">Code</a></html>
!Description<html><a name="Description"/></html>
With the {{{<part aPartName> ... </part>}}} feature you can structure your tiddler text into separate (named) parts. 
Each part can be referenced as a "normal" tiddler, using the "//tiddlerName//''/''//partName//" syntax (e.g. "About/Features").  E.g. you may create links to the parts (e.g. {{{[[Quotes/BAX95]]}}} or {{{[[Hobbies|AboutMe/Hobbies]]}}}), use it in {{{<<tiddler...>>}}} or {{{<<tabs...>>}}} macros etc.


''Syntax:'' 
|>|''<part'' //partName// [''hidden''] ''>'' //any tiddler content// ''</part>''|
|//partName//|The name of the part. You may reference a part tiddler with the combined tiddler name "//nameOfContainerTidder//''/''//partName//. <<br>>If you use a partName containing spaces you need to quote it (e.g. {{{"Major Overview"}}} or {{{[[Shortcut List]]}}}).|
|''hidden''|When defined the content of the part is not displayed in the container tiddler. But when the part is explicitly referenced (e.g. in a {{{<<tiddler...>>}}} macro or in a link) the part's content is displayed.|
|<html><i>any&nbsp;tiddler&nbsp;content</i></html>|<html>The content of the part.<br>A part can have any content that a "normal" tiddler may have, e.g. you may use all the formattings and macros defined.</html>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Applications<html><a name="Applications"/></html>
!!Refering to Paragraphs of a Longer Tiddler<html><a name="LongTiddler"/></html>
Assume you have written a long description in a tiddler and now you want to refer to the content of a certain paragraph in that tiddler (e.g. some definition.) Just wrap the text with a ''part'' block, give it a nice name, create a "pretty link" (like {{{[[Discussion Groups|Introduction/DiscussionGroups]]}}}) and you are done.

Notice this complements the approach to first writing a lot of small tiddlers and combine these tiddlers to one larger tiddler in a second step (e.g. using the {{{<<tiddler...>>}}} macro). Using the ''part'' feature you can first write a "classic" (longer) text that can be read "from top to bottom" and later "reuse" parts of this text for some more "non-linear" reading.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Citation Index<html><a name="Citation"/></html>
Create a tiddler "Citations" that contains your "citations". 
Wrap every citation with a part and a proper name. 

''Example''
{{{
<part BAX98>Baxter, Ira D. et al: //Clone Detection Using Abstract Syntax Trees.// 
in //Proc. ICSM//, 1998.</part>

<part BEL02>Bellon, Stefan: //Vergleich von Techniken zur Erkennung duplizierten Quellcodes.// 
Thesis, Uni Stuttgart, 2002.</part>

<part DUC99>Ducasse, Stéfane et al: //A Language Independent Approach for Detecting Duplicated Code.// 
in //Proc. ICSM//, 1999.</part>
}}}

You may now "cite" them just by using a pretty link like {{{[[Citations/BAX98]]}}} or even more pretty, like this {{{[[BAX98|Citations/BAX98]]}}}.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Creating "multi-line" Table Cells<html><a name="TableCells"/></html>
You may have noticed that it is hard to create table cells with "multi-line" content. E.g. if you want to create a bullet list inside a table cell you cannot just write the bullet list
{{{
* Item 1
* Item 2
* Item 3
}}}
into a table cell (i.e. between the | ... | bars) because every bullet item must start in a new line but all cells of a table row must be in one line.

Using the ''part'' feature this problem can be solved. Just create a hidden part that contains the cells content and use a {{{<<tiddler >>}}} macro to include its content in the table's cell.

''Example''
{{{
|!Subject|!Items|
|subject1|<<tiddler ./Cell1>>|
|subject2|<<tiddler ./Cell2>>|

<part Cell1 hidden>
* Item 1
* Item 2
* Item 3
</part>
...
}}}

Notice that inside the {{{<<tiddler ...>>}}} macro you may refer to the "current tiddler" using the ".".

BTW: The same approach can be used to create bullet lists with items that contain more than one line.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Creating Tabs<html><a name="Tabs"/></html>
The build-in {{{<<tabs ...>>}}} macro requires that you defined an additional tiddler for every tab it displays. When you want to have "nested" tabs you need to define a tiddler for the "main tab" and one for every tab it contains. I.e. the definition of a set of tabs that is visually displayed at one place is distributed across multiple tiddlers.

With the ''part'' feature you can put the complete definition in one tiddler, making it easier to keep an overview and maintain the tab sets.

''Example''
The standard tabs at the sidebar are defined by the following eight tiddlers:
* SideBarTabs
* TabAll
* TabMore
* TabMoreMissing
* TabMoreOrphans
* TabMoreShadowed
* TabTags
* TabTimeline

Instead of these eight tiddlers one could define the following SideBarTabs tiddler that uses the ''part'' feature:
{{{
<<tabs txtMainTab 
    Timeline Timeline SideBarTabs/Timeline 
    All 'All tiddlers' SideBarTabs/All 
    Tags 'All tags' SideBarTabs/Tags 
    More 'More lists' SideBarTabs/More>>
<part Timeline hidden><<timeline>></part>
<part All hidden><<list all>></part>
<part Tags hidden><<allTags>></part>
<part More hidden><<tabs txtMoreTab 
    Missing 'Missing tiddlers' SideBarTabs/Missing 
    Orphans 'Orphaned tiddlers' SideBarTabs/Orphans 
    Shadowed 'Shadowed tiddlers' SideBarTabs/Shadowed>></part>
<part Missing hidden><<list missing>></part>
<part Orphans hidden><<list orphans>></part>
<part Shadowed hidden><<list shadowed>></part>
}}}

Notice that you can easily "overwrite" individual parts in separate tiddlers that have the full name of the part.

E.g. if you don't like the classic timeline tab but only want to see the 100 most recent tiddlers you could create a tiddler "~SideBarTabs/Timeline" with the following content:
{{{
<<forEachTiddler 
		sortBy 'tiddler.modified' descending 
		write '(index < 100) ? "* [["+tiddler.title+"]]\n":""'>>
}}}
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Using Sliders<html><a name="Sliders"/></html>
Very similar to the build-in {{{<<tabs ...>>}}} macro (see above) the {{{<<slider ...>>}}} macro requires that you defined an additional tiddler that holds the content "to be slid". You can avoid creating this extra tiddler by using the ''part'' feature

''Example''
In a tiddler "About" we may use the slider to show some details that are documented in the tiddler's "Details" part.
{{{
...
<<slider chkAboutDetails About/Details details "Click here to see more details">>
<part Details hidden>
To give you a better overview ...
</part>
...
}}}

Notice that putting the content of the slider into the slider's tiddler also has an extra benefit: When you decide you need to edit the content of the slider you can just doubleclick the content, the tiddler opens for editing and you can directly start editing the content (in the part section). In the "old" approach you would doubleclick the tiddler, see that the slider is using tiddler X, have to look for the tiddler X and can finally open it for editing. So using the ''part'' approach results in a much short workflow.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Revision history<html><a name="Revisions"/></html>
* v1.0.9 (2007-07-14)
** Bugfix: Error when using the SideBarTabs example and switching between "More" and "Shadow". Thanks to cmari for reporting the issue.
* v1.0.8 (2007-06-16)
** Speeding up display of tiddlers containing multiple pard definitions. Thanks to Paco Rivière for reporting the issue.
** Support "./partName" syntax inside <<tabs ...>> macro
* v1.0.7 (2007-03-07)
** Bugfix: <<tiddler "./partName">> does not always render correctly after a refresh (e.g. like it happens when using the "Include" plugin). Thanks to Morris Gray for reporting the bug.
* v1.0.6 (2006-11-07)
** Bugfix: cannot edit tiddler when UploadPlugin by Bidix is installed. Thanks to José Luis González Castro for reporting the bug.
* v1.0.5 (2006-03-02)
** Bugfix: Example with multi-line table cells does not work in IE6. Thanks to Paulo Soares for reporting the bug.
* v1.0.4 (2006-02-28)
** Bugfix: Shadow tiddlers cannot be edited (in TW 2.0.6). Thanks to Torsten Vanek for reporting the bug.
* v1.0.3 (2006-02-26)
** Adapt code to newly introduced Tiddler.prototype.isReadOnly() function (in TW 2.0.6). Thanks to Paulo Soares for reporting the problem.
* v1.0.2 (2006-02-05)
** Also allow other macros than the "tiddler" macro use the "." in the part reference (to refer to "this" tiddler)
* v1.0.1 (2006-01-27)
** Added Table of Content for plugin documentation. Thanks to RichCarrillo for suggesting.
** Bugfix: newReminder plugin does not work when PartTiddler is installed. Thanks to PauloSoares for reporting.
* v1.0.0 (2006-01-25)
** initial version
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Code<html><a name="Code"/></html>
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>
***/
//{{{
//============================================================================
//                           PartTiddlerPlugin

// Ensure that the PartTiddler Plugin is only installed once.
//
if (!version.extensions.PartTiddlerPlugin) {



version.extensions.PartTiddlerPlugin = {
    major: 1, minor: 0, revision: 9,
    date: new Date(2007, 6, 14), 
    type: 'plugin',
    source: "http://tiddlywiki.abego-software.de/#PartTiddlerPlugin"
};

if (!window.abego) window.abego = {};
if (version.major < 2) alertAndThrow("PartTiddlerPlugin requires TiddlyWiki 2.0 or newer.");

//============================================================================
// Common Helpers

// Looks for the next newline, starting at the index-th char of text. 
//
// If there are only whitespaces between index and the newline 
// the index behind the newline is returned, 
// otherwise (or when no newline is found) index is returned.
//
var skipEmptyEndOfLine = function(text, index) {
	var re = /(\n|[^\s])/g;
	re.lastIndex = index;
	var result = re.exec(text);
	return (result && text.charAt(result.index) == '\n') 
			? result.index+1
			: index;
}


//============================================================================
// Constants

var partEndOrStartTagRE = /(<\/part>)|(<part(?:\s+)((?:[^>])+)>)/mg;
var partEndTagREString = "<\\/part>";
var partEndTagString = "</part>";

//============================================================================
// Plugin Specific Helpers

// Parse the parameters inside a <part ...> tag and return the result.
//
// @return [may be null] {partName: ..., isHidden: ...}
//
var parseStartTagParams = function(paramText) {
	var params = paramText.readMacroParams();
	if (params.length == 0 || params[0].length == 0) return null;
	
	var name = params[0];
	var paramsIndex = 1;
	var hidden = false;
	if (paramsIndex < params.length) {
		hidden = params[paramsIndex] == "hidden";
		paramsIndex++;
	}
	
	return {
		partName: name, 
		isHidden: hidden
	};
}

// Returns the match to the next (end or start) part tag in the text, 
// starting the search at startIndex.
// 
// When no such tag is found null is returned, otherwise a "Match" is returned:
// [0]: full match
// [1]: matched "end" tag (or null when no end tag match)
// [2]: matched "start" tag (or null when no start tag match)
// [3]: content of start tag (or null if no start tag match)
//
var findNextPartEndOrStartTagMatch = function(text, startIndex) {
	var re = new RegExp(partEndOrStartTagRE);
	re.lastIndex = startIndex;
	var match = re.exec(text);
	return match;
}

//============================================================================
// Formatter

// Process the <part ...> ... </part> starting at (w.source, w.matchStart) for formatting.
//
// @return true if a complete part section (including the end tag) could be processed, false otherwise.
//
var handlePartSection = function(w) {
	var tagMatch = findNextPartEndOrStartTagMatch(w.source, w.matchStart);
	if (!tagMatch) return false;
	if (tagMatch.index != w.matchStart || !tagMatch[2]) return false;

	// Parse the start tag parameters
	var arguments = parseStartTagParams(tagMatch[3]);
	if (!arguments) return false;
	
	// Continue processing
	var startTagEndIndex = skipEmptyEndOfLine(w.source, tagMatch.index + tagMatch[0].length);
	var endMatch = findNextPartEndOrStartTagMatch(w.source, startTagEndIndex);
	if (endMatch && endMatch[1]) {
		if (!arguments.isHidden) {
			w.nextMatch = startTagEndIndex;
			w.subWikify(w.output,partEndTagREString);
		}
		w.nextMatch = skipEmptyEndOfLine(w.source, endMatch.index + endMatch[0].length);
		
		return true;
	}
	return false;
}

config.formatters.push( {
    name: "part",
    match: "<part\\s+[^>]+>",
	
	handler: function(w) {
		if (!handlePartSection(w)) {
			w.outputText(w.output,w.matchStart,w.matchStart+w.matchLength);
		}
	}
} )

//============================================================================
// Extend "fetchTiddler" functionality to also recognize "part"s of tiddlers 
// as tiddlers.

var currentParent = null; // used for the "." parent (e.g. in the "tiddler" macro)

// Return the match to the first <part ...> tag of the text that has the
// requrest partName.
//
// @return [may be null]
//
var findPartStartTagByName = function(text, partName) {
	var i = 0;
	
	while (true) {
		var tagMatch = findNextPartEndOrStartTagMatch(text, i);
		if (!tagMatch) return null;

		if (tagMatch[2]) {
			// Is start tag
	
			// Check the name
			var arguments = parseStartTagParams(tagMatch[3]);
			if (arguments && arguments.partName == partName) {
				return tagMatch;
			}
		}
		i = tagMatch.index+tagMatch[0].length;
	}
}

// Return the part "partName" of the given parentTiddler as a "readOnly" Tiddler 
// object, using fullName as the Tiddler's title. 
//
// All remaining properties of the new Tiddler (tags etc.) are inherited from 
// the parentTiddler.
// 
// @return [may be null]
//
var getPart = function(parentTiddler, partName, fullName) {
	var text = parentTiddler.text;
	var startTag = findPartStartTagByName(text, partName);
	if (!startTag) return null;
	
	var endIndexOfStartTag = skipEmptyEndOfLine(text, startTag.index+startTag[0].length);
	var indexOfEndTag = text.indexOf(partEndTagString, endIndexOfStartTag);

	if (indexOfEndTag >= 0) {
		var partTiddlerText = text.substring(endIndexOfStartTag,indexOfEndTag);
		var partTiddler = new Tiddler();
		partTiddler.set(
						fullName,
						partTiddlerText,
						parentTiddler.modifier,
						parentTiddler.modified,
						parentTiddler.tags,
						parentTiddler.created);
		partTiddler.abegoIsPartTiddler = true;
		return partTiddler;
	}
	
	return null;
}

// Hijack the store.fetchTiddler to recognize the "part" addresses.
//
var hijackFetchTiddler = function() {
	var oldFetchTiddler = store.fetchTiddler ;
	store.fetchTiddler = function(title) {
		var result = oldFetchTiddler.apply(this, arguments);
		if (!result && title) {
			var i = title.lastIndexOf('/');
			if (i > 0) {
				var parentName = title.substring(0, i);
				var partName = title.substring(i+1);
				var parent = (parentName == ".") 
						? store.resolveTiddler(currentParent)
						: oldFetchTiddler.apply(this, [parentName]);
				if (parent) {
					return getPart(parent, partName, parent.title+"/"+partName);
				}
			}
		}
		return result;	
	};
};

// for debugging the plugin is not loaded through the systemConfig mechanism but via a script tag. 
// At that point in the "store" is not yet defined. In that case hijackFetchTiddler through the restart function.
// Otherwise hijack now.
if (!store) {
	var oldRestartFunc = restart;
	window.restart = function() {
		hijackFetchTiddler();
		oldRestartFunc.apply(this,arguments);
	};
} else
	hijackFetchTiddler();




// The user must not edit a readOnly/partTiddler
//

config.commands.editTiddler.oldIsReadOnlyFunction = Tiddler.prototype.isReadOnly;

Tiddler.prototype.isReadOnly = function() {
	// Tiddler.isReadOnly was introduced with TW 2.0.6.
	// For older version we explicitly check the global readOnly flag
	if (config.commands.editTiddler.oldIsReadOnlyFunction) {
		if (config.commands.editTiddler.oldIsReadOnlyFunction.apply(this, arguments)) return true;
	} else {
		if (readOnly) return true;
	}

	return this.abegoIsPartTiddler;
}

config.commands.editTiddler.handler = function(event,src,title)
{
	var t = store.getTiddler(title);
	// Edit the tiddler if it either is not a tiddler (but a shadowTiddler)
	// or the tiddler is not readOnly
	if(!t || !t.abegoIsPartTiddler)
		{
		clearMessage();
		story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE);
		story.focusTiddler(title,"text");
		return false;
		}
}

// To allow the "./partName" syntax in macros we need to hijack 
// the invokeMacro to define the "currentParent" while it is running.
// 
var oldInvokeMacro = window.invokeMacro;
function myInvokeMacro(place,macro,params,wikifier,tiddler) {
	var oldCurrentParent = currentParent;
	if (tiddler) currentParent = tiddler;
	try {
		oldInvokeMacro.apply(this, arguments);
	} finally {
		currentParent = oldCurrentParent;
	}
}
window.invokeMacro = myInvokeMacro;

// To correctly support the "./partName" syntax while refreshing we need to hijack 
// the config.refreshers.tiddlers to define the "currentParent" while it is running.
// 
(function() {
	var oldTiddlerRefresher= config.refreshers.tiddler;
	config.refreshers.tiddler = function(e,changeList) {
		var oldCurrentParent = currentParent;
		try {
			currentParent = e.getAttribute("tiddler");
			return oldTiddlerRefresher.apply(this,arguments);
		} finally {
			currentParent = oldCurrentParent;
		}
	};
})();

// Support "./partName" syntax inside <<tabs ...>> macro
(function() {
	var extendRelativeNames = function(e, title) {
		var nodes = e.getElementsByTagName("a");
		for(var i=0; i<nodes.length; i++) {
			var node = nodes[i];
			var s = node.getAttribute("content");
			if (s && s.indexOf("./") == 0)
				node.setAttribute("content",title+s.substr(1));
		}
	};
	var oldHandler = config.macros.tabs.handler;
	config.macros.tabs.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
		var result = oldHandler.apply(this,arguments);
		if (tiddler)
			extendRelativeNames(place, tiddler.title);
		return result;
	};
})();

// Scroll the anchor anchorName in the viewer of the given tiddler visible.
// When no tiddler is defined use the tiddler of the target given event is used.
window.scrollAnchorVisible = function(anchorName, tiddler, evt) {
	var tiddlerElem = null;
	if (tiddler) {
		tiddlerElem = document.getElementById(story.idPrefix + tiddler);
	}
	if (!tiddlerElem && evt) {
		var target = resolveTarget(evt);
		tiddlerElem = story.findContainingTiddler(target);
	}
	if (!tiddlerElem) return;

	var children = tiddlerElem.getElementsByTagName("a");
	for (var i = 0; i < children.length; i++) {
		var child = children[i];
		var name = child.getAttribute("name");
		if (name == anchorName) {
			var y = findPosY(child);
			window.scrollTo(0,y);
			return;
		}
	}
}

} // of "install only once"
//}}}

/***
<html><sub><a href="javascript:;" onclick="scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2006 ([[www.abego-software.de|http://www.abego-software.de]])

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

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

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

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

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

<html><sub><a href="javascript:;" onclick="scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>
***/
/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
	major: 1, minor: 0, revision: 2, 
	date: new Date("Apr 19, 2007"),
	source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
	coreVersion: '2.2.0 (Beta 5)'
};

config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");

merge(config.macros.option.types, {
	'pas': {
		elementType: "input",
		valueField: "value",
		eventName: "onkeyup",
		className: "pasOptionInput",
		typeValue: config.macros.option.passwordInputType,
		create: function(place,type,opt,className,desc) {
			// password field
			config.macros.option.genericCreate(place,'pas',opt,className,desc);
			// checkbox linked with this password "save this password on this computer"
			config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);			
			// text savePasswordCheckboxLabel
			place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
		},
		onChange: config.macros.option.genericOnChange
	}
});

merge(config.optionHandlers['chk'], {
	get: function(name) {
		// is there an option linked with this chk ?
		var opt = name.substr(3);
		if (config.options[opt]) 
			saveOptionCookie(opt);
		return config.options[name] ? "true" : "false";
	}
});

merge(config.optionHandlers, {
	'pas': {
 		get: function(name) {
			if (config.options["chk"+name]) {
				return encodeCookie(config.options[name].toString());
			} else {
				return "";
			}
		},
		set: function(name,value) {config.options[name] = decodeCookie(value);}
	}
});

// need to reload options to load passwordOptions
loadOptionsCookie();

/*
if (!config.options['pasPassword'])
	config.options['pasPassword'] = '';

merge(config.optionsDesc,{
		pasPassword: "Test password"
	});
*/
//}}}
/***
|Name|Plugin: jsMath|
|Created by|BobMcElrath|
|Email|my first name at my last name dot org|
|Location|http://bob.mcelrath.org/tiddlyjsmath.html|
|Version|1.5.1|
|Requires|[[TiddlyWiki|http://www.tiddlywiki.com]] &ge; 2.0.3, [[jsMath|http://www.math.union.edu/~dpvc/jsMath/]] &ge; 3.0|
!Description
LaTeX is the world standard for specifying, typesetting, and communicating mathematics among scientists, engineers, and mathematicians.  For more information about LaTeX itself, visit the [[LaTeX Project|http://www.latex-project.org/]].  This plugin typesets math using [[jsMath|http://www.math.union.edu/~dpvc/jsMath/]], which is an implementation of the TeX math rules and typesetting in javascript, for your browser.  Notice the small button in the lower right corner which opens its control panel.
!Installation
In addition to this plugin, you must also [[install jsMath|http://www.math.union.edu/~dpvc/jsMath/download/jsMath.html]] on the same server as your TiddlyWiki html file.  If you're using TiddlyWiki without a web server, then the jsMath directory must be placed in the same location as the TiddlyWiki html file.

I also recommend modifying your StyleSheet use serif fonts that are slightly larger than normal, so that the math matches surrounding text, and \\small fonts are not unreadable (as in exponents and subscripts).
{{{
.viewer {
  line-height: 125%;
  font-family: serif;
  font-size: 12pt;
}
}}}

If you had used a previous version of [[Plugin: jsMath]], it is no longer necessary to edit the main tiddlywiki.html file to add the jsMath <script> tag.  [[Plugin: jsMath]] now uses ajax to load jsMath.
!History
* 11-Nov-05, version 1.0, Initial release
* 22-Jan-06, version 1.1, updated for ~TW2.0, tested with jsMath 3.1, editing tiddlywiki.html by hand is no longer necessary.
* 24-Jan-06, version 1.2, fixes for Safari, Konqueror
* 27-Jan-06, version 1.3, improved error handling, detect if ajax was already defined (used by ZiddlyWiki)
* 12-Jul-06, version 1.4, fixed problem with not finding image fonts
* 26-Feb-07, version 1.5, fixed problem with Mozilla "unterminated character class".
* 27-Feb-07, version 1.5.1, Runs compatibly with TW 2.1.0+, by Bram Chen
!Examples
|!Source|!Output|h
|{{{The variable $x$ is real.}}}|The variable $x$ is real.|
|{{{The variable \(y\) is complex.}}}|The variable \(y\) is complex.|
|{{{This \[\int_a^b x = \frac{1}{2}(b^2-a^2)\] is an easy integral.}}}|This \[\int_a^b x = \frac{1}{2}(b^2-a^2)\] is an easy integral.|
|{{{This <IMG src="http://www.yourequations.com/eq.latex?\int_a^b \sin x = -(\cos b - \cos a)" alt="\int_a^b \sin x = -(\cos b - \cos a)" class="eq_latex" align="middle" border="0"> is another easy integral.}}}|This <IMG src="http://www.yourequations.com/eq.latex?\int_a^b \sin x = -(\cos b - \cos a)" alt="\int_a^b \sin x = -(\cos b - \cos a)" class="eq_latex" align="middle" border="0"> is another easy integral.|
|{{{Block formatted equations may also use the 'equation' environment \begin{equation}  \int \tan x = -\ln \cos x \end{equation} }}}|Block formatted equations may also use the 'equation' environment \begin{equation}  \int \tan x = -\ln \cos x \end{equation}|
|{{{Equation arrays are also supported \begin{eqnarray} a &=& b \\ c &=& d \end{eqnarray} }}}|Equation arrays are also supported \begin{eqnarray} a &=& b \\ c &=& d \end{eqnarray} |
|{{{I spent \$7.38 on lunch.}}}|I spent \$7.38 on lunch.|
|{{{I had to insert a backslash (\\) into my document}}}|I had to insert a backslash (\\) into my document|
!Code
***/
//{{{

// AJAX code adapted from http://timmorgan.org/mini
// This is already loaded by ziddlywiki...
if(typeof(window["ajax"]) == "undefined") {
  ajax = {
      x: function(){try{return new ActiveXObject('Msxml2.XMLHTTP')}catch(e){try{return new ActiveXObject('Microsoft.XMLHTTP')}catch(e){return new XMLHttpRequest()}}},
      gets: function(url){var x=ajax.x();x.open('GET',url,false);x.send(null);return x.responseText}
  }
}

// Load jsMath
jsMath = {
  Setup: {inited: 1},          // don't run jsMath.Setup.Body() yet
  Autoload: {root: new String(document.location).replace(/[^\/]*$/,'jsMath/')}  // URL to jsMath directory, change if necessary
};
var jsMathstr;
try {
  jsMathstr = ajax.gets(jsMath.Autoload.root+"jsMath.js");
} catch(e) {
  alert("jsMath was not found: you must place the 'jsMath' directory in the same place as this file.  "
       +"The error was:\n"+e.name+": "+e.message);
  throw(e);  // abort eval
}
try {
  window.eval(jsMathstr);
} catch(e) {
  alert("jsMath failed to load.  The error was:\n"+e.name + ": " + e.message + " on line " + e.lineNumber);
}
jsMath.Setup.inited=0;  //  allow jsMath.Setup.Body() to run again

// Define wikifers for latex
config.formatterHelpers.mathFormatHelper = function(w) {
    var e = document.createElement(this.element);
    e.className = this.className;
    var endRegExp = new RegExp(this.terminator, "mg");
    endRegExp.lastIndex = w.matchStart+w.matchLength;
    var matched = endRegExp.exec(w.source);
    if(matched) {
        var txt = w.source.substr(w.matchStart+w.matchLength, 
            matched.index-w.matchStart-w.matchLength);
        if(this.keepdelim) {
          txt = w.source.substr(w.matchStart, matched.index+matched[0].length-w.matchStart);
        }
        e.appendChild(document.createTextNode(txt));
        w.output.appendChild(e);
        w.nextMatch = endRegExp.lastIndex;
    }
}

config.formatters.push({
  name: "displayMath1",
  match: "\\\$\\\$",
  terminator: "\\\$\\\$\\n?", // 2.0 compatability
  termRegExp: "\\\$\\\$\\n?",
  element: "div",
  className: "math",
  handler: config.formatterHelpers.mathFormatHelper
});

config.formatters.push({
  name: "inlineMath1",
  match: "\\\$", 
  terminator: "\\\$", // 2.0 compatability
  termRegExp: "\\\$",
  element: "span",
  className: "math",
  handler: config.formatterHelpers.mathFormatHelper
});

var backslashformatters = new Array(0);

backslashformatters.push({
  name: "inlineMath2",
  match: "\\\\\\\(",
  terminator: "\\\\\\\)", // 2.0 compatability
  termRegExp: "\\\\\\\)",
  element: "span",
  className: "math",
  handler: config.formatterHelpers.mathFormatHelper
});

backslashformatters.push({
  name: "displayMath2",
  match: "\\\\\\\[",
  terminator: "\\\\\\\]\\n?", // 2.0 compatability
  termRegExp: "\\\\\\\]\\n?",
  element: "div",
  className: "math",
  handler: config.formatterHelpers.mathFormatHelper
});

backslashformatters.push({
  name: "displayMath3",
  match: "\\\\begin\\{equation\\}",
  terminator: "\\\\end\\{equation\\}\\n?", // 2.0 compatability
  termRegExp: "\\\\end\\{equation\\}\\n?",
  element: "div",
  className: "math",
  handler: config.formatterHelpers.mathFormatHelper
});

// These can be nested.  e.g. \begin{equation} \begin{array}{ccc} \begin{array}{ccc} ...
backslashformatters.push({
  name: "displayMath4",
  match: "\\\\begin\\{eqnarray\\}",
  terminator: "\\\\end\\{eqnarray\\}\\n?", // 2.0 compatability
  termRegExp: "\\\\end\\{eqnarray\\}\\n?",
  element: "div",
  className: "math",
  keepdelim: true,
  handler: config.formatterHelpers.mathFormatHelper
});

// The escape must come between backslash formatters and regular ones.
// So any latex-like \commands must be added to the beginning of
// backslashformatters here.
backslashformatters.push({
    name: "escape",
    match: "\\\\.",
    handler: function(w) {
        w.output.appendChild(document.createTextNode(w.source.substr(w.matchStart+1,1)));
        w.nextMatch = w.matchStart+2;
    }
});

config.formatters=backslashformatters.concat(config.formatters);

window.wikify = function(source,output,highlightRegExp,tiddler)
{
    if(source && source != "") {
        if(version.major == 2 && version.minor > 0) {
            var wikifier = new Wikifier(source,getParser(tiddler),highlightRegExp,tiddler);
            wikifier.subWikifyUnterm(output);
        } else {
            var wikifier = new Wikifier(source,formatter,highlightRegExp,tiddler);
            wikifier.subWikify(output,null);
        }
        jsMath.ProcessBeforeShowing();
    }
}
//}}}
${\mathbb A}^1$-homotopy theory is an amalgam of techniques from algebraic geometry and algebraic topology merged using the glue of category theory.  The construction of the category of [[(motivic) spaces|Motivic space]] requires the theory of pre-sheaves and sheaves as developed by Grothendieck.  While sheaves are inherently objects of a category theoretic nature, the [[topologies|Grothendieck topology]] one uses for the relevant sheaf theory (namely the [[Zariksi|Zariski topology]], [[Nisnevich|Nisnevich topology]] and [[étale topology]] topologies) are inherently algebro-geometric.  In order to do homotopy theory, one can consider simplicial spaces (i.e., simplicial objects in the category of motivic spaces) and equip the category of such objects with the structure of a model category in the sense of Quillen.  On the one hand, we might want to study the finer properties of the theory of simplicial spaces.  On the other hand, we might want to recall aspects of classical algebraic topology so as to understand what we might do with the ${\mathbb A}^1$-homotopy category.  The references below deal with these two points of view.  Without providing actual links, we note that many of the resources below can be found online by a sufficiently detailed search.  

* For information about ``classical" algebraic topology, one can consult the following references.
** [[Algebraic topology|http://www.math.cornell.edu/~hatcher/AT/ATpage.html]] - by A. Hatcher
** [[Topological K-theory|http://www.math.cornell.edu/~hatcher/VBKT/VBpage.html]] - by A. Hatcher
* For information about simplicial sets and simplicial objects in categories, one can consult the following references.
** [[Simplicial objects in algebraic topology|http://books.google.com/books?hl=en&id=prAnNkkfAvoC&dq=Simplicial+objects+in+algebraic+topology&printsec=frontcover&source=web&ots=XrZDB_Ky_s&sig=xJuk-r3IXFNq20jppxS3oNUisuQ&sa=X&oi=book_result&resnum=5&ct=result]] - J.P. May
** [[Simplicial homotopy theory|http://books.google.com/books?id=xFwXQCtNcUoC&printsec=frontcover&dq=Simplicial+homotopy+theory&ei=thx0SP_4D47iiwGnwqmFDA&sig=ACfU3U1NvLTJYHNhbwGsFz1Ftjk0mPOObA]] - P. Goerss and J.F. Jardine
* For information about model categories, one can consult the following references.
** [[Homotopical algebra]] - D. G. Quillen
** [[Model categories|http://books.google.com/books?id=Kfs4uuiTXN0C&printsec=frontcover&dq=Model+Categories&ei=_xx0SOSUI4KejgHz7azpBw&sig=ACfU3U2MYOi1FlH-LkvmdidU2NVsq4EeiA]] - by M. Hovey
** [[Model categories and their localizations|http://books.google.com/books?id=LH8CoWJfHloC&printsec=frontcover&dq=Model+Categories+and+their+localizations&ei=Jx10SIDhIIrGjgGbzLXpBw&sig=ACfU3U1wP04VZkfnCLaJgvVF2ECCSt70TQ]] - P. Hirschhorn
** [[Model categories and simplicial methods|http://arxiv.org/abs/math/0609537]] - P. Goerss and K. Schemmerhorn
* For information about ``sheaf theory" in the required sense, one can consult the following references.  
** [[Notes on Grothendieck topologies, fibered categories, and descent theory|http://arxiv.org/abs/math/0412512]] - A. Vistoli
** [[Théorie des topos et cohomologie étale des schémas (SGA4)]] - M. Artin, A. Grothendieck
** [[Algebro-geometric preliminaries|http://www.math.neu.edu/~levine/publ/SummerSchoolAG.pdf]] - M. Levine
* For information about ``simplicial (pre-)sheaf theory," one can consult the following references.
** [[Lectures on simplicial pre-sheaves|http://www.math.uwo.ca/~jardine/papers/sPre/index.shtml]] - J.F. Jardine
** [[Hypercovers and simplicial pre-sheaves|http://arxiv.org/abs/math/0205027]] - D. Dugger, D. Isaksen, S. Hollander
!!! Definition
Suppose $k$ is a field and ${\mathcal Sm}_k$ denotes the category of schemes that are separated smooth and have finite type over $k$.  Let ${\mathcal Cor}_k$ denote the category whose objects are those of ${\mathcal Sm}_k$ but whose morphisms are [[finite correspondences|Finite correspondence]].  A //presheaf with transfers// on ${\mathcal Sm}_k$ is a contravariant additive functor ${\mathcal Cor}_k \to {\mathcal Ab}$.
/***
|Name:|PrettyDatesPlugin|
|Description:|Provides a new date format ('pppp') that displays times such as '2 days ago'|
|Version:|1.0 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#PrettyDatesPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Notes
* If you want to you can rename this plugin. :) Some suggestions: LastUpdatedPlugin, RelativeDatesPlugin, SmartDatesPlugin, SexyDatesPlugin.
* Inspired by http://ejohn.org/files/pretty.js
***/
//{{{
Date.prototype.prettyDate = function() {
	var diff = (((new Date()).getTime() - this.getTime()) / 1000);
	var day_diff = Math.floor(diff / 86400);

	if (isNaN(day_diff))      return "";
	else if (diff < 0)        return "in the future";
	else if (diff < 60)       return "just now";
	else if (diff < 120)      return "1 minute ago";
	else if (diff < 3600)     return Math.floor(diff/60) + " minutes ago";
	else if (diff < 7200)     return "1 hour ago";
	else if (diff < 86400)    return Math.floor(diff/3600) + " hours ago";
	else if (day_diff == 1)   return "Yesterday";
	else if (day_diff < 7)    return day_diff + " days ago";
	else if (day_diff < 14)   return  "a week ago";
	else if (day_diff < 31)   return Math.ceil(day_diff/7) + " weeks ago";
	else if (day_diff < 62)   return "a month ago";
	else if (day_diff < 365)  return "about " + Math.ceil(day_diff/31) + " months ago";
	else if (day_diff < 730)  return "a year ago";
	else                      return Math.ceil(day_diff/365) + " years ago";
}

Date.prototype.formatString_orig_mptw = Date.prototype.formatString;

Date.prototype.formatString = function(template) {
	return this.formatString_orig_mptw(template).replace(/pppp/,this.prettyDate());
}

// for MPTW. otherwise edit your ViewTemplate as required.
// config.mptwDateFormat = 'pppp (DD/MM/YY)'; 
config.mptwDateFormat = 'pppp'; 

//}}}


''Q:'' Why use Tiddlywiki?
''A:'' As is probably evident from the history of this project, Tiddlywiki was chosen because it appears to be a tool the closely mirrors the idea of a notebook.  Since there is no book on ${\mathbb A}^1$-homotopy theory, eventually the hope was that this project could provide a backbone (or, more ambitiously, a substitute) for such a text.  The two key features that initially drew me (AA) to it are 1) inline ~LaTex support, and 2) the fact that it is a client-side wiki, i.e., everything used can be stored locally.  Of course both of these benefits have corresponding negatives.  
/***
|Name:|QuickOpenTagPlugin|
|Description:|Changes tag links to make it easier to open tags as tiddlers|
|Version:|3.0.1 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
config.quickOpenTag = {

	dropdownChar: (document.all ? "\u25bc" : "\u25be"), // the little one doesn't work in IE?

	createTagButton: function(place,tag,excludeTiddler) {
		// little hack so we can do this: <<tag PrettyTagName|RealTagName>>
		var splitTag = tag.split("|");
		var pretty = tag;
		if (splitTag.length == 2) {
			tag = splitTag[1];
			pretty = splitTag[0];
		}
		
		var sp = createTiddlyElement(place,"span",null,"quickopentag");
		createTiddlyText(createTiddlyLink(sp,tag,false),pretty);
		
		var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,
                        config.views.wikified.tag.tooltip.format([tag]),onClickTag);
		theTag.setAttribute("tag",tag);
		if (excludeTiddler)
			theTag.setAttribute("tiddler",excludeTiddler);
    		return(theTag);
	},

	miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var tagged = store.getTaggedTiddlers(tiddler.title);
		if (tagged.length > 0) {
			var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,
                        	config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);
			theTag.setAttribute("tag",tiddler.title);
			theTag.className = "miniTag";
		}
	},

	allTagsHandler: function(place,macroName,params) {
		var tags = store.getTags(params[0]);
		var filter = params[1]; // new feature
		var ul = createTiddlyElement(place,"ul");
		if(tags.length == 0)
			createTiddlyElement(ul,"li",null,"listTitle",this.noTags);
		for(var t=0; t<tags.length; t++) {
			var title = tags[t][0];
			if (!filter || (title.match(new RegExp('^'+filter)))) {
				var info = getTiddlyLinkInfo(title);
				var theListItem =createTiddlyElement(ul,"li");
				var theLink = createTiddlyLink(theListItem,tags[t][0],true);
				var theCount = " (" + tags[t][1] + ")";
				theLink.appendChild(document.createTextNode(theCount));
				var theDropDownBtn = createTiddlyButton(theListItem," " +
					config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);
				theDropDownBtn.setAttribute("tag",tags[t][0]);
			}
		}
	},

	// todo fix these up a bit
	styles: [
"/*{{{*/",
"/* created by QuickOpenTagPlugin */",
".tagglyTagged .quickopentag, .tagged .quickopentag ",
"	{ margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }",
".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",
".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",
"/* extra specificity to make it work right */",
"#displayArea .viewer .quickopentag a.button, ",
"#displayArea .viewer .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink ",
"	{ border:0px solid black; }",
"#displayArea .viewer .quickopentag a.button, ",
"#mainMenu .quickopentag a.button ",
"	{ margin-left:0px; padding-left:2px; }",
"#displayArea .viewer .quickopentag a.tiddlyLink, ",
"#mainMenu .quickopentag a.tiddlyLink ",
"	{ margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",
"a.miniTag {font-size:150%;} ",
"#mainMenu .quickopentag a.button ",
"	/* looks better in right justified main menus */",
"	{ margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }", 
"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }",
"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }",
"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }",
"/*}}}*/",
		""].join("\n"),

	init: function() {
		// we fully replace these builtins. can't hijack them easily
		window.createTagButton = this.createTagButton;
		config.macros.allTags.handler = this.allTagsHandler;
		config.macros.miniTag = { handler: this.miniTagHandler };
		config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;
		store.addNotification("QuickOpenTagStyles",refreshStyles);
	}
}

config.quickOpenTag.init();

//}}}

From October 5 - October 9, 2009, there will be a workshop at [[AIM|http://www.aimath.org/ARCC/workshops/a1homotopy.html]] dedicated to studying the relationships between rational connectivity and ${\mathbb A}^1$-homotopy theory.  

!!! Program details
A smooth proper variety over an algebraically closed field $k$ having characteristic $0$ is rationally connected if any pair of $k$-points is contained in a rational curve. Rationally connected varieties have highly non-trivial arithmetic structure. More recently, rationally connected varieties have been shown to have interesting homotopic structure as well: they are connected (in an appropriate sense) from the standpoint of ${\mathbb A}^1$-homotopy theory. One expects that techniques of homotopy theory can be applied to study arithmetic and geometry of rationally connected varieties and, conversely, geometric properties of specific rationally connected varieties can provide insights about ${\mathbb A}^1$-homotopy theory. The goal of this program is to introduce participants studying arithmetic of rationally connected varieties to the techniques of homotopy theory and vice versa.

During the workshop, we will focus on the following problems.

* //What is a good definition of rationally simply connected variety?// Rational simple connectedness is a notion suggested by Mazur and developed by de Jong and Starr to prove existence of rational points for varieties defined over the function field of a surface. While various tentative definitions have been suggested, it is widely agreed that a ``good" definition has not yet been found. Since rationally connected varieties are ${\mathbb A}^1$-connected (in an appropriate sense), one can try to connect notions of higher rational connectivity with ${\mathbb A}^1$-homotopy groups to obtain a ``good" definition.

* //Can weak approximation be approached using obstruction theory?// A Serre fibration of $CW$ complexes has a section only if certain obstruction classes vanish. These are defined in cohomology of the base having coefficients in homotopy of the fiber. Similarly, weak approximation of adelic points of a variety over a number field holds only if the Brauer-Manin obstruction vanishes (for rationally connected varieties this is conjectured to be the only obstruction). One hope is that ${\mathbb A}^1$-homotopy theory will bridge these two results and extend them to answer the following geometric problem of Hassett and Tschinkel: Given a family of rationally connected varieties defined over a curve, are formal points weakly approximated by rational points?

* //Can techniques of rational curves be used to understand norm varieties?// A fundamental step in the proof of the Bloch-Kato conjecture by Rost and Voevodsky involves the construction of certain algebraic varieties with prescribed cohomological properties. In cases where these varieties can be explicitly constructed, one may use them to provide examples of unirational non-rational varieties generalizing the examples of Artin and Mumford. In the known approach to construct the norm varieties by induction on the length of the symbol, it is an observation that starting with the ``usual" Brauer-Severi variety for a symbol of length $2$, one gets a rationally connected variety. There are open questions related to this construction. For instance, can one construct a norm variety with the property that existence of an $F$-point (any field $F$) implies all the $F$-points are rationally chain connected? For norm varieties at the prime $2$, Pfister quadrics provide an affirmative answer. For norm varieties at odd primes, the question is open. We will explore norm varieties in greater detail with particular attention to their rational connectedness properties. 

!!! Background and references
Rationally connected varieties were introduced independently by Kollár, Miyaoka, Mori and Campana.  Kollár suggests that rationally connected varieties are candidates for the ``simplest" algebraic varieties (see [[here (p. 425)|http://www.ams.org/bull/2001-38-04/S0273-0979-01-00917-X/home.html]]).  However, there are many things that are still not known about the class of rationally connected varieties.  Recall that a variety $X$ over $k$ is [[unirational|http://en.wikipedia.org/wiki/Rational_variety]] if the function field $k(X)$ is a subfield of $k(t_1,\ldots,t_n)$.  It is easy to show that unirational varieties are rationally connected.  However, an answer to the following question is not yet known.
* Do there exist rationally connected non-unirational varieties?   
/***
|Name:|RenameTagsPlugin|
|Description:|Allows you to easily rename or delete tags across multiple tiddlers|
|Version:|3.0 ($Rev: 5501 $)|
|Date:|$Date: 2008-06-10 23:11:55 +1000 (Tue, 10 Jun 2008) $|
|Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
Rename a tag and you will be prompted to rename it in all its tagged tiddlers.
***/
//{{{
config.renameTags = {

	prompts: {
		rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",
		remove: "Remove the tag '%0' from %1 tidder%2?"
	},

	removeTag: function(tag,tiddlers) {
		store.suspendNotifications();
		for (var i=0;i<tiddlers.length;i++) {
			store.setTiddlerTag(tiddlers[i].title,false,tag);
		}
		store.resumeNotifications();
		store.notifyAll();
	},

	renameTag: function(oldTag,newTag,tiddlers) {
		store.suspendNotifications();
		for (var i=0;i<tiddlers.length;i++) {
			store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old
			store.setTiddlerTag(tiddlers[i].title,true,newTag);  // add new
		}
		store.resumeNotifications();
		store.notifyAll();
	},

	storeMethods: {

		saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,

		saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {
			if (title != newTitle) {
				var tagged = this.getTaggedTiddlers(title);
				if (tagged.length > 0) {
					// then we are renaming a tag
					if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))
						config.renameTags.renameTag(title,newTitle,tagged);

					if (!this.tiddlerExists(title) && newBody == "")
						// dont create unwanted tiddler
						return null;
				}
			}
			return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created);
		},

		removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,

		removeTiddler: function(title) {
			var tagged = this.getTaggedTiddlers(title);
			if (tagged.length > 0)
				if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))
					config.renameTags.removeTag(title,tagged);
			return this.removeTiddler_orig_renameTags(title);
		}

	},

	init: function() {
		merge(TiddlyWiki.prototype,this.storeMethods);
	}
}

config.renameTags.init();

//}}}

!!! Definition
Suppose $k$ is a field and $X$ is a $k$-variety.  One says $X$ is __retract k-rational__ if there is an open subset $U$ of $X$ such that the identity map $U \to U$ factors through an open subscheme $V$ of an affine space.  
/***
|Name:|SaveCloseTiddlerPlugin|
|Description:|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|
|Version:|3.0 ($Rev: 5502 $)|
|Date:|$Date: 2008-06-10 23:31:39 +1000 (Tue, 10 Jun 2008) $|
|Source:|http://mptw.tiddlyspot.com/#SaveCloseTiddlerPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
To use these you must add them to the tool bar in your EditTemplate
***/
//{{{
merge(config.commands,{

	saveCloseTiddler: {
		text: 'done/close',
		tooltip: 'Save changes to this tiddler and close it',
		handler: function(ev,src,title) {
			var closeTitle = title;
			var newTitle = story.saveTiddler(title,ev.shiftKey);
			if (newTitle)
				closeTitle = newTitle;
			return config.commands.closeTiddler.handler(ev,src,closeTitle);
		}
	},

	cancelCloseTiddler: {
		text: 'cancel/close',
		tooltip: 'Undo changes to this tiddler and close it',
		handler: function(ev,src,title) {
			// the same as closeTiddler now actually
			return config.commands.closeTiddler.handler(ev,src,title);
		}
	}

});

//}}}

This section begins (Definition 0.1) with the definition of a [[model category|http://en.wikipedia.org/wiki/Model_category]] in a sense slightly more general than that discussed by Quillen.  This seems to be a standard definition these days.  The main differences are in axioms ''[[MC1|Model category]]'' (where Quillen requires only finite [[limits|http://en.wikipedia.org/wiki/Limit_(category_theory)#Limits]] and [[colimits|http://en.wikipedia.org/wiki/Limit_(category_theory)#Colimits_2]] as opposed to limits and colimits indexed by small categories) and ''[[MC5|Model category]]'' (where Quillen doesn't require functorial factorizations).  See the [[preliminaries|Preliminaries]] for various information about model categories.  

!!! Section 2.1 ([[Homotopy theory of simplicial sheaves|Section 2-1 of A¹-homotopy theory of schemes]])
The main goal of this section is to review some aspects of homotopy theory of simplicial sheaves on a site.  Nowadays, the model category structure presented here is called the [[injective local (or pointwise) model structure|Homotopy theory of simplicial sheaves]].  This theory was introduced by Jardine (//cf.// [[Simplicial presheaves|http://www.ams.org/mathscinet/search/publdoc.html?pg1=IID&s1=190317&r=38&mx-pid=906403]], and [[Simplicial objects in a Grothendieck topos|http://www.ams.org/mathscinet/search/publdoc.html?r=1&pg1=CNO&s1=862637&loc=fromrevtext]]) and Joyal (unpublished), and so is sometimes called the Joyal- Jardine model structure as well.
!!! Section 2.2 ([[A localization theorem for simplicial sheaves|Section 2-2 of A¹-homotopy theory of schemes]])
The main goal of this section is to study [[localization of homotopy categories of simplicial sheaves in the sense of Bousfield|Bousfield localization]].  Since this paper was written, a nice treatment of Bousfield localization of model categories has been given by P. Hirschhorn (see [[Model categories and their localizations|Preliminaries]]).  D. Dugger has also given a nice axiomatic treatment of localization of simplicial homotopy categories as it applies in the situation of A^^1^^-homotopy theory (see [[Universal homotopy theories|http://arxiv.org/abs/math/0007070]]).  
!!! Section 2.3 ([[Homotopy category of a site with interval|Section 2-3 of A¹-homotopy theory of schemes]])
This section defines the notion of an [[interval object|Interval object]] I in a category of sheaves.  The main goal of the section is to construct an I-homotopy category and study its properties (Theorem 3.2).  This construction also follows a localization procedure as detailed in the previous section.  The A¹-homotopy category is then obtained as a special case of this construction.  

Back to [[A¹-homotopy theory of schemes]]
!!!! [[Simplicial sheaves|Motivic space]]
This section studies some generalities on [[simplicial objects|http://en.wikipedia.org/wiki/Simplicial_set#Formal_definition]] in the category of [[sheaves on a site|http://en.wikipedia.org/wiki/Grothendieck_topology#Sites_and_sheaves]].  In particular, the notion of [[simplicial dimension]] is defined, along with [[simplicial function objects]], [[skeleta|Skeleton functor]] and [[co-skeleta|Skeleton functor]].  
!!!! The simplicial model category structure
In this section, definitions of [[simplicial weak equivalence]], [[simplicial fibration]] and [[simplicial cofibration]] are given (see Definition 1.2).  Theorem 1.4 shows that these classes of morphisms equip the category of simplicial sheaves on a site with a model category structure, which, as we noted before, is called the [[injective local model structure|Homotopy theory of simplicial sheaves]].  The resulting homotopy category is called the simplicial homotopy category. Remark 1.5 shows that this model category structure if [[proper|Proper model category]], and Lemma 1.8 together with Remark 1.9 show that it is [[simplicial|Simplicial model cateogry]] as well.  Also [[resolution functors|Resolution functor]] are defined (Definition 1.6) and these are useful for computing Hom sets in the simplicial homotopy category.  
!!!! Local fibrations and resolution lemmas
Here local (or pointwise) fibrations are defined (Definition 1.11).  These differ from simplicial fibrations (sometimes called global fibrations), and according to Jardine, the difference between these two notions is ``measured by sheaf cohomology."  Proposition 1.13 shows how locally fibrant objects can be used to compute Hom sets in the simplicial homotopy category.  Remark 1.14 shows that the functor from the category of sheaves on a site to the simplicial homotopy category is fully faithful and also defines the [[Cech complex|Cech simplicial object]] $\breve{C}(f)$ of a morphism $f: {\mathcal X} \to {\mathcal Y}$ of spaces.  In particular $\breve{C}(f)$ is simplicially weakly equivalent to ${\mathcal Y}$ if the morphism $f$ is an epimorphism of sheaves.  Lemma 1.16 (see Remark 1.17) shows that any simplicial sheaf has a canonical resolution by representable objects.  
!!!! Homotopy limits and colimits
This section reviews various properties of [[homotopy limits]] and [[homotopy colimits]].  This section is largely adapted from the classic work of Bousfield-Kan.  
!!!! [[Eilenberg-MacLane sheaves|Eilenberg-MacLane space]] and [[Postnikov towers|Postnikov tower]]
This section begins by reviewing the sheaf theoretic version of the [[Dold-Kan correspondence]] that provides an equivalence from the category of simplicial objects in the category of abelian groups to the category of [[chain complexes|http://en.wikipedia.org/wiki/Chain_complex] (differential of degree $+1$) of abelian groups situated in negative degrees.  The inverse functor allows one to define [[Eilenberg-MacLane objects]] associated with a sheaf of abelian groups.  Proposition 1.26 reviews work of K. Brown and shows how to relate cohomology of a sheaf of abelian groups $A$ with morphisms in the simplicial homotopy category to the [[Eilenberg-MacLane|Eilenberg-MacLane sheaves]] space associated with $A$; this is analogous to the corresponding [[situation in topology|http://en.wikipedia.org/wiki/Eilenberg-MacLane_space#Properties_of_Eilenberg.E2.80.93MacLane_spaces]]. 

Next, one defines the Postnikov tower of a simplicial sheaf (see [[here|http://en.wikipedia.org/wiki/Postnikov_tower]] for the corresponding topological construction).  This material isn't used as much here as it is in subsequent works on ${\mathbb A}^1$-homotopy theory (e.g., Morel's paper ${\mathbb A}^1$[[-algebraic topology over a field|A¹-algebraic topology over a field]]).  The Postnikov tower doesn't behave as expected for general sites, so Definition 1.31 introduces a [[finiteness condition|Site of finite type]] under which the Postnikov tower has good properties.  The rest of the section is devoted to deducing that the Postnikov tower for sites satisfying this finiteness condition have all the expected properties.  
!!!! Functoriality
A basic notion in algebraic geometry is that of change of base; this section studies how homotopy categories behave under morphisms and continuous maps of sites (these notions are defined in SGA4, but recalled here).  This material is eventually used to study change of base for ${\mathbb A}^1$[[-homotopy categories|A¹-homotopy category]].  
!!!! [[Godement resolutions]]
Again in the context of [[sites of finite type|Site of finite type]], this section (see Theorem 1.66) produces a resolution functor with the property that it commutes with formation of finite limits and takes local fibrations to simplicial fibrations. 

Back to [[Section 2 of A¹-homotopy theory of schemes]]
!!!! [[Basic definitions and main results]]
!!!! [[Elementary properties of class W_A and F_A]]
!!!! [[A-model category structure theorem]]
!!!! [[Properness theorem]]
!!!! [[Localization of loop spaces]]
Back to [[Section 2 of A¹-homotopy theory of schemes]]
!!!! [[Definitions, examples, and the main theorem]]
!!!! [[The functor Sing_*]]
!!!! [[Functoriality]]
!!!! [[An explicit I-resolution functor]]
Back to [[Section 2 of A¹-homotopy theory of schemes]]
!!! Section 3.1 ([[Simplicial sheaves in the Nisnevich topology on smooth sites]])
!!!! [[Nisnevich topology]]
!!!! [[Simplicial presheaves with the B.G. property]]
!!!! [[Functoriality in S]]
!!! Section 3.2 ([[The A¹-homotopy categories]])
!!!! [[The A¹-model category structure on simplicial Nisnevich sheaves]]
!!!! [[Spheres, suspensions, and Thom spaces]]
!!!! [[Gluing, homotopy purity, and the blow-up square]]
!!! Section 3.3 ([[Some realization functors]])
!!!! [[G-equivariant homotopy categories of spaces]]
!!!! [[C-realizations - definition and examples]]
!!!! [[R-realizations - definition and examples]]
!!! Section 4.1 ([[Generalities|Generalities on classifying spaces]])
!!! Section 4.2 ([[Geometrical models for B_etG]])
!!! Section 4.3 ([[Examples]])
/***
|Name:|SelectThemePlugin|
|Description:|Lets you easily switch theme and palette|
|Version:|1.0.1 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#SelectThemePlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
* Borrows largely from ThemeSwitcherPlugin by Martin Budden http://www.martinswiki.com/#ThemeSwitcherPlugin
* Theme is cookie based. But set a default by setting config.options.txtTheme in MptwConfigPlugin (for example)
* Palette is not cookie based. It actually overwrites your ColorPalette tiddler when you select a palette, so beware. 
!Usage
* {{{<<selectTheme>>}}} makes a dropdown selector
* {{{<<selectPalette>>}}} makes a dropdown selector
* {{{<<applyTheme>>}}} applies the current tiddler as a theme
* {{{<<applyPalette>>}}} applies the current tiddler as a palette
* {{{<<applyTheme TiddlerName>>}}} applies TiddlerName as a theme
* {{{<<applyPalette TiddlerName>>}}} applies TiddlerName as a palette
***/
//{{{

config.macros.selectTheme = {
	label: {
      		selectTheme:"select theme",
      		selectPalette:"select palette"
	},
	prompt: {
		selectTheme:"Select the current theme",
		selectPalette:"Select the current palette"
	},
	tags: {
		selectTheme:'systemTheme',
		selectPalette:'systemPalette'
	}
};

config.macros.selectTheme.handler = function(place,macroName)
{
	var btn = createTiddlyButton(place,this.label[macroName],this.prompt[macroName],this.onClick);
	// want to handle palettes and themes with same code. use mode attribute to distinguish
	btn.setAttribute('mode',macroName);
};

config.macros.selectTheme.onClick = function(ev)
{
	var e = ev ? ev : window.event;
	var popup = Popup.create(this);
	var mode = this.getAttribute('mode');
	var tiddlers = store.getTaggedTiddlers(config.macros.selectTheme.tags[mode]);
	// for default
	if (mode == "selectPalette") {
		var btn = createTiddlyButton(createTiddlyElement(popup,'li'),"(default)","default color palette",config.macros.selectTheme.onClickTheme);
		btn.setAttribute('theme',"(default)");
		btn.setAttribute('mode',mode);
	}
	for(var i=0; i<tiddlers.length; i++) {
		var t = tiddlers[i].title;
		var name = store.getTiddlerSlice(t,'Name');
		var desc = store.getTiddlerSlice(t,'Description');
		var btn = createTiddlyButton(createTiddlyElement(popup,'li'), name?name:t, desc?desc:config.macros.selectTheme.label['mode'], config.macros.selectTheme.onClickTheme);
		btn.setAttribute('theme',t);
		btn.setAttribute('mode',mode);
	}
	Popup.show();
	return stopEvent(e);
};

config.macros.selectTheme.onClickTheme = function(ev)
{
	var mode = this.getAttribute('mode');
	var theme = this.getAttribute('theme');
	if (mode == 'selectTheme')
		story.switchTheme(theme);
	else // selectPalette
		config.macros.selectTheme.updatePalette(theme);
	return false;
};

config.macros.selectTheme.updatePalette = function(title)
{
	if (title != "") {
		store.deleteTiddler("ColorPalette");
		if (title != "(default)")
			store.saveTiddler("ColorPalette","ColorPalette",store.getTiddlerText(title),
					config.options.txtUserName,undefined,"");
		refreshAll();
		if(config.options.chkAutoSave)
			saveChanges(true);
	}
};

config.macros.applyTheme = {
	label: "apply",
	prompt: "apply this theme or palette" // i'm lazy
};

config.macros.applyTheme.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	var useTiddler = params[0] ? params[0] : tiddler.title;
	var btn = createTiddlyButton(place,this.label,this.prompt,config.macros.selectTheme.onClickTheme);
	btn.setAttribute('theme',useTiddler);
	btn.setAttribute('mode',macroName=="applyTheme"?"selectTheme":"selectPalette"); // a bit untidy here
}

config.macros.selectPalette = config.macros.selectTheme;
config.macros.applyPalette = config.macros.applyTheme;

config.macros.refreshAll = { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
	createTiddlyButton(place,"refresh","refresh layout and styles",function() { refreshAll(); });
}};

//}}}

<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<tiddler TspotSidebar>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
Let $({\mathcal Sm}_k)_{Nis}\;$ be the site obtained by endowing the category of smooth $k$-schemes with the Nisnevich topology.  The category of simplicial sheaves $\Delta^{\circ}{\mathcal Shv}_{Nis}({\mathcal Sm}_k)\;$ can be equipped with the [[injective local model structure]] (where weak equivalences are those maps that stalkwise induce weak equivalences of simplicial sets).  The resulting homotopy category is be denoted ${\mathcal H}_s({\mathcal Sm}_k)_{Nis}\;$ and called the __simplicial homotopy category__.  Set
\[
[{\mathcal Y} , {\mathcal X}]_s := Hom_{{\mathcal H}_s({\mathcal Sm}_k)_{Nis}}({\mathcal Y},{\mathcal X})
\]  
There is a //pointed// version of this construction as well.  

/* Mention Joyal-Jardine theory of simplicial objects in a topos and specialize to the case discussed above*/

Motivic or A¹-homotopy resources
Let $S$ be a Noetherian scheme of finite Krull dimension, and let $SH_{{\mathbb A}^1}(S)$ denote the [[stable homotopy category|Stable A¹-homotopy category]] of ${\mathbb P}^1$-spectra. Given a pointed smooth $S$-scheme $(X,x)$, one writes $\Sigma^{\infty}_{{\mathbb P}^1}(X,x)$ for the associated suspension ${\mathbb P}^1$-spectrum.  One may also consider the ${{\mathbb P}^1}$ desuspensions \[ \Sigma^{\infty - q}_{{\mathbb P}^1}(X,x) := \Sigma^{-q}_{{\mathbb P}^1}\Sigma^{\infty}_{{\mathbb P}^1}(X,x). \] 
The spectra $\Sigma^{\infty - q}_{{\mathbb P}^1}(X,x)\;$ //generate// the category $SH_{{\mathbb A}^1}(S)$ in the sense that the smallest triangulated subcategory of $SH_{{\mathbb A}^1}(S)$ that is closed under direct sums and contains spectra of the form $\Sigma^{\infty - q}_{{\mathbb P}^1}(X,x)\;$ coincides with $SH_{{\mathbb A}^1}(S)$.  
 
Let $SH_{{\mathbb A}^1}^{eff}(S)$ denote the smallest triangulated subcategory of $SH_{{\mathbb A}^1}^{eff}(S)$ that is closed under direct sums and contains suspension spectra of spaces, but //not// their ${{\mathbb P}^1}$-desuspensions.  In a similar way, one can also define categories $\Sigma^q_{{\mathbb P}^1} SH_{{\mathbb A}^1}^{eff}(S)$.

This sequence of subcategories of $SH_{{\mathbb A}^1}(S)$ defines an //exhaustive filtration// in the sense (i) that we have naturally defined fully-faithful functors
\[
\Sigma^q_{{\mathbb P}^1} SH_{{\mathbb A}^1}^{eff}(S) \hookrightarrow \Sigma^{q-1}_{{\mathbb P}^1} SH_{{\mathbb A}^1}^{eff}(S)
\]
and the smallest triangulated subcategory of $SH_{{\mathbb A}^1}(S)$ closed under direct sums and containing all $\Sigma^q_{{\mathbb P}^1} SH_{{\mathbb A}^1}^{eff}(S)$ co-incides with the category $SH_{{\mathbb A}^1}(S)$.  This filtration is called the __slice filtration__.  
The __smash product__ of two pointed [[spaces|Motivic space]] $({\mathcal X},x)$ and $({\mathcal Y},y)$ is obtained by collapsing the [[wedge sum|Wedge sum]] inside the Cartesian product ${\mathcal X} \times {\mathcal Y}$.  
Stable ${\mathbb A}^1$-homotopy theory is a framework for studying [[cohomology theories|http://en.wikipedia.org/wiki/Cohomology_theory]] in algebraic geometry.  Following the ideas of classical [[stable homotopy theory|http://en.wikipedia.org/wiki/Stable_homotopy_theory]],  From the modern point of view, this is accomplished by constructing appropriate categories of [[spectra|http://en.wikipedia.org/wiki/Spectrum_(homotopy_theory)]].  There are several ``good" categories of spectra ([[symmetric spectra|http://www.math.uiuc.edu/K-theory/0265/]], [[S-modules|http://hopf.math.purdue.edu/cgi-bin/generate?/Elmendorf-Kriz-Mandell-May/ekmm]],[[simplicial functors|http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.9567]]) and versions in the motivic world.

* Motivic Symmetric Spectra, by J.F. Jardine - ([[Paper|http://www.math.uiuc.edu/documenta/vol-05/15.html]],[[Discussion|Motivic Symmetric Spectra]]) 
* $S$-modules in the category of schemes, by P. Hu - ([[Paper|http://www.math.uiuc.edu/K-theory/0396/]],[[Discussion|S-modules in the category of schemes]])
* Motivic Functors, by B.I. Dundas, O. Röndigs, P. A. Østvær - ([[Paper|http://www.math.uiuc.edu/documenta/vol-08/14.html]],[[Discussion|Motivic Functors]])

I'm not really qualified to say more about these things.  There are also developments of ``classical" categories of spectra:
* Catégorie homotopique stable d'un site suspendu avec intervalle, by J. Riou - ([[Paper|http://www.math.uiuc.edu/K-theory/0825/]],[[Discussion|Catégorie homotopique stable d'un site suspendu avec intervalle]])
Also,  
* Introduction to A¹-homotopy theory, by F. Morel - ([[Paper|http://www.mathematik.uni-muenchen.de/~morel/lectureTrieste.ps]],[[Discussion|Introduction to A¹-homotopy theory]])
contains a development of the category of ${\mathbb P}^1$[[-spectra|P¹-spectra]]; this last object is what we will mean when we refer to the stable ${\mathbb A}^1$-homotopy category.

Having defined the stable ${\mathbb A}^1$-homotopy category, we want to understand various [[algebraic cohomology theories|Algebraic cohomology theory]] and other computations in this category.  The representability of [[motivic cohomology|Motivic cohomology]] in the stable ${\mathbb A}^1$-homotopy category is described in [[Voevodsky's 1998 ICM Address|http://www.mathematik.uni-bielefeld.de/documenta/xvol-icm/00/Voevodsky.MAN.html]].  He also discusses representability of [[algebraic K-theory|Algebraic K-theory]] and [[algebraic cobordism|Algebraic cobordism]].  [[Algebraic versions|http://www.math.uiuc.edu/K-theory/0412/]] of [[Morava K-theory]] have been constructed by Borghesi.  All of the theories mentioned so far were originally discussed with applications to the proof of the [[Bloch-Kato conjecture]] in mind.  Cohomology operations have also been studied in [[motivic cohomology|http://arxiv.org/abs/0805.4432]], [[algebraic K-theory|http://www.math.u-psud.fr/~riou/these/]] and [[algebraic cobordism|http://www.math.uiuc.edu/K-theory/0773/]], though results are not complete.  Representability of [[Hermitian K-theory]] and [[Witt groups]] is studied in ${\mathbb A}^1$[[-representability of Hermitian K-theory and Witt groups |http://www.math.uiuc.edu/K-theory/0578/]] by J. Hornbostel. 

In the ${\mathbb A}^1$-homotopy category, there are two circles and consequently a two-parameter family of [[motivic spheres|Motivic sphere]].  One can define [[stable homotopy groups|http://en.wikipedia.org/wiki/Homotopy_groups_of_spheres#Stable_and_unstable_groups]] just as in topology.  Generalizing the classical study of the degree homomorphism, Morel has studied the stable motivic <html>&pi;<sub>0</sub></html> of the sphere spectrum and computed this group over general fields.  In particular, if $k$ is a field of characteristic unequal to $2$, the stable motivic <html>&pi;<sub>0</sub></html> of the sphere spectrum is isomorphic to the [[Grothendieck-Witt ring]] $GW(k)$ of isomorphism classes of quadratic forms over $k$!
* On the motivic stable motivic $\pi_0$ of the sphere spectrum by F. Morel - ([[Paper|http://www.mathematik.uni-muenchen.de/~morel/Newton.ps]],[[Discussion|On the motivic stable motivic π_0 of the sphere spectrum]])
Explicit computations of higher stable motivic homotopy groups are very difficult.  Vanishing and finite-generation results have been conjectured in some situations, but these seem extremely difficult.  Various structural results related to ${\mathbb A}^1$-homotopy groups of spectra are presented in 
* The stable ${\mathbb A}^1$-connectivity theorems, by F. Morel - ([[Paper|http://www.mathematik.uni-muenchen.de/~morel/NewA1connectivity.ps]],[[Discussion|The stable A¹-connectivity theorems]])  

Functoriality of the stable homotopy categories and the construction of the Grothendieck formalism of six operations have been studied in great detail by Ayoub.  In particular, he introduces a [[vanishing cycles]] formalism in stable ${\mathbb A}^1$-homotopy theory.  
* Les six opérations de Grothendieck et le formalisme des cycles évanescents dans le monde motivique, by J. Ayoub - ([[Paper|http://www.math.uiuc.edu/K-theory/0761/]],[[Discussion|Les six opérations de Grothendieck et le formalisme des cycles évanescents dans le monde motivique]]).

A motivic version of [[Spanier-Whitehead duality|http://en.wikipedia.org/wiki/Spanier-Whitehead_duality]] has also been studied in ${\mathbb A}^1$-homotopy theory (see [[On the Picard group of the stable A¹-homotopy category|http://www.math.uiuc.edu/K-theory/0395/]] by P. Hu and [[Dualité de Spanier-Whitehead en géométrie algébrique|http://www.math.u-psud.fr/~riou/doc/sw.pdf]] by J. Riou).

Finally, the following paper announces some relationships between the rationalized stable ${\mathbb A}^1$-homotopy category and Voevodsky's derived category of motives.
* Rational stable splitting of Grassmannians and the rational motivic sphere spectrum, by F. Morel - ([[Paper|http://www.mathematik.uni-muenchen.de/~morel/Splittinggrassman.pdf]],[[Discussion|Rational stable splitting of Grassmannians and the rational motivic sphere spectrum]])

<html><center>(<a href="javascript:;" class="TiddlyLinkExisting" 
onclick="story.closeAllTiddlers();story.displayTiddler(null,'Unstable A¹-homotopy theory');return 
false;"><b> Back </b></a>|<a href="javascript:;" class="TiddlyLinkExisting" 
onclick="story.closeAllTiddlers();story.displayTiddler(null,'Outlines of the theory');return 
false;"><b> Up </b></a>|<a href="javascript:;" class="TiddlyLinkExisting" 
onclick="story.closeAllTiddlers();story.displayTiddler(null,'A¹-homotopy theory and algebraic geometry');return 
false;"><b> Forward </b></a>)</center></html>
!!! Definition
Suppose $A$ is a Nisnevich sheaf of abelian groups.  We will say that $A$ is __strictly ${\mathbb A}^1$-invariant__ if for any smooth scheme $U$ and any integer $i \geq 0$, the map
\[
H^i_{Nis}(U,A) \to H^i_{Nis}(U \times {\mathbb A}^1,A)
\]
induced by pull-back along the projection $U \times {\mathbb A}^1 \to U$ is a bijection. 

We write ${\mathcal Ab}^{{\mathbb A}^1}_k$ for the full-subcategory of ${\mathcal Ab}_k$ ([[abelian group spaces|Motivic space]]) consisting of ${\mathbb A}^1$-invariant sheaves of groups.

!!! Equivalent characterization
There is another very useful characterization of strict ${\mathbb A}^1$-invariance.  If $K(A,i)$ denotes an [[Eilenberg-MacLane space]] associated with $A$, then $A$ is strictly ${\mathbb A}^1$-invariant if and only if $K(A,i)$ is ${\mathbb A}^1$-[[local|A¹-local]] for all $i \geq 0$.

!!! Properties
''Theorem'' (Morel): For any [[space|Motivic space]] ${\mathcal X}$, and any integer $i \geq 0$, the ${\mathbb A}^1$[[-homology groups|A¹-homology]] $H_i^{{\mathbb A}^1}({\mathcal X})$ are strictly ${\mathbb A}^1$-invariant sheaves of groups.  

''Theorem'' (Morel): The category ${\mathcal Ab}^{{\mathbb A}^1}_k$ is abelian.  

Morel has also shown that strict ${\mathbb A}^1$-invariance is a natural //abelian// analogue of [[strong|Strongly A¹-invariant]] ${\mathbb A}^1$-invariance.  

''Theorem'' (Morel): If $G$ is a [[strongly|Strongly A¹-invariant]] ${\mathbb A}^1$-invariant sheaf of abelian groups, then $G$ is strictly ${\mathbb A}^1$-invariant.  
!!! Definition
Let $k$ be a field.  Suppose $G$ is a [[group space|Motivic space]], i.e., a Nisnevich sheaf of groups.  We will say that $G$ is __strongly ${\mathbb A}^1$-invariant__ if for any smooth scheme $U$ and $i=0,1$, the map
\[
H^i_{Nis}(U,G) \to H^i_{Nis}(U \times {\mathbb A}^1,G)
\]
induced by pull-back along the projection $U \times {\mathbb A}^1 \to U$ is a bijection.

We write ${\mathcal Gr}^{{\mathbb A}^1}_k$ for the full subcategory of ${\mathcal Gr}_k$ whose objects are strongly ${\mathbb A}^1$-invariant sheaves of groups.

!!!Equivalent characterization
If $G$ is a Nisnevich sheaf of groups, then $G$ is strongly ${\mathbb A}^1$-invariant if and only if the [[classifying space|Classifying space]] $BG$ is ${\mathbb A}^1$-[[local|A¹-local]].  

!!!Properties 
''Lemma'': The category ${\mathcal Gr}^{{\mathbb A}^1}_k$ has finite colimits.  

''Theorem'' (Morel): Given any [[pointed space|Motivic space]] $({\mathcal X},x)$, and any integer $i > 0$, the ${\mathbb A}^1$[[-homotopy group|A¹-homotopy groups]] $\pi_i^{{\mathbb A}^1}({\mathcal X},x)$ is strongly ${\mathbb A}^1$-invariant.  

''Theorem'' (Morel): A [[strongly|Strongly A¹-invariant]] ${\mathbb A}^1$-invariant sheaf of abelian groups is [[strictly|Strictly A¹-invariant]] ${\mathbb A}^1$-invariant
/*{{{*/
/*Font size and Line height changes for jsMath */

.viewer {
  line-height: 125%;
  font-size: 12pt;
}
/*}}}*/


/*{{{*/
/* Modified AccordionEffect, Designed by oc ( http://b-oo-k.net/blog/ ). */
/* Makes buttons look more like other links in a fashion */
/* consistent with the chosen MPTW theme.*/

.viewer .button{color: [[ColorPalette::PrimaryMid]]; text-align: left;
font-weight: bold;
border-top: solid 1px #fff;
border-left: solid 1px #fff;
border-right: solid 1px #fff;
border-bottom: solid 1px #fff;
background: #fff;
margin-left: -2px;
padding: 0 1px 1px 1px;
}

.viewer .button:hover{color: [[ColorPalette::PrimaryDark]]
border-top: solid 1px #eee;
border-left: solid 1px #eee;
border-right: solid 1px #eee;
border-bottom: solid 1px #eee;
background: [[ColorPalette::PrimaryPale]];
padding: 1px 0 0 1px;
}

/*}}}*/
The following references provide surveys of aspects of ${\mathbb A}^1$-homotopy theory.
* V. Voevodsky - ${\mathbb A}^1$-homotopy theory ([[1998 ICM Address|http://www.mathematik.uni-bielefeld.de/documenta/xvol-icm/00/Voevodsky.MAN.html]],[[Discussion|Vo98]])
* F. Morel - ${\mathbb A}^1$-Algebraic Topology ([[2006 ICM Address, preprint version in .pdf|http://www.mathematik.uni-muenchen.de/~morel/ICMfinal1.pdf]],[[Discussion|A¹-algebraic topology]])
* M. Levine - Algebraic cobordism ([[2002 ICM Address, arXiv version|http://arxiv.org/abs/math/0304206]],[[Discussion|Algebraic cobordism]])
* C. Weibel - A roadmap of motivic homotopy and homology theory ([[K-theory server|http://www.math.uiuc.edu/K-theory/0630/]],[[Discussion|A roadmap of motivic homotopy and homology theory]])
* Notes from a course by Mike Hopkins at MIT ([[Tyler Lawson's homepage|http://www.math.umn.edu/~tlawson/motivic.html]],[[Discussion|Notes from a course by Mike Hopkins]])

<html><center>(<a href="javascript:;" class="TiddlyLinkExisting" 
onclick="story.closeAllTiddlers();story.displayTiddler(null,'Outlines of the theory');return 
false;"><b> Up </b></a>|<a href="javascript:;" class="TiddlyLinkExisting" 
onclick="story.closeAllTiddlers();story.displayTiddler(null,'Unstable A¹-homotopy theory');return 
false;"><b> Forward </b></a>)</center></html>
!!! Definition
Suppose $X$ is a smooth scheme.  Write ${\mathbb Z}_{tr}(X)$ for the [[presheaf with transfers|Presheaf with transfers]] $U \mapsto Cor_k(U,X)$, where $Cor_k(U,X)$ is the group of [[finite correspondences|Finite correspondence]] from $U$ to $X$.  We write 
\[C_{\bullet}({\mathbb Z}_{tr})(X)\] for the pre-sheaf of simplicial abelian groups 
\[
U \mapsto {\mathbb Z}_{tr}(X)(U \times \Delta^{\bullet}_k),
\] and $\Delta^{i}_k$ denotes the algebraic $i$[[-simplex|Algebraic simplex]].  The associated [[normalized chain complex|Dold-Kan correspondence]] is sometimes called the [[Suslin complex]] and denoted 
\[
C_*({\mathbb Z}_{tr}(X)).
\] 
In fact, this previous complex is a chain complex of Nisnevich sheaves of abelian groups.  The __Suslin homology sheaves__ are defined by the formulae
\[
H_i^{S}(X) := H_i(C_*({\mathbb Z}_{tr}(X))),
\]
and Suslin's __algebraic singular homology groups__ are defined by the formulae 
\[
H_i^{sing}(X) := H_i(C_*({\mathbb Z}_{tr}(X))({\mathrm{Spec}\;k})).
\]

!!! Properties
The homology pre-sheaves $H_i(C_*({\mathbb Z}_{tr}(X)))$ are all ${\mathbb A}^1$[[-invariant|A¹-invariant]] (see [[Notes on motivic cohomology]] Corollary 2.19).  

The Suslin algebraic singular homology of a smooth scheme $X$ is part of the [[motivic homology|Motivic homology]] of $X$.  For example, if
\[
H_{n,0}(X) := Hom_{{\mathbf{DM}}^{eff,-}_{Nis}}({\mathbb Z}[n],{\mathbb Z}_{tr}(X)), 
\]
then Proposition 14.8 of the book ([[Notes on motivic cohomology]]) by Mazza-Weibel and Voevodsky shows that 
\[
H_{n,0}(X) = H_n^{sing}(X).
\]

If $H_i^{{\mathbb A}^1}(X)$ denotes the $i$-th ${\mathbb A}^1$[[-homology|A¹-homology]] sheaf of groups of $X$, then there is a canonical map 
\[
H_i^{{\mathbb A}^1}(X) \to H_i^{S}(X)
\]
that is not an isomorphism in general. 

!!! Examples
* The first Suslin homology sheaf of a linear algebraic group has been studied by S. Gille ([[Paper|http://www.mathematik.uni-muenchen.de/~gille/cohcycleMod.pdf]], [[Discussion|The first Suslin homology group of a split simply connected semisimple algebraic group]]).
* If $X$ is a smooth proper variety that is [[stably cellular|Stably cellular]] (e.g., a toric variety) then the identification of algebraic singular homology with motivic homology above allows one to compute the algebraic singular homology.  
<<allTags excludeLists>>
<<tabs txtMoreTab "Tags" "All Tags" TabAllTags "Miss" "Missing tiddlers" TabMoreMissing "Orph" "Orphaned tiddlers" TabMoreOrphans "Shad" "Shadowed tiddlers" TabMoreShadowed>>
<<allTags excludeLists [a-z]>>
/***
|Name:|TagglyTaggingPlugin|
|Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
|Version:|3.3.1 ($Rev: 6100 $)|
|Date:|$Date: 2008-07-27 01:42:07 +1000 (Sun, 27 Jul 2008) $|
|Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
See http://mptw.tiddlyspot.com/#TagglyTagging
***/
//{{{

merge(String.prototype,{

	parseTagExpr: function(debug) {

		if (this.trim() == "")
			return "(true)";

		var anyLogicOp = /(!|&&|\|\||\(|\))/g;
		var singleLogicOp = /^(!|&&|\|\||\(|\))$/;

		var spaced = this.
			// because square brackets in templates are no good
			// this means you can use [(With Spaces)] instead of [[With Spaces]]
			replace(/\[\(/g," [[").
			replace(/\)\]/g,"]] "). 
			// space things out so we can use readBracketedList. tricky eh?
			replace(anyLogicOp," $1 ");

		var expr = "";

		var tokens = spaced.readBracketedList(false); // false means don't uniq the list. nice one JR!

		for (var i=0;i<tokens.length;i++)
			if (tokens[i].match(singleLogicOp))
				expr += tokens[i];
			else
				expr += "tiddler.tags.contains('%0')".format([tokens[i].replace(/'/,"\\'")]); // fix single quote bug. still have round bracket bug i think

		if (debug)
			alert(expr);

		return '('+expr+')';
	}

});

merge(TiddlyWiki.prototype,{
	getTiddlersByTagExpr: function(tagExpr,sortField) {

		var result = [];

		var expr = tagExpr.parseTagExpr();

		store.forEachTiddler(function(title,tiddler) {
			if (eval(expr))
				result.push(tiddler);
		});

		if(!sortField)
			sortField = "title";

		result.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
		
		return result;
	}
});

config.taggly = {

	// for translations
	lingo: {
		labels: {
			asc:        "\u2191", // down arrow
			desc:       "\u2193", // up arrow
			title:      "title",
			modified:   "modified",
			created:    "created",
			show:       "+",
			hide:       "-",
			normal:     "normal",
			group:      "group",
			commas:     "commas",
			sitemap:    "sitemap",
			numCols:    "cols\u00b1", // plus minus sign
			label:      "Tagged as '%0':",
			exprLabel:  "Matching tag expression '%0':",
			excerpts:   "excerpts",
			descr:      "descr",
			slices:     "slices",
			contents:   "contents",
			sliders:    "sliders",
			noexcerpts: "title only",
			noneFound:  "(none)"
		},

		tooltips: {
			title:      "Click to sort by title",
			modified:   "Click to sort by modified date",
			created:    "Click to sort by created date",
			show:       "Click to show tagging list",
			hide:       "Click to hide tagging list",
			normal:     "Click to show a normal ungrouped list",
			group:      "Click to show list grouped by tag",
			sitemap:    "Click to show a sitemap style list",
			commas:     "Click to show a comma separated list",
			numCols:    "Click to change number of columns",
			excerpts:   "Click to show excerpts",
			descr:      "Click to show the description slice",
			slices:     "Click to show all slices",
			contents:   "Click to show entire tiddler contents",
			sliders:    "Click to show tiddler contents in sliders",
			noexcerpts: "Click to show entire title only"
		},

		tooDeepMessage: "* //sitemap too deep...//"
	},

	config: {
		showTaggingCounts: true,
		listOpts: {
			// the first one will be the default
			sortBy:     ["title","modified","created"],
			sortOrder:  ["asc","desc"],
			hideState:  ["show","hide"],
			listMode:   ["normal","group","sitemap","commas"],
			numCols:    ["1","2","3","4","5","6"],
			excerpts:   ["noexcerpts","excerpts","descr","slices","contents","sliders"]
		},
		valuePrefix: "taggly.",
		excludeTags: ["excludeLists","excludeTagging"],
		excerptSize: 50,
		excerptMarker: "/%"+"%/",
		siteMapDepthLimit: 25
	},

	getTagglyOpt: function(title,opt) {
		var val = store.getValue(title,this.config.valuePrefix+opt);
		return val ? val : this.config.listOpts[opt][0];
	},

	setTagglyOpt: function(title,opt,value) {
		if (!store.tiddlerExists(title))
			// create it silently
			store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),"");
		// if value is default then remove it to save space
		return store.setValue(title,
			this.config.valuePrefix+opt,
			value == this.config.listOpts[opt][0] ? null : value);
	},

	getNextValue: function(title,opt) {
		var current = this.getTagglyOpt(title,opt);
		var pos = this.config.listOpts[opt].indexOf(current);
		// a little usability enhancement. actually it doesn't work right for grouped or sitemap
		var limit = (opt == "numCols" ? store.getTiddlersByTagExpr(title).length : this.config.listOpts[opt].length);
		var newPos = (pos + 1) % limit;
		return this.config.listOpts[opt][newPos];
	},

	toggleTagglyOpt: function(title,opt) {
		var newVal = this.getNextValue(title,opt);
		this.setTagglyOpt(title,opt,newVal);
	}, 

	createListControl: function(place,title,type) {
		var lingo = config.taggly.lingo;
		var label;
		var tooltip;
		var onclick;

		if ((type == "title" || type == "modified" || type == "created")) {
			// "special" controls. a little tricky. derived from sortOrder and sortBy
			label = lingo.labels[type];
			tooltip = lingo.tooltips[type];

			if (this.getTagglyOpt(title,"sortBy") == type) {
				label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];
				onclick = function() {
					config.taggly.toggleTagglyOpt(title,"sortOrder");
					return false;
				}
			}
			else {
				onclick = function() {
					config.taggly.setTagglyOpt(title,"sortBy",type);
					config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);
					return false;
				}
			}
		}
		else {
			// "regular" controls, nice and simple
			label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];
			tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];
			onclick = function() {
				config.taggly.toggleTagglyOpt(title,type);
				return false;
			}
		}

		// hide button because commas don't have columns
		if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))
			createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");
	},

	makeColumns: function(orig,numCols) {
		var listSize = orig.length;
		var colSize = listSize/numCols;
		var remainder = listSize % numCols;

		var upperColsize = colSize;
		var lowerColsize = colSize;

		if (colSize != Math.floor(colSize)) {
			// it's not an exact fit so..
			upperColsize = Math.floor(colSize) + 1;
			lowerColsize = Math.floor(colSize);
		}

		var output = [];
		var c = 0;
		for (var j=0;j<numCols;j++) {
			var singleCol = [];
			var thisSize = j < remainder ? upperColsize : lowerColsize;
			for (var i=0;i<thisSize;i++) 
				singleCol.push(orig[c++]);
			output.push(singleCol);
		}

		return output;
	},

	drawTable: function(place,columns,theClass) {
		var newTable = createTiddlyElement(place,"table",null,theClass);
		var newTbody = createTiddlyElement(newTable,"tbody");
		var newTr = createTiddlyElement(newTbody,"tr");
		for (var j=0;j<columns.length;j++) {
			var colOutput = "";
			for (var i=0;i<columns[j].length;i++) 
				colOutput += columns[j][i];
			var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class
			wikify(colOutput,newTd);
		}
		return newTable;
	},

	createTagglyList: function(place,title,isTagExpr) {
		switch(this.getTagglyOpt(title,"listMode")) {
			case "group":  return this.createTagglyListGrouped(place,title,isTagExpr); break;
			case "normal": return this.createTagglyListNormal(place,title,false,isTagExpr); break;
			case "commas": return this.createTagglyListNormal(place,title,true,isTagExpr); break;
			case "sitemap":return this.createTagglyListSiteMap(place,title,isTagExpr); break;
		}
	},

	getTaggingCount: function(title,isTagExpr) {
		// thanks to Doug Edmunds
		if (this.config.showTaggingCounts) {
			var tagCount = config.taggly.getTiddlers(title,'title',isTagExpr).length;
			if (tagCount > 0)
				return " ("+tagCount+")";
		}
		return "";
	},

	getTiddlers: function(titleOrExpr,sortBy,isTagExpr) {
		return isTagExpr ? store.getTiddlersByTagExpr(titleOrExpr,sortBy) : store.getTaggedTiddlers(titleOrExpr,sortBy);
	},

	getExcerpt: function(inTiddlerTitle,title,indent) {
		if (!indent)
			indent = 1;

		var displayMode = this.getTagglyOpt(inTiddlerTitle,"excerpts");
		var t = store.getTiddler(title);

		if (t && displayMode == "excerpts") {
			var text = t.text.replace(/\n/," ");
			var marker = text.indexOf(this.config.excerptMarker);
			if (marker != -1) {
				return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";
			}
			else if (text.length < this.config.excerptSize) {
				return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";
			}
			else {
				return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";
			}
		}
		else if (t && displayMode == "contents") {
			return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
		}
		else if (t && displayMode == "sliders") {
			return "<slider slide>\n{{contents{\n" + t.text + "\n}}}\n</slider>";
		}
		else if (t && displayMode == "descr") {
			var descr = store.getTiddlerSlice(title,'Description');
			return descr ? " {{excerpt{" + descr  + "}}}" : "";
		}
		else if (t && displayMode == "slices") {
			var result = "";
			var slices = store.calcAllSlices(title);
			for (var s in slices)
				result += "|%0|<nowiki>%1</nowiki>|\n".format([s,slices[s]]);
			return result ? "\n{{excerpt excerptIndent{\n" + result  + "}}}" : "";
		}
		return "";
	},

	notHidden: function(t,inTiddler) {
		if (typeof t == "string") 
			t = store.getTiddler(t);
		return (!t || !t.tags.containsAny(this.config.excludeTags) ||
				(inTiddler && this.config.excludeTags.contains(inTiddler)));
	},

	// this is for normal and commas mode
	createTagglyListNormal: function(place,title,useCommas,isTagExpr) {

		var list = config.taggly.getTiddlers(title,this.getTagglyOpt(title,"sortBy"),isTagExpr);

		if (this.getTagglyOpt(title,"sortOrder") == "desc")
			list = list.reverse();

		var output = [];
		var first = true;
		for (var i=0;i<list.length;i++) {
			if (this.notHidden(list[i],title)) {
				var countString = this.getTaggingCount(list[i].title);
				var excerpt = this.getExcerpt(title,list[i].title);
				if (useCommas)
					output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);
				else
					output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\n");

				first = false;
			}
		}

		return this.drawTable(place,
			this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),
			useCommas ? "commas" : "normal");
	},

	// this is for the "grouped" mode
	createTagglyListGrouped: function(place,title,isTagExpr) {
		var sortBy = this.getTagglyOpt(title,"sortBy");
		var sortOrder = this.getTagglyOpt(title,"sortOrder");

		var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);

		if (sortOrder == "desc")
			list = list.reverse();

		var leftOvers = []
		for (var i=0;i<list.length;i++)
			leftOvers.push(list[i].title);

		var allTagsHolder = {};
		for (var i=0;i<list.length;i++) {
			for (var j=0;j<list[i].tags.length;j++) {

				if (list[i].tags[j] != title) { // not this tiddler

					if (this.notHidden(list[i].tags[j],title)) {

						if (!allTagsHolder[list[i].tags[j]])
							allTagsHolder[list[i].tags[j]] = "";

						if (this.notHidden(list[i],title)) {
							allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"
										+ this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\n";

							leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers

						}
					}
				}
			}
		}

		var allTags = [];
		for (var t in allTagsHolder)
			allTags.push(t);

		var sortHelper = function(a,b) {
			if (a == b) return 0;
			if (a < b) return -1;
			return 1;
		};

		allTags.sort(function(a,b) {
			var tidA = store.getTiddler(a);
			var tidB = store.getTiddler(b);
			if (sortBy == "title") return sortHelper(a,b);
			else if (!tidA && !tidB) return 0;
			else if (!tidA) return -1;
			else if (!tidB) return +1;
			else return sortHelper(tidA[sortBy],tidB[sortBy]);
		});

		var leftOverOutput = "";
		for (var i=0;i<leftOvers.length;i++)
			if (this.notHidden(leftOvers[i],title))
				leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\n";

		var output = [];

		if (sortOrder == "desc")
			allTags.reverse();
		else if (leftOverOutput != "")
			// leftovers first...
			output.push(leftOverOutput);

		for (var i=0;i<allTags.length;i++)
			if (allTagsHolder[allTags[i]] != "")
				output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\n" + allTagsHolder[allTags[i]]);

		if (sortOrder == "desc" && leftOverOutput != "")
			// leftovers last...
			output.push(leftOverOutput);

		return this.drawTable(place,
				this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),
				"grouped");

	},

	// used to build site map
	treeTraverse: function(title,depth,sortBy,sortOrder,isTagExpr) {

		var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);

		if (sortOrder == "desc")
			list.reverse();

		var indent = "";
		for (var j=0;j<depth;j++)
			indent += "*"

		var childOutput = "";

		if (depth > this.config.siteMapDepthLimit)
			childOutput += indent + this.lingo.tooDeepMessage;
		else
			for (var i=0;i<list.length;i++)
				if (list[i].title != title)
					if (this.notHidden(list[i].title,this.config.inTiddler))
						childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder,false);

		if (depth == 0)
			return childOutput;
		else
			return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\n" + childOutput;
	},

	// this if for the site map mode
	createTagglyListSiteMap: function(place,title,isTagExpr) {
		this.config.inTiddler = title; // nasty. should pass it in to traverse probably
		var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"),isTagExpr);
		return this.drawTable(place,
				this.makeColumns(output.split(/(?=^\*\[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic
				"sitemap"
				);
	},

	macros: {
		tagglyTagging: {
			handler: function (place,macroName,params,wikifier,paramString,tiddler) {
				var parsedParams = paramString.parseParams("tag",null,true);
				var refreshContainer = createTiddlyElement(place,"div");

				// do some refresh magic to make it keep the list fresh - thanks Saq
				refreshContainer.setAttribute("refresh","macro");
				refreshContainer.setAttribute("macroName",macroName);

				var tag = getParam(parsedParams,"tag");
				var expr = getParam(parsedParams,"expr");

				if (expr) {
					refreshContainer.setAttribute("isTagExpr","true");
					refreshContainer.setAttribute("title",expr);
					refreshContainer.setAttribute("showEmpty","true");
				}
				else {
					refreshContainer.setAttribute("isTagExpr","false");
					if (tag) {
        				refreshContainer.setAttribute("title",tag);
						refreshContainer.setAttribute("showEmpty","true");
					}
					else {
        				refreshContainer.setAttribute("title",tiddler.title);
						refreshContainer.setAttribute("showEmpty","false");
					}
				}
				this.refresh(refreshContainer);
			},

			refresh: function(place) {
				var title = place.getAttribute("title");
				var isTagExpr = place.getAttribute("isTagExpr") == "true";
				var showEmpty = place.getAttribute("showEmpty") == "true";
				removeChildren(place);
				addClass(place,"tagglyTagging");
				var countFound = config.taggly.getTiddlers(title,'title',isTagExpr).length
				if (countFound > 0 || showEmpty) {
					var lingo = config.taggly.lingo;
					config.taggly.createListControl(place,title,"hideState");
					if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
						createTiddlyElement(place,"span",null,"tagglyLabel",
								isTagExpr ? lingo.labels.exprLabel.format([title]) : lingo.labels.label.format([title]));
						config.taggly.createListControl(place,title,"title");
						config.taggly.createListControl(place,title,"modified");
						config.taggly.createListControl(place,title,"created");
						config.taggly.createListControl(place,title,"listMode");
						config.taggly.createListControl(place,title,"excerpts");
						config.taggly.createListControl(place,title,"numCols");
						config.taggly.createTagglyList(place,title,isTagExpr);
						if (countFound == 0 && showEmpty)
							createTiddlyElement(place,"div",null,"tagglyNoneFound",lingo.labels.noneFound);
					}
				}
			}
		}
	},

	// todo fix these up a bit
	styles: [
"/*{{{*/",
"/* created by TagglyTaggingPlugin */",
".tagglyTagging { padding-top:0.5em; }",
".tagglyTagging li.listTitle { display:none; }",
".tagglyTagging ul {",
"	margin-top:0px; padding-top:0.5em; padding-left:2em;",
"	margin-bottom:0px; padding-bottom:0px;",
"}",
".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",
".tagglyTagging table { margin:0px; padding:0px; }",
".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",
".tagglyTagging .button, .tagglyTagging .hidebutton {",
"	color:[[ColorPalette::TertiaryLight]]; font-size:90%;",
"	border:0px; padding-left:0.3em;padding-right:0.3em;",
"}",
".tagglyTagging .button:hover, .hidebutton:hover, ",
".tagglyTagging .button:active, .hidebutton:active  {",
"	border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",
"}",
".selected .tagglyTagging .button { visibility:visible; }",
".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",
".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",
".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",
".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",
".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",
".tagglyTagging ul ul li {margin-left:0.5em; }",
".editLabel { font-size:90%; padding-top:0.5em; }",
".tagglyTagging .commas { padding-left:1.8em; }",
"/* not technically tagglytagging but will put them here anyway */",
".tagglyTagged li.listTitle { display:none; }",
".tagglyTagged li { display: inline; font-size:90%; }",
".tagglyTagged ul { margin:0px; padding:0px; }",
".excerpt { color:[[ColorPalette::TertiaryDark]]; }",
".excerptIndent { margin-left:4em; }",
"div.tagglyTagging table,",
"div.tagglyTagging table tr,",
"td.tagglyTagging",
" {border-style:none!important; }",
".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",
"  margin-bottom:0.5em; }",
".tagglyTagging .indent1  { margin-left:3em;  }",
".tagglyTagging .indent2  { margin-left:4em;  }",
".tagglyTagging .indent3  { margin-left:5em;  }",
".tagglyTagging .indent4  { margin-left:6em;  }",
".tagglyTagging .indent5  { margin-left:7em;  }",
".tagglyTagging .indent6  { margin-left:8em;  }",
".tagglyTagging .indent7  { margin-left:9em;  }",
".tagglyTagging .indent8  { margin-left:10em; }",
".tagglyTagging .indent9  { margin-left:11em; }",
".tagglyTagging .indent10 { margin-left:12em; }",
".tagglyNoneFound { margin-left:2em; color:[[ColorPalette::TertiaryMid]]; font-size:90%; font-style:italic; }",
"/*}}}*/",
		""].join("\n"),

	init: function() {
		merge(config.macros,this.macros);
		config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;
		store.addNotification("TagglyTaggingStyles",refreshStyles);
	}
};

config.taggly.init();

//}}}

/***
InlineSlidersPlugin
By Saq Imtiaz
http://tw.lewcid.org/sandbox/#InlineSlidersPlugin

// syntax adjusted to not clash with NestedSlidersPlugin
// added + syntax to start open instead of closed

***/
//{{{
config.formatters.unshift( {
	name: "inlinesliders",
	// match: "\\+\\+\\+\\+|\\<slider",
	match: "\\<slider",
	// lookaheadRegExp: /(?:\+\+\+\+|<slider) (.*?)(?:>?)\n((?:.|\n)*?)\n(?:====|<\/slider>)/mg,
	lookaheadRegExp: /(?:<slider)(\+?) (.*?)(?:>)\n((?:.|\n)*?)\n(?:<\/slider>)/mg,
	handler: function(w) {
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {
			var btn = createTiddlyButton(w.output,lookaheadMatch[2] + " "+"\u00BB",lookaheadMatch[2],this.onClickSlider,"button sliderButton");
			var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");
			panel.style.display = (lookaheadMatch[1] == '+' ? "block" : "none");
			wikify(lookaheadMatch[3],panel);
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
   },
   onClickSlider : function(e) {
		if(!e) var e = window.event;
		var n = this.nextSibling;
		n.style.display = (n.style.display=="none") ? "block" : "none";
		return false;
	}
});

//}}}

A list of known bugs regarding the current implementation of LaTeX in Tiddlywiki.
The ${\mathbb A}^1$-fundamental group of ${\mathbb P}^1$ is the free [[strongly|Strongly A¹-invariant]] ${\mathbb A}^1$-invariant sheaf of groups generated by ${\mathbb G}_m$, and is denoted by $F_{{\mathbb A}^1}(1)$. 

''Theorem'' (Morel): There is a canonical central extension
\[
1 \to \underline{{\mathbf K}}^{MW}_2 \to F_{{\mathbb A}^1}(1) \to {\mathbb G}_m \to 1.
\]

//Sketch of Proof.// Let's indicate how to construct the exact sequence in question.  Consider the standard ${\mathbb G}_m$-torsor ${\mathbb A}^2 - 0 \to {\mathbb P}^1$.  By ${\mathbb A}^1$[[-covering space theory|A¹-covering space]], this torsor is an ${\mathbb A}^1$-cover.  This gives rise to an exact sequence of the form
\[
1 \to \pi_1^{{\mathbb A}^1}({\mathbb A}^2 \setminus 0) \to F_{{\mathbb A}^1}(1) \to {\mathbb G}_m \to 1.
\]
Since ${\mathbb G}_m$ is fibrant and ${\mathbb A}^1$-local, this also follows from the long exact sequence in homotopy groups of a fibration.  

Next, we showed in the discussion of [[motivic spheres|Motivic sphere]] that ${\mathbb A}^2 \setminus 0$ is ${\mathbb A}^1$[[-weakly equivalent|A¹-weak equivalence]] to the [[join|Join]] of ${\mathbb G}_m$ with itself.  In fact, we showed that there is a canonical map 
\[
\Sigma^1_s {\mathbb G}_m \wedge {\mathbb G}_m \to {\mathbb A}^2 \setminus 0
\]
that is an ${\mathbb A}^1$-weak equivalence.  Thus, we deduce that $\pi_1^{{\mathbb A}^1}({\mathbb A}^2 \setminus 0)$ is the [[free strongly|Free strongly A¹-invariant sheaf of groups]] ${\mathbb A}^1$-invariant sheaf of groups generated by ${\mathbb G}_m \wedge {\mathbb G}_m$.  

For any group $G$, there is a canonical map ${\mathbb R}\Omega^1_s BG$ that is a weak equivalence of simplicial sheaves (where ${\mathbb R}\Omega^1_s$ means ``take the loop space of a [[simplicially fibrant|Simplicially fibrant]] model for $BG$).  There is a canonical projection map $SL_2 \to {\mathbb A}^2 \setminus 0$ that is Zariski locally trivial with ${\mathbb A}^1$-fibers.  Thus, up to ${\mathbb A}^1$-weak equivalence, ${\mathbb A}^2 \setminus 0$.  Using this, we can deduce that $\pi_1^{{\mathbb A}^1}({\mathbb A}^2 \setminus 0)$ is in fact an abelian group.  A strongly ${\mathbb A}^1$-invariant sheaf of abelian groups is known to be strictly ${\mathbb A}^1$-invariant by a result of Morel.  Thus, we [[conclude|Free strictly A¹-invariant sheaf of groups]] that 
\[
F_{{\mathbb A}^1}({\mathbb G}_m \wedge {\mathbb G}_m) = {\mathbb Z}_{{\mathbb A}^1,\bullet}({\mathbb G}_m \wedge {\mathbb G}_m);
\]
this latter sheaf can be taken as a definition for the sheaf $\underline{{\mathbf K}}^{MW}_2$ of [[Milnor-Witt K-theory]] groups.  

The canonical map ${\mathbb G}_m \to F_{{\mathbb A}^1}({\mathbb G}_m)$ gives rise to a splitting of the above exact sequence.  Thus, there is a split short exact sequence of the form
\[
1 \to \underline{{\mathbf K}}^{MW}_2 \to F_{{\mathbb A}^1}(1) \to {\mathbb G}_m \to 1.
\]
To see that this extension is central, we have to work a bit harder.
!!! Definition
Suppose $S$ is a Noetherian base scheme of finite Krull dimension.  Let $\Delta^n_{{\mathbb A}^1}$ denote the algebraic $n$-[[simplex|Algebraic simplex]] over $S$, i.e., the base-change of $\mathrm{Spec} {\mathbb Z}[x_0,\ldots,x_{n+1}]/\sum_i x_i = 1\;$ to $S$.  Given a [[simplicial space|Motivic space]] ${\mathcal X}$, define $Sing^{{\mathbb A}^1}_{\bullet}({\mathcal X})$ to be the diagonal of the bi-simplicial set $\underline{Hom}(\Delta^{\bullet}_{{\mathbb A}^1},{\mathcal X})$.  Thus, we have
\[
Sing^{{\mathbb A}^1}_{n}({\mathcal X}) := Hom(\Delta^n_{{\mathbb A}^1},{\mathcal X}_n),
\]
where ${\mathcal X}_n$ denotes the sheaf of $n$-simplices of ${\mathcal X}$. There is a canonical natural transformation $s: Id \to Sing^{{\mathbb A}^1}_{\bullet}$ corresponding to the structure morphism $\Delta^{\bullet}_{{\mathbb A}^1} \to S$.  

!!! Properties
''Theorem'': The pair $(Sing^{{\mathbb A}^1}_*,s)$ satisfy the following properties. 
# The functor $Sing^{{\mathbb A}^1}_*$ commutes with formation of small limits.
# The functor $Sing^{{\mathbb A}^1}_*$ takes the morphism $S \to \Delta^1_{{\mathbb A}^1}$ to a [[simplicial weak equivalence|Simplicial weak equivalence]]. 
# For any ${\mathcal X}$, the canonical map ${\mathcal X} \to Sing^{{\mathbb A}^1}_*({\mathcal X})$ induced by $s$ is a monomorphism and an ${\mathbb A}^1$[[-weak equivalence|A¹-weak equivalence]] (i.e., an ${\mathbb A}^1$-[[cofibration|A¹-cofibration]]).  
# The functor $Sing^{{\mathbb A}^1}_*$ takes ${\mathbb A}^1$[[-fibrations|A¹-fibration]] to ${\mathbb A}^1$-fibrations.  

!!! Example
In particular if $X$ is the simplicial space associated with a smooth $S$-scheme, then $X_n = X$, so $Sing^{{\mathbb A}^1}_{\bullet}(X)$ has as sheaf of $n$-simplices the (Nisnevich) sheaf associated with the pre-sheaf
\[
U \mapsto Hom(\Delta^n_{{\mathbb A}^1} \times_S U,X).  
\]
<part Definition>
!!! Definition
Let $S$ be a Noetherian base scheme and suppose $X$ is a smooth $S$-scheme.  If $\nu: {\mathcal E} \to X$ is a geometric vector bundle, the __Thom space__ of ${\mathcal E}$ is the [[pointed space|Motivic space]] 
\[
Th(\nu) := {\mathcal E}/{\mathcal E} - i(X),
\]  
where $i: X \to {\mathcal E}$ denotes the zero section of $\nu$.</part>

!!! Properties
$\bullet$ Given $S$-schemes $X_1$ and $X_2$, and vector bundles $\nu_1: {\mathcal E}_1 \to X_1$ and $
\nu_2: {\mathcal E}_2 \to X_2$, there is a canonical isomorphism of [[pointed spaces|Motivic space]]
\[
Th(\nu_1 \times \nu_2) = Th(\nu_1) \wedge Th(\nu_2)
\]

$\bullet$ If $\epsilon$ is the trivial line bundle over $X$, then $Th(\epsilon^{\oplus n}) \cong {{\mathbb P}^1}^{\wedge n} \wedge X_+\;$ (here ${{\mathbb P}^1}^{\wedge n}$ is a [[motivic sphere|Motivic sphere]]).  

$\bullet$ If ${\mathbb P}({\mathcal E}) \to X$ is the projectivization of a vector bundle $\nu: {\mathcal E} \to {\mathcal X}$, then the canonical morphism
\[
{\mathbb P}({\mathcal E} \oplus \epsilon)/{\mathbb P}({\mathcal E}) \to Th(\nu \oplus \epsilon)
\]
is an ${\mathbb A}^1$[[-weak equivalence|A¹-weak equivalence]].  

!!! Homotopy purity
The fundamental result about Thom spaces is the [[Thom isomorphism theorem|Homotopy purity theorem]], which is also called the homotopy purity theorem.  See [[A¹-homotopy theory of schemes]] Section 3 Theorem 2.23.  

''Theorem'': (Homotopy purity) Let $i: Z \to X$ be a closed embedding of smooth $S$-schemes.  Denote by 
\[
\nu_{Z/X}: {\mathcal N}_{Z/X} \to Z\] the normal bundle to $i$.  There is a canonical pointed ${\mathbb A}^1$[[-weak equivalence|A¹-weak equivalence]]
\[
X/(X - i(Z)) \cong Th(\nu_{Z/X}).  
\]
/***
|Name|TiddlyLockPlugin|
|Source|http://www.minormania.com/tiddlylock/tiddlylock.html|
|Version|1.0.4|
|TiddlyWiki Core Version|2.2.4|
|Author|Richard Hobbis|
|License|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|Type|plugin|
|Overrides|config.macros.newTiddler.onClickNewTiddler()<<br>>config.commands.cancelTiddler.handler()<<br>>config.commands.deleteTiddler.handler<<br>>config.commands.editTiddler.handler()<<br>>config.commands.saveTiddler.handler()<<br>>saveChanges()<<br>>checkUnsavedChanges()|
|Description|Automatically locks and unlocks the TiddlyWiki as required, allowing multiple users to edit the TiddlyWiki without fear of overwriting other users' changes.|
!!!Usage
<<<
Simply import TiddlyLockPlugin into your TiddlyWiki!
<<<
!!!Installation
<<<
Import (or copy/paste) ''this tiddler'' into your TiddlyWiki and make sure it's tagged with <<tag systemConfig>>. Reload your TiddlyWiki to enable TiddlyLock.
<<<
!!!Configuration
<<<
None required!
<<<
!!!Revision History
<<<
''2007.06.22 [1.0.4]'' Added locking on 'new tiddler' which also traps 'new journal'. Tweaked messages.
''2007.06.20 [1.0.3]'' Fixed an issue that occurred when a user navigated away from the TiddlyWiki without saving outstanding changes.
''2007.05.10 [1.0.2]'' Implemented a timestamp to track the last update time. This fixes the multi-browser edit issue and also removes the need for a password.
''2007.05.08 [1.0.1]'' Function overrides are now done using apply() ensuring clean upgrades (thanks Martin!)
''2007.05.01 [1.0.0]'' Initial Release
<<<
!!!Known Issues
<<<
*Monkey Pirate TiddlyWiki (MPTW) adds a ''disable'' button to the toolbar for systemConfig tiddlers. This button is available even when the TW is marked as readOnly and therefore it's possible for two users to disable/enable plugins at the same time. In this case, whoever saves the TW last will 'win' and their changes will be saved. Note that this is only an issue if there are no other unsaved changes in both browsers - TiddlyLock still handles all other changes.
<<<
!!!Credits
<<<
This feature was developed by Richard Hobbis (rhobbis [at] hotmail [dot] com).
<<<
!!!Code
***/

//{{{
// Convert a date to UTC YYYYMMDDHHMMSSMMM string format
// This is the same as the builtin function convertToYYYYMMDDHHMMSSMMM() but
// without the '.' in the middle - this allows simple date comparisons
Date.prototype.TLConvertToYYYYMMDDHHMMSSMMM = function()
{
  return(String.zeroPad(this.getUTCFullYear(),4)
    + String.zeroPad(this.getUTCMonth()+1,2)
    + String.zeroPad(this.getUTCDate(),2)
    + String.zeroPad(this.getUTCHours(),2)
    + String.zeroPad(this.getUTCMinutes(),2)
    + String.zeroPad(this.getUTCSeconds(),2)
    + String.zeroPad(this.getUTCMilliseconds(),4));
}

// namespace for TiddlyLock
TiddlyLock = {};

// Load/Last Update timestamp
TiddlyLock.TimeStamp = new Date().TLConvertToYYYYMMDDHHMMSSMMM();

// Lockfile
TiddlyLock.LockPath = '';
TiddlyLock.OldLockData = '';
TiddlyLock.LockData = '';

// define messages
TiddlyLock.Msg = {
  Locked: 'File locked',
  Unlocked: 'File unlocked',
  LockFailed: 'Failed to lock file',
  UnlockFailed: 'Failed to unlock file',
  ReadOnly: 'Now in Read-Only mode.',
  Changed: 'This file has been changed by someone else.',
  Reload: 'Reload this file before editing.'};

// create/update the lock file
function TLSave(timeStamp,lockedBy)
{
  var lockedText='';
  if (lockedBy!='')
  {
    lockedText=timeStamp+'##'+lockedBy;
  }
  else lockedText=timeStamp+'##';
    var lockSave=saveFile(TiddlyLock.LockPath,lockedText);
  TiddlyLock.TimeStamp = timeStamp;
  return false;
}


// Create/update the lock file to prevent other users from editing the TW
function TLLock()
{
  clearMessage();
  lockSave = TLSave(new Date().TLConvertToYYYYMMDDHHMMSSMMM(),config.options.txtUserName);
  displayMessage(TiddlyLock.Msg.Locked,'');
  return false;
}


// Clear the lock file if necessary, but only if I have it locked, setting the
// timestamp in the lockfile to the specified value
function TLUnlock(timeStamp)
{
  if ((store && store.isDirty && !store.isDirty())
    && (story && story.areAnyDirty && !story.areAnyDirty())
    && TLIsLocked()
    && TLIsLockedByMe())
  {
    lockSave=TLSave(timeStamp,'','');
    displayMessage(TiddlyLock.Msg.Unlocked,'');
    TiddlyLock.OldLockData = TiddlyLock.LockData;
  }
  return false;
}

// Get the contents of the lock file, if it exists
function TLLockPath()
{
  var lockPath,p;
  var originalPath=document.location.toString();
  var localPath=getLocalPath(originalPath);
  if((p=localPath.lastIndexOf('.')) != -1)
    lockPath=localPath.substr(0,p) + '.lck';
  else lockPath=localPath + '.lck';
    return lockPath;
}


// Get the contents of the lock file, if it exists
function TLLockData()
{
  TiddlyLock.LockPath = TLLockPath();
  return loadFile(TiddlyLock.LockPath);
}

// Get the contents of the lock file, if it exists
function TLIsLocked()
{
  TiddlyLock.LockData = TLLockData();
  if (TiddlyLock.LockData
      && ( TLLockedBy(TiddlyLock.LockData)!='' // someone has it locked
         || TiddlyLock.TimeStamp < TLLockedTimeStamp(TiddlyLock.LockData) // changed by someone else but not currently locked
         )
     )
    return true;
  else
    return false;
}


// check if locked by me
function TLIsLockedByMe()
{
  if(TiddlyLock.LockData == TiddlyLock.TimeStamp+'##' + config.options.txtUserName)
    return true;
  else
    return false;
}


// returns just the timestamp portion of the supplied lock file contents
function TLLockedTimeStamp(lockData)
{
  if(lockData)
    return lockData.split('##')[0];
  else
    return '';
}


// returns just the username portion of the supplied lock file contents
function TLLockedBy(lockData)
{
  if(lockData)
    return lockData.split('##')[1];
  else
    return '';
}

// display a message if locked or changed
function TLChangesAllowed()
{
  if(TLIsLocked() && !TLIsLockedByMe())
  {
//    if(!readOnly)
    {
      readOnly=true;
      if(TLLockedBy(TiddlyLock.LockData))
      {
        displayMessage(TiddlyLock.Msg.Locked+' by '+TLLockedBy(TiddlyLock.LockData));
        alert(TiddlyLock.Msg.Locked+' by '+TLLockedBy(TiddlyLock.LockData)+'. '+TiddlyLock.Msg.ReadOnly);
      }
      else
      {
        displayMessage(TiddlyLock.Msg.Changed+' '+TiddlyLock.Msg.Reload);
        alert(TiddlyLock.Msg.Changed+' '+TiddlyLock.Msg.Reload);
      }
    }
    return false;
  }
  else
    return true;
}


//*********************************************
// OVERRIDE STANDARD FUNCTIONS
//*********************************************

//
// OVERRIDE onClickNewTiddler()
//
TiddlyLock.onClickNewTiddler = config.macros.newTiddler.onClickNewTiddler;
config.macros.newTiddler.onClickNewTiddler = function(event,src,title)
{
  if (TLChangesAllowed())
  {
    TiddlyLock.OldLockData = TiddlyLock.LockData;
    TLLock();
    var ret = TiddlyLock.onClickNewTiddler.apply(this,arguments);
    return ret;
  }
}

//
// OVERRIDE checkUnsavedChanges()
//
TiddlyLock.checkUnsavedChanges = checkUnsavedChanges;
checkUnsavedChanges = function(event,src,title)
{
  var ret = TiddlyLock.checkUnsavedChanges.apply(this,arguments);
  if(TLIsLocked() && TLIsLockedByMe())
    lockSave=TLSave(TLLockedTimeStamp(TiddlyLock.OldLockData),'','');
  return ret;
}


//
// OVERRIDE cancelTiddler()
//
TiddlyLock.cancelTiddler = config.commands.cancelTiddler.handler;
config.commands.cancelTiddler.handler = function(event,src,title)
{
  var ret = TiddlyLock.cancelTiddler.apply(this,arguments);
  TLUnlock(TLLockedTimeStamp(TiddlyLock.OldLockData));
  return ret;
}

//
// OVERRIDE deleteTiddler()
//
TiddlyLock.deleteTiddler = config.commands.deleteTiddler.handler;
config.commands.deleteTiddler.handler = function(event,src,title)
{
  if (TLChangesAllowed())
  {
    TiddlyLock.OldLockData = TiddlyLock.LockData;
    TLLock();
    var ret = TiddlyLock.deleteTiddler.apply(this,arguments);
    return ret;
  }
}

//
// OVERRIDE editTiddler()
//
TiddlyLock.editTiddler = config.commands.editTiddler.handler;
config.commands.editTiddler.handler = function(event,src,title)
{
  if (TLChangesAllowed())
  {
    TiddlyLock.OldLockData = TiddlyLock.LockData;
    TLLock();
  }
  var ret = TiddlyLock.editTiddler.apply(this,arguments);
  return ret;
}

//
// OVERRIDE saveChanges()
//
TiddlyLock.saveChanges = saveChanges;
saveChanges = function(onlyIfDirty)
{
  if(TLChangesAllowed())
  {
    var ret = TiddlyLock.saveChanges.apply(this,arguments);
    TLUnlock(new Date().TLConvertToYYYYMMDDHHMMSSMMM());
    return ret;
  }
  else
    return false;
}

//
// OVERRIDE saveTiddler()
//
TiddlyLock.saveTiddler= config.commands.saveTiddler.handler;
config.commands.saveTiddler.handler=function(event,src,title)
{
  var ret = TiddlyLock.saveTiddler.apply(this,arguments);
  TLUnlock(new Date().TLConvertToYYYYMMDDHHMMSSMMM());
  return ret;
}

//}}}
/***
|Name:|ToggleTagPlugin|
|Description:|Makes a checkbox which toggles a tag in a tiddler|
|Version:|3.1.0 ($Rev: 4907 $)|
|Date:|$Date: 2008-05-13 03:15:46 +1000 (Tue, 13 May 2008) $|
|Source:|http://mptw.tiddlyspot.com/#ToggleTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Usage
{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}
* TagName - the tag to be toggled, default value "checked"
* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler
* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'
(If a parameter is '.' then the default will be used)
* TouchMod flag - if non empty then touch the tiddlers mod date. Note, can set config.toggleTagAlwaysTouchModDate to always touch mod date
!!Examples
|Code|Description|Example|h
|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|
|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|
|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|
|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|
|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|
!!Notes
* If TiddlerName doesn't exist it will be silently created
* Set label to '-' to specify no label
* See also http://mgtd-alpha.tiddlyspot.com/#ToggleTag2
!!Known issues
* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing
* Should convert to use named params
***/
//{{{

if (config.toggleTagAlwaysTouchModDate == undefined) config.toggleTagAlwaysTouchModDate = false;

merge(config.macros,{

	toggleTag: {

		createIfRequired: true,
		shortLabel: "[[%0]]",
		longLabel: "[[%0]] [[%1]]",

		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			var tiddlerTitle = tiddler ? tiddler.title : '';
			var tag   = (params[0] && params[0] != '.') ? params[0] : "checked";
			var title = (params[1] && params[1] != '.') ? params[1] : tiddlerTitle;
			var defaultLabel = (title == tiddlerTitle ? this.shortLabel : this.longLabel);
			var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;
			var touchMod = (params[3] && params[3] != '.') ? params[3] : "";
			label = (label == '-' ? '' : label); // dash means no label
			var theTiddler = (title == tiddlerTitle ? tiddler : store.getTiddler(title));
			var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {
				if (!store.tiddlerExists(title)) {
					if (config.macros.toggleTag.createIfRequired) {
						var content = store.getTiddlerText(title); // just in case it's a shadow
						store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);
					}
					else 
						return false;
				}
				if ((touchMod != "" || config.toggleTagAlwaysTouchModDate) && theTiddler)
						theTiddler.modified = new Date();
				store.setTiddlerTag(title,this.checked,tag);
				return true;
			});
		}
	}
});

//}}}

/***
Description: Contains the stuff you need to use Tiddlyspot
Note, you also need UploadPlugin, PasswordOptionPlugin and LoadRemoteFileThroughProxy
from http://tiddlywiki.bidix.info for a complete working Tiddlyspot site.
***/
//{{{

// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'a1homotopy';

// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)
window.showBackstage = true; // show backstage too

// disable autosave in d3
if (window.location.protocol != "file:")
	config.options.chkGTDLazyAutoSave = false;

// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
	SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';
	SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");
	OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");
	DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[WelcomeToTiddlyspot]] ");
	MainMenu = MainMenu.replace(/^/,"[[WelcomeToTiddlyspot]] ");
}

// create some shadow tiddler content
merge(config.shadowTiddlers,{

'WelcomeToTiddlyspot':[
 "This document is a ~TiddlyWiki from tiddlyspot.com.  A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below.  Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",
 "<<tiddler TspotControls>>",
 "See also GettingStarted.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the \"save to web\" button in the column on the right.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick.  You can make changes and save them locally without being connected to the Internet.  When you're ready to sync up again, just click \"upload\" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]].  Also visit [[TiddlyWiki.org|http://tiddlywiki.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help.  If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site.  Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."
].join("\n"),

'TspotControls':[
 "| tiddlyspot password:|<<option pasUploadPassword>>|",
 "| username (for signing posts):|<<option txtUserName>>|",
 "| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<br>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",
 "| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[blog|http://tiddlyspot.blogspot.com/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"
].join("\n"),

'TspotSidebar':[
 "<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"
].join("\n"),

'TspotOptions':[
 "tiddlyspot password:",
 "<<option pasUploadPassword>>",
 ""
].join("\n")

});
//}}}
!!! Definition
A [[universe|Universe]] is a non-empty set $U$ having the following properties. 
# If $x \in U$ and $y \in x$ then $y \in U$.  
# If $x$ and $y$ are elements of $U$, then the set $\{ x,y\}$ is an element of $U$.
# If $x \in U$, then the power set ${\mathcal P}(x) \in U$.  
# If $I \in U$ is an index set, and we have a collection $\{ x_i \}_{i \in I}$ where each $x_i \in U$, then $\cup_{i \in I} x_i \in U$.  
!!! Statement
Suppose $S$ is a Noetherian base scheme of finite Krull dimension.  Given an integer $n \geq 0$, we say that the //unstable $n$-${\mathbb A}^1$-connectivity property holds over $S$// if given a [[pointed (simplicial) space|Motivic space]] $({\mathcal X},x)$, and a pointed ${\mathbb A}^1$-weak equivalence $f: {\mathcal X} \to {\mathcal X}'$, where $({\mathcal X}',x')$ is an ${\mathbb A}^1$[[-local|A¹-local]] space, the assumption that ${\mathcal X}$ is simplicially $n$[[-connected|Simplicially n-connected]] implies that ${\mathcal X}'$ is simplicially $n$-connected.  If the unstable $n$-${\mathbb A}^1$-connectivity property holds over $S$ for every $n \geq 0$, we say that the //unstable ${\mathbb A}^1$-connectivity holds over $S$.// 

Another way of stating this result is ``simplicial $n$-connectedness implies $n$-${\mathbb A}^1$-connectedness" since the simplicial homotopy groups of an ${\mathbb A}^1$-local space are precisely the ${\mathbb A}^1$[[-homotopy groups|A¹-homotopy groups]].  

!!! Results
The following result is sometimes known as the //unstable $0$-${\mathbb A}^1$-connectivity theorem.//

''Theorem'' (Morel, Voevodsky): The unstable $0$-${\mathbb A}^1$-connectivity property holds over an arbitrary Noetherian base scheme of finite Krull dimension.  

//Proof.// This result is proven in [[A¹-homotopy theory of schemes|MoVo99]] Section 2 Corollary 3.22 and deduced from the existence of an appropriately explicit ${\mathbb A}^1$[[-resolution functor|A¹-resolution functor]].  In fact, this result proves that if ${\mathcal X}$ is a simplicial space and $f: {\mathcal X} \to {\mathcal X}'$ is an ${\mathbb A}^1$-weak equivalence with ${\mathcal X}'$ an ${\mathbb A}^1$-local space, then the induced map on $\pi_0$ is surjective.  

The unstable ${\mathbb A}^1$-connectivity property doesn not hold over base schemes of dimension $d \geq 2$.  However, one does have the following result.  

''Theorem'' (Morel):  For every integer $n \geq 0$, the unstable $n$-${\mathbb A}^1$-connectivity property holds over a field.  

//Proof.// One can deduce this result formally from the assertion that for any [[pointed space|Motivic space]] $({\mathcal X},x)$, the sheaf of groups $\pi_1^{{\mathbb A}^1}({\mathcal X},x)$ is strongly ${\mathbb A}^1$-[[invariant|Strongly A¹-invariant]].
Unstalbe ${\mathbb A}^1$-homotopy theory is the study of the unstable ${\mathbb A}^1$-homotopy category.  As mentioned [[above|Outlines of the theory]], the foundational reference for the construction of the unstable ${\mathbb A}^1$-homotopy category is the paper
*  ${\mathbb A}^1$-homotopy theory of schemes, by F. Morel and V. Voevodsky ([[Paper at NUMDAM|http://www.numdam.org/numdam-bin/recherche?h=nc&id=PMIHES_1999__90__45_0&format=complete]],[[Discussion|A¹-homotopy theory of schemes]]).
While this paper has a table of contents, it lacks a detailed introduction, so [[here|A¹-homotopy theory of schemes]] is some discussion of the contents.  Furthermore, the internal referencing in the published version of this paper is incorrect (and often very confusing), so it is useful to have a [[preprint version|http://www.math.uiuc.edu/K-theory/0305/]] of the paper handy.  For a more introductory treatement of the unstable ${\mathbb A}^1$-homotopy category the reader can consult the Trieste lecture notes:
* An introduction to ${\mathbb A}^1$-homotopy theory, by F. Morel ([[Paper in .ps format|http://www.mathematik.uni-muenchen.de/~morel/lectureTrieste.ps]],[[Discussion|An Introduction to A¹-homotopy theory]]).
Yet another presentation of aspects of unstable ${\mathbb A}^1$-homotopy theory together with some discussion of the relationship with [[Voevodsky's derived category of mixed motives|Voevodsky's Derived category of mixed motives]] and [[stable A¹-homotopy theory|Stable A¹-homotopy theory]] is provided in the following documents. 
* Théorie homotopique des schémas, by J. Riou ([[Paper at author's homepage|http://www.math.u-psud.fr/~riou/dea/]],[[Discussion|Théorie homotopique des schémas]]).
* Lectures on motivic cohomology 2000/2001 by V. Voevodsky (notes by P. Deligne) ([[ArXiv|http://arxiv.org/abs/0805.4436]],[[Discussion|Lectures on motivic cohomology 2000-2001]]).

With the construction of the ${\mathbb A}^1$-homotopy category [[completed|A¹-homotopy theory of schemes]], one can turn to some fundamental computations.  Morel and Voevodsky construct (sheaves of) homotopy groups in the ${\mathbb A}^1$-homotopy category (called ${\mathbb A}^1$-[[homotopy groups|A¹-homotopy groups]]) which detect [[isomorphisms in the A¹-homotopy category|A¹-weak equivalence]], just like classical homotopy groups can be used to detect weak equivalences for CW complexes (// cf. // the [[Whitehead theorem|http://en.wikipedia.org/wiki/Whitehead's_theorem]]).  These sheaves of groups are fundamental invariants of algebraic varieties and are very difficult to compute in general.  They are studied in great detail in 
* ${\mathbb A}^1$-algebraic topology over a field, by F. Morel ([[Paper in .PDF|http://www.mathematik.uni-muenchen.de/~morel/A1homotopy.pdf]],[[Discussion|A¹-algebraic topology over a field]]).  
Continuing by analogy with classical algebraic topology, one can attempt to study [[classifying spaces|http://en.wikipedia.org/wiki/Classifying_space]] in ${\mathbb A}^1$-homotopy theory.  For vector bundles over smooth affine schemes, this is begun in the following paper:  
* ${\mathbb A}^1$-homotopy classification of vector bundles over smooth affine schemes, by F. Morel ([[Paper in .PDF|http://www.mathematik.uni-muenchen.de/~morel/bgln.pdf]],[[Discussion|A¹-homotopy classification of vector bundles over smooth affine schemes]]). 

<html><center>(<a href="javascript:;" class="TiddlyLinkExisting" 
onclick="story.closeAllTiddlers();story.displayTiddler(null,'Surveys on foundational material');return 
false;"><b> Back </b></a>|<a href="javascript:;" class="TiddlyLinkExisting" 
onclick="story.closeAllTiddlers();story.displayTiddler(null,'Outlines of the theory');return 
false;"><b> Up </b></a>|<a href="javascript:;" class="TiddlyLinkExisting" 
onclick="story.closeAllTiddlers();story.displayTiddler(null,'Stable A¹-homotopy theory');return 
false;"><b> Forward </b></a>)</center></html>
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 27/04/2011 14:41:36 | aravindasok | [[/|http://a1homotopy.tiddlyspot.com/]] | [[store.cgi|http://a1homotopy.tiddlyspot.com/store.cgi]] | . | [[index.html | http://a1homotopy.tiddlyspot.com/index.html]] | . | ok |
| 27/04/2011 14:41:58 | aravindasok | [[/|http://a1homotopy.tiddlyspot.com/]] | [[store.cgi|http://a1homotopy.tiddlyspot.com/store.cgi]] | . | [[index.html | http://a1homotopy.tiddlyspot.com/index.html]] | . |
| 05/07/2011 11:39:41 | aravindasok | [[/|http://a1homotopy.tiddlyspot.com/]] | [[store.cgi|http://a1homotopy.tiddlyspot.com/store.cgi]] | . | [[index.html | http://a1homotopy.tiddlyspot.com/index.html]] | . |
| 19/10/2011 17:24:18 | aravindasok | [[/|http://a1homotopy.tiddlyspot.com/]] | [[store.cgi|http://a1homotopy.tiddlyspot.com/store.cgi]] | . | [[index.html | http://a1homotopy.tiddlyspot.com/index.html]] | . |
| 06/01/2012 11:54:54 | aravindasok | [[/|http://a1homotopy.tiddlyspot.com/]] | [[store.cgi|http://a1homotopy.tiddlyspot.com/store.cgi]] | . | [[index.html | http://a1homotopy.tiddlyspot.com/index.html]] | . |
| 06/06/2012 16:26:18 | YourName | [[/|http://a1homotopy.tiddlyspot.com/]] | [[store.cgi|http://a1homotopy.tiddlyspot.com/store.cgi]] | . | [[index.html | http://a1homotopy.tiddlyspot.com/index.html]] | . |
| 19/11/2012 22:51:34 | aravindasok | [[/|http://a1homotopy.tiddlyspot.com/]] | [[store.cgi|http://a1homotopy.tiddlyspot.com/store.cgi]] | . | [[index.html | http://a1homotopy.tiddlyspot.com/index.html]] | . |
| 07/10/2013 10:44:52 | aravindasok | [[/|http://a1homotopy.tiddlyspot.com/]] | [[store.cgi|http://a1homotopy.tiddlyspot.com/store.cgi]] | . | [[index.html | http://a1homotopy.tiddlyspot.com/index.html]] | . | failed |
| 07/10/2013 10:45:11 | aravindasok | [[/|http://a1homotopy.tiddlyspot.com/]] | [[store.cgi|http://a1homotopy.tiddlyspot.com/store.cgi]] | . | [[index.html | http://a1homotopy.tiddlyspot.com/index.html]] | . | failed |
| 07/10/2013 10:45:34 | aravindasok | [[/|http://a1homotopy.tiddlyspot.com/]] | [[store.cgi|http://a1homotopy.tiddlyspot.com/store.cgi]] | . | [[index.html | http://a1homotopy.tiddlyspot.com/index.html]] | . |
/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.3|
|''Date:''|Feb 24, 2008|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadPluginDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
	major: 4, minor: 1, revision: 3,
	date: new Date("Feb 24, 2008"),
	source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	coreVersion: '2.2.0'
};

//
// Environment
//

if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false;	// true to activate both in Plugin and UploadService
	
//
// Upload Macro
//

config.macros.upload = {
// default values
	defaultBackupDir: '',	//no backup
	defaultStoreScript: "store.php",
	defaultToFilename: "index.html",
	defaultUploadDir: ".",
	authenticateUser: true	// UploadService Authenticate User
};
	
config.macros.upload.label = {
	promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
	promptParamMacro: "Save and Upload this TiddlyWiki in %0",
	saveLabel: "save to web", 
	saveToDisk: "save to disk",
	uploadLabel: "upload"	
};

config.macros.upload.messages = {
	noStoreUrl: "No store URL in parmeters or options",
	usernameOrPasswordMissing: "Username or password missing"
};

config.macros.upload.handler = function(place,macroName,params) {
	if (readOnly)
		return;
	var label;
	if (document.location.toString().substr(0,4) == "http") 
		label = this.label.saveLabel;
	else
		label = this.label.uploadLabel;
	var prompt;
	if (params[0]) {
		prompt = this.label.promptParamMacro.toString().format([this.destFile(params[0], 
			(params[1] ? params[1]:bidix.basename(window.location.toString())), params[3])]);
	} else {
		prompt = this.label.promptOption;
	}
	createTiddlyButton(place, label, prompt, function() {config.macros.upload.action(params);}, null, null, this.accessKey);
};

config.macros.upload.action = function(params)
{
		// for missing macro parameter set value from options
		if (!params) params = {};
		var storeUrl = params[0] ? params[0] : config.options.txtUploadStoreUrl;
		var toFilename = params[1] ? params[1] : config.options.txtUploadFilename;
		var backupDir = params[2] ? params[2] : config.options.txtUploadBackupDir;
		var uploadDir = params[3] ? params[3] : config.options.txtUploadDir;
		var username = params[4] ? params[4] : config.options.txtUploadUserName;
		var password = config.options.pasUploadPassword; // for security reason no password as macro parameter	
		// for still missing parameter set default value
		if ((!storeUrl) && (document.location.toString().substr(0,4) == "http")) 
			storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
		if (storeUrl.substr(0,4) != "http")
			storeUrl = bidix.dirname(document.location.toString()) +'/'+ storeUrl;
		if (!toFilename)
			toFilename = bidix.basename(window.location.toString());
		if (!toFilename)
			toFilename = config.macros.upload.defaultToFilename;
		if (!uploadDir)
			uploadDir = config.macros.upload.defaultUploadDir;
		if (!backupDir)
			backupDir = config.macros.upload.defaultBackupDir;
		// report error if still missing
		if (!storeUrl) {
			alert(config.macros.upload.messages.noStoreUrl);
			clearMessage();
			return false;
		}
		if (config.macros.upload.authenticateUser && (!username || !password)) {
			alert(config.macros.upload.messages.usernameOrPasswordMissing);
			clearMessage();
			return false;
		}
		bidix.upload.uploadChanges(false,null,storeUrl, toFilename, uploadDir, backupDir, username, password); 
		return false; 
};

config.macros.upload.destFile = function(storeUrl, toFilename, uploadDir) 
{
	if (!storeUrl)
		return null;
		var dest = bidix.dirname(storeUrl);
		if (uploadDir && uploadDir != '.')
			dest = dest + '/' + uploadDir;
		dest = dest + '/' + toFilename;
	return dest;
};

//
// uploadOptions Macro
//

config.macros.uploadOptions = {
	handler: function(place,macroName,params) {
		var wizard = new Wizard();
		wizard.createWizard(place,this.wizardTitle);
		wizard.addStep(this.step1Title,this.step1Html);
		var markList = wizard.getElement("markList");
		var listWrapper = document.createElement("div");
		markList.parentNode.insertBefore(listWrapper,markList);
		wizard.setValue("listWrapper",listWrapper);
		this.refreshOptions(listWrapper,false);
		var uploadCaption;
		if (document.location.toString().substr(0,4) == "http") 
			uploadCaption = config.macros.upload.label.saveLabel;
		else
			uploadCaption = config.macros.upload.label.uploadLabel;
		
		wizard.setButtons([
				{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption, 
					onClick: config.macros.upload.action},
				{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
				
			]);
	},
	options: [
		"txtUploadUserName",
		"pasUploadPassword",
		"txtUploadStoreUrl",
		"txtUploadDir",
		"txtUploadFilename",
		"txtUploadBackupDir",
		"chkUploadLog",
		"txtUploadLogMaxLine"		
	],
	refreshOptions: function(listWrapper) {
		var opts = [];
		for(i=0; i<this.options.length; i++) {
			var opt = {};
			opts.push();
			opt.option = "";
			n = this.options[i];
			opt.name = n;
			opt.lowlight = !config.optionsDesc[n];
			opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
			opts.push(opt);
		}
		var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
		for(n=0; n<opts.length; n++) {
			var type = opts[n].name.substr(0,3);
			var h = config.macros.option.types[type];
			if (h && h.create) {
				h.create(opts[n].colElements['option'],type,opts[n].name,opts[n].name,"no");
			}
		}
		
	},
	onCancel: function(e)
	{
		backstage.switchTab(null);
		return false;
	},
	
	wizardTitle: "Upload with options",
	step1Title: "These options are saved in cookies in your browser",
	step1Html: "<input type='hidden' name='markList'></input><br>",
	cancelButton: "Cancel",
	cancelButtonPrompt: "Cancel prompt",
	listViewTemplate: {
		columns: [
			{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
			{name: 'Option', field: 'option', title: "Option", type: 'String'},
			{name: 'Name', field: 'name', title: "Name", type: 'String'}
			],
		rowClasses: [
			{className: 'lowlight', field: 'lowlight'} 
			]}
};

//
// upload functions
//

if (!bidix.upload) bidix.upload = {};

if (!bidix.upload.messages) bidix.upload.messages = {
	//from saving
	invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
	backupSaved: "Backup saved",
	backupFailed: "Failed to upload backup file",
	rssSaved: "RSS feed uploaded",
	rssFailed: "Failed to upload RSS feed file",
	emptySaved: "Empty template uploaded",
	emptyFailed: "Failed to upload empty template file",
	mainSaved: "Main TiddlyWiki file uploaded",
	mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved",
	//specific upload
	loadOriginalHttpPostError: "Can't get original file",
	aboutToSaveOnHttpPost: 'About to upload on %0 ...',
	storePhpNotFound: "The store script '%0' was not found."
};

bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
{
	var callback = function(status,uploadParams,original,url,xhr) {
		if (!status) {
			displayMessage(bidix.upload.messages.loadOriginalHttpPostError);
			return;
		}
		if (bidix.debugMode) 
			alert(original.substr(0,500)+"\n...");
		// Locate the storeArea div's 
		var posDiv = locateStoreArea(original);
		if((posDiv[0] == -1) || (posDiv[1] == -1)) {
			alert(config.messages.invalidFileError.format([localPath]));
			return;
		}
		bidix.upload.uploadRss(uploadParams,original,posDiv);
	};
	
	if(onlyIfDirty && !store.isDirty())
		return;
	clearMessage();
	// save on localdisk ?
	if (document.location.toString().substr(0,4) == "file") {
		var path = document.location.toString();
		var localPath = getLocalPath(path);
		saveChanges();
	}
	// get original
	var uploadParams = new Array(storeUrl,toFilename,uploadDir,backupDir,username,password);
	var originalPath = document.location.toString();
	// If url is a directory : add index.html
	if (originalPath.charAt(originalPath.length-1) == "/")
		originalPath = originalPath + "index.html";
	var dest = config.macros.upload.destFile(storeUrl,toFilename,uploadDir);
	var log = new bidix.UploadLog();
	log.startUpload(storeUrl, dest, uploadDir,  backupDir);
	displayMessage(bidix.upload.messages.aboutToSaveOnHttpPost.format([dest]));
	if (bidix.debugMode) 
		alert("about to execute Http - GET on "+originalPath);
	var r = doHttp("GET",originalPath,null,null,username,password,callback,uploadParams,null);
	if (typeof r == "string")
		displayMessage(r);
	return r;
};

bidix.upload.uploadRss = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		if(status) {
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
			displayMessage(bidix.upload.messages.rssSaved,bidix.dirname(url)+'/'+destfile);
			bidix.upload.uploadMain(params[0],params[1],params[2]);
		} else {
			displayMessage(bidix.upload.messages.rssFailed);			
		}
	};
	// do uploadRss
	if(config.options.chkGenerateAnRssFeed) {
		var rssPath = uploadParams[1].substr(0,uploadParams[1].lastIndexOf(".")) + ".xml";
		var rssUploadParams = new Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
		var rssString = generateRss();
		// no UnicodeToUTF8 conversion needed when location is "file" !!!
		if (document.location.toString().substr(0,4) != "file")
			rssString = convertUnicodeToUTF8(rssString);	
		bidix.upload.httpUpload(rssUploadParams,rssString,callback,Array(uploadParams,original,posDiv));
	} else {
		bidix.upload.uploadMain(uploadParams,original,posDiv);
	}
};

bidix.upload.uploadMain = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		var log = new bidix.UploadLog();
		if(status) {
			// if backupDir specified
			if ((params[3]) && (responseText.indexOf("backupfile:") > -1))  {
				var backupfile = responseText.substring(responseText.indexOf("backupfile:")+11,responseText.indexOf("\n", responseText.indexOf("backupfile:")));
				displayMessage(bidix.upload.messages.backupSaved,bidix.dirname(url)+'/'+backupfile);
			}
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
			displayMessage(bidix.upload.messages.mainSaved,bidix.dirname(url)+'/'+destfile);
			store.setDirty(false);
			log.endUpload("ok");
		} else {
			alert(bidix.upload.messages.mainFailed);
			displayMessage(bidix.upload.messages.mainFailed);
			log.endUpload("failed");			
		}
	};
	// do uploadMain
	var revised = bidix.upload.updateOriginal(original,posDiv);
	bidix.upload.httpUpload(uploadParams,revised,callback,uploadParams);
};

bidix.upload.httpUpload = function(uploadParams,data,callback,params)
{
	var localCallback = function(status,params,responseText,url,xhr) {
		url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
		if (xhr.status == 404)
			alert(bidix.upload.messages.storePhpNotFound.format([url]));
		if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
			alert(responseText);
			if (responseText.indexOf("Debug mode") >= 0 )
				responseText = responseText.substring(responseText.indexOf("\n\n")+2);
		} else if (responseText.charAt(0) != '0') 
			alert(responseText);
		if (responseText.charAt(0) != '0')
			status = null;
		callback(status,params,responseText,url,xhr);
	};
	// do httpUpload
	var boundary = "---------------------------"+"AaB03x";	
	var uploadFormName = "UploadPlugin";
	// compose headers data
	var sheader = "";
	sheader += "--" + boundary + "\r\nContent-disposition: form-data; name=\"";
	sheader += uploadFormName +"\"\r\n\r\n";
	sheader += "backupDir="+uploadParams[3] +
				";user=" + uploadParams[4] +
				";password=" + uploadParams[5] +
				";uploaddir=" + uploadParams[2];
	if (bidix.debugMode)
		sheader += ";debug=1";
	sheader += ";;\r\n"; 
	sheader += "\r\n" + "--" + boundary + "\r\n";
	sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\""+uploadParams[1]+"\"\r\n";
	sheader += "Content-Type: text/html;charset=UTF-8" + "\r\n";
	sheader += "Content-Length: " + data.length + "\r\n\r\n";
	// compose trailer data
	var strailer = new String();
	strailer = "\r\n--" + boundary + "--\r\n";
	data = sheader + data + strailer;
	if (bidix.debugMode) alert("about to execute Http - POST on "+uploadParams[0]+"\n with \n"+data.substr(0,500)+ " ... ");
	var r = doHttp("POST",uploadParams[0],data,"multipart/form-data; ;charset=UTF-8; boundary="+boundary,uploadParams[4],uploadParams[5],localCallback,params,null);
	if (typeof r == "string")
		displayMessage(r);
	return r;
};

// same as Saving's updateOriginal but without convertUnicodeToUTF8 calls
bidix.upload.updateOriginal = function(original, posDiv)
{
	if (!posDiv)
		posDiv = locateStoreArea(original);
	if((posDiv[0] == -1) || (posDiv[1] == -1)) {
		alert(config.messages.invalidFileError.format([localPath]));
		return;
	}
	var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
				store.allTiddlersAsHtml() + "\n" +
				original.substr(posDiv[1]);
	var newSiteTitle = getPageTitle().htmlEncode();
	revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
	revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
	revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
	revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
	revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
	return revised;
};

//
// UploadLog
// 
// config.options.chkUploadLog :
//		false : no logging
//		true : logging
// config.options.txtUploadLogMaxLine :
//		-1 : no limit
//      0 :  no Log lines but UploadLog is still in place
//		n :  the last n lines are only kept
//		NaN : no limit (-1)

bidix.UploadLog = function() {
	if (!config.options.chkUploadLog) 
		return; // this.tiddler = null
	this.tiddler = store.getTiddler("UploadLog");
	if (!this.tiddler) {
		this.tiddler = new Tiddler();
		this.tiddler.title = "UploadLog";
		this.tiddler.text = "| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |";
		this.tiddler.created = new Date();
		this.tiddler.modifier = config.options.txtUserName;
		this.tiddler.modified = new Date();
		store.addTiddler(this.tiddler);
	}
	return this;
};

bidix.UploadLog.prototype.addText = function(text) {
	if (!this.tiddler)
		return;
	// retrieve maxLine when we need it
	var maxLine = parseInt(config.options.txtUploadLogMaxLine,10);
	if (isNaN(maxLine))
		maxLine = -1;
	// add text
	if (maxLine != 0) 
		this.tiddler.text = this.tiddler.text + text;
	// Trunck to maxLine
	if (maxLine >= 0) {
		var textArray = this.tiddler.text.split('\n');
		if (textArray.length > maxLine + 1)
			textArray.splice(1,textArray.length-1-maxLine);
			this.tiddler.text = textArray.join('\n');		
	}
	// update tiddler fields
	this.tiddler.modifier = config.options.txtUserName;
	this.tiddler.modified = new Date();
	store.addTiddler(this.tiddler);
	// refresh and notifiy for immediate update
	story.refreshTiddler(this.tiddler.title);
	store.notify(this.tiddler.title, true);
};

bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir,  backupDir) {
	if (!this.tiddler)
		return;
	var now = new Date();
	var text = "\n| ";
	var filename = bidix.basename(document.location.toString());
	if (!filename) filename = '/';
	text += now.formatString("0DD/0MM/YYYY 0hh:0mm:0ss") +" | ";
	text += config.options.txtUserName + " | ";
	text += "[["+filename+"|"+location + "]] |";
	text += " [[" + bidix.basename(storeUrl) + "|" + storeUrl + "]] | ";
	text += uploadDir + " | ";
	text += "[[" + bidix.basename(toFilename) + " | " +toFilename + "]] | ";
	text += backupDir + " |";
	this.addText(text);
};

bidix.UploadLog.prototype.endUpload = function(status) {
	if (!this.tiddler)
		return;
	this.addText(" "+status+" |");
};

//
// Utilities
// 

bidix.checkPlugin = function(plugin, major, minor, revision) {
	var ext = version.extensions[plugin];
	if (!
		(ext  && 
			((ext.major > major) || 
			((ext.major == major) && (ext.minor > minor))  ||
			((ext.major == major) && (ext.minor == minor) && (ext.revision >= revision))))) {
			// write error in PluginManager
			if (pluginInfo)
				pluginInfo.log.push("Requires " + plugin + " " + major + "." + minor + "." + revision);
			eval(plugin); // generate an error : "Error: ReferenceError: xxxx is not defined"
	}
};

bidix.dirname = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(0, lastpos);
	} else {
		return filePath.substring(0, filePath.lastIndexOf("\\"));
	}
};

bidix.basename = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("#")) != -1) 
		filePath = filePath.substring(0, lastpos);
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(lastpos + 1);
	} else
		return filePath.substring(filePath.lastIndexOf("\\")+1);
};

bidix.initOption = function(name,value) {
	if (!config.options[name])
		config.options[name] = value;
};

//
// Initializations
//

// require PasswordOptionPlugin 1.0.1 or better
bidix.checkPlugin("PasswordOptionPlugin", 1, 0, 1);

// styleSheet
setStylesheet('.txtUploadStoreUrl, .txtUploadBackupDir, .txtUploadDir {width: 22em;}',"uploadPluginStyles");

//optionsDesc
merge(config.optionsDesc,{
	txtUploadStoreUrl: "Url of the UploadService script (default: store.php)",
	txtUploadFilename: "Filename of the uploaded file (default: in index.html)",
	txtUploadDir: "Relative Directory where to store the file (default: . (downloadService directory))",
	txtUploadBackupDir: "Relative Directory where to backup the file. If empty no backup. (default: ''(empty))",
	txtUploadUserName: "Upload Username",
	pasUploadPassword: "Upload Password",
	chkUploadLog: "do Logging in UploadLog (default: true)",
	txtUploadLogMaxLine: "Maximum of lines in UploadLog (default: 10)"
});

// Options Initializations
bidix.initOption('txtUploadStoreUrl','');
bidix.initOption('txtUploadFilename','');
bidix.initOption('txtUploadDir','');
bidix.initOption('txtUploadBackupDir','');
bidix.initOption('txtUploadUserName','');
bidix.initOption('pasUploadPassword','');
bidix.initOption('chkUploadLog',true);
bidix.initOption('txtUploadLogMaxLine','10');


// Backstage
merge(config.tasks,{
	uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");


//}}}

<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
!!! Basic information
|{{{Voevodsky, V.}}}|>|
|{{{A¹-homotopy theory}}}|>|
|{{{Doc. Math.}}}, {{{Extra Vol. I}}}, ({{{1998}}}), {{{579--604}}}|>|
|MathSciNet: [[MR1648048|http://www.ams.org/mathscinet-getitem?mr=MR1648048]]|>|
|[[Documenta link|http://www.mathematik.uni-bielefeld.de/documenta/xvol-icm/00/Voevodsky.MAN.html]]|>|


!!! BibTeX
{{{
@inproceedings {MR1648048,
    AUTHOR = {Voevodsky, Vladimir},
     TITLE = {{$\bold A\sp 1$}-homotopy theory},
 BOOKTITLE = {Proceedings of the {I}nternational {C}ongress of
              {M}athematicians, {V}ol. {I} ({B}erlin, 1998)},
   JOURNAL = {Doc. Math.},
  FJOURNAL = {Documenta Mathematica},
      YEAR = {1998},
    NUMBER = {Extra Vol. I},
     PAGES = {579--604 (electronic)},
      ISSN = {1431-0635},
   MRCLASS = {14F35 (14A15 55U35)},
  MRNUMBER = {MR1648048 (99j:14018)},
MRREVIEWER = {Mark Hovey},
}
}}}
The __wedge sum__ of two pointed [[spaces|Motivic space]] $({\mathcal X},x)$ and $({\mathcal Y},y)$ is the pushout of the diagram
\[
{\mathcal X} \longleftarrow \ast \longrightarrow {\mathcal Y}
\]
where the two maps from $\ast$ are the inclusions of the base-points.  
This document is a ~TiddlyWiki from tiddlyspot.com.  A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.

@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below.  Then configure privacy and other site settings at your [[control panel|http://a1homotopy.tiddlyspot.com/controlpanel]] (your control panel username is //a1homotopy//).
<<tiddler TspotControls>>
See also GettingStarted.

@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the "save to web" button in the column on the right.

@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick.  You can make changes and save them locally without being connected to the Internet.  When you're ready to sync up again, just click "upload" and your ~TiddlyWiki will be saved back to tiddlyspot.com.

@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]].  Also visit [[TiddlyWiki.org|http://tiddlywiki.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help.  If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].

@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site.  Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions.
/***
|''Name:''|YourSearchPlugin|
|''Version:''|2.1.3 (2008-04-16)|
|''Source:''|http://tiddlywiki.abego-software.de/#YourSearchPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|&copy; 2005-2008 [[abego Software|http://www.abego-software.de]]|
|''~CoreVersion:''|2.1.0|
|''Community:''|[[del.icio.us|http://del.icio.us/post?url=http://tiddlywiki.abego-software.de/index.html%23YourSearchPlugin]]|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; ~InternetExplorer 6.0|
!About YourSearch
YourSearch gives you a bunch of new features to simplify and speed up your daily searches in TiddlyWiki. It seamlessly integrates into the standard TiddlyWiki search: just start typing into the 'search' field and explore!

For more information see [[Help|YourSearch Help]].
!Compatibility
This plugin requires TiddlyWiki 2.1. 
Check the [[archive|http://tiddlywiki.abego-software.de/archive]] for ~YourSearchPlugins supporting older versions of TiddlyWiki.
!Source Code
***/
/***
This plugin's source code is compressed (and hidden). Use this [[link|http://tiddlywiki.abego-software.de/archive/YourSearchPlugin/Plugin-YourSearch-src.2.1.3.js]] to get the readable source code.
***/
///%
if(!version.extensions.YourSearchPlugin){version.extensions.YourSearchPlugin={major:2,minor:1,revision:3,source:"http://tiddlywiki.abego-software.de/#YourSearchPlugin",licence:"[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",copyright:"Copyright (c) abego Software GmbH, 2005-2008 (www.abego-software.de)"};if(!window.abego){window.abego={};}
if(!Array.forEach){Array.forEach=function(_1,_2,_3){for(var i=0,len=_1.length;i<len;i++){_2.call(_3,_1[i],i,_1);}};Array.prototype.forEach=function(_5,_6){for(var i=0,len=this.length;i<len;i++){_5.call(_6,this[i],i,this);}};}
abego.toInt=function(s,_9){if(!s){return _9;}
var n=parseInt(s);return(n==NaN)?_9:n;};abego.createEllipsis=function(_b){var e=createTiddlyElement(_b,"span");e.innerHTML="&hellip;";};abego.shallowCopy=function(_d){if(!_d){return _d;}
var _e={};for(var n in _d){_e[n]=_d[n];}
return _e;};abego.copyOptions=function(_10){return!_10?{}:abego.shallowCopy(_10);};abego.countStrings=function(_11,s){if(!s){return 0;}
var len=s.length;var n=0;var _15=0;while(1){var i=_11.indexOf(s,_15);if(i<0){return n;}
n++;_15=i+len;}
return n;};abego.getBracedText=function(_17,_18,_19){if(!_18){_18=0;}
var re=/\{([^\}]*)\}/gm;re.lastIndex=_18;var m=re.exec(_17);if(m){var s=m[1];var _1d=abego.countStrings(s,"{");if(!_1d){if(_19){_19.lastIndex=re.lastIndex;}
return s;}
var len=_17.length;for(var i=re.lastIndex;i<len&&_1d;i++){var c=_17.charAt(i);if(c=="{"){_1d++;}else{if(c=="}"){_1d--;}}}
if(!_1d){if(_19){_19.lastIndex=i-1;}
return _17.substring(m.index+1,i-1);}}};abego.select=function(_21,_22,_23,_24){if(!_24){_24=[];}
_21.forEach(function(t){if(_22.call(_23,t)){_24.push(t);}});return _24;};abego.consumeEvent=function(e){if(e.stopPropagation){e.stopPropagation();}
if(e.preventDefault){e.preventDefault();}
e.cancelBubble=true;e.returnValue=true;};abego.TiddlerFilterTerm=function(_27,_28){if(!_28){_28={};}
var _29=_27;if(!_28.textIsRegExp){_29=_27.escapeRegExp();if(_28.fullWordMatch){_29="\\b"+_29+"\\b";}}
var _2a=new RegExp(_29,"m"+(_28.caseSensitive?"":"i"));this.tester=new abego.MultiFieldRegExpTester(_2a,_28.fields,_28.withExtendedFields);};abego.TiddlerFilterTerm.prototype.test=function(_2b){return this.tester.test(_2b);};abego.parseNewTiddlerCommandLine=function(s){var m=/(.*?)\.(?:\s+|$)([^#]*)(#.*)?/.exec(s);if(!m){m=/([^#]*)()(#.*)?/.exec(s);}
if(m){var r;if(m[3]){var s2=m[3].replace(/#/g,"");r=s2.parseParams("tag");}else{r=[[]];}
var _30=m[2]?m[2].trim():"";r.push({name:"text",value:_30});r[0].text=[_30];return{title:m[1].trim(),params:r};}else{return{title:s.trim(),params:[[]]};}};abego.parseTiddlerFilterTerm=function(_31,_32,_33){var re=/\s*(?:(?:\{([^\}]*)\})|(?:(=)|([#%!])|(?:(\w+)\s*\:(?!\/\/))|(?:(?:("(?:(?:\\")|[^"])+")|(?:\/((?:(?:\\\/)|[^\/])+)\/)|(\w+\:\/\/[^\s]+)|([^\s\)\-\"]+)))))/mg;var _35={"!":"title","%":"text","#":"tags"};var _36={};var _37;re.lastIndex=_32;while(1){var i=re.lastIndex;var m=re.exec(_31);if(!m||m.index!=i){throw"Word or String literal expected";}
if(m[1]){var _3a={};var _3b=abego.getBracedText(_31,0,_3a);if(!_3b){throw"Invalid {...} syntax";}
var f=Function("tiddler","return ("+_3b+");");return{func:f,lastIndex:_3a.lastIndex,markRE:null};}
if(m[2]){_37=true;}else{if(m[3]){_36[_35[m[3]]]=1;}else{if(m[4]){_36[m[4]]=1;}else{var _3d=m[6];var _3e=m[5]?window.eval(m[5]):m[6]?m[6]:m[7]?m[7]:m[8];var _33=abego.copyOptions(_33);_33.fullWordMatch=_37;_33.textIsRegExp=_3d;var _3f=[];for(var n in _36){_3f.push(n);}
if(_3f.length==0){_33.fields=_33.defaultFields;}else{_33.fields=_3f;_33.withExtendedFields=false;}
var _41=new abego.TiddlerFilterTerm(_3e,_33);var _42=_3d?_3e:_3e.escapeRegExp();if(_42&&_37){_42="\\b"+_42+"\\b";}
return{func:function(_43){return _41.test(_43);},lastIndex:re.lastIndex,markRE:_42?"(?:"+_42+")":null};}}}}};abego.BoolExp=function(s,_45,_46){this.s=s;var _47=_46&&_46.defaultOperationIs_OR;var _48=/\s*(?:(\-|not)|(\())/gi;var _49=/\s*\)/g;var _4a=/\s*(?:(and|\&\&)|(or|\|\|))/gi;var _4b=/\s*[^\)\s]/g;var _4c=/\s*(\-|not)?(\s*\()?/gi;var _4d;var _4e=function(_4f){_4c.lastIndex=_4f;var m=_4c.exec(s);var _51;var _52;if(m&&m.index==_4f){_4f+=m[0].length;_51=m[1];if(m[2]){var e=_4d(_4f);_49.lastIndex=e.lastIndex;if(!_49.exec(s)){throw"Missing ')'";}
_52={func:e.func,lastIndex:_49.lastIndex,markRE:e.markRE};}}
if(!_52){_52=_45(s,_4f,_46);}
if(_51){_52.func=(function(f){return function(_55){return!f(_55);};})(_52.func);_52.markRE=null;}
return _52;};_4d=function(_56){var _57=_4e(_56);while(1){var l=_57.lastIndex;_4a.lastIndex=l;var m=_4a.exec(s);var _5a;var _5b;if(m&&m.index==l){_5a=!m[1];_5b=_4e(_4a.lastIndex);}else{try{_5b=_4e(l);}
catch(e){return _57;}
_5a=_47;}
_57.func=(function(_5c,_5d,_5e){return _5e?function(_5f){return _5c(_5f)||_5d(_5f);}:function(_60){return _5c(_60)&&_5d(_60);};})(_57.func,_5b.func,_5a);_57.lastIndex=_5b.lastIndex;if(!_57.markRE){_57.markRE=_5b.markRE;}else{if(_5b.markRE){_57.markRE=_57.markRE+"|"+_5b.markRE;}}}};var _61=_4d(0);this.evalFunc=_61.func;if(_61.markRE){this.markRegExp=new RegExp(_61.markRE,_46.caseSensitive?"mg":"img");}};abego.BoolExp.prototype.exec=function(){return this.evalFunc.apply(this,arguments);};abego.BoolExp.prototype.getMarkRegExp=function(){return this.markRegExp;};abego.BoolExp.prototype.toString=function(){return this.s;};abego.MultiFieldRegExpTester=function(re,_63,_64){this.re=re;this.fields=_63?_63:["title","text","tags"];this.withExtendedFields=_64;};abego.MultiFieldRegExpTester.prototype.test=function(_65){var re=this.re;for(var i=0;i<this.fields.length;i++){var s=store.getValue(_65,this.fields[i]);if(typeof s=="string"&&re.test(s)){return this.fields[i];}}
if(this.withExtendedFields){return store.forEachField(_65,function(_69,_6a,_6b){return typeof _6b=="string"&&re.test(_6b)?_6a:null;},true);}
return null;};abego.TiddlerQuery=function(_6c,_6d,_6e,_6f,_70){if(_6e){this.regExp=new RegExp(_6c,_6d?"mg":"img");this.tester=new abego.MultiFieldRegExpTester(this.regExp,_6f,_70);}else{this.expr=new abego.BoolExp(_6c,abego.parseTiddlerFilterTerm,{defaultFields:_6f,caseSensitive:_6d,withExtendedFields:_70});}
this.getQueryText=function(){return _6c;};this.getUseRegExp=function(){return _6e;};this.getCaseSensitive=function(){return _6d;};this.getDefaultFields=function(){return _6f;};this.getWithExtendedFields=function(){return _70;};};abego.TiddlerQuery.prototype.test=function(_71){if(!_71){return false;}
if(this.regExp){return this.tester.test(_71);}
return this.expr.exec(_71);};abego.TiddlerQuery.prototype.filter=function(_72){return abego.select(_72,this.test,this);};abego.TiddlerQuery.prototype.getMarkRegExp=function(){if(this.regExp){return"".search(this.regExp)>=0?null:this.regExp;}
return this.expr.getMarkRegExp();};abego.TiddlerQuery.prototype.toString=function(){return(this.regExp?this.regExp:this.expr).toString();};abego.PageWiseRenderer=function(){this.firstIndexOnPage=0;};merge(abego.PageWiseRenderer.prototype,{setItems:function(_73){this.items=_73;this.setFirstIndexOnPage(0);},getMaxPagesInNavigation:function(){return 10;},getItemsCount:function(_74){return this.items?this.items.length:0;},getCurrentPageIndex:function(){return Math.floor(this.firstIndexOnPage/this.getItemsPerPage());},getLastPageIndex:function(){return Math.floor((this.getItemsCount()-1)/this.getItemsPerPage());},setFirstIndexOnPage:function(_75){this.firstIndexOnPage=Math.min(Math.max(0,_75),this.getItemsCount()-1);},getFirstIndexOnPage:function(){this.firstIndexOnPage=Math.floor(this.firstIndexOnPage/this.getItemsPerPage())*this.getItemsPerPage();return this.firstIndexOnPage;},getLastIndexOnPage:function(){return Math.min(this.getFirstIndexOnPage()+this.getItemsPerPage()-1,this.getItemsCount()-1);},onPageChanged:function(_76,_77){},renderPage:function(_78){if(_78.beginRendering){_78.beginRendering(this);}
try{if(this.getItemsCount()){var _79=this.getLastIndexOnPage();var _7a=-1;for(var i=this.getFirstIndexOnPage();i<=_79;i++){_7a++;_78.render(this,this.items[i],i,_7a);}}}
finally{if(_78.endRendering){_78.endRendering(this);}}},addPageNavigation:function(_7c){if(!this.getItemsCount()){return;}
var _7d=this;var _7e=function(e){if(!e){var e=window.event;}
abego.consumeEvent(e);var _80=abego.toInt(this.getAttribute("page"),0);var _81=_7d.getCurrentPageIndex();if(_80==_81){return;}
var _82=_80*_7d.getItemsPerPage();_7d.setFirstIndexOnPage(_82);_7d.onPageChanged(_80,_81);};var _83;var _84=this.getCurrentPageIndex();var _85=this.getLastPageIndex();if(_84>0){_83=createTiddlyButton(_7c,"Previous","Go to previous page (Shortcut: Alt-'<')",_7e,"prev");_83.setAttribute("page",(_84-1).toString());_83.setAttribute("accessKey","<");}
for(var i=-this.getMaxPagesInNavigation();i<this.getMaxPagesInNavigation();i++){var _87=_84+i;if(_87<0){continue;}
if(_87>_85){break;}
var _88=(i+_84+1).toString();var _89=_87==_84?"currentPage":"otherPage";_83=createTiddlyButton(_7c,_88,"Go to page %0".format([_88]),_7e,_89);_83.setAttribute("page",(_87).toString());}
if(_84<_85){_83=createTiddlyButton(_7c,"Next","Go to next page (Shortcut: Alt-'>')",_7e,"next");_83.setAttribute("page",(_84+1).toString());_83.setAttribute("accessKey",">");}}});abego.LimitedTextRenderer=function(){var _8a=40;var _8b=4;var _8c=function(_8d,_8e,_8f){var n=_8d.length;if(n==0){_8d.push({start:_8e,end:_8f});return;}
var i=0;for(;i<n;i++){var _92=_8d[i];if(_92.start<=_8f&&_8e<=_92.end){var r;var _94=i+1;for(;_94<n;_94++){r=_8d[_94];if(r.start>_8f||_8e>_92.end){break;}}
var _95=_8e;var _96=_8f;for(var j=i;j<_94;j++){r=_8d[j];_95=Math.min(_95,r.start);_96=Math.max(_96,r.end);}
_8d.splice(i,_94-i,{start:_95,end:_96});return;}
if(_92.start>_8f){break;}}
_8d.splice(i,0,{start:_8e,end:_8f});};var _98=function(_99){var _9a=0;for(var i=0;i<_99.length;i++){var _9c=_99[i];_9a+=_9c.end-_9c.start;}
return _9a;};var _9d=function(c){return(c>="a"&&c<="z")||(c>="A"&&c<="Z")||c=="_";};var _9f=function(s,_a1){if(!_9d(s[_a1])){return null;}
for(var i=_a1-1;i>=0&&_9d(s[i]);i--){}
var _a3=i+1;var n=s.length;for(i=_a1+1;i<n&&_9d(s[i]);i++){}
return{start:_a3,end:i};};var _a5=function(s,_a7,_a8){var _a9;if(_a8){_a9=_9f(s,_a7);}else{if(_a7<=0){return _a7;}
_a9=_9f(s,_a7-1);}
if(!_a9){return _a7;}
if(_a8){if(_a9.start>=_a7-_8b){return _a9.start;}
if(_a9.end<=_a7+_8b){return _a9.end;}}else{if(_a9.end<=_a7+_8b){return _a9.end;}
if(_a9.start>=_a7-_8b){return _a9.start;}}
return _a7;};var _aa=function(s,_ac){var _ad=[];if(_ac){var _ae=0;var n=s.length;var _b0=0;do{_ac.lastIndex=_ae;var _b1=_ac.exec(s);if(_b1){if(_ae<_b1.index){var t=s.substring(_ae,_b1.index);_ad.push({text:t});}
_ad.push({text:_b1[0],isMatch:true});_ae=_b1.index+_b1[0].length;}else{_ad.push({text:s.substr(_ae)});break;}}while(true);}else{_ad.push({text:s});}
return _ad;};var _b3=function(_b4){var _b5=0;for(var i=0;i<_b4.length;i++){if(_b4[i].isMatch){_b5++;}}
return _b5;};var _b7=function(s,_b9,_ba,_bb,_bc){var _bd=Math.max(Math.floor(_bc/(_bb+1)),_8a);var _be=Math.max(_bd-(_ba-_b9),0);var _bf=Math.min(Math.floor(_ba+_be/3),s.length);var _c0=Math.max(_bf-_bd,0);_c0=_a5(s,_c0,true);_bf=_a5(s,_bf,false);return{start:_c0,end:_bf};};var _c1=function(_c2,s,_c4){var _c5=[];var _c6=_b3(_c2);var pos=0;for(var i=0;i<_c2.length;i++){var t=_c2[i];var _ca=t.text;if(t.isMatch){var _cb=_b7(s,pos,pos+_ca.length,_c6,_c4);_8c(_c5,_cb.start,_cb.end);}
pos+=_ca.length;}
return _c5;};var _cc=function(s,_ce,_cf){var _d0=_cf-_98(_ce);while(_d0>0){if(_ce.length==0){_8c(_ce,0,_a5(s,_cf,false));return;}else{var _d1=_ce[0];var _d2;var _d3;if(_d1.start==0){_d2=_d1.end;if(_ce.length>1){_d3=_ce[1].start;}else{_8c(_ce,_d2,_a5(s,_d2+_d0,false));return;}}else{_d2=0;_d3=_d1.start;}
var _d4=Math.min(_d3,_d2+_d0);_8c(_ce,_d2,_d4);_d0-=(_d4-_d2);}}};var _d5=function(_d6,s,_d8,_d9,_da){if(_d9.length==0){return;}
var _db=function(_dc,s,_de,_df,_e0){var t;var _e2;var pos=0;var i=0;var _e5=0;for(;i<_de.length;i++){t=_de[i];_e2=t.text;if(_df<pos+_e2.length){_e5=_df-pos;break;}
pos+=_e2.length;}
var _e6=_e0-_df;for(;i<_de.length&&_e6>0;i++){t=_de[i];_e2=t.text.substr(_e5);_e5=0;if(_e2.length>_e6){_e2=_e2.substr(0,_e6);}
if(t.isMatch){createTiddlyElement(_dc,"span",null,"marked",_e2);}else{createTiddlyText(_dc,_e2);}
_e6-=_e2.length;}
if(_e0<s.length){abego.createEllipsis(_dc);}};if(_d9[0].start>0){abego.createEllipsis(_d6);}
var _e7=_da;for(var i=0;i<_d9.length&&_e7>0;i++){var _e9=_d9[i];var len=Math.min(_e9.end-_e9.start,_e7);_db(_d6,s,_d8,_e9.start,_e9.start+len);_e7-=len;}};this.render=function(_eb,s,_ed,_ee){if(s.length<_ed){_ed=s.length;}
var _ef=_aa(s,_ee);var _f0=_c1(_ef,s,_ed);_cc(s,_f0,_ed);_d5(_eb,s,_ef,_f0,_ed);};};(function(){function alertAndThrow(msg){alert(msg);throw msg;}
if(version.major<2||(version.major==2&&version.minor<1)){alertAndThrow("YourSearchPlugin requires TiddlyWiki 2.1 or newer.\n\nCheck the archive for YourSearch plugins\nsupporting older versions of TiddlyWiki.\n\nArchive: http://tiddlywiki.abego-software.de/archive");}
abego.YourSearch={};var _f2;var _f3;var _f4=function(_f5){_f2=_f5;};var _f6=function(){return _f2?_f2:[];};var _f7=function(){return _f2?_f2.length:0;};var _f8=4;var _f9=10;var _fa=2;var _fb=function(s,re){var m=s.match(re);return m?m.length:0;};var _ff=function(_100,_101){var _102=_101.getMarkRegExp();if(!_102){return 1;}
var _103=_100.title.match(_102);var _104=_103?_103.length:0;var _105=_fb(_100.getTags(),_102);var _106=_103?_103.join("").length:0;var _107=_100.title.length>0?_106/_100.title.length:0;var rank=_104*_f8+_105*_fa+_107*_f9+1;return rank;};var _109=function(_10a,_10b,_10c,_10d,_10e,_10f){_f3=null;var _110=_10a.reverseLookup("tags",_10f,false);try{var _111=[];if(config.options.chkSearchInTitle){_111.push("title");}
if(config.options.chkSearchInText){_111.push("text");}
if(config.options.chkSearchInTags){_111.push("tags");}
_f3=new abego.TiddlerQuery(_10b,_10c,_10d,_111,config.options.chkSearchExtendedFields);}
catch(e){return[];}
var _112=_f3.filter(_110);var _113=abego.YourSearch.getRankFunction();for(var i=0;i<_112.length;i++){var _115=_112[i];var rank=_113(_115,_f3);_115.searchRank=rank;}
if(!_10e){_10e="title";}
var _117=function(a,b){var _11a=a.searchRank-b.searchRank;if(_11a==0){if(a[_10e]==b[_10e]){return(0);}else{return(a[_10e]<b[_10e])?-1:+1;}}else{return(_11a>0)?-1:+1;}};_112.sort(_117);return _112;};var _11b=80;var _11c=50;var _11d=250;var _11e=50;var _11f=25;var _120=10;var _121="yourSearchResult";var _122="yourSearchResultItems";var _123;var _124;var _125;var _126;var _127;var _128=function(){if(version.extensions.YourSearchPlugin.styleSheetInited){return;}
version.extensions.YourSearchPlugin.styleSheetInited=true;setStylesheet(store.getTiddlerText("YourSearchStyleSheet"),"yourSearch");};var _129=function(){return _124!=null&&_124.parentNode==document.body;};var _12a=function(){if(_129()){document.body.removeChild(_124);}};var _12b=function(e){_12a();var _12d=this.getAttribute("tiddlyLink");if(_12d){var _12e=this.getAttribute("withHilite");var _12f=highlightHack;if(_12e&&_12e=="true"&&_f3){highlightHack=_f3.getMarkRegExp();}
story.displayTiddler(this,_12d);highlightHack=_12f;}
return(false);};var _130=function(){if(!_125){return;}
var root=_125;var _132=findPosX(root);var _133=findPosY(root);var _134=root.offsetHeight;var _135=_132;var _136=_133+_134;var _137=findWindowWidth();if(_137<_124.offsetWidth){_124.style.width=(_137-100)+"px";_137=findWindowWidth();}
var _138=_124.offsetWidth;if(_135+_138>_137){_135=_137-_138-30;}
if(_135<0){_135=0;}
_124.style.left=_135+"px";_124.style.top=_136+"px";_124.style.display="block";};var _139=function(){if(_124){window.scrollTo(0,ensureVisible(_124));}
if(_125){window.scrollTo(0,ensureVisible(_125));}};var _13a=function(){_130();_139();};var _13b;var _13c;var _13d=new abego.PageWiseRenderer();var _13e=function(_13f){this.itemHtml=store.getTiddlerText("YourSearchItemTemplate");if(!this.itemHtml){alertAndThrow("YourSearchItemTemplate not found");}
this.place=document.getElementById(_122);if(!this.place){this.place=createTiddlyElement(_13f,"div",_122);}};merge(_13e.prototype,{render:function(_140,_141,_142,_143){_13b=_143;_13c=_141;var item=createTiddlyElement(this.place,"div",null,"yourSearchItem");item.innerHTML=this.itemHtml;applyHtmlMacros(item,null);refreshElements(item,null);},endRendering:function(_145){_13c=null;}});var _146=function(){if(!_124||!_125){return;}
var html=store.getTiddlerText("YourSearchResultTemplate");if(!html){html="<b>Tiddler YourSearchResultTemplate not found</b>";}
_124.innerHTML=html;applyHtmlMacros(_124,null);refreshElements(_124,null);var _148=new _13e(_124);_13d.renderPage(_148);_13a();};_13d.getItemsPerPage=function(){var n=(config.options.chkPreviewText)?abego.toInt(config.options.txtItemsPerPageWithPreview,_120):abego.toInt(config.options.txtItemsPerPage,_11f);return(n>0)?n:1;};_13d.onPageChanged=function(){_146();};var _14a=function(){if(_125==null||!config.options.chkUseYourSearch){return;}
if((_125.value==_123)&&_123&&!_129()){if(_124&&(_124.parentNode!=document.body)){document.body.appendChild(_124);_13a();}else{abego.YourSearch.onShowResult(true);}}};var _14b=function(){_12a();_124=null;_123=null;};var _14c=function(self,e){while(e!=null){if(self==e){return true;}
e=e.parentNode;}
return false;};var _14f=function(e){if(e.target==_125){return;}
if(e.target==_126){return;}
if(_124&&_14c(_124,e.target)){return;}
_12a();};var _151=function(e){if(e.keyCode==27){_12a();}};addEvent(document,"click",_14f);addEvent(document,"keyup",_151);var _153=function(text,_155,_156){_123=text;_f4(_109(store,text,_155,_156,"title","excludeSearch"));abego.YourSearch.onShowResult();};var _157=function(_158,_159,_15a,_15b,_15c,_15d){_128();_123="";var _15e=null;var _15f=function(txt){if(config.options.chkUseYourSearch){_153(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);}else{story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);}
_123=txt.value;};var _161=function(e){_15f(_125);return false;};var _163=function(e){if(!e){var e=window.event;}
_125=this;switch(e.keyCode){case 13:if(e.ctrlKey&&_127&&_129()){_127.onclick.apply(_127,[e]);}else{_15f(this);}
break;case 27:if(_129()){_12a();}else{this.value="";clearMessage();}
break;}
if(String.fromCharCode(e.keyCode)==this.accessKey||e.altKey){_14a();}
if(this.value.length<3&&_15e){clearTimeout(_15e);}
if(this.value.length>2){if(this.value!=_123){if(!config.options.chkUseYourSearch||config.options.chkSearchAsYouType){if(_15e){clearTimeout(_15e);}
var txt=this;_15e=setTimeout(function(){_15f(txt);},500);}}else{if(_15e){clearTimeout(_15e);}}}
if(this.value.length==0){_12a();}};var _166=function(e){this.select();clearMessage();_14a();};var args=_15c.parseParams("list",null,true);var _169=getFlag(args,"buttonAtRight");var _16a=getParam(args,"sizeTextbox",this.sizeTextbox);var btn;if(!_169){btn=createTiddlyButton(_158,this.label,this.prompt,_161);}
var txt=createTiddlyElement(_158,"input",null,null,null);if(_15a[0]){txt.value=_15a[0];}
txt.onkeyup=_163;txt.onfocus=_166;txt.setAttribute("size",_16a);txt.setAttribute("accessKey",this.accessKey);txt.setAttribute("autocomplete","off");if(config.browser.isSafari){txt.setAttribute("type","search");txt.setAttribute("results","5");}else{txt.setAttribute("type","text");}
if(_169){btn=createTiddlyButton(_158,this.label,this.prompt,_161);}
_125=txt;_126=btn;};var _16d=function(){_12a();var _16e=_f6();var n=_16e.length;if(n){var _170=[];for(var i=0;i<n;i++){_170.push(_16e[i].title);}
story.displayTiddlers(null,_170);}};var _172=function(_173,_174,_175,_176){invokeMacro(_173,"option",_174,_175,_176);var elem=_173.lastChild;var _178=elem.onclick;elem.onclick=function(e){var _17a=_178.apply(this,arguments);_146();return _17a;};return elem;};var _17b=function(s){var _17d=["''","{{{","}}}","//","<<<","/***","***/"];var _17e="";for(var i=0;i<_17d.length;i++){if(i!=0){_17e+="|";}
_17e+="("+_17d[i].escapeRegExp()+")";}
return s.replace(new RegExp(_17e,"mg"),"").trim();};var _180=function(){var i=_13b;return(i>=0&&i<=9)?(i<9?(i+1):0):-1;};var _182=new abego.LimitedTextRenderer();var _183=function(_184,s,_186){_182.render(_184,s,_186,_f3.getMarkRegExp());};var _187=TiddlyWiki.prototype.saveTiddler;TiddlyWiki.prototype.saveTiddler=function(_188,_189,_18a,_18b,_18c,tags,_18e){_187.apply(this,arguments);_14b();};var _18f=TiddlyWiki.prototype.removeTiddler;TiddlyWiki.prototype.removeTiddler=function(_190){_18f.apply(this,arguments);_14b();};config.macros.yourSearch={label:"yourSearch",prompt:"Gives access to the current/last YourSearch result",handler:function(_191,_192,_193,_194,_195,_196){if(_193.length==0){return;}
var name=_193[0];var func=config.macros.yourSearch.funcs[name];if(func){func(_191,_192,_193,_194,_195,_196);}},tests:{"true":function(){return true;},"false":function(){return false;},"found":function(){return _f7()>0;},"previewText":function(){return config.options.chkPreviewText;}},funcs:{itemRange:function(_199){if(_f7()){var _19a=_13d.getLastIndexOnPage();var s="%0 - %1".format([_13d.getFirstIndexOnPage()+1,_19a+1]);createTiddlyText(_199,s);}},count:function(_19c){createTiddlyText(_19c,_f7().toString());},query:function(_19d){if(_f3){createTiddlyText(_19d,_f3.toString());}},version:function(_19e){var t="YourSearch %0.%1.%2".format([version.extensions.YourSearchPlugin.major,version.extensions.YourSearchPlugin.minor,version.extensions.YourSearchPlugin.revision]);var e=createTiddlyElement(_19e,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de/#YourSearchPlugin");e.innerHTML="<font color=\"black\" face=\"Arial, Helvetica, sans-serif\">"+t+"<font>";},copyright:function(_1a1){var e=createTiddlyElement(_1a1,"a");e.setAttribute("href","http://www.abego-software.de");e.innerHTML="<font color=\"black\" face=\"Arial, Helvetica, sans-serif\">&copy; 2005-2008 <b><font color=\"red\">abego</font></b> Software<font>";},newTiddlerButton:function(_1a3){if(_f3){var r=abego.parseNewTiddlerCommandLine(_f3.getQueryText());var btn=config.macros.newTiddler.createNewTiddlerButton(_1a3,r.title,r.params,"new tiddler","Create a new tiddler based on search text. (Shortcut: Ctrl-Enter; Separators: '.', '#')",null,"text");var _1a6=btn.onclick;btn.onclick=function(){_12a();_1a6.apply(this,arguments);};_127=btn;}},linkButton:function(_1a7,_1a8,_1a9,_1aa,_1ab,_1ac){if(_1a9<2){return;}
var _1ad=_1a9[1];var text=_1a9<3?_1ad:_1a9[2];var _1af=_1a9<4?text:_1a9[3];var _1b0=_1a9<5?null:_1a9[4];var btn=createTiddlyButton(_1a7,text,_1af,_12b,null,null,_1b0);btn.setAttribute("tiddlyLink",_1ad);},closeButton:function(_1b2,_1b3,_1b4,_1b5,_1b6,_1b7){var _1b8=createTiddlyButton(_1b2,"close","Close the Search Results (Shortcut: ESC)",_12a);},openAllButton:function(_1b9,_1ba,_1bb,_1bc,_1bd,_1be){var n=_f7();if(n==0){return;}
var _1c0=n==1?"open tiddler":"open all %0 tiddlers".format([n]);var _1c1=createTiddlyButton(_1b9,_1c0,"Open all found tiddlers (Shortcut: Alt-O)",_16d);_1c1.setAttribute("accessKey","O");},naviBar:function(_1c2,_1c3,_1c4,_1c5,_1c6,_1c7){_13d.addPageNavigation(_1c2);},"if":function(_1c8,_1c9,_1ca,_1cb,_1cc,_1cd){if(_1ca.length<2){return;}
var _1ce=_1ca[1];var _1cf=(_1ce=="not");if(_1cf){if(_1ca.length<3){return;}
_1ce=_1ca[2];}
var test=config.macros.yourSearch.tests[_1ce];var _1d1=false;try{if(test){_1d1=test(_1c8,_1c9,_1ca,_1cb,_1cc,_1cd)!=_1cf;}else{_1d1=(!eval(_1ce))==_1cf;}}
catch(ex){}
if(!_1d1){_1c8.style.display="none";}},chkPreviewText:function(_1d2,_1d3,_1d4,_1d5,_1d6,_1d7){var _1d8=_1d4.slice(1).join(" ");var elem=_172(_1d2,"chkPreviewText",_1d5,_1d7);elem.setAttribute("accessKey","P");elem.title="Show text preview of found tiddlers (Shortcut: Alt-P)";return elem;}}};config.macros.foundTiddler={label:"foundTiddler",prompt:"Provides information on the tiddler currently processed on the YourSearch result page",handler:function(_1da,_1db,_1dc,_1dd,_1de,_1df){var name=_1dc[0];var func=config.macros.foundTiddler.funcs[name];if(func){func(_1da,_1db,_1dc,_1dd,_1de,_1df);}},funcs:{title:function(_1e2,_1e3,_1e4,_1e5,_1e6,_1e7){if(!_13c){return;}
var _1e8=_180();var _1e9=_1e8>=0?"Open tiddler (Shortcut: Alt-%0)".format([_1e8.toString()]):"Open tiddler";var btn=createTiddlyButton(_1e2,null,_1e9,_12b,null);btn.setAttribute("tiddlyLink",_13c.title);btn.setAttribute("withHilite","true");_183(btn,_13c.title,_11b);if(_1e8>=0){btn.setAttribute("accessKey",_1e8.toString());}},tags:function(_1eb,_1ec,_1ed,_1ee,_1ef,_1f0){if(!_13c){return;}
_183(_1eb,_13c.getTags(),_11c);},text:function(_1f1,_1f2,_1f3,_1f4,_1f5,_1f6){if(!_13c){return;}
_183(_1f1,_17b(_13c.text),_11d);},field:function(_1f7,_1f8,_1f9,_1fa,_1fb,_1fc){if(!_13c){return;}
var name=_1f9[1];var len=_1f9.length>2?abego.toInt(_1f9[2],_11e):_11e;var v=store.getValue(_13c,name);if(v){_183(_1f7,_17b(v),len);}},number:function(_200,_201,_202,_203,_204,_205){var _206=_180();if(_206>=0){var text="%0)".format([_206.toString()]);createTiddlyElement(_200,"span",null,"shortcutNumber",text);}}}};var opts={chkUseYourSearch:true,chkPreviewText:true,chkSearchAsYouType:true,chkSearchInTitle:true,chkSearchInText:true,chkSearchInTags:true,chkSearchExtendedFields:true,txtItemsPerPage:_11f,txtItemsPerPageWithPreview:_120};for(var n in opts){if(config.options[n]==undefined){config.options[n]=opts[n];}}
config.shadowTiddlers.AdvancedOptions+="\n<<option chkUseYourSearch>> Use 'Your Search' //([[more options|YourSearch Options]]) ([[help|YourSearch Help]])// ";config.shadowTiddlers["YourSearch Help"]="!Field Search\nWith the Field Search you can restrict your search to certain fields of a tiddler, e.g"+" only search the tags or only the titles. The general form is //fieldname//'':''//textToSearch// (e."+"g. {{{title:intro}}}). In addition one-character shortcuts are also supported for the standard field"+"s {{{title}}}, {{{text}}} and {{{tags}}}:\n|!What you want|!What you type|!Example|\n|Search ''titles "+"only''|start word with ''!''|{{{!jonny}}} (shortcut for {{{title:jonny}}})|\n|Search ''contents/text "+"only''|start word with ''%''|{{{%football}}} (shortcut for {{{text:football}}})|\n|Search ''tags only"+"''|start word with ''#''|{{{#Plugin}}} (shortcut for {{{tags:Plugin}}})|\n\nUsing this feature you may"+" also search the extended fields (\"Metadata\") introduced with TiddlyWiki 2.1, e.g. use {{{priority:1"+"}}} to find all tiddlers with the priority field set to \"1\".\n\nYou may search a word in more than one"+" field. E.g. {{{!#Plugin}}} (or {{{title:tags:Plugin}}} in the \"long form\") finds tiddlers containin"+"g \"Plugin\" either in the title or in the tags (but does not look for \"Plugin\" in the text). \n\n!Boole"+"an Search\nThe Boolean Search is useful when searching for multiple words.\n|!What you want|!What you "+"type|!Example|\n|''All words'' must exist|List of words|{{{jonny jeremy}}} (or {{{jonny and jeremy}}}"+")|\n|''At least one word'' must exist|Separate words by ''or''|{{{jonny or jeremy}}}|\n|A word ''must "+"not exist''|Start word with ''-''|{{{-jonny}}} (or {{{not jonny}}})|\n\n''Note:'' When you specify two"+" words, separated with a space, YourSearch finds all tiddlers that contain both words, but not neces"+"sarily next to each other. If you want to find a sequence of word, e.g. '{{{John Brown}}}', you need"+" to put the words into quotes. I.e. you type: {{{\"john brown\"}}}.\n\nUsing parenthesis you may change "+"the default \"left to right\" evaluation of the boolean search. E.g. {{{not (jonny or jeremy)}}} finds"+" all tiddlers that contain neither \"jonny\" nor \"jeremy. In contrast to this {{{not jonny or jeremy}}"+"} (i.e. without parenthesis) finds all tiddlers that either don't contain \"jonny\" or that contain \"j"+"eremy\".\n\n!'Exact Word' Search\nBy default a search result all matches that 'contain' the searched tex"+"t. E.g. if you search for {{{Task}}} you will get all tiddlers containing 'Task', but also '~Complet"+"edTask', '~TaskForce' etc.\n\nIf you only want to get the tiddlers that contain 'exactly the word' you"+" need to prefix it with a '='. E.g. typing '=Task' will find the tiddlers that contain the word 'Tas"+"k', ignoring words that just contain 'Task' as a substring.\n\n!~CaseSensitiveSearch and ~RegExpSearch"+"\nThe standard search options ~CaseSensitiveSearch and ~RegExpSearch are fully supported by YourSearc"+"h. However when ''~RegExpSearch'' is on Filtered and Boolean Search are disabled.\n\nIn addition you m"+"ay do a \"regular expression\" search even with the ''~RegExpSearch'' set to false by directly enterin"+"g the regular expression into the search field, framed with {{{/.../}}}. \n\nExample: {{{/m[ae][iy]er/"+"}}} will find all tiddlers that contain either \"maier\", \"mayer\", \"meier\" or \"meyer\".\n\n!~JavaScript E"+"xpression Filtering\nIf you are familiar with JavaScript programming and know some TiddlyWiki interna"+"ls you may also use JavaScript expression for the search. Just enter a JavaScript boolean expression"+" into the search field, framed with {{{ { ... } }}}. In the code refer to the variable tiddler and e"+"valuate to {{{true}}} when the given tiddler should be included in the result. \n\nExample: {{{ { tidd"+"ler.modified > new Date(\"Jul 4, 2005\")} }}} returns all tiddler modified after July 4th, 2005.\n\n!Com"+"bined Search\nYou are free to combine the various search options. \n\n''Examples''\n|!What you type|!Res"+"ult|\n|{{{!jonny !jeremy -%football}}}|all tiddlers with both {{{jonny}}} and {{{jeremy}}} in its tit"+"les, but no {{{football}}} in content.|\n|{{{#=Task}}}|All tiddlers tagged with 'Task' (the exact wor"+"d). Tags named '~CompletedTask', '~TaskForce' etc. are not considered.|\n\n!Access Keys\nYou are encour"+"aged to use the access keys (also called \"shortcut\" keys) for the most frequently used operations. F"+"or quick reference these shortcuts are also mentioned in the tooltip for the various buttons etc.\n\n|"+"!Key|!Operation|\n|{{{Alt-F}}}|''The most important keystroke'': It moves the cursor to the search in"+"put field so you can directly start typing your query. Pressing {{{Alt-F}}} will also display the pr"+"evious search result. This way you can quickly display multiple tiddlers using \"Press {{{Alt-F}}}. S"+"elect tiddler.\" sequences.|\n|{{{ESC}}}|Closes the [[YourSearch Result]]. When the [[YourSearch Resul"+"t]] is already closed and the cursor is in the search input field the field's content is cleared so "+"you start a new query.|\n|{{{Alt-1}}}, {{{Alt-2}}},... |Pressing these keys opens the first, second e"+"tc. tiddler from the result list.|\n|{{{Alt-O}}}|Opens all found tiddlers.|\n|{{{Alt-P}}}|Toggles the "+"'Preview Text' mode.|\n|{{{Alt-'<'}}}, {{{Alt-'>'}}}|Displays the previous or next page in the [[Your"+"Search Result]].|\n|{{{Return}}}|When you have turned off the 'as you type' search mode pressing the "+"{{{Return}}} key actually starts the search (as does pressing the 'search' button).|\n\n//If some of t"+"hese shortcuts don't work for you check your browser if you have other extensions installed that alr"+"eady \"use\" these shortcuts.//";config.shadowTiddlers["YourSearch Options"]="|>|!YourSearch Options|\n|>|<<option chkUseYourSearch>> Use 'Your Search'|\n|!|<<option chkPreviewText"+">> Show Text Preview|\n|!|<<option chkSearchAsYouType>> 'Search As You Type' Mode (No RETURN required"+" to start search)|\n|!|Default Search Filter:<<option chkSearchInTitle>>Title ('!')     <<option chk"+"SearchInText>>Text ('%')     <<option chkSearchInTags>>Tags ('#')    <<option chkSearchExtendedFiel"+"ds>>Extended Fields<html><br><font size=\"-2\">The fields of a tiddlers that are searched when you don"+"'t explicitly specify a filter in the search text <br>(Explictly specify fields using one or more '!"+"', '%', '#' or 'fieldname:' prefix before the word/text to find).</font></html>|\n|!|Number of items "+"on search result page: <<option txtItemsPerPage>>|\n|!|Number of items on search result page with pre"+"view text: <<option txtItemsPerPageWithPreview>>|\n";config.shadowTiddlers["YourSearchStyleSheet"]="/***\n!~YourSearchResult Stylesheet\n***/\n/*{{{*/\n.yourSearchResult {\n\tposition: absolute;\n\twidth: 800"+"px;\n\n\tpadding: 0.2em;\n\tlist-style: none;\n\tmargin: 0;\n\n\tbackground: #ffd;\n\tborder: 1px solid DarkGra"+"y;\n}\n\n/*}}}*/\n/***\n!!Summary Section\n***/\n/*{{{*/\n.yourSearchResult .summary {\n\tborder-bottom-width:"+" thin;\n\tborder-bottom-style: solid;\n\tborder-bottom-color: #999999;\n\tpadding-bottom: 4px;\n}\n\n.yourSea"+"rchRange, .yourSearchCount, .yourSearchQuery   {\n\tfont-weight: bold;\n}\n\n.yourSearchResult .summary ."+"button {\n\tfont-size: 10px;\n\n\tpadding-left: 0.3em;\n\tpadding-right: 0.3em;\n}\n\n.yourSearchResult .summa"+"ry .chkBoxLabel {\n\tfont-size: 10px;\n\n\tpadding-right: 0.3em;\n}\n\n/*}}}*/\n/***\n!!Items Area\n***/\n/*{{{*"+"/\n.yourSearchResult .marked {\n\tbackground: none;\n\tfont-weight: bold;\n}\n\n.yourSearchItem {\n\tmargin-to"+"p: 2px;\n}\n\n.yourSearchNumber {\n\tcolor: #808080;\n}\n\n\n.yourSearchTags {\n\tcolor: #008000;\n}\n\n.yourSearc"+"hText {\n\tcolor: #808080;\n\tmargin-bottom: 6px;\n}\n\n/*}}}*/\n/***\n!!Footer\n***/\n/*{{{*/\n.yourSearchFoote"+"r {\n\tmargin-top: 8px;\n\tborder-top-width: thin;\n\tborder-top-style: solid;\n\tborder-top-color: #999999;"+"\n}\n\n.yourSearchFooter a:hover{\n\tbackground: none;\n\tcolor: none;\n}\n/*}}}*/\n/***\n!!Navigation Bar\n***/"+"\n/*{{{*/\n.yourSearchNaviBar a {\n\tfont-size: 16px;\n\tmargin-left: 4px;\n\tmargin-right: 4px;\n\tcolor: bla"+"ck;\n\ttext-decoration: underline;\n}\n\n.yourSearchNaviBar a:hover {\n\tbackground-color: none;\n}\n\n.yourSe"+"archNaviBar .prev {\n\tfont-weight: bold;\n\tcolor: blue;\n}\n\n.yourSearchNaviBar .currentPage {\n\tcolor: #"+"FF0000;\n\tfont-weight: bold;\n\ttext-decoration: none;\n}\n\n.yourSearchNaviBar .next {\n\tfont-weight: bold"+";\n\tcolor: blue;\n}\n/*}}}*/\n";config.shadowTiddlers["YourSearchResultTemplate"]="<!--\n{{{\n-->\n<span macro=\"yourSearch if found\">\n<!-- The Summary Header ============================"+"================ -->\n<table class=\"summary\" border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">"+"<tbody>\n  <tr>\n\t<td align=\"left\">\n\t\tYourSearch Result <span class=\"yourSearchRange\" macro=\"yourSearc"+"h itemRange\"></span>\n\t\t&nbsp;of&nbsp;<span class=\"yourSearchCount\" macro=\"yourSearch count\"></span>\n"+"\t\tfor&nbsp;<span class=\"yourSearchQuery\" macro=\"yourSearch query\"></span>\n\t</td>\n\t<td class=\"yourSea"+"rchButtons\" align=\"right\">\n\t\t<span macro=\"yourSearch chkPreviewText\"></span><span class=\"chkBoxLabel"+"\">preview text</span>\n\t\t<span macro=\"yourSearch newTiddlerButton\"></span>\n\t\t<span macro=\"yourSearch openAllButton\"></span>\n\t\t<span macro=\"yourSearch lin"+"kButton 'YourSearch Options' options 'Configure YourSearch'\"></span>\n\t\t<span macro=\"yourSearch linkB"+"utton 'YourSearch Help' help 'Get help how to use YourSearch'\"></span>\n\t\t<span macro=\"yourSearch clo"+"seButton\"></span>\n\t</td>\n  </tr>\n</tbody></table>\n\n<!-- The List of Found Tiddlers ================="+"=========================== -->\n<div id=\"yourSearchResultItems\" itemsPerPage=\"25\" itemsPerPageWithPr"+"eview=\"10\"></div>\n\n<!-- The Footer (with the Navigation) ==========================================="+"= -->\n<table class=\"yourSearchFooter\" border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tbody"+">\n  <tr>\n\t<td align=\"left\">\n\t\tResult page: <span class=\"yourSearchNaviBar\" macro=\"yourSearch naviBar"+"\"></span>\n\t</td>\n\t<td align=\"right\"><span macro=\"yourSearch version\"></span>, <span macro=\"yourSearc"+"h copyright\"></span>\n\t</td>\n  </tr>\n</tbody></table>\n<!-- end of the 'tiddlers found' case ========="+"================================== -->\n</span>\n\n\n<!-- The \"No tiddlers found\" case ================="+"========================== -->\n<span macro=\"yourSearch if not found\">\n<table class=\"summary\" border="+"\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tbody>\n  <tr>\n\t<td align=\"left\">\n\t\tYourSearch Resu"+"lt: No tiddlers found for <span class=\"yourSearchQuery\" macro=\"yourSearch query\"></span>.\n\t</td>\n\t<t"+"d class=\"yourSearchButtons\" align=\"right\">\n\t\t<span macro=\"yourSearch newTiddlerButton\"></span>\n\t\t<span macro=\"yourSearch linkButton 'YourSearch Options'"+" options 'Configure YourSearch'\"></span>\n\t\t<span macro=\"yourSearch linkButton 'YourSearch Help' help"+" 'Get help how to use YourSearch'\"></span>\n\t\t<span macro=\"yourSearch closeButton\"></span>\n\t</td>\n  <"+"/tr>\n</tbody></table>\n</span>\n\n\n<!--\n}}}\n-->\n";config.shadowTiddlers["YourSearchItemTemplate"]="<!--\n{{{\n-->\n<span class='yourSearchNumber' macro='foundTiddler number'></span>\n<span class='yourSea"+"rchTitle' macro='foundTiddler title'/></span>&nbsp;-&nbsp;\n<span class='yourSearchTags' macro='found"+"Tiddler field tags 50'/></span>\n<span macro=\"yourSearch if previewText\"><div class='yourSearchText' macro='fo"+"undTiddler field text 250'/></div></span>\n<!--\n}}}\n-->";config.shadowTiddlers["YourSearch"]="<<tiddler [[YourSearch Help]]>>";config.shadowTiddlers["YourSearch Result"]="The popup-like window displaying the result of a YourSearch query.";config.macros.search.handler=_157;var _20a=function(){if(config.macros.search.handler!=_157){alert("Message from YourSearchPlugin:\n\n\nAnother plugin has disabled the 'Your Search' features.\n\n\nYou may "+"disable the other plugin or change the load order of \nthe plugins (by changing the names of the tidd"+"lers)\nto enable the 'Your Search' features.");}};setTimeout(_20a,5000);abego.YourSearch.getStandardRankFunction=function(){return _ff;};abego.YourSearch.getRankFunction=function(){return abego.YourSearch.getStandardRankFunction();};abego.YourSearch.getCurrentTiddler=function(){return _13c;};abego.YourSearch.closeResult=function(){_12a();};abego.YourSearch.getFoundTiddlers=function(){return _f2;};abego.YourSearch.getQuery=function(){return _f3;};abego.YourSearch.onShowResult=function(_20b){highlightHack=_f3?_f3.getMarkRegExp():null;if(!_20b){_13d.setItems(_f6());}
if(!_124){_124=createTiddlyElement(document.body,"div",_121,"yourSearchResult");}else{if(_124.parentNode!=document.body){document.body.appendChild(_124);}}
_146();highlightHack=null;};})();}
//%/