<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.hackuarium.ch/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Zaphod</id>
	<title>Hackuarium - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.hackuarium.ch/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Zaphod"/>
	<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/w/Special:Contributions/Zaphod"/>
	<updated>2026-11-04T11:08:42Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=User:Zaphod/common.js&amp;diff=19951</id>
		<title>User:Zaphod/common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=User:Zaphod/common.js&amp;diff=19951"/>
		<updated>2026-11-04T10:48:47Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: testing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;alert('test');&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=User:Zaphod/common.js&amp;diff=19950</id>
		<title>User:Zaphod/common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=User:Zaphod/common.js&amp;diff=19950"/>
		<updated>2026-11-04T10:43:22Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: Created and added HotCat script from https://commons.wikimedia.org/wiki/MediaWiki:Gadget-HotCat.js&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/**&lt;br /&gt;
HotCat V2.47&lt;br /&gt;
&lt;br /&gt;
Ajax-based simple Category manager. Allows adding/removing/changing categories on a page view.&lt;br /&gt;
Supports multiple category changes, as well as redirect and disambiguation resolution. Also&lt;br /&gt;
plugs into the upload form. Search engines to use for the suggestion list are configurable, and&lt;br /&gt;
can be selected interactively.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://commons.wikimedia.org/wiki/Help:Gadget-HotCat&lt;br /&gt;
List of main authors: https://commons.wikimedia.org/wiki/Help:Gadget-HotCat/Version_history&lt;br /&gt;
&lt;br /&gt;
License: Quadruple licensed GFDL, GPL, LGPL and Creative Commons Attribution 3.0 (CC-BY-3.0)&lt;br /&gt;
&lt;br /&gt;
Choose whichever license of these you like best :-)&lt;br /&gt;
&lt;br /&gt;
This code should run on any MediaWiki installation &amp;gt;= MW 1.32.&lt;br /&gt;
&lt;br /&gt;
For use with older versions of MediaWiki, use the archived versions below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;=1.31: https://commons.wikimedia.org/w/index.php?title=MediaWiki:Gadget-HotCat.js&amp;amp;oldid=1001064319&lt;br /&gt;
&amp;lt;=1.26: https://commons.wikimedia.org/w/index.php?title=MediaWiki:Gadget-HotCat.js&amp;amp;oldid=211134664&lt;br /&gt;
*/&lt;br /&gt;
// &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/* eslint-disable vars-on-top, one-var, camelcase, no-alert, curly */&lt;br /&gt;
/* global jQuery, mediaWiki, UFUI, JSconfig, UploadForm */&lt;br /&gt;
/* jslint strict:false, nonew:false, bitwise:true */&lt;br /&gt;
( function ( $, mw ) {&lt;br /&gt;
	// Don't use mw.config.get() as that takes a copy of the config, and so doesn't&lt;br /&gt;
	// account for values changing, e.g. wgCurRevisionId after a VE edit&lt;br /&gt;
	var conf = mw.config.values;&lt;br /&gt;
    // Expand relative to location.href, so that we have a reliable prefix for other expanded&lt;br /&gt;
    // links in the current document, regardless of context (e.g. mobile domain)&lt;br /&gt;
	var expandedScriptPrefix = new URL(conf.wgScript, location.href).href;&lt;br /&gt;
	var expandedArticlePrefix = new URL(conf.wgArticlePath.replace( '$1', '' ), location.href).href;&lt;br /&gt;
&lt;br /&gt;
	// Guard against double inclusions (in old IE/Opera element ids become window properties)&lt;br /&gt;
	if ( ( window.HotCat &amp;amp;&amp;amp; !window.HotCat.nodeName ) ||&lt;br /&gt;
		conf.wgAction === 'edit' ) // Not on edit mode&lt;br /&gt;
		return;&lt;br /&gt;
&lt;br /&gt;
	// Configuration holder. This is here so that the most common config and interface messages&lt;br /&gt;
	// can be defined using the same format as translation subpages and /local_defaults.&lt;br /&gt;
	// The rest is added later.&lt;br /&gt;
	var HC = HotCat = window.HotCat = {&lt;br /&gt;
		messages: {},&lt;br /&gt;
		// Tooltips for the HotCat.links icons&lt;br /&gt;
		tooltips: {},&lt;br /&gt;
		engine_names: {}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	// Common site configuration&lt;br /&gt;
	//&lt;br /&gt;
	// DO NOT EDIT&lt;br /&gt;
	//&lt;br /&gt;
	// Create the [[MediaWiki:Gadget-HotCat.js/local_defaults]] page&lt;br /&gt;
	// on your wiki, and copy only the line you want to change there,&lt;br /&gt;
	// and then change it there.&lt;br /&gt;
	//&lt;br /&gt;
	HotCat.messages.cat_removed = 'removed [[Category:$1]]';&lt;br /&gt;
	HotCat.messages.template_removed = 'removed {{[[Category:$1]]}}';&lt;br /&gt;
	HotCat.messages.cat_added = 'added [[Category:$1]]';&lt;br /&gt;
	// * $1 - Category name&lt;br /&gt;
	// * $2 - New key&lt;br /&gt;
	HotCat.messages.cat_keychange = 'new key for [[Category:$1]]: &amp;quot;$2&amp;quot;';&lt;br /&gt;
	HotCat.messages.cat_resolved = ' (redirect [[Category:$1]] resolved)';&lt;br /&gt;
	HotCat.messages.uncat_removed = 'removed {{uncategorized}}';&lt;br /&gt;
	HotCat.messages.separator = '; ';&lt;br /&gt;
	// This text is added to the start of the edit summary.&lt;br /&gt;
	HotCat.messages.prefix = '';&lt;br /&gt;
	// This text is added to the end of the edit summary.&lt;br /&gt;
	// If you prefer to have a marker at the front, use prefix instead&lt;br /&gt;
	// and set this to the empty string.&lt;br /&gt;
	HotCat.messages.using = ' using [[Help:Gadget-HotCat|HotCat]]';&lt;br /&gt;
	// If your language has several plural forms, [[:en:Dual (grammatical form)]],&lt;br /&gt;
	// you can set HotCat.messages.multi_change to an array of strings,&lt;br /&gt;
	// which works the same way as {{PLURAL:}} and mw.language.convertPlural().&lt;br /&gt;
	// https://translatewiki.net/wiki/Plural#Plural_syntax_in_MediaWiki&lt;br /&gt;
	//&lt;br /&gt;
	// Example for {{PLURAL:$1|one category|$1 categories}}:&lt;br /&gt;
	// HotCat.messages.multi_change = ['one category', '$1 categories'];&lt;br /&gt;
	HotCat.messages.multi_change = '$1 categories';&lt;br /&gt;
	// Automatic default is '[[' + category_canonical + ':$1]]'&lt;br /&gt;
	//&lt;br /&gt;
	// Override if, for example, the short edit summaries should mention&lt;br /&gt;
	// not the standard category namespace, but a shorter namespace alias.&lt;br /&gt;
	//&lt;br /&gt;
	// * $1 - Category name&lt;br /&gt;
	HotCat.messages.short_catchange = null;&lt;br /&gt;
	// Any subcategory of this category is deemed a disambiguation category,&lt;br /&gt;
	// i.e., a category that should not contain any items, but that contains&lt;br /&gt;
	// links to other categories where stuff should be categorized.&lt;br /&gt;
	// Use spaces, not underscores.&lt;br /&gt;
	// If you don't have that concept on your wiki, set it to null.&lt;br /&gt;
	HotCat.disambig_category = 'Disambiguation categories';&lt;br /&gt;
	// Any category in this category is deemed a (soft) redirect to some other category defined by a link&lt;br /&gt;
	// to another non-blacklisted category. If your wiki doesn't have soft category redirects, set this to null.&lt;br /&gt;
	// If a soft-redirected category contains more than one link to another non-blacklisted category, it's considered&lt;br /&gt;
	// a disambiguation category instead.&lt;br /&gt;
	HotCat.redir_category = 'Category redirects';&lt;br /&gt;
	// a list of categories which can be removed by removing a template&lt;br /&gt;
	// key: the category without namespace&lt;br /&gt;
	// value: A regexp matching the template name, again without namespace&lt;br /&gt;
	// If you don't have this at your wiki, or don't want this, leave it as an empty object {}.&lt;br /&gt;
	HotCat.template_categories = {};&lt;br /&gt;
	// A regexp matching a templates used to mark uncategorized pages, if your wiki does have that.&lt;br /&gt;
	// If not, set it to null.&lt;br /&gt;
	HotCat.uncat_regexp = /\{\{\s*[Uu]ncategorized\s*[^}]*\}\}\s*(&amp;lt;!--.*?--&amp;gt;\s*)?/g;&lt;br /&gt;
&lt;br /&gt;
	// User-interface messages&lt;br /&gt;
	//&lt;br /&gt;
	// DO NOT EDIT&lt;br /&gt;
	//&lt;br /&gt;
	// These are site-agnostic and must not be translated here.&lt;br /&gt;
	// HotCat automatically replaces these with translations from here:&lt;br /&gt;
	// https://commons.wikimedia.org/wiki/Special:Prefixindex/MediaWiki:Gadget-HotCat.js&lt;br /&gt;
	//&lt;br /&gt;
	// See also: window.hotcat_translations_from_commons&lt;br /&gt;
	//&lt;br /&gt;
	HotCat.messages.cat_notFound     = 'Category &amp;quot;$1&amp;quot; not found';&lt;br /&gt;
	HotCat.messages.cat_exists       = 'Category &amp;quot;$1&amp;quot; already exists; not added.';&lt;br /&gt;
	HotCat.messages.commit      = 'Save';&lt;br /&gt;
	HotCat.messages.ok          = 'OK';&lt;br /&gt;
	HotCat.messages.cancel      = 'Cancel';&lt;br /&gt;
	HotCat.messages.multi_error = 'Could not retrieve the page text from the server. Therefore, your category changes cannot be saved. We apologize for the inconvenience.';&lt;br /&gt;
	HotCat.categories = 'Categories';&lt;br /&gt;
	HotCat.tooltips.change  = 'Modify';&lt;br /&gt;
	HotCat.tooltips.remove  = 'Remove';&lt;br /&gt;
	HotCat.tooltips.add     = 'Add a new category';&lt;br /&gt;
	HotCat.tooltips.restore = 'Undo changes';&lt;br /&gt;
	HotCat.tooltips.undo    = 'Undo changes';&lt;br /&gt;
	HotCat.tooltips.down    = 'Open for modifying and display subcategories';&lt;br /&gt;
	HotCat.tooltips.up      = 'Open for modifying and display parent categories';&lt;br /&gt;
	HotCat.multi_tooltip = 'Modify several categories';&lt;br /&gt;
	HotCat.engine_names.searchindex = 'Search index';&lt;br /&gt;
	HotCat.engine_names.pagelist    = 'Page list';&lt;br /&gt;
	HotCat.engine_names.combined    = 'Combined search';&lt;br /&gt;
	HotCat.engine_names.subcat      = 'Subcategories';&lt;br /&gt;
	HotCat.engine_names.parentcat   = 'Parent categories';&lt;br /&gt;
&lt;br /&gt;
	// Misc site configuration&lt;br /&gt;
	//&lt;br /&gt;
	// DO NOT EDIT&lt;br /&gt;
	//&lt;br /&gt;
	// Create the [[MediaWiki:Gadget-HotCat.js/local_defaults]] page&lt;br /&gt;
	// on your wiki, and override only the configuration you want to change.&lt;br /&gt;
	//&lt;br /&gt;
	// For example:&lt;br /&gt;
	//&lt;br /&gt;
	//     HotCat.upload_disabled = false;&lt;br /&gt;
	//&lt;br /&gt;
	Object.assign(HC, {&lt;br /&gt;
		// The little modification links displayed after category names. U+2212 is a minus sign; U+2193 and U+2191 are&lt;br /&gt;
		// downward and upward pointing arrows. Do not use ↓ and ↑ in the code!&lt;br /&gt;
		links: {&lt;br /&gt;
			change: '(±)',&lt;br /&gt;
			remove: '(\u2212)',&lt;br /&gt;
			add: '(+)',&lt;br /&gt;
			restore: '(×)',&lt;br /&gt;
			undo: '(×)',&lt;br /&gt;
			down: '(\u2193)',&lt;br /&gt;
			up: '(\u2191)'&lt;br /&gt;
		},&lt;br /&gt;
		changeTag: conf.wgUserName ? 'HotCat' : '', // if tag is missing, edit is rejected&lt;br /&gt;
		// The HTML content of the &amp;quot;enter multi-mode&amp;quot; link at the front.&lt;br /&gt;
		addmulti: '&amp;lt;span&amp;gt;+&amp;lt;sup&amp;gt;+&amp;lt;/sup&amp;gt;&amp;lt;/span&amp;gt;',&lt;br /&gt;
		isSupportedContentModel: function() {&lt;br /&gt;
			return HC.wikitextContentModels.includes(conf.wgPageContentModel) ||&lt;br /&gt;
				HC.jsonContentModels.includes(conf.wgPageContentModel);&lt;br /&gt;
		},&lt;br /&gt;
		// Return true to disable HotCat.&lt;br /&gt;
		disable: function () {&lt;br /&gt;
			var ns = conf.wgNamespaceNumber;&lt;br /&gt;
			var nsIds = conf.wgNamespaceIds;&lt;br /&gt;
			return (&lt;br /&gt;
				ns &amp;lt; 0 || // Special pages; Special:Upload is handled differently&lt;br /&gt;
			ns === 10 || // Templates&lt;br /&gt;
			ns === 828 || // Module (Lua)&lt;br /&gt;
			ns === 8 || // MediaWiki&lt;br /&gt;
			ns === 6 &amp;amp;&amp;amp; !conf.wgArticleId || // Non-existing file pages&lt;br /&gt;
			ns === 2 &amp;amp;&amp;amp; /\.(js|css|json)$/.test( conf.wgTitle ) || // User scripts&lt;br /&gt;
			nsIds &amp;amp;&amp;amp;&lt;br /&gt;
			( ns === nsIds.creator ||&lt;br /&gt;
			ns === nsIds.timedtext ||&lt;br /&gt;
			ns === nsIds.institution ) );&lt;br /&gt;
		},&lt;br /&gt;
		// https://www.mediawiki.org/wiki/Content_handlers&lt;br /&gt;
		wikitextContentModels: [ 'wikitext', 'proofread-index', 'proofread-page' ],&lt;br /&gt;
		jsonContentModels: [ 'Tabular.JsonConfig', 'Map.JsonConfig', 'Chart.JsonConfig' ],&lt;br /&gt;
		// The images used for the little indication icon. Should not need changing.&lt;br /&gt;
		existsYes: '//upload.wikimedia.org/wikipedia/commons/thumb/b/be/P_yes.svg/20px-P_yes.svg.png',&lt;br /&gt;
		existsNo: '//upload.wikimedia.org/wikipedia/commons/thumb/4/42/P_no.svg/20px-P_no.svg.png',&lt;br /&gt;
&lt;br /&gt;
		// Override the decision of whether HotCat should help users by automatically&lt;br /&gt;
		// capitalising the title in the user input text if the wiki has case-sensitive page names.&lt;br /&gt;
		// Basically, this will make an API query to check the MediaWiki configuration and HotCat then sets&lt;br /&gt;
		// this to true for most wikis, and to false on Wiktionary.&lt;br /&gt;
		//&lt;br /&gt;
		// You can set this directly if there is a problem with it. For example, Georgian Wikipedia (kawiki),&lt;br /&gt;
		// is known to have different capitalisation logic between MediaWiki PHP and JavaScript. As such, automatic&lt;br /&gt;
		// case changes in JavaScript by HotCat would be wrong.&lt;br /&gt;
		capitalizePageNames: null,&lt;br /&gt;
		// If upload_disabled is true, HotCat will not be used on the Upload form.&lt;br /&gt;
		upload_disabled: false,&lt;br /&gt;
		// Single regular expression matching blacklisted categories that cannot be changed or&lt;br /&gt;
		// added using HotCat. For instance /\bstubs?$/ (any category ending with the word &amp;quot;stub&amp;quot;&lt;br /&gt;
		// or &amp;quot;stubs&amp;quot;), or /(\bstubs?$)|\bmaintenance\b/ (stub categories and any category with the&lt;br /&gt;
		// word &amp;quot;maintenance&amp;quot; in its title.&lt;br /&gt;
		blacklist: null,&lt;br /&gt;
&lt;br /&gt;
		// Stuff changeable by users:&lt;br /&gt;
		// Background for changed categories in multi-edit mode. Default is a very light salmon pink.&lt;br /&gt;
		bg_changed: '#FCA',&lt;br /&gt;
		// If true, HotCat will never automatically submit changes. HotCat will only open an edit page with&lt;br /&gt;
		// the changes; users must always save explicitly.&lt;br /&gt;
		no_autocommit: false,&lt;br /&gt;
		// If true, the &amp;quot;category deletion&amp;quot; link &amp;quot;(-)&amp;quot; will never save automatically but always show an&lt;br /&gt;
		// edit page where the user has to save the edit manually. Is false by default because that's the&lt;br /&gt;
		// traditional behavior. This setting overrides no_autocommit for &amp;quot;(-)&amp;quot; links.&lt;br /&gt;
		del_needs_diff: false,&lt;br /&gt;
		// Time, in milliseconds, that HotCat waits after a keystroke before making a request to the&lt;br /&gt;
		// server to get suggestions.&lt;br /&gt;
		suggest_delay: 100,&lt;br /&gt;
		// Default width, in characters, of the text input field.&lt;br /&gt;
		editbox_width: 40,&lt;br /&gt;
		// One of the engine_names above, to be used as the default suggestion engine.&lt;br /&gt;
		suggestions: 'combined',&lt;br /&gt;
		// If true, always use the default engine, and never display a selector.&lt;br /&gt;
		fixed_search: false,&lt;br /&gt;
		// If false, do not display the &amp;quot;up&amp;quot; and &amp;quot;down&amp;quot; links&lt;br /&gt;
		use_up_down: true,&lt;br /&gt;
		// Default list size&lt;br /&gt;
		listSize: 10,&lt;br /&gt;
		// If true, single category changes are marked as minor edits. If false, they're not.&lt;br /&gt;
		single_minor: true,&lt;br /&gt;
		// If true, never add a page to the user's watchlist. If false, pages get added to the watchlist if&lt;br /&gt;
		// the user has the &amp;quot;Add pages I edit to my watchlist&amp;quot; or the &amp;quot;Add pages I create to my watchlist&amp;quot;&lt;br /&gt;
		// options in his or her preferences set.&lt;br /&gt;
		dont_add_to_watchlist: false,&lt;br /&gt;
		shortcuts: null,&lt;br /&gt;
		addShortcuts: function ( map ) {&lt;br /&gt;
			if ( !map ) return;&lt;br /&gt;
			window.HotCat.shortcuts = window.HotCat.shortcuts || {};&lt;br /&gt;
			for ( var k in map ) {&lt;br /&gt;
				if ( !map.hasOwnProperty( k ) || typeof k !== 'string' ) continue;&lt;br /&gt;
&lt;br /&gt;
				var v = map[ k ];&lt;br /&gt;
				if ( typeof v !== 'string' ) continue;&lt;br /&gt;
&lt;br /&gt;
				k = k.replace( /^\s+|\s+$/g, '' );&lt;br /&gt;
				v = v.replace( /^\s+|\s+$/g, '' );&lt;br /&gt;
				if ( !k.length || !v.length ) continue;&lt;br /&gt;
&lt;br /&gt;
				window.HotCat.shortcuts[ k ] = v;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	// More backwards compatibility. We have a few places where we test for the browser: once for&lt;br /&gt;
	// Safari &amp;lt; 3.0, and twice for WebKit (Chrome or Safari, any versions)&lt;br /&gt;
	var ua = navigator.userAgent.toLowerCase();&lt;br /&gt;
	var is_webkit = /applewebkit\/\d+/.test( ua ) &amp;amp;&amp;amp; ua.indexOf( 'spoofer' ) &amp;lt; 0;&lt;br /&gt;
	var cat_prefix = null;&lt;br /&gt;
	var noSuggestions = false;&lt;br /&gt;
&lt;br /&gt;
	function LoadTrigger( needed ) {&lt;br /&gt;
		// Define methods in a closure so that self reference is available,&lt;br /&gt;
		// also allows method calls to be detached.&lt;br /&gt;
		var self = this;&lt;br /&gt;
		self.queue = [];&lt;br /&gt;
		self.needed = needed;&lt;br /&gt;
		self.register = function ( callback ) {&lt;br /&gt;
			if ( self.needed &amp;lt;= 0 ) callback(); // Execute directly&lt;br /&gt;
			else self.queue.push( callback );&lt;br /&gt;
		};&lt;br /&gt;
		self.loaded = function () {&lt;br /&gt;
			self.needed--;&lt;br /&gt;
			if ( self.needed === 0 ) {&lt;br /&gt;
				// Run queued callbacks once&lt;br /&gt;
				for ( var i = 0; i &amp;lt; self.queue.length; i++ ) self.queue[ i ]();&lt;br /&gt;
				self.queue = [];&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Used to delay running the HotCat setup until /local_defaults and localizations have been loaded.&lt;br /&gt;
	var loadTrigger = new LoadTrigger( 2 );&lt;br /&gt;
&lt;br /&gt;
	function load( uri, callback ) {&lt;br /&gt;
		var s = document.createElement( 'script' );&lt;br /&gt;
		s.src = uri;&lt;br /&gt;
		var called = false;&lt;br /&gt;
&lt;br /&gt;
		s.onload = s.onerror = function () {&lt;br /&gt;
			if ( !called &amp;amp;&amp;amp; callback ) {&lt;br /&gt;
				called = true;&lt;br /&gt;
				callback();&lt;br /&gt;
			}&lt;br /&gt;
			if ( s.parentNode ) {&lt;br /&gt;
				s.parentNode.removeChild( s );&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
		document.head.appendChild( s );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function loadJS( page, callback ) {&lt;br /&gt;
		load( conf.wgScript + '?title=' + encodeURIComponent( page ) + '&amp;amp;action=raw&amp;amp;ctype=text/javascript', callback );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function loadURI( href, callback ) {&lt;br /&gt;
		load( href, callback );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Load local configurations, overriding the pre-set default values in the HotCat object above. This is always loaded&lt;br /&gt;
	// from the wiki where this script is executing, even if this script itself is hotlinked from Commons. This can&lt;br /&gt;
	// be used to change the default settings, or to provide localized interface texts for edit summaries and so on.&lt;br /&gt;
	loadJS( 'MediaWiki:Gadget-HotCat.js/local_defaults', loadTrigger.loaded );&lt;br /&gt;
&lt;br /&gt;
	// Load localized UI texts. These are the texts that HotCat displays on the page itself. Texts shown in edit summaries&lt;br /&gt;
	// should be localized in /local_defaults above.&lt;br /&gt;
	if ( conf.wgUserLanguage !== 'en' ) {&lt;br /&gt;
		// Lupo: somebody thought it would be a good idea to add this. So the default is true, and you have to set it to false&lt;br /&gt;
		// explicitly if you're not on Commons and don't want that.&lt;br /&gt;
		if ( window.hotcat_translations_from_commons === undefined ) window.hotcat_translations_from_commons = true;&lt;br /&gt;
&lt;br /&gt;
		// Localization hook to localize HotCat messages, tooltips, and engine names for wgUserLanguage.&lt;br /&gt;
		if ( window.hotcat_translations_from_commons &amp;amp;&amp;amp; conf.wgDBname !== 'commonswiki' ) {&lt;br /&gt;
			loadURI( '//commons.wikimedia.org/w/index.php?title=' +&lt;br /&gt;
		'MediaWiki:Gadget-HotCat.js/' + conf.wgUserLanguage +&lt;br /&gt;
		'&amp;amp;action=raw&amp;amp;ctype=text/javascript', loadTrigger.loaded );&lt;br /&gt;
		} else {&lt;br /&gt;
			// Load translations locally&lt;br /&gt;
			loadJS( 'MediaWiki:Gadget-HotCat.js/' + conf.wgUserLanguage, loadTrigger.loaded );&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		loadTrigger.loaded();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// No further changes should be necessary here.&lt;br /&gt;
&lt;br /&gt;
	// The following regular expression strings are used when searching for categories in wikitext.&lt;br /&gt;
	var wikiTextBlank = '[\\t _\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]+';&lt;br /&gt;
	var wikiTextBlankRE = new RegExp( wikiTextBlank, 'g' );&lt;br /&gt;
	// Regexp for handling blanks inside a category title or namespace name.&lt;br /&gt;
	// See http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/includes/Title.php?revision=104051&amp;amp;view=markup#l2722&lt;br /&gt;
	// See also http://www.fileformat.info/info/unicode/category/Zs/list.htm&lt;br /&gt;
	//   MediaWiki collapses several contiguous blanks inside a page title to one single blank. It also replace a&lt;br /&gt;
	// number of special whitespace characters by simple blanks. And finally, blanks are treated as underscores.&lt;br /&gt;
	// Therefore, when looking for page titles in wikitext, we must handle all these cases.&lt;br /&gt;
	//   Note: we _do_ include the horizontal tab in the above list, even though the MediaWiki software for some reason&lt;br /&gt;
	// appears to not handle it. The zero-width space \u200B is _not_ handled as a space inside titles by MW.&lt;br /&gt;
	var wikiTextBlankOrBidi = '[\\t _\\xA0\\u1680\\u180E\\u2000-\\u200B\\u200E\\u200F\\u2028-\\u202F\\u205F\\u3000]*';&lt;br /&gt;
	// Whitespace regexp for handling whitespace between link components. Including the horizontal tab, but not \n\r\f\v:&lt;br /&gt;
	// a link must be on one single line.&lt;br /&gt;
	//   MediaWiki also removes Unicode bidi override characters in page titles (and namespace names) completely.&lt;br /&gt;
	// This is *not* handled, as it would require us to allow any of [\u200E\u200F\u202A-\u202E] between any two&lt;br /&gt;
	// characters inside a category link. It _could_ be done though... We _do_ handle strange spaces, including the&lt;br /&gt;
	// zero-width space \u200B, and bidi overrides between the components of a category link (adjacent to the colon,&lt;br /&gt;
	// or adjacent to and inside of &amp;quot;[[&amp;quot; and &amp;quot;]]&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
	// First auto-localize the regexps for the category and the template namespaces.&lt;br /&gt;
	var formattedNamespaces = conf.wgFormattedNamespaces;&lt;br /&gt;
	var namespaceIds = conf.wgNamespaceIds;&lt;br /&gt;
	function autoLocalize( namespaceNumber, fallback ) {&lt;br /&gt;
		function createRegexpStr( name ) {&lt;br /&gt;
			if ( !name || !name.length ) return '';&lt;br /&gt;
&lt;br /&gt;
			var regex_name = '';&lt;br /&gt;
			for ( var i = 0; i &amp;lt; name.length; i++ ) {&lt;br /&gt;
				var initial = name.charAt( i ),&lt;br /&gt;
					ll = initial.toLowerCase(),&lt;br /&gt;
					ul = initial.toUpperCase();&lt;br /&gt;
				if ( ll === ul ) regex_name += initial; else regex_name += '[' + ll + ul + ']';&lt;br /&gt;
			}&lt;br /&gt;
			return regex_name&lt;br /&gt;
				.replace( /([\\^$.?*+()])/g, '\\$1' )&lt;br /&gt;
				.replace( wikiTextBlankRE, wikiTextBlank );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		fallback = fallback.toLowerCase();&lt;br /&gt;
		var canonical = formattedNamespaces[ String( namespaceNumber ) ].toLowerCase();&lt;br /&gt;
		var regexp = createRegexpStr( canonical );&lt;br /&gt;
		if ( fallback &amp;amp;&amp;amp; canonical !== fallback ) regexp += '|' + createRegexpStr( fallback );&lt;br /&gt;
&lt;br /&gt;
		if ( namespaceIds ) {&lt;br /&gt;
			for ( var cat_name in namespaceIds ) {&lt;br /&gt;
				if (&lt;br /&gt;
					typeof cat_name === 'string' &amp;amp;&amp;amp;&lt;br /&gt;
					cat_name.toLowerCase() !== canonical &amp;amp;&amp;amp;&lt;br /&gt;
					cat_name.toLowerCase() !== fallback &amp;amp;&amp;amp;&lt;br /&gt;
					namespaceIds[ cat_name ] === namespaceNumber&lt;br /&gt;
				) {&lt;br /&gt;
					regexp += '|' + createRegexpStr( cat_name );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return regexp;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	HC.category_canonical = formattedNamespaces[ '14' ];&lt;br /&gt;
	HC.category_regexp = autoLocalize( 14, 'category' );&lt;br /&gt;
	if ( formattedNamespaces[ '10' ] ) HC.template_regexp = autoLocalize( 10, 'template' );&lt;br /&gt;
&lt;br /&gt;
	// Utility functions. Yes, this duplicates some functionality that also exists in other places, but&lt;br /&gt;
	// to keep this whole stuff in a single file not depending on any other on-wiki JavaScripts, we re-do&lt;br /&gt;
	// these few operations here.&lt;br /&gt;
	function make( arg, literal ) {&lt;br /&gt;
		if ( !arg ) return null;&lt;br /&gt;
&lt;br /&gt;
		return literal ? document.createTextNode( arg ) : document.createElement( arg );&lt;br /&gt;
	}&lt;br /&gt;
	function param( name, uri ) {&lt;br /&gt;
		uri = uri || location.href;&lt;br /&gt;
		var re = new RegExp( '[&amp;amp;?]' + name + '=([^&amp;amp;#]*)' );&lt;br /&gt;
		var m = re.exec( uri );&lt;br /&gt;
		if ( m &amp;amp;&amp;amp; m.length &amp;gt; 1 ) return decodeURIComponent( m[ 1 ] );&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
	function title( href ) {&lt;br /&gt;
		if ( !href ) return null;&lt;br /&gt;
		// href=&amp;quot;/w/index.php?title=...&amp;quot;&lt;br /&gt;
		if ( href.indexOf( expandedScriptPrefix ) === 0 ) {&lt;br /&gt;
			return param( 'title', href );&lt;br /&gt;
		}&lt;br /&gt;
		// href=&amp;quot;/wiki/...&amp;quot;&lt;br /&gt;
		if ( href.indexOf( expandedArticlePrefix ) === 0 ) {&lt;br /&gt;
			return decodeURIComponent( href.slice( expandedArticlePrefix.length ) );&lt;br /&gt;
		}&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
	function hasClass( elem, name ) {&lt;br /&gt;
		return ( ' ' + elem.className + ' ' ).indexOf( ' ' + name + ' ' ) &amp;gt;= 0;&lt;br /&gt;
	}&lt;br /&gt;
	function capitalize( str ) {&lt;br /&gt;
		if ( !str || !str.length ) return str;&lt;br /&gt;
&lt;br /&gt;
		return str.substr( 0, 1 ).toUpperCase() + str.substr( 1 );&lt;br /&gt;
	}&lt;br /&gt;
	function wikiPagePath( pageName ) {&lt;br /&gt;
		// Note: do not simply use encodeURI, it doesn't encode '&amp;amp;', which might break if wgArticlePath actually has the $1 in&lt;br /&gt;
		// a query parameter.&lt;br /&gt;
		return conf.wgArticlePath.replace( '$1', encodeURIComponent( pageName ).replace( /%3A/g, ':' ).replace( /%2F/g, '/' ) );&lt;br /&gt;
	}&lt;br /&gt;
	function escapeRE( str ) {&lt;br /&gt;
		return str.replace( /([\\^$.?*+()[\]])/g, '\\$1' );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function substituteFactory( options ) {&lt;br /&gt;
		options = options || {};&lt;br /&gt;
		var lead = options.indicator || '$';&lt;br /&gt;
		var indicator = escapeRE( lead );&lt;br /&gt;
		var lbrace = escapeRE( options.lbrace || '{' );&lt;br /&gt;
		var rbrace = escapeRE( options.rbrace || '}' );&lt;br /&gt;
		var re;&lt;br /&gt;
&lt;br /&gt;
		re = new RegExp(&lt;br /&gt;
			// $$&lt;br /&gt;
			'(?:' + indicator + '(' + indicator + '))|' +&lt;br /&gt;
			// $0, $1&lt;br /&gt;
			'(?:' + indicator + '(\\d+))|' +&lt;br /&gt;
			// ${key}&lt;br /&gt;
			'(?:' + indicator + '(?:' + lbrace + '([^' + lbrace + rbrace + ']+)' + rbrace + '))|' +&lt;br /&gt;
			// $key (only if first char after $ is not $, digit, or { )&lt;br /&gt;
			'(?:' + indicator + '(?!(?:[' + indicator + lbrace + ']|\\d))(\\S+?)\\b)',&lt;br /&gt;
			'g'&lt;br /&gt;
		);&lt;br /&gt;
		// Replace $1, $2, or ${key1}, ${key2}, or $key1, $key2 by values from map. $$ is replaced by a single $.&lt;br /&gt;
		return function ( str, map ) {&lt;br /&gt;
			if ( !map ) return str;&lt;br /&gt;
&lt;br /&gt;
			return str.replace( re, function ( match, prefix, idx, key, alpha ) {&lt;br /&gt;
				if ( prefix === lead ) return lead;&lt;br /&gt;
&lt;br /&gt;
				var k = alpha || key || idx;&lt;br /&gt;
				var replacement = typeof map[ k ] === 'function' ? map[ k ]( match, k ) : map[ k ];&lt;br /&gt;
				return typeof replacement === 'string' ? replacement : ( replacement || match );&lt;br /&gt;
			} );&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var substitute = substituteFactory();&lt;br /&gt;
	var replaceShortcuts = ( function () {&lt;br /&gt;
		var replaceHash = substituteFactory( {&lt;br /&gt;
			indicator: '#',&lt;br /&gt;
			lbrace: '[',&lt;br /&gt;
			rbrace: ']'&lt;br /&gt;
		} );&lt;br /&gt;
		return function ( str, map ) {&lt;br /&gt;
			var s = replaceHash( str, map );&lt;br /&gt;
			return HC.capitalizePageNames ? capitalize( s ) : s;&lt;br /&gt;
		};&lt;br /&gt;
	}() );&lt;br /&gt;
&lt;br /&gt;
	// Text modification&lt;br /&gt;
&lt;br /&gt;
	var findCatsRE =&lt;br /&gt;
	new RegExp( '\\[\\[' + wikiTextBlankOrBidi + '(?:' + HC.category_regexp + ')' + wikiTextBlankOrBidi + ':[^\\]]+\\]\\]', 'g' );&lt;br /&gt;
&lt;br /&gt;
	function replaceByBlanks( match ) {&lt;br /&gt;
		return match.replace( /(\s|\S)/g, ' ' ); // /./ doesn't match linebreaks. /(\s|\S)/ does.&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	* find_category() Tests whether a specified category exists in the given text and returns match information.&lt;br /&gt;
	*&lt;br /&gt;
	* @param {string} text - The input string to search for category patterns (JSON or wikitext).&lt;br /&gt;
	* @param {string} category - The target category name (without the &amp;quot;Category:&amp;quot; prefix).&lt;br /&gt;
	* @param {boolean} once - If true, return only the first match; if false, return all matches.&lt;br /&gt;
	* @returns {Array&amp;lt;string&amp;gt;|Array&amp;lt;Array&amp;lt;string&amp;gt;&amp;gt;|null}&lt;br /&gt;
	*   - When `once` is true:&lt;br /&gt;
	*     - Returns an Array of strings representing the first regexp match groups.&lt;br /&gt;
	*     - Returns `null` if no match is found.&lt;br /&gt;
	*   - When `once` is false:&lt;br /&gt;
	*     - Returns an Array of Arrays, each inner Array containing regexp match groups for each occurrence.&lt;br /&gt;
	*     - Returns an empty Array if no matches are found.&lt;br /&gt;
	*/&lt;br /&gt;
	function find_category( text, category, once ) {&lt;br /&gt;
		if ( HC.jsonContentModels.includes( conf.wgPageContentModel ) ) {&lt;br /&gt;
			// Handle Data namespace JSON content&lt;br /&gt;
			return find_category_json( text, category, once );&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// For backwards-compatibility the default handler is wikitext&lt;br /&gt;
			return find_category_wikitext( text, category, once );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function find_category_json( jsontext, category, once ) {&lt;br /&gt;
	&lt;br /&gt;
		// Handle Data namespace JSON content&lt;br /&gt;
		let jsonData;&lt;br /&gt;
		try {&lt;br /&gt;
			jsonData = JSON.parse( jsontext );&lt;br /&gt;
		} catch ( err ) {&lt;br /&gt;
			console.error( 'Invalid JSON in find_category_json:', err );&lt;br /&gt;
			return once ? null : [];&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		// Check if mediawikiCategories exists and if not then return&lt;br /&gt;
		if ( !Array.isArray( jsonData.mediawikiCategories ) ) {&lt;br /&gt;
			return once ? null : [];&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		// Handle actual data&lt;br /&gt;
		var matches = [];&lt;br /&gt;
		const targetCategoryName = mw.Title.newFromText( &amp;quot;category:&amp;quot; + category ).getPrefixedText();&lt;br /&gt;
		&lt;br /&gt;
        // Search through each category object&lt;br /&gt;
        for ( var i = 0; i &amp;lt; jsonData.mediawikiCategories.length; i++ ) {&lt;br /&gt;
			var catObj = jsonData.mediawikiCategories[ i ];&lt;br /&gt;
			const currentCategoryName = mw.Title.newFromText( &amp;quot;category:&amp;quot; + catObj.name ).getPrefixedText();&lt;br /&gt;
			// Compare category name (case-sensitive)&lt;br /&gt;
			if ( currentCategoryName === targetCategoryName ) {&lt;br /&gt;
				var match = [&lt;br /&gt;
					'', // Full match placeholder&lt;br /&gt;
					'', // Namespace placeholder&lt;br /&gt;
					catObj.sort || '' // Sortkey if exists&lt;br /&gt;
				];&lt;br /&gt;
				if ( once ) {&lt;br /&gt;
					return { match };&lt;br /&gt;
				}&lt;br /&gt;
				matches.push( { match: match } );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return once ? null : matches;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function find_category_wikitext( wikitext, category, once ) {&lt;br /&gt;
		var cat_regex = null;&lt;br /&gt;
		if ( HC.template_categories[ category ] ) {&lt;br /&gt;
			cat_regex = new RegExp(&lt;br /&gt;
				'\\{\\{' + wikiTextBlankOrBidi + '(' + HC.template_regexp + '(?=' + wikiTextBlankOrBidi + ':))?' + wikiTextBlankOrBidi +&lt;br /&gt;
				'(?:' + HC.template_categories[ category ] + ')' +&lt;br /&gt;
				wikiTextBlankOrBidi + '(\\|.*?)?\\}\\}',&lt;br /&gt;
				'g'&lt;br /&gt;
			);&lt;br /&gt;
		} else {&lt;br /&gt;
			var cat_name = escapeRE( category );&lt;br /&gt;
			var initial = cat_name.substr( 0, 1 );&lt;br /&gt;
			cat_regex = new RegExp(&lt;br /&gt;
				'\\[\\[' + wikiTextBlankOrBidi + '(' + HC.category_regexp + ')' + wikiTextBlankOrBidi + ':' + wikiTextBlankOrBidi +&lt;br /&gt;
				( initial === '\\' || !HC.capitalizePageNames ?&lt;br /&gt;
					initial :&lt;br /&gt;
					'[' + initial.toUpperCase() + initial.toLowerCase() + ']' ) +&lt;br /&gt;
				cat_name.substring( 1 ).replace( wikiTextBlankRE, wikiTextBlank ) +&lt;br /&gt;
				wikiTextBlankOrBidi + '(\\|.*?)?\\]\\]',&lt;br /&gt;
				'g'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		if ( once ) return cat_regex.exec( wikitext );&lt;br /&gt;
&lt;br /&gt;
		var copiedtext = wikitext&lt;br /&gt;
			.replace( /&amp;lt;!--(\s|\S)*?--&amp;gt;/g, replaceByBlanks )&lt;br /&gt;
			.replace( /&amp;lt;nowiki&amp;gt;(\s|\S)*?&amp;lt;\/nowiki&amp;gt;/g, replaceByBlanks );&lt;br /&gt;
		var result = [];&lt;br /&gt;
		var curr_match = null;&lt;br /&gt;
		while ( ( curr_match = cat_regex.exec( copiedtext ) ) !== null ) {&lt;br /&gt;
			result.push( {&lt;br /&gt;
				match: curr_match&lt;br /&gt;
			} );&lt;br /&gt;
		}&lt;br /&gt;
		result.re = cat_regex;&lt;br /&gt;
		return result; // An array containing all matches, with positions, in result[ i ].match&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var interlanguageRE = null;&lt;br /&gt;
	&lt;br /&gt;
	function change_category( text, toRemove, toAdd, key, is_hidden ) {&lt;br /&gt;
		if ( HC.jsonContentModels.includes( conf.wgPageContentModel ) ) {&lt;br /&gt;
			// Handle Data namespace JSON content&lt;br /&gt;
			return change_category_json( text, toRemove, toAdd, key, is_hidden );&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// For backwards-compatibility the default handler is wikitext&lt;br /&gt;
			return change_category_wikitext( text, toRemove, toAdd, key, is_hidden );&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		// In cases of unknown page content model&lt;br /&gt;
		return {&lt;br /&gt;
			text: text,&lt;br /&gt;
			summary: [],&lt;br /&gt;
			error: 'Unknown wgPageContentModel: ' + conf.wgPageContentModel&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function change_category_json( jsontext, toRemove, toAdd, key, is_hidden ) {&lt;br /&gt;
		try {&lt;br /&gt;
			var jsonData = JSON.parse( jsontext );&lt;br /&gt;
			if ( !jsonData.mediawikiCategories ) {&lt;br /&gt;
				jsonData.mediawikiCategories = [];&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			var summary = [];&lt;br /&gt;
		&lt;br /&gt;
			// Remove category if specified&lt;br /&gt;
			if ( toRemove ) {&lt;br /&gt;
				var initialLength = jsonData.mediawikiCategories.length;&lt;br /&gt;
				var normalizedToRemoveName =  mw.Title.newFromText( &amp;quot;category:&amp;quot; + toRemove ).getPrefixedText();&lt;br /&gt;
				jsonData.mediawikiCategories = jsonData.mediawikiCategories.filter( function( cat ) {&lt;br /&gt;
					var normalizedCatName =  mw.Title.newFromText( &amp;quot;category:&amp;quot; + cat.name ).getPrefixedText();&lt;br /&gt;
					return normalizedCatName !== normalizedToRemoveName;&lt;br /&gt;
				} );&lt;br /&gt;
				&lt;br /&gt;
				if ( jsonData.mediawikiCategories.length &amp;lt; initialLength ) {&lt;br /&gt;
					summary.push( HC.messages.cat_removed.replace( /\$1/g, toRemove ) );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			// Add category if specified&lt;br /&gt;
			if ( toAdd ) {&lt;br /&gt;
				var normalizedToAddName =  mw.Title.newFromText( &amp;quot;category:&amp;quot; + toAdd ).getPrefixedText();&lt;br /&gt;
				var exists = jsonData.mediawikiCategories.some( function( cat ) {&lt;br /&gt;
					var normalizedCatName =  mw.Title.newFromText( &amp;quot;category:&amp;quot; + cat.name ).getPrefixedText();&lt;br /&gt;
					return normalizedCatName === normalizedToAddName;&lt;br /&gt;
				} );&lt;br /&gt;
				&lt;br /&gt;
				if ( !exists ) {&lt;br /&gt;
					jsonData.mediawikiCategories.push( {&lt;br /&gt;
						name: toAdd,&lt;br /&gt;
						sort: key || ''&lt;br /&gt;
					} );&lt;br /&gt;
					summary.push( HC.messages.cat_added.replace( /\$1/g, toAdd ) );&lt;br /&gt;
				} else if ( key ) {&lt;br /&gt;
					// Update sortkey if category exists and new key is provided&lt;br /&gt;
					for ( var i = 0; i &amp;lt; jsonData.mediawikiCategories.length; i++ ) {&lt;br /&gt;
						var cat = jsonData.mediawikiCategories[ i ];&lt;br /&gt;
						var normalizedCatName =  mw.Title.newFromText( &amp;quot;category:&amp;quot; + cat.name ).getPrefixedText();&lt;br /&gt;
						if ( normalizedCatName === normalizedToAddName &amp;amp;&amp;amp; ( !cat.sort || cat.sort !== key ) ) {&lt;br /&gt;
							jsonData.mediawikiCategories[ i ].sort = key;&lt;br /&gt;
							summary.push( HC.messages.cat_keychange.replace( /\$1/g, toAdd ).replace( /\$2/g, key ) );&lt;br /&gt;
							break;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			return {&lt;br /&gt;
				text: JSON.stringify( jsonData, null, 2 ),&lt;br /&gt;
				summary: summary,&lt;br /&gt;
				error: null&lt;br /&gt;
			};&lt;br /&gt;
		} catch ( e ) {&lt;br /&gt;
			return {&lt;br /&gt;
				text: jsontext,&lt;br /&gt;
				summary: [],&lt;br /&gt;
				error: 'Failed to modify JSON categories: ' + e.message&lt;br /&gt;
			};&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function change_category_wikitext( wikitext, toRemove, toAdd, key, is_hidden ) {&lt;br /&gt;
		function find_insertionpoint( wikitext ) {&lt;br /&gt;
			var copiedtext = wikitext&lt;br /&gt;
				.replace( /&amp;lt;!--(\s|\S)*?--&amp;gt;/g, replaceByBlanks )&lt;br /&gt;
				.replace( /&amp;lt;nowiki&amp;gt;(\s|\S)*?&amp;lt;\/nowiki&amp;gt;/g, replaceByBlanks );&lt;br /&gt;
			// Search in copiedtext to avoid that we insert inside an HTML comment or a nowiki &amp;quot;element&amp;quot;.&lt;br /&gt;
			var index = -1;&lt;br /&gt;
			findCatsRE.lastIndex = 0;&lt;br /&gt;
			while ( findCatsRE.exec( copiedtext ) !== null ) index = findCatsRE.lastIndex;&lt;br /&gt;
&lt;br /&gt;
			if ( index &amp;lt; 0 ) {&lt;br /&gt;
				// Find the index of the first interlanguage link...&lt;br /&gt;
				var match = null;&lt;br /&gt;
				if ( !interlanguageRE ) {&lt;br /&gt;
				// Approximation without API: interlanguage links start with 2 to 3 lower case letters, optionally followed by&lt;br /&gt;
				// a sequence of groups consisting of a dash followed by one or more lower case letters. Exceptions are &amp;quot;simple&amp;quot;&lt;br /&gt;
				// and &amp;quot;tokipona&amp;quot;.&lt;br /&gt;
					match = /((^|\n\r?)(\[\[\s*(([a-z]{2,3}(-[a-z]+)*)|simple|tokipona)\s*:[^\]]+\]\]\s*))+$/.exec( copiedtext );&lt;br /&gt;
				} else {&lt;br /&gt;
					match = interlanguageRE.exec( copiedtext );&lt;br /&gt;
				}&lt;br /&gt;
				if ( match ) index = match.index;&lt;br /&gt;
&lt;br /&gt;
				return {&lt;br /&gt;
					idx: index,&lt;br /&gt;
					onCat: false&lt;br /&gt;
				};&lt;br /&gt;
			}&lt;br /&gt;
			return {&lt;br /&gt;
				idx: index,&lt;br /&gt;
				onCat: index &amp;gt;= 0&lt;br /&gt;
			};&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var summary = [],&lt;br /&gt;
			nameSpace = HC.category_canonical,&lt;br /&gt;
			cat_point = -1, // Position of removed category;&lt;br /&gt;
			keyChange = ( toRemove &amp;amp;&amp;amp; toAdd &amp;amp;&amp;amp; toRemove === toAdd &amp;amp;&amp;amp; toAdd.length ),&lt;br /&gt;
			matches;&lt;br /&gt;
		if ( key ) key = '|' + key;&lt;br /&gt;
		// Remove&lt;br /&gt;
		if ( toRemove &amp;amp;&amp;amp; toRemove.length ) {&lt;br /&gt;
			matches = find_category( wikitext, toRemove );&lt;br /&gt;
			if ( !matches || !matches.length ) {&lt;br /&gt;
				return {&lt;br /&gt;
					text: wikitext,&lt;br /&gt;
					summary: summary,&lt;br /&gt;
					error: HC.messages.cat_notFound.replace( /\$1/g, toRemove )&lt;br /&gt;
				};&lt;br /&gt;
			} else {&lt;br /&gt;
				var before = wikitext.substring( 0, matches[ 0 ].match.index ),&lt;br /&gt;
					after = wikitext.substring( matches[ 0 ].match.index + matches[ 0 ].match[ 0 ].length );&lt;br /&gt;
				if ( matches.length &amp;gt; 1 ) {&lt;br /&gt;
				// Remove all occurrences in after&lt;br /&gt;
					matches.re.lastIndex = 0;&lt;br /&gt;
					after = after.replace( matches.re, '' );&lt;br /&gt;
				}&lt;br /&gt;
				if ( toAdd ) {&lt;br /&gt;
					// nameSpace = matches[ 0 ].match[ 1 ] || nameSpace; Canonical namespace should be always preferred&lt;br /&gt;
					if ( key === null ) key = matches[ 0 ].match[ 2 ];&lt;br /&gt;
				// Remember the category key, if any.&lt;br /&gt;
				}&lt;br /&gt;
				// Remove whitespace (properly): strip whitespace, but only up to the next line feed.&lt;br /&gt;
				// If we then have two linefeeds in a row, remove one. Otherwise, if we have two non-&lt;br /&gt;
				// whitespace characters, insert a blank.&lt;br /&gt;
				var i = before.length - 1;&lt;br /&gt;
				while ( i &amp;gt;= 0 &amp;amp;&amp;amp; before.charAt( i ) !== '\n' &amp;amp;&amp;amp; before.substr( i, 1 ).search( /\s/ ) &amp;gt;= 0 ) i--;&lt;br /&gt;
&lt;br /&gt;
				var j = 0;&lt;br /&gt;
				while ( j &amp;lt; after.length &amp;amp;&amp;amp; after.charAt( j ) !== '\n' &amp;amp;&amp;amp; after.substr( j, 1 ).search( /\s/ ) &amp;gt;= 0 ) j++;&lt;br /&gt;
&lt;br /&gt;
				if ( i &amp;gt;= 0 &amp;amp;&amp;amp; before.charAt( i ) === '\n' &amp;amp;&amp;amp; ( !after.length || j &amp;lt; after.length &amp;amp;&amp;amp; after.charAt( j ) === '\n' ) ) i--;&lt;br /&gt;
&lt;br /&gt;
				if ( i &amp;gt;= 0 ) before = before.substring( 0, i + 1 ); else before = '';&lt;br /&gt;
&lt;br /&gt;
				if ( j &amp;lt; after.length ) after = after.substring( j ); else after = '';&lt;br /&gt;
&lt;br /&gt;
				if (&lt;br /&gt;
					before.length &amp;amp;&amp;amp; before.substring( before.length - 1 ).search( /\S/ ) &amp;gt;= 0 &amp;amp;&amp;amp;&lt;br /&gt;
					after.length &amp;amp;&amp;amp; after.substr( 0, 1 ).search( /\S/ ) &amp;gt;= 0&lt;br /&gt;
				) {&lt;br /&gt;
					before += ' ';&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				cat_point = before.length;&lt;br /&gt;
				if ( cat_point === 0 &amp;amp;&amp;amp; after.length &amp;amp;&amp;amp; after.substr( 0, 1 ) === '\n' ) after = after.substr( 1 );&lt;br /&gt;
&lt;br /&gt;
				wikitext = before + after;&lt;br /&gt;
				if ( !keyChange ) {&lt;br /&gt;
					if ( HC.template_categories[ toRemove ] ) { summary.push( HC.messages.template_removed.replace( /\$1/g, toRemove ) ); } else { summary.push( HC.messages.cat_removed.replace( /\$1/g, toRemove ) ); }&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		// Add&lt;br /&gt;
		if ( toAdd &amp;amp;&amp;amp; toAdd.length ) {&lt;br /&gt;
			matches = find_category( wikitext, toAdd );&lt;br /&gt;
			if ( matches &amp;amp;&amp;amp; matches.length ) {&lt;br /&gt;
				// Already exists&lt;br /&gt;
				return {&lt;br /&gt;
					text: wikitext,&lt;br /&gt;
					summary: summary,&lt;br /&gt;
					error: HC.messages.cat_exists.replace( /\$1/g, toAdd )&lt;br /&gt;
				};&lt;br /&gt;
			} else {&lt;br /&gt;
				var onCat = false;&lt;br /&gt;
				if ( cat_point &amp;lt; 0 ) {&lt;br /&gt;
					var point = find_insertionpoint( wikitext );&lt;br /&gt;
					cat_point = point.idx;&lt;br /&gt;
					onCat = point.onCat;&lt;br /&gt;
				} else {&lt;br /&gt;
					onCat = true;&lt;br /&gt;
				}&lt;br /&gt;
				var newcatstring = '[[' + nameSpace + ':' + toAdd + ( key || '' ) + ']]';&lt;br /&gt;
				if ( cat_point &amp;gt;= 0 ) {&lt;br /&gt;
					var suffix = wikitext.substring( cat_point );&lt;br /&gt;
					wikitext = wikitext.substring( 0, cat_point ) + ( cat_point &amp;gt; 0 ? '\n' : '' ) + newcatstring + ( !onCat ? '\n' : '' );&lt;br /&gt;
					if ( suffix.length &amp;amp;&amp;amp; suffix.substr( 0, 1 ) !== '\n' ) wikitext += '\n' + suffix; else wikitext += suffix;&lt;br /&gt;
				} else {&lt;br /&gt;
					if ( wikitext.length &amp;amp;&amp;amp; wikitext.substr( wikitext.length - 1, 1 ) !== '\n' ) wikitext += '\n';&lt;br /&gt;
&lt;br /&gt;
					wikitext += ( wikitext.length ? '\n' : '' ) + newcatstring;&lt;br /&gt;
				}&lt;br /&gt;
				if ( keyChange ) {&lt;br /&gt;
					var k = key || '';&lt;br /&gt;
					if ( k.length ) k = k.substr( 1 );&lt;br /&gt;
&lt;br /&gt;
					summary.push( substitute( HC.messages.cat_keychange, [ null, toAdd, k ] ) );&lt;br /&gt;
				} else {&lt;br /&gt;
					summary.push( HC.messages.cat_added.replace( /\$1/g, toAdd ) );&lt;br /&gt;
				}&lt;br /&gt;
				if ( HC.uncat_regexp &amp;amp;&amp;amp; !is_hidden ) {&lt;br /&gt;
					var txt = wikitext.replace( HC.uncat_regexp, '' ); // Remove &amp;quot;uncat&amp;quot; templates&lt;br /&gt;
					if ( txt.length !== wikitext.length ) {&lt;br /&gt;
						wikitext = txt;&lt;br /&gt;
						summary.push( HC.messages.uncat_removed );&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return {&lt;br /&gt;
			text: wikitext,&lt;br /&gt;
			summary: summary,&lt;br /&gt;
			error: null&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// The real HotCat UI&lt;br /&gt;
&lt;br /&gt;
	function evtKeys( e ) {&lt;br /&gt;
		/* eslint-disable no-bitwise */&lt;br /&gt;
		var code = 0;&lt;br /&gt;
		if ( e.ctrlKey ) { // All modern browsers&lt;br /&gt;
		// Ctrl-click seems to be overloaded in FF/Mac (it opens a pop-up menu), so treat cmd-click&lt;br /&gt;
		// as a ctrl-click, too.&lt;br /&gt;
			if ( e.ctrlKey || e.metaKey ) code |= 1;&lt;br /&gt;
&lt;br /&gt;
			if ( e.shiftKey ) code |= 2;&lt;br /&gt;
		}&lt;br /&gt;
		return code;&lt;br /&gt;
	}&lt;br /&gt;
	function evtKill( e ) {&lt;br /&gt;
		if ( e.preventDefault ) {&lt;br /&gt;
			e.preventDefault();&lt;br /&gt;
			e.stopPropagation();&lt;br /&gt;
		} else {&lt;br /&gt;
			e.cancelBubble = true;&lt;br /&gt;
		}&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var catLine = null,&lt;br /&gt;
		onUpload = false,&lt;br /&gt;
		editors = [],&lt;br /&gt;
&lt;br /&gt;
		commitButton = null,&lt;br /&gt;
		commitForm = null,&lt;br /&gt;
		multiSpan = null,&lt;br /&gt;
&lt;br /&gt;
		pageText = null,&lt;br /&gt;
		pageTime = null,&lt;br /&gt;
		pageWatched = false,&lt;br /&gt;
		watchCreate = false,&lt;br /&gt;
		watchCreateExpiry = '',&lt;br /&gt;
		watchEdit = false,&lt;br /&gt;
		watchDefaultExpiry = '',&lt;br /&gt;
		minorEdits = false,&lt;br /&gt;
		editToken = null,&lt;br /&gt;
&lt;br /&gt;
		is_rtl = false,&lt;br /&gt;
		serverTime = null,&lt;br /&gt;
		lastRevId = null,&lt;br /&gt;
		pageTextRevId = null,&lt;br /&gt;
		conflictingUser = null,&lt;br /&gt;
&lt;br /&gt;
		newDOM = false; // true if MediaWiki serves the new UL-LI DOM for categories&lt;br /&gt;
&lt;br /&gt;
	function CategoryEditor() {&lt;br /&gt;
		this.initialize.apply( this, arguments );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function setPage( json ) {&lt;br /&gt;
		var startTime = null;&lt;br /&gt;
		if ( json &amp;amp;&amp;amp; json.query ) {&lt;br /&gt;
			if ( json.query.pages ) {&lt;br /&gt;
				var page = json.query.pages[ !conf.wgArticleId ? '-1' : String( conf.wgArticleId ) ];&lt;br /&gt;
				if ( page ) {&lt;br /&gt;
					if ( page.revisions &amp;amp;&amp;amp; page.revisions.length ) {&lt;br /&gt;
						// Revisions are sorted by revision ID, hence [ 0 ] is the one we asked for, and possibly there's a [ 1 ] if we're&lt;br /&gt;
						// not on the latest revision (edit conflicts and such).&lt;br /&gt;
						pageText = page.revisions[ 0 ].slots.main[ '*' ];&lt;br /&gt;
						if ( page.revisions[ 0 ].timestamp ) pageTime = page.revisions[ 0 ].timestamp.replace( /\D/g, '' );&lt;br /&gt;
						if ( page.revisions[ 0 ].revid ) pageTextRevId = page.revisions[ 0 ].revid;&lt;br /&gt;
						if ( page.revisions.length &amp;gt; 1 ) conflictingUser = page.revisions[ 1 ].user;&lt;br /&gt;
					}&lt;br /&gt;
					if ( page.lastrevid ) lastRevId = page.lastrevid;&lt;br /&gt;
					if ( page.starttimestamp ) startTime = page.starttimestamp.replace( /\D/g, '' );&lt;br /&gt;
					pageWatched = typeof page.watched === 'string';&lt;br /&gt;
					if ( json.query.tokens ) editToken = json.query.tokens.csrftoken;&lt;br /&gt;
					if ( page.langlinks &amp;amp;&amp;amp; ( !json[ 'query-continue' ] || !json[ 'query-continue' ].langlinks ) ) {&lt;br /&gt;
						// We have interlanguage links, and we got them all.&lt;br /&gt;
						var re = '';&lt;br /&gt;
						for ( var i = 0; i &amp;lt; page.langlinks.length; i++ ) re += ( i &amp;gt; 0 ? '|' : '' ) + page.langlinks[ i ].lang.replace( /([\\^$.?*+()])/g, '\\$1' );&lt;br /&gt;
						if ( re.length ) interlanguageRE = new RegExp( '((^|\\n\\r?)(\\[\\[\\s*(' + re + ')\\s*:[^\\]]+\\]\\]\\s*))+$' );&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			// Siteinfo&lt;br /&gt;
			if ( json.query.general ) {&lt;br /&gt;
				if ( json.query.general.time &amp;amp;&amp;amp; !startTime ) startTime = json.query.general.time.replace( /\D/g, '' );&lt;br /&gt;
&lt;br /&gt;
				if ( HC.capitalizePageNames === null ) {&lt;br /&gt;
					// ResourceLoader's JSParser doesn't like .case, so override eslint.&lt;br /&gt;
					// eslint-disable-next-line dot-notation&lt;br /&gt;
					HC.capitalizePageNames = ( json.query.general[ 'case' ] === 'first-letter' );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			serverTime = startTime;&lt;br /&gt;
			// Userinfo&lt;br /&gt;
			if ( json.query.userinfo &amp;amp;&amp;amp; json.query.userinfo.options ) {&lt;br /&gt;
				watchCreate = !HC.dont_add_to_watchlist &amp;amp;&amp;amp; json.query.userinfo.options.watchcreations === '1';&lt;br /&gt;
				watchCreateExpiry =  json.query.userinfo.options[' watchcreations-expiry'] || '';&lt;br /&gt;
				watchEdit = !HC.dont_add_to_watchlist &amp;amp;&amp;amp; json.query.userinfo.options.watchdefault === '1';&lt;br /&gt;
				watchDefaultExpiry = json.query.userinfo.options['watchdefault-expiry'] || '';&lt;br /&gt;
				minorEdits = json.query.userinfo.options.minordefault === 1;&lt;br /&gt;
				// If the user has the &amp;quot;All edits are minor&amp;quot; preference enabled, we should honor that&lt;br /&gt;
				// for single category changes, no matter what the site configuration is.&lt;br /&gt;
				if ( minorEdits ) HC.single_minor = true;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var saveInProgress = false;&lt;br /&gt;
	function initiateEdit( doEdit, failure ) {&lt;br /&gt;
		if ( saveInProgress ) return;&lt;br /&gt;
		saveInProgress = true;&lt;br /&gt;
		var oldButtonState;&lt;br /&gt;
		if ( commitButton ) {&lt;br /&gt;
			oldButtonState = commitButton.disabled;&lt;br /&gt;
			commitButton.disabled = true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function fail() {&lt;br /&gt;
			saveInProgress = false;&lt;br /&gt;
			if ( commitButton ) commitButton.disabled = oldButtonState;&lt;br /&gt;
			failure.apply( this, arguments );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Must use Ajax here to get the user options and the edit token.&lt;br /&gt;
		$.getJSON(&lt;br /&gt;
			conf.wgScriptPath + '/api.php?' +&lt;br /&gt;
			'format=json&amp;amp;action=query&amp;amp;rawcontinue=&amp;amp;titles=' + encodeURIComponent( conf.wgPageName ) +&lt;br /&gt;
			'&amp;amp;prop=info%7Crevisions%7Clanglinks&amp;amp;inprop=watched&amp;amp;rvprop=content%7Ctimestamp%7Cids%7Cuser&amp;amp;lllimit=500&amp;amp;rvslots=main' +&lt;br /&gt;
			'&amp;amp;rvlimit=2&amp;amp;rvdir=newer&amp;amp;rvstartid=' + conf.wgCurRevisionId + '&amp;amp;meta=siteinfo%7Cuserinfo%7Ctokens&amp;amp;type=csrf&amp;amp;uiprop=options',&lt;br /&gt;
			function ( json ) {&lt;br /&gt;
				setPage( json );&lt;br /&gt;
				doEdit( fail );&lt;br /&gt;
			}&lt;br /&gt;
		).fail( function ( req ) {&lt;br /&gt;
			fail( req.status + ' ' + req.statusText );&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function multiChangeMsg( count ) {&lt;br /&gt;
		var msg = HC.messages.multi_change;&lt;br /&gt;
		if ( typeof msg !== 'string' &amp;amp;&amp;amp; msg.length )&lt;br /&gt;
			if ( mw.language &amp;amp;&amp;amp; mw.language.convertPlural ) { msg = mw.language.convertPlural( count, msg ); } else { msg = msg[ msg.length - 1 ]; }&lt;br /&gt;
&lt;br /&gt;
		return substitute( msg, [ null, String( count ) ] );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function currentTimestamp() {&lt;br /&gt;
		var now = new Date();&lt;br /&gt;
		var ts = String( now.getUTCFullYear() );&lt;br /&gt;
		function two( s ) {&lt;br /&gt;
			return s.substr( s.length - 2 );&lt;br /&gt;
		}&lt;br /&gt;
		ts +=&lt;br /&gt;
			two( '0' + ( now.getUTCMonth() + 1 ) ) +&lt;br /&gt;
			two( '0' + now.getUTCDate() ) +&lt;br /&gt;
			two( '00' + now.getUTCHours() ) +&lt;br /&gt;
			two( '00' + now.getUTCMinutes() ) +&lt;br /&gt;
			two( '00' + now.getUTCSeconds() );&lt;br /&gt;
		return ts;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function performChanges( failure, singleEditor ) {&lt;br /&gt;
		if ( pageText === null ) {&lt;br /&gt;
			failure( HC.messages.multi_error );&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		// Backwards compatibility after message change (added $2 to cat_keychange)&lt;br /&gt;
		if ( HC.messages.cat_keychange.indexOf( '$2' ) &amp;lt; 0 ) HC.messages.cat_keychange += '&amp;quot;$2&amp;quot;';&lt;br /&gt;
&lt;br /&gt;
		// More backwards-compatibility with earlier HotCat versions:&lt;br /&gt;
		if ( !HC.messages.short_catchange ) HC.messages.short_catchange = '[[' + HC.category_canonical + ':$1]]';&lt;br /&gt;
&lt;br /&gt;
		// Create a form and submit it. We don't use the edit API (api.php?action=edit) because&lt;br /&gt;
		// (a) sensibly reporting back errors like edit conflicts is always a hassle, and&lt;br /&gt;
		// (b) we want to show a diff for multi-edits anyway, and&lt;br /&gt;
		// (c) we want to trigger onsubmit events, allowing user code to intercept the edit.&lt;br /&gt;
		// Using the form, we can do (b) and (c), and we get (a) for free. And, of course, using the form&lt;br /&gt;
		// automatically reloads the page with the updated categories on a successful submit, which&lt;br /&gt;
		// we would have to do explicitly if we used the edit API.&lt;br /&gt;
		var action;&lt;br /&gt;
		// Normally, we don't have to care about edit conflicts. If some other user edited the page in the meantime, the&lt;br /&gt;
		// server will take care of it and merge the edit automatically or present an edit conflict screen. However, the&lt;br /&gt;
		// server suppresses edit conflicts with oneself. Hence, if we have a conflict, and the conflicting user is the&lt;br /&gt;
		// current user, then we set the &amp;quot;oldid&amp;quot; value and switch to diff, which gives the &amp;quot;you are editing an old version;&lt;br /&gt;
		// if you save, any more recent changes will be lost&amp;quot; screen.&lt;br /&gt;
		var selfEditConflict = ( lastRevId !== null &amp;amp;&amp;amp; lastRevId !== conf.wgCurRevisionId || pageTextRevId !== null &amp;amp;&amp;amp;&lt;br /&gt;
			pageTextRevId !== conf.wgCurRevisionId ) &amp;amp;&amp;amp; conflictingUser &amp;amp;&amp;amp; conflictingUser === conf.wgUserName;&lt;br /&gt;
		if ( singleEditor &amp;amp;&amp;amp; !singleEditor.noCommit &amp;amp;&amp;amp; !HC.no_autocommit &amp;amp;&amp;amp; editToken &amp;amp;&amp;amp; !selfEditConflict ) {&lt;br /&gt;
			// If we do have an edit conflict, but not with ourself, that's no reason not to attempt to save: the server side may actually be able to&lt;br /&gt;
			// merge the changes. We just need to make sure that we do present a diff view if it's a self edit conflict.&lt;br /&gt;
			commitForm.wpEditToken.value = editToken;&lt;br /&gt;
			action = commitForm.wpDiff;&lt;br /&gt;
			if ( action ) action.name = action.value = 'wpSave';&lt;br /&gt;
		} else {&lt;br /&gt;
			action = commitForm.wpSave;&lt;br /&gt;
			if ( action ) action.name = action.value = 'wpDiff';&lt;br /&gt;
		}&lt;br /&gt;
		var result = {&lt;br /&gt;
				text: pageText&lt;br /&gt;
			},&lt;br /&gt;
			changed = [],&lt;br /&gt;
			added = [],&lt;br /&gt;
			deleted = [],&lt;br /&gt;
			changes = 0,&lt;br /&gt;
			toEdit = singleEditor ? [ singleEditor ] : editors,&lt;br /&gt;
			error = null,&lt;br /&gt;
			edit,&lt;br /&gt;
			i;&lt;br /&gt;
		for ( i = 0; i &amp;lt; toEdit.length; i++ ) {&lt;br /&gt;
			edit = toEdit[ i ];&lt;br /&gt;
			if ( edit.state === CategoryEditor.CHANGED ) {&lt;br /&gt;
				result = change_category(&lt;br /&gt;
					result.text,&lt;br /&gt;
					edit.originalCategory,&lt;br /&gt;
					edit.currentCategory,&lt;br /&gt;
					edit.currentKey,&lt;br /&gt;
					edit.currentHidden );&lt;br /&gt;
				if ( !result.error ) {&lt;br /&gt;
					changes++;&lt;br /&gt;
					if ( !edit.originalCategory || !edit.originalCategory.length ) {&lt;br /&gt;
						added.push( edit.currentCategory );&lt;br /&gt;
					} else {&lt;br /&gt;
						changed.push( {&lt;br /&gt;
							from: edit.originalCategory,&lt;br /&gt;
							to: edit.currentCategory&lt;br /&gt;
						} );&lt;br /&gt;
					}&lt;br /&gt;
				} else if ( error === null ) {&lt;br /&gt;
					error = result.error;&lt;br /&gt;
				}&lt;br /&gt;
			} else if (&lt;br /&gt;
				edit.state === CategoryEditor.DELETED &amp;amp;&amp;amp; edit.originalCategory &amp;amp;&amp;amp; edit.originalCategory.length ) {&lt;br /&gt;
				result = change_category(&lt;br /&gt;
					result.text,&lt;br /&gt;
					edit.originalCategory,&lt;br /&gt;
					null, null, false );&lt;br /&gt;
				if ( !result.error ) {&lt;br /&gt;
					changes++;&lt;br /&gt;
					deleted.push( edit.originalCategory );&lt;br /&gt;
				} else if ( error === null ) {&lt;br /&gt;
					error = result.error;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ( error !== null ) { // Do not commit if there were errors&lt;br /&gt;
			action = commitForm.wpSave;&lt;br /&gt;
			if ( action ) action.name = action.value = 'wpDiff';&lt;br /&gt;
		}&lt;br /&gt;
		// Fill in the form and submit it&lt;br /&gt;
		commitForm.wpMinoredit.checked = minorEdits;&lt;br /&gt;
		commitForm.wpWatchthis.checked = !conf.wgArticleId &amp;amp;&amp;amp; watchCreate || watchEdit || pageWatched;&lt;br /&gt;
		// Set watchlist expiry according to user preference&lt;br /&gt;
		// If page is already in watchlist do not update expiry&lt;br /&gt;
		if (commitForm.wpWatchthis.checked &amp;amp;&amp;amp; !pageWatched) {&lt;br /&gt;
			if (!conf.wgArticleId &amp;amp;&amp;amp; watchCreate) {&lt;br /&gt;
				commitForm.wpWatchlistExpiry.value = watchCreateExpiry;&lt;br /&gt;
			} else {&lt;br /&gt;
				commitForm.wpWatchlistExpiry.value = watchDefaultExpiry;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ( conf.wgArticleId || !!singleEditor ) {&lt;br /&gt;
			// Prepare change-tag save&lt;br /&gt;
			if ( action &amp;amp;&amp;amp; action.value === 'wpSave' ) {&lt;br /&gt;
				if ( HC.changeTag ) {&lt;br /&gt;
					commitForm.wpChangeTags.value = HC.changeTag;&lt;br /&gt;
					HC.messages.using = '';&lt;br /&gt;
					HC.messages.prefix = '';&lt;br /&gt;
				}&lt;br /&gt;
			} else {&lt;br /&gt;
				commitForm.wpAutoSummary.value = HC.changeTag;&lt;br /&gt;
			}&lt;br /&gt;
			if ( changes === 1 ) {&lt;br /&gt;
				if ( result.summary &amp;amp;&amp;amp; result.summary.length ) commitForm.wpSummary.value = HC.messages.prefix + result.summary.join( HC.messages.separator ) + HC.messages.using;&lt;br /&gt;
				commitForm.wpMinoredit.checked = HC.single_minor || minorEdits;&lt;br /&gt;
			} else if ( changes ) {&lt;br /&gt;
				var summary = [];&lt;br /&gt;
				var shortSummary = [];&lt;br /&gt;
				// Deleted&lt;br /&gt;
				for ( i = 0; i &amp;lt; deleted.length; i++ ) summary.push( '−' + substitute( HC.messages.short_catchange, [ null, deleted[ i ] ] ) );&lt;br /&gt;
&lt;br /&gt;
				if ( deleted.length === 1 ) shortSummary.push( '−' + substitute( HC.messages.short_catchange, [ null, deleted[ 0 ] ] ) ); else if ( deleted.length ) shortSummary.push( '− ' + multiChangeMsg( deleted.length ) );&lt;br /&gt;
&lt;br /&gt;
				// Added&lt;br /&gt;
				for ( i = 0; i &amp;lt; added.length; i++ ) summary.push( '+' + substitute( HC.messages.short_catchange, [ null, added[ i ] ] ) );&lt;br /&gt;
&lt;br /&gt;
				if ( added.length === 1 ) shortSummary.push( '+' + substitute( HC.messages.short_catchange, [ null, added[ 0 ] ] ) ); else if ( added.length ) shortSummary.push( '+ ' + multiChangeMsg( added.length ) );&lt;br /&gt;
&lt;br /&gt;
				// Changed&lt;br /&gt;
				var arrow = is_rtl ? '\u2190' : '\u2192'; // left and right arrows. Don't use ← and → in the code.&lt;br /&gt;
				for ( i = 0; i &amp;lt; changed.length; i++ ) {&lt;br /&gt;
					if ( changed[ i ].from !== changed[ i ].to ) {&lt;br /&gt;
						summary.push(&lt;br /&gt;
							'±' + substitute( HC.messages.short_catchange, [ null, changed[ i ].from ] ) + arrow +&lt;br /&gt;
							substitute( HC.messages.short_catchange, [ null, changed[ i ].to ] )&lt;br /&gt;
						);&lt;br /&gt;
					} else {&lt;br /&gt;
						summary.push( '±' + substitute( HC.messages.short_catchange, [ null, changed[ i ].from ] ) );&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if ( changed.length === 1 ) {&lt;br /&gt;
					if ( changed[ 0 ].from !== changed[ 0 ].to ) {&lt;br /&gt;
						shortSummary.push(&lt;br /&gt;
							'±' + substitute( HC.messages.short_catchange, [ null, changed[ 0 ].from ] ) + arrow +&lt;br /&gt;
							substitute( HC.messages.short_catchange, [ null, changed[ 0 ].to ] )&lt;br /&gt;
						);&lt;br /&gt;
					} else {&lt;br /&gt;
						shortSummary.push( '±' + substitute( HC.messages.short_catchange, [ null, changed[ 0 ].from ] ) );&lt;br /&gt;
					}&lt;br /&gt;
				} else if ( changed.length ) {&lt;br /&gt;
					shortSummary.push( '± ' + multiChangeMsg( changed.length ) );&lt;br /&gt;
				}&lt;br /&gt;
				if ( summary.length ) {&lt;br /&gt;
					summary = summary.join( HC.messages.separator );&lt;br /&gt;
					if ( summary.length &amp;gt; 200 - HC.messages.prefix.length - HC.messages.using.length ) summary = shortSummary.join( HC.messages.separator );&lt;br /&gt;
&lt;br /&gt;
					commitForm.wpSummary.value = HC.messages.prefix + summary + HC.messages.using;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		commitForm.wpTextbox1.value = result.text;&lt;br /&gt;
		commitForm.wpStarttime.value = serverTime || currentTimestamp();&lt;br /&gt;
		commitForm.wpEdittime.value = pageTime || commitForm.wpStarttime.value;&lt;br /&gt;
		if ( selfEditConflict ) commitForm.oldid.value = String( pageTextRevId || conf.wgCurRevisionId );&lt;br /&gt;
&lt;br /&gt;
		// Submit the form in a way that triggers onsubmit events: commitForm.submit() doesn't.&lt;br /&gt;
		commitForm.hcCommit.click();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function resolveOne( page, toResolve ) {&lt;br /&gt;
		var cats = page.categories,&lt;br /&gt;
			lks = page.links,&lt;br /&gt;
			is_dab = false,&lt;br /&gt;
			is_redir = typeof page.redirect === 'string', // Hard redirect?&lt;br /&gt;
			is_hidden = page.categoryinfo &amp;amp;&amp;amp; typeof page.categoryinfo.hidden === 'string',&lt;br /&gt;
			is_missing = typeof page.missing === 'string',&lt;br /&gt;
			i;&lt;br /&gt;
		for ( i = 0; i &amp;lt; toResolve.length; i++ ) {&lt;br /&gt;
			if ( i &amp;amp;&amp;amp; toResolve[ i ].dabInputCleaned !== page.title.substring( page.title.indexOf( ':' ) + 1 ) ) continue;&lt;br /&gt;
			// Note: the server returns in page an NFC normalized Unicode title. If our input was not NFC normalized, we may not find&lt;br /&gt;
			// any entry here. If we have only one editor to resolve (the most common case, I presume), we may simply skip the check.&lt;br /&gt;
			toResolve[ i ].currentHidden = is_hidden;&lt;br /&gt;
			toResolve[ i ].inputExists = !is_missing;&lt;br /&gt;
			toResolve[ i ].icon.src = ( is_missing ? HC.existsNo : HC.existsYes );&lt;br /&gt;
		}&lt;br /&gt;
		if ( is_missing ) return;&lt;br /&gt;
		if ( !is_redir &amp;amp;&amp;amp; cats &amp;amp;&amp;amp; ( HC.disambig_category || HC.redir_category ) ) {&lt;br /&gt;
			for ( var c = 0; c &amp;lt; cats.length; c++ ) {&lt;br /&gt;
				var cat = cats[ c ].title;&lt;br /&gt;
				// Strip namespace prefix&lt;br /&gt;
				if ( cat ) {&lt;br /&gt;
					cat = cat.substring( cat.indexOf( ':' ) + 1 ).replace( /_/g, ' ' );&lt;br /&gt;
					if ( cat === HC.disambig_category ) {&lt;br /&gt;
						is_dab = true;&lt;br /&gt;
						break;&lt;br /&gt;
					} else if ( cat === HC.redir_category ) {&lt;br /&gt;
						is_redir = true;&lt;br /&gt;
						break;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ( !is_redir &amp;amp;&amp;amp; !is_dab ) return;&lt;br /&gt;
		if ( !lks || !lks.length ) return;&lt;br /&gt;
		var titles = [];&lt;br /&gt;
		for ( i = 0; i &amp;lt; lks.length; i++ ) {&lt;br /&gt;
			if (&lt;br /&gt;
				// Category namespace -- always true since we ask only for the category links&lt;br /&gt;
				lks[ i ].ns === 14 &amp;amp;&amp;amp;&lt;br /&gt;
				// Name not empty&lt;br /&gt;
				lks[ i ].title &amp;amp;&amp;amp; lks[ i ].title.length&lt;br /&gt;
			) {&lt;br /&gt;
				// Internal link to existing thingy. Extract the page name and remove the namespace.&lt;br /&gt;
				var match = lks[ i ].title;&lt;br /&gt;
				match = match.substring( match.indexOf( ':' ) + 1 );&lt;br /&gt;
				// Exclude blacklisted categories.&lt;br /&gt;
				if ( !HC.blacklist || !HC.blacklist.test( match ) ) titles.push( match );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ( !titles.length ) return;&lt;br /&gt;
		for ( i = 0; i &amp;lt; toResolve.length; i++ ) {&lt;br /&gt;
			if ( i &amp;amp;&amp;amp; toResolve[ i ].dabInputCleaned !== page.title.substring( page.title.indexOf( ':' ) + 1 ) ) continue;&lt;br /&gt;
			toResolve[ i ].inputExists = true; // Might actually be wrong if it's a redirect pointing to a non-existing category&lt;br /&gt;
			toResolve[ i ].icon.src = HC.existsYes;&lt;br /&gt;
			if ( titles.length &amp;gt; 1 ) {&lt;br /&gt;
				toResolve[ i ].dab = titles;&lt;br /&gt;
			} else {&lt;br /&gt;
				toResolve[ i ].text.value =&lt;br /&gt;
					titles[ 0 ] + ( toResolve[ i ].currentKey !== null ? '|' + toResolve[ i ].currentKey : '' );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function resolveRedirects( toResolve, params ) {&lt;br /&gt;
		if ( !params || !params.query || !params.query.pages ) return;&lt;br /&gt;
		for ( var p in params.query.pages ) resolveOne( params.query.pages[ p ], toResolve );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function resolveMulti( toResolve, callback ) {&lt;br /&gt;
		var i;&lt;br /&gt;
		for ( i = 0; i &amp;lt; toResolve.length; i++ ) {&lt;br /&gt;
			toResolve[ i ].dab = null;&lt;br /&gt;
			toResolve[ i ].dabInput = toResolve[ i ].lastInput;&lt;br /&gt;
		}&lt;br /&gt;
		if ( noSuggestions ) {&lt;br /&gt;
			callback( toResolve );&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		// Use %7C instead of |, otherwise Konqueror insists on re-encoding the arguments, resulting in doubly encoded&lt;br /&gt;
		// category names. (That is a bug in Konqueror. Other browsers don't have this problem.)&lt;br /&gt;
		var args = 'action=query&amp;amp;prop=info%7Clinks%7Ccategories%7Ccategoryinfo&amp;amp;plnamespace=14' +&lt;br /&gt;
			'&amp;amp;pllimit=' + ( toResolve.length * 10 ) +&lt;br /&gt;
			'&amp;amp;cllimit=' + ( toResolve.length * 10 ) +&lt;br /&gt;
			'&amp;amp;format=json&amp;amp;titles=';&lt;br /&gt;
		for ( i = 0; i &amp;lt; toResolve.length; i++ ) {&lt;br /&gt;
			var v = toResolve[ i ].dabInput;&lt;br /&gt;
			v = replaceShortcuts( v, HC.shortcuts );&lt;br /&gt;
			toResolve[ i ].dabInputCleaned = v;&lt;br /&gt;
			args += encodeURIComponent( 'Category:' + v );&lt;br /&gt;
			if ( i + 1 &amp;lt; toResolve.length ) args += '%7C';&lt;br /&gt;
		}&lt;br /&gt;
		$.getJSON( conf.wgScriptPath + '/api.php?' + args,&lt;br /&gt;
			function ( json ) {&lt;br /&gt;
				resolveRedirects( toResolve, json );&lt;br /&gt;
				callback( toResolve );&lt;br /&gt;
			} ).fail( function ( req ) {&lt;br /&gt;
			if ( !req ) noSuggestions = true;&lt;br /&gt;
			callback( toResolve );&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function makeActive( which ) {&lt;br /&gt;
		if ( which.is_active ) return;&lt;br /&gt;
		for ( var i = 0; i &amp;lt; editors.length; i++ )&lt;br /&gt;
			if ( editors[ i ] !== which ) editors[ i ].inactivate();&lt;br /&gt;
&lt;br /&gt;
		which.is_active = true;&lt;br /&gt;
		if ( which.dab ) {&lt;br /&gt;
			// eslint-disable-next-line no-use-before-define&lt;br /&gt;
			showDab( which );&lt;br /&gt;
		} else {&lt;br /&gt;
			// Check for programmatic value changes.&lt;br /&gt;
			var expectedInput = which.lastRealInput || which.lastInput || '';&lt;br /&gt;
			var actualValue = which.text.value || '';&lt;br /&gt;
			if ( !expectedInput.length &amp;amp;&amp;amp; actualValue.length || expectedInput.length &amp;amp;&amp;amp; actualValue.indexOf( expectedInput ) ) {&lt;br /&gt;
				// Somehow the field's value appears to have changed, and which.lastSelection therefore is no longer valid. Try to set the&lt;br /&gt;
				// cursor at the end of the category, and do not display the old suggestion list.&lt;br /&gt;
				which.showsList = false;&lt;br /&gt;
				var v = actualValue.split( '|' );&lt;br /&gt;
				which.lastRealInput = which.lastInput = v[ 0 ];&lt;br /&gt;
				if ( v.length &amp;gt; 1 ) which.currentKey = v[ 1 ];&lt;br /&gt;
&lt;br /&gt;
				if ( which.lastSelection ) {&lt;br /&gt;
					which.lastSelection = {&lt;br /&gt;
						start: v[ 0 ].length,&lt;br /&gt;
						end: v[ 0 ].length&lt;br /&gt;
					};&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if ( which.showsList ) which.displayList();&lt;br /&gt;
&lt;br /&gt;
			if ( which.lastSelection ) {&lt;br /&gt;
				if ( is_webkit ) {&lt;br /&gt;
					// WebKit (Safari, Chrome) has problems selecting inside focus()&lt;br /&gt;
					// See http://code.google.com/p/chromium/issues/detail?id=32865#c6&lt;br /&gt;
					window.setTimeout(&lt;br /&gt;
						function () {&lt;br /&gt;
							which.setSelection( which.lastSelection.start, which.lastSelection.end );&lt;br /&gt;
						},&lt;br /&gt;
						1 );&lt;br /&gt;
				} else {&lt;br /&gt;
					which.setSelection( which.lastSelection.start, which.lastSelection.end );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function showDab( which ) {&lt;br /&gt;
		if ( !which.is_active ) {&lt;br /&gt;
			makeActive( which );&lt;br /&gt;
		} else {&lt;br /&gt;
			which.showSuggestions( which.dab, false, null, null ); // do autocompletion, no key, no engine selector&lt;br /&gt;
			which.dab = null;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function multiSubmit() {&lt;br /&gt;
		var toResolve = [];&lt;br /&gt;
		for ( var i = 0; i &amp;lt; editors.length; i++ )&lt;br /&gt;
			if ( editors[ i ].state === CategoryEditor.CHANGE_PENDING || editors[ i ].state === CategoryEditor.OPEN ) toResolve.push( editors[ i ] );&lt;br /&gt;
&lt;br /&gt;
		if ( !toResolve.length ) {&lt;br /&gt;
			initiateEdit( function ( failure ) {&lt;br /&gt;
				performChanges( failure );&lt;br /&gt;
			}, function ( msg ) {&lt;br /&gt;
				alert( msg );&lt;br /&gt;
			} );&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		resolveMulti( toResolve, function ( resolved ) {&lt;br /&gt;
			var firstDab = null;&lt;br /&gt;
			var dontChange = false;&lt;br /&gt;
			for ( var i = 0; i &amp;lt; resolved.length; i++ ) {&lt;br /&gt;
				if ( resolved[ i ].lastInput !== resolved[ i ].dabInput ) {&lt;br /&gt;
					// We didn't disable all the open editors, but we did asynchronous calls. It is&lt;br /&gt;
					// theoretically possible that the user changed something...&lt;br /&gt;
					dontChange = true;&lt;br /&gt;
				} else {&lt;br /&gt;
					if ( resolved[ i ].dab ) {&lt;br /&gt;
						if ( !firstDab ) firstDab = resolved[ i ];&lt;br /&gt;
					} else {&lt;br /&gt;
						if ( resolved[ i ].acceptCheck( true ) ) resolved[ i ].commit();&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if ( firstDab ) {&lt;br /&gt;
				showDab( firstDab );&lt;br /&gt;
			} else if ( !dontChange ) {&lt;br /&gt;
				initiateEdit( function ( failure ) {&lt;br /&gt;
					performChanges( failure );&lt;br /&gt;
				}, function ( msg ) {&lt;br /&gt;
					alert( msg );&lt;br /&gt;
				} );&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function setMultiInput() {&lt;br /&gt;
		if ( commitButton || onUpload ) return;&lt;br /&gt;
		commitButton = make( 'input' );&lt;br /&gt;
		commitButton.type = 'button';&lt;br /&gt;
		commitButton.value = HC.messages.commit;&lt;br /&gt;
		commitButton.onclick = multiSubmit;&lt;br /&gt;
		if ( multiSpan ) multiSpan.parentNode.replaceChild( commitButton, multiSpan ); else catLine.appendChild( commitButton );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function checkMultiInput() {&lt;br /&gt;
		if ( !commitButton ) return;&lt;br /&gt;
		var hasChanges = false;&lt;br /&gt;
		for ( var i = 0; i &amp;lt; editors.length; i++ ) {&lt;br /&gt;
			if ( editors[ i ].state !== CategoryEditor.UNCHANGED ) {&lt;br /&gt;
				hasChanges = true;&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		commitButton.disabled = !hasChanges;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var suggestionEngines = {&lt;br /&gt;
		opensearch: {&lt;br /&gt;
			uri: '/api.php?format=json&amp;amp;action=opensearch&amp;amp;namespace=14&amp;amp;limit=30&amp;amp;search=Category:$1', // $1 = search term&lt;br /&gt;
			// Function to convert result of uri into an array of category names&lt;br /&gt;
			handler: function ( queryResult, queryKey ) {&lt;br /&gt;
				if ( queryResult &amp;amp;&amp;amp; queryResult.length &amp;gt;= 2 ) {&lt;br /&gt;
					var key = queryResult[ 0 ].substring( queryResult[ 0 ].indexOf( ':' ) + 1 );&lt;br /&gt;
					var titles = queryResult[ 1 ];&lt;br /&gt;
					var exists = false;&lt;br /&gt;
					if ( !cat_prefix ) cat_prefix = new RegExp( '^(' + HC.category_regexp + '):' );&lt;br /&gt;
&lt;br /&gt;
					for ( var i = 0; i &amp;lt; titles.length; i++ ) {&lt;br /&gt;
						cat_prefix.lastIndex = 0;&lt;br /&gt;
						var m = cat_prefix.exec( titles[ i ] );&lt;br /&gt;
						if ( m &amp;amp;&amp;amp; m.length &amp;gt; 1 ) {&lt;br /&gt;
							titles[ i ] = titles[ i ].substring( titles[ i ].indexOf( ':' ) + 1 ); // rm namespace&lt;br /&gt;
							if ( key === titles[ i ] ) exists = true;&lt;br /&gt;
						} else {&lt;br /&gt;
							titles.splice( i, 1 ); // Nope, it's not a category after all.&lt;br /&gt;
							i--;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					titles.exists = exists;&lt;br /&gt;
					if ( queryKey !== key ) titles.normalized = key;&lt;br /&gt;
					// Remember the NFC normalized key we got back from the server&lt;br /&gt;
					return titles;&lt;br /&gt;
				}&lt;br /&gt;
				return null;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		internalsearch: {&lt;br /&gt;
			uri: '/api.php?format=json&amp;amp;action=query&amp;amp;list=allpages&amp;amp;apnamespace=14&amp;amp;aplimit=30&amp;amp;apfrom=$1&amp;amp;apprefix=$1',&lt;br /&gt;
			handler: function ( queryResult ) {&lt;br /&gt;
				if ( queryResult &amp;amp;&amp;amp; queryResult.query &amp;amp;&amp;amp; queryResult.query.allpages ) {&lt;br /&gt;
					var titles = queryResult.query.allpages;&lt;br /&gt;
					for ( var i = 0; i &amp;lt; titles.length; i++ ) titles[ i ] = titles[ i ].title.substring( titles[ i ].title.indexOf( ':' ) + 1 ); // rm namespace&lt;br /&gt;
&lt;br /&gt;
					return titles;&lt;br /&gt;
				}&lt;br /&gt;
				return null;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		exists: {&lt;br /&gt;
			uri: '/api.php?format=json&amp;amp;action=query&amp;amp;prop=info&amp;amp;titles=Category:$1',&lt;br /&gt;
			handler: function ( queryResult, queryKey ) {&lt;br /&gt;
				if ( queryResult &amp;amp;&amp;amp; queryResult.query &amp;amp;&amp;amp; queryResult.query.pages &amp;amp;&amp;amp; !queryResult.query.pages[ -1 ] ) {&lt;br /&gt;
					// Should have exactly 1&lt;br /&gt;
					for ( var p in queryResult.query.pages ) {&lt;br /&gt;
						var title = queryResult.query.pages[ p ].title;&lt;br /&gt;
						title = title.substring( title.indexOf( ':' ) + 1 );&lt;br /&gt;
						var titles = [ title ];&lt;br /&gt;
						titles.exists = true;&lt;br /&gt;
						if ( queryKey !== title ) titles.normalized = title;&lt;br /&gt;
						// NFC&lt;br /&gt;
						return titles;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				return null;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		subcategories: {&lt;br /&gt;
			uri: '/api.php?format=json&amp;amp;action=query&amp;amp;list=categorymembers&amp;amp;cmtype=subcat&amp;amp;cmlimit=max&amp;amp;cmtitle=Category:$1',&lt;br /&gt;
			handler: function ( queryResult ) {&lt;br /&gt;
				if ( queryResult &amp;amp;&amp;amp; queryResult.query &amp;amp;&amp;amp; queryResult.query.categorymembers ) {&lt;br /&gt;
					var titles = queryResult.query.categorymembers;&lt;br /&gt;
					for ( var i = 0; i &amp;lt; titles.length; i++ ) titles[ i ] = titles[ i ].title.substring( titles[ i ].title.indexOf( ':' ) + 1 ); // rm namespace&lt;br /&gt;
&lt;br /&gt;
					return titles;&lt;br /&gt;
				}&lt;br /&gt;
				return null;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		parentcategories: {&lt;br /&gt;
			uri: '/api.php?format=json&amp;amp;action=query&amp;amp;prop=categories&amp;amp;titles=Category:$1&amp;amp;cllimit=max',&lt;br /&gt;
			handler: function ( queryResult ) {&lt;br /&gt;
				if ( queryResult &amp;amp;&amp;amp; queryResult.query &amp;amp;&amp;amp; queryResult.query.pages ) {&lt;br /&gt;
					for ( var p in queryResult.query.pages ) {&lt;br /&gt;
						if ( queryResult.query.pages[ p ].categories ) {&lt;br /&gt;
							var titles = queryResult.query.pages[ p ].categories;&lt;br /&gt;
							for ( var i = 0; i &amp;lt; titles.length; i++ ) titles[ i ] = titles[ i ].title.substring( titles[ i ].title.indexOf( ':' ) + 1 ); // rm namespace&lt;br /&gt;
&lt;br /&gt;
							return titles;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				return null;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	var suggestionConfigs = {&lt;br /&gt;
		searchindex: {&lt;br /&gt;
			name: 'Search index',&lt;br /&gt;
			engines: [ 'opensearch' ],&lt;br /&gt;
			cache: {},&lt;br /&gt;
			show: true,&lt;br /&gt;
			temp: false,&lt;br /&gt;
			noCompletion: false&lt;br /&gt;
		},&lt;br /&gt;
		pagelist: {&lt;br /&gt;
			name: 'Page list',&lt;br /&gt;
			engines: [ 'internalsearch', 'exists' ],&lt;br /&gt;
			cache: {},&lt;br /&gt;
			show: true,&lt;br /&gt;
			temp: false,&lt;br /&gt;
			noCompletion: false&lt;br /&gt;
		},&lt;br /&gt;
		combined: {&lt;br /&gt;
			name: 'Combined search',&lt;br /&gt;
			engines: [ 'opensearch', 'internalsearch' ],&lt;br /&gt;
			cache: {},&lt;br /&gt;
			show: true,&lt;br /&gt;
			temp: false,&lt;br /&gt;
			noCompletion: false&lt;br /&gt;
		},&lt;br /&gt;
		subcat: {&lt;br /&gt;
			name: 'Subcategories',&lt;br /&gt;
			engines: [ 'subcategories' ],&lt;br /&gt;
			cache: {},&lt;br /&gt;
			show: true,&lt;br /&gt;
			temp: true,&lt;br /&gt;
			noCompletion: true&lt;br /&gt;
		},&lt;br /&gt;
		parentcat: {&lt;br /&gt;
			name: 'Parent categories',&lt;br /&gt;
			engines: [ 'parentcategories' ],&lt;br /&gt;
			cache: {},&lt;br /&gt;
			show: true,&lt;br /&gt;
			temp: true,&lt;br /&gt;
			noCompletion: true&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	CategoryEditor.UNCHANGED = 0;&lt;br /&gt;
	CategoryEditor.OPEN = 1; // Open, but no input yet&lt;br /&gt;
	CategoryEditor.CHANGE_PENDING = 2; // Open, some input made&lt;br /&gt;
	CategoryEditor.CHANGED = 3;&lt;br /&gt;
	CategoryEditor.DELETED = 4;&lt;br /&gt;
&lt;br /&gt;
	// Support: IE6&lt;br /&gt;
	// IE6 sometimes forgets to redraw the list when editors are opened or closed.&lt;br /&gt;
	// Adding/removing a dummy element helps, at least when opening editors.&lt;br /&gt;
	var dummyElement = make( '\xa0', true );&lt;br /&gt;
&lt;br /&gt;
	function forceRedraw() {&lt;br /&gt;
		if ( dummyElement.parentNode ) document.body.removeChild( dummyElement ); else document.body.appendChild( dummyElement );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Event keyCodes that we handle in the text input field/suggestion list.&lt;br /&gt;
	var BS = 8,&lt;br /&gt;
		TAB = 9,&lt;br /&gt;
		RET = 13,&lt;br /&gt;
		ESC = 27,&lt;br /&gt;
		SPACE = 32,&lt;br /&gt;
		PGUP = 33,&lt;br /&gt;
		PGDOWN = 34,&lt;br /&gt;
		UP = 38,&lt;br /&gt;
		DOWN = 40,&lt;br /&gt;
		DEL = 46,&lt;br /&gt;
		IME = 229;&lt;br /&gt;
&lt;br /&gt;
	CategoryEditor.prototype = {&lt;br /&gt;
&lt;br /&gt;
		initialize: function ( line, span, after, key, is_hidden ) {&lt;br /&gt;
			// If a span is given, 'after' is the category title, otherwise it may be an element after which to&lt;br /&gt;
			// insert the new span. 'key' is likewise overloaded; if a span is given, it is the category key (if&lt;br /&gt;
			// known), otherwise it is a boolean indicating whether a bar shall be prepended.&lt;br /&gt;
			if ( !span ) {&lt;br /&gt;
				this.isAddCategory = true;&lt;br /&gt;
				// Create add span and append to catLinks&lt;br /&gt;
				this.originalCategory = '';&lt;br /&gt;
				this.originalKey = null;&lt;br /&gt;
				this.originalExists = false;&lt;br /&gt;
				if ( !newDOM ) {&lt;br /&gt;
					span = make( 'span' );&lt;br /&gt;
					span.className = 'noprint';&lt;br /&gt;
					if ( key ) {&lt;br /&gt;
						span.appendChild( make( ' | ', true ) );&lt;br /&gt;
						if ( after ) {&lt;br /&gt;
							after.parentNode.insertBefore( span, after.nextSibling );&lt;br /&gt;
							after = after.nextSibling;&lt;br /&gt;
						} else if (line) {&lt;br /&gt;
							line.appendChild( span );&lt;br /&gt;
						}&lt;br /&gt;
					} else if ( line &amp;amp;&amp;amp; line.firstChild ) {&lt;br /&gt;
						span.appendChild( make( ' ', true ) );&lt;br /&gt;
						line.appendChild( span );&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				this.linkSpan = make( 'span' );&lt;br /&gt;
				this.linkSpan.className = 'noprint nopopups hotcatlink';&lt;br /&gt;
				var lk = make( 'a' );&lt;br /&gt;
				lk.href = '#catlinks';&lt;br /&gt;
				lk.onclick = this.open.bind( this );&lt;br /&gt;
				lk.appendChild( make( HC.links.add, true ) );&lt;br /&gt;
				lk.title = HC.tooltips.add;&lt;br /&gt;
				this.linkSpan.appendChild( lk );&lt;br /&gt;
				span = make( newDOM ? 'li' : 'span' );&lt;br /&gt;
				span.className = 'noprint';&lt;br /&gt;
				if ( is_rtl ) span.dir = 'rtl';&lt;br /&gt;
&lt;br /&gt;
				span.appendChild( this.linkSpan );&lt;br /&gt;
				if ( after ) {&lt;br /&gt;
					after.parentNode.insertBefore( span, after.nextSibling );&lt;br /&gt;
				} else if ( line ) {&lt;br /&gt;
					line.appendChild( span );&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				this.normalLinks = null;&lt;br /&gt;
				this.undelLink = null;&lt;br /&gt;
				this.catLink = null;&lt;br /&gt;
			} else {&lt;br /&gt;
				if ( is_rtl ) span.dir = 'rtl';&lt;br /&gt;
&lt;br /&gt;
				this.isAddCategory = false;&lt;br /&gt;
				this.catLink = span.firstChild;&lt;br /&gt;
				this.originalCategory = after;&lt;br /&gt;
				this.originalKey = ( key &amp;amp;&amp;amp; key.length &amp;gt; 1 ) ? key.substr( 1 ) : null; // &amp;gt; 1 because it includes the leading bar&lt;br /&gt;
				this.originalExists = !hasClass( this.catLink, 'new' );&lt;br /&gt;
				// Create change and del links&lt;br /&gt;
				this.makeLinkSpan();&lt;br /&gt;
				if ( !this.originalExists &amp;amp;&amp;amp; this.upDownLinks ) this.upDownLinks.style.display = 'none';&lt;br /&gt;
&lt;br /&gt;
				span.appendChild( this.linkSpan );&lt;br /&gt;
			}&lt;br /&gt;
			this.originalHidden = is_hidden;&lt;br /&gt;
			this.line = line;&lt;br /&gt;
			this.engine = HC.suggestions;&lt;br /&gt;
			this.span = span;&lt;br /&gt;
			this.currentCategory = this.originalCategory;&lt;br /&gt;
			this.currentExists = this.originalExists;&lt;br /&gt;
			this.currentHidden = this.originalHidden;&lt;br /&gt;
			this.currentKey = this.originalKey;&lt;br /&gt;
			this.state = CategoryEditor.UNCHANGED;&lt;br /&gt;
			this.lastSavedState = CategoryEditor.UNCHANGED;&lt;br /&gt;
			this.lastSavedCategory = this.originalCategory;&lt;br /&gt;
			this.lastSavedKey = this.originalKey;&lt;br /&gt;
			this.lastSavedExists = this.originalExists;&lt;br /&gt;
			this.lastSavedHidden = this.originalHidden;&lt;br /&gt;
			if ( this.catLink &amp;amp;&amp;amp; this.currentKey ) this.catLink.title = this.currentKey;&lt;br /&gt;
&lt;br /&gt;
			editors[ editors.length ] = this;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		makeLinkSpan: function () {&lt;br /&gt;
			this.normalLinks = make( 'span' );&lt;br /&gt;
			var lk = null;&lt;br /&gt;
			if ( this.originalCategory &amp;amp;&amp;amp; this.originalCategory.length ) {&lt;br /&gt;
				lk = make( 'a' );&lt;br /&gt;
				lk.href = '#catlinks';&lt;br /&gt;
				lk.onclick = this.remove.bind( this );&lt;br /&gt;
				lk.appendChild( make( HC.links.remove, true ) );&lt;br /&gt;
				lk.title = HC.tooltips.remove;&lt;br /&gt;
				this.normalLinks.appendChild( make( ' ', true ) );&lt;br /&gt;
				this.normalLinks.appendChild( lk );&lt;br /&gt;
			}&lt;br /&gt;
			if ( !HC.template_categories[ this.originalCategory ] ) {&lt;br /&gt;
				lk = make( 'a' );&lt;br /&gt;
				lk.href = '#catlinks';&lt;br /&gt;
				lk.onclick = this.open.bind( this );&lt;br /&gt;
				lk.appendChild( make( HC.links.change, true ) );&lt;br /&gt;
				lk.title = HC.tooltips.change;&lt;br /&gt;
				this.normalLinks.appendChild( make( ' ', true ) );&lt;br /&gt;
				this.normalLinks.appendChild( lk );&lt;br /&gt;
				if ( !noSuggestions &amp;amp;&amp;amp; HC.use_up_down ) {&lt;br /&gt;
					this.upDownLinks = make( 'span' );&lt;br /&gt;
					lk = make( 'a' );&lt;br /&gt;
					lk.href = '#catlinks';&lt;br /&gt;
					lk.onclick = this.down.bind( this );&lt;br /&gt;
					lk.appendChild( make( HC.links.down, true ) );&lt;br /&gt;
					lk.title = HC.tooltips.down;&lt;br /&gt;
					this.upDownLinks.appendChild( make( ' ', true ) );&lt;br /&gt;
					this.upDownLinks.appendChild( lk );&lt;br /&gt;
					lk = make( 'a' );&lt;br /&gt;
					lk.href = '#catlinks';&lt;br /&gt;
					lk.onclick = this.up.bind( this );&lt;br /&gt;
					lk.appendChild( make( HC.links.up, true ) );&lt;br /&gt;
					lk.title = HC.tooltips.up;&lt;br /&gt;
					this.upDownLinks.appendChild( make( ' ', true ) );&lt;br /&gt;
					this.upDownLinks.appendChild( lk );&lt;br /&gt;
					this.normalLinks.appendChild( this.upDownLinks );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			this.linkSpan = make( 'span' );&lt;br /&gt;
			this.linkSpan.className = 'noprint nopopups hotcatlink';&lt;br /&gt;
			this.linkSpan.appendChild( this.normalLinks );&lt;br /&gt;
			this.undelLink = make( 'span' );&lt;br /&gt;
			this.undelLink.className = 'nopopups hotcatlink';&lt;br /&gt;
			this.undelLink.style.display = 'none';&lt;br /&gt;
			lk = make( 'a' );&lt;br /&gt;
			lk.href = '#catlinks';&lt;br /&gt;
			lk.onclick = this.restore.bind( this );&lt;br /&gt;
			lk.appendChild( make( HC.links.restore, true ) );&lt;br /&gt;
			lk.title = HC.tooltips.restore;&lt;br /&gt;
			this.undelLink.appendChild( make( ' ', true ) );&lt;br /&gt;
			this.undelLink.appendChild( lk );&lt;br /&gt;
			this.linkSpan.appendChild( this.undelLink );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		invokeSuggestions: function ( dont_autocomplete ) {&lt;br /&gt;
			if ( this.engine &amp;amp;&amp;amp; suggestionConfigs[ this.engine ] &amp;amp;&amp;amp; suggestionConfigs[ this.engine ].temp &amp;amp;&amp;amp; !dont_autocomplete ) this.engine = HC.suggestions; // Reset to a search upon input&lt;br /&gt;
&lt;br /&gt;
			this.state = CategoryEditor.CHANGE_PENDING;&lt;br /&gt;
			var self = this;&lt;br /&gt;
			window.setTimeout( function () {&lt;br /&gt;
				self.textchange( dont_autocomplete );&lt;br /&gt;
			}, HC.suggest_delay );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		makeForm: function () {&lt;br /&gt;
			var form = make( 'form' );&lt;br /&gt;
			form.method = 'POST';&lt;br /&gt;
			form.onsubmit = this.accept.bind( this );&lt;br /&gt;
			this.form = form;&lt;br /&gt;
			var self = this;&lt;br /&gt;
			var text = make( 'input' );&lt;br /&gt;
			text.type = 'text';&lt;br /&gt;
			text.size = HC.editbox_width;&lt;br /&gt;
			if ( !noSuggestions ) {&lt;br /&gt;
				// Be careful here to handle IME input. This is browser/OS/IME dependent, but basically there are two mechanisms:&lt;br /&gt;
				// - Modern (DOM Level 3) browsers use compositionstart/compositionend events to signal composition; if the&lt;br /&gt;
				//   composition is not canceled, there'll be a textInput event following. During a composition key events are&lt;br /&gt;
				//   either all suppressed (FF/Gecko), or otherwise have keyDown === IME for all keys (Webkit).&lt;br /&gt;
				//   - Webkit sends a textInput followed by keyDown === IME and a keyUp with the key that ended composition.&lt;br /&gt;
				//   - Gecko doesn't send textInput but just a keyUp with the key that ended composition, without sending keyDown&lt;br /&gt;
				//     first. Gecko doesn't send any keydown while IME is active.&lt;br /&gt;
				// - Older browsers signal composition by keyDown === IME for the first and subsequent keys for a composition. The&lt;br /&gt;
				//   first keyDown !== IME is certainly after the end of the composition. Typically, composition end can also be&lt;br /&gt;
				//   detected by a keyDown IME with a keyUp of space, tab, escape, or return.&lt;br /&gt;
				text.onkeyup = function ( evt ) {&lt;br /&gt;
					var key = evt.keyCode || 0;&lt;br /&gt;
					if ( self.ime &amp;amp;&amp;amp; self.lastKey === IME &amp;amp;&amp;amp; !self.usesComposition &amp;amp;&amp;amp; ( key === TAB || key === RET || key === ESC || key === SPACE ) ) self.ime = false;&lt;br /&gt;
&lt;br /&gt;
					if ( self.ime ) return true;&lt;br /&gt;
&lt;br /&gt;
					if ( key === UP || key === DOWN || key === PGUP || key === PGDOWN ) {&lt;br /&gt;
						// In case a browser doesn't generate keypress events for arrow keys...&lt;br /&gt;
						if ( self.keyCount === 0 ) return self.processKey( evt );&lt;br /&gt;
					} else {&lt;br /&gt;
						if ( key === ESC &amp;amp;&amp;amp; self.lastKey !== IME ) {&lt;br /&gt;
							if ( !self.resetKeySelection() ) {&lt;br /&gt;
								// No undo of key selection: treat ESC as &amp;quot;cancel&amp;quot;.&lt;br /&gt;
								self.cancel();&lt;br /&gt;
								return;&lt;br /&gt;
							}&lt;br /&gt;
						}&lt;br /&gt;
						// Also do this for ESC as a workaround for Firefox bug 524360&lt;br /&gt;
						// https://bugzilla.mozilla.org/show_bug.cgi?id=524360&lt;br /&gt;
						self.invokeSuggestions( key === BS || key === DEL || key === ESC );&lt;br /&gt;
					}&lt;br /&gt;
					return true;&lt;br /&gt;
				};&lt;br /&gt;
				text.onkeydown = function ( evt ) {&lt;br /&gt;
					var key = evt.keyCode || 0;&lt;br /&gt;
					self.lastKey = key;&lt;br /&gt;
					self.keyCount = 0;&lt;br /&gt;
					// DOM Level &amp;lt; 3 IME input&lt;br /&gt;
					if ( !self.ime &amp;amp;&amp;amp; key === IME &amp;amp;&amp;amp; !self.usesComposition ) {&lt;br /&gt;
						// self.usesComposition catches browsers that may emit spurious keydown IME after a composition has ended&lt;br /&gt;
						self.ime = true;&lt;br /&gt;
					} else if ( self.ime &amp;amp;&amp;amp; key !== IME &amp;amp;&amp;amp; !( key &amp;gt;= 16 &amp;amp;&amp;amp; key &amp;lt;= 20 || key &amp;gt;= 91 &amp;amp;&amp;amp; key &amp;lt;= 93 || key === 144 ) ) {&lt;br /&gt;
						// Ignore control keys: ctrl, shift, alt, alt gr, caps lock, windows/apple cmd keys, num lock. Only the windows keys&lt;br /&gt;
						// terminate IME (apple cmd doesn't), but they also cause a blur, so it's OK to ignore them here.&lt;br /&gt;
						// Note: Safari 4 (530.17) propagates ESC out of an IME composition (observed at least on Win XP).&lt;br /&gt;
						self.ime = false;&lt;br /&gt;
					}&lt;br /&gt;
					if ( self.ime ) return true;&lt;br /&gt;
&lt;br /&gt;
					// Handle return explicitly, to override the default form submission to be able to check for ctrl&lt;br /&gt;
					if ( key === RET ) return self.accept( evt );&lt;br /&gt;
&lt;br /&gt;
					// Inhibit default behavior of ESC (revert to last real input in FF: we do that ourselves)&lt;br /&gt;
					return ( key === ESC ) ? evtKill( evt ) : true;&lt;br /&gt;
				};&lt;br /&gt;
				// And handle continued pressing of arrow keys&lt;br /&gt;
				text.onkeypress = function ( evt ) {&lt;br /&gt;
					self.keyCount++;&lt;br /&gt;
					return self.processKey( evt );&lt;br /&gt;
				};&lt;br /&gt;
				$( text ).on( 'focus', function () {&lt;br /&gt;
					makeActive( self );&lt;br /&gt;
				} );&lt;br /&gt;
				// On IE, blur events are asynchronous, and may thus arrive after the element has lost the focus. Since IE&lt;br /&gt;
				// can get the selection only while the element is active (has the focus), we may not always get the selection.&lt;br /&gt;
				// Therefore, use an IE-specific synchronous event on IE...&lt;br /&gt;
				// Don't test for text.selectionStart being defined;&lt;br /&gt;
				$( text ).on(&lt;br /&gt;
					( text.onbeforedeactivate !== undefined &amp;amp;&amp;amp; text.createTextRange ) ? 'beforedeactivate' : 'blur',&lt;br /&gt;
					this.saveView.bind( this ) );&lt;br /&gt;
				// DOM Level 3 IME handling&lt;br /&gt;
				try {&lt;br /&gt;
					// Setting lastKey = IME provides a fake keyDown for Gecko's single keyUp after a cmposition. If we didn't do this,&lt;br /&gt;
					// cancelling a composition via ESC would also cancel and close the whole category input editor.&lt;br /&gt;
					$( text ).on( 'compositionstart', function () {&lt;br /&gt;
						self.lastKey = IME;&lt;br /&gt;
						self.usesComposition = true;&lt;br /&gt;
						self.ime = true;&lt;br /&gt;
					} );&lt;br /&gt;
					$( text ).on( 'compositionend', function () {&lt;br /&gt;
						self.lastKey = IME;&lt;br /&gt;
						self.usesComposition = true;&lt;br /&gt;
						self.ime = false;&lt;br /&gt;
					} );&lt;br /&gt;
					$( text ).on( 'textInput', function () {&lt;br /&gt;
						self.ime = false;&lt;br /&gt;
						self.invokeSuggestions( false );&lt;br /&gt;
					} );&lt;br /&gt;
				} catch ( any ) {&lt;br /&gt;
					// Just in case some browsers might produce exceptions with these DOM Level 3 events&lt;br /&gt;
				}&lt;br /&gt;
				$( text ).on( 'blur', function () {&lt;br /&gt;
					self.usesComposition = false;&lt;br /&gt;
					self.ime = false;&lt;br /&gt;
				} );&lt;br /&gt;
			}&lt;br /&gt;
			this.text = text;&lt;br /&gt;
&lt;br /&gt;
			this.icon = make( 'img' );&lt;br /&gt;
&lt;br /&gt;
			var list = null;&lt;br /&gt;
			if ( !noSuggestions ) {&lt;br /&gt;
				list = make( 'select' );&lt;br /&gt;
				list.onclick = function () {&lt;br /&gt;
					if ( self.highlightSuggestion( 0 ) ) self.textchange( false, true );&lt;br /&gt;
				};&lt;br /&gt;
				list.ondblclick = function ( e ) {&lt;br /&gt;
					if ( self.highlightSuggestion( 0 ) ) self.accept( e );&lt;br /&gt;
				};&lt;br /&gt;
				list.onchange = function () {&lt;br /&gt;
					self.highlightSuggestion( 0 );&lt;br /&gt;
					self.text.focus();&lt;br /&gt;
				};&lt;br /&gt;
				list.onkeyup = function ( evt ) {&lt;br /&gt;
					if ( evt.keyCode === ESC ) {&lt;br /&gt;
						self.resetKeySelection();&lt;br /&gt;
						self.text.focus();&lt;br /&gt;
						window.setTimeout( function () {&lt;br /&gt;
							self.textchange( true );&lt;br /&gt;
						}, HC.suggest_delay );&lt;br /&gt;
					} else if ( evt.keyCode === RET ) {&lt;br /&gt;
						self.accept( evt );&lt;br /&gt;
					}&lt;br /&gt;
				};&lt;br /&gt;
				if ( !HC.fixed_search ) {&lt;br /&gt;
					var engineSelector = make( 'select' );&lt;br /&gt;
					for ( var key in suggestionConfigs ) {&lt;br /&gt;
						if ( suggestionConfigs[ key ].show ) {&lt;br /&gt;
							var opt = make( 'option' );&lt;br /&gt;
							opt.value = key;&lt;br /&gt;
							if ( key === this.engine ) opt.selected = true;&lt;br /&gt;
&lt;br /&gt;
							opt.appendChild( make( suggestionConfigs[ key ].name, true ) );&lt;br /&gt;
							engineSelector.appendChild( opt );&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					engineSelector.onchange = function () {&lt;br /&gt;
						self.engine = self.engineSelector.options[ self.engineSelector.selectedIndex ].value;&lt;br /&gt;
						self.text.focus();&lt;br /&gt;
						self.textchange( true, true ); // Don't autocomplete, force re-display of list&lt;br /&gt;
					};&lt;br /&gt;
					this.engineSelector = engineSelector;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			this.list = list;&lt;br /&gt;
&lt;br /&gt;
			function button_label( id, defaultText ) {&lt;br /&gt;
				var label = null;&lt;br /&gt;
				if (&lt;br /&gt;
					onUpload &amp;amp;&amp;amp;&lt;br /&gt;
					window.UFUI !== undefined &amp;amp;&amp;amp;&lt;br /&gt;
					window.UIElements !== undefined &amp;amp;&amp;amp;&lt;br /&gt;
					UFUI.getLabel instanceof Function&lt;br /&gt;
				) {&lt;br /&gt;
					try {&lt;br /&gt;
						label = UFUI.getLabel( id, true );&lt;br /&gt;
						// Extract the plain text. IE doesn't know that Node.TEXT_NODE === 3&lt;br /&gt;
						while ( label &amp;amp;&amp;amp; label.nodeType !== 3 ) label = label.firstChild;&lt;br /&gt;
					} catch ( ex ) {&lt;br /&gt;
						label = null;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if ( !label || !label.data ) return defaultText;&lt;br /&gt;
&lt;br /&gt;
				return label.data;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Do not use type 'submit'; we cannot detect modifier keys if we do&lt;br /&gt;
			var OK = make( 'input' );&lt;br /&gt;
			OK.type = 'button';&lt;br /&gt;
			OK.value = button_label( 'wpOkUploadLbl', HC.messages.ok );&lt;br /&gt;
			OK.onclick = this.accept.bind( this );&lt;br /&gt;
			this.ok = OK;&lt;br /&gt;
&lt;br /&gt;
			var cancel = make( 'input' );&lt;br /&gt;
			cancel.type = 'button';&lt;br /&gt;
			cancel.value = button_label( 'wpCancelUploadLbl', HC.messages.cancel );&lt;br /&gt;
			cancel.onclick = this.cancel.bind( this );&lt;br /&gt;
			this.cancelButton = cancel;&lt;br /&gt;
&lt;br /&gt;
			var span = make( 'span' );&lt;br /&gt;
			span.className = 'hotcatinput';&lt;br /&gt;
			span.style.position = 'relative';&lt;br /&gt;
			span.appendChild( text );&lt;br /&gt;
&lt;br /&gt;
			// Support: IE8, IE9&lt;br /&gt;
			// Put some text into this span (a0 is nbsp) and make sure it always stays on the same&lt;br /&gt;
			// line as the input field, otherwise, IE8/9 miscalculates the height of the span and&lt;br /&gt;
			// then the engine selector may overlap the input field.&lt;br /&gt;
			span.appendChild( make( '\xa0', true ) );&lt;br /&gt;
			span.style.whiteSpace = 'nowrap';&lt;br /&gt;
&lt;br /&gt;
			if ( list ) span.appendChild( list );&lt;br /&gt;
&lt;br /&gt;
			if ( this.engineSelector ) span.appendChild( this.engineSelector );&lt;br /&gt;
&lt;br /&gt;
			if ( !noSuggestions ) span.appendChild( this.icon );&lt;br /&gt;
&lt;br /&gt;
			span.appendChild( OK );&lt;br /&gt;
			span.appendChild( cancel );&lt;br /&gt;
			form.appendChild( span );&lt;br /&gt;
			form.style.display = 'none';&lt;br /&gt;
			this.span.appendChild( form );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		display: function ( evt ) {&lt;br /&gt;
			if ( this.isAddCategory &amp;amp;&amp;amp; !onUpload &amp;amp;&amp;amp; this.line ) {&lt;br /&gt;
				// eslint-disable-next-line no-new&lt;br /&gt;
				new CategoryEditor( this.line, null, this.span, true ); // Create a new one&lt;br /&gt;
			}&lt;br /&gt;
			if ( !commitButton &amp;amp;&amp;amp; !onUpload ) {&lt;br /&gt;
				for ( var i = 0; i &amp;lt; editors.length; i++ ) {&lt;br /&gt;
					if ( editors[ i ].state !== CategoryEditor.UNCHANGED ) {&lt;br /&gt;
						setMultiInput();&lt;br /&gt;
						break;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if ( !this.form ) this.makeForm();&lt;br /&gt;
&lt;br /&gt;
			if ( this.list ) this.list.style.display = 'none';&lt;br /&gt;
&lt;br /&gt;
			if ( this.engineSelector ) this.engineSelector.style.display = 'none';&lt;br /&gt;
&lt;br /&gt;
			this.currentCategory = this.lastSavedCategory;&lt;br /&gt;
			this.currentExists = this.lastSavedExists;&lt;br /&gt;
			this.currentHidden = this.lastSavedHidden;&lt;br /&gt;
			this.currentKey = this.lastSavedKey;&lt;br /&gt;
			this.icon.src = ( this.currentExists ? HC.existsYes : HC.existsNo );&lt;br /&gt;
			this.text.value = this.currentCategory + ( this.currentKey !== null ? '|' + this.currentKey : '' );&lt;br /&gt;
			this.originalState = this.state;&lt;br /&gt;
			this.lastInput = this.currentCategory;&lt;br /&gt;
			this.inputExists = this.currentExists;&lt;br /&gt;
			this.state = this.state === CategoryEditor.UNCHANGED ? CategoryEditor.OPEN : CategoryEditor.CHANGE_PENDING;&lt;br /&gt;
			this.lastSelection = {&lt;br /&gt;
				start: this.currentCategory.length,&lt;br /&gt;
				end: this.currentCategory.length&lt;br /&gt;
			};&lt;br /&gt;
			this.showsList = false;&lt;br /&gt;
			// Display the form&lt;br /&gt;
			if ( this.catLink ) this.catLink.style.display = 'none';&lt;br /&gt;
&lt;br /&gt;
			this.linkSpan.style.display = 'none';&lt;br /&gt;
			this.form.style.display = 'inline';&lt;br /&gt;
			this.ok.disabled = false;&lt;br /&gt;
			// Kill the event before focussing, otherwise IE will kill the onfocus event!&lt;br /&gt;
			var result = evtKill( evt );&lt;br /&gt;
			this.text.focus();&lt;br /&gt;
			this.text.readOnly = false;&lt;br /&gt;
			checkMultiInput();&lt;br /&gt;
			return result;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		show: function ( evt, engine, readOnly ) {&lt;br /&gt;
			var result = this.display( evt );&lt;br /&gt;
			var v = this.lastSavedCategory;&lt;br /&gt;
			if ( !v.length ) return result;&lt;br /&gt;
&lt;br /&gt;
			this.text.readOnly = !!readOnly;&lt;br /&gt;
			this.engine = engine;&lt;br /&gt;
			this.textchange( false, true ); // do autocompletion, force display of suggestions&lt;br /&gt;
			forceRedraw();&lt;br /&gt;
			return result;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		open: function ( evt ) {&lt;br /&gt;
			return this.show( evt, ( this.engine &amp;amp;&amp;amp; suggestionConfigs[ this.engine ].temp ) ? HC.suggestions : this.engine );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		down: function ( evt ) {&lt;br /&gt;
			return this.show( evt, 'subcat', true );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		up: function ( evt ) {&lt;br /&gt;
			return this.show( evt, 'parentcat' );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		cancel: function () {&lt;br /&gt;
			if ( this.isAddCategory &amp;amp;&amp;amp; !onUpload ) {&lt;br /&gt;
				this.removeEditor(); // We added a new adder when opening&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			// Close, re-display link&lt;br /&gt;
			this.inactivate();&lt;br /&gt;
			this.form.style.display = 'none';&lt;br /&gt;
			if ( this.catLink ) this.catLink.style.display = '';&lt;br /&gt;
&lt;br /&gt;
			this.linkSpan.style.display = '';&lt;br /&gt;
			this.state = this.originalState;&lt;br /&gt;
			this.currentCategory = this.lastSavedCategory;&lt;br /&gt;
			this.currentKey = this.lastSavedKey;&lt;br /&gt;
			this.currentExists = this.lastSavedExists;&lt;br /&gt;
			this.currentHidden = this.lastSavedHidden;&lt;br /&gt;
			if ( this.catLink )&lt;br /&gt;
				if ( this.currentKey &amp;amp;&amp;amp; this.currentKey.length ) { this.catLink.title = this.currentKey; } else { this.catLink.title = ''; }&lt;br /&gt;
&lt;br /&gt;
			if ( this.state === CategoryEditor.UNCHANGED ) {&lt;br /&gt;
				if ( this.catLink ) this.catLink.style.backgroundColor = 'transparent';&lt;br /&gt;
			} else {&lt;br /&gt;
				if ( !onUpload ) {&lt;br /&gt;
					try {&lt;br /&gt;
						this.catLink.style.backgroundColor = HC.bg_changed;&lt;br /&gt;
					} catch ( ex ) {}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			checkMultiInput();&lt;br /&gt;
			forceRedraw();&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		removeEditor: function () {&lt;br /&gt;
			if ( !newDOM ) {&lt;br /&gt;
				var next = this.span.nextSibling;&lt;br /&gt;
				if ( next ) next.parentNode.removeChild( next );&lt;br /&gt;
			}&lt;br /&gt;
			if (this.span &amp;amp;&amp;amp; this.span.parentNode) {&lt;br /&gt;
				this.span.parentNode.removeChild( this.span );&lt;br /&gt;
			}&lt;br /&gt;
			for ( var i = 0; i &amp;lt; editors.length; i++ ) {&lt;br /&gt;
				if ( editors[ i ] === this ) {&lt;br /&gt;
					editors.splice( i, 1 );&lt;br /&gt;
					break;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			checkMultiInput();&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		rollback: function ( evt ) {&lt;br /&gt;
			this.undoLink.parentNode.removeChild( this.undoLink );&lt;br /&gt;
			this.undoLink = null;&lt;br /&gt;
			this.currentCategory = this.originalCategory;&lt;br /&gt;
			this.currentKey = this.originalKey;&lt;br /&gt;
			this.currentExists = this.originalExists;&lt;br /&gt;
			this.currentHidden = this.originalHidden;&lt;br /&gt;
			this.lastSavedCategory = this.originalCategory;&lt;br /&gt;
			this.lastSavedKey = this.originalKey;&lt;br /&gt;
			this.lastSavedExists = this.originalExists;&lt;br /&gt;
			this.lastSavedHidden = this.originalHidden;&lt;br /&gt;
			this.state = CategoryEditor.UNCHANGED;&lt;br /&gt;
			if ( !this.currentCategory || !this.currentCategory.length ) {&lt;br /&gt;
				// It was a newly added category. Remove the whole editor.&lt;br /&gt;
				this.removeEditor();&lt;br /&gt;
			} else {&lt;br /&gt;
				// Redisplay the link...&lt;br /&gt;
				this.catLink.removeChild( this.catLink.firstChild );&lt;br /&gt;
				this.catLink.appendChild( make( this.currentCategory, true ) );&lt;br /&gt;
				this.catLink.href = wikiPagePath( HC.category_canonical + ':' + this.currentCategory );&lt;br /&gt;
				this.catLink.title = this.currentKey || '';&lt;br /&gt;
				this.catLink.className = this.currentExists ? '' : 'new';&lt;br /&gt;
				this.catLink.style.backgroundColor = 'transparent';&lt;br /&gt;
				if ( this.upDownLinks ) this.upDownLinks.style.display = this.currentExists ? '' : 'none';&lt;br /&gt;
&lt;br /&gt;
				checkMultiInput();&lt;br /&gt;
			}&lt;br /&gt;
			return evtKill( evt );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		inactivate: function () {&lt;br /&gt;
			if ( this.list ) this.list.style.display = 'none';&lt;br /&gt;
&lt;br /&gt;
			if ( this.engineSelector ) this.engineSelector.style.display = 'none';&lt;br /&gt;
&lt;br /&gt;
			this.is_active = false;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		acceptCheck: function ( dontCheck ) {&lt;br /&gt;
			this.sanitizeInput();&lt;br /&gt;
			var value = this.text.value.split( '|' );&lt;br /&gt;
			var key = null;&lt;br /&gt;
			if ( value.length &amp;gt; 1 ) key = value[ 1 ];&lt;br /&gt;
&lt;br /&gt;
			var v = value[ 0 ].replace( /_/g, ' ' ).replace( /^\s+|\s+$/g, '' );&lt;br /&gt;
			if ( HC.capitalizePageNames ) v = capitalize( v );&lt;br /&gt;
&lt;br /&gt;
			this.lastInput = v;&lt;br /&gt;
			v = replaceShortcuts( v, HC.shortcuts );&lt;br /&gt;
			if ( !v.length ) {&lt;br /&gt;
				this.cancel();&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
			if ( !dontCheck &amp;amp;&amp;amp; (&lt;br /&gt;
				conf.wgNamespaceNumber === 14 &amp;amp;&amp;amp; v === conf.wgTitle || HC.blacklist &amp;amp;&amp;amp; HC.blacklist.test( v ) ) ) {&lt;br /&gt;
				this.cancel();&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
			this.currentCategory = v;&lt;br /&gt;
			this.currentKey = key;&lt;br /&gt;
			this.currentExists = this.inputExists;&lt;br /&gt;
			return true;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		accept: function ( evt ) {&lt;br /&gt;
			// eslint-disable-next-line no-bitwise&lt;br /&gt;
			this.noCommit = ( evtKeys( evt ) &amp;amp; 1 ) !== 0;&lt;br /&gt;
			var result = evtKill( evt );&lt;br /&gt;
			if ( this.acceptCheck() ) {&lt;br /&gt;
				var toResolve = [ this ];&lt;br /&gt;
				var original = this.currentCategory;&lt;br /&gt;
				resolveMulti( toResolve, function ( resolved ) {&lt;br /&gt;
					if ( resolved[ 0 ].dab ) {&lt;br /&gt;
						showDab( resolved[ 0 ] );&lt;br /&gt;
					} else {&lt;br /&gt;
						if ( resolved[ 0 ].acceptCheck( true ) ) {&lt;br /&gt;
							resolved[ 0 ].commit(&lt;br /&gt;
								( resolved[ 0 ].currentCategory !== original ) ?&lt;br /&gt;
									HC.messages.cat_resolved.replace( /\$1/g, original ) :&lt;br /&gt;
									null );&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				} );&lt;br /&gt;
			}&lt;br /&gt;
			return result;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		close: function () {&lt;br /&gt;
			if ( !this.catLink ) {&lt;br /&gt;
				// Create a catLink&lt;br /&gt;
				this.catLink = make( 'a' );&lt;br /&gt;
				this.catLink.appendChild( make( 'foo', true ) );&lt;br /&gt;
				this.catLink.style.display = 'none';&lt;br /&gt;
				this.span.insertBefore( this.catLink, this.span.firstChild.nextSibling );&lt;br /&gt;
			}&lt;br /&gt;
			this.catLink.removeChild( this.catLink.firstChild );&lt;br /&gt;
			this.catLink.appendChild( make( this.currentCategory, true ) );&lt;br /&gt;
			this.catLink.href = wikiPagePath( HC.category_canonical + ':' + this.currentCategory );&lt;br /&gt;
			this.catLink.className = this.currentExists ? '' : 'new';&lt;br /&gt;
			this.lastSavedCategory = this.currentCategory;&lt;br /&gt;
			this.lastSavedKey = this.currentKey;&lt;br /&gt;
			this.lastSavedExists = this.currentExists;&lt;br /&gt;
			this.lastSavedHidden = this.currentHidden;&lt;br /&gt;
			// Close form and redisplay category&lt;br /&gt;
			this.inactivate();&lt;br /&gt;
			this.form.style.display = 'none';&lt;br /&gt;
			this.catLink.title = this.currentKey || '';&lt;br /&gt;
			this.catLink.style.display = '';&lt;br /&gt;
			if ( this.isAddCategory ) {&lt;br /&gt;
				if ( onUpload &amp;amp;&amp;amp; this.line ) {&lt;br /&gt;
					// eslint-disable-next-line no-new&lt;br /&gt;
					new CategoryEditor( this.line, null, this.span, true ); // Create a new one&lt;br /&gt;
				}&lt;br /&gt;
				this.isAddCategory = false;&lt;br /&gt;
				this.linkSpan.parentNode.removeChild( this.linkSpan );&lt;br /&gt;
				this.makeLinkSpan();&lt;br /&gt;
				this.span.appendChild( this.linkSpan );&lt;br /&gt;
			}&lt;br /&gt;
			if ( !this.undoLink ) {&lt;br /&gt;
				// Append an undo link.&lt;br /&gt;
				var span = make( 'span' );&lt;br /&gt;
				var lk = make( 'a' );&lt;br /&gt;
				lk.href = '#catlinks';&lt;br /&gt;
				lk.onclick = this.rollback.bind( this );&lt;br /&gt;
				lk.appendChild( make( HC.links.undo, true ) );&lt;br /&gt;
				lk.title = HC.tooltips.undo;&lt;br /&gt;
				span.appendChild( make( ' ', true ) );&lt;br /&gt;
				span.appendChild( lk );&lt;br /&gt;
				this.normalLinks.appendChild( span );&lt;br /&gt;
				this.undoLink = span;&lt;br /&gt;
				if ( !onUpload ) {&lt;br /&gt;
					try {&lt;br /&gt;
						this.catLink.style.backgroundColor = HC.bg_changed;&lt;br /&gt;
					} catch ( ex ) {}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if ( this.upDownLinks ) this.upDownLinks.style.display = this.lastSavedExists ? '' : 'none';&lt;br /&gt;
&lt;br /&gt;
			this.linkSpan.style.display = '';&lt;br /&gt;
			this.state = CategoryEditor.CHANGED;&lt;br /&gt;
			checkMultiInput();&lt;br /&gt;
			forceRedraw();&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		commit: function () {&lt;br /&gt;
			// Check again to catch problem cases after redirect resolution&lt;br /&gt;
			if (&lt;br /&gt;
				(&lt;br /&gt;
					this.currentCategory === this.originalCategory &amp;amp;&amp;amp;&lt;br /&gt;
					(&lt;br /&gt;
						this.currentKey === this.originalKey ||&lt;br /&gt;
						this.currentKey === null &amp;amp;&amp;amp; !this.originalKey.length&lt;br /&gt;
					)&lt;br /&gt;
				) ||&lt;br /&gt;
				conf.wgNamespaceNumber === 14 &amp;amp;&amp;amp; this.currentCategory === conf.wgTitle ||&lt;br /&gt;
				HC.blacklist &amp;amp;&amp;amp; HC.blacklist.test( this.currentCategory )&lt;br /&gt;
			) {&lt;br /&gt;
				this.cancel();&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			this.close();&lt;br /&gt;
			if ( !commitButton &amp;amp;&amp;amp; !onUpload ) {&lt;br /&gt;
				var self = this;&lt;br /&gt;
				initiateEdit( function ( failure ) {&lt;br /&gt;
					performChanges( failure, self );&lt;br /&gt;
				}, function ( msg ) {&lt;br /&gt;
					alert( msg );&lt;br /&gt;
				} );&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		remove: function ( evt ) {&lt;br /&gt;
			// eslint-disable-next-line no-bitwise&lt;br /&gt;
			this.doRemove( evtKeys( evt ) &amp;amp; 1 );&lt;br /&gt;
			return evtKill( evt );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		doRemove: function ( noCommit ) {&lt;br /&gt;
			if ( this.isAddCategory ) { // Empty input on adding a new category&lt;br /&gt;
				this.cancel();&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			if ( !commitButton &amp;amp;&amp;amp; !onUpload ) {&lt;br /&gt;
				for ( var i = 0; i &amp;lt; editors.length; i++ ) {&lt;br /&gt;
					if ( editors[ i ].state !== CategoryEditor.UNCHANGED ) {&lt;br /&gt;
						setMultiInput();&lt;br /&gt;
						break;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if ( commitButton ) {&lt;br /&gt;
				this.catLink.title = '';&lt;br /&gt;
				this.catLink.style.cssText += '; text-decoration : line-through !important;';&lt;br /&gt;
				try {&lt;br /&gt;
					this.catLink.style.backgroundColor = HC.bg_changed;&lt;br /&gt;
				} catch ( ex ) {}&lt;br /&gt;
				this.originalState = this.state;&lt;br /&gt;
				this.state = CategoryEditor.DELETED;&lt;br /&gt;
				this.normalLinks.style.display = 'none';&lt;br /&gt;
				this.undelLink.style.display = '';&lt;br /&gt;
				checkMultiInput();&lt;br /&gt;
			} else {&lt;br /&gt;
				if ( onUpload ) {&lt;br /&gt;
					// Remove this editor completely&lt;br /&gt;
					this.removeEditor();&lt;br /&gt;
				} else {&lt;br /&gt;
					this.originalState = this.state;&lt;br /&gt;
					this.state = CategoryEditor.DELETED;&lt;br /&gt;
					this.noCommit = noCommit || HC.del_needs_diff;&lt;br /&gt;
					var self = this;&lt;br /&gt;
					initiateEdit(&lt;br /&gt;
						function ( failure ) {&lt;br /&gt;
							performChanges( failure, self );&lt;br /&gt;
						},&lt;br /&gt;
						function ( msg ) {&lt;br /&gt;
							self.state = self.originalState;&lt;br /&gt;
							alert( msg );&lt;br /&gt;
						} );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		restore: function ( evt ) {&lt;br /&gt;
			// Can occur only if we do have a commit button and are not on the upload form&lt;br /&gt;
			this.catLink.title = this.currentKey || '';&lt;br /&gt;
			this.catLink.style.textDecoration = '';&lt;br /&gt;
			this.state = this.originalState;&lt;br /&gt;
			if ( this.state === CategoryEditor.UNCHANGED ) {&lt;br /&gt;
				this.catLink.style.backgroundColor = 'transparent';&lt;br /&gt;
			} else {&lt;br /&gt;
				try {&lt;br /&gt;
					this.catLink.style.backgroundColor = HC.bg_changed;&lt;br /&gt;
				} catch ( ex ) {}&lt;br /&gt;
			}&lt;br /&gt;
			this.normalLinks.style.display = '';&lt;br /&gt;
			this.undelLink.style.display = 'none';&lt;br /&gt;
			checkMultiInput();&lt;br /&gt;
			return evtKill( evt );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// Internal operations&lt;br /&gt;
&lt;br /&gt;
		selectEngine: function ( engineName ) {&lt;br /&gt;
			if ( !this.engineSelector ) return;&lt;br /&gt;
			for ( var i = 0; i &amp;lt; this.engineSelector.options.length; i++ ) this.engineSelector.options[ i ].selected = this.engineSelector.options[ i ].value === engineName;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		sanitizeInput: function () {&lt;br /&gt;
			var v = this.text.value || '';&lt;br /&gt;
&lt;br /&gt;
			// 1. Strip square brackets first (so we can see what's inside)&lt;br /&gt;
			v = v.replace(/^\[\[/, '').replace(/\]\]$/, '');&lt;br /&gt;
&lt;br /&gt;
			// 2. Remove leading/trailing whitespace and underscores&lt;br /&gt;
			v = v.replace( /^(\s|_)+/, '' );&lt;br /&gt;
&lt;br /&gt;
			// 3. Strip the Category namespace (handles localized versions)&lt;br /&gt;
			var re = new RegExp( '^(' + HC.category_regexp + '):', 'i' );&lt;br /&gt;
			if ( re.test( v ) ) {&lt;br /&gt;
				// Find the colon, take everything after it, and trim again&lt;br /&gt;
				v = v.substring( v.indexOf( ':' ) + 1 ).replace( /^(\s|_)+/, '' );&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// 4. Final cleanup (LTR marks and capitalization)&lt;br /&gt;
			v = v.replace(/\u200E$/, '');&lt;br /&gt;
			if ( HC.capitalizePageNames ) v = capitalize( v );&lt;br /&gt;
&lt;br /&gt;
			// Update the input field if needed, manually restoring the cursor afterwards&lt;br /&gt;
			// (but not the whole selection, so that further typing does not overwrite anything)&lt;br /&gt;
			if ( this.text.value !== null &amp;amp;&amp;amp; this.text.value !== v ) {&lt;br /&gt;
				var cursorPos = this.text.selectionStart;&lt;br /&gt;
				this.text.value = v;&lt;br /&gt;
				// Clamp cursor to string length to prevent IE/Edge errors&lt;br /&gt;
				var newPos = Math.min(cursorPos, v.length);&lt;br /&gt;
				this.text.setSelectionRange( newPos, newPos );&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		makeCall: function ( url, callbackObj, engine, queryKey, cleanKey ) {&lt;br /&gt;
			var cb = callbackObj,&lt;br /&gt;
				e = engine,&lt;br /&gt;
				v = queryKey,&lt;br /&gt;
				z = cleanKey,&lt;br /&gt;
				thisObj = this;&lt;br /&gt;
&lt;br /&gt;
			function done() {&lt;br /&gt;
				cb.callsMade++;&lt;br /&gt;
				if ( cb.callsMade === cb.nofCalls ) {&lt;br /&gt;
					if ( cb.exists ) cb.allTitles.exists = true;&lt;br /&gt;
&lt;br /&gt;
					if ( cb.normalized ) cb.allTitles.normalized = cb.normalized;&lt;br /&gt;
&lt;br /&gt;
					if ( !cb.dontCache &amp;amp;&amp;amp; !suggestionConfigs[ cb.engineName ].cache[ z ] ) suggestionConfigs[ cb.engineName ].cache[ z ] = cb.allTitles;&lt;br /&gt;
&lt;br /&gt;
					thisObj.text.readOnly = false;&lt;br /&gt;
					if ( !cb.cancelled ) thisObj.showSuggestions( cb.allTitles, cb.noCompletion, v, cb.engineName );&lt;br /&gt;
&lt;br /&gt;
					if ( cb === thisObj.callbackObj ) thisObj.callbackObj = null;&lt;br /&gt;
&lt;br /&gt;
					cb = undefined;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$.getJSON( url, function ( json ) {&lt;br /&gt;
				var titles = e.handler( json, z );&lt;br /&gt;
				if ( titles &amp;amp;&amp;amp; titles.length ) {&lt;br /&gt;
					if ( cb.allTitles === null ) cb.allTitles = titles; else cb.allTitles = cb.allTitles.concat( titles );&lt;br /&gt;
					if ( titles.exists ) cb.exists = true;&lt;br /&gt;
					if ( titles.normalized ) cb.normalized = titles.normalized;&lt;br /&gt;
				}&lt;br /&gt;
				done();&lt;br /&gt;
			} ).fail( function ( req ) {&lt;br /&gt;
				if ( !req ) noSuggestions = true;&lt;br /&gt;
				cb.dontCache = true;&lt;br /&gt;
				done();&lt;br /&gt;
			} );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		callbackObj: null,&lt;br /&gt;
&lt;br /&gt;
		textchange: function ( dont_autocomplete, force ) {&lt;br /&gt;
			// Hide all other lists&lt;br /&gt;
			makeActive( this );&lt;br /&gt;
			// Get input value, omit sort key, if any&lt;br /&gt;
			this.sanitizeInput();&lt;br /&gt;
			var v = this.text.value;&lt;br /&gt;
			// Disregard anything after a pipe.&lt;br /&gt;
			var pipe = v.indexOf( '|' );&lt;br /&gt;
			if ( pipe &amp;gt;= 0 ) {&lt;br /&gt;
				this.currentKey = v.substring( pipe + 1 );&lt;br /&gt;
				v = v.substring( 0, pipe );&lt;br /&gt;
			} else {&lt;br /&gt;
				this.currentKey = null;&lt;br /&gt;
			}&lt;br /&gt;
			if ( this.lastInput === v &amp;amp;&amp;amp; !force ) return; // No change&lt;br /&gt;
			if ( this.lastInput !== v ) checkMultiInput();&lt;br /&gt;
&lt;br /&gt;
			this.lastInput = v;&lt;br /&gt;
			this.lastRealInput = v;&lt;br /&gt;
&lt;br /&gt;
			// Mark blacklisted inputs.&lt;br /&gt;
			this.ok.disabled = v.length &amp;amp;&amp;amp; HC.blacklist &amp;amp;&amp;amp; HC.blacklist.test( v );&lt;br /&gt;
&lt;br /&gt;
			if ( noSuggestions ) {&lt;br /&gt;
			// No Ajax: just make sure the list is hidden&lt;br /&gt;
				if ( this.list ) this.list.style.display = 'none';&lt;br /&gt;
				if ( this.engineSelector ) this.engineSelector.style.display = 'none';&lt;br /&gt;
				if ( this.icon ) this.icon.style.display = 'none';&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if ( !v.length ) {&lt;br /&gt;
				this.showSuggestions( [] );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			var cleanKey = v.replace( /[\u200E\u200F\u202A-\u202E]/g, '' ).replace( wikiTextBlankRE, ' ' );&lt;br /&gt;
			cleanKey = replaceShortcuts( cleanKey, HC.shortcuts );&lt;br /&gt;
			cleanKey = cleanKey.replace( /^\s+|\s+$/g, '' );&lt;br /&gt;
			if ( !cleanKey.length ) {&lt;br /&gt;
				this.showSuggestions( [] );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if ( this.callbackObj ) this.callbackObj.cancelled = true;&lt;br /&gt;
&lt;br /&gt;
			var engineName = suggestionConfigs[ this.engine ] ? this.engine : 'combined';&lt;br /&gt;
&lt;br /&gt;
			dont_autocomplete = dont_autocomplete || suggestionConfigs[ engineName ].noCompletion;&lt;br /&gt;
			if ( suggestionConfigs[ engineName ].cache[ cleanKey ] ) {&lt;br /&gt;
				this.showSuggestions( suggestionConfigs[ engineName ].cache[ cleanKey ], dont_autocomplete, v, engineName );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var engines = suggestionConfigs[ engineName ].engines;&lt;br /&gt;
			this.callbackObj = {&lt;br /&gt;
				allTitles: null,&lt;br /&gt;
				callsMade: 0,&lt;br /&gt;
				nofCalls: engines.length,&lt;br /&gt;
				noCompletion: dont_autocomplete,&lt;br /&gt;
				engineName: engineName&lt;br /&gt;
			};&lt;br /&gt;
			this.makeCalls( engines, this.callbackObj, v, cleanKey );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		makeCalls: function ( engines, cb, v, cleanKey ) {&lt;br /&gt;
			for ( var j = 0; j &amp;lt; engines.length; j++ ) {&lt;br /&gt;
				var engine = suggestionEngines[ engines[ j ] ];&lt;br /&gt;
				var url = conf.wgScriptPath + engine.uri.replace( /\$1/g, encodeURIComponent( cleanKey ) );&lt;br /&gt;
				this.makeCall( url, cb, engine, v, cleanKey );&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		showSuggestions: function ( titles, dontAutocomplete, queryKey, engineName ) {&lt;br /&gt;
			this.text.readOnly = false;&lt;br /&gt;
			this.dab = null;&lt;br /&gt;
			this.showsList = false;&lt;br /&gt;
			if ( !this.list ) return;&lt;br /&gt;
			if ( noSuggestions ) {&lt;br /&gt;
				if ( this.list ) this.list.style.display = 'none';&lt;br /&gt;
&lt;br /&gt;
				if ( this.engineSelector ) this.engineSelector.style.display = 'none';&lt;br /&gt;
&lt;br /&gt;
				if ( this.icon ) this.icon.style.display = 'none';&lt;br /&gt;
&lt;br /&gt;
				this.inputExists = true; // Default...&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			this.engineName = engineName;&lt;br /&gt;
			if ( engineName ) {&lt;br /&gt;
				if ( !this.engineSelector ) this.engineName = null;&lt;br /&gt;
			} else {&lt;br /&gt;
				if ( this.engineSelector ) this.engineSelector.style.display = 'none';&lt;br /&gt;
			}&lt;br /&gt;
			if ( queryKey ) {&lt;br /&gt;
				if ( this.lastInput.indexOf( queryKey ) ) return;&lt;br /&gt;
				if ( this.lastQuery &amp;amp;&amp;amp; this.lastInput.indexOf( this.lastQuery ) === 0 &amp;amp;&amp;amp; this.lastQuery.length &amp;gt; queryKey.length ) return;&lt;br /&gt;
			}&lt;br /&gt;
			this.lastQuery = queryKey;&lt;br /&gt;
&lt;br /&gt;
			// Get current input text&lt;br /&gt;
			var v = this.text.value.split( '|' );&lt;br /&gt;
			var key = v.length &amp;gt; 1 ? '|' + v[ 1 ] : '';&lt;br /&gt;
			v = ( HC.capitalizePageNames ? capitalize( v[ 0 ] ) : v[ 0 ] );&lt;br /&gt;
			var vNormalized = v;&lt;br /&gt;
			var knownToExist = titles &amp;amp;&amp;amp; titles.exists;&lt;br /&gt;
			var i;&lt;br /&gt;
			if ( titles ) {&lt;br /&gt;
				if ( titles.normalized &amp;amp;&amp;amp; v.indexOf( queryKey ) === 0 ) {&lt;br /&gt;
				// We got back a different normalization than what is in the input field&lt;br /&gt;
					vNormalized = titles.normalized + v.substring( queryKey.length );&lt;br /&gt;
				}&lt;br /&gt;
				var vLow = vNormalized.toLowerCase();&lt;br /&gt;
				// Strip blacklisted categories&lt;br /&gt;
				if ( HC.blacklist ) {&lt;br /&gt;
					for ( i = 0; i &amp;lt; titles.length; i++ ) {&lt;br /&gt;
						if ( HC.blacklist.test( titles[ i ] ) ) {&lt;br /&gt;
							titles.splice( i, 1 );&lt;br /&gt;
							i--;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				titles.sort(&lt;br /&gt;
					function ( a, b ) {&lt;br /&gt;
						if ( a === b ) return 0;&lt;br /&gt;
&lt;br /&gt;
						if ( a.indexOf( b ) === 0 ) return 1;&lt;br /&gt;
						// a begins with b: a &amp;gt; b&lt;br /&gt;
						if ( b.indexOf( a ) === 0 ) return -1;&lt;br /&gt;
						// b begins with a: a &amp;lt; b&lt;br /&gt;
						// Opensearch may return stuff not beginning with the search prefix!&lt;br /&gt;
						var prefixMatchA = ( a.indexOf( vNormalized ) === 0 ? 1 : 0 );&lt;br /&gt;
						var prefixMatchB = ( b.indexOf( vNormalized ) === 0 ? 1 : 0 );&lt;br /&gt;
						if ( prefixMatchA !== prefixMatchB ) return prefixMatchB - prefixMatchA;&lt;br /&gt;
&lt;br /&gt;
						// Case-insensitive prefix match!&lt;br /&gt;
						var aLow = a.toLowerCase(),&lt;br /&gt;
							bLow = b.toLowerCase();&lt;br /&gt;
						prefixMatchA = ( aLow.indexOf( vLow ) === 0 ? 1 : 0 );&lt;br /&gt;
						prefixMatchB = ( bLow.indexOf( vLow ) === 0 ? 1 : 0 );&lt;br /&gt;
						if ( prefixMatchA !== prefixMatchB ) return prefixMatchB - prefixMatchA;&lt;br /&gt;
&lt;br /&gt;
						if ( a &amp;lt; b ) return -1;&lt;br /&gt;
&lt;br /&gt;
						if ( b &amp;lt; a ) return 1;&lt;br /&gt;
&lt;br /&gt;
						return 0;&lt;br /&gt;
					} );&lt;br /&gt;
				// Remove duplicates and self-references&lt;br /&gt;
				for ( i = 0; i &amp;lt; titles.length; i++ ) {&lt;br /&gt;
					if (&lt;br /&gt;
						i + 1 &amp;lt; titles.length &amp;amp;&amp;amp; titles[ i ] === titles[ i + 1 ] ||&lt;br /&gt;
						conf.wgNamespaceNumber === 14 &amp;amp;&amp;amp; titles[ i ] === conf.wgTitle&lt;br /&gt;
					) {&lt;br /&gt;
						titles.splice( i, 1 );&lt;br /&gt;
						i--;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if ( !titles || !titles.length ) {&lt;br /&gt;
				if ( this.list ) this.list.style.display = 'none';&lt;br /&gt;
&lt;br /&gt;
				if ( this.engineSelector ) this.engineSelector.style.display = 'none';&lt;br /&gt;
&lt;br /&gt;
				if ( engineName &amp;amp;&amp;amp; suggestionConfigs[ engineName ] &amp;amp;&amp;amp; !suggestionConfigs[ engineName ].temp ) {&lt;br /&gt;
					if ( this.icon ) this.icon.src = HC.existsNo;&lt;br /&gt;
&lt;br /&gt;
					this.inputExists = false;&lt;br /&gt;
				}&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var firstTitle = titles[ 0 ];&lt;br /&gt;
			var completed = this.autoComplete( firstTitle, v, vNormalized, key, dontAutocomplete );&lt;br /&gt;
			var existing = completed || knownToExist || firstTitle === replaceShortcuts( v, HC.shortcuts );&lt;br /&gt;
			if ( engineName &amp;amp;&amp;amp; suggestionConfigs[ engineName ] &amp;amp;&amp;amp; !suggestionConfigs[ engineName ].temp ) {&lt;br /&gt;
				this.icon.src = ( existing ? HC.existsYes : HC.existsNo );&lt;br /&gt;
				this.inputExists = existing;&lt;br /&gt;
			}&lt;br /&gt;
			if ( completed ) {&lt;br /&gt;
				this.lastInput = firstTitle;&lt;br /&gt;
				if ( titles.length === 1 ) {&lt;br /&gt;
					this.list.style.display = 'none';&lt;br /&gt;
					if ( this.engineSelector ) this.engineSelector.style.display = 'none';&lt;br /&gt;
&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			// (Re-)fill the list&lt;br /&gt;
			while ( this.list.firstChild ) this.list.removeChild( this.list.firstChild );&lt;br /&gt;
&lt;br /&gt;
			for ( i = 0; i &amp;lt; titles.length; i++ ) {&lt;br /&gt;
				var opt = make( 'option' );&lt;br /&gt;
				opt.appendChild( make( titles[ i ], true ) );&lt;br /&gt;
				opt.selected = completed &amp;amp;&amp;amp; ( i === 0 );&lt;br /&gt;
				this.list.appendChild( opt );&lt;br /&gt;
			}&lt;br /&gt;
			this.displayList();&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		displayList: function () {&lt;br /&gt;
			this.showsList = true;&lt;br /&gt;
			if ( !this.is_active ) {&lt;br /&gt;
				this.list.style.display = 'none';&lt;br /&gt;
				if ( this.engineSelector ) this.engineSelector.style.display = 'none';&lt;br /&gt;
&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			var nofItems = ( this.list.options.length &amp;gt; HC.listSize ? HC.listSize : this.list.options.length );&lt;br /&gt;
			if ( nofItems &amp;lt;= 1 ) nofItems = 2;&lt;br /&gt;
&lt;br /&gt;
			this.list.size = nofItems;&lt;br /&gt;
			this.list.style.align = is_rtl ? 'right' : 'left';&lt;br /&gt;
			this.list.style.zIndex = 5;&lt;br /&gt;
			this.list.style.position = 'absolute';&lt;br /&gt;
			// Compute initial list position. First the height.&lt;br /&gt;
			var anchor = is_rtl ? 'right' : 'left';&lt;br /&gt;
			var listh = 0;&lt;br /&gt;
			if ( this.list.style.display === 'none' ) {&lt;br /&gt;
				// Off-screen display to get the height&lt;br /&gt;
				this.list.style.top = this.text.offsetTop + 'px';&lt;br /&gt;
				this.list.style[ anchor ] = '-10000px';&lt;br /&gt;
				this.list.style.display = '';&lt;br /&gt;
				listh = this.list.offsetHeight;&lt;br /&gt;
				this.list.style.display = 'none';&lt;br /&gt;
			} else {&lt;br /&gt;
				listh = this.list.offsetHeight;&lt;br /&gt;
			}&lt;br /&gt;
			// Approximate calculation of maximum list size&lt;br /&gt;
			var maxListHeight = listh;&lt;br /&gt;
			if ( nofItems &amp;lt; HC.listSize ) maxListHeight = ( listh / nofItems ) * HC.listSize;&lt;br /&gt;
&lt;br /&gt;
			function viewport( what ) {&lt;br /&gt;
				if ( is_webkit &amp;amp;&amp;amp; !document.evaluate ) {&lt;br /&gt;
				// Safari &amp;lt; 3.0&lt;br /&gt;
					return window[ 'inner' + what ];&lt;br /&gt;
				}&lt;br /&gt;
				var s = 'client' + what;&lt;br /&gt;
				if ( window.opera ) return document.body[ s ];&lt;br /&gt;
&lt;br /&gt;
				return ( document.documentElement ? document.documentElement[ s ] : 0 ) || document.body[ s ] || 0;&lt;br /&gt;
			}&lt;br /&gt;
			function scroll_offset( what ) {&lt;br /&gt;
				var s = 'scroll' + what;&lt;br /&gt;
				var result = ( document.documentElement ? document.documentElement[ s ] : 0 ) || document.body[ s ] || 0;&lt;br /&gt;
				if ( is_rtl &amp;amp;&amp;amp; what === 'Left' ) {&lt;br /&gt;
					// RTL inconsistencies.&lt;br /&gt;
					// FF: 0 at the far right, then increasingly negative values.&lt;br /&gt;
					// IE &amp;gt;= 8: 0 at the far right, then increasingly positive values.&lt;br /&gt;
					// Webkit: scrollWidth - clientWidth at the far right, then down to zero.&lt;br /&gt;
					// Opera: don't know...&lt;br /&gt;
					if ( result &amp;lt; 0 ) result = -result;&lt;br /&gt;
&lt;br /&gt;
					if ( !is_webkit ) result = scroll_offset( 'Width' ) - viewport( 'Width' ) - result;&lt;br /&gt;
&lt;br /&gt;
					// Now all have webkit behavior, i.e. zero if at the leftmost edge.&lt;br /&gt;
				}&lt;br /&gt;
				return result;&lt;br /&gt;
			}&lt;br /&gt;
			function position( node ) {&lt;br /&gt;
				// Stripped-down simplified position function. It's good enough for our purposes.&lt;br /&gt;
				if ( node.getBoundingClientRect ) {&lt;br /&gt;
					var box = node.getBoundingClientRect();&lt;br /&gt;
					return {&lt;br /&gt;
						x: Math.round( box.left + scroll_offset( 'Left' ) ),&lt;br /&gt;
						y: Math.round( box.top + scroll_offset( 'Top' ) )&lt;br /&gt;
					};&lt;br /&gt;
				}&lt;br /&gt;
				var t = 0,&lt;br /&gt;
					l = 0;&lt;br /&gt;
				do {&lt;br /&gt;
					t += ( node.offsetTop || 0 );&lt;br /&gt;
					l += ( node.offsetLeft || 0 );&lt;br /&gt;
					node = node.offsetParent;&lt;br /&gt;
				} while ( node );&lt;br /&gt;
				return {&lt;br /&gt;
					x: l,&lt;br /&gt;
					y: t&lt;br /&gt;
				};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var textPos = position( this.text ),&lt;br /&gt;
				nl = 0,&lt;br /&gt;
				nt = 0,&lt;br /&gt;
				offset = 0,&lt;br /&gt;
				// Opera 9.5 somehow has offsetWidth = 0 here?? Use the next best value...&lt;br /&gt;
				textBoxWidth = this.text.offsetWidth || this.text.clientWidth;&lt;br /&gt;
			if ( this.engineName ) {&lt;br /&gt;
				this.engineSelector.style.zIndex = 5;&lt;br /&gt;
				this.engineSelector.style.position = 'absolute';&lt;br /&gt;
				this.engineSelector.style.width = textBoxWidth + 'px';&lt;br /&gt;
				// Figure out the height of this selector: display it off-screen, then hide it again.&lt;br /&gt;
				if ( this.engineSelector.style.display === 'none' ) {&lt;br /&gt;
					this.engineSelector.style[ anchor ] = '-10000px';&lt;br /&gt;
					this.engineSelector.style.top = '0';&lt;br /&gt;
					this.engineSelector.style.display = '';&lt;br /&gt;
					offset = this.engineSelector.offsetHeight;&lt;br /&gt;
					this.engineSelector.style.display = 'none';&lt;br /&gt;
				} else {&lt;br /&gt;
					offset = this.engineSelector.offsetHeight;&lt;br /&gt;
				}&lt;br /&gt;
				this.engineSelector.style[ anchor ] = nl + 'px';&lt;br /&gt;
			}&lt;br /&gt;
			if ( textPos.y &amp;lt; maxListHeight + offset + 1 ) {&lt;br /&gt;
			// The list might extend beyond the upper border of the page. Let's avoid that by placing it&lt;br /&gt;
			// below the input text field.&lt;br /&gt;
				nt = this.text.offsetHeight + offset + 1;&lt;br /&gt;
				if ( this.engineName ) this.engineSelector.style.top = this.text.offsetHeight + 'px';&lt;br /&gt;
			} else {&lt;br /&gt;
				nt = -listh - offset - 1;&lt;br /&gt;
				if ( this.engineName ) this.engineSelector.style.top = -( offset + 1 ) + 'px';&lt;br /&gt;
			}&lt;br /&gt;
			this.list.style.top = nt + 'px';&lt;br /&gt;
			this.list.style.width = ''; // No fixed width (yet)&lt;br /&gt;
			this.list.style[ anchor ] = nl + 'px';&lt;br /&gt;
			if ( this.engineName ) {&lt;br /&gt;
				this.selectEngine( this.engineName );&lt;br /&gt;
				this.engineSelector.style.display = '';&lt;br /&gt;
			}&lt;br /&gt;
			this.list.style.display = 'block';&lt;br /&gt;
			// Set the width of the list&lt;br /&gt;
			if ( this.list.offsetWidth &amp;lt; textBoxWidth ) {&lt;br /&gt;
				this.list.style.width = textBoxWidth + 'px';&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			// If the list is wider than the textbox: make sure it fits horizontally into the browser window&lt;br /&gt;
			var scroll = scroll_offset( 'Left' );&lt;br /&gt;
			var view_w = viewport( 'Width' );&lt;br /&gt;
			var w = this.list.offsetWidth;&lt;br /&gt;
			var l_pos = position( this.list );&lt;br /&gt;
			var left = l_pos.x;&lt;br /&gt;
			var right = left + w;&lt;br /&gt;
			if ( left &amp;lt; scroll || right &amp;gt; scroll + view_w ) {&lt;br /&gt;
				if ( w &amp;gt; view_w ) {&lt;br /&gt;
					w = view_w;&lt;br /&gt;
					this.list.style.width = w + 'px';&lt;br /&gt;
					if ( is_rtl ) left = right - w; else right = left + w;&lt;br /&gt;
				}&lt;br /&gt;
				var relative_offset = 0;&lt;br /&gt;
				if ( left &amp;lt; scroll ) relative_offset = scroll - left; else if ( right &amp;gt; scroll + view_w ) relative_offset = -( right - scroll - view_w );&lt;br /&gt;
&lt;br /&gt;
				if ( is_rtl ) relative_offset = -relative_offset;&lt;br /&gt;
&lt;br /&gt;
				if ( relative_offset ) this.list.style[ anchor ] = ( nl + relative_offset ) + 'px';&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		autoComplete: function ( newVal, actVal, normalizedActVal, key, dontModify ) {&lt;br /&gt;
			if ( newVal === actVal ) return true;&lt;br /&gt;
&lt;br /&gt;
			if ( dontModify || this.ime || !this.canSelect() ) return false;&lt;br /&gt;
&lt;br /&gt;
			// If we can't select properly or an IME composition is ongoing, autocompletion would be a major annoyance to the user.&lt;br /&gt;
			if ( newVal.indexOf( actVal ) ) {&lt;br /&gt;
				// Maybe it'll work with the normalized value (NFC)?&lt;br /&gt;
				if ( normalizedActVal &amp;amp;&amp;amp; newVal.indexOf( normalizedActVal ) === 0 ) {&lt;br /&gt;
					if ( this.lastRealInput === actVal ) this.lastRealInput = normalizedActVal;&lt;br /&gt;
&lt;br /&gt;
					actVal = normalizedActVal;&lt;br /&gt;
				} else {&lt;br /&gt;
					return false;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			// Actual input is a prefix of the new text. Fill in new text, selecting the newly added suffix&lt;br /&gt;
			// such that it can be easily removed by typing backspace if the suggestion is unwanted.&lt;br /&gt;
			this.text.focus();&lt;br /&gt;
			this.text.value = newVal + key;&lt;br /&gt;
			this.setSelection( actVal.length, newVal.length );&lt;br /&gt;
			return true;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		canSelect: function () {&lt;br /&gt;
			return this.text.setSelectionRange ||&lt;br /&gt;
			this.text.createTextRange ||&lt;br /&gt;
			this.text.selectionStart !== undefined &amp;amp;&amp;amp;&lt;br /&gt;
			this.text.selectionEnd !== undefined;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		setSelection: function ( from, to ) {&lt;br /&gt;
			// this.text must be focused (at least on IE)&lt;br /&gt;
			if ( !this.text.value ) return;&lt;br /&gt;
			if ( this.text.setSelectionRange ) { // e.g. khtml&lt;br /&gt;
				this.text.setSelectionRange( from, to );&lt;br /&gt;
			} else if ( this.text.selectionStart !== undefined ) {&lt;br /&gt;
				if ( from &amp;gt; this.text.selectionStart ) {&lt;br /&gt;
					this.text.selectionEnd = to;&lt;br /&gt;
					this.text.selectionStart = from;&lt;br /&gt;
				} else {&lt;br /&gt;
					this.text.selectionStart = from;&lt;br /&gt;
					this.text.selectionEnd = to;&lt;br /&gt;
				}&lt;br /&gt;
			} else if ( this.text.createTextRange ) { // IE&lt;br /&gt;
				var new_selection = this.text.createTextRange();&lt;br /&gt;
				new_selection.move( 'character', from );&lt;br /&gt;
				new_selection.moveEnd( 'character', to - from );&lt;br /&gt;
				new_selection.select();&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		getSelection: function () {&lt;br /&gt;
			var from = 0,&lt;br /&gt;
				to = 0;&lt;br /&gt;
			// this.text must be focused (at least on IE)&lt;br /&gt;
			if ( !this.text.value ) {&lt;br /&gt;
				// No text.&lt;br /&gt;
			} else if ( this.text.selectionStart !== undefined ) {&lt;br /&gt;
				from = this.text.selectionStart;&lt;br /&gt;
				to = this.text.selectionEnd;&lt;br /&gt;
			} else if ( document.selection &amp;amp;&amp;amp; document.selection.createRange ) { // IE&lt;br /&gt;
				var rng = document.selection.createRange().duplicate();&lt;br /&gt;
				if ( rng.parentElement() === this.text ) {&lt;br /&gt;
					try {&lt;br /&gt;
						var textRng = this.text.createTextRange();&lt;br /&gt;
						textRng.move( 'character', 0 );&lt;br /&gt;
						textRng.setEndPoint( 'EndToEnd', rng );&lt;br /&gt;
						// We're in a single-line input box: no need to care about IE's strange&lt;br /&gt;
						// handling of line ends&lt;br /&gt;
						to = textRng.text.length;&lt;br /&gt;
						textRng.setEndPoint( 'EndToStart', rng );&lt;br /&gt;
						from = textRng.text.length;&lt;br /&gt;
					} catch ( notFocused ) {&lt;br /&gt;
						from = this.text.value.length;&lt;br /&gt;
						to = from; // At end of text&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			return {&lt;br /&gt;
				start: from,&lt;br /&gt;
				end: to&lt;br /&gt;
			};&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		saveView: function () {&lt;br /&gt;
			this.lastSelection = this.getSelection();&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		processKey: function ( evt ) {&lt;br /&gt;
			var dir = 0;&lt;br /&gt;
			switch ( this.lastKey ) {&lt;br /&gt;
				case UP:&lt;br /&gt;
					dir = -1;&lt;br /&gt;
					break;&lt;br /&gt;
				case DOWN:&lt;br /&gt;
					dir = 1;&lt;br /&gt;
					break;&lt;br /&gt;
				case PGUP:&lt;br /&gt;
					dir = -HC.listSize;&lt;br /&gt;
					break;&lt;br /&gt;
				case PGDOWN:&lt;br /&gt;
					dir = HC.listSize;&lt;br /&gt;
					break;&lt;br /&gt;
				case ESC: // Inhibit default behavior (revert to last real input in FF: we do that ourselves)&lt;br /&gt;
					return evtKill( evt );&lt;br /&gt;
			}&lt;br /&gt;
			if ( dir ) {&lt;br /&gt;
				if ( this.list.style.display !== 'none' ) {&lt;br /&gt;
				// List is visible, so there are suggestions&lt;br /&gt;
					this.highlightSuggestion( dir );&lt;br /&gt;
					// Kill the event, otherwise some browsers (e.g., Firefox) may additionally treat an up-arrow&lt;br /&gt;
					// as &amp;quot;place the text cursor at the front&amp;quot;, which we don't want here.&lt;br /&gt;
					return evtKill( evt );&lt;br /&gt;
				} else if (&lt;br /&gt;
					this.keyCount &amp;lt;= 1 &amp;amp;&amp;amp;&lt;br /&gt;
					( !this.callbackObj || this.callbackObj.callsMade === this.callbackObj.nofCalls )&lt;br /&gt;
				) {&lt;br /&gt;
					// If no suggestions displayed, get them, unless we're already getting them.&lt;br /&gt;
					this.textchange();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			return true;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		highlightSuggestion: function ( dir ) {&lt;br /&gt;
			if ( noSuggestions || !this.list || this.list.style.display === 'none' ) return false;&lt;br /&gt;
&lt;br /&gt;
			var curr = this.list.selectedIndex;&lt;br /&gt;
			var tgt = -1;&lt;br /&gt;
			if ( dir === 0 ) {&lt;br /&gt;
				if ( curr &amp;lt; 0 || curr &amp;gt;= this.list.options.length ) return false;&lt;br /&gt;
&lt;br /&gt;
				tgt = curr;&lt;br /&gt;
			} else {&lt;br /&gt;
				tgt = curr &amp;lt; 0 ? 0 : curr + dir;&lt;br /&gt;
				tgt = tgt &amp;lt; 0 ? 0 : tgt;&lt;br /&gt;
				if ( tgt &amp;gt;= this.list.options.length ) tgt = this.list.options.length - 1;&lt;br /&gt;
			}&lt;br /&gt;
			if ( tgt !== curr || dir === 0 ) {&lt;br /&gt;
				if ( curr &amp;gt;= 0 &amp;amp;&amp;amp; curr &amp;lt; this.list.options.length &amp;amp;&amp;amp; dir !== 0 ) this.list.options[ curr ].selected = false;&lt;br /&gt;
&lt;br /&gt;
				this.list.options[ tgt ].selected = true;&lt;br /&gt;
				// Get current input text&lt;br /&gt;
				var v = this.text.value.split( '|' );&lt;br /&gt;
				var key = v.length &amp;gt; 1 ? '|' + v[ 1 ] : '';&lt;br /&gt;
				var completed = this.autoComplete( this.list.options[ tgt ].text, this.lastRealInput, null, key, false );&lt;br /&gt;
				if ( !completed || this.list.options[ tgt ].text === this.lastRealInput ) {&lt;br /&gt;
					this.text.value = this.list.options[ tgt ].text + key;&lt;br /&gt;
					if ( this.canSelect() ) this.setSelection( this.list.options[ tgt ].text.length, this.list.options[ tgt ].text.length );&lt;br /&gt;
				}&lt;br /&gt;
				this.lastInput = this.list.options[ tgt ].text;&lt;br /&gt;
				this.inputExists = true; // Might be wrong if from a dab list...&lt;br /&gt;
				if ( this.icon ) this.icon.src = HC.existsYes;&lt;br /&gt;
&lt;br /&gt;
				this.state = CategoryEditor.CHANGE_PENDING;&lt;br /&gt;
			}&lt;br /&gt;
			return true;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		resetKeySelection: function () {&lt;br /&gt;
			if ( noSuggestions || !this.list || this.list.style.display === 'none' ) return false;&lt;br /&gt;
&lt;br /&gt;
			var curr = this.list.selectedIndex;&lt;br /&gt;
			if ( curr &amp;gt;= 0 &amp;amp;&amp;amp; curr &amp;lt; this.list.options.length ) {&lt;br /&gt;
				this.list.options[ curr ].selected = false;&lt;br /&gt;
				// Get current input text&lt;br /&gt;
				var v = this.text.value.split( '|' );&lt;br /&gt;
				var key = v.length &amp;gt; 1 ? '|' + v[ 1 ] : '';&lt;br /&gt;
				// ESC is handled strangely by some browsers (e.g., FF); somehow it resets the input value before&lt;br /&gt;
				// our event handlers ever get a chance to run.&lt;br /&gt;
				var result = v[ 0 ] !== this.lastInput;&lt;br /&gt;
				if ( v[ 0 ] !== this.lastRealInput ) {&lt;br /&gt;
					this.text.value = this.lastRealInput + key;&lt;br /&gt;
					result = true;&lt;br /&gt;
				}&lt;br /&gt;
				this.lastInput = this.lastRealInput;&lt;br /&gt;
				return result;&lt;br /&gt;
			}&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
	}; // end CategoryEditor.prototype&lt;br /&gt;
&lt;br /&gt;
	function initialize() {&lt;br /&gt;
		// User configurations: Do this here, called from the onload handler, so that users can&lt;br /&gt;
		// override it easily in their own user script files by just declaring variables. JSconfig&lt;br /&gt;
		// is some feature used at Wikimedia Commons.&lt;br /&gt;
		var config = ( window.JSconfig !== undefined &amp;amp;&amp;amp; JSconfig.keys ) ? JSconfig.keys : {};&lt;br /&gt;
		HC.dont_add_to_watchlist = ( window.hotcat_dont_add_to_watchlist !== undefined ?&lt;br /&gt;
			!!window.hotcat_dont_add_to_watchlist :&lt;br /&gt;
			( config.HotCatDontAddToWatchlist !== undefined ? config.HotCatDontAddToWatchlist :&lt;br /&gt;
				HC.dont_add_to_watchlist ) );&lt;br /&gt;
		HC.no_autocommit = ( window.hotcat_no_autocommit !== undefined ?&lt;br /&gt;
			!!window.hotcat_no_autocommit : ( config.HotCatNoAutoCommit !== undefined ?&lt;br /&gt;
				config.HotCatNoAutoCommit :&lt;br /&gt;
				// On talk namespace default autocommit off&lt;br /&gt;
				( conf.wgNamespaceNumber % 2 ?&lt;br /&gt;
					true : HC.no_autocommit ) ) );&lt;br /&gt;
		HC.del_needs_diff = ( window.hotcat_del_needs_diff !== undefined ?&lt;br /&gt;
			!!window.hotcat_del_needs_diff :&lt;br /&gt;
			( config.HotCatDelNeedsDiff !== undefined ?&lt;br /&gt;
				config.HotCatDelNeedsDiff :&lt;br /&gt;
				HC.del_needs_diff ) );&lt;br /&gt;
		HC.suggest_delay = window.hotcat_suggestion_delay || config.HotCatSuggestionDelay || HC.suggest_delay;&lt;br /&gt;
		HC.editbox_width = window.hotcat_editbox_width || config.HotCatEditBoxWidth || HC.editbox_width;&lt;br /&gt;
		HC.suggestions = window.hotcat_suggestions || config.HotCatSuggestions || HC.suggestions;&lt;br /&gt;
		if ( typeof HC.suggestions !== 'string' || !suggestionConfigs[ HC.suggestions ] ) HC.suggestions = 'combined';&lt;br /&gt;
&lt;br /&gt;
		HC.fixed_search = ( window.hotcat_suggestions_fixed !== undefined ?&lt;br /&gt;
			!!window.hotcat_suggestions_fixed : ( config.HotCatFixedSuggestions !== undefined ?&lt;br /&gt;
				config.HotCatFixedSuggestions : HC.fixed_search ) );&lt;br /&gt;
		HC.single_minor = ( window.hotcat_single_changes_are_minor !== undefined ?&lt;br /&gt;
			!!window.hotcat_single_changes_are_minor :&lt;br /&gt;
			( config.HotCatMinorSingleChanges !== undefined ?&lt;br /&gt;
				config.HotCatMinorSingleChanges :&lt;br /&gt;
				HC.single_minor ) );&lt;br /&gt;
		HC.bg_changed = window.hotcat_changed_background || config.HotCatChangedBackground || HC.bg_changed;&lt;br /&gt;
		HC.use_up_down = ( window.hotcat_use_category_links !== undefined ?&lt;br /&gt;
			!!window.hotcat_use_category_links :&lt;br /&gt;
			( config.HotCatUseCategoryLinks !== undefined ?&lt;br /&gt;
				config.HotCatUseCategoryLinks :&lt;br /&gt;
				HC.use_up_down ) );&lt;br /&gt;
		HC.listSize = window.hotcat_list_size || config.HotCatListSize || HC.listSize;&lt;br /&gt;
		if ( conf.wgDBname !== 'commonswiki' ) HC.changeTag = config.HotCatChangeTag || '';&lt;br /&gt;
&lt;br /&gt;
		// The next whole shebang is needed, because manual tags get not submitted except of save&lt;br /&gt;
		if ( HC.changeTag ) {&lt;br /&gt;
			var eForm = document.editform,&lt;br /&gt;
				catRegExp = new RegExp( '^\\[\\[(' + HC.category_regexp + '):' ),&lt;br /&gt;
				oldTxt;&lt;br /&gt;
			// Returns true if minor change&lt;br /&gt;
			var isMinorChange = function () {&lt;br /&gt;
				var newTxt = eForm.wpTextbox1;&lt;br /&gt;
				if ( !newTxt ) return;&lt;br /&gt;
				newTxt = newTxt.value;&lt;br /&gt;
				var oldLines = oldTxt.match( /^.*$/gm ),&lt;br /&gt;
					newLines = newTxt.match( /^.*$/gm ),&lt;br /&gt;
					cArr; // changes&lt;br /&gt;
				var except = function ( aArr, bArr ) {&lt;br /&gt;
					var result = [],&lt;br /&gt;
						lArr, // larger&lt;br /&gt;
						sArr; // smaller&lt;br /&gt;
					if ( aArr.length &amp;lt; bArr.length ) {&lt;br /&gt;
						lArr = bArr;&lt;br /&gt;
						sArr = aArr;&lt;br /&gt;
					} else {&lt;br /&gt;
						lArr = aArr;&lt;br /&gt;
						sArr = bArr;&lt;br /&gt;
					}&lt;br /&gt;
					for ( var i = 0; i &amp;lt; lArr.length; i++ ) {&lt;br /&gt;
						var item = lArr[ i ];&lt;br /&gt;
						var ind = $.inArray( item, sArr );&lt;br /&gt;
						if ( ind === -1 ) result.push( item );&lt;br /&gt;
						else sArr.splice( ind, 1 ); // don't check this item again&lt;br /&gt;
					}&lt;br /&gt;
					return result.concat( sArr );&lt;br /&gt;
				};&lt;br /&gt;
				cArr = except( oldLines, newLines );&lt;br /&gt;
				if ( cArr.length ) {&lt;br /&gt;
					cArr = $.grep( cArr, function ( c ) {&lt;br /&gt;
						c = $.trim( c );&lt;br /&gt;
						return ( c &amp;amp;&amp;amp; !catRegExp.test( c ) );&lt;br /&gt;
					} );&lt;br /&gt;
				}&lt;br /&gt;
				if ( !cArr.length ) {&lt;br /&gt;
					oldTxt = newTxt;&lt;br /&gt;
					return true;&lt;br /&gt;
				}&lt;br /&gt;
			};&lt;br /&gt;
&lt;br /&gt;
			if ( conf.wgAction === 'submit' &amp;amp;&amp;amp; conf.wgArticleId &amp;amp;&amp;amp; eForm &amp;amp;&amp;amp; eForm.wpSummary &amp;amp;&amp;amp; document.getElementById( 'wikiDiff' ) ) {&lt;br /&gt;
				var sum = eForm.wpSummary,&lt;br /&gt;
					sumA = eForm.wpAutoSummary;&lt;br /&gt;
				if ( sum.value &amp;amp;&amp;amp; sumA.value === HC.changeTag ) { // HotCat diff&lt;br /&gt;
				// MD5 hash of the empty string, as HotCat edit is based on empty sum&lt;br /&gt;
					sumA.value = sumA.value.replace( HC.changeTag, 'd41d8cd98f00b204e9800998ecf8427e' );&lt;br /&gt;
					// Attr creation and event handling is not same in all (old) browsers so use $&lt;br /&gt;
					var $ct = $( '&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;wpChangeTags&amp;quot;&amp;gt;' ).val( HC.changeTag );&lt;br /&gt;
					$( eForm ).append( $ct );&lt;br /&gt;
					oldTxt = eForm.wpTextbox1.value;&lt;br /&gt;
					$( '#wpSave' ).one( 'click', function () {&lt;br /&gt;
						if ( $ct.val() )&lt;br /&gt;
							sum.value = sum.value.replace( ( HC.messages.using || HC.messages.prefix ), '' );&lt;br /&gt;
&lt;br /&gt;
					} );&lt;br /&gt;
					var removeChangeTag = function () {&lt;br /&gt;
						$( eForm.wpTextbox1 ).add( sum ).one( 'input', function () {&lt;br /&gt;
							window.setTimeout( function () {&lt;br /&gt;
								if ( !isMinorChange() ) $ct.val( '' );&lt;br /&gt;
								else removeChangeTag();&lt;br /&gt;
							}, 500 );&lt;br /&gt;
						} );&lt;br /&gt;
					};&lt;br /&gt;
					removeChangeTag();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		// Numeric input, make sure we have a numeric value&lt;br /&gt;
		HC.listSize = parseInt( HC.listSize, 10 );&lt;br /&gt;
		if ( isNaN( HC.listSize ) || HC.listSize &amp;lt; 5 ) HC.listSize = 5;&lt;br /&gt;
&lt;br /&gt;
		HC.listSize = Math.min( HC.listSize, 30 ); // Max size&lt;br /&gt;
&lt;br /&gt;
		// Localize search engine names&lt;br /&gt;
		if ( HC.engine_names ) {&lt;br /&gt;
			for ( var key in HC.engine_names )&lt;br /&gt;
				if ( suggestionConfigs[ key ] &amp;amp;&amp;amp; HC.engine_names[ key ] ) suggestionConfigs[ key ].name = HC.engine_names[ key ];&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
		// Catch both native RTL and &amp;quot;faked&amp;quot; RTL through [[MediaWiki:Rtl.js]]&lt;br /&gt;
		is_rtl = hasClass( document.body, 'rtl' );&lt;br /&gt;
		if ( !is_rtl ) {&lt;br /&gt;
			if ( document.defaultView &amp;amp;&amp;amp; document.defaultView.getComputedStyle ) { // Gecko etc.&lt;br /&gt;
				is_rtl = document.defaultView.getComputedStyle( document.body, null ).getPropertyValue( 'direction' );&lt;br /&gt;
			} else if ( document.body.currentStyle ) { // IE, has subtle differences to getComputedStyle&lt;br /&gt;
				is_rtl = document.body.currentStyle.direction;&lt;br /&gt;
			} else { // Not exactly right, but best effort&lt;br /&gt;
				is_rtl = document.body.style.direction;&lt;br /&gt;
			}&lt;br /&gt;
			is_rtl = ( is_rtl === 'rtl' );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function can_edit() {&lt;br /&gt;
		var container = null;&lt;br /&gt;
		switch ( mw.config.get( 'skin' ) ) {&lt;br /&gt;
			case 'cologneblue':&lt;br /&gt;
				container = document.getElementById( 'quickbar' );&lt;br /&gt;
			/* fall through */&lt;br /&gt;
			case 'standard':&lt;br /&gt;
			case 'nostalgia':&lt;br /&gt;
				if ( !container ) container = document.getElementById( 'topbar' );&lt;br /&gt;
				var lks = container.getElementsByTagName( 'a' );&lt;br /&gt;
				for ( var i = 0; i &amp;lt; lks.length; i++ ) {&lt;br /&gt;
					if (&lt;br /&gt;
						param( 'title', lks[ i ].href ) === conf.wgPageName &amp;amp;&amp;amp;&lt;br /&gt;
						param( 'action', lks[ i ].href ) === 'edit'&lt;br /&gt;
					) {&lt;br /&gt;
						return true;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				return false;&lt;br /&gt;
			default:&lt;br /&gt;
				// all modern skins:&lt;br /&gt;
				return document.getElementById( 'ca-edit' ) !== null;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Legacy stuff&lt;br /&gt;
	function closeForm() {&lt;br /&gt;
		// Close all open editors without redirect resolution and other asynchronous stuff.&lt;br /&gt;
		for ( var i = 0; i &amp;lt; editors.length; i++ ) {&lt;br /&gt;
			var edit = editors[ i ];&lt;br /&gt;
			if ( edit.state === CategoryEditor.OPEN ) {&lt;br /&gt;
				edit.cancel();&lt;br /&gt;
			} else if ( edit.state === CategoryEditor.CHANGE_PENDING ) {&lt;br /&gt;
				edit.sanitizeInput();&lt;br /&gt;
				var value = edit.text.value.split( '|' );&lt;br /&gt;
				var key = null;&lt;br /&gt;
				if ( value.length &amp;gt; 1 ) key = value[ 1 ];&lt;br /&gt;
				var v = value[ 0 ].replace( /_/g, ' ' ).replace( /^\s+|\s+$/g, '' );&lt;br /&gt;
				if ( !v.length ) {&lt;br /&gt;
					edit.cancel();&lt;br /&gt;
				} else {&lt;br /&gt;
					edit.currentCategory = v;&lt;br /&gt;
					edit.currentKey = key;&lt;br /&gt;
					edit.currentExists = this.inputExists;&lt;br /&gt;
					edit.close();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function setup_upload() {&lt;br /&gt;
		onUpload = true;&lt;br /&gt;
		// Add an empty category bar at the end of the table containing the description, and change the onsubmit handler.&lt;br /&gt;
		var ip = document.getElementById( 'mw-htmlform-description' ) || document.getElementById( 'wpDestFile' );&lt;br /&gt;
		if ( !ip ) {&lt;br /&gt;
			ip = document.getElementById( 'wpDestFile' );&lt;br /&gt;
			while ( ip &amp;amp;&amp;amp; ip.nodeName.toLowerCase() !== 'table' ) ip = ip.parentNode;&lt;br /&gt;
		}&lt;br /&gt;
		if ( !ip ) return;&lt;br /&gt;
		var reupload = document.getElementById( 'wpForReUpload' );&lt;br /&gt;
		var destFile = document.getElementById( 'wpDestFile' );&lt;br /&gt;
		if (&lt;br /&gt;
			( reupload &amp;amp;&amp;amp; !!reupload.value ) ||&lt;br /&gt;
			( destFile &amp;amp;&amp;amp; ( destFile.disabled || destFile.readOnly ) )&lt;br /&gt;
		) {&lt;br /&gt;
			return; // re-upload form...&lt;br /&gt;
		}&lt;br /&gt;
		// Insert a table row with two fields (label and empty category bar)&lt;br /&gt;
		var labelCell = make( 'td' );&lt;br /&gt;
		var lineCell = make( 'td' );&lt;br /&gt;
		// Create the category line&lt;br /&gt;
		catLine = make( 'div' );&lt;br /&gt;
		catLine.className = 'catlinks';&lt;br /&gt;
		catLine.id = 'catlinks';&lt;br /&gt;
		catLine.style.textAlign = is_rtl ? 'right' : 'left';&lt;br /&gt;
		// We'll be inside a table row. Make sure that we don't have margins or strange borders.&lt;br /&gt;
		catLine.style.margin = '0';&lt;br /&gt;
		catLine.style.border = 'none';&lt;br /&gt;
		lineCell.appendChild( catLine );&lt;br /&gt;
		// Create the label&lt;br /&gt;
		var label = null;&lt;br /&gt;
		if ( window.UFUI &amp;amp;&amp;amp; window.UIElements &amp;amp;&amp;amp; UFUI.getLabel instanceof Function ) {&lt;br /&gt;
			try {&lt;br /&gt;
				label = UFUI.getLabel( 'wpCategoriesUploadLbl' );&lt;br /&gt;
			} catch ( ex ) {&lt;br /&gt;
				label = null;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ( !label ) {&lt;br /&gt;
			labelCell.id = 'hotcatLabel';&lt;br /&gt;
			labelCell.appendChild( make( HC.categories, true ) );&lt;br /&gt;
		} else {&lt;br /&gt;
			labelCell.id = 'hotcatLabelTranslated';&lt;br /&gt;
			labelCell.appendChild( label );&lt;br /&gt;
		}&lt;br /&gt;
		labelCell.className = 'mw-label';&lt;br /&gt;
		labelCell.style.textAlign = 'right';&lt;br /&gt;
		labelCell.style.verticalAlign = 'middle';&lt;br /&gt;
		// Change the onsubmit handler&lt;br /&gt;
		var form = document.getElementById( 'upload' ) || document.getElementById( 'mw-upload-form' );&lt;br /&gt;
		if ( form &amp;amp;&amp;amp; ip &amp;amp;&amp;amp; ip.insertRow ) {&lt;br /&gt;
			var newRow = ip.insertRow( -1 );&lt;br /&gt;
			newRow.appendChild( labelCell );&lt;br /&gt;
			newRow.appendChild( lineCell );&lt;br /&gt;
			form.onsubmit = ( function ( oldSubmit ) {&lt;br /&gt;
				return function () {&lt;br /&gt;
					var do_submit = true;&lt;br /&gt;
					if ( oldSubmit ) {&lt;br /&gt;
						if ( typeof oldSubmit === 'string' ) {&lt;br /&gt;
						// eslint-disable-next-line no-eval&lt;br /&gt;
							do_submit = eval( oldSubmit );&lt;br /&gt;
						} else if ( oldSubmit instanceof Function ) {&lt;br /&gt;
							do_submit = oldSubmit.apply( form, arguments );&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					if ( !do_submit ) return false;&lt;br /&gt;
					closeForm();&lt;br /&gt;
					// Copy the categories&lt;br /&gt;
					var eb = document.getElementById( 'wpUploadDescription' ) || document.getElementById( 'wpDesc' );&lt;br /&gt;
					var addedOne = false;&lt;br /&gt;
					for ( var i = 0; i &amp;lt; editors.length; i++ ) {&lt;br /&gt;
						var t = editors[ i ].currentCategory;&lt;br /&gt;
						if ( !t ) continue;&lt;br /&gt;
						var key = editors[ i ].currentKey;&lt;br /&gt;
						var new_cat = '[[' + HC.category_canonical + ':' + t + ( key ? '|' + key : '' ) + ']]';&lt;br /&gt;
						// Only add if not already present&lt;br /&gt;
						var cleanedText = eb.value&lt;br /&gt;
							.replace( /&amp;lt;!--(\s|\S)*?--&amp;gt;/g, '' )&lt;br /&gt;
							.replace( /&amp;lt;nowiki&amp;gt;(\s|\S)*?&amp;lt;\/nowiki&amp;gt;/g, '' );&lt;br /&gt;
						if ( !find_category( cleanedText, t, true ) ) {&lt;br /&gt;
							eb.value += '\n' + new_cat;&lt;br /&gt;
							addedOne = true;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					if ( addedOne ) {&lt;br /&gt;
					// Remove &amp;quot;subst:unc&amp;quot; added by Flinfo if it didn't find categories&lt;br /&gt;
						eb.value = eb.value.replace( /\{\{subst:unc\}\}/g, '' );&lt;br /&gt;
					}&lt;br /&gt;
					return true;&lt;br /&gt;
				};&lt;br /&gt;
			}( form.onsubmit ) );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var cleanedText = null;&lt;br /&gt;
&lt;br /&gt;
	function isOnPage( span ) {&lt;br /&gt;
		if ( span.firstChild.nodeType !== Node.ELEMENT_NODE ) return null;&lt;br /&gt;
&lt;br /&gt;
		var catTitle = title( span.firstChild.href );&lt;br /&gt;
		if ( !catTitle ) return null;&lt;br /&gt;
&lt;br /&gt;
		catTitle = catTitle.substr( catTitle.indexOf( ':' ) + 1 ).replace( /_/g, ' ' );&lt;br /&gt;
		if ( HC.blacklist &amp;amp;&amp;amp; HC.blacklist.test( catTitle ) ) return null;&lt;br /&gt;
&lt;br /&gt;
		var result = {&lt;br /&gt;
			title: catTitle,&lt;br /&gt;
			match: [ '', '', '' ]&lt;br /&gt;
		};&lt;br /&gt;
		if ( pageText === null ) return result;&lt;br /&gt;
&lt;br /&gt;
		if ( cleanedText === null ) {&lt;br /&gt;
			cleanedText = pageText&lt;br /&gt;
				.replace( /&amp;lt;!--(\s|\S)*?--&amp;gt;/g, '' )&lt;br /&gt;
				.replace( /&amp;lt;nowiki&amp;gt;(\s|\S)*?&amp;lt;\/nowiki&amp;gt;/g, '' );&lt;br /&gt;
		}&lt;br /&gt;
		result.match = find_category( cleanedText, catTitle, true );&lt;br /&gt;
		return result;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var initialized = false;&lt;br /&gt;
	var setupTimeout = null;&lt;br /&gt;
&lt;br /&gt;
	function findByClass( scope, tag, className ) {&lt;br /&gt;
		var result = $( scope ).find( tag + '.' + className );&lt;br /&gt;
		return ( result &amp;amp;&amp;amp; result.length ) ? result[ 0 ] : null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function errorAMC() {&lt;br /&gt;
		alert( 'An error occurred. Unable to setup HotCat' );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function enableAMC() {&lt;br /&gt;
		var api = new mw.Api();&lt;br /&gt;
		return api.saveOption( 'mf_amc_optin', '1' ).then( function ( r ) {&lt;br /&gt;
			if ( !r || r.options !== 'success' ) {&lt;br /&gt;
				errorAMC();&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			if ( window.confirm( 'Please reload your page to use hotcat.' ) ) {&lt;br /&gt;
				location.reload();&lt;br /&gt;
			}&lt;br /&gt;
		}, function () {&lt;br /&gt;
			errorAMC();&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function showWarning( text ) {&lt;br /&gt;
		var warning = document.createElement( 'div' );&lt;br /&gt;
		warning.setAttribute( 'style', 'padding: 20px; background: orange; color: #333; font-weight: bold; margin-top: 20px;' );&lt;br /&gt;
		warning.textContent = text;&lt;br /&gt;
		var btn = document.createElement( 'button' );&lt;br /&gt;
		btn.classList.add( 'mw-ui-button', 'cdx-button' );&lt;br /&gt;
		btn.style.display = 'block';&lt;br /&gt;
		btn.textContent = 'Enable HotCat and AMC mode on this page';&lt;br /&gt;
		btn.addEventListener( 'click', function () {&lt;br /&gt;
			enableAMC();&lt;br /&gt;
		} );&lt;br /&gt;
		warning.appendChild( btn );&lt;br /&gt;
		document.getElementById( 'mw-content-text' ).appendChild( warning );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function setup( additionalWork ) {&lt;br /&gt;
		if ( initialized ) return;&lt;br /&gt;
		initialized = true;&lt;br /&gt;
		if ( setupTimeout ) {&lt;br /&gt;
			window.clearTimeout( setupTimeout );&lt;br /&gt;
			setupTimeout = null;&lt;br /&gt;
		}&lt;br /&gt;
		// Find the category bar, or create an empty one if there isn't one. Then add -/+- links after&lt;br /&gt;
		// each category, and add the + link.&lt;br /&gt;
		catLine =&lt;br /&gt;
			// Special:Upload&lt;br /&gt;
			catLine ||&lt;br /&gt;
			document.getElementById( 'mw-normal-catlinks' );&lt;br /&gt;
		var hiddenCats = document.getElementById( 'mw-hidden-catlinks' );&lt;br /&gt;
		if ( !catLine ) {&lt;br /&gt;
&lt;br /&gt;
			// Workaround for T24660&lt;br /&gt;
			if ( mw.config.get('skin') === 'minerva' ) {&lt;br /&gt;
				if ( document.body.classList.contains('mw-mf-amc-disabled') ) {&lt;br /&gt;
					showWarning( 'HotCat requires AMC mode.' );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			var footer = null;&lt;br /&gt;
			if ( !hiddenCats ) {&lt;br /&gt;
				footer = findByClass( document, 'div', 'printfooter' );&lt;br /&gt;
				if ( !footer ) return; // Don't know where to insert the category line&lt;br /&gt;
			}&lt;br /&gt;
			catLine = make( 'div' );&lt;br /&gt;
			catLine.id = 'mw-normal-catlinks';&lt;br /&gt;
			catLine.style.textAlign = is_rtl ? 'right' : 'left';&lt;br /&gt;
			// Add a label&lt;br /&gt;
			var label = make( 'a' );&lt;br /&gt;
			label.href = conf.wgArticlePath.replace( '$1', 'Special:Categories' );&lt;br /&gt;
			label.title = HC.categories;&lt;br /&gt;
			label.appendChild( make( HC.categories, true ) );&lt;br /&gt;
			catLine.appendChild( label );&lt;br /&gt;
			catLine.appendChild( make( ':', true ) );&lt;br /&gt;
			// Insert the new category line&lt;br /&gt;
			var container = ( hiddenCats ? hiddenCats.parentNode : document.getElementById( 'catlinks' ) );&lt;br /&gt;
			if ( !container ) {&lt;br /&gt;
				container = make( 'div' );&lt;br /&gt;
				container.id = 'catlinks';&lt;br /&gt;
				footer.parentNode.insertBefore( container, footer.nextSibling );&lt;br /&gt;
			}&lt;br /&gt;
			container.className = 'catlinks noprint';&lt;br /&gt;
			container.style.display = '';&lt;br /&gt;
			if ( !hiddenCats ) container.appendChild( catLine ); else container.insertBefore( catLine, hiddenCats );&lt;br /&gt;
		} // end if catLine exists&lt;br /&gt;
		if ( is_rtl ) catLine.dir = 'rtl';&lt;br /&gt;
&lt;br /&gt;
		// Create editors for all existing categories&lt;br /&gt;
&lt;br /&gt;
		function createEditors( line, is_hidden ) {&lt;br /&gt;
			var i;&lt;br /&gt;
			var cats = line.getElementsByTagName( 'li' );&lt;br /&gt;
			if ( cats.length ) {&lt;br /&gt;
				newDOM = true;&lt;br /&gt;
				line = cats[ 0 ].parentNode;&lt;br /&gt;
			} else {&lt;br /&gt;
				cats = line.getElementsByTagName( 'span' );&lt;br /&gt;
			}&lt;br /&gt;
			// Copy cats, otherwise it'll also magically contain our added spans as it is a live collection!&lt;br /&gt;
			var copyCats = new Array( cats.length );&lt;br /&gt;
			for ( i = 0; i &amp;lt; cats.length; i++ ) copyCats[ i ] = cats[ i ];&lt;br /&gt;
			for ( i = 0; i &amp;lt; copyCats.length; i++ ) {&lt;br /&gt;
				var test = isOnPage( copyCats[ i ] );&lt;br /&gt;
				if ( test !== null &amp;amp;&amp;amp; test.match !== null &amp;amp;&amp;amp; line ) {&lt;br /&gt;
				// eslint-disable-next-line no-new&lt;br /&gt;
					new CategoryEditor( line, copyCats[ i ], test.title, test.match[ 2 ], is_hidden );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			return copyCats.length ? copyCats[ copyCats.length - 1 ] : null;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var lastSpan = createEditors( catLine, false );&lt;br /&gt;
		// Create one to add a new category&lt;br /&gt;
		// eslint-disable-next-line no-new&lt;br /&gt;
		new CategoryEditor( newDOM ? catLine.getElementsByTagName( 'ul' )[ 0 ] : catLine, null, null, lastSpan !== null, false );&lt;br /&gt;
		if ( !onUpload ) {&lt;br /&gt;
			if ( pageText !== null &amp;amp;&amp;amp; hiddenCats ) {&lt;br /&gt;
				if ( is_rtl ) hiddenCats.dir = 'rtl';&lt;br /&gt;
				createEditors( hiddenCats, true );&lt;br /&gt;
			}&lt;br /&gt;
			// And finally add the &amp;quot;multi-mode&amp;quot; span. (Do this at the end, otherwise it ends up in the list above.)&lt;br /&gt;
			var enableMulti = make( 'span' );&lt;br /&gt;
			enableMulti.className = 'noprint';&lt;br /&gt;
			if ( is_rtl ) enableMulti.dir = 'rtl';&lt;br /&gt;
			catLine.insertBefore( enableMulti, catLine.firstChild.nextSibling );&lt;br /&gt;
			enableMulti.appendChild( make( '\xa0', true ) ); // nbsp&lt;br /&gt;
			multiSpan = make( 'span' );&lt;br /&gt;
			enableMulti.appendChild( multiSpan );&lt;br /&gt;
			multiSpan.innerHTML = '(&amp;lt;a&amp;gt;' + HC.addmulti + '&amp;lt;/a&amp;gt;)';&lt;br /&gt;
			var lk = multiSpan.getElementsByTagName( 'a' )[ 0 ];&lt;br /&gt;
			lk.onclick = function ( evt ) {&lt;br /&gt;
				setMultiInput();&lt;br /&gt;
				checkMultiInput();&lt;br /&gt;
				return evtKill( evt );&lt;br /&gt;
			};&lt;br /&gt;
			lk.title = HC.multi_tooltip;&lt;br /&gt;
			lk.style.cursor = 'pointer';&lt;br /&gt;
		}&lt;br /&gt;
		cleanedText = null;&lt;br /&gt;
		if ( additionalWork instanceof Function ) additionalWork();&lt;br /&gt;
		mw.hook( 'hotcat.ready' ).fire(); // Execute registered callback functions&lt;br /&gt;
		$( 'body' ).trigger( 'hotcatSetupCompleted' );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function createCommitForm() {&lt;br /&gt;
		if ( commitForm ) return;&lt;br /&gt;
		&lt;br /&gt;
		var format = '';&lt;br /&gt;
		if ( HC.jsonContentModels.includes( conf.wgPageContentModel ) ) {&lt;br /&gt;
			// Handle Data namespace JSON content&lt;br /&gt;
			format = 'application/json';&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// For backwards-compatibility the default handler is wikitext&lt;br /&gt;
			format = 'text/x-wiki';&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var formContainer = make( 'div' );&lt;br /&gt;
		formContainer.style.display = 'none';&lt;br /&gt;
		document.body.appendChild( formContainer );&lt;br /&gt;
		formContainer.innerHTML =&lt;br /&gt;
			'&amp;lt;form id=&amp;quot;hotcatCommitForm&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot; action=&amp;quot;' +&lt;br /&gt;
			conf.wgScript + '?title=' + encodeURIComponent( conf.wgPageName ) + '&amp;amp;action=submit&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;wpTextbox1&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;model&amp;quot; value=&amp;quot;' + conf.wgPageContentModel + '&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;format&amp;quot; value=&amp;quot;' + format + '&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;wpSummary&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;wpMinoredit&amp;quot; value=&amp;quot;1&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;wpWatchthis&amp;quot; value=&amp;quot;1&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;wpWatchlistExpiry&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;wpAutoSummary&amp;quot; value=&amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;wpEdittime&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;wpStarttime&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;wpDiff&amp;quot; value=&amp;quot;wpDiff&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;oldid&amp;quot; value=&amp;quot;0&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;wpIgnoreBlankSummary&amp;quot; value=&amp;quot;1&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;hcCommit&amp;quot; value=&amp;quot;hcCommit&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;wpEditToken&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;wpUltimateParam&amp;quot; value=&amp;quot;1&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;wpChangeTags&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;input type=&amp;quot;hidden&amp;quot; value=&amp;quot;ℳ𝒲♥𝓊𝓃𝒾𝒸ℴ𝒹ℯ&amp;quot; name=&amp;quot;wpUnicodeCheck&amp;quot;&amp;gt;' +&lt;br /&gt;
			'&amp;lt;/form&amp;gt;';&lt;br /&gt;
		commitForm = document.getElementById( 'hotcatCommitForm' );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getPage() {&lt;br /&gt;
		// We know we have an article here.&lt;br /&gt;
		if ( !conf.wgArticleId ) {&lt;br /&gt;
			// Doesn't exist yet. Disable on non-existing User pages -- might be a global user page.&lt;br /&gt;
			if ( conf.wgNamespaceNumber === 2 ) return;&lt;br /&gt;
			pageText = '';&lt;br /&gt;
			pageTime = null;&lt;br /&gt;
			setup( createCommitForm );&lt;br /&gt;
		} else {&lt;br /&gt;
			var url = conf.wgScriptPath + '/api.php?format=json&amp;amp;callback=HotCat.start&amp;amp;action=query&amp;amp;rawcontinue=&amp;amp;titles=' +&lt;br /&gt;
			encodeURIComponent( conf.wgPageName ) +&lt;br /&gt;
			'&amp;amp;prop=info%7Crevisions&amp;amp;rvprop=content%7Ctimestamp%7Cids&amp;amp;meta=siteinfo&amp;amp;rvslots=main&amp;amp;rvlimit=1&amp;amp;rvstartid=' +&lt;br /&gt;
			conf.wgCurRevisionId;&lt;br /&gt;
			var s = make( 'script' );&lt;br /&gt;
			s.src = url;&lt;br /&gt;
			HC.start = function ( json ) {&lt;br /&gt;
				setPage( json );&lt;br /&gt;
				setup( createCommitForm );&lt;br /&gt;
			};&lt;br /&gt;
			document.getElementsByTagName( 'head' )[ 0 ].appendChild( s );&lt;br /&gt;
			setupTimeout = window.setTimeout( function () {&lt;br /&gt;
				setup( createCommitForm );&lt;br /&gt;
			}, 4000 ); // 4 sec, just in case getting the wikitext takes longer.&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function setState( state ) {&lt;br /&gt;
		var cats = state.split( '\n' );&lt;br /&gt;
		if ( !cats.length ) return null;&lt;br /&gt;
&lt;br /&gt;
		if ( initialized &amp;amp;&amp;amp; editors.length === 1 &amp;amp;&amp;amp; editors[ 0 ].isAddCategory ) {&lt;br /&gt;
			// Insert new spans and create new editors for them.&lt;br /&gt;
			var newSpans = [];&lt;br /&gt;
			var before = editors.length === 1 ? editors[ 0 ].span : null;&lt;br /&gt;
			var i;&lt;br /&gt;
			for ( i = 0; i &amp;lt; cats.length; i++ ) {&lt;br /&gt;
				if ( !cats[ i ].length ) continue;&lt;br /&gt;
				var cat = cats[ i ].split( '|' );&lt;br /&gt;
				var key = cat.length &amp;gt; 1 ? cat[ 1 ] : null;&lt;br /&gt;
				cat = cat[ 0 ];&lt;br /&gt;
				var lk = make( 'a' );&lt;br /&gt;
				lk.href = wikiPagePath( HC.category_canonical + ':' + cat );&lt;br /&gt;
				lk.appendChild( make( cat, true ) );&lt;br /&gt;
				lk.title = cat;&lt;br /&gt;
				var span = make( 'span' );&lt;br /&gt;
				span.appendChild( lk );&lt;br /&gt;
				if ( !i ) catLine.insertBefore( make( ' ', true ), before );&lt;br /&gt;
&lt;br /&gt;
				catLine.insertBefore( span, before );&lt;br /&gt;
				if ( before &amp;amp;&amp;amp; i + 1 &amp;lt; cats.length ) parent.insertBefore( make( ' | ', true ), before );&lt;br /&gt;
&lt;br /&gt;
				newSpans.push( {&lt;br /&gt;
					element: span,&lt;br /&gt;
					title: cat,&lt;br /&gt;
					key: key&lt;br /&gt;
				} );&lt;br /&gt;
			}&lt;br /&gt;
			// And change the last one...&lt;br /&gt;
			if ( before ) before.parentNode.insertBefore( make( ' | ', true ), before );&lt;br /&gt;
&lt;br /&gt;
			for ( i = 0; i &amp;lt; newSpans.length; i++ ) {&lt;br /&gt;
			// eslint-disable-next-line no-new&lt;br /&gt;
				new CategoryEditor( catLine, newSpans[ i ].element, newSpans[ i ].title, newSpans[ i ].key );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getState() {&lt;br /&gt;
		if ( HC.jsonContentModels.includes( conf.wgPageContentModel ) ) {&lt;br /&gt;
			// Handle Data namespace JSON content&lt;br /&gt;
			return getStateJson();&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// For backwards-compatibility the default handler is wikitext&lt;br /&gt;
			return getStateWikitext();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getStateJson() {&lt;br /&gt;
		// Handle Data namespace JSON content&lt;br /&gt;
		try {&lt;br /&gt;
			var jsonData = JSON.parse( pageText );&lt;br /&gt;
			if ( jsonData.mediawikiCategories ) {&lt;br /&gt;
				return jsonData.mediawikiCategories.map( function( cat ) {&lt;br /&gt;
					return cat.name + ( cat.sort ? '|' + cat.sort : '' );&lt;br /&gt;
				} ).join( '\n' );&lt;br /&gt;
			}&lt;br /&gt;
		} catch ( e ) {&lt;br /&gt;
			console.error( '[getStateJson]Error parsing JSON:', e );&lt;br /&gt;
		}&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
	    &lt;br /&gt;
	function getStateWikitext() {&lt;br /&gt;
		var result = null;&lt;br /&gt;
		for ( var i = 0; i &amp;lt; editors.length; i++ ) {&lt;br /&gt;
			var text = editors[ i ].currentCategory;&lt;br /&gt;
			var key = editors[ i ].currentKey;&lt;br /&gt;
			if ( text &amp;amp;&amp;amp; text.length ) {&lt;br /&gt;
				if ( key !== null ) text += '|' + key;&lt;br /&gt;
				if ( result === null ) result = text; else result += '\n' + text;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return result;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function really_run() {&lt;br /&gt;
		initialize();&lt;br /&gt;
&lt;br /&gt;
		if ( !HC.upload_disabled &amp;amp;&amp;amp; conf.wgNamespaceNumber === -1 &amp;amp;&amp;amp; conf.wgCanonicalSpecialPageName === 'Upload' &amp;amp;&amp;amp; conf.wgUserName ) {&lt;br /&gt;
			setup_upload();&lt;br /&gt;
			setup( function () {&lt;br /&gt;
				// Check for state restoration once the setup is done otherwise, but before signalling setup completion&lt;br /&gt;
				if ( window.UploadForm &amp;amp;&amp;amp; UploadForm.previous_hotcat_state ) UploadForm.previous_hotcat_state = setState( UploadForm.previous_hotcat_state );&lt;br /&gt;
			} );&lt;br /&gt;
		} else {&lt;br /&gt;
			if ( !conf.wgIsArticle || conf.wgAction !== 'view' || param( 'diff' ) !== null || param( 'oldid' ) !== null || !can_edit() || HC.disable() ) return;&lt;br /&gt;
			if (!HC.isSupportedContentModel()) {&lt;br /&gt;
				console.info(&amp;quot;Unknown contentModel: &amp;quot; + conf.wgPageContentModel + &amp;quot; in &amp;quot; + conf.wgPageName +&amp;quot;. If you see this please report it to https://commons.wikimedia.org/wiki/MediaWiki_talk:Gadget-Cat-a-lot.js&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			getPage();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function run() {&lt;br /&gt;
		if ( HC.started ) return;&lt;br /&gt;
		HC.started = true;&lt;br /&gt;
		loadTrigger.register( really_run );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Export legacy functions&lt;br /&gt;
	window.hotcat_get_state = function () {&lt;br /&gt;
		return getState();&lt;br /&gt;
	};&lt;br /&gt;
	window.hotcat_set_state = function ( state ) {&lt;br /&gt;
		return setState( state );&lt;br /&gt;
	};&lt;br /&gt;
	window.hotcat_close_form = function () {&lt;br /&gt;
		closeForm();&lt;br /&gt;
	};&lt;br /&gt;
	HC.runWhenReady = function ( callback ) {&lt;br /&gt;
		// run user-registered code once HotCat is fully set up and ready.&lt;br /&gt;
		mw.hook( 'hotcat.ready' ).add( callback );&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	// Make sure we don't get conflicts with AjaxCategories (core development that should one day&lt;br /&gt;
	// replace HotCat).&lt;br /&gt;
	mw.config.set( 'disableAJAXCategories', true );&lt;br /&gt;
&lt;br /&gt;
	// Run as soon as possible. This varies depending on MediaWiki version;&lt;br /&gt;
	// window's 'load' event is always safe, but usually we can do better than that.&lt;br /&gt;
&lt;br /&gt;
	if ( conf.wgCanonicalSpecialPageName !== 'Upload' ) {&lt;br /&gt;
		// Reload HotCat after (VE) edits (bug T103285)&lt;br /&gt;
		mw.hook( 'postEdit' ).add( function () {&lt;br /&gt;
			// Reset HotCat in case this is a soft reload (e.g. VisualEditor edit), unless the categories&lt;br /&gt;
			// were not re-rendered and our interface is still there (e.g. DiscussionTools edit)&lt;br /&gt;
			if ( document.querySelector( '#catlinks .hotcatlink' ) ) {&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			catLine = null;&lt;br /&gt;
			editors = [];&lt;br /&gt;
			initialized = false;&lt;br /&gt;
			HC.started = false;&lt;br /&gt;
			run();&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// We can safely trigger just after user configuration is loaded.&lt;br /&gt;
	// Use always() instead of then() to also start HotCat if the user module has problems.&lt;br /&gt;
	$.when( mw.loader.using( 'user' ), $.ready ).always( run );&lt;br /&gt;
}( jQuery, mediaWiki ) );&lt;br /&gt;
// &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=20170201_Board_meeting&amp;diff=19949</id>
		<title>20170201 Board meeting</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=20170201_Board_meeting&amp;diff=19949"/>
		<updated>2026-11-04T10:35:53Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Agenda of the Board Meeting'''&lt;br /&gt;
&lt;br /&gt;
Date: Wednesday, February 1st 2017, 19.30-20.30pm&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Place: UniverCité, 3rd floor meeting room&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=Composition=&lt;br /&gt;
&lt;br /&gt;
==Chair==&lt;br /&gt;
*Luc&lt;br /&gt;
&lt;br /&gt;
==Present==&lt;br /&gt;
*Yann&lt;br /&gt;
*Sam&lt;br /&gt;
*Gianpaolo&lt;br /&gt;
*Ana&lt;br /&gt;
*Anne-Laure&lt;br /&gt;
*Vanessa&lt;br /&gt;
&lt;br /&gt;
==Excused==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Items=&lt;br /&gt;
&lt;br /&gt;
==Welcome address==&lt;br /&gt;
(Luc, 1 min)&lt;br /&gt;
&lt;br /&gt;
==Point 0: public minutes==&lt;br /&gt;
(Luc, 1 min)&lt;br /&gt;
&lt;br /&gt;
Get ok from all board members to upload minutes on wiki (or else discuss alternative below)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Objections?&lt;br /&gt;
&lt;br /&gt;
==Point 1: Moving==&lt;br /&gt;
(Luc, 1 min)&lt;br /&gt;
&lt;br /&gt;
Thank you all for your help! I think we were very efficient and achieved a great deal!&lt;br /&gt;
&lt;br /&gt;
Any question regarding the storage or the temporary space? Any comment/suggestion?&lt;br /&gt;
&lt;br /&gt;
We need to make sure everyone can reclaim their space and adapt it to their need.&lt;br /&gt;
&lt;br /&gt;
==Point 2: Future==&lt;br /&gt;
(Luc, 3 min)&lt;br /&gt;
&lt;br /&gt;
Vanesa, Yann, Gianpaolo and Luc discussed with Benoît Dubuis. The notes of the meeting can be found [[20170119_Meeting_with_BD | here]].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not much new but the space will probably look like this:&lt;br /&gt;
[[File:Hkrm_pro_instr-01.png|400px|thumb|center|possible plan]]&lt;br /&gt;
&lt;br /&gt;
Yann: Yeah it's almost this, the space will be a bit smaller but in essence it follows this.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Booking and signup for autoclave so that we know who uses it.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fingerprint lock for lab door agreed.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No food, no drinks policy until we move back up.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Point 3: Events==&lt;br /&gt;
(Luc, 3 min)&lt;br /&gt;
&lt;br /&gt;
* Water Drop kit building workshop on Sunday February 5th, 12:00-18:00&lt;br /&gt;
* GA will be happening on February 8th at 19:30. Luc will send a reminder email to all members after the board meeting&lt;br /&gt;
* Small CRISPR workshop on February 8th and 9th (after General Assembly and the next evening).&lt;br /&gt;
* Wiki Sprint? While the renovation Feb - May. Encourager bioreactor team, microfluidic computing, the rest of active projects, etc...&lt;br /&gt;
* Any other event planned? At Hackuarium or in collaboration with the community?&lt;br /&gt;
&lt;br /&gt;
==Point 4: Misc==&lt;br /&gt;
(Luc, 5 min)&lt;br /&gt;
&lt;br /&gt;
*The meeting of DIYbio European communities will be coupled with the [http://citizensciences.net/biofabbing/ Biofabbing conference] on May 10-13. Waiting for green light from Uni of Geneva. Will most likely happen at CERN, not in Renens. Marc Dusselier is taking the lead, asking what the Hackuarium community wants to contribute.&lt;br /&gt;
&lt;br /&gt;
*DIY Barcelona and Ricardo Muturberria (former Genspace Newyork) —&amp;gt; a meeting in sunny Bcn? DONE the first email to DIY BCN&lt;br /&gt;
&lt;br /&gt;
==Point 5: Projects==&lt;br /&gt;
(Luc, 1 min)&lt;br /&gt;
&lt;br /&gt;
* Any particular comments regarding projects?&lt;br /&gt;
* Any interest in pushing the projects from [https://docs.google.com/spreadsheets/d/1wuJVnp7Y08DAIHExxeZGa8E9qAiQVxiBm8gcvMLftBk/edit#gid=0 this doc]?&lt;br /&gt;
Yann: I'm pushing mine on my side for now&lt;br /&gt;
* LivingInstruments: 4 performances scheduled in London (4th April), Neuchâtel, London again and Appenzell.&lt;br /&gt;
Yann: Congratz! It's awesome&lt;br /&gt;
&lt;br /&gt;
==Point 6: Preparation for the General Assembly==&lt;br /&gt;
(Luc, 30 min)&lt;br /&gt;
&lt;br /&gt;
The agenda for the General Assembly can be found [[Openhackuarium_vol._136 | here]]&lt;br /&gt;
&lt;br /&gt;
The issues of Philosophy, Role and Governance will be discussed at the General Assembly (see [[Openhackuarium_vol._136#Update_Association | here]]), but there are a few points we should be agreeing with.&lt;br /&gt;
&lt;br /&gt;
Reassess the board tasks -&amp;gt; for the first board meeting after the general assembly. Also work on tasks for all members?&lt;br /&gt;
&lt;br /&gt;
Take pictures of all members -&amp;gt; paste them on the wall.&lt;br /&gt;
&lt;br /&gt;
Wall for tasks -&amp;gt; Sam can explain the concept.&lt;br /&gt;
&lt;br /&gt;
Common projects -&amp;gt; to gather members around common goals&lt;br /&gt;
&lt;br /&gt;
===Achievements of Hackuarium over the past 3 years===&lt;br /&gt;
&lt;br /&gt;
Please contribute to the list, so that we know what we believe was achieved by Hackuarium as a community.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create a community where members share skills and contribute to projects that would not have been possible otherwise.&lt;br /&gt;
* Create a space that can provide projects with infrastructures they would not have accessed otherwise.&lt;br /&gt;
* Organise events that broaden the interest of members.&lt;br /&gt;
&lt;br /&gt;
===Philosophy===&lt;br /&gt;
&lt;br /&gt;
Maybe build a document similar to the Code of Conduct Octanis has written [https://github.com/octanisorg/code_of_conduct/blob/master/code_of_conduct_english_french.pdf here]? &lt;br /&gt;
*Yann: Just saying : http://wiki.hackuarium.ch/w/Life_Main Has to be made clearer though&lt;br /&gt;
&lt;br /&gt;
===Role===&lt;br /&gt;
&lt;br /&gt;
Based on the achievements, should we keep what we have done best as a community, and focus on this?&amp;lt;br&amp;gt;&lt;br /&gt;
Yann: I still believe the best we did were the OH.&amp;lt;br&amp;gt;&lt;br /&gt;
Sam: place that is remote from daily business.&amp;lt;br&amp;gt;&lt;br /&gt;
Vanessa: place to do things and meet people who can help you make projects happen.&amp;lt;br&amp;gt;&lt;br /&gt;
Ana: thought it was a place where people share skills with the general public, specific knowledge.&amp;lt;br&amp;gt;&lt;br /&gt;
Gianpaolo: playground of wonder, need more interaction with people from the building.&amp;lt;br&amp;gt;&lt;br /&gt;
Anne-Laure: space as a magnet attracting people and projects and making the place unique.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What is the role of Hackuarium, in relation to other associations (Octanis, HammerDirt, etc.) and other branded projects (BeerDeCoded, Water Drop, etc.)?&amp;lt;br&amp;gt;&lt;br /&gt;
Yann: What about startup and other commercial, closed entities ?&lt;br /&gt;
&lt;br /&gt;
What should we expect from these projects, and what should they expect from us?&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Basically, should we clarify/specify financial and communication contributions?&amp;lt;br&amp;gt;&lt;br /&gt;
Yann: Yes this should also follow a set of rules.&lt;br /&gt;
&lt;br /&gt;
===Governance===&lt;br /&gt;
&lt;br /&gt;
Do we want to change the governance system?&amp;lt;br&amp;gt;&lt;br /&gt;
Yann: Absolutely : https://docs.google.com/spreadsheets/d/15ARwPUZ4cHjsW-Ln0zprL5_79EtrDg_xYbWbdIWZVUs/edit#gid=0&lt;br /&gt;
&lt;br /&gt;
Do we want to distribute responsibility for communication, social media, etc.?&amp;lt;br&amp;gt;&lt;br /&gt;
Yann: Absolutely and for more than just this. ALL (literally all) the members have to be involved&lt;br /&gt;
&lt;br /&gt;
[[Category:Board Meetings]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=20160623_Citizen_Science_Netzwerktreffen&amp;diff=19948</id>
		<title>20160623 Citizen Science Netzwerktreffen</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=20160623_Citizen_Science_Netzwerktreffen&amp;diff=19948"/>
		<updated>2026-11-04T10:34:43Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wann / Quand :       Donnerstag 23. Juni 2016, 13.45h bis 16.00h / Jeudi 23 juin 2016, de 13h45 à 16h00&lt;br /&gt;
Ort / Lieu :                 Haus der Akademien, Laupenstrasse 7, 3001 Bern / Maison des Académies, Laupenstrasse 7, 3001 Berne&lt;br /&gt;
&lt;br /&gt;
Programm / Programme:&lt;br /&gt;
 &lt;br /&gt;
13.45h-14.15h&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Begrüssung und Infos der Geschäftsstelle inkl. Vorstellung Citizen Science Webseite&lt;br /&gt;
Salutation et information du secrétariat général, y compris présentation du site internet de sciences citoyennes&lt;br /&gt;
&lt;br /&gt;
14.30h- 15.15h&amp;lt;br&amp;gt;&lt;br /&gt;
Praxisvorträge zum Thema Qualitätskontrolle / Présentation du contrôle de qualité&lt;br /&gt;
 &lt;br /&gt;
* Francois Grey, Université de Genève, http://citizencyberlab.org/&lt;br /&gt;
* Daniel Buresch, Tierpark Goldau, https://www.zhaw.ch/no_cache/en/research/personen-publikationen-projekte/detailansicht-projekt/projekt/2555/&lt;br /&gt;
* Romain Julliard, Muséum National d'Histoire Naturelle, Paris, http://www.actu-environnement.com/media/pdf/news-23199-projet-mnhn-65mo.pdf&lt;br /&gt;
&lt;br /&gt;
15.15h-16.15h&amp;lt;br&amp;gt;&lt;br /&gt;
Diskussion&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ab 16.30h&amp;lt;br&amp;gt;&lt;br /&gt;
Informelle Weiterführung der Diskussion im Biergarten o.ä. / Poursuite des discussions de façon informelle autour d’un verre.&lt;br /&gt;
&lt;br /&gt;
[[Category:Related people]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=20160120_General_Assembly&amp;diff=19947</id>
		<title>20160120 General Assembly</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=20160120_General_Assembly&amp;diff=19947"/>
		<updated>2026-11-04T10:33:51Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Agenda of the General Assembly'''&lt;br /&gt;
&lt;br /&gt;
Date: Wednesday, January 20th, 19.30-21.00pm&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Place: UniverCité&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour rappel, les status de l'association Hackuarium sont disponibles [[Statuts_Association_Hackuarium | ici]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
As a reminder, the status of the Hackuarium association can be found [[Statuts_Association_Hackuarium | here]] (in French only).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Composition=&lt;br /&gt;
&lt;br /&gt;
==Chair==&lt;br /&gt;
*Luc as president&lt;br /&gt;
&lt;br /&gt;
==Present==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Excused==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Items=&lt;br /&gt;
==Welcome address==&lt;br /&gt;
(Luc, 2 min)&lt;br /&gt;
&lt;br /&gt;
==General update==&lt;br /&gt;
About Hackuarium, UniverCité and else&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
(Luc, 5 min)&lt;br /&gt;
&lt;br /&gt;
===New Website===&lt;br /&gt;
&lt;br /&gt;
[[User:Sam | Sam]] a travaillé dur pour nous proposer un nouveau site internet. Le comité va le compléter d'ici au prochain [[20160204_Board_meeting|board meeting]] le 4 février 2016 et vous informer de sa mise en ligne.&lt;br /&gt;
&lt;br /&gt;
===New UniverCité community manager===&lt;br /&gt;
UniverCité has hired Juliette Davenne as a new community manager. Her tasks are not fully defined, but Carmelo Bisognano can provide more information if required.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
She will be responsible for providing drinks (tea, coffee, beers, etc.) in the cafeteria for a decent price. More to come.&lt;br /&gt;
&lt;br /&gt;
She is however not responsible for taking care of the waste disposal, so please behave and help when you can.&lt;br /&gt;
&lt;br /&gt;
She will fix everybody's access card from now on.&lt;br /&gt;
*If you are a new member and need a new card, it will cost you 50 CHF. Send [mailto:juliette@univercite.ch her] and email with [mailto:luc.henry@hackuarium.ch me] in copy with a passport size photograph. Then follow the instructions.&lt;br /&gt;
* If you are an existing member, please send [mailto:luc.henry@hackuarium.ch me] your card number so it can be activated for all relevant accesses.&lt;br /&gt;
&lt;br /&gt;
For any question regarding the life at UniverCité, contact Juliette via her preferred [mailto:juliette@univercite.ch email] or via this [mailto:juliettedavenne@gmail.com email] for google products.&lt;br /&gt;
&lt;br /&gt;
=== New Made@ Workshop Fees===&lt;br /&gt;
Since September 2015, the association was 150 CHF monthly for all members.&lt;br /&gt;
&lt;br /&gt;
The new rules for 2016 (starting January) are: &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
50.- /day (25.-, 40.-, 20.-)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
170.- /month (85.-, 130.-, 60.-)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1200.- /year (600.-, 900.-, 450.-)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
(-50% students, -25% members Hackuarium)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Free''' on Wednesday nights and Friday nights&lt;br /&gt;
&lt;br /&gt;
Contact [mailto:colonel_moutarde@mac.com Marc Wettstein] for more information.&lt;br /&gt;
&lt;br /&gt;
==Update Association==&lt;br /&gt;
&lt;br /&gt;
Yann P.: 10 - 15 minutes.&lt;br /&gt;
&lt;br /&gt;
=== Projects ===&lt;br /&gt;
&lt;br /&gt;
* What's new with the lab&lt;br /&gt;
* New upcoming projects&lt;br /&gt;
&lt;br /&gt;
=== New members and onboarding ===&lt;br /&gt;
&lt;br /&gt;
* How to join?&lt;br /&gt;
&lt;br /&gt;
 - write to hello@hackuarium.ch &amp;lt;br&amp;gt;&lt;br /&gt;
 - read [[I m new |this page]] about joining &amp;lt;br&amp;gt;&lt;br /&gt;
 - pay monthly fee (20 CHF per month) &amp;lt;br&amp;gt;&lt;br /&gt;
 - ask for a card&lt;br /&gt;
&lt;br /&gt;
* New members?&lt;br /&gt;
&lt;br /&gt;
Anyone willing to join now? Go talk to [[user:Luchenry | Luc]]&lt;br /&gt;
&lt;br /&gt;
==Approval of Financial Statement + Board Discharge==&lt;br /&gt;
'''Luc''' (5min)&lt;br /&gt;
&lt;br /&gt;
===Financial statement===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Label !! In !! Out !!Total&lt;br /&gt;
|-&lt;br /&gt;
|Cotisation 2014 || style=&amp;quot;text-align:right;&amp;quot; | 680 || ||&lt;br /&gt;
|-&lt;br /&gt;
|Dons 2014 || style=&amp;quot;text-align:right;&amp;quot; | 90 || ||&lt;br /&gt;
|-&lt;br /&gt;
|Cartes 2014 || style=&amp;quot;text-align:right;&amp;quot; | 0 || ||&lt;br /&gt;
|-&lt;br /&gt;
|Cotisation 2015 || style=&amp;quot;text-align:right;&amp;quot; | 5120 || ||&lt;br /&gt;
|-&lt;br /&gt;
|Dons 2015 || style=&amp;quot;text-align:right;&amp;quot; | 1616.30 || ||&lt;br /&gt;
|-&lt;br /&gt;
|Cartes 2015 || style=&amp;quot;text-align:right;&amp;quot; | 350 || ||&lt;br /&gt;
|-&lt;br /&gt;
|Cotisation 2016 || style=&amp;quot;text-align:right;&amp;quot; | 660 || ||&lt;br /&gt;
|-&lt;br /&gt;
|Dons 2016 || style=&amp;quot;text-align:right;&amp;quot; | 0 || ||&lt;br /&gt;
|-&lt;br /&gt;
|Cartes 2016 || style=&amp;quot;text-align:right;&amp;quot; | 50 || ||&lt;br /&gt;
|-&lt;br /&gt;
|'''Total In''' || '''style=&amp;quot;text-align:right;&amp;quot; | 8516.3''' || ||&lt;br /&gt;
|-&lt;br /&gt;
|Dépenses 2014 || || style=&amp;quot;text-align:right;&amp;quot; | 2.15 ||&lt;br /&gt;
|-&lt;br /&gt;
|Dépenses 2015 || || style=&amp;quot;text-align:right;&amp;quot; | 4249.6 ||&lt;br /&gt;
|-&lt;br /&gt;
|Dépenses 2016 || || style=&amp;quot;text-align:right;&amp;quot; | 591.83 ||&lt;br /&gt;
|-&lt;br /&gt;
|'''Total Out''' ||  || '''style=&amp;quot;text-align:right;&amp;quot; | 4843.58''' ||&lt;br /&gt;
|-&lt;br /&gt;
|'''Balance''' ||  ||  || '''style=&amp;quot;text-align:right;&amp;quot; | 3672.72'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Details of spendings for 2015 are as follow:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Label !! In !! Out !!Total&lt;br /&gt;
|-&lt;br /&gt;
|Biochinage || || style=&amp;quot;text-align:right;&amp;quot; | 1054.6 ||&lt;br /&gt;
|-&lt;br /&gt;
|Apéros || || style=&amp;quot;text-align:right;&amp;quot; | 315 ||&lt;br /&gt;
|-&lt;br /&gt;
|UCmakerspace || || style=&amp;quot;text-align:right;&amp;quot; | 450 ||&lt;br /&gt;
|-&lt;br /&gt;
|Matos || || style=&amp;quot;text-align:right;&amp;quot; | 1568.75 ||&lt;br /&gt;
|-&lt;br /&gt;
|Website || || style=&amp;quot;text-align:right;&amp;quot; | 81.05 ||&lt;br /&gt;
|-&lt;br /&gt;
|BeerDeCoded	|| || style=&amp;quot;text-align:right;&amp;quot; | 755 ||&lt;br /&gt;
|-&lt;br /&gt;
|Frais || || style=&amp;quot;text-align:right;&amp;quot; | 25.2 ||&lt;br /&gt;
|-&lt;br /&gt;
|'''Total Out''' ||  || '''style=&amp;quot;text-align:right;&amp;quot; | 4249.6''' ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Board Discharge===&lt;br /&gt;
&lt;br /&gt;
The composition of the board since the last general assembly (April 2015) was as follow:&lt;br /&gt;
&lt;br /&gt;
* Luc Henry, Président-trésorier&lt;br /&gt;
* Yann Heurtaux, Vice-Président&lt;br /&gt;
* Michal Masternak, Secrétaire&lt;br /&gt;
* Yann Pierson, Lab Manager&lt;br /&gt;
* Jonathan Sobel, Membre&lt;br /&gt;
* Ana Roldan, Membre&lt;br /&gt;
* Sam Sulaimanov, Membre&lt;br /&gt;
* Clément Drevot, Membre&lt;br /&gt;
* Vanessa Lorenzo, Membre&lt;br /&gt;
* Anne-Laure Pittet, Membre&lt;br /&gt;
&lt;br /&gt;
==Election: Board==&lt;br /&gt;
&lt;br /&gt;
'''Yann P, 5min'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The composition of the board will be re-evaluated at this general assembly. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- What it means to be part of the board. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Luc, 2min) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Leaving ===&lt;br /&gt;
&lt;br /&gt;
* [[User:Shalf | Yann Heurtaux]], Vice-Président (statement available [[User:Shalf#Statement_for_our_January_20th.2C_2016_General_Assembly | here]])&lt;br /&gt;
* [[User:Jsobel | Jonathan Sobel]]&lt;br /&gt;
* Clément Drévo&lt;br /&gt;
&lt;br /&gt;
===Renewals===&lt;br /&gt;
&lt;br /&gt;
* [[User:Luchenry | Luc Henry]], Président-trésorier, élu&lt;br /&gt;
* Michal Masternak, Secrétaire, élu&lt;br /&gt;
* Yann Pierson, Lab Manager, élu&lt;br /&gt;
* Ana Roldan, Membre, élue&lt;br /&gt;
* Sam Sulaimanov, Membre, élu&lt;br /&gt;
* Vanessa Lorenzo, Membre, élue&lt;br /&gt;
* Anne-Laure Pittet, Membre, élue&lt;br /&gt;
&lt;br /&gt;
La position de vice-président est à repourvoir. Elle le sera à la prochaine réunion du board.&lt;br /&gt;
&lt;br /&gt;
===New Candidates===&lt;br /&gt;
&lt;br /&gt;
* Gianpaolo Rando, élu&lt;br /&gt;
&lt;br /&gt;
===Auditeurs comptes===&lt;br /&gt;
(Luc, 5min)&lt;br /&gt;
&lt;br /&gt;
* 2 people?&lt;br /&gt;
&lt;br /&gt;
==Introducing Vision &amp;amp; Community Survey==&lt;br /&gt;
&lt;br /&gt;
'''Yann P.''' (10 min)&amp;lt;br&amp;gt;&lt;br /&gt;
* Vision lab manager&lt;br /&gt;
* Where we could be going (tech-wise)&lt;br /&gt;
&lt;br /&gt;
'''Luc''' (2 min)&amp;lt;br&amp;gt;&lt;br /&gt;
* Community Survey&lt;br /&gt;
&lt;br /&gt;
'''Vanessa''' (5 min)&amp;lt;br&amp;gt;&lt;br /&gt;
* Vision statement art, design, scientific projects.&lt;br /&gt;
&lt;br /&gt;
==Closing remarks==&lt;br /&gt;
&lt;br /&gt;
'''Luc''' (2 min)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Discussion=&lt;br /&gt;
&lt;br /&gt;
==Other topics of discussion outside the scope of the general assembly==&lt;br /&gt;
&lt;br /&gt;
''' Gianpaolo Rando''' &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Update on BeerDeCoded&lt;br /&gt;
&lt;br /&gt;
''' Richard Timsit ''' &amp;lt;br&amp;gt;&lt;br /&gt;
A discussion about the Fablab and relation with Hackuarium &amp;lt;br&amp;gt;&lt;br /&gt;
https://hackuarium.slack.com/files/tim/F0J5VH0GH/contribution.txt&lt;br /&gt;
&lt;br /&gt;
[[Category:General_assembly]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Category:General_assembly&amp;diff=19946</id>
		<title>Category:General assembly</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Category:General_assembly&amp;diff=19946"/>
		<updated>2026-11-04T10:33:09Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: created&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Administration]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=2010910_pi_workshop_notes&amp;diff=19945</id>
		<title>2010910 pi workshop notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=2010910_pi_workshop_notes&amp;diff=19945"/>
		<updated>2026-11-04T10:31:41Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Intro=&lt;br /&gt;
&lt;br /&gt;
Raspberry Pi 3 computer&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
OS (Raspbian) loaded on SD card&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
All GPIO pins are flexible 3.3V OUT or IN (will generate floating voltage when not programmed)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
GPIO can be programmed using gpio utility: http://wiring.com/the-gpio-utility/&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
UART pins carry data (RX=receive, TX=transmit), allows connection of devices (GPS), 3V-&amp;gt;3V, GND-&amp;gt;GDN, RX-&amp;gt;TX, TX-&amp;gt;RX&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sends text signals, each character encoded in 8bits (&amp;quot;packed&amp;quot; encapsulated into a &amp;quot;start bit&amp;quot; and a &amp;quot;stop bit&amp;quot;)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Speed is 9600 Baud (1 Baud = 1 bit per sec)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
To access this data, you can either use a Python script, or a software called &amp;quot;screen&amp;quot; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
directory &amp;quot;/dev/ttyACM0 9600&amp;quot; contains a new file that represents the connexion to a device (arduino, printer, etc.)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
I2C protocol&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For example: BMP280 sensor temperature and pressure sensor (4pins=3V, GND, SDA, SCL)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On pi, up to 127 sensors can be connected to the SDA and SCL ports. Each device has a fix-programmed specific address.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
i2c-tools is a program that allows to detect from all these sensors using the i2cdetect protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;sudo raspi-config&amp;quot; to configure the pi computer&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Step 1. Tell pin to be GPIO2 &amp;lt;br&amp;gt;&lt;br /&gt;
Step 2. Tell pin to be ON or OFF &amp;lt;br&amp;gt;&lt;br /&gt;
2 ways of accessing the pins: GPIO# or pin# &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;GPIO-g&amp;quot; flags to GPIO# &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=First test=&lt;br /&gt;
&lt;br /&gt;
Connect to Pi computer using this command in the terminal:&lt;br /&gt;
&lt;br /&gt;
 ssh pi@JUPITER&lt;br /&gt;
&lt;br /&gt;
Enter password: raspberry&lt;br /&gt;
&lt;br /&gt;
If we want to connect the LED on the GPIO4 port: &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Controlling GPIO ports using '''[http://elinux.org/RPi_GPIO_Code_Samples#Python Python]''': &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or using '''BASH ([http://elinux.org/RPi_GPIO_Code_Samples#Shell Shell]) command line''' (UNIX language): &amp;lt;br&amp;gt;&lt;br /&gt;
 sudo -i &amp;lt;br&amp;gt;&lt;br /&gt;
 echo &amp;quot;4&amp;quot; &amp;gt; /sys/class/gpio/export &amp;lt;br&amp;gt;&lt;br /&gt;
 echo &amp;quot;out&amp;quot; &amp;gt; /sys/class/gpio/gpio4/direction &amp;lt;br&amp;gt;&lt;br /&gt;
 echo &amp;quot;1&amp;quot; &amp;gt; /sys/class/gpio/gpio4/value &amp;lt;-turns it on &amp;lt;br&amp;gt;&lt;br /&gt;
 echo &amp;quot;0&amp;quot; &amp;gt; /sys/class/gpio/gpio4/value &amp;lt;-turns it off &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or '''[http://wiringpi.com/the-gpio-utility/ GPIO utility command]''': &amp;lt;br&amp;gt;&lt;br /&gt;
 gpio -g mode 4 out &amp;lt;br&amp;gt;&lt;br /&gt;
 gpio -g write 4 1 &amp;lt;-turns it on &amp;lt;br&amp;gt;&lt;br /&gt;
 gpio -g write 4 0  &amp;lt;-turns it off &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=The Operating System=&lt;br /&gt;
&lt;br /&gt;
An OS is a piece of software that people wrote to use a computer in an easy and structured way.&amp;lt;br&amp;gt;&lt;br /&gt;
Linus is the kernel (not an operating system), robust, versatile, stable.&amp;lt;br&amp;gt;&lt;br /&gt;
Operating system is [https://www.raspbian.org/ Raspian] in our case.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linux always has a BASH (Shell) '''terminal''': type something, press enter, view output.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The terminal uses:&lt;br /&gt;
arrows&amp;lt;br&amp;gt;&lt;br /&gt;
enter key (execute) &amp;lt;br&amp;gt;&lt;br /&gt;
tab key (autocomplete) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Everything in Linux is either a FILE or a DIRECTORY &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 man&lt;br /&gt;
stands for manual and gives instructions on how to use commands, eg. &amp;quot;man cat&amp;quot;&lt;br /&gt;
 pwd&lt;br /&gt;
shows the directory we're in &amp;lt;br&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
lists all items in this directory &amp;lt;br&amp;gt;&lt;br /&gt;
 ls -ailh&lt;br /&gt;
give the size of all files in the directory &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 rm -r NAME&lt;br /&gt;
remove directory&lt;br /&gt;
&lt;br /&gt;
 rm NAME&lt;br /&gt;
remove file&lt;br /&gt;
&lt;br /&gt;
 mv FILENAME ..&lt;br /&gt;
moves file NAME into the upper directory&lt;br /&gt;
&lt;br /&gt;
 mv FILENAME DIRECTORY&lt;br /&gt;
moves FILENAME into any DIRECTORY&lt;br /&gt;
&lt;br /&gt;
 ctrl c&lt;br /&gt;
cancels all commands &amp;lt;br&amp;gt;&lt;br /&gt;
 ctrl l&lt;br /&gt;
cleans the screen &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 sudo -s&lt;br /&gt;
login as root &amp;lt;br&amp;gt;&lt;br /&gt;
 exit&lt;br /&gt;
leaves root mode &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 cat [FILE NAME] | less&lt;br /&gt;
-&amp;gt; the pipe character &amp;quot;|&amp;quot; will take the output of one command into the next command&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Bash scripting=&lt;br /&gt;
&lt;br /&gt;
==test1:==&lt;br /&gt;
&lt;br /&gt;
 nano myfirstscript.txt&lt;br /&gt;
&lt;br /&gt;
 #! /bin/bash&amp;quot;&lt;br /&gt;
 echo Hello!&lt;br /&gt;
 echo World!&lt;br /&gt;
 whoami&lt;br /&gt;
&lt;br /&gt;
 chmod +x myfirstscript.txt&lt;br /&gt;
&lt;br /&gt;
-&amp;gt;makes the file executable -&amp;gt; into some program that you can run &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ./myfirstscript.txt&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; executes the file&lt;br /&gt;
&lt;br /&gt;
==test2:==&lt;br /&gt;
&lt;br /&gt;
 nano mysecondscript.txt&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
 #! /bin/bash&lt;br /&gt;
 echo Hello!&lt;br /&gt;
 echo World!&lt;br /&gt;
 whoami&lt;br /&gt;
&lt;br /&gt;
 mkdir woz&lt;br /&gt;
 touch woz/niak.txt&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
 chmod +x mysecondscript.txt&lt;br /&gt;
&lt;br /&gt;
 ./mysecondscript.txt&lt;br /&gt;
&lt;br /&gt;
==LEDBlink==&lt;br /&gt;
&lt;br /&gt;
 #! /bin/bash&lt;br /&gt;
tells the terminal the langage of code (Bash here)&lt;br /&gt;
&lt;br /&gt;
 while true; do&lt;br /&gt;
 gpio -g write 4 1&lt;br /&gt;
 sleep 0.5&lt;br /&gt;
 gpio -g write 4 0&lt;br /&gt;
 sleep 0.1&lt;br /&gt;
 done&lt;br /&gt;
Makes pin 4 (here a LED) blink forever (while)&lt;br /&gt;
&lt;br /&gt;
=Networking=&lt;br /&gt;
&lt;br /&gt;
To update anything:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get update NAME&lt;br /&gt;
&lt;br /&gt;
To install anything:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install NAME&lt;br /&gt;
&lt;br /&gt;
to find IP address of Raspberry Pi (will retrieve the IP address):&lt;br /&gt;
&lt;br /&gt;
 hostname -I&lt;br /&gt;
&lt;br /&gt;
To connect to the Pi via wifi&lt;br /&gt;
&lt;br /&gt;
 ssh pi@... (IP address)&lt;br /&gt;
&lt;br /&gt;
To get the IP address:&lt;br /&gt;
&lt;br /&gt;
#find a screen with HDMI cable&lt;br /&gt;
#plug into Raspberry Pi&lt;br /&gt;
#plug mouse in the USB&lt;br /&gt;
#use the graphical user interface on the screen&lt;br /&gt;
&lt;br /&gt;
top right corner, wifi signal, select the wifi network, type in password, write down IP address, then can be used to connect&lt;br /&gt;
&lt;br /&gt;
For remote access to the files on the SD from a computer (to edit code for example), download [https://cyberduck.io Cyberduck] and use '''SFTP''' protocol (or any other similar interface).&lt;br /&gt;
&lt;br /&gt;
'''VNC''' allows to use the virtual use interface via wifi (without cable and screen).&lt;br /&gt;
&lt;br /&gt;
#Install tightvncserver using&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get update tightvncserver&lt;br /&gt;
&lt;br /&gt;
#run vncserver :1 on Pi&lt;br /&gt;
&lt;br /&gt;
Choose password:&lt;br /&gt;
&lt;br /&gt;
raspberry&lt;br /&gt;
&lt;br /&gt;
Gives back this answer:&lt;br /&gt;
&lt;br /&gt;
 New 'X' desktop is jupiter:1&lt;br /&gt;
 Creating default startup script /home/pi/.vnc/xstartup&lt;br /&gt;
 Starting applications specified in /home/pi/.vnc/xstartup&lt;br /&gt;
 Log file is /home/pi/.vnc/jupiter:1.log&lt;br /&gt;
&lt;br /&gt;
Download RealVNC [https://www.realvnc.com/download/viewer/ viewer].&lt;br /&gt;
&lt;br /&gt;
Log in using in this case, use this as username: JUPITER:5901&lt;br /&gt;
&lt;br /&gt;
==RFID code==&lt;br /&gt;
&lt;br /&gt;
Sam's code is [http://bit.ly/2bYJXwu here]&lt;br /&gt;
&lt;br /&gt;
=Graphical coding using Node-Red=&lt;br /&gt;
&lt;br /&gt;
[http://nodered.org Node-Red] is installed on the Raspberry Pi (needs to be enabled)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use [http://JUPITER:1880 this link] to code my device from the web browser&lt;br /&gt;
&lt;br /&gt;
=Excercise=&lt;br /&gt;
&lt;br /&gt;
Try to generate a sound using light signal from photodiode (CLIP)&lt;br /&gt;
&lt;br /&gt;
[[Category:Workshop]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=150617_Meeting_Swissnex_India_Makerspaces&amp;diff=19944</id>
		<title>150617 Meeting Swissnex India Makerspaces</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=150617_Meeting_Swissnex_India_Makerspaces&amp;diff=19944"/>
		<updated>2026-11-04T10:30:51Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=CONTEXT=&lt;br /&gt;
Victor Steininger (graduate from EPFL and intern at Swissnex India, Entrepreneurship and Innovation section) in charge of the programme for the development and networks between Makerspaces in India and Switzerland. He contacted Hackuarium for a possible collaboration. Meeting at Hackuarium on the 15th June at 11:30 - 12:30h. &lt;br /&gt;
&lt;br /&gt;
In order to know how to connect makerspaces, his research starts at knowing what a makerspace and maker community is, hackers, makers, doers, artisans.. Philosophical approaches are different but he sees a strong connection.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also, strong cultural differences between &amp;quot;true&amp;quot; makers (or the necessity of becoming one). Strong needs and skills on both sides, the connection would be very satisfying and change making. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grassroots and natural &amp;quot;maker culture&amp;quot; in India in comparison with new &amp;quot;Maker movement&amp;quot; establishing.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Differences rural and Urban.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==WHO==&lt;br /&gt;
(Who was present in the meeting) &amp;lt;br&amp;gt;&lt;br /&gt;
Victor Steininger &amp;lt;br&amp;gt;&lt;br /&gt;
Vanessa Lorenzo &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Participants===&lt;br /&gt;
You?&amp;lt;br&amp;gt;&lt;br /&gt;
...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==WHAT==&lt;br /&gt;
Connect and create community synergies, education, social impact, etc... with low cost, open source, upcycling, sustainable, long term collaborations.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==WHEN==&lt;br /&gt;
Early 2018.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==HOW==&lt;br /&gt;
No budget but we can make a solid draft, mid-long term projects and get the name of Swissnex India supporting us. They will couch us for the grant proposal. We should also somehow connect this to our possible connection to Kardana School (Nepal) that was discussed during the Biofabbing Convergenge: Fabulations and Fabrications, Geneva - Lausanne May 2017.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Related people]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=080617_Meeting_Ferme_Des_Tilleuls&amp;diff=19943</id>
		<title>080617 Meeting Ferme Des Tilleuls</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=080617_Meeting_Ferme_Des_Tilleuls&amp;diff=19943"/>
		<updated>2026-11-04T10:29:56Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Visite=&lt;br /&gt;
Meeting avec l'équipe voisin de La Ferme des Tilleuls (LFdT) à 15:00h. à la terrasse de son café.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===LFdT===&lt;br /&gt;
&amp;quot;Îlot miraculeusement conservé au cœur de la Renens industrielle et ferroviaire, La Ferme des Tilleuls témoigne de toutes les mutations que la ville a connues, de la ruralité au développement ferroviaire à la fin du XIXe siècle, puis à la culture alternative. Cet ensemble patrimonial avec sa maison de maître classée monument historique, a été racheté en 2008 puis rénové par la Ville de Renens qui a alors travaillé en étroite collaboration avec l’Association Un autre regard pour le développement du projet culturel. Aujourd’hui la Fondation de La Ferme des Tilleuls gère le lieu.&amp;quot; [https://fermedestilleuls.ch/a-propos/ source]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Hackuarium===&lt;br /&gt;
Assotiation, communauté et laboratoire citoyenne pour practiquer la DIYbio (biologie Do-It-Yourself), un mouvement qui veut libérer la pratique de la recherche et de l'innovation biologiques des laboratoires institutionnels et industriels. Poursuivé à la fois par des amateurs et biologistes professionnels, DIYbio développe des solutions peu coûteuses et peu technologiques aux problèmes identifiés par la communauté. Le mouvement se caractérise par un ensemble extrêmement diversifié de pratiques et de participants. Certains s'appellent eux-mêmes «biohackers», en référence à la culture hacker.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==QUI?==&lt;br /&gt;
EMMANUEL DAYER, administrateur de LFdT&amp;lt;br&amp;gt;&lt;br /&gt;
STEPHANIE GUEX, chargée de projet de LFdT &amp;lt;br&amp;gt;&lt;br /&gt;
VANESSA LORENZO, co-presidente et projets Art&amp;amp;Science de HCKRM&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==QUOI?==&lt;br /&gt;
Après une bref visite à la exhibition LDtF [https://fermedestilleuls.ch/agenda/ Voyage Vers, Mario del Curto] (A travers les thèmes de l’origine des plantes, la science, la nourriture, l’agronomie,  le jardin urbain et familial, les jardins utopiques et le dernier jardin, il nous invite à porter notre regard sur la diversité des liens qui unit l’homme au végétal et témoigne de la force incroyable des plantes.) Nous nous sommes trouvés pour se presenter, présenter le lieu et la programmation, les projets divers de Hackuarium et sa communauté ainsi que les souhaits de collaborations futures.&lt;br /&gt;
&lt;br /&gt;
LFdt ils sont un laboratoire de expérimentation avec une regarde différent a la science, vie, culture avec une inclination pour la culture du développement durable. Ils sont ouverts a collaborer et accueillir différentes activités et workshops dans le futur proche.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==PROCHAINEMENT==&lt;br /&gt;
Le prochaine 22 Juin 2017, commence une exposition [http://www.kirellbenzi.com/ Kirell Benzi] Vernissage à 18:00h, 29 Juin 20:00h. presentation de l'artiste.&amp;lt;br&amp;gt;&lt;br /&gt;
Vanessa propose une visite pour &amp;quot;Chasser&amp;quot;le champignon plus grand de l'Europe, mycelium localisé en Suisse! Possible sortie en commun en automme.&amp;lt;br&amp;gt;&lt;br /&gt;
Debut Janvier 2018, René Moreu &amp;lt;br&amp;gt;&lt;br /&gt;
Avril 2018. Théâtre de l'Utopie&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Related_people]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=(atelier_possible)&amp;diff=19942</id>
		<title>(atelier possible)</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=(atelier_possible)&amp;diff=19942"/>
		<updated>2026-11-04T10:29:03Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;voici les infos de Abao pour un atelier de deux jours&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Compared to the most advanced 2-nanometer semiconductor technology in the industry today, the intriguing name &amp;quot;1,540,000 nanometers&amp;quot; reflects the DIY spirit and its symbolic concepts. Dye-Sensitized Solar Cells (DSSC) are a third-generation solar technology that is easy to manufacture and low-cost. Their electricity-generating mechanism relies on dyeing processes, which can be carried out using both natural and synthetic dyes. This project introduces the research process behind DIY solar technology and explores the intersection of dyeing techniques and energy production.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Day 1&lt;br /&gt;
&lt;br /&gt;
13:00 - 13:30 intros and DSSC project intro (slides)&lt;br /&gt;
&lt;br /&gt;
13:30 - 15:00 silk screen printing photo-electrodes &amp;amp; counter-electrode, sintering electrodes&lt;br /&gt;
&lt;br /&gt;
15:00 - 16:00 extracting natural dyes from fruits, soaking electrodes into synthetic and natural dyes at 50°C overnight&lt;br /&gt;
&lt;br /&gt;
Day 2&lt;br /&gt;
&lt;br /&gt;
13:00 - 15:00 cell assembling and inject electrolyte&lt;br /&gt;
&lt;br /&gt;
15:00 - 16:00 try to power low-power motors and starvation synth!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's a [https://www.hackster.io/news/a-starvation-synth-made-with-diy-solar-cells-46e79c82b005 recent article about his solar work]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bio:&lt;br /&gt;
&lt;br /&gt;
Shih Wei-Chieh is an artist, maker, self-taught materials scientist, and activist who fosters international exchange for independent art events. He is pursuing a Ph.D. in the Interdisciplinary Art Program at the Graduate Institute of Applied Arts, National Yang Ming Chiao Tung University.&lt;br /&gt;
&lt;br /&gt;
Shih initiated the &amp;quot;Tribal Against Machine&amp;quot; project in Taiwan, which bridges traditional textile craftsmanship with the international e-textile community. He is actively involved in and facilitates international collaborations within independent art networks, establishing unconventional interdisciplinary connections. He organized the international online residency &amp;quot;Having Friends in The Future&amp;quot; for the National Taiwan Craftsmenship Research and Development Institute in 2020/2021. Additionally, his research project, Non-Governmental Matters, explores and investigates independent interdisciplinary art camps and gatherings, examining the positive impacts of such international and cross-disciplinary exchanges.&lt;br /&gt;
&lt;br /&gt;
His personal project &amp;quot;Laser Dye Project&amp;quot; was awarded the grand prize at Reshape 2019 in Barcelona and featured in deTour 2019 in Hong Kong. His electronic textile piece, &amp;quot;I Am Very Happy I Hope You Are Too,&amp;quot; was exhibited at the Taipei Digital Art Festival and the &amp;quot;Hello World&amp;quot; exhibition at the University of Sydney. In 2023, his work &amp;quot;The Mind of A Greenhouse&amp;quot; was showcased at &amp;quot;The Energy Giveaway at the Humuspunk Library&amp;quot; in Zurich, an exhibition jointly organized by Hackteria and Regenerative Energy Communities.&lt;br /&gt;
&lt;br /&gt;
[[Category:Workshop]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Calendar&amp;diff=19941</id>
		<title>Calendar</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Calendar&amp;diff=19941"/>
		<updated>2026-11-04T10:28:11Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here is our Google '''Calendar''':&lt;br /&gt;
* html: https://www.google.com/calendar/embed?src=mgvq9goephpmna0kb7rj9ipei8%40group.calendar.google.com&amp;amp;ctz=Europe/Zurich&lt;br /&gt;
* ical: https://www.google.com/calendar/ical/mgvq9goephpmna0kb7rj9ipei8%40group.calendar.google.com/public/basic.ics&lt;br /&gt;
&lt;br /&gt;
[[Category:Administration]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Workshop_Makerspaces_Underground_meets_the_Upperground&amp;diff=19940</id>
		<title>Workshop Makerspaces Underground meets the Upperground</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Workshop_Makerspaces_Underground_meets_the_Upperground&amp;diff=19940"/>
		<updated>2026-11-04T10:27:35Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Workshop : how to study makerspaces ?=&lt;br /&gt;
==WHAT==&lt;br /&gt;
A 2-days immersive workshop hosted at Univercité (UC) and focused on the rich ecosystem of hackerspaces and makerspaces that inhabit UC and '''Les Ateliers de Renens''' : Hackuarium, MadeUC, Fixme, Fablab Renens, Co-working space, etc... The aim was to share, prototype and experiment with new approaches to study urban spaces of creativity. The team contacted UC previously to organize the workshop,they also contacted Hackuarium and came personally in several occasions for a visit. During the workshop they integrated, observed and collaborated with some of us.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==WHEN==&lt;br /&gt;
18th and 19th May, 2017 - Renens, Switzerland&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==What's the 'Middleground'? ==&lt;br /&gt;
[https://documents.epfl.ch/users/c/cr/crenaud/www/workshop/ (from their site) ]&lt;br /&gt;
Creative, hacker, doer and maker communities. 'Middleground' would be the “a critical intermediate structure linking the underground to the upperground” [The Anatomy of the Creative City, Cohendet], where Upperground it is considered as the ensemble of formal institutions and Underground is considered the creative, artistic and cultural activities without formal production, exploitation or diffusion. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==LINK TO RESULTS==&lt;br /&gt;
'''[http://wiki.hackuarium.ch/index.php?title=Workshop_Makerspaces_Underground_meets_the_Upperground&amp;amp;action=edit&amp;amp;redlink=1 Notes and Results of the Workshop by Clément Renaud here ]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==CREDITS==&lt;br /&gt;
[https://documents.epfl.ch/users/c/cr/crenaud/www/workshop/ (from their site) ]&lt;br /&gt;
A special thanks goes to all the participants for their energy and ideas: Grégory Bahde, Anaïs Bloch, Marylaure Bloch, Siyu Chen, Matei Gheorghiu, Luis Gomez, Nur Hamdan, Nicola Nova, Richard Marion, Emanuele Protti, Vivien Roussel, Gabriela Sanchez, Peter Troxler, Monique Bolli, Clément Renaud, Marc Laperrouza and Florence Graezer Bideau.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
We would also like to thank Univercite for hosting us and Christophe Rouillet for all his help regarding the organization, Michelle Dedelley and Vanessa Lorenzo Toquero for joining us for the session of questions and the members of Hackuarium for welcoming us the day of their general assembly.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Workshop]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Tools&amp;diff=19939</id>
		<title>Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Tools&amp;diff=19939"/>
		<updated>2026-11-04T10:26:51Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: updated categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;At Hackuarium, you will find...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Working Equipment ==&lt;br /&gt;
== Equipment that need a bit of fixing ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Tools]]&lt;br /&gt;
[[Category:Work In Progress]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Site&amp;diff=19938</id>
		<title>Site</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Site&amp;diff=19938"/>
		<updated>2026-11-04T10:26:14Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hackuarium can be found at &lt;br /&gt;
&lt;br /&gt;
''Hackuarium se trouve à la:''&lt;br /&gt;
&lt;br /&gt;
Route de Crochy 20, 1024 Ecublens&lt;br /&gt;
&lt;br /&gt;
With its P1 lab on the southern side with three sets of windows, and the 'inner lab' for fluorescence, bioilluminescence, and some chemistry, Hackuarium is well set up. The context of the cooperative we formed, esp with members of Octanis and Polymeka (plus a few startups*), means possibilities for exploring and making in this peaceful corner of Ecublens are virtually endless!&lt;br /&gt;
&lt;br /&gt;
''Avec son laboratoire P1, situé au sud et doté de trois séries de fenêtres, et le &amp;quot;laboratoire intérieur&amp;quot; pour la fluorescence, la bioilluminescence et un peu de chimie, le Hackuarium est bien installé. Le contexte de la coopérative que nous avons formée, avec des membres d'Octanis et de Polymeka (plus quelques startups*), signifie que les possibilités d'exploration et de création dans ce coin paisible d'Ecublens sont pratiquement illimitées !''&lt;br /&gt;
&lt;br /&gt;
[[Mapplus|For more details on the site, see this page.]]&lt;br /&gt;
&lt;br /&gt;
''[[Mapplus|Voir ici pour plus des details sur notre emplacement.]]''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TO NOTE:&lt;br /&gt;
&lt;br /&gt;
1) This fabulous location, by the Crochy metro stop, even, is unfortunately already destined for destruction, so we are on the look out for a new space!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;***&amp;lt;/nowiki&amp;gt; '''(''Please pass on any leads you might have in this regard.'')'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''A NOTER :''&lt;br /&gt;
&lt;br /&gt;
''1) Cet emplacement fabuleux, près de l'arrêt de métro Crochy, même, est malheureusement déjà destiné à la destruction, donc nous sommes à la recherche d'un nouvel espace !''&lt;br /&gt;
&lt;br /&gt;
'''''*** (Merci de nous transmettre toute piste que vous pourriez avoir à cet égard).'''''&lt;br /&gt;
&lt;br /&gt;
[[Category:Administration]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Projects&amp;diff=19937</id>
		<title>Projects</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Projects&amp;diff=19937"/>
		<updated>2026-11-04T10:25:28Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added Projects category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Projects Page!&lt;br /&gt;
&lt;br /&gt;
''Bienvenue aux page de Projets !''&lt;br /&gt;
&lt;br /&gt;
==Active Projects==&lt;br /&gt;
*[[Mudtronics]] &lt;br /&gt;
*[[ABC2 |A Biomaterial and Chemistry Clubhouse (ABC2)]]&lt;br /&gt;
*[[AGiR! for genomic integrity | AGiR! projects at Hackuarium]]&lt;br /&gt;
*[[Atelier à GoGo]]&lt;br /&gt;
*[[Bacterivieres|Bacte-rivières]]&lt;br /&gt;
*[[Bioluminescence investigations|Bioluminescence Investigations]]&lt;br /&gt;
*[[CFPS with plants|Cell Free Protein Synthesis with plants]]&lt;br /&gt;
*[[Coding4All]]&lt;br /&gt;
*[[Fun_with_fungi]]&lt;br /&gt;
**[[Circularbioeconomy]]&lt;br /&gt;
*[[Open Source Bioreactor]]&lt;br /&gt;
*[https://hackuarium.github.io/simple-spectro/ Open source spectrophotometer]&lt;br /&gt;
*[[LaboP1]]&lt;br /&gt;
*[[QualityControl4Genes]]&lt;br /&gt;
*[[Rêves_lucides]]&lt;br /&gt;
*[[Science Ouverte Contre les Insects Invasives|Science Ouverte Contre les Insectes Invasives]]&lt;br /&gt;
*[[Urban gardens with rhizobial bacteria]]&lt;br /&gt;
*&lt;br /&gt;
*&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
==Archived Projects==&lt;br /&gt;
*[[BeeMoS]]&lt;br /&gt;
*[[BeeMoSeq]]&lt;br /&gt;
*[[Bioremediation]]&lt;br /&gt;
*[https://app.jogl.io/project/181 #CoronaDetective], in our wiki: [[Corona Detective]] (done in collaboration with other open science enthusiasts and with support from JOGL)&lt;br /&gt;
*[[Jardinage_urbain_2024]]&lt;br /&gt;
*[[Re-purposing Illumina HiSeq 2500]]&lt;br /&gt;
*[[Living Instruments]]&lt;br /&gt;
**[[Living_Instruments_v2]]&lt;br /&gt;
*[[Montreux 2023|MCBP 2023]]&lt;br /&gt;
*[[Open-Food-DNA |Open Food Repo - DNA]]&lt;br /&gt;
*[[OpenInsulin]]&lt;br /&gt;
*[[Darty_Monkeys]]&lt;br /&gt;
*[[Mari mutare]]&lt;br /&gt;
*[[Dans la Drêche]]&lt;br /&gt;
*[[Bioreactor | Steady state bioreactor]]&lt;br /&gt;
*[[BeerDeCoded]]&lt;br /&gt;
*[[Grow&amp;amp;Mix_Bioink]]&lt;br /&gt;
*[[ Workshop Bioprinter]]&lt;br /&gt;
*[[Micro to Macro Water Pollution]] - with [http://www.hammerdirt.ch/ Hammerdirt] and [http://biodesign.cc/ BIO-DESIGN for the REAL WORLD]&lt;br /&gt;
*[[Spectro-pointer]]&lt;br /&gt;
*[[Terraforming Alkalin Experiments | Terraforming Alkaline Experiments]]&lt;br /&gt;
*[http://wiki.hackuarium.ch/w/Diy-transilluminator DIY Transilluminator]&lt;br /&gt;
*[[Stress Analyzer]]&lt;br /&gt;
*[http://biodesign.cc/ BIO-DESIGN for the REAL WORLD]&lt;br /&gt;
*[[Octanis]] - All projects from the Octanis association have moved to a new space. For more information about their Rover / Balloon [http://octanis.org/rover click here].&lt;br /&gt;
*[http://wiki.hackuarium.ch/w/Crowdfunding2017 Crowdfunding]&lt;br /&gt;
*[[ HTGAA]]&lt;br /&gt;
*[[Hacktion  | Hacktion challenges]]&lt;br /&gt;
*[[Open-Food-DNA]]&lt;br /&gt;
*[[Bience | Bience (Beer and Science!)]]&lt;br /&gt;
*[[Mycelium Structures]]&lt;br /&gt;
*[[Live Type]]&lt;br /&gt;
*[[Projects:LivingLab Design|LivingLab Design]]&lt;br /&gt;
*[[Projects:bioluminescence|Bioluminescence]]&lt;br /&gt;
*[[Projects:Quantitative Anthropology|Quantitative Anthropology]]&lt;br /&gt;
*[[Projects:Impression 3D|Impression 3D]]&lt;br /&gt;
*[[Projects:Dépollution des stands de tirs Suisses]]&lt;br /&gt;
*[[Incubateur bon marché]]&lt;br /&gt;
*[[Space Seed]]&lt;br /&gt;
*[[Reception d'images satellites]]&lt;br /&gt;
*[[Edible wall]]&lt;br /&gt;
*[[ZéBU CH]]&lt;br /&gt;
*[[Compost Bacteria]]&lt;br /&gt;
*[[Protein purification systems]]&lt;br /&gt;
*[[unmapping]]&lt;br /&gt;
*[[ Colab Biomaterials]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Some ideas how to categorize them are below (feel free to modify) --- and you can move your hackpads to this place! &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Community vs Closed projects - community projects need leaders (from Biocurious)&amp;lt;br&amp;gt;&lt;br /&gt;
Active vs Past Projects&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Projects]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._84&amp;diff=19936</id>
		<title>Openhackuarium vol. 84</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._84&amp;diff=19936"/>
		<updated>2026-11-04T10:18:05Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category OpenHackuarium&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''[[Open_Hackuarium|#OpenHackuarium]] no. 84'''&amp;lt;br&amp;gt;&lt;br /&gt;
* Main language this week: '''French'''&amp;lt;br&amp;gt;&lt;br /&gt;
* Date : Mardi 9 février 2016. Ouverture des portes à 19h, présentation à 20h.&lt;br /&gt;
&lt;br /&gt;
Exceptionnellement, la soirée #OpenHackuarium no. 84 aura lieu un mardi soir.&lt;br /&gt;
&lt;br /&gt;
== Presentations ==&lt;br /&gt;
&lt;br /&gt;
Clément Epié et Nicolas Loubet de [http://www.cellabz.com Cellabz] viennent nous visiter de Paris et nous donner un aperçu de ce qui les intéresse ces jours. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bitcoin for Dummies, (Bio)Hackers and Dreamers. Pourquoi Bitcoin est aussi intéressant à hacker, détourner, remixer dans les lieux d'innovation ouverte?'''&lt;br /&gt;
&lt;br /&gt;
Ils nous feront une masterclass de maximum 30 minutes pour donner les bases de blockchain pour des profils variés, en partant de l'expérience du Plantoid pour avoir une conversation sur les hybridations entre informatique, robotique, biologie.&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._83&amp;diff=19935</id>
		<title>Openhackuarium vol. 83</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._83&amp;diff=19935"/>
		<updated>2026-11-04T10:17:49Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category OpenHackuarium&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''[[Open_Hackuarium|#OpenHackuarium]] no. 83'''&amp;lt;br&amp;gt;&lt;br /&gt;
* Main language this week: '''English'''&amp;lt;br&amp;gt;&lt;br /&gt;
* Date : '''Wed., Feb. 3rd, 2016. Doors opening 7pm''', presentations at 7.30pm&lt;br /&gt;
&lt;br /&gt;
== Presentations ==&lt;br /&gt;
&lt;br /&gt;
'''Biodesign.cc Winterschool'''&lt;br /&gt;
&lt;br /&gt;
The BRAAVOO Workshop and Creative Design Course visits hackuarium - come meet and mingle with a transdisciplinary group of participants mid-way through a week-long workshop on bioreporters and DIY fluorescence measurement devices taking place at UNIL. &lt;br /&gt;
&lt;br /&gt;
More information [http://wiki.biodesign.cc/wiki/Winter_School here].&lt;br /&gt;
&lt;br /&gt;
'''“E-Zetoon- the social network of the educational connected trees” based on high-tech [cloud]'''&lt;br /&gt;
&lt;br /&gt;
Sara Benmohammed will present E-Zetoon&lt;br /&gt;
&lt;br /&gt;
A short description by her:&lt;br /&gt;
&lt;br /&gt;
-The E-Zetoon project was thought by Mehdi Karim who is the responsible of Makerium in Casablanca.&lt;br /&gt;
Makerium is a platform powered by a large group of technologist that increases knowledge, sharing and adoption of what works to generalize technology. &lt;br /&gt;
Makerium was financed by the American ambassy. It already has projects in collaboration with the American ambassy and pharmaceutical laboratories.&lt;br /&gt;
&lt;br /&gt;
-The idea is to use a database (example: MySQL, ...) stored in the cloud open source (example: openstack, …easy access to the data and storage).&lt;br /&gt;
The database would be filled and then updated automatically by data (temperature, Azote, Oxygene, sun, localisation, ...) coming from sensors (low cost) with the help of an algorithm.&lt;br /&gt;
&lt;br /&gt;
'''Circadian Life : A Smartphone App to study our daily activity'''&lt;br /&gt;
&lt;br /&gt;
Since the dawn of time, the earth rotation on its axis and around the sun imposes to all living creatures daily changes and seasonal variations. These changes imply light-dark cycles, temperatures changes, and food availability or predators presence. In an evolutionary scale, all living creatures needed to anticipate those changes in order to develop an efficient survival strategy. In humans our internal clock control several behaviors, such as sleep-wake cycle, food intake, hormonal cycle, and immunity. Thus, it’s essential to understand our rhythm on a daily basis for increasing our ability to live in a healthy state. Nowadays, the field of chronobiology is evolving, and its latest developments are important in chrono-therapy (when should one take a specific drug to fight a disease more efficiently) and chrono-nutrition (when should one eat to stay in a healthy state).&lt;br /&gt;
&lt;br /&gt;
The goal of this smartphone app is to record our activity through the phone sensors as accelerometer, light and GPS in an automatized manner. The personal data will be accessible to each user, in order to understand their own rhythm and anonymized for population scale analysis. In addition we, provide some thematic survey in order to know the age, sex, height, and weight of each user, and other relevant information for our statistical analysis. We will develop and include other functionalities in the future such as compatibility with wearables and other surveys about emotions, or food intake. &lt;br /&gt;
&lt;br /&gt;
Link to App prototype (for android only):&lt;br /&gt;
[http://upnaesrv2.epfl.ch/circadian.life.apk Circadian Life]&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._77&amp;diff=19934</id>
		<title>Openhackuarium vol. 77</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._77&amp;diff=19934"/>
		<updated>2026-11-04T10:17:32Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category OpenHackuarium&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Fondue de fin d'année=&lt;br /&gt;
&lt;br /&gt;
==La recette==&lt;br /&gt;
&lt;br /&gt;
Rien de plus simple.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour 4 personnes:&lt;br /&gt;
&lt;br /&gt;
* 800 grammes de mélange à fondue maison de la [http://www.lacote.ch/articles/regions/district-de-morges/la-longue-histoire-d-amour-de-jacques-alain-dufaux-avec-le-fromage-269951 fromagerie Dufaux] à Morges&lt;br /&gt;
* du bon vin blanc, en l'occurrence la cuvée &amp;quot;Les Murailles&amp;quot; de [http://www.badoux-vins.ch Badoux vins] à Aigle, médaille d'or à Expovina, Concours international de vins 2015, Zurich et médaille d'argent au Mondial du Chasselas 2015, Aigle (comme de par hasard).&lt;br /&gt;
* du bon pain&lt;br /&gt;
* une pincée de bonne humeur (ou un verre de kirsch)&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._6&amp;diff=19933</id>
		<title>Openhackuarium vol. 6</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._6&amp;diff=19933"/>
		<updated>2026-11-04T10:17:14Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: updated categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Agenda of the General Assembly'''&lt;br /&gt;
&lt;br /&gt;
Date: Wednesday, August 13th 2014, 19.30-21.00pm&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Place: UniverCité&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour rappel, les status de l'association Hackuarium sont disponibles [[Statuts_Association_Hackuarium | ici]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
As a reminder, the status of the Hackuarium association can be found [[Statuts_Association_Hackuarium | here]] (in French only).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Composition=&lt;br /&gt;
&lt;br /&gt;
==Chair==&lt;br /&gt;
*Luc as co-founder&lt;br /&gt;
&lt;br /&gt;
==Present==&lt;br /&gt;
&lt;br /&gt;
*Yann - co-fondateur&lt;br /&gt;
*Yann - Bidouilleur&lt;br /&gt;
*Patrick - Intéressé à farci&lt;br /&gt;
*Guy Mayor - Retraité bidouiller&lt;br /&gt;
*Guillaume - Architecte&lt;br /&gt;
*Carmello - Déménageur, co-fondateur UniverCité&lt;br /&gt;
*Michal - Anthropologue, étudie le groupe&lt;br /&gt;
*Anne-Laure - Thésarde biologie, intéressée au bioart&lt;br /&gt;
*Jonathan - Bioinformaticien&lt;br /&gt;
*Michel - Biologiste retraité&lt;br /&gt;
*Xavier - Designer interface numérique&lt;br /&gt;
*Maxime - Crowdunfing, entrepreneur à UniverCité&lt;br /&gt;
*Davide - Biologie Startupeur, senseur microbiologie.&lt;br /&gt;
&lt;br /&gt;
[[Category:Board Meetings]]&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._136&amp;diff=19932</id>
		<title>Openhackuarium vol. 136</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._136&amp;diff=19932"/>
		<updated>2026-11-04T10:16:29Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: updated categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Agenda of the General Assembly'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Date: Mercredi 8 février 2017, 19h30-21h30&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Date: Wednesday, February 8th 2017, 19.30-21.30&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lieu: 1er étage Ateliers de Renens, Chemin du Closel 5&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Place:  1st floorAteliers de Renens, Chemin du Closel 5&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour rappel, les status de l'association Hackuarium sont disponibles [[Statuts_Association_Hackuarium | ici]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
As a reminder, the status of the Hackuarium association can be found [[Statuts_Association_Hackuarium | here]] (in French only).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Note: Cette assemblée générale sera tenue principalement en français si la majorité des membres présents n'y voit pas d'inconvénient. Tout membre est libre de parler dans sa langue de prédilection, sachant que la majorité parle français et anglais. La documentation ci-dessous est en anglais pour permettre aux participants qui ne parleraient pas le français de prendre connaissance des sujet. Si vous ne parlez pas l'anglais, n'hésitez-pas à demander une traduction de cet agenda au comité de l'association. Nous nous efforceront de répondre aux requêtes, dans la mesure de nos moyens.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice: This General Assembly will be mostly held in French, as long as the majority of members feels comfortable with it. If you do not speak any French, the following document contains all points at the agenda. If you have any question, please contact the committee.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=Composition=&lt;br /&gt;
&lt;br /&gt;
==Chair==&lt;br /&gt;
*Luc as president&lt;br /&gt;
&lt;br /&gt;
==Present==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Excused==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=Items=&lt;br /&gt;
==Welcome address==&lt;br /&gt;
(Luc, 2 min)&lt;br /&gt;
&lt;br /&gt;
==Approval of Financial Statement + Board Discharge==&lt;br /&gt;
'''Luc''' (5min)&lt;br /&gt;
&lt;br /&gt;
===Financial statement===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Label !! In !! Out !!Total&lt;br /&gt;
|-&lt;br /&gt;
|Solde du compte || style=&amp;quot;text-align:right;&amp;quot; | 3,754.95 || ||&lt;br /&gt;
|-&lt;br /&gt;
|Cotisations 2016 || style=&amp;quot;text-align:right;&amp;quot; | 5,900 || ||&lt;br /&gt;
|-&lt;br /&gt;
|Dons 2016 || style=&amp;quot;text-align:right;&amp;quot; | 62.25 || ||&lt;br /&gt;
|-&lt;br /&gt;
|Cartes 2016 || style=&amp;quot;text-align:right;&amp;quot; | 350 || ||&lt;br /&gt;
|-&lt;br /&gt;
|Projets 2016 || style=&amp;quot;text-align:right;&amp;quot; | 6,376.45 || ||&lt;br /&gt;
|-&lt;br /&gt;
|'''Total In''' || '''style=&amp;quot;text-align:right;&amp;quot; | 12,388.25''' || ||&lt;br /&gt;
|-&lt;br /&gt;
|Soutien aux projects || || style=&amp;quot;text-align:right;&amp;quot; | 4,723.6 ||&lt;br /&gt;
|-&lt;br /&gt;
|Minigrants || || style=&amp;quot;text-align:right;&amp;quot; | 673.74 ||&lt;br /&gt;
|-&lt;br /&gt;
|Biochinage || || style=&amp;quot;text-align:right;&amp;quot; | 239.03 ||&lt;br /&gt;
|-&lt;br /&gt;
|Evénements || || style=&amp;quot;text-align:right;&amp;quot; | 800.2 ||&lt;br /&gt;
|-&lt;br /&gt;
|Food and Drinks || || style=&amp;quot;text-align:right;&amp;quot; | 1,015.5 ||&lt;br /&gt;
|-&lt;br /&gt;
|UCmakerspace || || style=&amp;quot;text-align:right;&amp;quot; | 150 ||&lt;br /&gt;
|-&lt;br /&gt;
|Matériel et consommables || || style=&amp;quot;text-align:right;&amp;quot; | 2,568.53 ||&lt;br /&gt;
|-&lt;br /&gt;
|Website || || style=&amp;quot;text-align:right;&amp;quot; | 32.5 ||&lt;br /&gt;
|-&lt;br /&gt;
|Frais divers || || style=&amp;quot;text-align:right;&amp;quot; | 549 ||&lt;br /&gt;
|-&lt;br /&gt;
|Frais bancaires || || style=&amp;quot;text-align:right;&amp;quot; | 46.2 ||&lt;br /&gt;
|-&lt;br /&gt;
|'''Total Out''' ||  || '''style=&amp;quot;text-align:right;&amp;quot; | 10,798.3''' ||&lt;br /&gt;
|-&lt;br /&gt;
|'''Exercice 2016''' ||  ||  || '''style=&amp;quot;text-align:right;&amp;quot; | 5,645.35'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Board Discharge===&lt;br /&gt;
&lt;br /&gt;
The composition of the board since the last general assembly (January 2016) was as follow:&lt;br /&gt;
&lt;br /&gt;
* President &amp;amp; Treasurer: [[User:luchenry | Luc Henry]]&lt;br /&gt;
* Secretary: [[User:mmastern | Michal Masternak]] (resigned in June 2016)&lt;br /&gt;
* Lab Manager: [[User:hekkcess | Yann Pierson]]&lt;br /&gt;
* Information technology &amp;amp; Infrastructure: [[User:Sam | Sam Sulaimanov]]&lt;br /&gt;
* Art and Design coordinator: [[User:Vlorenzo | Vanessa Lorenzo]]&lt;br /&gt;
* Talent scout and evangelist: [[User:Randogp | Gianpaolo Rando]]&lt;br /&gt;
* Events and coordinator: [[User:Alpittet | Anne-Laure Pittet]]&lt;br /&gt;
* Member: Ana Roldan&lt;br /&gt;
&lt;br /&gt;
== General updates ==&lt;br /&gt;
&lt;br /&gt;
===Status of UniverCité===&lt;br /&gt;
&lt;br /&gt;
The notes of the meeting with Benoît Dubuis, President of Inartis Foundation can be found [[20170119_Meeting_with_BD | here]].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have an open consultation in order for the board to be able to give feedback before the end of February. A meeting dedicated to this issue will be organised.&lt;br /&gt;
&lt;br /&gt;
===Future===&lt;br /&gt;
The space will probably look like this:&lt;br /&gt;
[[File:Hkrm_pro_instr-01.png|400px|thumb|center|possible plan]]&lt;br /&gt;
[[File:UC.PNG|400px|thumb|center|2nd lvl plan]]&lt;br /&gt;
&lt;br /&gt;
== Update Association ==&lt;br /&gt;
&lt;br /&gt;
At this point, it is clear that Hackuarium needs to reposition itself according to the needs and vision of its community. During 1 hour, we will discuss the philosophy, the role and the format of the association and it's activities. These points were rapidly discussed at the last board meeting but the whole community needs to get involved.&lt;br /&gt;
&lt;br /&gt;
We should absolutely talk about all the following points, and stick to a 1-hour discussion. Any discussion running for too long will be interrupted and another meeting planned to discuss in more details.&lt;br /&gt;
&lt;br /&gt;
'''Collab notes can be done live together [https://docs.google.com/document/d/1DHlhYFJPlTMNnw5OS7FpLSkYWG-bmn08qlcd62Yxab8/edit?usp=sharing on this google doc]'''&lt;br /&gt;
&lt;br /&gt;
=== Philosophy ===&lt;br /&gt;
&lt;br /&gt;
In this section we will discuss what is the unique '''philosophy''' of Hackuarium.&lt;br /&gt;
*What makes our initiatives different from other initiatives in science, education, innovation, entrepreneurship&lt;br /&gt;
*Why are we interested in doing the things we do the way we do them?&lt;br /&gt;
*Should everyone pledge to support this philosophy first, and then their personal interest?&lt;br /&gt;
&lt;br /&gt;
=== Role ===&lt;br /&gt;
&lt;br /&gt;
In this section we will discuss what is the unique ''' value proposition''' for Hackuarium.&lt;br /&gt;
*What role should the association have in this context?&lt;br /&gt;
*Who composes the target audience? What is the added value for individuals?&lt;br /&gt;
*What added value the association has for other initiatives like Octanis, Biodesign, etc.?&lt;br /&gt;
*Who gets the credit? This has been a major issue over the past few months and need to be clarified.&lt;br /&gt;
&lt;br /&gt;
=== Governance ===&lt;br /&gt;
&lt;br /&gt;
In this section we will discuss what what is the best way to reach these ''' goals'''.&lt;br /&gt;
*Where can we best get advice on this issue? This problem has been building and killing communities in the past. Who can we contact to get some insights on best practices?&lt;br /&gt;
*How to have a community-driven association while ensuring that milestones are achieved? The football team vs autonomous approach?&lt;br /&gt;
*How to best collaborate with &lt;br /&gt;
*How to deal best with representation?&lt;br /&gt;
*Should Hackuarium have '''any''' form of central control or not? (Example: one project has a media appearance planned. Should the board member responsible for communication give a green light?)&lt;br /&gt;
&lt;br /&gt;
=== Format ===&lt;br /&gt;
&lt;br /&gt;
In this section we will discuss what is the '''concrete actions''' Hackuarium members should take to fulfil the role of the association and respect its philosophical goals.&lt;br /&gt;
*What sort of activities should be organised by Hackuarium?&lt;br /&gt;
*What should be the message to the outside world (media, public)?&lt;br /&gt;
*Who should be responsible for these activities?&lt;br /&gt;
*The board thinks it is a good idea take pictures of all members and paste them on the wall to create a portfolio of participants.&lt;br /&gt;
*We also created a wall for tasks -&amp;gt; Sam can explain the concept.&lt;br /&gt;
*We would like to work more on common projects -&amp;gt; to gather members around common goals&lt;br /&gt;
&lt;br /&gt;
== Update Projects ==&lt;br /&gt;
&lt;br /&gt;
Any project that wish to present an update should do so at this point.&lt;br /&gt;
&lt;br /&gt;
== New members and onboarding ==&lt;br /&gt;
&lt;br /&gt;
* How to join?&lt;br /&gt;
&lt;br /&gt;
 - write to hello@hackuarium.ch &amp;lt;br&amp;gt;&lt;br /&gt;
 - read [[I m new |this page]] about joining &amp;lt;br&amp;gt;&lt;br /&gt;
 - pay monthly fee (20 CHF per month) &amp;lt;br&amp;gt;&lt;br /&gt;
 - ask for a card&lt;br /&gt;
&lt;br /&gt;
* New members?&lt;br /&gt;
&lt;br /&gt;
Anyone willing to join now? Go talk to [[user:Luchenry | Luc]]&lt;br /&gt;
&lt;br /&gt;
==Election: Board==&lt;br /&gt;
(Yann P, 5min)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The composition of the board will be re-evaluated at this general assembly. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- What it means to be part of the board has to be decided by the board.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Renewals===&lt;br /&gt;
&lt;br /&gt;
Toutes les positions sont à repourvoir. Veuillez vous annoncer auprès d'un membre du comité si vous désirez être sur la liste des candidats.&lt;br /&gt;
&lt;br /&gt;
Les rôles des members du comité seront distribués à la prochaine réunion et communiqués par email à tous les membres.&lt;br /&gt;
&lt;br /&gt;
===New Candidates===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Auditeurs comptes===&lt;br /&gt;
&lt;br /&gt;
We need independent (not board members) accountants to verify the association accounts for validation.&lt;br /&gt;
&lt;br /&gt;
==Closing remarks==&lt;br /&gt;
&lt;br /&gt;
===Next events===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Open Discussion=&lt;br /&gt;
&lt;br /&gt;
==Other topics of discussion outside the scope of the general assembly==&lt;br /&gt;
&lt;br /&gt;
[[Category:Board Meetings]]&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._128&amp;diff=19931</id>
		<title>Openhackuarium vol. 128</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._128&amp;diff=19931"/>
		<updated>2026-11-04T10:14:52Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category OpenHackuarium&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Fondue Night'''&lt;br /&gt;
&lt;br /&gt;
Date: Wednesday, December 14th, 19.30-22.30pm&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Place: UniverCité&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please sign up [http://doodle.com/poll/k9bq9p7vsb6c629c here] if you are planning to eat cheese!&amp;lt;br&amp;gt;&lt;br /&gt;
Everyone welcome, friends, partners, strangers, as long as you all sign up '''before December 10th'''!&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2017 will be a crazy year in many ways. The whole of UniverCité will be restored and there will be some changes. In preparation for the [[Openhackuarium_vol._136 | General Assembly]] that will take place on Wednesday 8th February 2017, we will discuss your ideas and expectations. The brainstorm session will be followed by a fondue.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can contribute ideas for the brainstorm [https://docs.google.com/spreadsheets/d/1wuJVnp7Y08DAIHExxeZGa8E9qAiQVxiBm8gcvMLftBk/edit#gid=0 here].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._127&amp;diff=19930</id>
		<title>Openhackuarium vol. 127</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._127&amp;diff=19930"/>
		<updated>2026-11-04T10:14:33Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category OpenHackuarium&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Presentation Co-Lab + EPFL + Hackuarium workshop:&lt;br /&gt;
&lt;br /&gt;
19:30h. HELLO, INTRO (Vanessa Hackuairum)&lt;br /&gt;
&lt;br /&gt;
19:40h. PRESENTATION WORKSHOP BIOMATERIALS&lt;br /&gt;
Lena Asai (Co-lab)&lt;br /&gt;
&lt;br /&gt;
19:50h. Juliette Lenouvel (CRI Paris)&lt;br /&gt;
&lt;br /&gt;
20:00h. Vanessa (Hybridoa, Bioprint)&lt;br /&gt;
&lt;br /&gt;
20:10h. Demo&lt;br /&gt;
&lt;br /&gt;
20:30h. Apero, Jus, Bieres, etc&lt;br /&gt;
&lt;br /&gt;
Cheers! Sante!&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._122&amp;diff=19929</id>
		<title>Openhackuarium vol. 122</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._122&amp;diff=19929"/>
		<updated>2026-11-04T10:14:16Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category OpenHackuarium&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Main language this week: '''French'''&amp;lt;br&amp;gt;&lt;br /&gt;
* Theme : '''Epidemium et Echopen: quand l'Open Source s'intéresse à la Pharma et la Medtech'''&lt;br /&gt;
* Date : '''Mercredi 2 novembre 2016. L'espace est ouvert dès 19h''', les présentations auront lieu à 19h30&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'occasion de l'#OpenHackuarium vol. 122, nous aurons l'occasion de découvrir deux projets exceptionnels en provenance de Paris.&lt;br /&gt;
&lt;br /&gt;
Sign-up and a summary in English available [https://www.meetup.com/hackuarium/events/235066235/ here].&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
=Présentation des projets=&lt;br /&gt;
&lt;br /&gt;
Information in English is available on the websites of the projects. Just follow the links.&lt;br /&gt;
&lt;br /&gt;
==Epidemium==&lt;br /&gt;
&lt;br /&gt;
'''[http://www.epidemium.cc Epidemium]''' est un programme de recherche scientifique participatif et ouvert dédié à la compréhension du cancer grâce aux Big Data qui s'est concrétisé sous la forme d’un Challenge4Cancer (C4C) du 5 novembre 2015 au 5 mai 2016. &lt;br /&gt;
&lt;br /&gt;
Né de la rencontre entre La Paillasse, laboratoire communautaire parisien et Roche, laboratoire pharmaceutique spécialisé dans le traitement contre le cancer, ce programme d'Open Science a pour ambition d'apporter de nouvelles réponses, de nouvelle approches aux grands challenges posés en épidémiologie du cancer, grâce aux communautés ouvertes et à l'intelligence collective.&lt;br /&gt;
&lt;br /&gt;
Utilisant uniquement des données ouvertes (Open Data) ainsi que des outils et des méthodologies inspirées par l'univers du libre, le programme à récompensé 8 approches nouvelles réparties dans 4 thématiques que vous pouvez découvrir sur le [http://wiki.epidemium.cc/wiki/Projets wiki] du projet. Une analyse de cette première édition du programme Epidemium est disponible [http://review.epidemium.cc ici].&lt;br /&gt;
&lt;br /&gt;
==EchOpen==&lt;br /&gt;
&lt;br /&gt;
'''[http://echopen.org/ EchOpen]''' est une communauté ouverte et collaborative, animée par un noyau pluridisciplinaire d'experts et de professionnels de haut niveau, ayant pour but de concevoir un Echo-Stéthoscope (sonde échographique) Ultra-Portable, Low-Cost et Open Source, assurant l'obtention d'une image echo-anatomique au moyen d'une sonde open hardware reliée à un smartphone ou une tablette quelconque.&lt;br /&gt;
&lt;br /&gt;
Permettant, la transformation radicale de l'orientation diagnostique en médecine hospitalière, en médecine générale et en zone sous-médicalisée (pays en voie de développement, déserts médicaux, etc.), le projet réunis aujourd'hui plus de 200 contributeurs (ingénieurs, chercheurs, designers, juristes et un tiers de professionnels de santé de différentes spécialités). Après l’obtention d’un premier prototype et d’une première image écho-anatomique le 24 mars 2016, la communauté met désormais le cap sur un nouveau prototype de qualité médicale.&lt;br /&gt;
&lt;br /&gt;
Soutenu par de nombreux acteurs académiques, universitaires, médicaux et professionnels, le projet est installé au coeur de l'hôpital Hotel Dieu et accueil en résidence tous ceux qui souhaitent contribuer à cette aventure d'un nouveau genre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Biographie des intervenants=&lt;br /&gt;
&lt;br /&gt;
Tous deux co-coordinateurs et co-fondateur des deux projets Epidemium &amp;amp; echOpen&lt;br /&gt;
&lt;br /&gt;
==Olivier de Fresnoye==&lt;br /&gt;
&lt;br /&gt;
'''Olivier de Fresnoye''' est un spécialiste du développement humanitaire et de la gestion de projets collaboratifs et communautaires. Fort d'une double formation scientifique et économique, il a développé de nombreux projets innovants faisant appel à l'intelligence collective pour répondre à de grands défis de notre temps. Par ailleurs, il participe à plusieurs groupes de travail sur les nouvelles technologies et leurs apports sociétaux.&lt;br /&gt;
&lt;br /&gt;
==Mehdi Benchoufi==&lt;br /&gt;
&lt;br /&gt;
'''Mehdi Benchoufi''' est médecin de santé publique à l'Hôpital Hôtel Dieu, agrégé de mathématiques, il fonde en 2009 le Club JADE, un think tank dédié aux enjeux socio-politiques du Numérique : Open Culture, co-création, eDémocratie, Big Data, Blockchain, etc. Parmi les nombreux projets auxquels il travaille, figure la mise au point de technologies médicales de pointe en Open Source, en vue de les rendre accessibles et gratuites partout où se peut.&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._120&amp;diff=19928</id>
		<title>Openhackuarium vol. 120</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._120&amp;diff=19928"/>
		<updated>2026-11-04T10:13:30Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category OpenHackuarium&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Main language this week: '''French'''&amp;lt;br&amp;gt;&lt;br /&gt;
* Theme : '''Dessine moi un UC'''&lt;br /&gt;
* Date : '''Wednesday October 19th, 2016. From 7.30pm'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._116&amp;diff=19927</id>
		<title>Openhackuarium vol. 116</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._116&amp;diff=19927"/>
		<updated>2026-11-04T10:13:14Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category OpenHackuarium&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Main language this week: '''English+French'''&amp;lt;br&amp;gt;&lt;br /&gt;
* Theme : '''Hackuarium for dummies (and life science students).'''&lt;br /&gt;
* Date : '''Wednesday September 21st, 2016. From 7pm'''&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
=19:30 - Intro and Welcome=&lt;br /&gt;
&lt;br /&gt;
Luc, 5 min &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The evening will be busy busy! Programme chargé donc pour cette 116ème édition de l'OpenHackuarium. Et voilà le menu!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=19:35 - What is Hackuarium?=&lt;br /&gt;
&lt;br /&gt;
Luc, 10 min, in English &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 19:45 - Project Updates: 3 slides = 3 minutes==&lt;br /&gt;
&lt;br /&gt;
To give everyone an overview of what is happening at UniverCité, we asked several people to present their project in 3 slides or 3 minutes. So here are the contestants:&lt;br /&gt;
&lt;br /&gt;
===WaterDrop===&lt;br /&gt;
&lt;br /&gt;
Laure et Fabiana de BangBang Agency nous ont déjà parlé de leur envie d'amener un peu de science sur le bateau de Mike Horn pendant son expédition [http://www.mikehorn.com/pole-2-pole/ Pole2Pole]. Elles nous en diront plus sur l'avancée du concept et leur envie de faire participer Hackuarium, mais aussi des citoyens du monde entier dans une grande expérience.&lt;br /&gt;
&lt;br /&gt;
===Spectrophotometer===&lt;br /&gt;
&lt;br /&gt;
Océane Patiny &lt;br /&gt;
&lt;br /&gt;
===OpenBioreactor===&lt;br /&gt;
&lt;br /&gt;
Luc, Quentin and Alexandre&lt;br /&gt;
&lt;br /&gt;
===Octanis===&lt;br /&gt;
&lt;br /&gt;
?&lt;br /&gt;
&lt;br /&gt;
===Beer decoded===&lt;br /&gt;
&lt;br /&gt;
Gianpaolo&lt;br /&gt;
&lt;br /&gt;
===WaterQuality===&lt;br /&gt;
&lt;br /&gt;
Rachel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=20:15 - Apéromix=&lt;br /&gt;
&lt;br /&gt;
in French&lt;br /&gt;
&lt;br /&gt;
L'édition 2016 de [http://www.museomix.ch/en/ Museomix] aura lieu les 11, 12 et 13 Novembre dans deux musées suisses, à Bâle et Nyon. Une occasion en or de hacker les collection de l'Historisches Museum Basel et du Musée du Léman. Comment? Eh bien venez participer à cet Apéromix exceptionnel et écouter ce que l'équipe Muséomix aura à vous raconter.&lt;br /&gt;
&lt;br /&gt;
Plus d'informations [http://www.museomix.ch/en/2016/09/aperomix-in-uc-on-the-21th-of-september/ ici].&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._113&amp;diff=19926</id>
		<title>Openhackuarium vol. 113</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._113&amp;diff=19926"/>
		<updated>2026-11-04T10:12:54Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category OpenHackuarium&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Main language this week: '''French'''&amp;lt;br&amp;gt;&lt;br /&gt;
* Theme : '''Fuels from plastics: a DIY approach to recycling'''&lt;br /&gt;
* Date : '''Wednesday, September 7th, 2016. Doors open at 7.30pm''', presentations at 8 pm&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yep Ladies and Gentlemen you read it right, for our OH113 we'll present you a project of plastic melting and fractionation to hydrocarbons, the main components of gazoline. We'll discuss how the main technique works and possible alternatives to analyse and separate the extracted gases. We're sure you are going to love this one and are waiting for all of you on Wednesday!&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - &lt;br /&gt;
&lt;br /&gt;
Oui Mesdames et Messieurs vous l'avez bien lu, pour notre OH113 nous vous présenterons un projet de fonte et de séparation du plastique en hydrocarbures, les principaux composants de la benzine. Nous vous présenterons comment la technique principale fonctionne et quelles alternatives pourraient êtres utilisées pour séparer les gaz extraits. Nous sommes sur que vous allez apprécier cet événement et nous vous attendons tous mercredi prochain!&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._111&amp;diff=19925</id>
		<title>Openhackuarium vol. 111</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._111&amp;diff=19925"/>
		<updated>2026-11-04T10:12:25Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category OpenHackuarium&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Who's presenting:''' Sam Sulaimanov, TTN Community Initiator Lausanne&lt;br /&gt;
&lt;br /&gt;
'''Main Language:''' English&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''What:'''&lt;br /&gt;
The Things Network is a global, open, crowd-sourced Internet of Things data network. It uses the LoRaWAN network technology to provide low power wireless connectivity over long range&lt;br /&gt;
Typically the range can reach up to 20km in free space.&lt;br /&gt;
&lt;br /&gt;
This OpenHackuarium we focus on the history and the current applications of the Things Network by looking at the very active community of Zurich who have enabled LoRa reception in most places in and around Zurich. A true community-built internet access network! The network consists of gateways (think: router at your home) and nodes (your Arduino, Raspberry Pi...). Nodes send data to the network of gateways deployed by the community.&lt;br /&gt;
&lt;br /&gt;
Come and join us if you want to learn more on how to use the network or even setup your own gateway. The Lac Leman area needs to really build up coverage :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Screen Shot 2016-08-10 at 17.33.08.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Everything that carries power will be connected to Internet eventually.&lt;br /&gt;
&lt;br /&gt;
Controlling the network that makes this possible means controlling the world. We believe that this power should not be restricted to a few people, companies or nations. Instead this should be distributed over as many people as possible without the possibility to be taken away by anyone. We therefore founded &amp;quot;The Things Network&amp;quot;.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- [https://github.com/TheThingsNetwork/Manifest The Things Network Manifesto]&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._100&amp;diff=19924</id>
		<title>Openhackuarium vol. 100</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._100&amp;diff=19924"/>
		<updated>2026-11-04T10:11:57Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category OpenHackuarium&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hackuarium fête ses deux premières années d'existence!&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A cette occasion, nous voulons vous inviter&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''MERCREDI 1er JUIN dès 19H'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
dans notre laboratoire de Renens pour la 100ème soirée consécutive ouverte au public.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En plus de la maintenant traditionnelle bière de La Nébuleuse et de la &amp;quot;finger food&amp;quot; qui l'accompagnera, nous vous offrirons un récapitulatif de l'aventure Hackuarium au travers de présentations des projets passés et en cours.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Durant la soirée, vous aurez aussi l'occasion de visiter l'atelier Made@ d'UniverCité qui est ouvert à tous pour l'European Maker Week, tous les jours du Lundi 30 mai au Vendredi 3 juin de 10h. à 22h. Une occasion de découvrir les infrastructures à disposition, comme l'impression 3D, la découpe laser et autres machines-outils manuelles ou pilotées par ordinateur.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Les membres du hackerspace voisin de FixMe organisent le même soir une course de drones volants au premier étage du bâtiment. Une occasion de découvrir ce nouveau sport.&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Welcome_protocols&amp;diff=19923</id>
		<title>Welcome protocols</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Welcome_protocols&amp;diff=19923"/>
		<updated>2026-11-04T10:09:06Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category Administration&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;='''How to welcome?'''=&lt;br /&gt;
&lt;br /&gt;
Once the future member has written to '''hello@hackuarium.ch''':&lt;br /&gt;
&lt;br /&gt;
==We send the following info==&lt;br /&gt;
&lt;br /&gt;
Hello 'newbie',&lt;br /&gt;
&lt;br /&gt;
'''Great news!  Welcome to the Hackuarium community!'''&lt;br /&gt;
&lt;br /&gt;
*'''Members of Hackuarium''' have access 24/7 to our lab and some open facilities of [https://univercite.ch/ UNIVERCITE]: kitchen, chill area, and even fancy meeting rooms at MassChallenge.  Access to our #dirtylab or Makerspace on Wednesday nights and Friday the whole day, where Marc Wettstein is the manager and will give you an introductory course to all the machines / security course (20CHF), is also included.&lt;br /&gt;
&lt;br /&gt;
*[http://wiki.hackuarium.ch/w/Open_Hackuarium #OpenHackuarium ] night is yours if you want to do a short presentation (around 10-15 min), check for an available Wednesday here [https://calendar.google.com/calendar/embed?src=mgvq9goephpmna0kb7rj9ipei8%40group.calendar.google.com&amp;amp;ctz=Europe/Zurich '''google calendar''']&lt;br /&gt;
&lt;br /&gt;
*'''We are friends''' of FIXME and FABLAB (electronic hackers' and fabbers' community right close to us), so if you need something from them, ask them personally, they will be happy to inform and help you.&lt;br /&gt;
&lt;br /&gt;
*'''For paying the membership fee of 20CHF/month, here are the details:'''&lt;br /&gt;
&lt;br /&gt;
Association Hackuarium &amp;lt;br&amp;gt;&lt;br /&gt;
Chemin du Closel 5&amp;lt;br&amp;gt;&lt;br /&gt;
1020 Renens&amp;lt;br&amp;gt;&lt;br /&gt;
Compte Banque Alternative Suisse&amp;lt;br&amp;gt;&lt;br /&gt;
334.153.100-03 / CHF&amp;lt;br&amp;gt;&lt;br /&gt;
IBAN CH59 0839 0033 4153 1000 3&amp;lt;br&amp;gt;&lt;br /&gt;
BIC ABSOCH22&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''A card''' will give you access of 7/24 to the building and costs 50 CHF (one unique payment) - we reimburse this money directly to the provider UNIVERCITE.&lt;br /&gt;
&lt;br /&gt;
Looking forward to seeing you!&lt;br /&gt;
&lt;br /&gt;
Best regards!&lt;br /&gt;
&lt;br /&gt;
Hackuarium Biohackerspace&lt;br /&gt;
[http://wiki.hackuarium.ch wiki]&lt;br /&gt;
[http://www.hackuarium.ch web]&lt;br /&gt;
[https://twitter.com/hackuarium twitter]&lt;br /&gt;
[https://www.facebook.com/hackuarium/?fref=ts facebook]&lt;br /&gt;
&lt;br /&gt;
[[Category:Administration]]&lt;br /&gt;
[[Category:Work In Progress]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Board&amp;diff=19922</id>
		<title>Board</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Board&amp;diff=19922"/>
		<updated>2026-11-04T10:06:01Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category Administration and proper link to Board meeting category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Role=&lt;br /&gt;
&lt;br /&gt;
The '''Board of the Hackuarium association''' is responsible for running the association.&lt;br /&gt;
&lt;br /&gt;
The purpose, composition, roles and tasks of the board are explicitly described in the [[Statuts_Association_Hackuarium | founding document of the association]]&lt;br /&gt;
&lt;br /&gt;
=Board meeting minutes=&lt;br /&gt;
&lt;br /&gt;
The agenda and minutes of our board meetings are available under the [[:Category:Board_Meetings|Board Meetings category]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Tasks=&lt;br /&gt;
&lt;br /&gt;
[[File:Hackuarium_board_meeting_tasks_20170215.jpg|none|500px|left|thumb|First draft of new board (5th) constituting itself around new tasks]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The tasks of the board members are up to the board itself, but the following roles and tasks have been decided:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Comité Hackuarium, liste des tâches / Hackuarium board, List of tasks:'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Président.e / President / Co-président.e.s ===&lt;br /&gt;
*Represents the association&lt;br /&gt;
*Moderates meetings&lt;br /&gt;
*Convenes the General Assembly&lt;br /&gt;
*Sign contracts on behalf of the association after consulting the board or the community&lt;br /&gt;
*Supervises association's general activities.&lt;br /&gt;
&lt;br /&gt;
===Vice-président / Vice-president===&lt;br /&gt;
&lt;br /&gt;
* Helps for all duties of president, as above&lt;br /&gt;
* Takes the place of the president, if absent&lt;br /&gt;
* Planning activities &lt;br /&gt;
* Resource maintenance&lt;br /&gt;
&lt;br /&gt;
===Trésorier / Treasurer ===&lt;br /&gt;
*Take care of all invoices and receipts&lt;br /&gt;
*Keep bank account up to date&lt;br /&gt;
*Keep membership fees up to date&lt;br /&gt;
*Take care of orders with regular suppliers&lt;br /&gt;
*Take care of dealing with and distributing minigrants&lt;br /&gt;
===Secrétaire /secretary ===&lt;br /&gt;
*Plan board meetings (dates, agenda, reminders)&lt;br /&gt;
*Plan General Assembly upon request from President&lt;br /&gt;
*Keep board meeting minutes&lt;br /&gt;
*Communication&amp;lt;br&amp;gt;&lt;br /&gt;
===Responsable de laboratoire / Lab manager===&lt;br /&gt;
*Organise space&lt;br /&gt;
*Organise maintenance&lt;br /&gt;
*Ensure proper use by members (safety, biosafety and biosecurity)&lt;br /&gt;
*Liaise with visitors of all sorts &lt;br /&gt;
&lt;br /&gt;
===Administrateur des outils web /Webmaster ===&lt;br /&gt;
*Email administration&lt;br /&gt;
*Website administration&lt;br /&gt;
*Slack maintenance and credentials&lt;br /&gt;
*Wiki administration and credentials&lt;br /&gt;
*Keep track on all web credentials (usernames and passwords)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Responsable Art&amp;amp;Design&amp;amp;Dissemination / Art&amp;amp;Design&amp;amp;Dissemination ===&lt;br /&gt;
*plan and organise art and design / STEAM initiatives&lt;br /&gt;
*accompagnement des nouveaux membres dans ce contexte&lt;br /&gt;
*dissemination and crosspollination across disciplines and associations/foundations/structures&lt;br /&gt;
n/a after Nov2021, when moved to Berlin&lt;br /&gt;
&lt;br /&gt;
n/a 2022, 2023&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Evangéliste / Talent scout===&lt;br /&gt;
&amp;lt;br&amp;gt;(to get more involved/available help for this role?)&lt;br /&gt;
*identify individuals and communities and contact them&lt;br /&gt;
*identify events to attend and Hackuarium presence&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Responsable communication / Communication manager ===&lt;br /&gt;
*Posting our events on FB, twitter, slack, meetup &amp;amp; the wiki&lt;br /&gt;
*Posting promotions on our facebook page about our activities and stuff members have done&lt;br /&gt;
*Posting about what other labs and groups have been doing (with help from delegated members)&lt;br /&gt;
*Posting about the latest biohacker/maker technologies&lt;br /&gt;
*Press relations (hello address access)&lt;br /&gt;
*Press kit updates&lt;br /&gt;
&lt;br /&gt;
===Responsable évènements /Event manager===&lt;br /&gt;
&lt;br /&gt;
*curate events&lt;br /&gt;
*plan events&lt;br /&gt;
*communicate event details with communication manager&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Community Happiness ===&lt;br /&gt;
*Check and propose improvements for [[microgrant process]] + assess community needs about them&lt;br /&gt;
*Implement Office Hours for community&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Composition=&lt;br /&gt;
&lt;br /&gt;
== Fourteenth Board ==&lt;br /&gt;
Since the most recent General Assembly meeting, the board has a couple of new members!  =)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Comité 2026  :'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Esther|Esther]] - présidente&lt;br /&gt;
&lt;br /&gt;
Michel - trésorier&lt;br /&gt;
&lt;br /&gt;
[[User:Rachel|Rachel]] - responsable de labo et bioséc&lt;br /&gt;
&lt;br /&gt;
Alicia - secrétaire&lt;br /&gt;
&lt;br /&gt;
David - Webmaster&lt;br /&gt;
&lt;br /&gt;
== Thirteenth Board ==&lt;br /&gt;
Since the [[Assemblée générale 2025|last general assembly meeting]] there are mainly continuing members of the Board.&lt;br /&gt;
&lt;br /&gt;
'''Membres du comité 2025 :'''&lt;br /&gt;
&lt;br /&gt;
[[User:Esther|Esther]] - présidente&lt;br /&gt;
&lt;br /&gt;
Michel - trésorier&lt;br /&gt;
&lt;br /&gt;
[[User:Rachel|Rachel]] - responsable de labo et bioséc&lt;br /&gt;
&lt;br /&gt;
Vanya - communications &lt;br /&gt;
&lt;br /&gt;
== Twelfth Board ==&lt;br /&gt;
Since the [[AG 2024]], we will have 8 members in the Board, and their roles were decided at the [[27mars24 board|board meeting]] on 27 March.&lt;br /&gt;
&lt;br /&gt;
[[User:Esther Calderon|Esther Calderon]], Dinesh Bolkensteyn, Vanya Loroch, Hanna Secher, &amp;lt;s&amp;gt;Olivier Emery&amp;lt;/s&amp;gt;, [[User:Rachel|Rachel Aronoff]], Michel Horisberger, Joel Christen&lt;br /&gt;
&lt;br /&gt;
The roles were set after a very good meeting:&lt;br /&gt;
&lt;br /&gt;
* co-presidents - Esther and Dinesh&lt;br /&gt;
* sécretaire - Joël&lt;br /&gt;
* biosafety officer - Rachel&lt;br /&gt;
* treasurer - Michel&lt;br /&gt;
* responsables de laboratoire - Rachel &amp;amp; Hanna&lt;br /&gt;
* IT 'website' etc -  &amp;lt;s&amp;gt;Olivier Emery&amp;lt;/s&amp;gt; ''démissionné le 29mai du comité pour manque du temps''. Dinesh et Vanya le feraient...&lt;br /&gt;
* communication - Vanya&lt;br /&gt;
* réseaux sociaux - tous&lt;br /&gt;
* Responsable art, design &amp;amp; STEAM initiatives - Hanna&lt;br /&gt;
* événements/calendrier (révivre google calendar) - tous&lt;br /&gt;
* community happiness =)  - tous&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Board members can of course delegate tasks to other members, not necessarily those in the Board.&lt;br /&gt;
&lt;br /&gt;
Also, [[User:AurélienJ|Aurélien Jobard]] has confirmed his ability to help the association in the role of Deputy Biosafety Officer.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Looking forward to a great year ahead.&lt;br /&gt;
&lt;br /&gt;
== Eleventh Board ==&lt;br /&gt;
Since the [[Assemblée générale 2023|AG 2023]], Board members only swapped in Tatiana for Masoud, and roles were decided at the [[Rénion du comité 12/04/2023|board meeting]] on 12 April.&lt;br /&gt;
&lt;br /&gt;
* President: Rachel   (Also, Participatory Research Facilitator and Biosecurity Officer)&lt;br /&gt;
* Vice-President &amp;amp; Secretary: Esther&lt;br /&gt;
* (aide)Secrétaire &amp;amp; Lien aux Communes de l'Ouest Lausannois: Joël&lt;br /&gt;
* Treasurer: Michel&lt;br /&gt;
* Webmaster: Tatiana&lt;br /&gt;
&lt;br /&gt;
==Tenth Board==&lt;br /&gt;
Since the [[Assemblée générale 2022|AG 2022]], the Board members are:&lt;br /&gt;
&lt;br /&gt;
* President: Rachel&lt;br /&gt;
* Secretary: Esther&lt;br /&gt;
* Treasurer: Michel&lt;br /&gt;
* Webmaster: Masoud&lt;br /&gt;
* (aide)Secrétaire &amp;amp; Lien aux Communes de l'Ouest Lausannois: Joël&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ninth Board==&lt;br /&gt;
Since the [[20210310 GeneralAssembly|last general assembly meeting]], the Board members are:&lt;br /&gt;
&lt;br /&gt;
* President: Rachel&lt;br /&gt;
* Secretary: Esther&lt;br /&gt;
* Treasurer: Michel&lt;br /&gt;
* (aide)Secrétaire &amp;amp; Lien aux Communes de l'Ouest Lausannois: Joël&lt;br /&gt;
* Art and Science (STEAM):  Vanessa&lt;br /&gt;
* Webmaster: Raphaël&lt;br /&gt;
* Member of the board and (aide)IT : Tatiana&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Eighth Board==&lt;br /&gt;
Since the general assembly meeting on February, 19 2020, the Board members are:&lt;br /&gt;
&lt;br /&gt;
* Rachel&lt;br /&gt;
* Esther&lt;br /&gt;
* Tatiana&lt;br /&gt;
* Olivier (renounced position June2020, new job too demanding - Masoud &amp;amp; then Michel joined in)&lt;br /&gt;
* Joël&lt;br /&gt;
* Vanessa&lt;br /&gt;
* Raphaël&lt;br /&gt;
&lt;br /&gt;
They accepted the following roles on their next board meeting 12 March 2020, one of the last times together before lockdown!&lt;br /&gt;
&lt;br /&gt;
Here they were...&lt;br /&gt;
&lt;br /&gt;
[[File:Board2020b.JPG|300px|thumb|left|in the biolab, before lockdown...]]&lt;br /&gt;
[[File:Board2020.JPG|300px|thumb|right|oh the nostalgia...]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* President: [[User: Rachel | Rachel Aronoff]]  (also Participatory Research Facilitator and Biosafety Officer)&lt;br /&gt;
* Secretary: Esther Calderon&lt;br /&gt;
* Treasurer: Michel Horisberger (Masoud Alipour as backup, during Olivier's 6 months and for mid-pandemic transfer of access to Michel)&lt;br /&gt;
* System Administrator: Tatiana Eliseeva&lt;br /&gt;
* Art and Science coordinator: [[User: Vlorenzo | Vanessa Lorenzo]] &lt;br /&gt;
* Talent scout and evangelist for Academy: Raphaël Casimir&lt;br /&gt;
* Community Happiness Coordinator and Link to the communes of the region of East Lausanne: Joël Christen&lt;br /&gt;
&lt;br /&gt;
==Seventh Board==&lt;br /&gt;
as of February, 27 2019, here are the new Board members:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Rachel&lt;br /&gt;
* Anne-Laure&lt;br /&gt;
* Vanessa&lt;br /&gt;
* Esther&lt;br /&gt;
* Olivier&lt;br /&gt;
* Masoud (as treasurer)&lt;br /&gt;
* Joël&lt;br /&gt;
* Shalf (as IT &amp;amp; Web tools steward)&lt;br /&gt;
&lt;br /&gt;
==Sixth Board==&lt;br /&gt;
as of March, 2018 the Board was made up (provisionally, from meeting 29.3.18)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* President: [[User: Rachel | Rachel Aronoff]]  (also Citizen Science coordinator and Biosafety Officer)&lt;br /&gt;
* Lab Manager: [[User: Gustavo Santamaria| Gustavo Santamaria]]&lt;br /&gt;
* Secretary and Treasurer: [[User: luchenry | Luc Henry]] for a transition period until 'shadow' secretary ready to take on roles by August 2018&lt;br /&gt;
* Shadow Treasurer: Masoud Alipour&lt;br /&gt;
* Deputy Biosafety Officer and Communications Coordinator, and Shadow Secretary: Olivier Emery&lt;br /&gt;
* Art and Science coordinator: [[User: Vlorenzo | Vanessa Lorenzo]] &lt;br /&gt;
* System Administrator: [[User:Sam | Sam Sulaimanov]]&lt;br /&gt;
* Talent scout and evangelist for Academy: [[User:Alpittet | Anne-Laure Pittet]]&lt;br /&gt;
* Talent scout and evangelist for Entrepreneurs: [[User:Randogp | Gianpaolo Rando]]&lt;br /&gt;
&lt;br /&gt;
Auditeurs comptes Anne-Laure, Eric&lt;br /&gt;
&lt;br /&gt;
==Fifth Board==&lt;br /&gt;
&lt;br /&gt;
Since the last General Assembly (February 2017), Hackuarium members serving as Board Members were: &lt;br /&gt;
&lt;br /&gt;
* Co - President: [[User: Vlorenzo | Vanessa Lorenzo]] (also Art and Design coordinator)&lt;br /&gt;
* Co - President: [[User: Rachel | Rachel Aronoff]]  (also Citizen Science coordinator)&lt;br /&gt;
* Secretary and Treasurer: [[User: luchenry | Luc Henry]]&lt;br /&gt;
* Lab Manager: [[User: Gustavo Santamaria| Gustavo Santamaria]]&lt;br /&gt;
* Online promotion:[[User: hekkcess | Yann Pierson]]&lt;br /&gt;
* System Administrator: [[User:Sam | Sam Sulaimanov]]&lt;br /&gt;
* Talent scout and evangelist for Academy: [[User:Alpittet | Anne-Laure Pittet]]&lt;br /&gt;
* Talent scout and evangelist for Entrepreneurs: [[User:Randogp | Gianpaolo Rando]]&lt;br /&gt;
* Talent scout and evangelist: [[User:Dan | Daniel Hernandez]]&lt;br /&gt;
* Community happiness, Ateliers de Renens Link: [[User: Shalf | Yann Heurtaux]]&lt;br /&gt;
&lt;br /&gt;
The new Board still has to constitute itself (i.e. decide on precise roles, based on declarations issued by elected candidates during General Assembly), according to our bylaws. It has been done during [[20170215_Board_meeting|this Board Meeting]].&lt;br /&gt;
&lt;br /&gt;
==Fourth Board==&lt;br /&gt;
&lt;br /&gt;
Since the last General Assembly (January 2016), Hackuarium members serving as Board Members are: &lt;br /&gt;
* President &amp;amp; Treasurer: [[User:luchenry | Luc Henry]]&lt;br /&gt;
* Secretary: [[User:mmastern | Michal Masternak]]&lt;br /&gt;
* Lab Manager: [[User:hekkcess | Yann Pierson]]&lt;br /&gt;
* Online tools administrator: [[User:Sam | Sam Sulaimanov]]&lt;br /&gt;
* Art and Design coordinator: [[User:Vlorenzo | Vanessa Lorenzo]]&lt;br /&gt;
* Talent scout and evangelist: [[User:Randogp | Gianpaolo Rando]]&lt;br /&gt;
* Events and coordinator: Anne-Laure Pittet&lt;br /&gt;
* Ana Roldan, Membre&lt;br /&gt;
&lt;br /&gt;
==Third Board==&lt;br /&gt;
&lt;br /&gt;
Since the last General Assembly (April 2015), Hackuarium members serving as Board Members are: &lt;br /&gt;
* President &amp;amp; Treasurer: [[User:luchenry | Luc Henry]]&lt;br /&gt;
* Vice President: [[User:Shalf | Yann Heurtaux]]&lt;br /&gt;
* Secretary: [[User:mmastern | Michal Masternak]]&lt;br /&gt;
* Lab Manager: [[User:hekkcess | Yann Pierson]]&lt;br /&gt;
* Jonathan Sobel, Membre&lt;br /&gt;
* Ana Roldan, Membre&lt;br /&gt;
* Sam Sulaimanov, Membre&lt;br /&gt;
* Clément Drevot, Membre&lt;br /&gt;
* Vanessa Lorenzo, Membre&lt;br /&gt;
* Anne-Laure Pittet, Membre&lt;br /&gt;
&lt;br /&gt;
==Second Board==&lt;br /&gt;
&lt;br /&gt;
* President &amp;amp; Treasurer: [[User:luchenry | Luc Henry]]&lt;br /&gt;
* Vice President: [[User:Shalf | Yann Heurtaux]]&lt;br /&gt;
* Secretary: [[User:mmastern | Michal Masternak]]&lt;br /&gt;
* Lab Manager: [[User:hekkcess | Yann Pierson]]&lt;br /&gt;
* Online tools: Patrick Roelli&lt;br /&gt;
* Member: Clara Moreau&lt;br /&gt;
* Member: Gavrilo Bozovic&lt;br /&gt;
&lt;br /&gt;
==Founding Board==&lt;br /&gt;
&lt;br /&gt;
* [[User:Shalf | Yann Heurtaux]]&lt;br /&gt;
* [[User:hekkcess | Yann Pierson]]&lt;br /&gt;
* [[User:mmastern | Michal Masternak]]&lt;br /&gt;
* [[User:luchenry | Luc Henry]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Administration]]&lt;br /&gt;
[[Category:Work In Progress]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Biolab&amp;diff=19921</id>
		<title>Biolab</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Biolab&amp;diff=19921"/>
		<updated>2026-11-04T10:00:36Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category Documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Hackuarium_logo15.png|100px|thumb]]&lt;br /&gt;
&lt;br /&gt;
'''Welcome to a page with information about the Hackuarium Biolab Space in Ecublens!'''&lt;br /&gt;
&lt;br /&gt;
[[LaboP1 EN|This wiki page gives more recent information in English.]] &lt;br /&gt;
&lt;br /&gt;
''[[LaboP1|Pour FR et les infos plus recentes voir ici, svp]]''&amp;lt;br&amp;gt;&lt;br /&gt;
Hackuarium has two rooms in the context of the new cooperative, the Biolab with windows, and the so-called 'inner sanctum' without windows.&lt;br /&gt;
The latter can be used for some biology work, especially higher resolution microscopy (with Raspberry Pi camera on the old Zeiss scope) and bioluminescence studies, but no growth of cultures is allowed there.&lt;br /&gt;
(there is a carpet!)&lt;br /&gt;
The overall map of our coop space is shown on the right, and below that is an updated P1 lab map. [[File:Crochy20Ecublens - spaceallocsmaller15may19.png|400px|thumb|right| map of the space]]  [[File:P1lab map png.png|thumb|The P1 lab has controlled access for potential work on GMOs. Plan your experiments in advance!]]&amp;lt;br&amp;gt;&lt;br /&gt;
The biolab is located in a south facing room of over 22m2,  with three windows and a linoleum floor. &amp;lt;br&amp;gt;&lt;br /&gt;
''It must be stressed that this is a provisional space, with the building already destined for destruction in the next 3-5 years (or so they say!). &amp;lt;br&amp;gt; Thus, we still need to find someplace more sustainable, and any help in this regard would be greatly appreciated!'' &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Inspiration=&lt;br /&gt;
Getting the Hackuarium community together for some real biological experimentation is an evolving endeavor.&lt;br /&gt;
In Renens the official 'P1 laboratory' ran for only about a year, and more information on that can be found in various parts of this wiki.  [http://wiki.hackuarium.ch/w/P1_Lab_Activities Starting from here for historical perspective] is a good option. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Biosafety Officers=&lt;br /&gt;
&lt;br /&gt;
Rachel Aronoff and Olivier Emery continued their roles as biosafety officers in the new space, until Olivier got too busy and left the board in June 2020, after which Javier Ortiz became the deputy.  In 2024, Aurélien Jobard became deputy in his place.  Maybe '''you''' would like to become a second deputy biosafety officier? :)  &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you need to contact them in particular about any proposed activities or projects in the biolab, please use this email address: biolab@hackuarium.ch &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Key Aims=&lt;br /&gt;
&lt;br /&gt;
'''To learn, have fun, and avoid problems!''' &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is the [https://drive.google.com/open?id=0B1jaPHOkH_42dVhjOXBBN0xsUms link to much initial Hackuarium Biosafety info, list of users and list of strains] . &amp;lt;br&amp;gt;&lt;br /&gt;
After RA's first Biosummit in 2020, [https://docs.google.com/document/d/1Qkc2uCAcLX45b0GjSGZohweelJ-vDOhX5MDSf6F4MEI/edit?usp=sharing this great resource for community biolabs] came to her attention, for everyone's use. &amp;lt;br&amp;gt;&lt;br /&gt;
We have to note that at least some lab strains did not survive the moving process, even though dry ice was used to move tubes from one -20 to another...   :(   We need to test different glycerol concentrations next?&amp;lt;br&amp;gt;&lt;br /&gt;
However, we had a nice surprise, already, in being able to revive some bioluminescent bacteria (which turned out to be ''Photobacterium phosphorum''!) after many months in an eppendorf tube in the frig!!  More [http://wiki.hackuarium.ch/w/Bioluminescence_investigations information about this is already] in the wiki.&lt;br /&gt;
&lt;br /&gt;
=Timeline for Project Initiation=&lt;br /&gt;
1) Talk with everyone about your ideas and what you would like to do. Public presentations during Wednesday #OpenHackuarium events are recommended!&amp;lt;br&amp;gt;&lt;br /&gt;
2) Take the 'intro to biosafety course' and do risk assessment on your idea. &amp;lt;br&amp;gt;&lt;br /&gt;
12 people have already taken the &amp;quot;Introduction to biosafety&amp;quot; training for the new space. &amp;lt;br&amp;gt; '''More training sessions can be organised upon request.''' &amp;lt;br&amp;gt;&lt;br /&gt;
3) Start documenting your idea in the wiki. You can use [http://wiki.hackuarium.ch/w/Hypo_proj this template] developed by YannP as a guide. &amp;lt;br&amp;gt;&lt;br /&gt;
4) If we really get the ok to do P1 experiments, go ahead and fill in [http://wiki.hackuarium.ch/w/Form:GMO_Project the form], also developed by YannP! &amp;lt;br&amp;gt;&lt;br /&gt;
5) Get a project box, and get going!  (ask for a minigrant, if necessary for obtaining reagents or other materials.)  &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Further information =&lt;br /&gt;
* The lab layout is modular and flexible, with the tall bench useful in both orientations, depending on needs.&lt;br /&gt;
* Much equipment can be kept on shelves, and taken out to use when needed.&lt;br /&gt;
* All projects will have a box for their special equipment and stocks. Ask for a new one, if you need it!&lt;br /&gt;
* Always tidy things away after manipulations are complete, and if anything needs to stay out on a bench, or in incubators, remember to always '''leave signed and dated notes'''!&lt;br /&gt;
* Do you have questions? &amp;lt;br&amp;gt;Maybe you can't reach Rachel or Aurélien, or want to find out more before even trying to ask them?? &amp;lt;br&amp;gt; There is a service in the DIYBio community for this [http://ask.diybio.org/ Ask a Biosafety Professional]!  Use it! (actually in the midst of a double check to see if it still works -nov23)&amp;lt;br&amp;gt;&lt;br /&gt;
* '''Remember, being clueless is no excuse!!  there are many ways to find information.'''&lt;br /&gt;
* The Standard Operating Procedures for appropriate use of the new space are being developed, and build upon what was [http://wiki.hackuarium.ch/w/P1_SOP previously decided during preparations to establish a P1 laboratory for Hackuarium members] already back in 2015/6. ([http://wiki.hackuarium.ch/w/Instru_Main Some old equipment] still has useful QR codes that lead to information in this wiki, too! Bravo, les poulpes!)&lt;br /&gt;
Here are some [http://wiki.hackuarium.ch/w/New_SOPs new SOPs] for use of the small sterile hood and for use of the ultracentrifuge in the new space.&lt;br /&gt;
* Key code access will depend on responsibility and training of users of the space!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Watch this space for more information! &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translation help welcome! :)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gallery ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=packed widths=300 heights=300&amp;gt;&lt;br /&gt;
File:Timelapseclip18may19.png&lt;br /&gt;
File:Morebiolum.png &lt;br /&gt;
File:IMG 8618.JPG &lt;br /&gt;
File:DSC 8698.jpg &lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* first image: a moment during a micronuclei workshop (18may19)&lt;br /&gt;
* second image: Bioluminescence of ''Photobacterium phosphorum''  8s exposure with SLR camera&lt;br /&gt;
* third image: Bioluminescence of ''Photobacterium phosphorum''  quick pic in 'inner sanctum' with iPhone SE&lt;br /&gt;
* fourth image: Bioluminescence of some marine plankton, the Dinoflagellates ''Pyrocystis fusiformis''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation]]&lt;br /&gt;
[[Category:Work In Progress]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Hackuarium:About&amp;diff=19920</id>
		<title>Hackuarium:About</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Hackuarium:About&amp;diff=19920"/>
		<updated>2026-11-04T09:58:49Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category Hackuarium&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are '''Hackuarium'''. More or different stuff on [http://hackuarium.ch our website].&lt;br /&gt;
= En français =&lt;br /&gt;
Notre communauté regroupe les curieux et les bricoleurs de la région Lausannoise dans un laboratoire ouvert et citoyen situé avec d'autres activités au sein de la [[Space Alliance Coopérative]] à Écublens, une ville de Suisse Romande.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
La matière vivante est de plus en plus facilement cultivable, modulable, modifiable. Entre science et design, innovation et création artistique, Hackuarium est une rencontre entre des scientifiques et de citoyens de la région lausannoise qui veulent promouvoir ou pratiquer la biologie DIY/DIWO dans un lieu qui offre à chacun·e la possibilité de découvrir, d’expérimenter et de contribuer ses compétences dans un laboratoire communautaire.&lt;br /&gt;
&lt;br /&gt;
= In English =&lt;br /&gt;
== What is DIY Bio? ==&lt;br /&gt;
DIY biology (Do-It-Yourself biology) is a movement that wants to free the practice of biological research and innovation from the institutional and industrial laboratories. Pursued both by amateur and professional biologists, DIY biology is developing low-cost and low-tech solutions to problems identified by the community.&amp;lt;br&amp;gt;&lt;br /&gt;
The movement is characterized by an extremely diverse set of practices and participants. Some call themselves 'biohackers', in reference to the hacker culture.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[http://DIYbio.org DIYbio.org] and [http://DIYbio.eu DIYbio.eu] are the portals of the international and european communities, respectively.&amp;lt;br&amp;gt;&lt;br /&gt;
For more information, visit the [http://www.wikipedia.org Wikipedia] page dedicated to [https://en.wikipedia.org/wiki/DIYbio DIYbio].&lt;br /&gt;
&lt;br /&gt;
== The Hackuarium Association ==&lt;br /&gt;
Hackuarium is a community of people from a variety of background and who are passionate about tinkering with biology. The association was founded on August 13th 2014.&amp;lt;br&amp;gt;&lt;br /&gt;
Our members are interested in open and participatory science, outside traditional institutions. We want to promote interdisciplinary research and innovation, with minimal costs (low-cost), simple and accessible technologies (low-tech) and an open source philosophy. We also rely on upcycling material from institutions and industry from western Switzerland. Our projects are initiated and carried out by scientists as well as citizens who are architects, designers, IT and computer people, journalists or retired people.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Our laboratory is open to everyone sharing these values, dedicated to follow the [http://diybio.org/codes/draft-diybio-code-of-ethics-from-european-congress/ DIYbio Europe ethical guidelines]. After 4 years within [[UniverCité]], an innovation space opened on May 26th 2014, we are now active in Écublens, as members of the [[Space Alliance Coopérative]].&lt;br /&gt;
&lt;br /&gt;
= Press Kit =&lt;br /&gt;
If you are a journalist, please visit our [[Press_kit|Press Kit]] page.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hackuarium]]&lt;br /&gt;
[[Category:Work In Progress]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=20180912_General_Assembly_Extraordinaire&amp;diff=19919</id>
		<title>20180912 General Assembly Extraordinaire</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=20180912_General_Assembly_Extraordinaire&amp;diff=19919"/>
		<updated>2026-11-04T09:57:55Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: updated categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Assemblée Générale Extraordinaire&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ENGLISH BELOW''' &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 * Langue principale cette semaine: '''Français'''&lt;br /&gt;
 * Thème: '''Assemblée Générale Extraordinaire'''&lt;br /&gt;
 * Date: '''Mercredi 12.09.2018, 19h30''',&lt;br /&gt;
 * Lieu: Salle Gaston Lagaffe, au 3ème étage (Mass Challenge) aux Ateliers de Renens, Chemin du Closel 5, 1020 Renens.  &lt;br /&gt;
&lt;br /&gt;
Venez nombreux pour discuter du '''futur de l’association.''' En effet, il est probable que l’on [http://wiki.hackuarium.ch/w/20180808_Special_Board_Meeting doive déménager].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Quel que soit l'issue du vote sur ce sujet, tous nous voulons remercier la Fondation Inartis et son espace UniverCité de nous avoir hébergé durant ces quatre dernières années. Nous avons bénéficié les deux de ce liason.  Cependant, UniverCité et Hackuarium ont tous deux évolué de manière importante et il est temps d'envisager options pour les prochaines années. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordre du jour de l'Assemblée Générale Extraordinaire du 12 septembre 2018 (fr)=&lt;br /&gt;
&lt;br /&gt;
==Bienvenue et liste des présences==&lt;br /&gt;
&lt;br /&gt;
Pour rappel, le droit de vote est réservés aux membres ayant leur cotisations à jour. &amp;lt;br&amp;gt;&lt;br /&gt;
Comptes de membres et de procurations signés...&lt;br /&gt;
&lt;br /&gt;
18 membres actifs sont présents&lt;br /&gt;
&lt;br /&gt;
* Rachel Aronoff&lt;br /&gt;
* Masoud Alipour&lt;br /&gt;
* Joël Cristin&lt;br /&gt;
* Olivier Emery&lt;br /&gt;
* Luc Henry&lt;br /&gt;
* Daniel Hernandez&lt;br /&gt;
* Yann Heurtaux&lt;br /&gt;
* Michel André Horisberger&lt;br /&gt;
* Vanesa	Lorenzo Toquero&lt;br /&gt;
* Florian Patiny&lt;br /&gt;
* Luc Patiny&lt;br /&gt;
* Océane Patiny&lt;br /&gt;
* Yann Pierson&lt;br /&gt;
* Heloise	Piguet&lt;br /&gt;
* Anne-Laure	Pittet&lt;br /&gt;
* Gustavo Santa Maria&lt;br /&gt;
* Sam Sulaimanov&lt;br /&gt;
* Raffael Tschui (il a fait des notes pour le procès verbale - les plupart en anglais, donc mis dessous)&lt;br /&gt;
&lt;br /&gt;
3 membres ont donné leur procurations:&lt;br /&gt;
&lt;br /&gt;
* Guy Mayor (à Rachel)&lt;br /&gt;
* Caroline Otz (à Rachel)&lt;br /&gt;
* Tobias Merz (à Gustavo)&lt;br /&gt;
&lt;br /&gt;
aussi présente:&lt;br /&gt;
une participante de BeeMoS (Clara), une nouveau membre potentielle (Esther), deux membres de Octanis (Pierre et Guillaume) et Richard et Anna de FabLab&lt;br /&gt;
&lt;br /&gt;
Tout le monde était d'accord pour mettre le pv comme d'habitude dans le wiki.&lt;br /&gt;
&lt;br /&gt;
==Le point sur UniverCité et leur proposition de contrat d’hébergement==&lt;br /&gt;
&lt;br /&gt;
La Présidente de l'association Hackuarium (Rachel) présentera les dernières nouvelles qui nous concernent tous.&lt;br /&gt;
En quelques mots: alors que jusqu’à maintenant nous n’avions pas de loyer à payer, la Fondation Inartis qui gère UniverCité a désormais demandé un loyer avoisinant les 400 CHF/m2/année. (min offre à jour 28.8: 2000CHF/mois)&amp;lt;br&amp;gt;&lt;br /&gt;
Rachel a aussi présenté [http://wiki.hackuarium.ch/w/File:Timeline.jpg une 'chronogramme' sur les années de Hackuarium].  &amp;lt;br&amp;gt;C'est clair que UniveCité était inauguré comme une 'laboratoire communautaire - mis sur le partage de savoir faire' (Hebdo 22mai2014), mais maintenant ils attendent que Hackuarium doit payer un loyer comme une boîte privée avec business plan déjà réussi!&lt;br /&gt;
&lt;br /&gt;
==Bilan des activités pour rendre notre association vraiment durable et trouver un nouvel espace==&lt;br /&gt;
&lt;br /&gt;
Sam, membre du comité Hackuarium et fondateur et président de l’association Octanis, présentera les dernières nouvelles sur notre recherche pour un espace commun avec Octanis et d'autres, avec qui l'idée est de former une cooperative.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bilan Financier==&lt;br /&gt;
Masoud, trésorier, présentera le bilan de la situation financière actuelle de l’association et des idées pour la collecte de fonds.&amp;lt;br&amp;gt;&lt;br /&gt;
Aurions-nous besoin de modifications à notre charte, pour même faire un «business plan»?  si oui, on peut le faire pour l'AG prochaine (fev2019??)&amp;lt;br&amp;gt;&lt;br /&gt;
Normalement, Hackuarium peut joindre dans le cooperative, sans perdre ses valeurs de la recherche ouverte...&lt;br /&gt;
&lt;br /&gt;
==Propositions Spécifiques==&lt;br /&gt;
&lt;br /&gt;
===1) Rester, Payer le loyer comme demandé par Inartis===&lt;br /&gt;
&lt;br /&gt;
La proposition de Gianpaolo:&amp;lt;br&amp;gt;&lt;br /&gt;
Chers membres, au cours des 4 dernières années, nous n'avons jamais eu à payer le loyer, l'électricité, internet, l'eau, le chauffage et la climatisation. Libérés de ces préoccupations, nos membres ont profité de leur temps bienveillant pour développer des projets qui auraient été beaucoup plus difficiles à développer ailleurs. Inartis a accueilli et soutenu notre association et nos membres au cours de ces 4 années. Nous avons eu nos hauts et nos bas. Notre juste part des routes cahoteuses et des vents violents. C'est ce qui fait de nous ce que nous sommes aujourd'hui. Maintenant, nous sommes face à face. Je vous invite à exprimer votre gratitude. Je propose d'accepter l'offre d'Inartis et de payer notre loyer, alors que nous recherchons un lieu qui correspond mieux à nos besoins. Qui peut dire où mène la route? Aujourd'hui, Hackuarium peut se permettre de payer un loyer, et avec Octanis, nous explorons de plus grands espaces à louer. Je vous invite à être reconnaissant. Merci d'avoir considéré ma proposition.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour:&amp;lt;br&amp;gt;&lt;br /&gt;
Contre:&amp;lt;br&amp;gt;&lt;br /&gt;
Sans avis:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Refusée à la majorité&lt;br /&gt;
&lt;br /&gt;
===2) Rester, Négocier===&lt;br /&gt;
&lt;br /&gt;
Pour:&amp;lt;br&amp;gt;&lt;br /&gt;
Contre:&amp;lt;br&amp;gt;&lt;br /&gt;
Sans avis:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Refusée à la majorité&lt;br /&gt;
(mais en fait, Juliette à dit déjà qu'on ne peut pas négocier sa offre de bas -seulement orale aussi- pour 'harmoniser' les contributions de lieux)&lt;br /&gt;
&lt;br /&gt;
===3) Partir, à joindre la 'space alliance'===&lt;br /&gt;
Proposition de Sam:&amp;lt;br&amp;gt;&lt;br /&gt;
Le comité d'Hackuarium reçoit le mandat de rechercher, négocier et sélectionner un nouvel espace avec la 'space alliance' et rend compte à l'assemblée générale dans 6 mois. &amp;lt;br&amp;gt;&lt;br /&gt;
Pour:&amp;lt;br&amp;gt;&lt;br /&gt;
Contre:&amp;lt;br&amp;gt;&lt;br /&gt;
Sans avis:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Acceptée à la majorité&lt;br /&gt;
&lt;br /&gt;
===4) Partir, autre===&lt;br /&gt;
&lt;br /&gt;
Proposition de Luc:&amp;lt;br&amp;gt;&lt;br /&gt;
Le comité d'Hackuarium reçoit le mandat de rechercher, négocier et sélectionner un nouvel espace avec la 'space alliance' et peut prendre une décision sans passer par l'assemblée générale. &amp;lt;br&amp;gt;&lt;br /&gt;
Pour:&amp;lt;br&amp;gt;&lt;br /&gt;
Contre:&amp;lt;br&amp;gt;&lt;br /&gt;
Sans avis:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Acceptée à une plus grande majorité (que point 4)&lt;br /&gt;
&lt;br /&gt;
===5) Si on part, faire une plaque commemorative===&lt;br /&gt;
Proposition de Yann Heurteux  &amp;lt;br&amp;gt;&lt;br /&gt;
Pour:&amp;lt;br&amp;gt;&lt;br /&gt;
Contre:&amp;lt;br&amp;gt;&lt;br /&gt;
Sans avis:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Acceptée à la majorité&lt;br /&gt;
&lt;br /&gt;
Ces questions seront réglée par le comité&lt;br /&gt;
Qui ?&lt;br /&gt;
Budget??&lt;br /&gt;
&lt;br /&gt;
===6) Quoiqu'il arrive - Garder un lien avec les résidents des Ateliers de Renens===&lt;br /&gt;
Proposition de Yann Heurteux:&amp;lt;br&amp;gt;&lt;br /&gt;
extrait de son mot:&amp;lt;br&amp;gt;&lt;br /&gt;
Hackuarium doit organiser une fois tous les deux mois, un #OpenHackuarium spécial à Mass Challenge, où que nous déménagions :&amp;lt;br&amp;gt;&lt;br /&gt;
- pour garder un lien avec ce bâtiment où tout à commencé pour nous et ne pas être oubliés des communautés qui l'habitent,&amp;lt;br&amp;gt;&lt;br /&gt;
- pour continuer régulièrement à inspirer et être inspirés par les accéléré·e·s chez MC et les autres colocataires des Ateliers,&amp;lt;br&amp;gt;&lt;br /&gt;
- pour continuer à contribuer à Renens, dans ce bâtiment, après qu'on nous y ait hébergé gracieusement pendant 4 ans, en remerciement pour tout ce que la commune a permis pendant ces années.&amp;lt;br&amp;gt;&lt;br /&gt;
Je (YH) suis volontaire pour organiser ces rencontres bimestrielles, et m'assurer que les résidents des Ateliers y soient correctement et systématiquement invités.&amp;lt;br&amp;gt;&lt;br /&gt;
Ce serait l'occasion pour nous également de continuer à présenter régulièrement aux résidents des Ateliers les projets sur les quels nous travaillons, devant un public a priori étranger à nos thématiques, et continuer à alimenter la transdisciplinarité et la diversité au cœur de nos valeurs en restant au contact de ce que d'autres continueront à faire ici.&lt;br /&gt;
Si notre budget le permet, ces rencontres seraient suivies d'un apéro à la taproom de la Nébuleuse.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour:&amp;lt;br&amp;gt;&lt;br /&gt;
Contre:&amp;lt;br&amp;gt;&lt;br /&gt;
Sans avis:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Acceptée à la majorité&lt;br /&gt;
&lt;br /&gt;
Votes en chiffres:&lt;br /&gt;
Proposal 1: Pour: 0, Contre: 20, Abstention: 1 Rejetée&amp;lt;br&amp;gt;&lt;br /&gt;
Proposal 2: Pour: 0, Contre: 18, Abstention: 3 Rejetée&amp;lt;br&amp;gt;&lt;br /&gt;
Proposal 3: Pour: 11, Contre: 2, Abstention: 8 Adoptée&amp;lt;br&amp;gt;&lt;br /&gt;
Proposal 4: Pour: 19, Contre: 0, Abstention: 2 Adoptée&amp;lt;br&amp;gt;&lt;br /&gt;
Proposal 5: Pour: 18, Contre: 3, Abstention: 1 Adoptée&amp;lt;br&amp;gt;&lt;br /&gt;
Proposal 6: Pour: 16, Contre: 0, Abstention: 3 Adoptée&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Questions Logistiques==&lt;br /&gt;
Si la decision est de partir:&amp;lt;br&amp;gt;&lt;br /&gt;
légalement on pense d'avoir le droit à 6 mois préavis&amp;lt;br&amp;gt;&lt;br /&gt;
avec 3 mois, on est à la fin d'octobre&amp;lt;br&amp;gt;&lt;br /&gt;
si les choses arriveraient - fin septembre?? (c'est ça Inartis veut, mais après discussion, on peut voir...)&amp;lt;br&amp;gt;&lt;br /&gt;
Comment??  Budget?  Si la 'space alliance' prendrait 6 mois - dépannage chez Octanis? (et pour la bio?  il faut avertir les gens de Bern.)&lt;br /&gt;
&lt;br /&gt;
==Minigrants==&lt;br /&gt;
&lt;br /&gt;
N'oubliez pas que les projets Hackuarium peuvent bénéficier d'une assistance allant jusqu'à 500CHF.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Faites un budget détaillé et envoyez votre demande au comité par email&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autres==&lt;br /&gt;
&lt;br /&gt;
Lettre pour nos amis et sponsors &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LemanMake 29 &amp;amp; 30 septembre à Renens:  3 stands de Hackuarium prévus!  Qui peut nous rejoindre là-bas? &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AGENDA of the EXTRAORDINARY GENERAL ASSEMBLY meeting(en)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
All members are invited to come and discuss the future of the association.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is likely that we will have [http://wiki.hackuarium.ch/w/20180808_Special_Board_Meeting to move]...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will always be grateful to Inartis and UniverCité for hosting us these last 4 years, but everyone must grow and move at some point ...;)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
We both benefited from this association, and it is time to consider years ahead.&lt;br /&gt;
&lt;br /&gt;
=Agenda of the Extraordinary General Meeting of September 12, 2018=&lt;br /&gt;
&lt;br /&gt;
==Welcome and attendance list==&lt;br /&gt;
reminder about members voting &amp;lt;br&amp;gt;&lt;br /&gt;
counts of members (and signed excused voters...)&lt;br /&gt;
18 + 3 for the votes&lt;br /&gt;
&lt;br /&gt;
meeting began officially at&lt;br /&gt;
19h40&lt;br /&gt;
&lt;br /&gt;
==Update on UniverCité and their hosting contract proposal==&lt;br /&gt;
&lt;br /&gt;
Rachel will present the latest news that concerns us all. &amp;lt;br&amp;gt;&lt;br /&gt;
While until now we had no rent to pay, Inartis has now asked for a (apparently non-negotiable) rent of about 400 CHF / m2 / year. (minimal offer to date 28.8 of 2000/month)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Review of activities to make our association really sustainable and find a suitable space==&lt;br /&gt;
&lt;br /&gt;
Sam, member of the Hackuarium Board and founder and president of the association, Octanis, will present the latest news about our search for a common space with Octanis and some great start-ups, with whom the current idea is to form a cooperative.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Review of current financial status for the Association==&lt;br /&gt;
&lt;br /&gt;
Masoud, treasurer, will present a summary of the current financial status of the assocation and some ideas for fundraising.  &amp;lt;br&amp;gt;&lt;br /&gt;
? would we need modifications to our Charter, in order to even make a 'business plan'?  if needs be, that can be done at our next General Assembly meeting.&amp;lt;br&amp;gt;&lt;br /&gt;
Normally, Hackuarium could join in the cooperative without giving up on its values for open research...&lt;br /&gt;
Masoud summarised: Membership incomes amount to around 6000 CHF per year. Currently there are 27000 francs on the account, which are not strongly linked to any project or future expense. (Minus a couple of “small invoices” + 1’000 for Living Instruments)&lt;br /&gt;
&lt;br /&gt;
Reactions:&amp;lt;br&amp;gt;&lt;br /&gt;
Other small incomes come from donations, the crowdfunding campaign, Rachel's workshops (in London and at lab). &amp;lt;br&amp;gt;&lt;br /&gt;
Luc mentions that there is a high potential to generate other incomes.&amp;lt;br&amp;gt;&lt;br /&gt;
Vanessa feels that, apparently Hackuarium is not valued as much anymore at Univercité and therefore we should move away from here&amp;lt;br&amp;gt;&lt;br /&gt;
Luc P. agrees on this point with Vanessa, feels a bit traited by Univercité. Right now, all the activities which used to be possible to do at Univercité some years ago, is happening in his basement, because there is no space anymore at UC.&amp;lt;br&amp;gt;&lt;br /&gt;
Yann P.: agrees that the dynamism of the space at UC is past, also resulting in less members actively using the space these days. &lt;br /&gt;
X agrees with the previous, and it feels like makers get slowly chased away from this space.&amp;lt;br&amp;gt;&lt;br /&gt;
Yann H.: We do have to remember that we should be grateful for the past 4 years staying here for free (and right now using the MC rooms). We also contributed to UC in other ways, but we have missed the train on becoming financially independent in the long term. “We have lost something ‘open’ because we let it get closed”.&amp;lt;br&amp;gt;&lt;br /&gt;
Joel says that the location (UC) is excellent - close to Renens, soon next to the tram line. The risk if we leave is that we lose the visibility. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
⇒ Sam clarifies that the proposal is not a detailed plan to move at a specific location but, as stated in the agenda: “The board of Hackuarium receives a mandate to search for, negotiate and select a new space with the space alliance and reports to the general assembly in 6 months.”&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sam proposes a reaction round, one after another, and then vote:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Richard: Wants to fight a fight to make the value fablabs/Hackuarium/… creates “recognized”. But in his opinion not by leaving the space. Mentions also that building and rebuilding a fablab is a lot of effort and would be a shame to lose so much...&amp;lt;br&amp;gt;&lt;br /&gt;
Its a political fight to fight, a real engineer for example would benefit from immersion into these spaces.&amp;lt;br&amp;gt;&lt;br /&gt;
Dan: Good thing about moving is to recreate the community spirit!&amp;lt;br&amp;gt;&lt;br /&gt;
Luc P: The associations can provide value to the private sector (e.g. specific knowledge) - mixing disciplines is the biggest value, and that we can re-create.&amp;lt;br&amp;gt;&lt;br /&gt;
Luc H: Hackuarium = the sum of its members. Goal is to usa a minimum of money/energy to provide support a maximum of members. 30 members at today’s AG is a good sign that the community remains strong. Staying is not an option - UC becomes less and less extraordinary. Octanis seems to be on the right track to become independent, so he has faith into the project of moving together.&amp;lt;br&amp;gt;&lt;br /&gt;
Yann P: We built 3 labs, i dont see a reason why we couldnt do a 4th one. &amp;lt;br&amp;gt;&lt;br /&gt;
X: It is impossible to come to Hackuarium right now with a group, due to lack of space. She feels that the association needs a kick, to refuel the dynamism. &amp;lt;br&amp;gt;&lt;br /&gt;
X. Keep in mind the roots of HKM!&amp;lt;br&amp;gt; &lt;br /&gt;
Oceane: at HKM, there is no space anymore to sit down and work - this would be easily resolved somewhere else. &amp;lt;br&amp;gt;&lt;br /&gt;
Olivier: Has faith in the Octanis approach. Seems like the rent can’t be decreased here, so we should leave. &amp;lt;br&amp;gt;&lt;br /&gt;
Massoud: Is in principle agreeing with Richard, but does not have time to lead the political battle. &amp;lt;br&amp;gt;&lt;br /&gt;
Florian: “Une bataille évité c’est une bataille gagné” &amp;amp; politics sucks → we need a kick now and move forward.&amp;lt;br&amp;gt;&lt;br /&gt;
Vanessa: The kick we get now is a good energy&amp;lt;br&amp;gt;&lt;br /&gt;
Sam: We should not be cynical to politics/boring tasks. And if we leave here, it’s not a sign of disregarding it. &amp;lt;br&amp;gt;&lt;br /&gt;
IF we leave, we will try to get as many people with us, along with our values&amp;lt;br&amp;gt;&lt;br /&gt;
Nothing we made so far is in vain, even if we stop being here - we have all accumulated knowledge, connections, etc, which we can now use to create anything from companies to research papers….&amp;lt;br&amp;gt;&lt;br /&gt;
Raffael: pragmatic approach - member of both, no way to get Octanis to move back to Ateliers, so only way to bring back Hackuarium and Octanis together is to move Hackuarium.&amp;lt;br&amp;gt;&lt;br /&gt;
Gustavo: came to Hackuarium to use the space, took over the responsibility of Yann P. as a lab manager, gave a lot of energy and time to support Inartis, seen the disappearance of shared space, knowledge, no respect for people working on something (space is rented to best bidder without asking the community).&amp;lt;br&amp;gt;&lt;br /&gt;
The makerspace will disappear in the long term, it seems that the plan is to rent the space out to startups as well.&amp;lt;br&amp;gt;&lt;br /&gt;
IF we leave, we have to discuss about the Hkm logo on Inartis site, as well as other property of hackuarium which is now claimed by Inartis and other startups, and take it with us.&amp;lt;br&amp;gt;&lt;br /&gt;
Guillaume: Focus energy on a space that allows to build projects, which should be the main goal&amp;lt;br&amp;gt;&lt;br /&gt;
Pierre: We can do the political battle, but practically, and not orally → simply build the space and make it much better, and convince the politicians etc…&amp;lt;br&amp;gt;&lt;br /&gt;
Rachel: finds it hard to imagine UC can reconcile their position, in terms of using words about supporting open science, which helped fill up the space, in addition to all our activities and welcome of visitors etc, but which are now being abandoned in favor of startups and a startup level rent even for us.  Still hoping negotiations might be possible to try to stay a bit longer, until we find something bigger and better, to fulfil the needs of members. &amp;lt;br&amp;gt;&lt;br /&gt;
Yann H.: Finds it cool to just pay a little bit of rent to UC as long as we still stay here. &amp;lt;br&amp;gt;&lt;br /&gt;
Recommends not to stay. &amp;lt;br&amp;gt;&lt;br /&gt;
Octanis started in Hackuarium and now helping it in its weakest moment, so he is in favor of Sam’s proposal&amp;lt;br&amp;gt;&lt;br /&gt;
Is in favor of putting a plaque de mémoire at UC and will take care of negociating with the responsible people. &amp;lt;br&amp;gt;&lt;br /&gt;
Is in favor of his own proposal: To keep up the links to other residents of UC. To stay connected/contributing to UC community means also that we show that we didn't only contribute to the space because the rent was free. &amp;lt;br&amp;gt;&lt;br /&gt;
Theoretically, Inartis could make us leave immediately - so if we vote yes, we need to move quickly and everyone needs to contribute. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Specific Proposals ==&lt;br /&gt;
1) Stay, Pay the rent as requested by Inartis. &amp;lt;br&amp;gt;&lt;br /&gt;
for - Gianpaolo &amp;lt;br&amp;gt; .&lt;br /&gt;
his proposition: &amp;lt;br&amp;gt;&lt;br /&gt;
Dear members, in the last 4 years, we never had to pay the rent, electricity, internet, water, chauffage and air-conditioning. Free of these preoccupations, our members used their benevolent time to develop projects that it would have been much more difficult to develop elsewhere. Inartis hosted and supported our association and our members in these 4 years. We had our ups and downs. Our fair share of bumpy roads and heavy winds. That's what made us what we are today. Now we stand in front of each other. I'm inviting you to express gratitude. I propose to accept the offer of Inartis and to pay our rent, while we search for a place that better fits our needs. Who can say where the road goes? Today Hackuarium can afford to pay a rent, and indeed with Octanis we are exploring bigger spaces to rent. I'm inviting you to be grateful. Thank you for considering my proposition.&amp;lt;br&amp;gt;&lt;br /&gt;
against -      &amp;lt;br&amp;gt;&lt;br /&gt;
discussion &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Stay, Negotiate&amp;lt;br&amp;gt;&lt;br /&gt;
for - &amp;lt;br&amp;gt;&lt;br /&gt;
against -      &amp;lt;br&amp;gt;&lt;br /&gt;
discussion &amp;lt;br&amp;gt;&lt;br /&gt;
(actually, Juliette already had said that negotiations would not be possible for her lowest offer - only given orally too - to 'harmonise' the costs for the space...)&lt;br /&gt;
&lt;br /&gt;
3) To leave, to joining in with the &amp;quot;space alliance&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
for -  Sam &amp;lt;br&amp;gt;&lt;br /&gt;
excerpt from his proposition: &amp;lt;br&amp;gt;&lt;br /&gt;
The board of Hackuarium receives a mandate to search for, negotiate and select a new space with the space alliance and reports to the general assembly in 6 months.&amp;lt;br&amp;gt;&lt;br /&gt;
against -      &amp;lt;br&amp;gt;&lt;br /&gt;
discussion &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4) To leaving,  other (as above but without need for another AGE)&amp;lt;br&amp;gt;&lt;br /&gt;
for - &amp;lt;br&amp;gt;&lt;br /&gt;
against - discussion &amp;lt;br&amp;gt;&lt;br /&gt;
what alternatives?  how?  where??&lt;br /&gt;
&lt;br /&gt;
5) If we leave the Ateliers, make a commemorative plaque &amp;lt;br&amp;gt;&lt;br /&gt;
for -  Yann Heurteux &amp;lt;br&amp;gt;&lt;br /&gt;
against -      &amp;lt;br&amp;gt;&lt;br /&gt;
discussion &amp;lt;br&amp;gt;&lt;br /&gt;
Who?&lt;br /&gt;
Budget??&lt;br /&gt;
&lt;br /&gt;
6) Whatever happens - Keep a link with the residents of the Renens Workshops&lt;br /&gt;
&lt;br /&gt;
for - Yann Heurteux &amp;lt;br&amp;gt;&lt;br /&gt;
excerpt from his note:&amp;lt;br&amp;gt;&lt;br /&gt;
Hackuarium should organize, every other month, a special #OpenHackuarium at Mass Challenge, in order:&amp;lt;br&amp;gt;&lt;br /&gt;
- to keep a link with this building where everything began and not be forgotten by the communities that remain,&amp;lt;br&amp;gt;&lt;br /&gt;
- to continue regularly to inspire and be inspired by the accelerators at MC and the other Ateliers groups,&amp;lt;br&amp;gt;&lt;br /&gt;
- To continue contributing to Renens, in this building, after being hosted for free for 4 years, in thanks for all that the municipality has allowed during these years.&amp;lt;br&amp;gt;&lt;br /&gt;
I (YH) volunteer to organize these bimonthly meetings, and ensure that the other groups are properly and systematically invited.&amp;lt;br&amp;gt;&lt;br /&gt;
It would also be an opportunity for us to continue to regularly present to the residents of the Workshops the projects we are working on, in front of an other audience and keep in touch with what others will continue to do here. &amp;lt;br&amp;gt;&lt;br /&gt;
If our budget allows, meetings with an aperitif at the room of La Nebuleuse. &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Against  -  discussion &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Votes ...&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Luc P.: Suggests a real mandate without any need for another AGE. (new proposal 4)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Votes:&lt;br /&gt;
Proposal 1: Pour: 0, Contre: 20, Abstention: 1 Rejetée&amp;lt;br&amp;gt;&lt;br /&gt;
Proposal 2: Pour: 0, Contre: 18, Abstention: 3 Rejetée&amp;lt;br&amp;gt;&lt;br /&gt;
Proposal 3: Pour: 11, Contre: 2, Abstention: 8 Adoptée&amp;lt;br&amp;gt;&lt;br /&gt;
Proposal 4: Pour: 19, Contre: 0, Abstention: 2 Adoptée&amp;lt;br&amp;gt;&lt;br /&gt;
Proposal 5: Pour: 18, Contre: 3, Abstention: 1 Adoptée&amp;lt;br&amp;gt;&lt;br /&gt;
Proposal 6: Pour: 16, Contre: 0, Abstention: 3 Adoptée&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Logistical Questions==&lt;br /&gt;
If the decision is to leave, &amp;lt;br&amp;gt;&lt;br /&gt;
we think we have the legal right to 6 months' notice.&amp;lt;br&amp;gt;&lt;br /&gt;
if we are ok with 3 months, that puts us at the end of October.&amp;lt;br&amp;gt;&lt;br /&gt;
if things work out, we could even go as early as the end of September? (that is what Inartis would like, but with recent discussions, perhaps some flexibility is possible.)&amp;lt;br&amp;gt;&lt;br /&gt;
How?  Budget??  If the space alliance decision will take 6 months, to make do with Octanis (Ecublens)??&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Board will organise all technical details, and everybody is STRONGLY encouraged to participate in the moving. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Minigrants==&lt;br /&gt;
&lt;br /&gt;
Don't forget that Hackuarium projects can get support of up to 500chf.&amp;lt;br&amp;gt;&lt;br /&gt;
Make a budget and send your request to the Board!&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Other Business==&lt;br /&gt;
Letter for our friends and sponsors &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LemanMake 29.30sept in Renens:  3 stands for Hackuarium are planned!  Who can join us there?? &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Meeting Ended at  21:17&lt;br /&gt;
[[Category:Administration]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=20181031_OpenHackuarium_226&amp;diff=19918</id>
		<title>20181031 OpenHackuarium 226</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=20181031_OpenHackuarium_226&amp;diff=19918"/>
		<updated>2026-11-04T09:55:38Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: updated categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Open Hackuarium #226''' - fête pour le premier projet de jardinage urbain chez Hackuarium&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''ENGLISH BELOW''' &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 * Langue principale cette semaine: '''Anglais'''&amp;lt;br&amp;gt;&lt;br /&gt;
 * Thème : '''Petits Pois'''&lt;br /&gt;
 * Date : '''Mercredi 31.10.2018, 19h''', présentation et discussion à 19:30 et jusqu'à 21h&lt;br /&gt;
 * Lieu : tbd&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&amp;lt;br&amp;gt;&lt;br /&gt;
 * Main language this week: '''English'''&amp;lt;br&amp;gt;&lt;br /&gt;
 * Theme: '''Pea Harvest Summary and Halloween party'''&lt;br /&gt;
 * Date: '''Wednesday 31.10.2018, 19:00''', presentation and discussion start at 19:30&lt;br /&gt;
 * Location: tbd&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grand récapitulatif et fête pour [http://wiki.hackuarium.ch/w/Urban_gardens_with_rhizobial_bacteria le premier projet de jardinage urbain] à Hackuarium.  &amp;lt;br&amp;gt;&lt;br /&gt;
Suivant les pas de Gregor Mendel…  &amp;lt;br&amp;gt;&lt;br /&gt;
Qui peut deviner combien des gousses de petits pois ont été récoltés?  &amp;lt;br&amp;gt;&lt;br /&gt;
Des cadeaux attendent ceux qui viendront costumés!&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Summary and party to celebrate the first project on urban gardens at Hackuarium.&amp;lt;br&amp;gt;&lt;br /&gt;
Following the steps of Gregor Mendel...&amp;lt;br&amp;gt;&lt;br /&gt;
Who can guess how many pea pods were harvested??&amp;lt;br&amp;gt;&lt;br /&gt;
Special surprises for those who come in costume!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Personnes qui ont prévu de nous présenter quelque chose ==&lt;br /&gt;
*Rachel et participants de projet de jardinage urbain (Caroline, Sueda, others)&lt;br /&gt;
&lt;br /&gt;
== Slides ==&lt;br /&gt;
* Here is [http://prezi.com/jcx5zw3flzyw/?utm_campaign=share&amp;amp;utm_medium=copy the prezi] used for the pea plant summary and including some points about the future of Hackuarium!&lt;br /&gt;
&lt;br /&gt;
== Infos pratiques (plan d'accès etc) ==&lt;br /&gt;
cf. [[Open_Hackuarium|#OpenHackuarium]]&lt;br /&gt;
&lt;br /&gt;
== Liens externes &amp;amp; Références ==&lt;br /&gt;
* Add link to anything relevant (speaker's bio, website)&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=20180926_OpenHackuarium_221:_DNA_Damage_Studies&amp;diff=19917</id>
		<title>20180926 OpenHackuarium 221: DNA Damage Studies</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=20180926_OpenHackuarium_221:_DNA_Damage_Studies&amp;diff=19917"/>
		<updated>2026-11-04T09:53:35Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: updated categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Oh221DNA.jpg|200px|thumb|]]&lt;br /&gt;
OpenHackuarium #221 - Studies on DNA Damage&amp;lt;br&amp;gt;&lt;br /&gt;
Organisé par Rachel&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ENGLISH BELOW''' &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 * Thème : '''Studies on DNA Damage'''&lt;br /&gt;
 * Date : '''Mercredi 26.09.2018, 19h''', présentation et discussion à 19:30 et jusqu'à 21h&lt;br /&gt;
 * Lieu :Salle Gaston Lagaffe, UniverCité, 3ème étage&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&amp;lt;br&amp;gt;&lt;br /&gt;
 * Main language this week: '''French/English'''&amp;lt;br&amp;gt;&lt;br /&gt;
 * Theme: '''Studies on DNA Damage'''&lt;br /&gt;
 * Date: '''Wednesday 26.09.2018, 19:00''', presentation and discussion start at 19:30&lt;br /&gt;
 * Location: Room &amp;quot;Gaston Lagaffe&amp;quot;, UniverCité, 3rd Floor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programme ==&lt;br /&gt;
* [https://www.researchgate.net/profile/Delphine_Plaire Delphine Plaire] will present her experiences studying DNA damage, from irradiation of test animals to comet assays!  more info coming soon...&lt;br /&gt;
* Additionally, the summer interns, Violaine Regard, Jennifer Veillard, and Vithooban Thavapalan will present short summaries of their results over their 8 weeks in the lab.&lt;br /&gt;
&lt;br /&gt;
== Slides ==&lt;br /&gt;
[http://wiki.hackuarium.ch/images/c/c6/2018_09_26_DelphinePlaire_Pr%C3%A9sentation_DNA_Damage.pdf Presentation] from Delphine Plaire. &amp;lt;br&amp;gt;&lt;br /&gt;
[https://prezi.com/view/PMcwe7vxkdqzS6drJuaS/ Presentation] from the summer interns.&lt;br /&gt;
&lt;br /&gt;
== Infos pratiques (plan d'accès etc) ==&lt;br /&gt;
cf. [[Open_Hackuarium|#OpenHackuarium]]&lt;br /&gt;
&lt;br /&gt;
== Liens externes &amp;amp; Références ==&lt;br /&gt;
*Plaire D., Puaud S., Marsolier-Kergoat M. C. and Elalouf J. M. (2017) Comparative analysis of the sensitivity of metagenomic&lt;br /&gt;
sequencing and PCR to detect a biowarfare simulant (Bacillus atrophaeus) in soil samples. PLoS ONE 12(5).&lt;br /&gt;
*Palacio P., Berthonaud V., Guérin C., Lambourdière J., Maksud F., Philippe M., Plaire D., Stafford T., Marsolier-Kergoat M.&lt;br /&gt;
C. and Elalouf J M. (2017) The first genome on the extinct Bison schoetensacki establish it as a sister species of the extant&lt;br /&gt;
European bison (Bison bonasus). BMC Evolutionary Biology. 17, 48.&lt;br /&gt;
*Parisot F., Bourdineaud J. P., Plaire D., Adam-Guillermin C., and Alonzo, F. (2015) DNA alterations and effects on growth&lt;br /&gt;
and reproduction in Daphnia magna during chronic exposure to gamma radiation over three successive generations. Aquatic&lt;br /&gt;
Toxicology. 163, 27-36.&lt;br /&gt;
*Alonzo F., Zimmer E., Plaire D., Buisset-Goussen A., Adam-Guillermin C., Lecomte-Pradines C., Horemans N. (2014)&lt;br /&gt;
Understanding the “metabolic” mode of actions of two different types of radiation using biokinetics/DEB-tox models, STAR&lt;br /&gt;
deliverable (D-N°5.4)&lt;br /&gt;
*Plaire D., Bourdineaud J.P., Alonzo A., Camilleri V., Garcia-Sanchez L., Adam-Guillermin C. and Alonzo F. (2013)&lt;br /&gt;
Transmission of DNA damage and increasing reprotoxic effects over two generations of Daphnia magna exposed to uranium.&lt;br /&gt;
Comparative biochemistry and physiology – part C. 158 (4), 231-243.&lt;br /&gt;
*Pereira S., Bourrachot S., Cavalie I., Plaire D., Dutilleul M., Gilbin R. and Adam-Guillermin C. (2011) Genotoxicity of acute&lt;br /&gt;
and chronic gamma-irradiation on zebrafish cells and consequences for embryo development. Environmental Toxicology and&lt;br /&gt;
Chemistry, 30 (12) 2831-2837. &lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=20180829_OpenHackuarium_217_-_Sp%C3%A9cial_Nettoyage_de_l%E2%80%99espace&amp;diff=19916</id>
		<title>20180829 OpenHackuarium 217 - Spécial Nettoyage de l’espace</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=20180829_OpenHackuarium_217_-_Sp%C3%A9cial_Nettoyage_de_l%E2%80%99espace&amp;diff=19916"/>
		<updated>2026-11-04T09:51:53Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: updated categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Open Hackuarium #217 - '''Project Updates and Lab Clean-up'''&amp;lt;br&amp;gt;&lt;br /&gt;
Organisé par Rachel&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 '''ENGLISH BELOW''' &amp;lt;br&amp;gt;&lt;br /&gt;
 * Langue principale cette semaine: '''Française'''&amp;lt;br&amp;gt;&lt;br /&gt;
 * Thème : '''Project Updates and Lab Clean-up'''&lt;br /&gt;
 * Date : '''Mercredi 29.08.2018, 19h''', présentation et discussion à 19-20h et nettoyage au labo 20h jusqu'à 21h&lt;br /&gt;
 * Lieu : Salle Gaston Lagaffe, MC, 3ème étage&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 * Main language this week: '''English'''&amp;lt;br&amp;gt;&lt;br /&gt;
 * Theme: '''TITLE'''&lt;br /&gt;
 * Date: '''Wednesday 29.08.2018, 19:00''', presentation and discussion start at 19:00-20 then cleanup of lab afterwards...&lt;br /&gt;
 * Location: Room Gaston Lagaffe, MC, 3rd Floor&lt;br /&gt;
&lt;br /&gt;
Après la session ordinaire #openhackuarium (no217), au cours de laquelle on attend des nouvelles de projets en cours, nous passerons une heure (20h – 21h) pour mettre en ordre le laboratoire et faire un inventaire de notre équipement et de nos consommables.  &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
C'est trés important, tout ça, aussi parce que le mardi 4 septembre on attend des responsables de Berne, qui viendront faire une inspection officielle de notre laboratoire P1!  &amp;lt;br&amp;gt;&lt;br /&gt;
à noter: le laboratoire ne sera donc pas disponible pour effectuer des expériences à ce moment là. &amp;lt;br&amp;gt;&lt;br /&gt;
Merci d’avance pour votre aide afin de le rendre le plus présentable possible. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'***&lt;br /&gt;
After project update presentations on the third floor, we will clean up the lab together and go through our inventory for about an hour!&amp;lt;br&amp;gt;&lt;br /&gt;
It's quite important, because we expect official visitors from Bern to check out our P1 lab on the 4th of September! &amp;lt;br&amp;gt;&lt;br /&gt;
To note, the lab will not be available for experiments for that time.  &amp;lt;br&amp;gt; Thank you in advance for your help to make it in the best state possible! &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Personnes qui ont prévu de nous présenter quelque chose ==&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
== Slides ==&lt;br /&gt;
* Do not forget to upload slides before/after the event if appropriate.&lt;br /&gt;
&lt;br /&gt;
== Infos pratiques (plan d'accès etc) ==&lt;br /&gt;
cf. [[Open_Hackuarium|#OpenHackuarium]]&lt;br /&gt;
&lt;br /&gt;
== Liens externes &amp;amp; Références ==&lt;br /&gt;
* Add link to anything relevant (speaker's bio, website)&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=20180822_OpenHackuarium_216:_Association_Apidae&amp;diff=19915</id>
		<title>20180822 OpenHackuarium 216: Association Apidae</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=20180822_OpenHackuarium_216:_Association_Apidae&amp;diff=19915"/>
		<updated>2026-11-04T09:51:06Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: updated categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; '''ENGLISH BELOW''' &amp;lt;br&amp;gt;&lt;br /&gt;
 * Langue principale cette semaine: '''Français'''&amp;lt;br&amp;gt;&lt;br /&gt;
 * Thème : Présentation de l'[http://www.apidae.ch/ association Apidae].&lt;br /&gt;
 * Date : '''Mercredi 22.08.2018, 19h'''&lt;br /&gt;
 * Lieu : Salle Gaston Lagaffe, MC, 3ème étage&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 * Main language this week: '''French'''&amp;lt;br&amp;gt;&lt;br /&gt;
 * Theme: '''TITLE'''&lt;br /&gt;
 * Date: '''Wednesday 22.08.2018, 19:00'''&lt;br /&gt;
 * Location: Room Gaston Lagaffe, MC, 3rd floor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Personnes qui ont prévu de nous présenter quelque chose ==&lt;br /&gt;
*  l'[http://www.apidae.ch/ association Apidae]. Leur projet : développer un enfumoir électronique.&lt;br /&gt;
** Tanguy&lt;br /&gt;
** Cédric&lt;br /&gt;
&lt;br /&gt;
== Slides ==&lt;br /&gt;
* Do not forget to upload slides before/after the event if appropriate.&lt;br /&gt;
&lt;br /&gt;
== Infos pratiques (plan d'accès etc) ==&lt;br /&gt;
cf. [[Open_Hackuarium|#OpenHackuarium]]&lt;br /&gt;
&lt;br /&gt;
== Liens externes &amp;amp; Références ==&lt;br /&gt;
* http://www.apidae.ch/&lt;br /&gt;
&lt;br /&gt;
=== Liste de courses ===&lt;br /&gt;
* Cigarette électronique pas chère $10 ebay&lt;br /&gt;
* Pompe à air e.g. https://www.ebay.com/itm/USB-Mini-Air-Pump-Eletric-Portable-Quick-Efficient-Light-Weight-Inflatables/253708323463?epid=4020778843&amp;amp;hash=item3b1231ca87:g:losAAOSwAFNbL3OE&lt;br /&gt;
* Liquid Smoke&lt;br /&gt;
* Solution PG (PolyGlycerin) (ask Masoud)&lt;br /&gt;
* &amp;quot;Un arôme synthétique pas toxique pour les larves&amp;quot; =&amp;gt; huile essentielle de Girofle&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Event à suivre pour networking lausannois sur le sujet ===&lt;br /&gt;
Rencard Barbare avec les abeilles urbaines ([https://www.facebook.com/events/2205836419635897/ facebook], [http://www.lausanne.ch/rencardsbarbares liste et concept des rencards barbares])&lt;br /&gt;
&lt;br /&gt;
[[Category:PastEvents]]&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=How_to_collaborate_with_us%3F&amp;diff=19914</id>
		<title>How to collaborate with us?</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=How_to_collaborate_with_us%3F&amp;diff=19914"/>
		<updated>2026-11-04T09:50:16Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category Administration&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists what would be '''the best way to collaborate with us''' if you are:&amp;lt;br&amp;gt;&lt;br /&gt;
* an academic fellow wanting to organize a conference/workshop at [[UniverCité]] and/or with us&lt;br /&gt;
* an artist wanting to do a (bio-art) residency&lt;br /&gt;
* a researcher in an institution and want your students or yourself to work in a different environnement&lt;br /&gt;
* a potential partner&lt;br /&gt;
&lt;br /&gt;
[[Category:Administration]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category: Work In Progress]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Hackuarium&amp;diff=19913</id>
		<title>Hackuarium</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Hackuarium&amp;diff=19913"/>
		<updated>2026-11-04T09:49:40Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category Hackuarium&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[File:Staysafe.png |200px|thumb|right|]]&lt;br /&gt;
&lt;br /&gt;
[[File:Virion.png |75px|thumb|right|]]&amp;lt;p&amp;gt;'''Welcome to Hackuarium, a community lab association in Switzerland,''' where we explore biology, science and technology. &lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;  &amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;  &amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;'''''Bienvenue au Hackuarium, une laboratoire communautaire en la Suisse''', où nous découvrons la biologie, la science et la technologie.'' &lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt; &amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br /&amp;gt;(This is a duplicate of the Main page, and is at risk of not being so regularly updated, unless more join in here...  On va voir!)&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;version actuelle: 22dec21&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
=''C'est quoi, Hackuarium?'' / What is Hackuarium?=&lt;br /&gt;
&lt;br /&gt;
Hackuarium is a not-for-profit association aiming to democratise science through public engagement.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Our laboratories in Ecublens (Switzerland) are open to anyone sharing the values of the association and dedicated to follow the [http://diybio.org/codes/draft-diybio-code-of-ethics-from-european-congress/ DIYbio Europe ethical guidelines].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Our projects are initiated and carried out by scientists and non-scientists from a variety of backgrounds. Our members are passionate about tinkering with biology in particular, and technology in general. Some are engineers, architects, designers, IT and computer scientists or retired professionals, but others have no scientific education. They are mostly people interested in open and participatory research and innovation, outside the constraints of traditional institutions.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hackuarium members want to investigate new ways of carrying out interdisciplinary research and innovation, by making their results open, accessible (low-cost), simple and easily reproducible (low-tech) and by promoting an open source philosophy.&lt;br /&gt;
&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
''Hackuarium est une association à but non lucratif visant à démocratiser la science par l'engagement du public.''&lt;br /&gt;
&lt;br /&gt;
''Nos laboratoires à Ecublens (Suisse) sont ouverts à toute personne partageant les valeurs de l'association et s'engageant à suivre les directives éthiques de DIYbio Europe.''&lt;br /&gt;
&lt;br /&gt;
''Nos projets sont initiés et menés à bien par des scientifiques et des non-scientifiques issus d'horizons divers. Nos membres sont passionnés par le bricolage en biologie en particulier, et en technologie en général. Certains sont ingénieurs, architectes, designers, informaticiens ou professionnels à la retraite, mais d'autres n'ont aucune formation scientifique. Ce sont surtout des personnes intéressées par la recherche et l'innovation ouvertes et participatives, en dehors des contraintes des institutions traditionnelles.''&lt;br /&gt;
&lt;br /&gt;
''Les membres de l'Hackuarium veulent étudier de nouvelles façons de mener des recherches interdisciplinaires et d'innover, en rendant leurs résultats ouverts, accessibles (à faible coût), simples et facilement reproductibles (low-tech) et en promouvant une philosophie open source.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;''Menu de navigation'' / Navigation menu&amp;lt;/h1&amp;gt;				&lt;br /&gt;
&lt;br /&gt;
The Hackuarium Wiki was started in 2015, and has a great deal of information...&lt;br /&gt;
&lt;br /&gt;
This is the newly updated and simplified bilingual entry.&lt;br /&gt;
&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
''Le wiki Hackuarium a été lancé en 2015, et contient de nombreuses informations....''&lt;br /&gt;
&lt;br /&gt;
''Voici l'entrée bilingue nouvellement mise à jour et simplifiée.''&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
We hope to become officially recognised as a public interest group! / ''Nous espérons devenir reconnu comme une association d'utilité publique !''&lt;br /&gt;
&lt;br /&gt;
== [[Events]] ==&lt;br /&gt;
We are staying prudent in the face of 'moronic' variants... / ''On reste prudent face aux variants de corona... =-/''&lt;br /&gt;
&lt;br /&gt;
== [[Projects]] ==&lt;br /&gt;
At least a dozen projects are ongoing, and many times more that archived (and available for further exploration)! /  ''Au moins une douzaine de projets sont en cours, et bien plus encore sont archivés (et disponibles pour une exploration plus approfondie) !''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;&amp;lt;span class=&amp;quot;mw-headline&amp;quot; id=&amp;quot;Contribute_to_the_wiki&amp;quot;&amp;gt;''Contribuer au wiki de Hackuarium'' / Contribute to the Hackuarium wiki&amp;lt;/span&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Remember, a wiki is simply a website or online resource that can be edited by multiple users. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;That means this website is really meant to be edited by &amp;lt;b&amp;gt;YOU&amp;lt;/b&amp;gt; (like for Wikipedia!) to openly document your research projects and share not just knowledge but know-how! &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;You are not a spam bot, are you?&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Here is a [http://en.wikipedia.org/wiki/Help:Editing great starting point to get help on editing] a wiki.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Most important is to '''find the fun - then it's a snap'''! (thx to MP for this)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;/&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''N'oubliez pas - un wiki est simplement un site web ou une ressource en ligne qui peut être modifié par plusieurs utilisateurs.'' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''Cela signifie que ce site est vraiment destiné à être édité par VOUS (comme pour Wikipedia !) pour documenter ouvertement vos projets de recherche et partager non seulement des connaissances mais aussi du savoir-faire !''&lt;br /&gt;
&amp;lt;/p&amp;gt;''Vous n'êtes pas un robot spammeur, n'est-ce pas ?''&lt;br /&gt;
&lt;br /&gt;
''Voici un [https://fr.wikipedia.org/wiki/Aide:Comment_modifier_une_page excellent point de départ pour obtenir de l'aide sur l'édition] d'un wiki.''&lt;br /&gt;
&lt;br /&gt;
''Le plus important est de trouver le plaisir - ensuite c'est un jeu d'enfant ! (merci à MP pour cela)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Check out some old wiki pages with the tool 'Random page' in the menu to the left!&lt;br /&gt;
&lt;br /&gt;
''Explorer les pages anciens avec 'Random page' dans le menu à gauche'' !&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;printfooter&amp;quot;&amp;gt;						&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;visualClear&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==''Membres et adhésions'' / Members and membership ==&lt;br /&gt;
'''Do you have a project in mind? ''Avez-vous un projet en tête?'''''&lt;br /&gt;
&lt;br /&gt;
'''Do you just want to support us? ''Voulez-vous nous simplement soutenir?'''''&lt;br /&gt;
&lt;br /&gt;
Hackuarium operates on a membership basis, even though all events are open to anyone, including non-members.&lt;br /&gt;
&lt;br /&gt;
The monthly membership fee is 20 CHF. It gives 24/7 access to the lab.&lt;br /&gt;
&lt;br /&gt;
We would love to have you as a member! Just follow the instructions below.&lt;br /&gt;
*Want to join? ''Voulez-vous nous rejoindre?''&lt;br /&gt;
&lt;br /&gt;
* We have a [https://docs.google.com/forms/d/e/1FAIpQLSdoyS8HmsuZACYp-q79pLzxR9BPA60HbyL6ZR8x7h7x3eqbhQ/viewform form on the website], to fast-track joining the community, if you are keen, perhaps after a few #OpenHackuarium experiences (every Wednesday evening is open to the public).&lt;br /&gt;
*''Nous disposons d'un formulaire sur le site web, pour rejoindre rapidement la communauté, si vous êtes enthousiaste, peut-être après quelques expériences de #OpenHackuarium (chaque mercredi soir est ouvert au public).''&lt;br /&gt;
&lt;br /&gt;
* Read some helpful info [[I m new|here]]. /  ''Lisez quelques informations utiles là.''&lt;br /&gt;
&lt;br /&gt;
* Write an email to hello@hackuarium.ch and give us a short description of:&lt;br /&gt;
** Yourself, your interests, your background&lt;br /&gt;
** What you would like to learn or do at Hackuarium&lt;br /&gt;
** &lt;br /&gt;
*''Écrivez un courriel à hello@hackuarium.ch et donnez-nous une brève description de :''  ''Vous-même, vos centres d'intérêt, votre parcours.''  ''Ce que vous aimeriez apprendre ou faire au Hackuarium.''&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Membership fees and Access  / ''Cotisation et accès'''''&lt;br /&gt;
&lt;br /&gt;
Hé oui pour que le labo puisse tourner il faut des fonds. Nous appliquons pour l'instant une cotisation de 20.- par mois. Tu es libre de donner plus, toute aide financière est bienvenue et nous permet d'équiper les lieux au mieux!&lt;br /&gt;
&lt;br /&gt;
L'accès au bâtiment est sécurisé par des &amp;quot;accès badges&amp;quot;. La carte peut être obtenue pour la somme de 50.- et donne accès au laboratoire et au lieu 24/7. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bank details  ''/ Nos coordonnées bancaires sont:'''''&lt;br /&gt;
&lt;br /&gt;
Banque Alternative Suisse&lt;br /&gt;
&lt;br /&gt;
En faveur du compte : Association Hackuarium&lt;br /&gt;
&lt;br /&gt;
Adresse : Route de Crochy 20, 1024 Ecublens&lt;br /&gt;
&lt;br /&gt;
IBAN : CH59 0839 0033 4153 1000 3&lt;br /&gt;
&lt;br /&gt;
Swift/BIC : ABSOCH22 numéro de compte: 334.153.100-03&lt;br /&gt;
&lt;br /&gt;
N'oublie pas lorsque tu paies de préciser ton identité!&lt;br /&gt;
&lt;br /&gt;
=''Vers du biohacking durable'' / Toward Sustainable Biohacking =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The cooperative space in Ecublens is only provisional - we need support and concrete plans for the future.&lt;br /&gt;
&lt;br /&gt;
You can help!&lt;br /&gt;
&lt;br /&gt;
''L'espace coopérative en Ecublens est provisoire. Nous allons besoin de soutien et des plans concrets pour l'avenir.''&lt;br /&gt;
&lt;br /&gt;
''Vous pouvez nous aider !''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Dreams&lt;br /&gt;
*Actions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
all [[old archived|old pages are archived]], of course&lt;br /&gt;
/ ''toutes les pages [[FR Oldversion|anciennes sont archivés]], bien sûr''&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hackuarium]]&lt;br /&gt;
[[Category:Work In Progress]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=I_m_new&amp;diff=19912</id>
		<title>I m new</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=I_m_new&amp;diff=19912"/>
		<updated>2026-11-04T09:48:33Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category Administration&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
[[File:Code values logo.jpg|thumb|''explications supplémentaires pour les inquiets..'' / extra explications for the worried... =P]]&lt;br /&gt;
Nouveau membre de Hackuarium? Bienvenue à toi!&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si tu es sur cette page c'est probablement que tu viens de rejoindre l'association et que ton aventure débute.&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir prendre tes marque, on te conseille de lire ce qui suit pour bien commencer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= L'association =&lt;br /&gt;
&lt;br /&gt;
L'association Hackuarium a été officiellement fondée en août 2014, mais les activités ont commencé dès le mois de mars de cette même année.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L'association Hackuarium a pour buts les éléments suivants:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Promouvoir de façon strictement non lucrative une approche de la biologie et des sciences associées qui soit ludique, éducative, interdisciplinaire, collaborative, et ouverte à tous sans discrimination basée sur I'âge, Ie niveau d'éducation ou I'appartenance à un corps professionel particulier,&lt;br /&gt;
* Promouvoir une innovation à bas coût (low-cost) et basée sur des technologies facilement accessibles et reproductibles (low-tech),&lt;br /&gt;
*Fédérer des individus ayant des compétences variées et leur permettre de travailler ensemble sur des projets dont I'intérêt est identifié par la communauté de membres,&lt;br /&gt;
*Fédérer les acteurs locaux afin de promouvoir dialogue et projets à une échelle européenne et mondiale,&lt;br /&gt;
*Promouvoir l'usage et le développement des outils libres ('open source') pour pouvoir abaisser les barrières d'accès à la recherche et I'innovation, en particulier la biologie et la biotechnologie, et surtout&lt;br /&gt;
*Développer les points ci-dessus en s'efforgant de respecter la charte éthique de DlYbio Europe (voir ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Si tu veux en savoir plus, les status de l'association Hackuarium sont disponibles [[Statuts_Association_Hackuarium | ici]].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Comportement des membres et charte éthique =&lt;br /&gt;
&lt;br /&gt;
Tous les membres de l'association Hackuarium s'engagent à respecter les autres membres, ainsi que toutes les personnes qui participent au activités de l'association - de près ou de loin - selon les [[Life_Main | règles de conduites]] (en anglais).&lt;br /&gt;
&lt;br /&gt;
Les membres s'engagent aussi à suivre les points mentionnés dans la charte éthique du movement européen de biologie Do-It-Yourself ([http://diybio.org/codes/draft-diybio-code-of-ethics-from-european-congress/ DIYbio Europe ethical guidelines], en anglais).&lt;br /&gt;
&lt;br /&gt;
= Le outils informatiques =&lt;br /&gt;
&lt;br /&gt;
Travailler en groupe demande de la coordination et d'être constamment en communication. Pour cela nous utilisons quelques outils que tout membre doit maîtriser. &lt;br /&gt;
&lt;br /&gt;
== Slack == &lt;br /&gt;
&lt;br /&gt;
[https://slack.com/ Slack] est le pilier principal de communication au sein d'Hackuarium. Cet outil est composé de 3 interfaces (détaillé en dessous): A gauche les canaux de communications. On y retrouve les cannaux principaux (_xyz), les groupes de travails (#wg) et les groupes personnels. Au centre la zone de communication permet d'interagir au sein du canal (chat, partage de fichiers, fotos...) et au final à droite on peut avoir différents onglets comme le profil d'un membre, la déscription d'un fichier etc.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En tant que membre il est demandé d'être sur les canaux suivants: _general, wg-biolab, wg-onlinetools et _random.&lt;br /&gt;
Ces canaux sont importants car ils permettent de faire passer:&lt;br /&gt;
*les communications générales relative aux activités de l'association (-&amp;gt; _general)&lt;br /&gt;
*les informations concernant le laboratoire et son utilisation (matériel, problèmes techniques, conseils, aide pour la collecte du matériel, crises générale de &amp;quot;qui à pas lavé ceci ou cela -&amp;gt; wg-biolab)&lt;br /&gt;
*les demandes d'accès et de conseil pour l'utilisation de Slack, du wiki, du site, des mail (-&amp;gt; wg-onlinetools)&lt;br /&gt;
*espace détente pour les dernières infos scientifiques ou autres fun facts (-&amp;gt; random)&lt;br /&gt;
&lt;br /&gt;
Nous t'invitons aussi à consulter la panoplie de canaux qui existent et qui pourraient t’intéresser. Quand un nouveau projet est lancé, un #wg est créé.&lt;br /&gt;
&lt;br /&gt;
[[File:Slack1.PNG|600px|thumb|center|Voici à quoi ressemble la fenêtre principale de Slack]]&lt;br /&gt;
&lt;br /&gt;
== Le wiki ==&lt;br /&gt;
&lt;br /&gt;
Le wiki d'Hackuarium est le site sur lequel tu te trouves. Chaque membre doit utiliser le wiki et doit donc obtenir des droits pour pouvoir éditer les pages. Une des règles d'Hackuarium est que chaque projet doit avoir une page wiki qui est tenue comme un cahier de laboratoire. En effet, il est important pour nous de partage notre connaissance et la connaissance que nous partageons est le seul moyen de montrer qu'Hackuarium est un lieu vivant ou beaucoup de projets germent et vont de l'avant.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Editer une page wiki est très facile, tu trouvera les information [[Editing_the_wiki | ici]]. Prends le temps de t'inspirer des projets d'autres membres si tu n'as jamais tenu un cahier de laboratoire (après libre à toi de t'exprimer comme bon te semble).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour obtenir un compte et te permettre de travailler sur la page de ton projet, tu dois commencer par t'inscrire [http://wiki.hackuarium.ch/index.php?title=Special:UserLogin&amp;amp;returnto=I+m+new&amp;amp;type=signup ici] et faire ensuite une demande à Rachel, Tatiana ou autre responsable IT sur le Slack pour obtenir les droits de modification.&lt;br /&gt;
&lt;br /&gt;
= Laboratoire, matériel et travail en groupe = &lt;br /&gt;
&lt;br /&gt;
Oui, c'est un vrai labo et une vraie communauté. Certaines règles de base s'appliquent et sont détaillées dans [http://wiki.hackuarium.ch/w/Life_Main ce document]. Il est demandé de parcourir cette page mais les points principaux son listés si dessous. &amp;lt;br&amp;gt;&lt;br /&gt;
::&amp;lt;li&amp;gt; il est indispensable de suivre [http://www.hackuarium.ch/our-values/ notre charte éthique]. &lt;br /&gt;
::&amp;lt;li&amp;gt; Chaque projet peut avoir une boite de projet pour stocker le matériel. Cette boite peut être déposée sur une des étagères et doit clairement être marquée du nom de son propriétaire ainsi que du nom du projet&lt;br /&gt;
::&amp;lt;li&amp;gt; Le laboratoire contient les instruments et le matériel commun qui peut-être utilisé par chaqu'un après avoir appris comment l'utiliser (..''&amp;lt;u&amp;gt;avoir lu le manuel d'utilisation. La page ancienne qui a recensé tout les instruments est [http://wiki.hackuarium.ch/w/Instru_Main ici].&amp;lt;/u&amp;gt;'' &lt;br /&gt;
::&amp;lt;li&amp;gt; '''''N'utilisez pas un instrument si vous avez des doutes. Demandez de l'aide sur Slack, du responsables de bioséc ou à un membre.''''' &lt;br /&gt;
::&amp;lt;li&amp;gt; Le laboratoire est un lieu vivant et il incombe à chacun de faire un maximum pour l'optimiser, le maintenir sûr et propre.&lt;br /&gt;
&lt;br /&gt;
= La présentation =&lt;br /&gt;
La présentation est une étape obligatoire pour tout membre qui désire proposer un projet. Ce &amp;quot;rite d'initiation&amp;quot; a un format libre et ne nécessite pas d'être long. 20 minutes maximum de présentation sont une bonne règle sachant que l'engouement des membres pour un nouveau projet généralement prolonge cette durée largement. Le comité proposera une date pour la présentation afin que plusieurs sujets soient discutés le même soir ce qui généralement attire plus de  gens. La communauté décide au final si ce projet est réalisable entre les murs d'Hackuarium selon les critères suivants:&amp;lt;br&amp;gt;&lt;br /&gt;
::&amp;lt;li&amp;gt; Le projet suit-il la charte éthique ?&lt;br /&gt;
::&amp;lt;li&amp;gt; Les besoins techniques pour ce projet sont-ils réalistes à notre niveau&lt;br /&gt;
::&amp;lt;li&amp;gt; L'initiateur du projet est-il prêt à partager ses connaissances au meilleur de ses capacités et à suivre l'idéologie open-source ?&lt;br /&gt;
::&amp;lt;li&amp;gt; '''Le nouveau membre s'engage-il à tenir sa page wiki à jour ?'''&lt;br /&gt;
&lt;br /&gt;
= Cotisation et accès =&lt;br /&gt;
Hé oui pour que le labo puisse tourner il faut des fonds. Nous appliquons pour l'instant une cotisation de 20.- par mois. Tu es libre de donner plus, toute aide financière est bienvenue et nous permet d'équiper les lieux au mieux!&amp;lt;br&amp;gt;&lt;br /&gt;
L'accès au bâtiment est sécurisé par des &amp;quot;accès badges&amp;quot;. La carte peut être obtenue pour la somme de 50.- et donne accès au laboratoire et au lieu 24/7.&lt;br /&gt;
Les coordonnées bancaires sont:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Banque Alternative Suisse&amp;lt;br&amp;gt;&lt;br /&gt;
En faveur du compte : Association Hackuarium&amp;lt;br&amp;gt;&lt;br /&gt;
Adresse : Route de Crochy 20, 1024 Ecublens&amp;lt;br&amp;gt;&lt;br /&gt;
IBAN : CH59 0839 0033 4153 1000 3&amp;lt;br&amp;gt;&lt;br /&gt;
Swift/BIC : ABSOCH22&lt;br /&gt;
numéro de compte: 334.153.100-03&amp;lt;br&amp;gt;&lt;br /&gt;
N'oublie pas lorsque tu paies de préciser ton identité!&lt;br /&gt;
&lt;br /&gt;
[[Category:Administration]]&lt;br /&gt;
[[Category:Work In Progress]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Join&amp;diff=19911</id>
		<title>Join</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Join&amp;diff=19911"/>
		<updated>2026-11-04T09:47:48Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category Administration&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to join Hackuarium as a member? Why?&lt;br /&gt;
&lt;br /&gt;
=Why=&lt;br /&gt;
&lt;br /&gt;
=How=&lt;br /&gt;
&lt;br /&gt;
[[Category:Administration]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Work In Progress]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Kit&amp;diff=19910</id>
		<title>Kit</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Kit&amp;diff=19910"/>
		<updated>2026-11-04T09:47:05Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category Administration&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Accueil nouveaux membres Hackuarium, présentation des outils informationnels indispensables ==&lt;br /&gt;
Hackeurs, Hackeuses!&lt;br /&gt;
Nous vous souhaitons la bienvenue dans notre association.  &lt;br /&gt;
Afin de coordonner la création et la collaboration de nos divers projets nous avons mis en place un certain nombre d'outils informatiques qui vous aiderons dans cette tâche.&lt;br /&gt;
  &lt;br /&gt;
1) Hackpad&lt;br /&gt;
La première étape est la création du Hackpad avec un bref descriptif du projet, les outils à utiliser, etc. En bref, une première version du projet en cours. Parlez nous-en un mercredi et partagez l'URL avec nous pour une collaboration et une échange d'idées active. Cette première étape n'est que temporaire. Pour faciliter la discussion sur votre projet rejoignez &amp;quot;Slack&amp;quot;. De même, lorsque le projet commence à prendre forme il  s’agirait de le poster sa description, sa réalisation etc. sur le &amp;quot;wiki&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
2) Slack (Autrement dit, le &amp;quot;chat sous stéroïdes&amp;quot;)&lt;br /&gt;
Créez un canal spécifique pour une discussion simple et efficace entre les personnes associés à votre projet.&lt;br /&gt;
Plateforme destinée à la discussion entre membres qui permet d'éviter le spam des mails, une  centralisation d'échanges et un accès facile à l'historique, permettant à toute personne d’accéder au work in progress de l'ensemble de nos projets.   &lt;br /&gt;
Pour vous inscrire dans notre groupe Slack, demandez les accès à Yann Heurtaux (yh@shalf.me) ou à Michal Masternak (mmastern.pro@gmail.com). &lt;br /&gt;
&lt;br /&gt;
3) Wiki&lt;br /&gt;
Plateforme destinée aux versions finalisées des projets, et à toute l'info pérenne de référence (ce manuel, par exemple). Tout projet réalisé au sein de Hackuarium doit, tôt ou tard, trouver son chemin sur le wiki.&lt;br /&gt;
&lt;br /&gt;
4) Outils Complémentaires.&lt;br /&gt;
Nous avons également mis en place un google Calendar pour vous permettre de suivre de près les activités et événements organisés par Hackuarium. Comme dans le cas de Slack demandez les accès à Yann Heurtaux (yh@shalf.me) ou à Michal Masternak (mmastern.pro@gmail.com). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En vous souhaitant un bon hacking,&lt;br /&gt;
Le comité de Hackuarium.&lt;br /&gt;
&lt;br /&gt;
* Bill of materials: https://docs.google.com/spreadsheets/d/1P4_6Q4sQQeA3wbTigdpCWLHJc3eHW1wvyFZSNLvb0gA/edit#gid=0&lt;br /&gt;
&lt;br /&gt;
== Electronics ==&lt;br /&gt;
This is a basic kit including an arduino, a display, buttons, sensors and everything to put it all together. Visitors can quickly dive in and make a device to support their biology / chemistry experiment.&lt;br /&gt;
* Mossphone&lt;br /&gt;
* Biometrics&lt;br /&gt;
* Experiment Monitoring Device (Temperature/Humidity/pH)&lt;br /&gt;
&lt;br /&gt;
== Biology ==&lt;br /&gt;
&lt;br /&gt;
* Strawberry DNA thing&lt;br /&gt;
* Air sampling&lt;br /&gt;
* Microbial fuel cell&lt;br /&gt;
* [https://twitter.com/lu_cyp/status/572693399083606016 Cellfie] (Microscope + Polaroid = &amp;lt;3)&lt;br /&gt;
&lt;br /&gt;
== Chemistry ==&lt;br /&gt;
* pH measurement&lt;br /&gt;
* Lemon battery&lt;br /&gt;
&lt;br /&gt;
[[Category:Administration]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category: Projects]]&lt;br /&gt;
[[Category: Work In Progress]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Main_Page&amp;diff=19909</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Main_Page&amp;diff=19909"/>
		<updated>2026-11-04T09:45:29Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category Hackuarium&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;p&amp;gt;'''Welcome to Hackuarium, a community lab association in Switzerland,''' where we explore biology, science and technology and promote participatory research. &lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;  &amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;  &amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;'''''Bienvenue au Hackuarium, une laboratoire communautaire en la Suisse''', où nous découvrons la biologie, la science et la technologie et encourageons la recherche participative.'' &lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt; &amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;''&amp;lt;small&amp;gt;&amp;lt;br /&amp;gt;This wiki is meant to be bilingual, and any feedback is welcome!&amp;lt;/small&amp;gt;''&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;''&amp;lt;small&amp;gt;Ce wiki est censé être bilingue, et tout commentaire est le bienvenu !&amp;lt;/small&amp;gt;''&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;[https://www.hackuarium.ch &amp;lt;big&amp;gt;This will lead to our current website.&amp;lt;/big&amp;gt;]   (This was [https://web.archive.org/web/20191209020100/http://www.hackuarium.ch/en/ our ancient beloved website] - still 'alive' thanks to the Wayback Machine...)&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;''[https://www.hackuarium.ch &amp;lt;big&amp;gt;Voici notre site web.&amp;lt;/big&amp;gt;]  (Ici s'agissait de [https://web.archive.org/web/20191209020100/http://www.hackuarium.ch/en/ notre ancien site web] bien-aimé, qui est toujours « vivant » grâce à la Wayback Machine...)''&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;big&amp;gt;''Grandes nouvelles'' / Big News&amp;lt;/big&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Our status as a public service group has been officially renewed by the Vaud tax office, which continues keeping this community lab association like the Swiss equivalent of a tax exempt '501c3' organisation.&amp;lt;/big&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
'''Thanks to all the people that helped this happen!'''&lt;br /&gt;
&lt;br /&gt;
Hoping this will help make us a truly sustainable organisation.&lt;br /&gt;
[[File:Attest utilpub.jpg|alt=|thumb|The letter was in our mailbox today (29.10)! / La lettre était dans notre boîte aux lettres aujourd’hui !]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;''Hoping we will get more people to join in for this open science adventure!''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;Come learn more at Hackuarium, where we mix biology and technology to solve problems, democratise research, and have fun!&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Join in for our #OpenHackuarium open door evenings every Wednesday from 19h, to which anyone is welcome.  Maybe some of you are starting to make the habit to come every Wednesday?!   &lt;br /&gt;
&lt;br /&gt;
Here are some of the [[OldBigNews|old 'Big News']] items so you can see what else has been going on...&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;big&amp;gt;/&amp;lt;/big&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Notre statut d'association d'utilité publique a été officiellement renouvelé par l'administration fiscale vaudoise, ce qui fait de cette association de laboratoires communautaires toujours l'équivalent suisse d'une organisation exonérée d'impôt de type « 501c3 ».&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Merci à toutes les personnes qui ont contribué à cette reconnaissance !'''&lt;br /&gt;
&lt;br /&gt;
Nous espérons que cela nous aidera à devenir une organisation véritablement durable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;big&amp;gt;Nous espérons que de plus en plus de personnes se joindront à nous dans cette aventure en science ouverte !&amp;lt;/big&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
'''''&amp;lt;big&amp;gt;Venez en apprendre plus à Hackuarium, où nous allions biologie et technologie pour résoudre des problèmes, démocratiser la recherche, et s'amuser !&amp;lt;/big&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Venez et participez à notre #OpenHackuarium soirées de portes ouvertes tous les mercredis à partir de 19h. Quelques d'entre vous commencent ''à prener l'habitude de venir tous les mercredis  peut-être?!'' &lt;br /&gt;
&lt;br /&gt;
Voici quelques [[OldBigNews|anciennes &amp;quot;grandes nouvelles&amp;quot;]] pour vous permettre de voir ce qui s'est passé..&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==''Prochains Événements'' / Next [[Events]]==&lt;br /&gt;
[[File:3dprinthex.jpg|alt=|thumb|Plus de Hexagons prévu pour mettre près des ruches !  / More hexagons to put by beehives being made!]]&lt;br /&gt;
[[File:Waterbear16apr24.png|alt=|thumb|More waterbears around the lab...  =) ([https://drive.google.com/file/d/1FOMktO9UNG554jIdOjjFPhuDtt5z7TLm/view?usp=sharing here's 3s] of it 'swimming'...)]]&lt;br /&gt;
Normally, we have '''Wednesday evening #OpenHackuarium sessions''' for anyone to attend, not just members.&lt;br /&gt;
&lt;br /&gt;
This is the upcoming list of themes for these:  &lt;br /&gt;
&lt;br /&gt;
'''#OH Thèmes / Dates'''&lt;br /&gt;
&lt;br /&gt;
4 nov - #OH sur notre resources (inventaire et matos) et réunion du comité&lt;br /&gt;
&lt;br /&gt;
11 nov - #OH Update scarabée japonais&lt;br /&gt;
&lt;br /&gt;
18 nov - #OH Robotique pour les 55+&lt;br /&gt;
&lt;br /&gt;
25 nov - #OH fin du mois - soirée 'Make' &lt;br /&gt;
&lt;br /&gt;
et pour la fin du mois de novembre ? pour le 'special meetup night' ??&lt;br /&gt;
&lt;br /&gt;
Compte sur les bonnes moments...&lt;br /&gt;
&lt;br /&gt;
Thèmes préférées pour automne 2026 ? -&amp;gt; nous dire svp !                                                                                &lt;br /&gt;
&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
''Normalement, nous avons tous les mercredis les '''soirées portes ouvertes #OpenHackuarium''' aux quelles tout le monde peut venir assister, pas seulement membres.'' &lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Come Wednesdays for '''#OpenHackuarium from 19h!'''&amp;lt;/big&amp;gt;  &amp;lt;small&amp;gt;SVP voir la liste de thèmes dessus...&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;big&amp;gt;Venez les mercredis pour les soirées '''#OpenHackuarium de 19h !'''&amp;lt;/big&amp;gt;C'est quoi, Hackuarium?'' / What is Hackuarium?[[File:Dried scoby split.jpg|thumb|''une alternative microbienne au cuir'' / a microbial alternative to leather, 'scoby' cellulose ''de'' / from kombucha.]]&lt;br /&gt;
Hackuarium is a not-for-profit Swiss association aiming to democratise science through public engagement. &amp;lt;br&amp;gt;&lt;br /&gt;
We are a community laboratory for open science for everyone.&lt;br /&gt;
&lt;br /&gt;
Our laboratories in Ecublens (Switzerland) are open to anyone sharing the values of the association and dedicated to follow the [http://diybio.org/codes/draft-diybio-code-of-ethics-from-european-congress/ DIYbio Europe ethical guidelines].&lt;br /&gt;
&lt;br /&gt;
Our projects are initiated and carried out by scientists and non-scientists from a variety of backgrounds. Our members are passionate about tinkering with biology in particular, and technology in general. Some are engineers, architects, designers, IT and computer scientists or retired professionals, but others have no scientific education. They are mostly people interested in open and participatory research and innovation, outside the constraints of traditional institutions.&lt;br /&gt;
&lt;br /&gt;
Hackuarium members' projects are our driving force. Interdisciplinary groups passionate about something and access to the varied upcycled resources in the lab are our key means by which to innovate and investigate new ways of carrying out research.  Making the results open, accessible (low-cost), simple and easily reproducible (low-tech) and promoting an open source philosophy are ideal outcomes of our work.  All old projects are available for reuse, revision and hacking out parallel attempts, also internationally... &lt;br /&gt;
&lt;br /&gt;
As  a community lab association officially recognised as a public service group, we look forward to seeing you here sometime soon!    &lt;br /&gt;
&lt;br /&gt;
If an #OpenHackuarium Wednesday evening won't work for you, we can make a date!   &lt;br /&gt;
&lt;br /&gt;
Let us know if you are interested in collaborations!  &lt;br /&gt;
&lt;br /&gt;
Write us with any questions or comments at hello (at) hackuarium (dot) ch&lt;br /&gt;
&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
''Hackuarium est une association suisse à but non lucratif visant à démocratiser la science par l'engagement du public.''&lt;br /&gt;
&lt;br /&gt;
''Nos laboratoires à Ecublens (Suisse) sont ouverts à toute personne partageant les valeurs de l'association et s'engageant à [https://drive.google.com/file/d/1MEZDmBrBgi-B4iAKd2Dh9KXBcM8Zst-u/view?usp=sharing suivre les directives éthiques de DIYbio Europe].''&lt;br /&gt;
&lt;br /&gt;
''Nos projets sont initiés et menés à bien par des scientifiques et des non-scientifiques issus d'horizons divers. Nos membres sont passionnés par le bricolage en biologie en particulier, et en technologie en général. Certains sont ingénieurs, architectes, designers, informaticiens ou professionnels à la retraite, mais d'autres n'ont aucune formation scientifique. Ce sont surtout des personnes intéressées par la recherche et l'innovation ouvertes et participatives, en dehors des contraintes des institutions traditionnelles.''&lt;br /&gt;
&lt;br /&gt;
''Les projets des membres du Hackuarium sont notre force motrice. Des groupes interdisciplinaires passionnés par un sujet et l'accès aux diverses ressources recyclées du laboratoire sont nos principaux moyens d'innover et d'étudier de nouvelles façons de mener des recherches. Rendre les résultats ouverts, accessibles (à faible coût), simples et facilement reproductibles (à faible technicité) et promouvoir une philosophie de source ouverte sont les résultats idéaux de notre travail. Tous les anciens projets sont disponibles pour la réutilisation, la révision et le 'hacking' de tentatives parallèles, également au niveau international...''&lt;br /&gt;
&lt;br /&gt;
En tant qu'une association de laboratoire communautaire '''''[[Utilité publique|reconnue officiellement d'utilité publique]]''''', ''nous sommes impatients de vous voir ici bientôt ! Si un mercredi soir de #OpenHackuarium ne vous convient pas, nous pouvons fixer une date !'' &lt;br /&gt;
&lt;br /&gt;
''Faites-nous savoir si vous êtes intéressés par des collaborations !''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;''Menu de navigation'' / Navigation menu&amp;lt;/h1&amp;gt;				&lt;br /&gt;
&lt;br /&gt;
The '''Hackuarium Wiki''' was started in 2015, and has a great deal of information...[[File:Aussibeach.png|thumb|left|salt water down under / ''l'eau salée dans l'Australie'']]&lt;br /&gt;
[[File:Mtblancdemorges.jpg|thumb|The view from Morges, not far from our space in Ecublens. Would that Mont Blanc would always stay white, not become gray... The climate also is a focus here. / ''le vue de Morges, pas loin de notre espace en Ecublens. Si seulement le Mont Blanc restait toujours blanc, et ne devenait pas gris... le climat est également une préoccupation.'']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''This is the updated and simplified bilingual entry.'''&lt;br /&gt;
&lt;br /&gt;
This 'biohacking' adventure has already been going on over 10 years!  &lt;br /&gt;
&lt;br /&gt;
(Hackuarium's official 'birthday' is 13Aug2014.)  &lt;br /&gt;
&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
''Le '''wiki de Hackuarium''' a été lancé en 2015, et contient de nombreuses informations....''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Voici l'entrée bilingue mise à jour et simplifiée.'''''&lt;br /&gt;
&lt;br /&gt;
''Cette aventure de &amp;quot;biohacking&amp;quot; dure déjà depuis plus de 10 ans !''  &lt;br /&gt;
&lt;br /&gt;
''(L'anniversaire officiel de Hackuarium est le 13 août 2014).''  &lt;br /&gt;
&lt;br /&gt;
==&amp;lt;big&amp;gt;''L'emplacement'' / [[Site]]&amp;lt;/big&amp;gt;==&lt;br /&gt;
We share a cooperative space in Ecublens, Switzerland, near Lausanne, with a couple of other associations interested in hacking and making.  These include an association to make model trains by 3D printing and [https://polymeka.ch/ Polymeka], where you can do everything from wood to metal work. Rapid prototyping, anyone? &lt;br /&gt;
&lt;br /&gt;
Some startups including (traditionally ;P ) a fermented beverage company, to round out our group in this nice space in Ecublens.  &lt;br /&gt;
&lt;br /&gt;
One must note, however, this space is not our long term home and is destined to be destroyed. In 3-5 years they said when we signed the renters' agreement in 2019. &lt;br /&gt;
&lt;br /&gt;
Any ideas for planning for our future new home warmly welcomed! &lt;br /&gt;
&lt;br /&gt;
/ &lt;br /&gt;
&lt;br /&gt;
''Nous partageons un espace coopératif à Ecublens, en Suisse, près de Lausanne, avec quelques autres associations intéressées par le hacking et le making. Il s'agit notamment d'une association dédiée à la fabrication de trains miniatures par impression 3D, et Polymeka, où vous pouvez tout faire, du travail du bois au travail du métal. Prototypage rapide, quelqu'un ?''&lt;br /&gt;
&lt;br /&gt;
''Quelques startups, dont (traditionnellement ;P ) une entreprise spécialisée dans les boissons fermentées, complètent notre groupe dans cet espace sympa en Ecublens.''&lt;br /&gt;
&lt;br /&gt;
''Il faut noter, cependant, que cet espace est provisoire, à détruire dans 3 ou 5 ans quand nous avons signé le bail en 2019...'' &lt;br /&gt;
&lt;br /&gt;
''N'hésitez pas à nous faire part de vos idées pour planifier notre futur space !''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;big&amp;gt;''Nouvelles'' / News&amp;lt;/big&amp;gt;==&lt;br /&gt;
[[File:Flyer19jan25sma.jpg|alt=|left|thumb|''Découvrez la science ouverte et le biohacking au Hackuarium !'' / Explore Open Science and Biohacking at Hackuarium!]]&lt;br /&gt;
&lt;br /&gt;
We look forward to having more local peeps checking out the lab and biohacking. You can show people our wiki or a flyer (like the one to the left).                    &lt;br /&gt;
&lt;br /&gt;
We may be putting together a program for workshops soon!   Let us know your hopes!                    &lt;br /&gt;
&lt;br /&gt;
N''ous nous réjouissons à l'idée que d'autres personnes de la ville viendront visiter le laboratoire et découvrir le biohacking.'' ''Vous pouvez montrer notre 'flyer' (à gauche) ou ce wiki aux personnes potentiellement intéressées.'' &lt;br /&gt;
&lt;br /&gt;
''Nous également pouvions mettre en place un nouveau programme d'ateliers ! Faites-nous part de vos espoirs !''&lt;br /&gt;
&lt;br /&gt;
See below, under Press, for more on our newsletters. You can find an archive of old ones in the links below, too...[[File:Logoplay.png|thumb|bioart bot image|alt=|200x200px]]&lt;br /&gt;
[[File:Bioartbot2.jpeg |200px|thumb|right|&amp;lt;small&amp;gt;thx esp to Tim Dobbs&amp;lt;/small&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
''Les liens vers le newsletter et les anciennes editions archivées sont trouvée dessous, dans le rubrique Médias et presse.''&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;big&amp;gt;''Événements'' / [[Events]]&amp;lt;/big&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Venez nous voir en Ecublens !&lt;br /&gt;
&lt;br /&gt;
''En tant qu'une association de laboratoire communautaire'' '''''[[Utilité publique|reconnue officiellement d'utilité publique]]''''', ''nous organisons de nombreux événements, et nous sommes impatients de vous voir ici bientôt !'' &lt;br /&gt;
&lt;br /&gt;
'''On peut planifer plus des ateliers aussi !''' (voir notre page [[Atelier à GoGo|atelier à gogo]]) &lt;br /&gt;
&lt;br /&gt;
''Normalement, nous avons encore tous les mercredis les soirées portes ouvertes - #OpenHackuarium - auxquelles tout le monde peut venir assister.''&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;big&amp;gt;Venez les mercredis pour les soirées #OpenHackuarium de 19h !&amp;lt;/big&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
''Si un mercredi soir de #OpenHackuarium ne vous convient pas, nous pouvons fixer une date !''&lt;br /&gt;
&lt;br /&gt;
Voie dessus pour le calendrier des mercredis...&lt;br /&gt;
&lt;br /&gt;
/  &lt;br /&gt;
&lt;br /&gt;
Come see us in Ecublens!   &lt;br /&gt;
&lt;br /&gt;
As a community lab association officially recognised as a public service group, we organise many events and look forward to seeing you here sometime soon!   &lt;br /&gt;
&lt;br /&gt;
'''We could plan even more workshops, too!'''  (see our page [[Atelier à GoGo|Atelier à Gogo]])  &lt;br /&gt;
&lt;br /&gt;
Normally, we are again having Wednesday evening #OpenHackuarium sessions for anyone to attend.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Come Wednesdays for #OpenHackuarium from 19h!&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If an #OpenHackuarium Wednesday evening won't work for you, we can make a date!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;See above for the recent schedule of #OH themes.&amp;lt;/big&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''You can help!'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===''Médias et presse'' / '''&amp;lt;big&amp;gt;Media and Press&amp;lt;/big&amp;gt;'''===&lt;br /&gt;
Please check out our [[Press kit]]. It includes press releases and most of our media appearances over the years.  Here is the [https://www.rts.ch/audio-podcast/2026/audio/bacte-rivieres-un-projet-environnemental-pour-reunir-science-et-population-locale-29378693.html latest] (a radio show by RTS about the project Bacté-Rivières), &amp;amp; two from the commune paper, Ecublens Infos, [https://www.ecublens.ch/images/stories/Greffe/documents/Journal%20communal/2025/Ecublens_Infos_No_97_-_octobre_2025-web.pdf from page 4]) and also [https://www.ecublens.ch/images/stories/Greffe/documents/Journal%20communal/2024/Ecublens_Infos_No_91_-_octobre_2024_web.pdf one from a previous year] on p14. &lt;br /&gt;
&lt;br /&gt;
''Veuillez consulter notre &amp;lt;&amp;lt;[[Press kit|Dossier de presse]]&amp;gt;&amp;gt;. Il comprend les communiqués de presse et la plupart de nos apparitions dans les médias au fil des ans. Voici notre plus récent, [https://www.rts.ch/audio-podcast/2026/audio/bacte-rivieres-un-projet-environnemental-pour-reunir-science-et-population-locale-29378693.html une emission radio de RTS sur le projet Bacté-Rivières], et aussi [https://wiki.hackuarium.ch/images/8/81/EcublensInfo_articleOct2025.jpg notre article] (sur [https://www.ecublens.ch/images/stories/Greffe/documents/Journal%20communal/2025/Ecublens_Infos_No_97_-_octobre_2025-web.pdf le page 4]) et aussi [https://www.ecublens.ch/images/stories/Greffe/documents/Journal%20communal/2024/Ecublens_Infos_No_91_-_octobre_2024_web.pdf le dernier d'avant] dans le 'Ecublens Infos' (p14), le journal communal.'' &lt;br /&gt;
&lt;br /&gt;
We have [[published open-access articles]] about some of our projects. However, our aim is to document all our projects openly, and any inquiries are always welcome. / ''Nous avons publié les articles source ouverte sûr quelques d'entre nos projets. Toutefois, notre objectif est de documenter ouvertement tous nos projets et toute demande de renseignements est toujours la bienvenue.''&lt;br /&gt;
&lt;br /&gt;
[https://us8.campaign-archive.com/?u=b0d886380fea16db79d831392&amp;amp;id=352cf3701e Here is our last newsletter] and [https://us8.campaign-archive.com/home/?u=b0d886380fea16db79d831392&amp;amp;id=676fa13583 here is the archive] of our previous newsletters!  / ''[https://us8.campaign-archive.com/?u=b0d886380fea16db79d831392&amp;amp;id=352cf3701e Voici notre dernière newsletter] et [https://us8.campaign-archive.com/home/?u=b0d886380fea16db79d831392&amp;amp;id=676fa13583 les anciennes archivées]!''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;Thanks! / ''merci !''&lt;br /&gt;
&lt;br /&gt;
===''Présence sur le web'' / Internet Presence===&lt;br /&gt;
Of course, in addition to this wiki we have social media accounts, some more active than others.  Check us out!&lt;br /&gt;
''Nous avons, bien sûr, en plus du wiki, des comptes sur les réseaux sociaux, quelques-uns étant plus actifs que d’autres. Jetez un coup d'oeil !'' :&lt;br /&gt;
&lt;br /&gt;
[https://www.facebook.com/hackuarium/ Facebook] &lt;br /&gt;
[https://www.linkedin.com/company/hackuarium LinkedIn] &lt;br /&gt;
[https://www.meetup.com/hackuarium/ MeetUp] &lt;br /&gt;
[https://twitter.com/hackuarium Twitter] (but we haven't used this since around 2023, for a variety of reasons) &lt;br /&gt;
[https://www.youtube.com/channel/UC_kasB6icayxS0EoIHDSXoQ YouTube]  [https://www.instagram.com/hackuarium_openlab/ Instagram]  &lt;br /&gt;
&lt;br /&gt;
Happily, our current website has had some updates... (event info isn't always as good as here, but our project page is amazing...) &lt;br /&gt;
&lt;br /&gt;
Our instagram is a bit split too, with two old ones inaccessible, but one (openlab) more recent... please [https://www.instagram.com/hackuarium_biohacker_space/ follow us]!&lt;br /&gt;
&lt;br /&gt;
''Heureusement, notre site web actuel a fait l'objet de quelques mises à jour… (les informations sur les événements ne sont pas toujours aussi complètes qu'ici, mais notre page « Projet » est géniale…)''  &lt;br /&gt;
&lt;br /&gt;
''Notre instagram est aussi un peu divisé, avec deux anciens inaccessibles, et un (openlab) plus récent... suivez-nous svp !''&lt;br /&gt;
&lt;br /&gt;
'''Want to find out more directly?''' Here's where you can [https://hackuarium.us8.list-manage.com/subscribe?u=b0d886380fea16db79d831392&amp;amp;id=676fa13583 join in to receive our newsletter] (&amp;amp; here is the [https://us8.campaign-archive.com/home/?u=b0d886380fea16db79d831392&amp;amp;id=676fa13583 newsletter archive]) / '''''Vous voulez en savoir plus et en direct ?''' Voici où vous pouvez vous [https://hackuarium.us8.list-manage.com/subscribe?u=b0d886380fea16db79d831392&amp;amp;id=676fa13583 inscrire pour recevoir notre newsletter], tout [https://us8.campaign-archive.com/home/?u=b0d886380fea16db79d831392&amp;amp;id=676fa13583 archivé ici].'')&lt;br /&gt;
&lt;br /&gt;
We also work together on [https://hackuarium.slack.com/ Slack], where anyone can join in!  / ''Nous nous retrouvons également sur [https://hackuarium.slack.com/ Slack], où tout le monde peut participer !''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;big&amp;gt;''Projets'' / [[Projects]]&amp;lt;/big&amp;gt;==&lt;br /&gt;
At least [[Projects|a dozen projects]] are ongoing, and many times more that archived (and available for further exploration)! &lt;br /&gt;
&lt;br /&gt;
Want to learn more about how mushrooms can be used for helping the bees?  Check out our [https://experiment.com/projects/participatory-research-to-explore-fungal-biodiversity-and-its-importance-to-bees #mycelia4bees project]! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Remember, all Hackuarium projects are open for others to clone/hack/embellish (CC BY-NC-SA) and learn from!&amp;lt;/big&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
In fact, as always, there are great ones, like the one on &amp;lt;big&amp;gt;lake water quality, [[MCBP Campaign 2022|MCBP]], that had an amazing sampling season in 2026, also of rivers, and our [[Urban gardens with rhizobial bacteria|urban gardening]] project (with pea plants!), which really need help from more implicated members, also of the general public.  Interested?  Please write&amp;lt;/big&amp;gt; ''rachel(at)hackuarium(dot)ch''&lt;br /&gt;
&lt;br /&gt;
The 'Random Page' button in the menu is one fun way to explore, you might like. /  &lt;br /&gt;
&lt;br /&gt;
''Au moins [[Projects|une douzaine de projets]] sont en cours, et bien plus encore sont archivés (et disponibles pour une exploration plus approfondie) !''&lt;br /&gt;
&lt;br /&gt;
Vous voulez en savoir plus sur la façon dont les champignons peuvent être utilisés pour aider les abeilles ? Consultez notre projet #mycelia4bees !  &lt;br /&gt;
&lt;br /&gt;
''&amp;lt;big&amp;gt;N'oubliez pas que tous les projets du Hackuarium sont ouverts aux autres pour qu'ils les clonent, les hacker, les embellissent (CC BY-NC-SA) et en tirent des enseignements !&amp;lt;/big&amp;gt;''  &lt;br /&gt;
&lt;br /&gt;
''En fait, comment toujours, il y a de grands projets, comme l'un sur &amp;lt;big&amp;gt;la qualité de l'eau du lac, [[MCBP Campaign 2022|MCBP]], qui a eu encore une saison d'échantillonnages magnifique en 2026, aussi des rivières, et notre projet de [[Urban gardens with rhizobial bacteria|jardinage urbain]] (avec des plants de petits pois !), qui ont vraiment besoin de l'aide de membres plus impliqués, et aussi le grand public.  Intéressés ?   Stp nous écrire.&amp;lt;/big&amp;gt;'' &lt;br /&gt;
&lt;br /&gt;
''Le bouton 'Random Page' dans le menu est une façon amusante d'explorer, vous pourriez aimer.''&lt;br /&gt;
&lt;br /&gt;
==''Adhésions'' / Membership==&lt;br /&gt;
&lt;br /&gt;
===''Qui sommes nous ?'' / [[Who are we?]]===&lt;br /&gt;
&lt;br /&gt;
===''Voulez-vous nous rejoindre?'' [[Member|/ Want to join in?]]===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;''Les personnes qui respectent [https://drive.google.com/file/d/1J1ZGm6sR43k8XHQSQAcswlnQG48DMPvJ/view?usp=sharing le code d'éthique de diybio] (ce lien donne les informations que nous donnons aux visiteurs du laboratoire...) sont invitées à se joindre à notre laboratoire communautaire.'' / Those who respect [https://drive.google.com/file/d/1J1ZGm6sR43k8XHQSQAcswlnQG48DMPvJ/view?usp=sharing the diybio code of ethics] (we give the info in this last link to visitors to the lab...) are invited to join in our community lab adventure. &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==''Nos amis'' / [[Friends]] of Hackuarium==&lt;br /&gt;
Internationally, we have [[friends]] involved in many biohacker spaces and projects.  We hope we can all do more together, too!&lt;br /&gt;
&lt;br /&gt;
We even have some 'international support memberships' for those who want to concretely support our open science community lab.&lt;br /&gt;
&lt;br /&gt;
Funding opportunities are also being pursued, and all are welcome to help...  It's a perfect time to plan for the future of open science and fun projects here.&lt;br /&gt;
&lt;br /&gt;
''Au niveau international, nous avons des amis impliqués dans de nombreux espaces et projets biohackers.'' &lt;br /&gt;
&lt;br /&gt;
''Nous espérons que nous pourrons en faire plus ensemble !''&lt;br /&gt;
&lt;br /&gt;
''Nous avons même des « affiliations internationales de soutien » pour ceux qui souhaitent apporter un soutien concret à notre laboratoire communautaire dédié à la science ouverte.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Des possibilités de financement sont également recherchées, et tous sont les bienvenus pour nous aider...  C'est le moment idéal pour planifier l'avenir de la science ouverte et des projets amusants ici.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;Would you like to make a donation to help support our Open Science work? It would be quite welcome, and is tax deductible! =)&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
'''''&amp;lt;big&amp;gt;Souhaitez-vous faire un don pour soutenir notre travail dans le domaine de la science ouverte ? Les dons sont les bienvenus et sont déductibles des impôts ! =)&amp;lt;/big&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Bank details ''/ Nos coordonnées bancaires sont:'''''&lt;br /&gt;
&lt;br /&gt;
Banque Alternative Suisse&lt;br /&gt;
&lt;br /&gt;
En faveur du compte : Association Hackuarium&lt;br /&gt;
&lt;br /&gt;
Adresse : Route de Crochy 20, 1024 Ecublens&lt;br /&gt;
&lt;br /&gt;
IBAN : CH59 0839 0033 4153 1000 3&lt;br /&gt;
&lt;br /&gt;
Swift/BIC : ABSOCH22&lt;br /&gt;
&lt;br /&gt;
'''Are you interested in some 'Merch?'   ''Êtes-vous intéressé par un peu de &amp;quot;Merch&amp;quot;'' ?''' (we are following iNaturalist and counter culture labs in starting a [https://www.zazzle.ch/store/hackuarium zazzle store]...)&amp;lt;h1&amp;gt;&amp;lt;span class=&amp;quot;mw-headline&amp;quot; id=&amp;quot;Contribute_to_the_wiki&amp;quot;&amp;gt;''Contribuer au wiki de Hackuarium'' / Contribute to the Hackuarium wiki&amp;lt;/span&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;'''Remember, a wiki is simply a website or online resource that can be edited by multiple users.''' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;That means this website is really meant to be edited by &amp;lt;b&amp;gt;YOU&amp;lt;/b&amp;gt; (like for Wikipedia!) to openly document your research projects and share not just knowledge but know-how!   &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;All Hackuarium members are encouraged to [[Editing the wiki|join in the fun]], and edit their project documentation pages! &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;You want to do something for our world?  Open science documentation is a challenge, especially when people are doing it in their spare time, but it is worth it!&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Here is a [http://en.wikipedia.org/wiki/Help:Editing great starting point to get help on editing] a wiki.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Most important is to '''find the fun - then it's a snap ...''' (thx to MP for this)&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;/&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;'''''N'oubliez pas - un wiki est simplement un site web ou une ressource en ligne qui peut être modifié par plusieurs utilisateurs.''''' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''Cela signifie que ce site est vraiment destiné à être édité par '''VOUS''' (comme pour Wikipedia !) pour documenter ouvertement vos projets de recherche et partager non seulement des connaissances mais aussi du savoir-faire !''&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Tous les membres de Hackuarium sont encouragés à [[Editing the wiki|se joindre à nous]], de rédiger leurs pages de documentation du projet.&lt;br /&gt;
&amp;lt;/p&amp;gt;''Vous voulez faire quelque chose pour notre monde ? La documentation scientifique ouverte est un défi, surtout lorsque les gens le font pendant leur temps libre, mais cela en vaut la peine !''&lt;br /&gt;
&lt;br /&gt;
''Voici un [https://fr.wikipedia.org/wiki/Aide:Comment_modifier_une_page excellent point de départ pour obtenir de l'aide sur l'édition] d'un wiki.''&lt;br /&gt;
&lt;br /&gt;
''Le plus important est de '''trouver le plaisir - ensuite c'est un jeu d'enfant ...'''(merci à MP pour cela)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Check out some old wiki pages with the tool 'Random page' in the menu to the left!&lt;br /&gt;
&lt;br /&gt;
''Explorer les pages anciens avec 'Random page' dans le menu à gauche'' !&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;printfooter&amp;quot;&amp;gt;						&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;visualClear&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''If you have any questions, just ask!'''&lt;br /&gt;
&lt;br /&gt;
'''''Si tu as des questions, simplement demandez !'''''&lt;br /&gt;
&lt;br /&gt;
'''=) here! ''ici !''  hello (at) hackuarium (point) ch'''&lt;br /&gt;
&lt;br /&gt;
=''Vers du biohacking durable'' / Toward Sustainable Biohacking=&lt;br /&gt;
&lt;br /&gt;
The cooperative space in Ecublens is only provisional. We need support and concrete plans for the future.&lt;br /&gt;
&lt;br /&gt;
You can help! Our member projects make us what we are today...&lt;br /&gt;
&lt;br /&gt;
''L'espace coopérative en Ecublens est provisoire. Nous allons besoin de soutien et des plans concrets pour l'avenir.''&lt;br /&gt;
&lt;br /&gt;
''Vous pouvez nous aider !  Les projets de nos membres font de nous ce que nous sommes aujourd'hui...''&lt;br /&gt;
*Dreams / ''Rêves''&lt;br /&gt;
*Actions  /  Actions !&lt;br /&gt;
[[File:Mauricepeas.png|thumb|''un exemple du [[Urban gardens with rhizobial bacteria|projet du jardinage urbain]]'' 2021 / urban gardens 2021|alt=]]&lt;br /&gt;
&lt;br /&gt;
'''''Nous avons les bactéries rhizobiennes pour les petits pois ! Qui veut nous rejoindre dans le projet de jardinage urbain encore ?'''''&lt;br /&gt;
&lt;br /&gt;
'''We've got the rhizobial bacteria for the pea plants !  Who would like to join us in the urban gardening project again this year?'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
all [[old archived|old pages are archived]], of course&lt;br /&gt;
/ ''toutes les pages [[FR Oldversion|anciennes sont archivés]], bien sûr''&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Category:Hackuarium]]&lt;br /&gt;
[[Category:Work In Progress]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=New_SOPs&amp;diff=19908</id>
		<title>New SOPs</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=New_SOPs&amp;diff=19908"/>
		<updated>2026-11-04T09:44:10Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: added category Documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This wiki page builds on the details in the initial [[P1 SOP]] page, which was put together initially for our old lab in Renens.[[File:Hackuarium_logo15.png|100px|thumb]]&lt;br /&gt;
'''Standard Operating Procedures for Proper Use of Equipment in the Ecublens Space'''&lt;br /&gt;
&lt;br /&gt;
Certain Hackuarium equipment could not be fit within the laboratory spaces, in particular the microbiology hood and the ultracentrifuge (the latter especially because of needs for 370V power).  Instead, these are found around the corner from the Biolab. Please see the detailed lab map below in the gallery for more information.&amp;lt;br&amp;gt;&lt;br /&gt;
In order to use this space safely, as our Biolab is authorised to do P1 experimentation with BSL1 organisms (and selection for antibiotic resistance markers, for example), certain extra precautions should always be followed, which these Standard Operating Procedures will set out.   &lt;br /&gt;
&lt;br /&gt;
A new set of simplified SOPs has been put together (2023), and laminated copies for several are available in the lab for ready inspection (in the file holder on the left corner of an upper shelf over the long drawers between the benches, at the [https://wiki.hackuarium.ch/images/5/57/P1labmap.pdf top right in this representation] of the P1 lab.) If they get splashed, simply wipe them clean. =)     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;These SOPs include bilingual versions for:  Microbiology hood use; Glove use; Inactivation and disposal of GMOs; Sterile technique with the gas canister, and more.  They can be found [https://drive.google.com/drive/folders/19hquLFedG5I9lh2Ni19sCy1Hw8qjrqFz?usp=sharing in this folder].     &lt;br /&gt;
&lt;br /&gt;
As always, if you see any modifications that should be made to these documents, or even just in the French translation, do help us fix them!    &lt;br /&gt;
&lt;br /&gt;
Any help with further translations is always appreciated!    &lt;br /&gt;
&lt;br /&gt;
=Initial steps=&lt;br /&gt;
Whenever work in the lab is being done, and one would like to go to another part of the building, for instance to use the hood or the ultracentrifuge, but also to simply go to the common room, the first rule is to sterilise hands with Sterilium by the door of the Biolab, on the 'safety shelf' to the right of the doorway. After this, one can exit the lab, and then wash hands directly with soap and water at one of the sinks by the bathrooms.&amp;lt;br&amp;gt;&lt;br /&gt;
Of course, lab coats must never be worn outside of the labs in common spaces of the site!  If needed, extra coats (or dispo) will be provided to take to the other areas, where personal protection is needed for other experiments (ie chemistry). &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;Because both of these pieces of equipment need to be plugged in with extension cords, in particular a large one for the ultracentrifuge, cautionary signs will be placed in clear view, to avoid any tripping hasards. &amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Use of the small sterile hood - not for GMOs! = &lt;br /&gt;
After taking the usual initial precautions (cleaned hands, no lab coat):&amp;lt;br&amp;gt;&lt;br /&gt;
The hood should be wiped down with alcohol, turned on for at least 15 minutes, and again wiped down with alcohol before beginning any manipulations. The material to be manipulated (plates strains) will be prepared in the biolab, and placed in a sealed plastic box and wiped down with alcohol on all outer surfaces before going to the the hood. &amp;lt;br&amp;gt;&lt;br /&gt;
After all work is complete (streaking, culture inoculation etc), the materials should again be sealed in the box to be brought back to the lab space (and put in the incubator for cultivation, for example).  &lt;br /&gt;
&lt;br /&gt;
Because this hood only protects the work, not the worker, '''it must not be used for experiments with GMO organisms.'''  &lt;br /&gt;
&lt;br /&gt;
'''Instead, the gas canister in the P1 lab is used, for a sterile zone for experimental manipulation.'''  [https://drive.google.com/drive/folders/19hquLFedG5I9lh2Ni19sCy1Hw8qjrqFz?usp=sharing More SOPs for the lab are found here].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Use of the ultracentrifuge=&lt;br /&gt;
Following all the initial precautions in leaving the lab, the prepared materials to be centrifuged will be taken out in a box, as in the above description: briefly, the sealed box is wiped down with alcohol before taking it out of the lab.&amp;lt;br&amp;gt;&lt;br /&gt;
Care must be taken to have balanced samples for the spin, of course. &amp;lt;br&amp;gt;&lt;br /&gt;
After the run is complete (i.e. 5k rpm for 10min to pellet a bacterial culture in 200ml bottles), the materials should again be placed in the box to be carried back to lab. &amp;lt;br&amp;gt;&lt;br /&gt;
Supernatent liquids will be poured out carefully, and disinfected properly for disposal with some bleach. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Going back to double check that the rotor has not been contaminated, and cleaning properly with (bleach) water then alcohol, if needed, is the next step to not be forgotten.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Preventing covid-19=&lt;br /&gt;
&lt;br /&gt;
Always wash hands before touching your face!&amp;lt;br&amp;gt;&lt;br /&gt;
Wear a mask if physical distancing from others is not possible.&amp;lt;br&amp;gt;&lt;br /&gt;
If soap and water is not available, use disinfectant...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the 'diy' recipe from the WHO, adapted for the hydrogen peroxide and volume of alcohol readily available in Swiss pharmacies:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
150ml 96% Ethanolum (includes 0.1% camphor)&amp;lt;br&amp;gt;&lt;br /&gt;
7.51ml H2O2 (3% solution)&amp;lt;br&amp;gt;&lt;br /&gt;
2.61ml glycerol (98% solution)&amp;lt;br&amp;gt;&lt;br /&gt;
9.88ml dH2O&amp;lt;br&amp;gt;&lt;br /&gt;
(final volume: 180ml)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to note, nov2023 - of course, this whole part is maybe considered too late to think about, but use of isopropyl alcohol seems a better idea than such mixes with ethanol!  (even worse is the alcohol à bruler for fondue makers?)  need to confirm if the 70% isopropyl alcohol (as we currently have in the lab) has been well tested for covid too... &lt;br /&gt;
=Getting the best out of the current space =&lt;br /&gt;
[https://wiki.hackuarium.ch/images/5/57/P1labmap.pdf Here is an overview of the P1 lab]&lt;br /&gt;
 &lt;br /&gt;
Project boxes from shelf areas are used to store project specific equipment, so things aren't left lying about the lab...  &amp;lt;br&amp;gt;Please make sure to tidy the space after manipulations, so the next people coming to do something are able to do what they need to do! &amp;lt;br&amp;gt;&lt;br /&gt;
Separate out waste and always follow the [https://docs.google.com/document/d/1C4M8G3qEWCTItirqRVOryD_Q1GzAvKWE02v0UlOKBE8/edit?usp=sharing safety guidelines]!  &lt;br /&gt;
&lt;br /&gt;
Here are [https://drive.google.com/file/d/12QLUzI3QR8B3lcPZyaxbqSchJdKfDIyt/view?usp=sharing the same guidelines in French].&amp;lt;br&amp;gt;&lt;br /&gt;
If something will be left out or on (i.e. the plates you just poured, the incubator), label with instructions, dates and initials, so your work will be safe and no one can complain... :) &lt;br /&gt;
&lt;br /&gt;
Make sure to do risk analyses, especially in projects that involve GMOs, but also in general.  This [https://communitybio.pubpub.org/pub/m255th2q/release/1#biological-risk-assessments-for-community-laboratories community biolab document] can be of great help, when you start in on this essential risk assessment work.  &lt;br /&gt;
&lt;br /&gt;
Please [https://docs.google.com/forms/d/e/1FAIpQLSfrb9lf5ezmW_mzrWHybNUIahu6KINQff0GjlG-FIt6RwE45Q/viewform use this form to help document] your risk analyses efforts and save any other analyses done. (Try this [https://docs.google.com/spreadsheets/d/1VdjRurnfdxHt-4MwQ6NHIW-fgihJCqZnAa43uliXPFs/edit?usp=sharing possible model]  for your project.).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gallery ===&lt;br /&gt;
The coop space now includes 3 rooms for Hackuarium, plus a bit more.  &lt;br /&gt;
&lt;br /&gt;
[https://wiki.hackuarium.ch/images/3/33/Space_Outline.pdf Here is a simplified view of the overall coop building in Ecublens...]&amp;lt;br&amp;gt;&lt;br /&gt;
Maurice and his student, taking precautions in the Octanis space during the covid-19 pandemic. &amp;lt;br&amp;gt;&lt;br /&gt;
Terrariums by Vanessa and Tatiana.&amp;lt;br&amp;gt; and the gorgeous orchids - that only lost their flowers finally in June 2020...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; widths=&amp;quot;300&amp;quot; heights=&amp;quot;300&amp;quot;&amp;gt;&lt;br /&gt;
File:Crochy20Ecublens - spaceallocupdatefeb23.png|the complicated coop space map&lt;br /&gt;
File:IMG 9154.JPG&lt;br /&gt;
File:IMG 8016.JPG&lt;br /&gt;
File:IMG 8018.JPG&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will take you back to [http://wiki.hackuarium.ch/w/Biolab more information for the P1 lab use and biosafety].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Work In Progress]]&lt;br /&gt;
[[Category:Documentation]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Octanis&amp;diff=19907</id>
		<title>Octanis</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Octanis&amp;diff=19907"/>
		<updated>2026-11-04T09:42:45Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: updated categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Octanis''' is working on the following projects within Hackuarium:&lt;br /&gt;
&lt;br /&gt;
=Rover=&lt;br /&gt;
&lt;br /&gt;
More information on Octanis [http://wiki.octanis.org/orb/overview wiki].&lt;br /&gt;
&lt;br /&gt;
=Balloon=&lt;br /&gt;
&lt;br /&gt;
More information on Octanis [http://wiki.octanis.org/orb/overview wiki]&lt;br /&gt;
&lt;br /&gt;
=Owl Scanner= &lt;br /&gt;
&lt;br /&gt;
- The concept:&lt;br /&gt;
&lt;br /&gt;
Bird conservation scientists use nesting boxes to follow populations. In particular, researchers working with Great Tit, Barn Owl, Tawny Owl, Hoopoe and Wryneck are commonly counting the breeding population by regularly inspecting boxes disseminated across the Swiss territory (and beyond).&lt;br /&gt;
&lt;br /&gt;
By using LoRa technology in combination with relevent set of sensors, the process could be simplified and a lot of time (and fuel) saved by remote sensing the activity of birds inside the nests.&lt;br /&gt;
&lt;br /&gt;
- For more information:&lt;br /&gt;
&lt;br /&gt;
* [http://nestbox.octanis.org Website Link]&lt;br /&gt;
&lt;br /&gt;
= External Links =&lt;br /&gt;
* [http://octanis.org/ website - Octanis Project]&lt;br /&gt;
* [https://instagram.com/octanisorg/ Instagram @octanisorg]&lt;br /&gt;
* [https://twitter.com/octanisorg Twitter @octanisorg]&lt;br /&gt;
* [https://www.facebook.com/octanis.epfl Facebook]&lt;br /&gt;
&lt;br /&gt;
[[Category:Partners]]&lt;br /&gt;
[[Category:Projects]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._149&amp;diff=19906</id>
		<title>Openhackuarium vol. 149</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._149&amp;diff=19906"/>
		<updated>2026-11-04T09:41:38Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: updated categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Main language this week: '''French'''&amp;lt;br&amp;gt;&lt;br /&gt;
* Theme : &lt;br /&gt;
* Date : '''Mercredi 10 mai 2017. L'espace est ouvert dès 19h''', les présentations auront lieu à 19h30&lt;br /&gt;
* [https://www.facebook.com/events/765243006990319/ FB event] (pour upcycler plein d'infos)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'occasion de l'#OpenHackuarium vol. 149, nous avons eu l'occasion de rencontrer les membres de l'équipe de [[Trobak]], le compost connecté&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
=Présentation des projets=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Biographie des intervenants=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Miscéllanées=&lt;br /&gt;
&lt;br /&gt;
[[File:Trobak_notes_shalf.jpeg|300px|Badly written notes to convert into something human- and machine-readable ASAP :p --[[User:Shalf|Shalf]] ([[User talk:Shalf|talk]]) 08:22, 11 May 2017 (UTC)]]&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._152&amp;diff=19905</id>
		<title>Openhackuarium vol. 152</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._152&amp;diff=19905"/>
		<updated>2026-11-04T09:40:59Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: updated categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''[[Open_Hackuarium|#OpenHackuarium]] numéro 152'''&lt;br /&gt;
* Langue principale cette semaine : ?&lt;br /&gt;
* Thème : &amp;quot;Thème&amp;quot;&lt;br /&gt;
Date : Mercredi 31 mai 2017. Ouverture des portes 19h, début des présentations 19h30&lt;br /&gt;
&lt;br /&gt;
== Personnes qui ont prévu de nous présenter quelque chose ==&lt;br /&gt;
* Bioboom&lt;br /&gt;
&lt;br /&gt;
== Slides ==&lt;br /&gt;
* Do not forget to upload slides before/after the event if appropriate.&lt;br /&gt;
&lt;br /&gt;
== Infos pratiques (plan d'accès etc) ==&lt;br /&gt;
cf. [[Open_Hackuarium|#OpenHackuarium]]&lt;br /&gt;
&lt;br /&gt;
== Liens externes &amp;amp; Références ==&lt;br /&gt;
* Add link to anything relevant (speaker's bio, website)&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._92&amp;diff=19904</id>
		<title>Openhackuarium vol. 92</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._92&amp;diff=19904"/>
		<updated>2026-11-04T09:40:20Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: updated categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Darty Monkeys: Biofilia Night #1'''&lt;br /&gt;
&lt;br /&gt;
[[File:Biofilia1_xs.png]]&lt;br /&gt;
&lt;br /&gt;
=What=&lt;br /&gt;
Introduction to: Silvan Lanz Visual Research (10min) and &amp;quot;Design beyond Design&amp;quot;(10min)&lt;br /&gt;
Workshop: &amp;quot;Grow my bacteria&amp;quot; (30min)&lt;br /&gt;
&lt;br /&gt;
==Grow My Bacteria Workshop==&lt;br /&gt;
&lt;br /&gt;
===Ingredients===&lt;br /&gt;
CAUTION This science activity involves the use of boiling water ;) &lt;br /&gt;
Although your grown bacteria colonies and fungi is likely to be harmless, just as a precaution, after incubated, do not open your sealed Petri dishes. I wouldn't eat much of it! Dispose of the entire sealed plate in the bin.&lt;br /&gt;
&lt;br /&gt;
You Need:&lt;br /&gt;
&lt;br /&gt;
*½ teaspoon of beef stock powder&lt;br /&gt;
&lt;br /&gt;
* Cenovis&lt;br /&gt;
&lt;br /&gt;
*¼ cup of water&lt;br /&gt;
&lt;br /&gt;
*1 teaspoon of sugar&lt;br /&gt;
&lt;br /&gt;
*1 teaspoon of gelatin/agar agar&lt;br /&gt;
&lt;br /&gt;
*Saucepan for boiling mixture&lt;br /&gt;
&lt;br /&gt;
*2 x Petri dishes, Spoon, Sticky tape, Felt-tip pen to label petri dishes, Cotton swab (optional)&lt;br /&gt;
&lt;br /&gt;
*25 to 37oC incubator (optional) – oven, warm spot behind fridge, near a heater, box with a desk lamp inside or on top.&lt;br /&gt;
&lt;br /&gt;
===What to do===&lt;br /&gt;
*Pour the water into the saucepan and bring to the boil. &lt;br /&gt;
*Add beef stock powder, sugar and gelatin to the boiling water and stir for a minute until all the ingredients have dissolved.&lt;br /&gt;
*Cool your new agar mixture slightly for 10 minutes. The mixture needs to be still hot to avoid the gelatin setting in the saucepan and to prevent contamination from bacteria in the air. The conditions are far from sterile, but you want to avoid as much contamination as possible.&lt;br /&gt;
*Take the lid off the Petri dishes and have an adult half-fill the petri dish with the hot mixture. Only take the lid off the petri dish when you are ready to pour your agar, or they will become contaminated with the bacteria in the air.&lt;br /&gt;
*Immediately put the lid back on the Petri dish and put it in the fridge for about 4 hours until the agar has set. Do not touch the agar or you will contaminate it with bacteria on your fingers.&lt;br /&gt;
*Now it’s time to collect and grow your bacteria (or fungi) on the agar Petri dishes. Note: the Petri dishes can be stored in the fridge for 1-2 days before use.&lt;br /&gt;
*Bacteria is not hard to collect because it is everywhere. Try exposing one plate to the air in your house or classroom, and the other to the air in your backyard or playground. Touch one with your thumb and the other with a piece of hair. Add the scrapings from your finger nail, or touch with a piece of grass or dirty tissue. If you have some cotton swabs - using a clean one each time - run it along things like the inside of your mouth, your hands, the door handle, mobile phone, computer keyboard, and then rub it lightly across the agar in a zig-zag pattern.&lt;br /&gt;
*Put the lids back on the Petri dishes, label them, tape them closed and place them upside down in your make-do incubator (if you have one) for 1 to 2 days. If you don’t have an incubator, leave the plates at room temperature for 3-5 days.&lt;br /&gt;
*Although your grown bacteria colonies and fungi is likely to be harmless, just as a precaution, do not open your sealed Petri dishes. Dispose of the entire sealed plate in the bin.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Who=&lt;br /&gt;
* Silvan Lanz (ECAL)&amp;lt;br&amp;gt;&lt;br /&gt;
* Design Days &amp;amp; Living Instruments team members (HACKUARIUM, WeSPOKE)&lt;br /&gt;
&lt;br /&gt;
=When=&lt;br /&gt;
* Wednesday 6th April 2016, 7.30pm&lt;br /&gt;
* Practical information: see [[Open Hackuarium]].&lt;br /&gt;
&lt;br /&gt;
=Organisers=&lt;br /&gt;
&lt;br /&gt;
* Vanessa Lorenzo&lt;br /&gt;
* You?&lt;br /&gt;
&lt;br /&gt;
=Results!!!=&lt;br /&gt;
So, here they are the photos! Thanks Sylvain Lanz for the photos. Thank you all for coming, letting me experiment with your bacteria and for your colorful bioart. Sorry for the first failed attempt, we made the wrong soup. Luckily we had a ready made soup/medium to continue... Pictures will be uploaded when they're grown in 2 - 3 days. And we made an extra experiment plating and mapping the nano/micro/macro polluted LANDSCAPES of Montreux (We will publish the exact GPS point soon) thanks to Roger Erismann! Looking forward to see what's going on Congrats to Sachiko Kana and her finished, beautiful, self-built and welded white boards! (beautifully painted in purple and Klinik colors). Next week Rachel Aronoff and her genomic integrity http://wiki.hackuarium.ch/w/Openhackuarium_vol._93 And very soon we go to La Triennale di Milano at Istituto Svizzero Milano and We print Tshirts http://wiki.hackuarium.ch/w/Openhackuarium_vol._95 Organized by Anne-Laure Pittet at Hackuarium&lt;br /&gt;
&lt;br /&gt;
=Links and Refs=&lt;br /&gt;
[https://www.madaboutscience.com.au/store/index.php?main_page=page&amp;amp;id=43 Mad about science]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._93&amp;diff=19903</id>
		<title>Openhackuarium vol. 93</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._93&amp;diff=19903"/>
		<updated>2026-11-04T09:38:28Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: updated categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:MinilogoB.jpg |200px|thumb|]]&lt;br /&gt;
The public service association, AGiR! Action for Genomic integrity through Research! is already well into its third year, informing the public about choices everyone can make in regards to common risks to genomic integrity, a new 'big picture' concept that basically includes all the molecular genetic details of cells from every living organism.  In addition to 'spreading the word' about these issues, directed research on genomic integrity for quantitative risk assessment is another big aim of this group. &amp;lt;br&amp;gt; AGiR! wants to really act! &amp;lt;br&amp;gt;  Hopes of beginning DIY 'citizen science' projects at the Hackuarium, using inner cheek cells, will be the main topic of the presentation, to perhaps provide a new way for everyone to get involved.  Come learn more about two methods to detect DNA damage, the 'comet' and micronuclei assays, and about genomic integrity in general from the AGiR! founder, and join in the discussion. &amp;lt;br&amp;gt; Your feedback and help can make a difference, for a healthier future for all living beings on our planet.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Links and Refs=&lt;br /&gt;
see: &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.genomicintegrity.org  The website for AGiR!]   &amp;lt;br&amp;gt;  &lt;br /&gt;
[https://prezi.com/view/YAtDYjo510UA3BmccciO/  A Prezi about DNA Damage and its Repair]&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._95&amp;diff=19902</id>
		<title>Openhackuarium vol. 95</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackuarium.ch/index.php?title=Openhackuarium_vol._95&amp;diff=19902"/>
		<updated>2026-11-04T09:37:33Z</updated>

		<summary type="html">&lt;p&gt;Zaphod: updated categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''We print t-shirts'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=What=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=When=&lt;br /&gt;
* Wednesday 24th April 2016, 7.30pm&lt;br /&gt;
* Practical information: see [[Open Hackuarium]]&lt;br /&gt;
* Please register with [mailto:Anne-Laure.Pittet@unil.ch Anne-Laure] for this event.&lt;br /&gt;
&lt;br /&gt;
=Organisers=&lt;br /&gt;
&lt;br /&gt;
* Anne-Laure Pittet&lt;br /&gt;
* You?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenHackuarium]]&lt;/div&gt;</summary>
		<author><name>Zaphod</name></author>
	</entry>
</feed>