From a32f6f2afcb39330d03aa22db523ab8fa0e6e0a1 Mon Sep 17 00:00:00 2001
From: Patrick Barroca <pbarroca@sandbox.pergame.net>
Date: Thu, 2 Apr 2015 18:08:01 +0200
Subject: [PATCH] rel #18297: Accessible slimbox replacement

---
 .../modules/opac/views/scripts/head.phtml     |    4 +-
 .../views/scripts/recherche/viewnotice.phtml  |   19 +-
 doc/extern_libs.org                           |    3 +-
 library/Class/ScriptLoader.php                |   17 +
 public/admin/js/onload_utils.js               |   34 +-
 public/opac/js/butterfly/alert-64.png         |  Bin 0 -> 3144 bytes
 public/opac/js/butterfly/butterfly-ie.css     |   37 +
 public/opac/js/butterfly/butterfly-thumb.jpg  |  Bin 0 -> 2665 bytes
 public/opac/js/butterfly/butterfly.css        |  125 ++
 public/opac/js/butterfly/butterfly.jpg        |  Bin 0 -> 28274 bytes
 public/opac/js/butterfly/close-black.png      |  Bin 0 -> 1186 bytes
 public/opac/js/butterfly/close.png            |  Bin 0 -> 801 bytes
 public/opac/js/butterfly/external.html        |   34 +
 .../js/butterfly/gallery-controls-sprite.png  |  Bin 0 -> 2608 bytes
 .../js/butterfly/gallery-controls-sprite.psd  |  Bin 0 -> 84985 bytes
 public/opac/js/butterfly/index.html           |  145 ++
 public/opac/js/butterfly/jquery.butterfly.js  | 1472 +++++++++++++++++
 .../opac/js/butterfly/jquery.butterfly.min.js |    6 +
 public/opac/js/butterfly/jquery.history.js    |  194 +++
 public/opac/js/butterfly/jquery.pxToEm.js     |   56 +
 .../opac/js/butterfly/jquery.resize-events.js |  173 ++
 .../js/butterfly/loading-black-on-white.gif   |  Bin 0 -> 5559 bytes
 public/opac/js/butterfly/reactive-overlay.png |  Bin 0 -> 962 bytes
 public/opac/js/butterfly/reactive-overlay.psd |  Bin 0 -> 162454 bytes
 24 files changed, 2291 insertions(+), 28 deletions(-)
 create mode 100644 public/opac/js/butterfly/alert-64.png
 create mode 100644 public/opac/js/butterfly/butterfly-ie.css
 create mode 100644 public/opac/js/butterfly/butterfly-thumb.jpg
 create mode 100644 public/opac/js/butterfly/butterfly.css
 create mode 100644 public/opac/js/butterfly/butterfly.jpg
 create mode 100644 public/opac/js/butterfly/close-black.png
 create mode 100644 public/opac/js/butterfly/close.png
 create mode 100644 public/opac/js/butterfly/external.html
 create mode 100644 public/opac/js/butterfly/gallery-controls-sprite.png
 create mode 100644 public/opac/js/butterfly/gallery-controls-sprite.psd
 create mode 100644 public/opac/js/butterfly/index.html
 create mode 100644 public/opac/js/butterfly/jquery.butterfly.js
 create mode 100644 public/opac/js/butterfly/jquery.butterfly.min.js
 create mode 100644 public/opac/js/butterfly/jquery.history.js
 create mode 100644 public/opac/js/butterfly/jquery.pxToEm.js
 create mode 100644 public/opac/js/butterfly/jquery.resize-events.js
 create mode 100644 public/opac/js/butterfly/loading-black-on-white.gif
 create mode 100644 public/opac/js/butterfly/reactive-overlay.png
 create mode 100644 public/opac/js/butterfly/reactive-overlay.psd

diff --git a/application/modules/opac/views/scripts/head.phtml b/application/modules/opac/views/scripts/head.phtml
index c0bbb9b9726..04832a80ae6 100644
--- a/application/modules/opac/views/scripts/head.phtml
+++ b/application/modules/opac/views/scripts/head.phtml
@@ -13,7 +13,7 @@
 	Class_ScriptLoader::getInstance()->loadMeta();
 
 	echo $current_profil->getStyleCss();
-  if ($current_profil->hasFavicon())
+	if ($current_profil->hasFavicon())
 		echo sprintf('<link rel="shortcut icon" href="%s"/>', $current_profil->getFavicon());
 
 	$head_scripts = Class_ScriptLoader::newInstance()
@@ -32,7 +32,6 @@
 											'division-five', 'reload_module'])
 		->addJQueryReady('
        $("input").placeholder();
-       setupAnchorsTarget();
        autoHideShowConfigurationModule();
        initializeNoticeMurAnimation();
        initializeImgHover();
@@ -102,6 +101,7 @@
 		$script_loader->addSkinStyleSheet('ie' . $ie, ['ie_version' => $ie])
 									->addUserFilesStylSheet($current_profil->getHeaderCssIE($ie),
 																					['ie_version' => $ie]);
+	$script_loader->addJQueryReady('setupAnchorsTarget();');
 
 	$head_scripts->renderStyleSheets();
 	$script_loader->renderStyleSheets();
diff --git a/application/modules/opac/views/scripts/recherche/viewnotice.phtml b/application/modules/opac/views/scripts/recherche/viewnotice.phtml
index 215ba42ba43..83c3650763e 100644
--- a/application/modules/opac/views/scripts/recherche/viewnotice.phtml
+++ b/application/modules/opac/views/scripts/recherche/viewnotice.phtml
@@ -2,8 +2,8 @@
 $this->openBoite($this->title);
 
 $script_loader = Class_ScriptLoader::getInstance()
-	   ->addStyleSheet(URL_ADMIN_JS.'slimbox/slimbox2')
-	   ->addAdminScript('slimbox/slimbox2.min.js')
+		 ->loadButterflyLightbox()
+
 		 ->addAdminScript('multi_inputs/multi_inputs.js')
 
 	   ->addStyleSheet(URL_ADMIN_JS.'rating/jquery.rating')
@@ -13,19 +13,19 @@ $script_loader = Class_ScriptLoader::getInstance()
 	   ->addOpacScripts(['subModal',
 										   'recherche',
 										   'liste_notices_mur'])
+
      ->addJQueryReady(sprintf('$("#reseaux-sociaux").load("%s")',
-													    $this->url(array('controller' => 'recherche',
-																						   'action' => 'reseau',
-																						   'id_notice' => $this->notice->getId(),
-																						   'type_doc' => $this->notice->getTypeDoc()))));
+													    $this->url(['controller' => 'recherche',
+																					'action' => 'reseau',
+																					'id_notice' => $this->notice->getId(),
+																					'type_doc' => $this->notice->getTypeDoc()])));
 ?>
 
 <div class="navigation">
-	<a class="retour" href="<?php echo  $this->url($this->criteres_recherche->getUrlRetourListe(), null, true).'#'.$this->notice->getId(); ?>">
+	<a class="retour" href="<?php echo $this->url($this->criteres_recherche->getUrlRetourListe(), null, true).'#'.$this->notice->getId(); ?>">
     <?php echo $this->_('Retour à la liste') ?>
   </a>
 
-
 	<?php echo $this->tagAnchor($this->url_panier,
 															$this->_('Ajouter au Panier'),
 															['class'=>'panier'.
@@ -55,8 +55,7 @@ $script_loader = Class_ScriptLoader::getInstance()
 										['id' => 'vignette',
 										 'href' => $this->notice->getUrlImage(),
 										 'title' => htmlentities($this->notice->getTitrePrincipal())]);
-
-		echo '<script type="text/javascript">$("a[id=\'vignette\']").slimbox({}, null, null)</script>';
+		$script_loader->addJQueryReady('$("a#vignette").butterfly({closeButton:false});');
 	}
 	else
 		echo $this->notice_Vignette($this->notice);
diff --git a/doc/extern_libs.org b/doc/extern_libs.org
index 35f6c37ab69..281e10e8f8a 100644
--- a/doc/extern_libs.org
+++ b/doc/extern_libs.org
@@ -39,6 +39,7 @@
 | DateTimepicker                      | MIT License                 |               | Choix de la date et de l'heure dans les articles | X ajout du support des dates courante sans partie d'heures | https://github.com/mugifly/jquery-simple-datetimepicker/                                                                       |
 | DataTables                          | MIT Licence                 |               | Ecran des variables                              |                                                            | http://www.datatables.net/                                                                                                     |
 | CodeMirror                          | MIT Licence                 |               | Edition code source javascript                   |                                                            | http://codemirror.net                                                                                                          |
-|                                     |                             |               |                                                  |                                                            |                                                                                                                                |
+| Butterfly Lighbox                   | GPL                         | -             | Accessible lightbox plugin                       |                                                            | http://irama.org/web/dhtml/butterfly/                                                                                          |
+
 
 
diff --git a/library/Class/ScriptLoader.php b/library/Class/ScriptLoader.php
index 89b321678e3..c23c25708df 100644
--- a/library/Class/ScriptLoader.php
+++ b/library/Class/ScriptLoader.php
@@ -256,6 +256,14 @@ class Class_ScriptLoader {
 	}
 
 
+ 	/**
+	 * @return ScriptLoader
+	 */
+	public function addOPACScriptStyleSheet($style_sheet, $attributes=null) {
+		return $this->addStyleSheet(BASE_URL."/public/opac/js/".$style_sheet, $attributes);
+	}
+
+
  	/**
 	 * @return ScriptLoader
 	 */
@@ -733,6 +741,15 @@ class Class_ScriptLoader {
 	}
 
 
+	public function loadButterflyLightbox() {
+		return $this->addOPACScript('butterfly/jquery.resize-events')
+								->addOPACScript('butterfly/jquery.history')
+								->addOPACScript('butterfly/jquery.butterfly.min')
+								->addOPACScriptStyleSheet('butterfly/butterfly')
+								->addOPACScriptStyleSheet('butterfly/butterfly-ie', ['ie_version' => 6]);
+	}
+
+
 	public function addRecordMeta($record) {
 		$this->_metas[] = '<meta property="og:title" content="' .  htmlentities($record->getTitrePrincipal()) . ' - ' . $record->getAuteurPrincipal() . '" />';
 		$this->_metas[] = '<meta property="og:description" content="' .  htmlentities($record->getResume()) . '" />';
diff --git a/public/admin/js/onload_utils.js b/public/admin/js/onload_utils.js
index f3c8223bf51..5c6cd208049 100644
--- a/public/admin/js/onload_utils.js
+++ b/public/admin/js/onload_utils.js
@@ -48,22 +48,26 @@ if (typeof jQuery != "undefined")
 
 //Les liens qui référencent des sites externes doivent être ouverts dans un nouvel onglet
 var setupAnchorsTarget = function() {
-	var internalLink = new RegExp('/' + window.location.host + '/');
-	$('a[href^="http"]').each(function() {
-		if (!internalLink.test($(this).attr('href')) && (undefined == this.onclick)  && (undefined == $(this).data('events') || undefined == $(this).data('events').click)) {
-			if ($.browser.msie || !!navigator.userAgent.match(/Trident/)) {
-        // Otherwise IE doesn't send HTTP Referer
-				this.target = '_blank';
-				return;
-			}
-
-			$(this).click(function(event) {
-				event.preventDefault();
-        event.stopPropagation();
-        window.open(this.href, '_blank');
+  var internalLink = new RegExp('/' + window.location.host + '/');
+  $('a[href^="http"]').each(function() {
+    if (!internalLink.test($(this).attr('href')) 
+	&& (undefined == this.onclick) 
+	&& (undefined == $(this).data('events') || undefined == $(this).data('events').click) // jquery < 1.8
+	&& (undefined == $._data(this, 'events') || undefined == $._data(this, 'events').click) // jquery >= 1.8
+       ) {
+      if ($.browser.msie || !!navigator.userAgent.match(/Trident/)) {
+	// Otherwise IE doesn't send HTTP Referer
+	this.target = '_blank';
+	return;
+      }
+      
+      $(this).click(function(event) {
+	event.preventDefault();
+	event.stopPropagation();
+	window.open(this.href, '_blank');
       });
-		}
-	});
+    }
+  });
 }
 
 
diff --git a/public/opac/js/butterfly/alert-64.png b/public/opac/js/butterfly/alert-64.png
new file mode 100644
index 0000000000000000000000000000000000000000..c836fec1ef19889577ae1a930ed0ea2be25461ea
GIT binary patch
literal 3144
zcmV-O47c-%P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU->PbXFRCwC#TWM?@<r#kG*vsD2UOToE
zC)gpxal#Q)(UNehMJ=UOsMP+UMHHlhs8ms@2t@h8Arzsawp8i?6$JXDh!zSILJSQm
zL`DgOK#nG@<Hm6kJ0_0T$6hnDGxJTK_uI9TG?1*l4l&A(GTQa-?9BT<@AJIJHxtG4
zJUW**mCo_43P2TrDgadgssL00r~*(0pb9`0fOB-yPxWQqFlb-jeo_==4wyPQv=wbp
z*(Uy{D6v2wkZ@fQ!Z9hwafb1pT-T+>h9osNHO(A=0|yV$&wl;@X`1%=f#99^hOf&z
zYzTSewR*x^i~)A3&!=DL3en*S(Wa_eTnNvnsFVdTyD{Oe%Ve`pfA^*}bm#52%^U!}
zu+QfseHH<bZhguKKItenANCeiRoiu4X9qjsXeYi~EQDxwJkKwfot8qv)A1XR{3J+&
zm`z)Y`!uoIrz@+2!Qf>8?at#Noi+f+2se8hpHER$c9!2Z!pL?wyA<y`LEGhs-V#J}
zfdfigwoQ&pa8w~)xA191;h;<LngTUNOj?l0)55wOHOEY<2?+YnClPx7gGH1vb+T>y
zN07!VIPZoE08om?77adKSmg^FsvH+p;>Z%!;m?Jds&=TF)`?@-*$eQx(01IID_rTQ
zD-?MS9nlQ>JgSG24dDW{!qG+SXxyZEQ4;`IRO5F^RfV+CEB)^L`D2u`bb98!c6ohV
z<NAsK5UxY{iSd&pa1xF26?DizML@j;s;)25G<^k*SOz1O!qGP2c}d%L$u*InL@}zG
zs!%|8sSXish*&a`t%)2WYfvNpPKHgY4Y;_zn7S~7#JlaN`18af7KEKbOd9EtWf;DS
zs(^>cnAtQ8&`S~JT_r>@h`m|W^u=&?IXkQS{T%?Jja0qac1Se}&J=w)V+VYKqCtlm
zYAtGvS(3UO*?DlZA!1Mj-}&@ojtX`Zzja+`U8v;e@1S?qx+Bz+gw3`&0A=T39LIQM
z0|~caRaOQ|B9IaY*3@1Z2!(D?bp0|!dl3wn53&b28V-zvzcL}|pk)|Qs}Eb$1iH?T
z8`KJCTVjTcax7>A47ZpJydpq+4t_NY+DX?(Qlo;a(x%=<`eY(VjX395+EM`3lfRjA
z1Wpf*hiKo?2*C2lK>h&p@)ZMs2q&Y-hNpCY;3js|bQH;crX}kzSz7>g4Vn+yE(CpB
z;BXSUO@P)RII0|{Q@0dVWb3jLCP#fV7ocBmTuR#x)WPAR^46?8Om|+jmpoUQVuA*H
z{yh|>w4oy*dgLJbfTz1s0My!e-8$9hztMI)nS3s3ouKym3>?lQ8kTf49B@uZNN$P3
zmZQ$N+2qJ)Eg!Aj&`G-nW5@-L{M-f`w)Vy8mM?1*L_y^1P0D7+KteLh^FV*QFp7`f
zs|Wy4zS$oPe$9dNv5-TLuGvYg$sD}n3o55fNR@1?VW#)5-@br$9X{qfdzXhyR<@)m
z1ojC}ojQKp@S_Yy$*<wJjsteMTYyBWqFKOooO)2nuOeILZJmZDY9!Pa-ZPCk8nQ;u
zW}kovax(nW=634-Zv)l(9qG8`Xp}cSTGcv0cU`+rR;9^8#B%IAT1&&30N#Topg)?X
z_2t-g>MG#6o{>%~kz@dwSEI+@?4aAO^wZauAC?){5wqVO2N3P`+gs?xj~2)%n{b>X
z+S!z%H5U!i>W(z>3Y>J56F}QJ5SIb*p{#=b{O#Kn4?{q35DXa4j-}$^L>-x~kDl0g
z0qq+O)2*xeWOT|+XytT>?0om$MtZ7yiA<ISOVIMhqjclNL$qq?1o{0$RsnKzPGn30
zHn9G6ray)tVLShV?RzT*05lp!3H+5~Sr27WBUBTOQ!o&uS9i>(UV!kE>w2lZF-;b_
zFRwz{2LR@#y-oC3*D{<>(4`BG&`p;P(wExO<b&e{IBr^>o-F%E!gO%77STujH!SX7
zHhN{=^E+)BL?`z!2BHMyaCdfeghJ66g=@pqb0kLhzkCthaaAu}+c7K?p<AXTq|RaZ
zWG!dvzVJaCJ-Ml!&Wn!FE!Xse>KP1Th`9afj!z{qB)~mG5mXEf$x>#24o26ktOp#o
z{S*VsE`a)kksc4bg#y*Y;*_&}^ozHaQSXrm{owL`3L<$GOW!FBhSSKY)PtHmj!u>P
zhmda3i<{&0tz~_5`_%_28pe5$?ae|N(<MOP0sX5=abOa*J%o?9&ME-%#6mm+5O$#L
z{bRv2R=SQY*$@bX=*5p0QqORV?!K-EWitDjlHkbmsPyEf#k65}i<}8~7Wm;6`{@t2
z?xa|aCl4~M^70CIf2kaoznH8Xt}K6|8}_Ep$dVX9*oKo|gE{><PByvGQL->A@W8U?
za8VN7J&n+_D{J$~1`9fjcC~9yGa@E1@fEZDTf3Vm5eCRGhr7+PqX!xF4o4&iJVA2z
zCp@wKjIIeXx&Y!<fN&T31H(v9P;M+m0j)seW`Ndqbt1y&%Pbz49B!tn3V-I1UoBu*
z(PSgTxg)HbvU8mFqY9AI_CpCUNtI{E@MGf5yJvh+lqKOf&hJqnuG4gVk8K!~O&ujg
znB+&|dTCoLJ^0#%G&m7LyLzl<adhWJ3v|co9%>1t$S*Rqa^4`_j*=?nF%1AXj~E4=
zb{~!+p?Y$3N58NgCpj={i=t&zh%LwqR|16J2;ttGMX3x$qOwYGWbXUh#q{H=d+GA?
zN2aQT4G^xsXpB}Z0dp(`)aQAhr^)FxRZRc=D8++gH4=aVGA5YW<<ayia>Wfi_X=Rd
z_mLd$h6`q%B{4pR%x=?!5uismET?td?b0fLNfIVX8#gueQ6XoD={i4I{&pezbBoSn
zI9DcYZ=RL=0xSuz;R#6MtD2_u6pTD^<D|GI>EPJ&A1<PYURyy&(m_bVEdf`Q#7rJh
zQY8CI<xiCr3iP-8VafKhdSe8J@c4NJ669ZD5OL#V=Q47EWZS`dDT(*{k`e^&2WC7i
zg7PC6d?pt^T-)Xr_#J?0p7lFJ0AU3C_mCIv!NgYJHO2e{B;m6ul@HP*>pSVWEp3S0
zF-c7OZVoSg9Es9c-cOoREPr5O*G$fJMsAIjB=I-^xE?_4vvN7&1gUuzB%#osx12|h
zyuO@9vVkc{On2iXTU;R$-2G+n(WW_fZxBp)7htRg2roOJDTCnTbFycDe}9thed!X~
z)}O$D<&-T6)_lhBqyLXf`pfChb++O<Lvs#*5*v<S{|=Jl{dje9kb{(j-=?G4AU*v0
z3VL2j!jl8iX_v~-P3|A5l?$Z2_~9V?dqQlOsePZz-Qm(Ku@*hUH?SYH@>y9WG_puh
zHCng1jn=-gf=2VFmxRLQZ!ji@E?$drZHrO+$D9V>I7w_oURb4RzSrGJNf=pF2|@4e
zgCtNTJ~~kMnUdgc(Z=kseIQX>H+1FdPcH!8^MwGQ1i~N^*SAqBALK=g+{7qh#HJdw
z%){vrTIdz@m#uBGyW{=;hp8d7*Zry5V);X<^@R5}j<UZn0F)%*p-Mc2yl{i6Y6E6A
zLs<+|x?&SAz&_pGMvuMOK^aRsK@z<7&nv$f!zX6}SKj=X-t;#o061=z;M#o!szjG<
zS;z}V$uWyn;-5WDvT@ou5Tjtwk)tzP`$2!bY<&SCIhHvJVQl%r0#IVZ0qoy|Bp&7d
znCA$V1TVNA8jHxO@>$FhJ(&An`tUs3+K(LJ=Q}^L``e6Dj8<}eo#wy>0N{)J03@*$
zAp8!JXqjAb5?+8_fa9-xypU{6lYUt2IR!E^6a2e3D*gWsbLt@}fbeQb67M*W1Xl?&
zJx037BjFWfCt1j6D1#ZpbsPi7zE<fq^)jMEpXdK7!L{~t3$1F}BLL)HzCCYZpi)YU
zo;*GlAJ|auK}9)Ksoit(F*z7+!}<Hv;)>JXHC0U&+hEng-yh@kW~k=3vvDouR4AFI
zNdp4|XZ10;(!)~?u(KJjIlT6jbJK&@2oi||C6mdS18^>E)kkHk08{~}0#F5@3P2Tr
iDgadg&eiRI0t^7EyjIPvQ`#*60000<MNUMnLSTaY{OAAx

literal 0
HcmV?d00001

diff --git a/public/opac/js/butterfly/butterfly-ie.css b/public/opac/js/butterfly/butterfly-ie.css
new file mode 100644
index 00000000000..5f2d24399cb
--- /dev/null
+++ b/public/opac/js/butterfly/butterfly-ie.css
@@ -0,0 +1,37 @@
+/**
+ * jquery.butterfly.js
+ * @version 0.10
+ * @see http://irama.org/web/dhtml/butterfly/
+ * @license GNU GENERAL PUBLIC LICENSE (GPL) <http://www.gnu.org/licenses/gpl.html>
+ */
+ /* butterfly lightbox IE6 hacks */
+	* html #jb-overlay {
+		position: absolute !important;
+		top: expression(eval(document.documentElement.scrollTop));
+		height: expression(eval(document.documentElement.clientHeight) + 'px');
+		filter: alpha(opacity = 70);
+	}
+	* html #jb-window {
+		position: absolute;
+		top: expression(eval(document.documentElement.scrollTop));
+		height: expression(eval(document.documentElement.clientHeight) + 'px');
+	}
+	* html #jb-window.reactive {
+		background-image: url(../images/skin/reactive-overlay.gif);
+	}
+	* html #jb-window-inner {
+		margin-top: expression( (( this.parentNode.clientHeight - this.clientHeight ) / 2 ) + "px" );
+		margin-left: auto;
+		margin-right: auto;
+		overflow: auto !important;
+	}
+	* html #jb-window-content {
+		overflow: hidden;
+	}
+
+
+	/* IE6 Fixed Position Jitter Fix */
+	* html {
+		background-image: url(about:blank);
+		background-attachment: fixed;
+	}
diff --git a/public/opac/js/butterfly/butterfly-thumb.jpg b/public/opac/js/butterfly/butterfly-thumb.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..9c6db5c8eec1f07aec972b6bf150bbf48337e2d7
GIT binary patch
literal 2665
zcmZ9OXH?T^7RLWcC@!Ie77Wr7OlU%=B1QxqT2OitK@kwbI6*=gKzb2b6(%4>P%?lh
z2q7Q@At1eJ0EeO|#ehg%jiG~ztY$Ok?3}Z+zx&}m_qpf2=lSx!_X?&2?*Uo7oueH9
z0s}yxFaQA`fc+E|5F87D01*HH)P&L+AZ-&EdWj4Kb_*4dfD2p)WT8-~Bve*XQWh>F
zB?DJckd;+XQHTGDx*8lI1g@rrI*d7tQZqC(F)=i>{yQL;j0{X3rYI+;r~nfNLP1GM
z0f9y!4j~X|EJ{rX3ae*;!C(yZ%*?P@Gc#-JlmFX7&<(&204YEU1cU^@Fc1U=67&PN
zg|@*E5J>3rFGR&4BI01sfB8!lo)8dNL{t_4gCJmts5n>@BKl_$1cm@G5lvAe8#y<B
zq`X*oYEGH4yTZ!|R?n$Rs11{V2WeW0N-zK{yaxe`LH=q8f`K)S<RCU~NdNGS)H2p7
z`JVX*!COEQB6I|Uz<`s$2Zai4Q5`%8@1EkGfB$cZX>-W9`Y%0s$F)rCRZ~3SK|$sK
z;i>@WvQ>2txd&CBktntz9O3b!2X@vd+HJc35dY4WPCE6Jik>$|?HbaOde1WHR6Heb
zC+OIR$knci^V0Dm@;`8u)_Ga9<Y?wLquT~Z3yVQ48?nV!uD9bGwk57Cc6By??ijy1
zRWxQa%;ik}wleZ?-)eko?Xli4ap48I!x^r7w>fjy(pJx&@(z17A#|WGKD9iDovo5s
z)6_xG*1@|<xaWiOYo+F5dfysl*`1#%M%|=r9lewRiJEnDY7-^EgV5d5+k|1xWV{th
znbo>YMtC2Q69DZ3K<~}Z;WJ0GU5^qylF)PUoUC>ZGHG%3i$srR@7u+VDldnPv>Mtf
zziO@+!)7M7p>7O3g6Cme9yeogeNEN&9FC!5a|dO-aZRT+WaD2*QztB@tR+*f@?wJC
zZ8F&@|9ixFXMl8m%808H*pp71_IKKM;QffgQ?s>820prYM8vqq1YWa=yo0w`^AEV-
zds6z0J|lc-QNBTbU%76pBYNo3w>h%oZ?QMaV+-x|{BW~4cIb?_OK(9~CA+g{5rY#+
z3%g<u)^&o%-LWKT#HNHLNuTu2&OJ(ddrX1Jc%ri)72Dj^+VG~f!1Equ;)Sl0ow<j-
z#f<r2LQPJYf3<_vAiVfu^ocFiw~(l<h=uwRaA@e7$FK|P0$n9+;MvA=8>g8vxZ(*m
z^}{#^C$&W8>}0)r`F$uhqiB|MW7(w|-5lP&=fRJ>lhbv0A+)m0$4cvHp9?LhR#Ngq
zvp#t+qxbSo%z8DQ(%CmK!K)`rS|D0~Vc6#ISk8Rb(ZV0|8=T~pjhZ|1ZR@hDV?RzC
z-ZSyRzCT1x3fZ?0{bU{g?rM8tsp^^1m7&|-%5Yxvq0vj9i^>~@3y)LjjU|EqK2`d8
z!EHdg$2a2Vk5@-$Dz=TusH)Wa0)Qs&S9M`^9i?F!4pP84=P*$1lSPwVdR$IM6iaC}
zfuy(=vb;W2GkCM?*7yk3w~2DFxHz*-Dd1UF`D8kLGM)TW=N<3xiA?B<dlO-7nv3O{
z7%Kx>#~(DM?*xI{kkt>;-N<f!;((}ohhoFshO7&W<iiI(b(REkdrwjX0HSS@5K;MX
z?DfBp^~(Xah1qD+A;d9HCS-1O){EhTh)C?aV%)#%`5Ql4C%2sb1brjhDoRYW3Ay_+
z(JSq1ENk8Ex%2V5!XnbQbLZ?)GT%b^)$HgIbf+^+QfqTBz&i9ZVw;)NX6f~{ePXVs
zx9>*fDP_CImiZ}j{^nmv1w2|)YyD*Xgya1J)VQv(+H<8kDZQQR=DHSO5EH}I{={>M
zi+|nlei?<QS{2}mlP1>rX0P(lnDk%$PQ+{h!_?8X*^!nq-5BY-849N%uKJ7={Ur4+
z%TOgrC9Qg3vApi8TJ>SXFH`;ZKO9skky%(G4;r)4ShOuIO=-E#aU~K`?Dp%IY-7@l
z$&DXpN)9E2MP_L3RPonOG+pG}*}R*@WJo;6x;W)jL->{xI)SldV?1@3@m-JpW)4BB
ziP|w9<f><Tyd!!}n;bkGTmq#^99JMcOW{_Z9+QD?TJ<>0-JezPZTy-&ir;}857S>=
zN4MT|ZFe^_n6eV(;f_%5zO8qYU2%rknbM>?&i37Cwz-In_FC550%aJCNX}JwnV<0;
zotZxuATCe!d-ZfIDkV-<I#88DWPkbgK>&>Vz-Xfxdj&K)Y~%AE39+ITg!Ys~ejI%z
zI4+-AoZ+4?cC0KD3BN{`QK)ts+tBUpC-{F?)R%UiZNY^{T#MTFl<w|kFn#R4-5hCC
z3l4a(gl8$qg=t86a~f%)0ghFa(>_DaSDx75TB@g}gQfakrIT%`mo0BS{p@+__t@WW
zVITbD%To<bCNsk~b1iT!2i=C-iQ-=;TNcEyHF5M*41SYIGGJ0ZR%^U16p1WNfAB-2
z{wR-#Tx@9CHXtOl<SNrsz?^qy*WK%GR)vQ3Z-{>ndxW0iKC;iHA|<*Vj=gw=-%t0*
z8YeTqL`0o+uthPHwNK~;5#NWL|K}mwFyDh&Md`^>`?kA`Bc+#~&om^|dr8=%jFVmc
za3bm<iCJRA%NSodRomKi#pd?fp#VMB++m;OhmNTJ79)S9&^;~lJ>r__o*P(`lcwJJ
zhf6=vw%>D8=T+xj`C4-DyCad9xiE{@#pBOAw+4eZ(JL=At#)yDpL%s=d@w-X(tl-W
zT*E1}Yz=7(GMLOT3irI;<zb@ogthQTJf)&h>ukGUV@Am9X9t#MB}tucV(MI=&bP{$
zd}0p5x<bd(^3NGZS+g*rTA28s!E-Eka@*~(NoGxW2;J17A1aoM4&*H<%h5v9ErF+y
zws~UWmjFy9CWIqKj6QbYI&>Ghm+D-|TO@FZc3T6Q1@rltvi6tjN(Y~R4C;bE)ZmR{
zN7%HC?{-5c9@VPd&M-<x-ceu3vqPQFaph7)=p_*g_mRq=JY>8NA^WBJ8jdoZeT`1#
z>bueFNkQ@F3YvVc)gBqO^S-6~jeR=KUn9>d;bt%6@_<A~anP<}tEK>$cF|DML!FCG
zEmPF|NUi#UEW@=Ff#Fp%ETVVOtoga^X;o!g4J%Y=RZ`>P`4-Qs<T{Df69`@6p%zt}
zHM3n()qV_V8fmd7H$Tuf%t^`{;zfCE)DCx12S#%WP-Bc;hwdrg8|;b(Zn68|Qq-?d
zv;cU-`h96IcT@O{x@tvW7y3&cmxe78@qM?lj93piQg4>EFFvf`TkL-_i`VgKBJc^?
zt~z*<o$y6~^DBVbGsRCrhYZFSAGW0+oV@rJF%!evwXLqo^VbeVZoRjqiFN4e8*(q+
zBfMrpncxF!X1sinpxK7L)Euq(*6GIVUU-Ew+k7FO=bT?tOYkI|GGlLT`Q<^Sy>Qch
gw5590D;eH>t_HS2b&a*y|6gVPw$}&~8Nu{_0JoE~1ONa4

literal 0
HcmV?d00001

diff --git a/public/opac/js/butterfly/butterfly.css b/public/opac/js/butterfly/butterfly.css
new file mode 100644
index 00000000000..4c3bc39b8de
--- /dev/null
+++ b/public/opac/js/butterfly/butterfly.css
@@ -0,0 +1,125 @@
+/**
+ * jquery.butterfly.js
+ * @version 0.10
+ * @see http://irama.org/web/dhtml/butterfly/
+ * @license GNU GENERAL PUBLIC LICENSE (GPL) <http://www.gnu.org/licenses/gpl.html>
+ */
+ 
+#jb-overlay {
+	background: #000;
+	z-index: 999;
+	position: fixed;
+	top: 0;
+	height: 100%;
+	left: 0;
+	width: 100%;
+}
+#jb-window {
+	z-index: 1000;
+	position: fixed;
+	top: 0;
+	height: 100%;
+	left: 0;
+	width: 100%;
+}
+
+#jb-window-inner {
+	background-color: #fff;
+	color: #444;
+	width: 50%;
+	height: 50%;
+	margin: auto;
+	overflow: auto;
+	/*position: relative;*/
+}
+
+#jb-loading { /* For semantic value, not to be seen */
+	position: absolute;
+	left: 0; top: 0;
+	width: 0; height: 0;
+	padding: 0; margin: 0;
+	line-height: 0;
+	display: block;
+	overflow: hidden;
+}
+
+#jb-window.reactive {
+	background: transparent url(reactive-overlay.png) right top no-repeat;
+}
+
+
+#jb-window.loading #jb-window-inner {
+	background-image: url(loading-black-on-white.gif);
+	background-position: center center;
+	background-repeat: no-repeat;
+}
+/*.type-fragment #jb-window-content, */
+.type-ajax #jb-window-content {
+	padding: 0 1em 1em;
+}
+
+.type-media #jb-window-content {
+	padding: 0;
+}
+
+#jb-window-content:focus {
+	outline: none;
+}
+
+#jb-window-content .jb-caption {
+	display: block;
+	clear: both;
+	margin: 0;
+	position: absolute;
+	bottom: 0;
+	left: 0;
+	background: #fff;
+	width: 100%;
+}
+#jb-window-content .jb-caption span {
+	display: block;
+	padding: .5em 1em;
+}
+
+
+
+
+#jb-close-button img {
+	border: none;
+}
+
+#jb-window.error-no-content #jb-window-content {
+	background: transparent url(alert-64.png) 15px center no-repeat;
+	padding-left: 70px;
+}
+
+/* Image replacement on gallery controls */
+	#jb-gallery-prev,
+	#jb-gallery-next {
+		height: 0;
+		padding-top: 85px;
+		width: 49px;
+		background: transparent url(gallery-controls-sprite.png) left top no-repeat;
+	}
+	#jb-gallery-next {
+		background-position: -49px top;
+	}
+	#jb-gallery-prev:hover,
+	#jb-gallery-prev:focus {
+		background-position: left -85px;
+	}
+	#jb-gallery-next:hover,
+	#jb-gallery-next:focus {
+		background-position: -49px -85px;
+	}
+	#jb-gallery-prev.disabled,
+	#jb-gallery-next.disabled {
+		background: none;
+		cursor: default;
+	}
+	
+	.type-iframe #jb-window-content iframe {
+		border: none;
+		background: transparent;
+		padding: 0;
+	}
diff --git a/public/opac/js/butterfly/butterfly.jpg b/public/opac/js/butterfly/butterfly.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..e407b320cf9a2394cfa23b6a20b850ea14c3f7ae
GIT binary patch
literal 28274
zcmZs?1yEZ})G!>Z1qwVA_qI5}-Kj#GU?mVN0g4w1!CflQ7Hx5dBEbnoLvV^ifkN;g
z#f!U_^5=QpdFTJWneW`0yLM;y+}&e)&hE|B%`X5gSOcU1AR-0;YzPnFW*cz#nU}Sb
zAAkrz3IG7O2vxfPn#VRsD_ej~8=;2i1`h}Y(B8Rohw2V36%{S>Kh*y)vop}rGO*uc
z{ul0XF|!eXnTv~uPk@hyOI%!9T3r0m{|!WU|M}-G{ar>nI!1=OgollRiHU)YpN)-!
zjg4P|hl>C_62f8v0s>;fva%8qva*jJJ^VkrxM>62B`5YH_9G$U1`yvRBDqU+(+S7|
z0EkJ5h=>Sy{x1*_laP|#x=pD37yh@Fkp9;|3m_&UCM6*wB_}1lMNCBYZ}nZ02a<H8
zkM+nb-QIH3$L3T@?YECSf$%WgTC{SPK6qF4G%okMJ}=`a(~|Z3Wf{J^gl>rmKtxJJ
zO7h<TM0bfFkVw)!)+4p#mZEoy&3VG`_5gA-1E3-ye0rDUF5n^H^bLs;mJ&ckssx~A
zAbs;1V8zOCpXd#M>c1WYSqKU3f7$=ni-ER{6hJ_h0OYp-52%P~sU88zZUHpj$la%Z
zlJfwN#z;Z&mW?trCFSndRDOPSjd!oVNRj^(lpuO3C~@C_Fis~x>08kUvOL<MvbUcA
zukPQs=9XaTloDilbBmaTitHuf6F?`C7J&S}QU1>tF>PX><0Q3AuwkYnHvWHF1Obo!
z|4#_S^oCF*23QgPLDB#KfC8MgSV|ZqC2U~#5#bRzFDb*+Ulx-rNy$=vc|rD4mkrRa
zwAztEW~@&HP;Ucx*^oUVXCVhz7t<1h-c|U%iTFYeBw=L>d-UaQ(I#mLBahzO`*Z*n
z0GR|WpzRR}fR+mIjEYo(K(mAr5rFDnTweY!K7=12C7~t1b>E5{@rn2=F_FZr`_9^L
z<oG+M(kT%Uxz11mPL*=}ZS0h>gnXhpM3yP{4v^xDmcv`#?o`sg`+Rzzh%=wwB{OCY
zQ`gHh{%_DnZBGF#?{d_i<QA0>Fk)1H89oMlk{?g}w3xI90(?zgp!D`WZQHB+l&}65
z5kmUtfAU2ClivTgL?B55hL73+Pn;io0s`L{XcLejan=s6lBJBdfzewP6AA<@Q%S6x
z*}12vt3(OykMK;nqOs1vt_Q`8{2&Q2tvFjy{3C72*r!?)fH!x(=j*eMhlc4H015rx
zVq|=Di;*^+D7?}@`^_dJ_mlxe0mYXh9C2rNs;Nypu|qVimP4#QD{1$eFTGL!v-<yw
z^&`NCe<zZhKp_7j`yWNV``SiI?0l=UJ=XcwR64zt^V>T0N;&m!ywgmb(@bsgHjcpe
zuNVoFsU6P^rMKY-U18+!#ol%2UU|&lx$?LdN{k>(G-a5Kwp2~uSCMBUa7|jer`#V%
z-@N$3#IN*4%S%ZypVU!_fGgvZeEp(LjhvT!dUC*Dz&D$OMJsuUC(Jgv7iDY_kxU=I
zkzN5=aWtVPenvvcFqOBL|AV?@0qGkkfaPEM{SW>lV&XT1Jn5shM*zTm0FeYs3dI{q
ziT|YpfOF)lnfogw&XHEm(Jy$X(z&P7iN@IPPi4G`w{pL~^7uz&Sj;o{Cq-I!%F5oz
zSlE}0w_#~tN}j%~CAkAs`T{xir7NO)wq%%%lX4@TidT0Nc_btA;45!91%O(zfPmLf
zl)%f1gTJIezu~!N$K9b>Z)Kl?oz)T#ofwJ!$d=F=Pyf%m=E=BKVIMK&<h;yAO?|Vy
zRdZat$JuJ)b$Q0jBHHmGdGA5BOZ_@NjU1oRV%%EPg}<i&2d!=;?@jhtZ#Uim4w8D#
zb{DP(GnVHRS|h@j%^Jg@U8uwWzq@X6(9zNLwt(S!x6{*u>kC|Ze%)j)wvZxZ3{iPi
zookWnGncByY$<s4dwEaIdr?*c2euF{p!Rrzl2AW|2dP!sdthdtnniwVyq%E4$F~!$
z$*!j9va+LThE>o#P_Gqt?A$~=^f-wwr)%Bp*q=AO0jym#ul8FWn}+F%S6y$_)sM;7
zWv04iwyFeLABp?T&zw+aowA)`^1KzB#qZg@#%jqLKzS?*XBdgCwcfo-RS%DY010g9
zZWAx0m1e_KAk&ZIO=03EkFfbdW#cGOAW4v)013i!0=^Q&&A$qZkN{rs1MbsOX=z7%
zr6%x-deyCI<_B_*dvC3%6Bdr?dp?0q3E6kr;l1x|;BP}SK4HHQh?AKDOG{X2LW9l|
zcj3(5?_&Cnk|uQ<e{b{nT}3+CRpKj5onrLN?|WxNrDqjZ;Vu1-4O%IWG^Z+6&|76l
zj4^mEGUOd&RM2#amtie;Gv5thPHuudK+LS#)4X>)V{4(_Kk)~Ttb==~Q8!dEXz?TN
zoT_hSvB2zkh`fo5SnE+=AS-k8yvp8e&{6V?2D{UwPytO`-~Qz*C(Oth#0kpa+NIRs
zAsrx_Epp{JcsaP#e?9)!F9=oFfYGnnq8=ZcRK$wgltex}k>_w?TEY33zT00CZkAf%
zDXH1^J7>+DfkkDFHf9Q(!BMjIMSNP#zKgn>pC>-+Q)qy|VwH}?Wodpgfei^sX%i_1
zr>!*@=H25Be527FX}4N|zWiCE<4oz;g`yG4xNxY9<bwnP^F4~Qn*tX`UmrN8H#g4&
zp03_rU^V)iH#K&Y-7KQB)<5`LUpuwg9U-2|8`r}DGE{+^PGnT}Y^2Ui&(Cyo`E`rc
ztJhqoSh-Hc$7zeu4{`)3T`$(P%&I;wbX>}fDQOr9@}u5C)Qo}(!6imZe)YQ*-AX*}
z;CpgO`=^|D*sl+R)1qyfW?YeE_zwEP*5`Ij{i_(WY*AQDI%|F&T*|^$%ScK6xbz=+
zYn0w(Wott2__@rv8q1MPx8Yjp^B5U>#f529mpvX~t^*7BiL!p*hf@I>Eo%7V)18=u
zk<!cN{GyXDs@=qOfTGr>dU~8Se~JV5=bIOhs?!~@3T9YG#}(dX*@UGHzNP5&tVI7Y
z_}5aFarwEP<faY<9hx{3uFL@07BMsanaPmCzq|808`LwfbSFhiR@Age>ZVeN@st;N
zA*Q|=44p|%a%x}y6*!-tC-elYhX5%ReDhlK>|Z?5w$QC{d>*k8(kRcwfj~O>Pu|Ji
zC6E|I)n(Gh+Q-2hKM1co@5$z`XM$Io>a*E8L`#VNs~6(5?&$NUf^BfbWB<v=wv^ri
z30^5dOD%%N1Q5L;D4_q?<`pr3@e$cetNZNqw+PCRdrI!{H}==>zhrz;Bx@(I27N43
z?<+h(EOJl5*$G0@gWiTD_V#_}&=h?F+XzXE9fe?~@ss|Z$korxQ(xHN$@dm_6gi((
z?3|uptdG!W3*Z5vShg#l7#ac`{-w)|=SkVp3w4+~p&r_WHp@+tmvJY%B`6Od5EbT5
zT4sFleQL|{4l1M5iX~Wn@LXfEO&-D#N%pj~?)SLU_^(8_J*6b?B)NlpsKR8eeQZxi
z--Pe#(CP3;y5Z-oLMU03p4@prLQHLDSc+b^kbS!^8=p6aB=?^7BBRcPpZD%Iex1fB
zs6?;Qg}T9d_>XeGJbQU_e#S1J*63~rH}m)gEY625P-a~}vH{~L3UN=!k}BzvT{1_v
z23*ydc@3`On#aq!86o=F<RwRIKiISK_u4f?3$UnRl^>!S<szk>LLI;SkALHg9P&TH
zol=j@Ki6C{Ygb$T*;FdLhWMkl%m2w(4L`o3KM{eY8@PwsOai-GO{P&r8Q>9{M`<iy
z+VWq&c>TLQLwsH`qe0a=B6>>E$1k}nvm^B?rnABm(I4$ZzNMM<v2>HqXlSbRhjVz+
z2eLZk>o^N96)CiuY8Ve++`i@fv=?X14L}UiwK4<sTwX<R@_EmL3e}VC9hUK9n|=6J
zZ@dnDf?uD!DOb=9fDM)kuiL<MOkg;0JztjHQ0JvPDkm|8L7LCdit1&;40C~!_K;bO
zDK0~JSm(}Pe;L<>g00mKgxoj=5(1{pnnZemr6T;ROU@Z}4ly3jG9?X4e9z=!`2s!!
zMO#@p)f||l8?U-t%65qwvUx8kEp{jwtPRm&1X#<0BT2@K3yQw2Wj%92IQMB9Fr*ud
z_q1mo|B0?$c1Si0C|hbOH%!xKI+EG;kJ+;H8OIN6UJdN_g-D6d9j7P7Ww1FksNK2n
zJy0A}XpjYou=V}&_uNj`5f?i`cz+HU4RJ;IM;NYLa}Kj37R7%D>eL2jI~-2+>-p#Y
zo)9YA^f&)}RbqI&bNMliRpSOQZx;XDM3W0E<&c2K-ua>*nvf%6kQd?9lnIX1=S>G{
z#l3>(8>c?88GD130wwZmOYndAR3O86pN{2UgS3eJ?HG_?)xWvLPq2n>@%Iv}P-oJq
z^jp1h3<QnD5wUvz75EuDy$y`}7oG<q8cxtvOzo9&3<i;}rf;>m+v+FMBT1{b;nSSm
zYZLQ$tUp*1Zo$>*XI?si-c83i)@>UmT#fG8aMBcBy_?H4tV_Up2)O-;-CY}2^l|gP
z?r~qqSUZXrMsh87OCbac7Jz}8%W2sw=hm@;u*~UhTB!SX72sfiOS=E1eqn4m)c62J
zGaijfcMbKt$P0DSm<$Te`)nUL*&`O<4O&i?b{Mf$XdUx2b1m@Ybdp0%fB00AziCn;
zq-S*=beBT6-TRmC={DYRxo+Y@dpLeyIKCUZ-}Wx6SfNX?PsQO`{Ek;!dbKxbD=yTu
zU!nCp>y{)PkI)k#MX;o9I>=|~2d1H5Vu;c_Z<WIc!_B_+vy%0@D0nGPXL;fPu9~4E
zI#7jGbxGVdP*pXPc5y<d*{96~l+I?PML{s%vFJ+{0ma#*VmbU$m+3cEr44ioPtC;R
zmjJn9bwydm$Rvinwo9*?W%91IxPfmMHvsjS=1B;C<`-&H_tJVTgygphv4s$KZ(@(s
z80nYJ4`k$V+#h11SWx6cVsy}`cx`Xl$5DwEz*+pU4>Q7A(<4EDJJRW%B~+(%_tWf0
z<5r4RQG;?cr4+QIyYNA(BN5fJmjE(qP}jIz+ETTWvKUI(L1SfQ?sXD1B(rQS%p~(T
zUCYpW)c7RHWoq_uKQ&mqaq(r+93*KzLr80RDRs^JD!uMroVF2tHD*f!D=HO}kO(uz
zJnd;UoS7XmM_iVzxwn|tmhfl9T@5fUnK-#_J=d0LtJMYxiT&XWCbhStJ97IqVgC>r
z$x&vUmc)9h5_L3fTAu;CsMd)Vm{KqO>1F;J*I74yd0|t1dLAzFSJt+&XYM$%Zlci_
zmEqy*t~gXYLg)eQ8JD}fBe|!9$m|R()(E^u(rU3{(!H>`Q|NVItfUK{^Xx0?x=i;u
zGDXsyAF8(W6d`<0p*u~r;?4J(nfvnA@#P<u9Yp1=ja3+yqb#CH?3-tuk-~VtjkMwT
zza~7B=))ml40FmQR3mj@L)8g6wlkv2{t1P~o%f_ELFE%nQx$r1US!zZ`qZ0Y^324>
zhO946t3)L2l{Qs`b&-BiCqRO>_g_^;OJYSN2jFkh{zBL-5R_O>74`*h|0*{NUF@yS
z>D%`Urf;=Z-hD(7{*B#+{WdqvBY7UC8$i+2G;G{$0=e>TNUN~KD*z@~Uw{g#5K;8*
zJ#35~92}f<-_FQCLO*6k`kY}fUh~1w!**K+t0dVKZS_7}w8M|z+e(^PaU<9Cy2=P+
zs7IjIUQ2`4g2+zOgaks)$A_5#;uf08G1Km*tZbfW?=qG?w(t*TqixRdhiK0;rj$Zc
zkptdUmWKUbzKzPK_>N(W?UZ1*FlnMRiV|%$mhK6%eB+Nc7J-#Bs;Pv-@O`63Gl^0W
zecofMJp)qek{<QNj<V~(5%IDX<=5-}rs-EHMd#czsAQUsdoMR%PUjbwEO$L;{HPMH
zTG!IhwKmTtW>IUUi0YHq+E--Xtu`~<wr1KuV}Gvi`kb9f`TvgZ6Qc+TPdM=kmdV%~
zsLQmFRh-2VW=MbOyyf7z%!a9}B^bCqOMU|4^?qkuH;<I~O7uvHNMWP9c=8*~+0GqG
z*udnxcRA|bQR@wWWHRr^-=UAmK5BTUYuznXAbEzSl@WvSn>d#H#BXzmMiRadv*h*u
zJ)0R_TkuUg5^z9^Rw$iG4=B5jqS6Lvf(n1Ox*cC2FU@*k&}OG21lr%}W0Ygy87#^a
z?h#1iBYfA*NoB(3wcP!mQ~*!G$1#Bb;B`LP6Lc+Hiiju=(cFyjdXI4XOww4h=`DX3
z^cRk`KjCtwFAxwL%JjMBINO{=9-hh=>rK{_tQHMa9x0@oSGa$FnKsF|Q^8YV9b|U{
z=;NIM^~*wgIuCcoTe4ZRk#chZjtTIcRyj!%*^}h&riqTcOXK(GXhda}KdNas4^#1Z
z&x*C<v5bN(fkSdfD6^_9=8}8fpn%kA2>PGfseC|Dv1m7~iS(Vq54H1K=B9H4cv!!8
z{?1(8zSFHnUE7fm*O`Sb<5^jxXOfA=szT4U!qr?@W2<=Le)_qZJ=aMjJ|H2^p%BWO
z*5z)GDQ!Tk4~(FX>__8yQ&;`(?ILuP&2xCO4EG*}{>9-6GTHi8hNc}nZA@5MaUxM~
za7^0LDmEreWPQ;fg93=7f}OjOeltxo(q68ay^j6kNuhW#J#g=SF+(4N1TF20$1m@b
z5*GndB;^1EMO8%|M)QpKyA~R9pO3rvg}W^xj5;=C@xanFLnji8ZQeA~^rHa7Ksrq2
z&<QcaaXu9Pgz%EOcPOzl5y6j9CHjTt`MuJUB7}amWw8qvGF15rd^v0i^Ac^Dn>hLo
zS)?DdR@G0hU^|Eh+Q1u?<2>qT)4dRD)53CM=2_{EO;^lv7L`-O9;)t#cwHrXojY&w
zGtLjJs!@`j?~T1(6}^45?F5oluXy)MEk~CT8a~OXK-A1o<WLg{Q;CNAaI|mG$B#j~
zXR_;c_<pQTVo4$8(F1bu8B-42@0>2cPsc5>XEoY3C!pkYiGg&6@5A;dvkyX{v}kx(
zk#fAhC8Lo!1>>%KlCygMN?ak0TF1vRrJl_P!V(7W2h(t+h&|~KwWH(BPs<GJPDc+*
z3i+})V$=t!8bu+ev`e=eb;>;txH3J{+ULn{dA_C+oOtz;uJ;j1j+N`raY^K7N?K6W
zHLB3Z%Mk~KWN?oTrB$BY6`nq(PTo-RY6d5}{IwnOEn|Myw)rf=pf^LCqKk=JQXrP(
z5jo)NYZgvc8DdtF8vy-UvxnVjkdd1;8MA;OUs7uMi%Y$w8-V{#hWx3Ike>^FbitWZ
zjhgO&{OIfy<IKC-B@%xnv?pY59VBez{W8It6%3M>eLtWiz!T$vbFv*yoLEtD*rO7}
zex&?_d-QZskAWa{C8<ckQVC{OGl3Jt#C)kv)ngd%IMWk#*SLzN?Hzfy+4cs7LEc$k
zYjB{h{4<Bj=0;1w?~(64b#G?{^@t5&?QGl^&?cS!f_<Qog0$}$AV(ZfMaL_q(9S&{
zRnTOPXp+__HjnNXgqwad*1G{DR+Jr?IUjKalxJB#O{U=hiy7Aj7$6_({Ii<Yow(hW
z7QM<=TT!KW#djJZ4~07>EKt~$4$`^(0Hyl6o+%3_S)}^G@@?BsUu=8Qw5m2OSI!R{
zw!nP&GVW1Z^!N2kG;-2+J+yD;Xx{Di{xgj?(8~ty2YoCoZCthwQkL!tIN=>P6jnmR
zM|g)H{8T!w8;u$8Cm7i^7`N-5_J^zXWl`~<eLv}Ok)|H?gIH%9JBUcsJG4u2mQ#5v
z?nErRxewNmBR@40LYWmV9ewrQ@r<3lGUBMqKX&h9`mZOd41C4~+S2JGKBYdmZS!(?
zZmmz*^}4!LxPce9)GcDlFO2k*;cp0jHyaow`vZRJ#QtXzkXU%iDuEMI_4w7lIX^aT
z=-yqMESycu@L`5K?~K2m8~6+!Dk)X+rr*E|!>ALR%OqcZPF-G$@7CpVE;##Zp%<31
zy<P0TweDBZ|M6a;U$(dqwzbfe>_r{TGxqzuL(C>yj^C3OoVWZFGR~iUG~FthNy0k-
zhlOTM#CkK7*&WP2SNM(21WN_BhKt6hB|E5;L~(WrPx7s5Lord=f|E-w)6T6hKJOK1
zBdvjH@YQy)3%+o`cN{;Up0Y@uKMq+nzioJzV9hZkyei(l(&22LT2esb59lf#C8Ho0
zJfTMRR0Az3cXhL=;^|$C)#baI;#89G9&icwxPhtAxN?uUAEE1xvv71D-(Zc$S&;i+
z!J@5GNpLV{LeD*iaxXmcZn0boPoDd>HM3CP^X4q1$2cZABX3ji>3)~~LaNSIK!}&B
z(LHJzV^-X7c6$~Yomw`8lU=AN<ru3Szo<k;{&+$%@>jvTjSXrAVENvh`HO_eAP(>>
zj&}5ZE5gaFi&@8S<lN57U-c6j>nO}g2|3Vny65oT+TL|_%hdS!rqTjNWUg^+&&8Ip
zVAhuP;aZ{ufu2*6l`r<Y{rnS5=qQ-fIZbtVM@YkSZ@r-<(x;@NiK4yF#vSTTP=Pmq
z$>Y8v_5PFWA2mt7uO|P<Div9M&h(r^Wsa9dK>qw*WVm2GOJ~{1Kj}6Zk;zoMU9>sJ
z1XKNSnbpTf!M`_ME;w_M{Fx+tT;33A3Z6|!Ff6D-4E!Dzo1Zy7_))et&=INdy}TX6
zHQO8KIdJ}IkJFO!)0Z~}lvKuLEW}WvPhbCy5!@rbb)vS*L6fZ$)+5*@u9MhRX6jjy
ze$Mfuas@HHw~TS>EoGQ<&@%VqxUy~7U!P7_QI3(i$}&naw(Q{KIoupu1X-@d{4*U3
zm!A*=ON=wEgVfbb*5JF350LRg=v414VYw`GO_BUX3VHs@#nKx<TrYYRxHBl1J$S3g
z^lRmgHNm7<ELQ(jf9_6q7>I?Tv+`@(FM`ky+va{YteoOvIs!Lthn0TbZK1dU2#exa
z>vk?|`&Mk`wjcP5*5(Fs5fsR0T_bNX;kwLh#%=w-T)cTagPvTK3jM0`fyc8kOfH&x
z`n!``s&w{f6Tg`9yGdm7<8D9PzGyN4d!+N^zb&{ZIk(o~TkCc(0vgH3)g#@YytiYb
z+E3<B`^&ErYKzL&9kWyK*$Kc9!Sta5w@YS66Ktv+%1GI8yoPCPU+8aX6tNSwgxayr
zLUl&`^4!=LZ{mRoAB7nEV!>MFl^6)`%O7)3y+rG#hsJ`mI~NKunDgC%l^7?=rGwtl
z=^?!C34XHCAZgMiL#|q<WCaz5FU6KqW)J?z)4@5{)foU$?mGI-J~|)Ww<|M_Pg^Tr
zMZ#{sW$I<f_nXH|%52W;@WmL3i68gu+=Fj9D%GW%_*G%uLJCw1g>9=mTu!!ms9s;~
zSA=kzHQPBUBY2-X)ZPF>+>1%)Qx1@^xZ3IyTlVCnbT>`yreqItJXUctAp{eX%r;^P
zE;~^=lzZLmB`Q8z8_jO+V=i;mqSnzjJ&ha~tUDdE^{N=CrS|+Tw;ZPSeLxPyBJT!4
zEMWugh?>?S6gskG2a{YoxMWn$>?A&LFuz}%m03CJ+oy0evBDdBKm29iIwoT5DCL!o
zzQd-U%8U8lm&Nh7+ChgcHy%l*aS)f63wO0A!^)d3C+ZaHZ!-B%-mUwMD=SX4;CD}l
zc8KAAduqzAsdDPmk~4X|^7fKZA$XEW0g^wT5>b=5$M?*AY@>ZPVq3ozXX3N^*1+k<
zBxlUJ4vIrqmusj)*+c=uDjJiIa<Z=r&M58A(Aj%Bt?BSBBKypx6|!!fOfu{#8g+)R
z7492AS`P}e5A1fHf>^h39M{#{dLrR0xt(6GM`YBwU%dTFDgj&~S$?S`p-uTd<QX+x
zv4Pdo`=wqO3>H6&pDPWUs_#$5rKts924!N5lll+cF|754A{@!H$fipvsM*K3>*d<S
z@}Y$ye0wYJ0=1t1*M*QVYd@E|r;G1{M!o0b6T>!Y*Gw8JI@F6ZSUWV=>ScR4Mz*%$
zMs@pGF(K=ZT=rR;jYd|d`8a*A4iO7VE|;u<Y_rz6OgU_qN2l5WSK&)Q8>z%s{f$4j
z0kmy4<W@8QnRL&kXF!0gB7Yh}p9h+i<3Cm#I4mDSr+M(K7Z|r8p5#*XN0ooFc)F$X
zutm0AZQ0o-O<U=V>#<yR(?ZRrkw{H?nbVrKz5ej@`3*p+9*H~Ryj<1_S1(*meyd$R
z82!DBF9K!6U=sGa#Wq^uJj=zNNnv?W<H-8XLCJSF!frME=kI1iAKOdLHTF`+FYz}3
zchyYP-NfLk%!zS0*wtUGeS+Skz+Z{rGCKF#+Fobez;U`NW(pTIk8!4NJoRyatURP!
zR5+E+(Z`EaOU@}YyvTcf0|3<r2wbPvVrv3Rwv<EQnvNPLDZ9>%5Pw@U!?o(r<-?lC
zE%d(z3}U>8J%oR{H6-{jnWz7R-vH?Tny@WPMQ$<*L%4E*+OdR?f_jx;!Y4U88}<j3
z5Q2t|wb6r!z87xvW-8Y?=_#12#|{}cr~@(TksYz>>{~}V^P}TIhylk^$cUq;f3^F2
zQ&&&pKZCC<?zq;H<1vink0FxAyvaQGbSj19$K>UXk@6Jsw+*-P7NV$9#t-6TYx{EF
zD3pReW^HA9j6!A*W-cmX+OB_%e<qu6SrkOh>@2Lc?rH~(4>bMS*_PLww8ED|{Pd&J
z&si~4J9XRvh|IpHCv?WP#j9K=!?9EN9avr3VV_lL^usj0rN3l#-lOr5G}GLoa+TbR
z{?sdK*T_%<C&NmFn~GU8c5xLS;G}Aa!4$-JAXyHOk!_C5F0+&FE|QCkT7e!pP7w*U
zN&?B;cd@o$z47N%TXBj3c2-Y(_puHp2dAk%%GWJ34J##ClDa>>typfV8oDNI<4q0C
z^GZ(jIM|c<+;xn&iscRG#b>-W|2SckT{jBN{m=zR<^3zUWrgG=o4$@-d*v!R289Bm
z+DqrL<?cL&0Ww>YCY|1Cy|3=e6>vOqOsO0F`cjfxFBElHaJ@)wlbIeHksi%`h$Q0M
zFM_`Vz2f^(DFQ&h(Ph}Iezt@6K^I}Pb(wYFJ*#_>9Ak8hr`cHr3TaT*Pb5@W#ZJx5
z8G2W1kAfho7cXN*hc|WvQN?TX+9{Wr>%ptd&GoW!qj}2$p^($OL1e3)8b>+CKJOZ9
zCD&kv4Vh0sLr*b`yU(HAndM>DNXJh1TC#u6^>PJI8lL59Q*b-n)#iQyq9&6ddJ7ph
zg07mV@vv~h`*Nt?GSaf&{erVoE5$92)#=alo65=x_PHhmo1Ucu{vrAnbJ*3l<I-2^
zRx$!l^DVK9_BjP!W7SJQh0l97W*x3^I2Xk34PfWAG~)W1kxIfJcU!ZEMX<SPNIYuF
zk`JtRcBo=@i9pX^cFSd~sm$*=cp%)0yEf2tc~I#rOwp6^xtjFl2nXQR{#lmcih<o|
zpUt6?r;pjXie<Chk5ywTw!ECVN{Aj-p`lpj;^00D)g9<nc$p!`Qg#=mkz>(lo|h-+
zp_}Q~52X3yt^;8fQ`|4pB9Hi&yKLx3ifghmOgl3^Ng6my%FqJrNS@NMXhhd78QNr+
z-{D9<=VUk2Q^fnwxf?4!|401DU^&`5<8*5hDKd{WFRz)XZzvq#cFRWSwNHC7*P)7=
z4b9jCAxis=cfL&8ZWg>gM4~4CepZ_?fi$|9F4tFzGVkbphu=FKsCsT~+4A9VsHVm&
z66cK{l3tygao0DgaJVhpXx8atD4C@H!E~wRb<0?lvghe?#C-Z6Ri<3M*lc8dEw=j3
zM5d*z`Pg}3|7WSr-~QD{oVsqT#m{{(&}M`~#>3sG@?0lrGSjVhCYHVNWxOTXU25B@
z&+Iky<xYKU>))Ygmdnq@vEo;;n)6UkgK5>*Lj`FNok|Cp30bu9XA>aWgL?&97Fqw;
zI+g;Q&(Vve2gX}DL)^Z9{vgX3v_}Pe#DO0%)Ac+(jyhE~nRMNpX$($FEQl{ifr6pS
z>RK!=ySqLf*Ia{*-Y_SRCNP>pmK9d5wQd;SF_0uKnzW6tyr<DskH`EICt(mVZg_>O
zu>O%d>tN1t?t1E>sERBNj-VMVQSBIXd$%q&Z_MmvUPzPesQ>xQE)7F@G-MGT5PUnX
z)@AMVGP9>#9z1T?oJCrv;|P1Ob9&}O=L0wEQyOjc+jnVFtgft_^1B9M+(iYL_91S8
z%zSN03r;RRd{(&p2iJY5_cws!r3*K^jd{JuP?garCzcT$m4aAD&m6&WUt0)pp&KXf
zLcO!_66Z*=GtqS0<a-bC6T7=Mr}@At&I7TDsKKEa1@#*i5T|+(2_;)#L+qsVut05R
zDo72heDw*DvuPe|n>LoHOjq1C@3QA|CW^_OIo$Bo^FIADhuqy0Qv^4dv(bOgQUM!S
z3go={hB#1dR^_Tz_VdQ+rWxfY_An;6>VB>%U+M!HF%%`Sy?A-7L~9`QsW=Qw^hUpv
zi0QeOVL{1)4~-Z3V~obPtGSHZ?xxv5pw#U<lMg~|wS+$6YD{+>$BQ@DjVv694Ok>R
zt+~nsc}Ww2I-z>^zwUYNX0zWNR|4xY^49xgC^SJOdw^UYkz-|zAh|>#gAK-CepkCw
z-DOB**jZ+yYhvH8+|rrnxt?eBvn|EJN|qMA@0b59SZ3STVJGB4{Yu_-C|CySbARKo
zK1&gbr9>UbThIOXp;6i3k-nLZVC4gK`WMG?ujA-=Ke6$C%6%co@`3cx?Wd)wFSWj;
zGBR;%Q{=vU19&GLYR^o86719KDk=DUXTsaapZTSc+&Bz&-p*eyVr|}^b-Wn7JJWd0
zZNw8*cVzUi|4-Zv0IIbkEuoOiGbRu77xw;z<}(3dhY}3@_`(NTM=;*;arwW~{Vm8&
z(l7a!^doB{^$PsNb8{w)N6{6tzH;06QYYS+;7QX1kI=6hyttKK*WwMO?)JIQr4}OA
zP&Ph|daO)x(~+-0%tIafioz-++DsNN5z4SazWK9AP7!#K@H$&0Tw}0LfWMffT)PR_
zcssP8vivj|mY?*|OqgjaF@Wse6VYOMpj$-yc~em54M1OT5*KC3k>EM`58IJ6LeUVX
z%QZd?ZHruM{!kB|-|#mQL|f)AX)?pJ)S2tfoLf~KiX9`-G~)dH3k=DNFGfkRE8q`l
zyb_#}o{ODteZn3AfEIQ0^LV*mn^_EjQOkW+V$}})CaD7>2%jX3WSK<TMNXLOa%#@&
z42YkreKJN7mQ=6Fh<{pJwNSdHX=>kPZ}?f<-l#&d10ngtrM5mu?Fbu*hdWI~{33+w
z2)^r`;$lAD%`Bm^qC<ts1Q(6eNis+P^#I-srrA1^7)0@~f#86>jA>TIUe}h(oueCK
zo$a9-cEy52pQRgfG%Rw`!a@$j9*Ty{#4lcp&pM6k7D}sR*x#lo`3@?`(pLF#D%Ssl
zU>kXji*FCE3ziY=q*S`nfYjSk#X9fC_2tT7ML;76^BHY5CuBL)sycq<lSt+iEHY!}
zrSYbngKGDILuAr|%Vx$QR-x$_w_^VHyJW3!wULiP&6dlA+ec??)ipBZA0!69Q!XrL
z$?`<OL6hpmp1gNm5?}CEzEvi(+_~6<yetbAG%C!rKsK1ATY5rqLfs$M<lI3n<~gKg
zg9(#&*;PUx3?XlCM=A1@Th0E;8vP!e3j(i`_Xzy8^lZ)-ordJPmk}bN(rBuU_9vqu
z5jxRFfy3fHKB-(fLqBHKrE5i77Dn-fo0@wfSAEk}<?1Mq_R>nCvZ;EUOA{WQcBp9f
zykw>pJy^HuR-))0^!sQ_ZvKFE0=6iI8b|DW-GMn8Wd*+W>zhs7kXN*h>`6iExO>GT
zPQzvJ30V(K_BJ;rL6_IfY#XxRXaWAJj;;glY_=uv>UfkW_O;(8%2ikwXy3UxWBMiR
z(Tkk218P}L;?VwIMcTYL#PWN%@TUZrr%6+^lC|AJS`0FpA&Da#$-$IYsGcgM0UDrk
zEbifGq!ii{^RYvf&^hX^^(fsj&ritB<Z_}2dS}ZIed(Zb*X~pOCM2(1rePvuOIvOK
z=jir&DwH&wj6zVZB+;Q)P-8BpKcIN@GtQ*XJ7uY4bhy&~mp{#CE4Qju+2<-rvV}3X
z#dfZ}>YFO-rlOhZyhXYM)uC=q^y1K_o#~N#EeD=TanVqkdqxS(#@$W8WQ4A`b|X^S
zIAb#Jx)t#hW$d6gY>@p&=kt{3XlI_it?|rsRVzN!dfPyz>)zuDJ_hXv+%Je8e0^a<
zO-*4Z!_WpGj|Ol$rQ9O1F)$97QIFtxL@<CD_PlQZB{LRy!YLb!pujcwQ@y2y;_qZt
z;UkPtk)nWcgNPAA_vwo=Wtw}t!Rca|W6e%ZH-LMtbG`16iYztiu~u7b*tz3)k^{zk
z_JZqP-{$)CKvf`Sp>|6YxEryu^m|UZmdhhxbhY-V@n;-z6>RaxGb?5`53Kg*$r{ed
zZ^CW7NBXl7Vyph#-mKDGT7G)>Hhtc>+`at963QgBd|_+sn@hGmxwxJn7r&<rHCHUN
zD4>&zLAw!0V_&T~v1_jGdzlGZO6n5wT<=v7|D3XEMQ6+4)NH=^gkfdgAF&UPMj{t%
zueM<k9^fN~jfk;0Ux)a0Qxz%%YxQrlX|wk(Gd`kC`N=V=D7wf<9G^zD#_IUl=k>S*
z_tB-ArJ_8oRBP<Fc^Q<ZycEPBqRUN_YC5$J_XFgeWu3x;?$DkK`)&9V_1iT=Qp1Ot
zd98!ZT|U(`9sGnPk|D)_>j}_iQ=uO;t|S|N_iIe6?k0`7X7goL4i3vQUx(|d^;q+B
ztnsYlRPWHnp7Hx#DV4R%Tv#K5t$%J~AXsL*qd!}IHvk!n0lt&8jOm{GIqTqoqwnPp
zqXM;0eP~+|@DI9#b2vh0oJwb>85d5P*`kg%;!or)Q4KP<s3f<zC4F>gVt-m~6K8a1
zA<W0M)g`Ss-XcOZ3ai8_{#_sEjYDmDxdvWzol4=E^ZaMhIzschrA!Lc&Ak7J;C=Y_
z%_rtT3^Spt0>PJmrY%|a->o$IRVB&>|3UZtg(fW{<Fn_JKdARFCBDY(dJ#{{WpYuO
zesYxb(!QKQ;B}AeLz%nIi9VxG1c2My{Rw}!ZUFgf2oa&aZph0L#9+fl1pLKznXX&F
zSayG=tw85i$Lm#>FJZisYh4ZQabbbLp`groa}H%?$&TQOyM|WFP=;cL-*bu$ZXy|D
zrXDE$wj8q$Gov5$L5|uZlR6J&6*zQI<9vQak4MB)%Wx~cCtLVx<Vc5^*rcecZpkpL
z+Me>&N_EfMzR`Ip-xj}CI!c{dUreVge<rMgtfTYn<YZ8Q%RJL7jz>xUgmFnbHfN+V
zj9E?LP1^?&#CoUG=T6T8<G3)aE_uPq#<TbkJ<%&^frQ|wx}o{ibxpSl`3{cwpeE|N
zhM-0zvE9`dtun8woi0j`cOKMlazUx9ykF&MBubW6{6iw|d{8Ryw4bm8n}#U0%7Ka-
z78#T7{j$uc1+~lyhX<ZjHQr_)8Qafa_)!m4nHLEgkc{RK({S?|xD5pt&gqr4IFz*l
zeWQf5?h)l9zQxL<@M?a#mBr)4R^cYtBsi!{joFmH8>#!uEm4sbk2G<FYoL>>XZgw<
zVjha*rk`detS1J4s^nwI{|5hJ_;4xk`brG%zF0S1;-a%+wR&b`Ycb|lHq$t!lpw0U
zc?9iG084bGDSfyUqsOr7zcc7AUe>R;3Mf!TFPtzNt<Qs&Gpy6h1qu%?_YNzY1qQxF
za)0V#;`PsbkPo{5^w~=W7Qlm?2XEQ{1UCpLybS<Ik&z=cFy(pTtj$WxLN0t8wh_A-
zq_(yoToPX?rf(v)9(y!bx3)X9T{fqy?m3GQqY;a`j9qH=Jq|aW4cXrAIYf_GI0?=g
zL|I(4@Ow`nB=zrzxOiWEQtTmvo3^Vh4Z5~Jsft~%Q!ef*g*bt`<e$ZvWPP;D5!Oq)
zNb5TE%YN8cF<QS<o~UzWa|ZKaHc}Yx&R|pN%w6WsqJFj2k+!ee@H}g)(U!BLnOs#=
zRNJ-`6I;=}({<dW`{DBR9BtStmIe&yeb+VlR$L5ZJriIS>*XsY1LeJb`|M?!L5HM%
zPbx2!&2u)&{QA4ZTgvH4X`^%WI*H#)Rixy*Pw_r3;L{Wr_HouSr{Mz|_un!HT>)Bi
z0_S#H;=d<DtR}N?C)|JfBU+$v)5YV?&ZP}_lDWWB<k$m@`LlI_4+?x{#^o~B*w*Pe
zgT}fD-;44KU?Ze0ZbzY7WT0l5)q~TW=GMY<2S0VwhDEuOYv_B=KH1L=nJ6PU`L7u@
zSaslpn(cBy&4K)mnh`$Bq|K92a>ZPY!644F_Y=|2sXbdqN2y?t(u<9m*57mE76Vvy
zHBf6(h{JmB@88p<$OeZZkN{J$PEYF4R%FVMqz6~*P!mYQ{-IM)KO3wxMmIxSFJ;Kg
zYk!iJ!|d;sTlK72C~tgyt>b6luZ=+)WOKc@v(7q8R|A*5o4b!V*uy{n$oX4o*{+z(
z()vdS8+o6yJ{>8y0(cZ-j>4?d?TElZ%Zz3Xd~gL~eEr2}1C~GL)|r>;?pjH?e8JuA
z#T{;p82fWOarU^f#<<?r{GHj|EjM>f@>9@(o!pXX`cAa_#*W;<%+5EkM?6lqbLJNe
z+ftX5k+J12mJp|7iaJX)T@tdWy}hNAl{Dv2_pP-4kB;1#|L$!4@`n<^rc8ygBW;(f
z;Ll<Wb9H?#XJ;;;_JIM@{3=~(dM~df&L#T_ZM*7^g(jckJSo@si{eYX7Q1}H%mf|2
zGSUg$(XZbiGu%+$=}nbZ11<f*2K1mx#60EjQ#ummlXswt@&)Th5QWuWW)z-{x>~lv
z<;$%7!cXG*D@{?)lk8k>09tc@bJ-E0)`~jEP2rBwj9w@(ZtWL%?Qm#8OU_jrwU&{y
z=3)_E*6YRIP>|SIvcgu8OkU>8Lrt|+j!*v^E;}r%oa_Sk%E%}k!k&Nmy79wP2_*0l
z#JdlodCx+j(flWsx1Kx@NYa~T^Rg|&x;VeuCEUAuWZV0W1Hv$73!0JaFu1|~5VDPg
zo4;rkF>SB;{8UTw$6@euJ7k&LHhxLSz2lxkvR`9#sk>gByM=dsVR*@AJ1X`2W^i)Z
zMpXTwE>E^$JR*<n$5?~fDC}<@nXK{S%Va-@ifSPyLh)hUsYT(GaJ2!p-VvGhdG1Q5
z|M|~&dYW|xf-?t1CL{5PfeNnih;YBdiiO;Yb^OOm!kK!OPx+mF6kqTEEYi-Ek$NID
zzhl`vV~&SkAl2JjbY=dq29YuzexxvI*)cP4jgKC_{d`;1Wg6uu;|Nx8jBH=jxy^HC
zp^L5FOcvKa^wAv;t%v>@n2ERy(eqv^S5C9$Pe{5WbJSBEzWOJov1T!I%{+WARKK)q
z-z0T+_QYzZjQO8D2GQa=+}NlwaNOsY1v@xnMg{J;yj0JQ{>W#tlZE!4_u5u;uUi&i
z<<GB%>#JskF&&hwoU`}@J#=VrsXHEASNP?x)XG03zrTgP0U#xKG`1W9oIKRWpSSM^
zb^Vk5?PSXiC)F?@L{SA22y>WMXavT9`mUmZL{A_ND@D&~KNM$Ke-C}G^(gX3B;P#$
z{TRjp8aSwXr+2`>X0!1HZU(57Our$fmNtI|iE_b*4T`U!IFkI~p9XjM6LMhsAu_?f
zL8bHdcO_X*Ot&?m4?w@>xGxy%YsOu_w~UlAq26yZ70buSbWAaPNcpHsR~kIvQLv=F
zo*ZLuE~V|E@&l$V^V{nbmI->?WO{gRXEg+JoovK1)?rH-mL_YCW-|RUb&9=&!84xm
zzUYp`bg@c=icr%12^n#i;-xt%kWyIvNr48E>z<a*4{_M^c3w^~JPyYyA`G{nVO)B(
zaT*jfYps>(*4_NJr3F2I$j2fQX8={)8|=us0W@5qXLr-_-v?bkh;u^Y$BWN{KHS>e
zJP69mn9a1{2+Du$Wag&eWES*-LU2+X2>`2@!<l)sd32r5lVSMTOy1<gl7fBnpGJ8u
zSs8{XgSCSauU~)2!K;0cDr9}KkbCn}``erz9u9_J3LM8o;dyYB+d}`W=Ts=78#);V
zt5CGFF&X&<dX>i2TD*1Y;_jePFY@KU>P4&@(+k>BT8ZKj{hCi7NE<uVNQkIBMJq9l
z!Alqy+4wFaVwix;4<iPAE)@B0xNY0nU#{pfJq>kc)l%m;?b(Zfq#wbZn9hCJ;{$cY
zkwHz4t93U3T8)`dgIC3jald5!%7h?r3E^hJC*lm*lnp$?(%Bd>1bs77Goh3VoN_Rr
zt*cm{C{I&i8Y3QGV2f|Q!t&=PB{MECTe#)r96M!doRzwlI^A9i3IEHIHI!9hF=ytP
z62Mv3tleCi7NqJLRTIpX|J(daZk&NJ-&<aPb{QGoa556w?{A2{Ja_{Dv=LD~Rl>eu
z0aOwFB+usuzathUc~%6Zef%{CNJbH6v*7G~b=`D||Fjue^#`<{U~-gIj+5sU2;A1j
z+)Eqp`cSkAor^u8<e0A=DfdDYq67-If!nix#N)SPMYwL;k7L;VtTki(ih~LR5UoB-
zs26CO#Np<AKUiI%<H`=))E-gar$+ti?`@-8h`xK`0~g`-Qsc9UkLj(2a61j}QNNf~
z*s#c^x<xHz-+0ll)#u<tV`d?fv_nluh@bve8-vvxWNa&a&<FDI^W+kCfB2!U8|hq0
z&n}jCe=V6LGvw>{ZIt)yT&+l+Rwm8FLoZ0vYa#XLgNl%7;L>&1WKeBu-D1$ULl`=}
z0WTo*{hO{%ZKBp#fp3rk&&)6`!E-3iWMs)6Ywh6H2mWER+J&-kSg`1?zs8B`^dCOS
znQa{r9o)nVApSCK-3#Vdo}&+OP=rVs|H_iN0m#zKoH+!$&dw|T>YK&5kJZdZhF0ep
zc&<IA^uCIzS}hw6h0%Ml-__^&WVuIg`O-%A(bqXs=wI&KHGN)ru;rI;UtbZ;$bt=X
zDT%}m_2NSlzW&B(``(RKNaC#(l}Wbw#%~|`L--8kznnh&PPn2bvsXb$NloElSr`oD
ze#h*&d%C)AlCQvQeFm04T^^sF)qw+ThUU&G?B_&m9yQqDQCeGTtGuw9mTet~<`0}E
zr@|31KHkeW6tZ-nDZV7jY7b89JhZas!KFcy6TPoPw;U<-oDwC`FJdt8l8e~Vpv7l}
zLMraRzI;Tjz03S6@^p!0iRf|RW60-B)zEK%uWe2es3)d@wL68cd6jGcaR<K`a%`KM
zuL#@S{A`9y)fy#bm$2X!FEf8d5j7k;65Zk?@4!(-2&7C}B#C9rc%E}b469F1JJe%q
z)8pke#_LNoghYNP-R5lN59yW+2+q*tB-S1D_f;{>Uh)#%xfbk})a)-dU2?=loRgFc
zUUS{fMx5aXxK2wV0^R+-#=+S{b!t1PN-EWT_+0LK_=(Kq6*@@^D14XRbs72rPo_HO
z39FyCz#4D)vzOCkofWk|Zs+3@;mUUt3{di4Pv?}G+-c1_#-51wV-kz}(1WhJA{SYk
zU6F>O8iPee-+>XrJegM>)|Wb&tRTqF4d6$%Om=VcN8@8TI+h1NiKqbo-fSed(Fc&e
zc?AHdEmCc+S=0UmP?6`802qnifBj7=2&AW^eey2Hmh6#=?(X0BZsy4b_~+2Z?1gtw
zH;2IMQI!I-i^bFIS8m!e<NEDrYIlW9{nJA21&zAgI!w!Ud5QX|g6%e6q!<@*_nDiW
zn<L`8IExWUAriglLdoSgsy$*g!BFm-L<oY|okUVM>cuQ^aAJWsfDR>&fGg^?34>YV
z%)&nhZf7;__)^%unOB9ry?fz5vYm5k#w~$Hbc0Hk=w-cf&&~GHdUqACMvN#3Oy`zB
z5S)6Gm~iy4;oP(~6r?Y3TIS0k_lMwgU~)-b+*B3SG;l-9URv&PI5+*q`eykBFV1(D
zcgqgCUuouC#VlRypk)(Hwa;WvGWMQZGi%Rvu?iVRgxh70X@b}1v}ojS0G8FyW^D-l
zW#G|@hfi(*+b|#g8gN7nTJ%b2U;0}4TH13O<M*w)Arj)IlLAgmu1#q@R#pY|Lo(?h
z2BYc!{Oza%`EixhEq7FNKC>{#_kg`ijyixIvSm9NPuX)X$s%O(x5SfLJET>I@mJZW
zE7^n?zFH$DS9>ENJ1wQ`-b5<P3Eqcy;zM3Er&~^OK%oG}#-sHZR<0wgV%olfy=Hm(
zbvIL1A%7ofX!d)%qhzP46z;2HCcO^nX`UH(tjCIYEKR;eBAsslqXB!TE3n@nUUZ)v
z-ZamY?|Z%eJXn=XyLNK}dT0s1m;{XkG-tr#n`+fqfC95H>Y?dAK^?}G;)C9<ot>lX
zQ&r5BD@K*(q_{$RGb$14(bnT*?T?SP`f~#S76kPkH#Q!Gaj)cU29{%Vye`0H<zcCp
z)vYe8^G^59A-(g>SIeo1ndyJ9a!O)rOYV&qdT=hOQ}zcV2n}#$!h%!oK$XDb6VBEv
zN27auY}S7rSuke$eyB^iAi*+@{1cS`m7?rvd~N4-fe&T_`4?k}iNt#GCaF0t{&GJ%
z^VaOEJrZnC^ghynVZ`9^J~k^0Qpu*7$6M8z<><5xd%3dahtREZ3$`O5w2Msol~+vk
zmEm~!cVYI}Tur44S)<M#@A8IqeH4zt-rJDf6g`t!54xVy{KsJ!%e<ix$h)x(y0){I
z>%0&I&oS^8$B2L1c#4{Cim&zPR<m(0nnt8!5Sj)81(COZAkY)R_)t77&~W-Vy)uzU
zX7hLa;UtOd&WBC>5e(r0F8ynoUN>hbD!7|tknSJ1p6L*dtM+gT3Wg^fFO7C*ZqbKr
zZ{sesuydHnVR2EE?*aVd9sTV7bSK%<tj|7`GxIU|iKUhOAU)rN?Hm?OTq7qlmrK1a
zVb{5r@*|_-^x(37bjBj0?CUb~S(bY1*Et;dIF7V>*ZelhUqJmm6ir#AQtbc|6=tbU
zzAkTxzmoIwsh#V?Dnt5PMI{7iGMkeJ>~uxO)nrt`5#<ud%-~VeJch$A+n#?8#IG}3
z;!bytkC-maPeXP#;Hv|v6^Nh6S+J2sLHz+z+#W|#D>`efDyw5q5^Y$x2gHu;Jc&RU
zrWStqXQML&i8!FYl5eGIy>`brVo*A!PJ0%XL0RE-wS2rMO=)RkY0Q7OklLCn1B_b1
z9OqxKlcyV^k_i`Ov66Ga!wY80-U!&?cgd*W&4^r4kVluBLe*AfH(0@*&3*}TxqVVx
zv{(=$9=R5E128=6yADvjZ51@z9q(l_p5?L!YgM{*8!44L7`*``6rThgwZl<{$w~Z$
z8UspoSN?@4H_f`@AX{da-`x<9RnhsYBVR6a*xYQ3Q&n>0(i5pHQBc>~k;ciNKv|{j
z3vYQ<jopd06umBxhMvJ{dx}rMv_*bS38O(;Ib(oOTLq$K4#|;YCAM7R4kE-0DjY^C
zudIvB^5VjZTBH(#MvC#~<@O!Hl|4N@sq?=>FuN`&&Y?{)cCRR_eUELWX64gvJVMsT
zL)?6+OC#Z(y_*<^0#AO5DTp`DnD5Id=dCZ~agQH8e)R7xYz6?;8#Y?P9b{tO2bu8i
zEFaWm004shMfAy1olr?h1&Dl7*ea#<=y5JRs6@qx-?)E0R<ON(%2^CLhc}I1TV(q~
zW4jwU%DeEFul8E@^QEcM*?MZ6@p!ddnfvO`2I#}T4Hj$3HvpdW)@e_(d?#Vg_zNo(
z5OV{#`*VvE!Y=6WIqkT`_z*t5_VA%!$QagSGuYv3VE`VRZnNsq4IR|j>ADQ?hrUjP
z_0(xia>cDO`?#q}`Syvyhmr>D?|7eR426z5^o{qmkYPk&c?3av5m%r#F)VMt0$)-@
zOs$AzTg|Ssj*J)$7Q1arE<~5=I}r|IZH_+I^$I}xuji4OI22%3O$^q|W`^p)#WsUp
z_$<ePGm}!ojgOXjwzb#lb5h@hmF&Y=5cYf~mIEY)Gx%?K<3oF$!TKsOyjzFq28`j)
zXu9sZ*A_V&`ynFv^%EAalyUKgCD!kM{eMNh2UHVF|M(pdEU1V`FJ7e+dPj<KQ9wd3
zp*N|LNa!6Ar6`0Z5Rfh<lmvp*5SmJrex(E<q4yG`BOu)Wa^L57-r=0hE@wBhCue59
z{WDL7_%IcozAHd1-YsBAj&S-iiloH4!Y+1X7n8fxQVX@u#WB9DHo=VZ*>d)-u<6xC
zl+1r$!-c_mjttOwnVB=pBmu7R5-6*v_!}mCa!Cew?p(1{mogmYLbBdH;#i;%-uw&t
z+|m{^e$N>h5KMUuE-S%&eBO^8iSt4W>sTm&n<q=SEh@9Qo3bo=<Y_D&pYHB#&O4V}
z{iR6UoJo^-tNUts{GRW_aZ}{3UP2;}7r#$Z)~F*GjF{6%h$og5=wg~voFOVDI<={M
zHZmAko!i2!-eP+G4c|heQB2uVszYl*slIk4cV9X>SgY@C!PX8{J;6n*&8x_%wC3sI
zc^>vJs3|K{<P3cTcp9=7;HK%jFlbqp*<C=>gr}Fh-I;xXB9H=Q!OzX2l!~;`$Eg+T
zd&(%!udT~7{Uj})tvQNhD|xOD-X}HfL2<wlG*gPw|BNv<rmee~K}z`4jOy5TwPUWj
zM&C?^hkp0kuU0YkF4P4RV0InaWr)n;9OFOcf9`NGek;kO@NvNEAjrnZgOPthDThUk
zt;-TWAk7;y?Rm{ngJn%w`lgxonS+USX-dpv4oiaC>;jyUfV|?bAmbB0l1+;Law?T9
z`4=SVQ#rynK%8I9%B~9i{F~|AY04R+pM`Zb8mp7ZE@Tyeno-oNYO|Yr3>Q=Ue%}sy
zbazt!9hX{Y1|P!X&A30*F*=m(uaVN@vMAyH*DoK}?AzB>HTlHGE)OKF*1&L^p?95s
z)cFgQLw$hcB{%B?BLpF%B`fr0dN6ulBRzSm%p0w;VW`vS|1ST_fLn{K$+w+txh}I&
zOYioS4sSxxk2RxYlSJn*>YS{zl;Fj|&OWz?-H;%Y&HXGcd9PbiH7sGm1D1`4m@jVq
z<S^XI&~?Q}YzCOl(|Uw(Qm`{~unZ}|hOZwOV}WYdHLhzY7nHVikzSQZ7kh|$hzh68
zWQ6X_XN<nPjCl@wn#{xC#xV9E?%F4yhF=l{@Es&C0k91~ne2LSfn@m3dd*&fz71eP
zTn5$~5OqfvKedywS6WZ1ZbqF24l}yw7gho<nfzl`vTL<4!{cGL&U_L!91?@+ZFFzn
z(OL|=af&>hYA1N>1t1=A&d`uu76$C-@k-eAEeK`8)Z5RQBz$CC{7%8M(BwC}e-nrQ
zJlYS|u)Vb@TUsi@u%&#KGrYr-d-~@A*Yq+Br)VcWuVyr*Z1wHWEv9(z2Wa0mo^eIJ
zw<J$_UQ@`&!nyv7g`Uyalui@If~z?#-Nta>sFj*;wBjUYebc&ZLG3i4P;ksX^U!1s
zG3>)m_$GX-PgI!T!&%-rJIw}mnE|Khjx8nlap*z?ETD!Amazgfra5p382_#+W5u~Q
zOiN!6s$Y{Oukg1(CG)lyw!PD!SgU?5nsc|ptb=GOXkbvG+{|I|FDMhmT&96#GwTeH
z@~N;2bDDnn_JH$qUm8?>XtIFZMCiOO)LUz!pAk}9aG<*Ysr#ubq<hX<UaInG=vH&l
znn=7sbw0Z?lbc~VLxrS8vp2ZKi@f`7B+BRMKyxTt!TB<xUT)fC4HJ4A7lNf7K$jiQ
zTt++eyH^;QmmBuZAXMO#@^n-{*2Z4UHW8o8hK&}cdz#)*Z>1F+yb(L740&$4T7`SI
zwQ<5=2)~{6;bFVZJ`r6_QsA9tSR^nFiYYYK^``_KHk3kz954~4W&C4aYC*H{@aJK2
zs4f&QCY?!b)a^{<m4aQ3fb~YFv^sLS$V6OR#<N}CR^w4#Lnmcrw@;ualkBD<HMFI5
z?^R8<-GLXW*Lbo={l%X8ifw4zE;6!oemH1HgJeeL)B00+WzS}5{G|}4sJ40Sn~yXl
z;jV)Bq$QSmLDK}tM{RtdzW3br=FbYjW+Sh;c@6)-ISrM9rCiZ%s2^HbLswf{w`g4P
zM`S*48Pd9^&8TGF8Ycbdj?yh5MMdT0zIbh!+LS<yYxmk49UB{#G;Q#i(g0AQmH~q`
z_(&UNqFG$;IU2=&bNbd*u{MX)Pg2(~`P%y+z>C!iVXm3`qIldWB8N|%)96+EjHOTQ
zsPIx363>Gw*1oCN5)7|h-X#+)mR4mo7KPn0%^A+zM8Wo9QCo<24iujpG`glS?6$o$
z={>_viCa<$GAkDKrbur2OXfJGWr&n@kSW_e1!A=$`ch(9*4r7K-f|%=UEQ8IE8kQb
z0hW|a*M^@SqQB(+AzSrAG4n;a!e4i+NUx6>6QoeWIvdud!L1S1gqjIK>*EyxMK7op
zP|492QcKA2&!cO$kZMTddt>s|o{AN8?Fpy|nB@Q%<;kV+Xwb9w>wZ3x@2Nii6Rirm
zPo>HWl&%Bql7y3mU}Udz#>)(y8b0$~yOz|on!pn%!PYV}US&*q>zlYCxmfa8Ki`il
zKIeQg1m4#tQdARHqqBVmo)WjM9&^5K_*?Puo9_ArOZT}(vJ<h)^=qSCiAacWjO=yZ
z(zM&*WA#-j%D_)9Rcz`O|0*L}uM|&9;Vt@99jY{>y2M!4$!L?DSs3r&frVELWaztz
z*?Lc9RUdP&p-i=#H{Ip7nDfgTm)9n(SWAZlJH0ziQk^wWP>zDY@iPINQ!%pW^yr+&
zXt1fi@}ue@5r^7JdF3kWt0q`hGqw4V&fR{b2Mr5)PlGDQY(PNFD=@VOhG-B-SH49n
zWQGh>#z5q(0-F`o7p-R<&t!_SN&<d9{QC(z|E|22Am;g7sV1X_KiCFWWvpUEHp<59
zFg*y$ImYwNAuF^nnjh(3=ptL01#XVRr!;Px%PAKi(*^u3?W>0xay|wl#IGxC2UZ3l
zK9Wo<=1OA=baz=i-dE`xkc0iL9a5b|%Dyg9D7}=<9*5&ui>B;f(<7W#fjnU|uB+z8
z=>v~T_x*-!yf=!Q1r#1q7C&tWaQ46AXLb%ciRZ6^26A!5`KgzeI*=#vRb<EqBcr0^
zG`<;m?MI|st4d1wNzz_%iDm7`${_>Uz5Z~MPpJFe4Q7`~gkR4?wL7ta>R=wMn|lC#
zxe2_}5PFZRzR}v6tir5)&$hEAq@fdBVc~x-VP6=Ln6ywsQi|PVFiL!|^%$?-ap-p#
zvhi_m%F9}}YuMkV@`*r9@xW5pq;61w`+keIp17=K;72}~>7T<f-dy2z4xhWPq@~&I
zvqnoXDc{bVDAuSlQ-$t0yQ}@U&hJx2X+g66Ka@O{&1Lhvx^_B)HqBd<>e6hQC9U5N
z_7{9Uq>mUTr^`}ggb0S7^BM6C%{)?(P2)0rh{T&rp6C4O?5&}~DXRGqIH8n@(tb)Y
zHp`dY$Xwm*3z%gso_b6|Tbyc9?FKXPcDkE9Bhk{X!P>|ij|w`Zxu>6|+9vD1T$+Sx
zdM(Snw%jh|h3pJrVers<IQvICuZTXg*z$!9TXC8~LB*Z<)qANm$RQp%i1$D9=#EH=
zT%FSolUL@UI85CO0^&X~<Cw!_^RAV$c-pN<u4#g^u4(d^ZLq`A!M!elcQp-X;zs!3
zI@1-?e?jR&AsJiTBZU^q#><JX?RFBXUfwXYzHtW)h+`0_=)rr?6Dn#+Aj|>qcYu=I
zL7W>Xnz8Htefx0wTQ>n%6EJI~E>+)5dBA;57bVrhRBc*7sAF6b;o)?e5u6{&^Tke=
z7_}(Mb4;S!si!fgL(flByboLc@{(B-Mh++b3nDDN-W|)mUD7n&nk7?SlP;Kj%I{kx
zw_}@T=E%tcbH3ZW1Qt2#aD+i*Q?Mr!PL5AWb6>X|G;^^AD623bT7v{_c?g?g^uZ)z
z^j^mD44uPIy|X2&3eD}F<@3U@rr^`Nwo)X>V=x+m<KxF*HR_D7Sk8|GW1ft7rywm;
zpqNcw?A?TPQQhL-Qo0yuIkOWFy9hR3u#W?h^LDbD)6!k0dS1_1%cw4BB*wO}SsM4W
z@TvwmIpxG&CoPIa+4-HLfVmp$Twg<+Q!>^vd4BtdJ1g0^bHTcaz-+Qu;%~;G6=X&f
z)JU98|4o&k_57Si`{oT)?AA_-G(y}h{xJ*p2E|~=Sz~c(O<Y7G@wN1;;AMRIfJOBL
zpG>ZFnsjLLtZ$`d1)k}fy{4Ooj_l*iz}7AG@!RUzN_uRYR&h3TudN~uD6%Pu-@eqY
zlWY-tx2+=}9mlZ56Z78|OKEKgT3Ixcc7DjPUm{r2{pCq4?X)z&Rd|8*yXw9c)cpIN
zReXJy&CdIEia?oeNsge6H<N}KD!$RXe+}}GF9E8e;;m~fw_8jPN$e;%oCv~cE@$cD
zHU~0a#BSNg;P3b?6QtwH$>U7ZzV*BD8-59*1zFpAiiGE4Th1KXgPms#VOll0Ba^O6
zL-@*Nxl-QUg{1wlF=ZcXqyS3<^4o`zVyx@{XZ2n-`{}_i-g%OVWy*jV17l&y=Tyhe
zZ9XG7r>A{snoK*M3Z|c+e0({otT+=LYRG~DlQ0caPRSOtgyD$SvTU;M-_TIBL+STY
zt)c!gwtOzBN*6zVl#SAPoSST9b*ZQ_sBiRvm)hrwz}-)cVQYjFc?tKRz;Xo+PxwIW
zq9CP0BMgVCq<n21VX=C=+d6VX2tBqa)OI&UQGngav?ygn+%3nwxhu>%=a4v+m0+0d
z+o&ja0Nyik#jWmTpCBfU{ZjCpAxfdQmEf*o=++-JR&q1Tdgd52vAwaMHHd+R$=ces
z>l)ySAG~QERrk)DPx>2&Zru^Fe*ZL6=12H7L0~=syfxqt1gOA(b<G;>3rI?5<4ZT+
zghyXieGm>zI{K?r)ZeRhklfg0psYvu1GxLfkqdEarAT|&5)Jbr@HTY9j1FOCizn<6
zP2exG;KYI+{?aiso*uvHceenq#bF4zjcj>P(fu~4S0#J!RpwM(HUG%lENsD$)R68P
zW$6&*o`0Rs%h3*X$nMrf@O*^$W3BMpv1O!w92bn|u~7bNuARyNe?wchwzk~ud#jK3
zW4EV8OJ>QNvSLIZ#N7w;8^72S${Dbmj8N}F>pn^m%J#ZrO!>n556N3U1|dK;d5>cR
zM!!kwr`khNsE63S9n-o(_hzWJNY@8Fy=th(CAh`xpAROnCGdWvZ|BO8JmtD!^WP$#
zUnAcMmT*?#ZdPc>iuNk3MEyl2r5(-m`+cdx@W%y%yfpDBt+mSMrt1*qrNO9dGOrK*
zE~+m#+sl3AvThUPbIo6AY^m<tB-EPtn!Nf8?d&R7ti=Xzu;Tt4hK(Va$AihJ*JMpu
zyq7+n!+J+;+TD>*cdciw2$KibX}xpA<j3Cb!GYW&BY$UXE@(&Bog2(K5GUzlq20PK
zu+xqkkUOao!E0tHl@-&e?>6`wNnKLVhbo2-?b6CilWni|uTM@7hPGJ2PmR_ZxpKS)
zdgE3NO}a-YYoF6Y^Xjr#q}Sndi<90+Yg(}#JDma1=f)~yd2i&m8;_wPo^v991xWLq
zvaQX<Zpo?J=he!<wH{}Ie`nV<;Ieeuf7%{Ytfdcdvb~%iS+qx{&3NLR*%Y6xE6PIS
zbv$t5_wK12bQ)nhvK^{CQn<H6GXxzRx&%^f+>)xTV?5oF%3ADY7zN|$Crt0?etcU{
z1%QAdeRCPJ8)atSlHl5*!X2rWdd+O|jO&J0NH{2BB=Yl;bqu(3DZ?d-FOk8SP6qyY
zs1-Jqp}W15;gLDg&FZu0us-fsEP=#{*0oc^ajrqpb-VjE;x6@BO8&!pwP>#$?_?bR
z?*itX*jMlC1&@a4s${h8Jbn8yoGP3iWb%X_6n^az05k*xBs&nV%!3?O$@d^fdQcaD
zVFBF&q|dc$SJdNUJ{Tkme}D^rU<L~}Ay_JU$2!fe^%(S1KRZ{@2PFlzrlPM|lX{3-
z)84fkf6Ax4gN?8!{+#bUo;zZH<;<j+Ay(}Mmwz<Yq-V7DdY8>^jc|}$={SycO&3q8
zybOISfRONFvI+W{99qQ7wmr3c&f0z$A*20{yDuRrHW1cX@EzRf%xEl+ds#DRn#vTo
zl;P~=emKj=rO<lg4!JOPai@~%PeEN|(_a$E&f3o%a6G-%*mL#1#Gf2vF0|q)D?g#^
zver#KHol1-ptoJw=D7^Vx&n}8pQD46IG(IoU+1Wr3^19zYbZZ1U2jEn>8yXgYh_{f
z*G+AYMsnrVBy;45&^efIwo`$iWsE2L<CRo``!%v?tHce3N$RV%?U0DF$v~fD`WQ2l
z`WgL(h0Njc`aBEV9ZA2QhRp?c`>lZxo)|GnGdqzpF`wc*LT4EL`i6Dt105dIoeHbs
z(Aav8#E}ZAW2>SvQpf5qgjI-EIY+k8<>iSDQigJit)J`U-);S7EG7ezCjBMOD<m~*
z)L+CGg^$wmx|ExON~@7Sia3@BWCUBY%NTY4u$Ly>iTA{bNTN+cV|s5h_1sC&ZY<&8
zG9X)xW(8?EPFs8?U`TlJOoh89seJCcU;ALTx${yz+I<iH)Kzsi*`*OMjZPXwhQfI}
zJ}CB)I)kN6VD>`aLTWMLv!QQ?_p!0Va@<^{B;!sAw}*hvH7%JQ0q9W1ONSs$I^Ov|
zJv+F(t4U-in6J#CB~hXk>>Y3V)L{t~f^-D8$aJrDM9z<3`tv@eI%BFnbdxPm1G}X5
z{uMsf%Jr|SL*rk(%qKOW%UJMiL6h#8bbdG7=YVBt9id>n6tlLv(Fzalwxx{`v(~=D
z7{fC<`OM)7cQ}Za8bB3N0o2F~<m81NL>&!`XTZT>f02s@kQzZC8cEQd%iKM8o@*t&
z$l~r%H&XZhN+>Af7G7z2?WU4wN$`f$<A#V4b6P4!HtSGDEA2zE$+(I><DP|`ira>-
z-5tHSSSVeaLApZXLEoptCMO|yf6>ifm8kYbkK<3?TkA(3`;_2m8mrjOWc*Ds3g%L!
zG+kbfC@l1GT}hm`OHhfM*#CNby5ZM=Gxd(kMf$;Y(3y*|_p`Iy{>eF(7Zs+vbgc-f
z5R;&nX&UxVlRDb}ezI@DK<#IWFVoR+>Y_k$WDXS)DvX@%k$;Bcb=X0B-GZ6DSWMHE
z>htPBmB9!)t8Q<1&zyf-3w`0^2&&0~H3~eE_Km42n=+*sBYS+Dt>Bip34Gflw@|$)
z<G4mYJ<Hl)|9m<j$7wY(Y^R;Q;IzuSQiho_pS93ItUh&KYh|85B8RtUVR6q$QI49q
z&Og5YQhsRgp=)C+tfF*@hWU^4yHWo^7AW331c{SP8RL{L7)~E`tX?p!%`U6+7>!NS
z1wW=D)n~pNcnj_Rppr0sgf2FK*Uf4NuoM_ztcPyb9(H-}??vSZ$>LEqrX_moJn)#5
zBAHFS8P>jgD{p^u?B{9fFWl4pf-+WPmn?gANv)tilj!!OcbuhTa85f`veWRD%i7=b
zu7Ju-@cPYJ?u&w?=T@dXD>$hjrWqC5tTB^x$(xWOar=dLciE3^mK|*;gDGZ-4Dw9y
zUxGEF00M9cR-ADzVjU!2Iyl0i90Fe!MjAy2;w~rl84>u{_^}pH!QWoIQ#|TXIzLm|
zOh(_)y6KAfabOZhHApEz$8IQv&)vO#P%Ye!tfpo+zdG44J&V={mS-p~vk)z`L*bo+
z^?A4DMJBB8zcfenI7Z*7jdV0y_OM*)WIc%j*mO%RO%*1@l5Yz-@oOdZ+e8%>?TN6g
zm)SdC{F9pm2F=m42(?Y#MBjyXFOn}RPlNzdA9TMMpf{>g1JKbc_b+|A80>EVGa~N7
z)d#HMG^+NX%d~(eAe;)oD_xHPmU2U9Z}s>)FQCS}rawYITxGZ|eu|SOou`*hw)rno
z2D2Uc$^<qY@nKTcI87$L2<wCr+qEP4GdT*<ZptM4?t)<B$j_jAd4%})+HS8-0(eBw
z?@kis7yXt)wE7+0(v3uWgOO$FQp}F(5xS1Cg}?722u^{Acm+pRK}?TnLZq1D4E%#r
z7;INKMQ>wMWcQ=oNOIvyxTW=Y%$3}a<I89pDXe-@Aw=sr<W$=-$s!6NN90F8TPC2~
z3v!kF&&*zPq4A6x-sZeE&ZL)Ok60C>mzClVn(lNZLqkh_>zUD*rRC3IP>N>G8YV!#
z>a|Rco%@RrxRo=E?7mVg^XeD-slH1~V8UeB&;Gg2-46eX7BQ(o1@<#O$kh^^SLpqA
zTQU#zcG$2R)zf5|LBl{+=y%Ohyw{o@VGkmsc#AWB-OPiG?~?I)Rg$;M+c@8NaO^7|
zLNXOC-a*vr%x!s`Bm`iv;*A;s2wTG{ap{QNRvB<}i-KEFu5Bx!;tc-7gDz2B*Sc^%
z^JK6ure_rkCBME=GSWc#=Y;EV=i=r$gj0B0kAB(wlfK4P9f=|TF~dYZ=EAja0l#w~
zo=yU8&$=d^EBxD2Ziw<vb|y_tpzDvh+{~9EY}@d7<CM7cG;M9kGxyW(E4A5{TVVof
z3>D>)#U399$z7%gngZ8Hehy^8k+$hkaEj)miQR?f72ee%0w!ept~)vIale(8`f*iP
zq&+rFKl$t8N|<pn;yrHCD0`l0A;y=CNU*;4H`>2$;CdfbQe>)8QPFB1!xEEzDaLC|
zVL<VP->cDlmHNqF1}KNAmIB{YA_GD1&Z#bZ+<(psh8!PGLuySmS4T3JOs_u58wm)h
z*bm^q>P<DdYxkE<aXGY(d~tMl^|-Cq!N@aluqUSS>Xos^!T6OJa14W{##>&1#mE{i
zc)`{U2k^82&>7$_Q!9qI6|mlAr{@CH7pjjP)K6H$^W)wFUT)fACVF}%K;{3~LFMq`
zrOvf~B4QlxKA|ePE4ScSOLh$FY>MAWH4Y=be4%^ya?I<)!)e*vHhs8H982ct7YwH|
zozv7=-LEGh?iTLHVkK5)kBjy7RNhtO=LJ<&wUCB9f@LF9I$fD}Q$rGLaug{$eR9fY
zZa_M8uTNf3dI(+3h`{P}{T2yXB(5P^rrF|j+UNgcBcPzf@wtH8xj=rStFCYVE&!>R
z4qQ^PG%<RMlhLBR<4;jA#mPc<z|p(xXSX`|>Kl{wSfIk>-<ht0>rs}5X|fn?x?3L`
z-4)ut*NjHRH{-}{67g1B%Js_>%HawP#^>0fX;(8Kq<a08#(Y(MEpd_&vH9mi%E@4!
z#;WOwH;ROl50D;odw%cx=z*`FgG>2B8Up#x7f9i2&o8o$th=vDU{RS*v{u`eY(FTl
zxLpN!ZYO`UC?t8gzzV!QCJw~O?jtPd!g8Mg=3=z`%@M3-`mWD9Wo#*Tu+JUGUNkoO
zrw_dAf}K)=t1DF(M9VJwyb7{vK+9^NO>J7H&WjD=YxfOhn(Vw5YeHPNIs)vfa_~*I
zslHZvA6H_F1)Raz33<=E3~{$=Cl}sK#_7LauuA+gw!C$&Q2>c}=Bq;YOyO;eGu6ik
zLATj^nFIC~I+}mKS$gedfkI{u7kN13?P)F_v5F$*=dMFyFhZ@P+peG2l~_IMQ%FNs
z#*^)$wfO^EhO}oWt_75sAJ1_@z2XG)6D7aC8$MhFE$gZZWg-UmRHWI7DBIN%jmQ8<
zR2548WiDiI)acGRH0ss2)q|X(=_&Kk#WgnGC8jf}vi1|X-ws__Sx7m@;~Im(yjiDL
z+K8elzI4>cl^+vpXUtQnm56jKAx*T8wYyqyRj)G(sYB^9T%6C8uUzPnhUo?d<>1#9
z(VZ|dr-*>nxYFGo=@Am1!!z!F8Bm8PcFhxiO<m)TVQjCEA-5J+9TBbo`}^-AnP@2W
zhdY3Z6ASRO0eU#-5<P(R1;F0a)W)pg1*-R{zP)$Vlm<}=g@*%qd;n>&7!26I*FXTm
z0k8p7K~w+&7<`k8NA*(&Xk9(o;WCTyT2>eu@9$A5=Seuq7kjY?a8xGK4oOk3140hO
zZYik6gK<)$!Tgu+4pP4WGk|!CEVZIQQB;wujND7M$zpt?cVi?7E~z)O>M4A|A4T}O
z>0EW&iufFj3eA-Ty*JmhHe!iQ6W)tzhr~mfxb4j}XEWaHGhyb`px)FY)WN+s1X8aR
zE>A9fK*@06wN`-MYE!qu%sLClNZiYk^TL70bSuZ6l(Rp9?mvN`jMq}Co%{gDFb(5p
zbG~HW51Shsneg{>t<$5tknp5|YLk1a0C7nbz#Rj;cvT4?uL?*jz6gl{KN5{WsR0#j
zcn1^HGk}Fm1>(NoyFUQdlTwo#fc|KH;Z(oy!vTbKKj3!g1vUMWL1{P$cn~CU_dWn2
zPloylzJzkom%artUjlNLsosPBe#)qN&7pvc9@LRc3uvPSAkZhnyR<q_J{dI7M$poL
zK!S>ZqmLE@GOiU=1(gC!s87bVAgVX2AX@)$1Bp98kC$%#4ZJb{<E91_+qdDM`yc?K
z9u2%ROPs2&{a4U`4KUkS!+~2api<%204D9lrM8@;m-A&1)h8y^zi*{#2RKNj`a#=Q
zhO>ccKI2$lzE?fw4Rd>?THP(;weA17iDkendM&d_-TkC~x~Qh4CK_*&QDikd@ph@`
z6y9HvQYScuDaYje^?8VpDt8)i1Crq0btgeo-VDswTk-M4`TNi5EjcZS9LcP_45O&b
z->`U99dY=}hCi=lZ)EEzs%49~VTkvaN<}%O3^ip8R-Fyv*7pKmf5?!-1w0>-J4&g$
zCT==KTwf^>1Up@QJzlpSY&l*ASzCBYN2!y&%2%-%r}6|Y+WA|_`$yOqL2oo&mbbLs
zt=TH;aFiI|S!x}>;UUXAx8?iwR-zx?=$|chNG&>WSG26tD7WW4&*!$8t5U4#ukMHx
zjQ37ZP7#d{*`j_Fp(o+N$Dac4iY)Xe7h<H4u>-}Kzq7ZBmhq=dG#EYOU^oOL#yvq!
z4X*f2woTpA5Mv%Gw@jSI(5{9RbfrHwQZ!}4l!)}GQLuTu3yQAjlI@psov+WC*GlyJ
z^G<&F&+G+9p*0<>LSPt^F@J0}tZe=&bf!9o>w8I0t=1r|VjUl6=l}rzJxp~TI|6IT
zRFH=5-HZbGj9dO*=N%NG7jw+3pH+QZtW5N+U+nss?-ld-#QM4md^5X?6cEmllVi~L
zsZa3@Wx|a8p^KheYMJ^zqovSwU3@)Fd`j(>ZP8=)!_%uKD64|yK@H**VZRTMb`?G4
zUoyD6z5PX}ChSm_5&rz=f6VCiuj-o^jZSLkcpk<|N1_~g#~mfs&4PjT^3>nG%kbTG
zt>&|+1pnt>B6+TIG;)+1X?4!^-vY+oMPs}Sx=($XI~-VcK%nURpkJW-YOH{Sjs>F6
zH!p@Q2qYl}_}c6*ZvL;m{RrF!;3t6x?q34tCKZS#3uN(`q3>g-v9dhfpXKtAk$SST
zk1RG><3mA#)X!<5sV^=YanATu<20=@OnKj#)$0W18jEG>iDV8A{}myN><W!#=}7kB
z#ozOvw`CxkLi}i!;<`PNwP;>G0-nt(GSf`VSO;!~@&TPG%aSrvY;#PE!mNFSTdME@
zKDYW(3%w^{?3N3&9J-_y;mQ5dwgvo^&!fbknkSih@jrI$T@v;2f7uNwZh19qaC#QA
zUf-W;uKzq)PZl*EL7A2sr^qyYfa+<<Ccx=-^bQ&nx{SI!bj;*VFGY${vc)tOalJ-y
zzK+H5rp@&Kg0$fWkINwGzDn+U$e!QKV?KpPBky7HZctl`qc^CRk44RMCLnEYtI5!B
zW8mGdL?+uC5`nIyiJkjH4U@u06}AU_*DbJb<AoA}K1B~oHVN-$mjpvHm-NBsCZA=@
z7W7`tr`C4XVxQ(P3C~`U9iFYPnG8<eUnZm9;>0T7I8VhPPK=0i!DBMycv<6Em&{r0
zCMz3r@1n=x9}iij7!7?$F`F^fR4b90vnUJIv+%G_&SwAb4)A+-QMCh7Pf(?ymS_9p
z7w&RZlji&G&6tBnM7#Y@mlB9w{`GrR9CgMiX%z~X7VAEFD+NSFDfxK3k1tauoXz9q
znf5<l5SHTKjG^G{AQ=UBTv*A0yi-;jCqryOp&z#Fldx(uRa|O8QFZ8fHC8Fgf9bnm
z-I|K%wub~Z92iv>(hU%I7dut_H`*=%AD{>CV=oZh7fB8`K{ulBD@xb{22eO4^sZ0=
z@{ks=e=c-JK<WWw?GjZ`1j9f$+B8Rc)~C^Fp?+<BYFwL0K6~aW03-$6TPR{w*QDDb
z0v(gf5x;&3_!%`mU@FrnjvpMBngT*>X&<}v&U%(fwov5qU=F<@qbJ9>%c&v!AnSb_
zI8U@e(Tx0}$?M7MhQ@`Z$)9Mn&Jx($rrQ>|_7g0Qu=jMVO?~{tMXQ(6qcjf7LMxxZ
z&vdGU(}P1IbbkdfczMKey<RF%GO=xwj;npF7i;pZ8FQ6=67Tg(Tn4B6FKA)n9h;j8
zB4;uG`V+5f+Cx6h_1{L6D$EqU6_sw)klYtw2&rti1z(PhE+e$^Ug)!jN?L0ElwV>~
z#;A`FZ$o`KtblxbL!5h`+ejLv{+I5UJn9P+$AwZnaqMx-z3hcFag#-{f2A|tNBD`>
zVG&h$7H{J}9=uK3jVWdbN`2i3E_iW6U*y*M9i*;07|frh{ULpSobO8rGL`|KuO>8B
z*V!EYEleuCVog+ntjFvwf?3!bV3+rQjxhCK!wVmAuke$C9g+DzesD^dJ4f4mU0@!~
z)Gg1Ex{L}5xK6>#7jMW4S>fFk71n$!9l5u$#C`Xdq6l1d_SlQFZmS=)8|In=d-heo
zZtIbB6^hZhY)5Z;t8OHHak<;XPq9MvH8jhLa3@)`$kh|;YJUMG=8E`dn7Y3>>8kOx
z<B$p=OHUe?;X;Gh;u|zkL6@Q#Qt^{c<O)06iVP8%wbRPaHK9{|^>W)OaV7jDy+j=^
zS&gX%#V(;o9WG}gI1lHrP43x({F`3pQLd@K+V;<w$FjyB0E8{yfk6nmu?X)SDNsE5
z7MbGrr{}Sl%Q%9LozpmxMu%o~((9kuT4HT6)3v2`ui&vdHmIE$Q%vLR`61d&$I$&q
z$tt9Je5FO9>yFW}73HYLx1Pv%6=8sk@biMx?r~JPbxC@fAj_dr&&{Wo#I3BGvz+oF
z!$v4!vyKwyb$Qs7HDjUhksTX!4bp;?{&YwRf*7M32wFx)#UknXE-^1mAjk%~mz8!6
zs3z~%89^ty__GE~&t5*(O=!rcAvimq`BPP8M(99@?jux-VRGyk)3erR4-iw0tFiGm
zHV>2j+a)9xP)6uGfaykcp?<spHpl@{8v&Pq+ZfQUKn)<eIAG2JXBRE}LMmKnGO8E5
z<fwk^pug?~vIZ_dPwuEXty|%1NgHqf02Ik6@A6!i8gYY(^XlHWX)$UL&vY8Tep-BP
z{W$DMZVO_J*V5G@N<pDt8>bHkI{E8NCCz|L-VE><TR=cb1M;UevPub)Ob|z*bKi9s
zk!Gs=f1%yUc>n(AS2ByN?|yqzbC72JK!FIGAERL;!9LEeC5axys7Xio5P>AIN?GQx
zK><Z8t3%@OV)@B*&KJlMZpG$V&H(!RR9zS|k1$LsZc~#MypFl-xXuABNcIkZ+7~jD
zihaMP2Gk26Sh&fku2F~djE3d1iH`nqYpa}!?-QmJl9_CmOp)LAkg}vuG!fPoMUv+c
zH(lyfkj2pHRgEMvejPuF(GGFd$tzUy$zd;+gm=_WpLBLDu*vKbz{Oa`Jq=;g0L%dv
z?}+iLQh4}Wo&QfA^e~Ck?!|G48yxG!8b#L05HZE8*thK<dD098r$--|6(F4dqi8LG
zE=s9o-Zr_0KO5I|YovE)54;4pyzng?912QCdZVO<<YQP-UC8&75VXVK#6$`z3!?{1
z_0nI~YgSz+6K)s;h^a_gRM$0=UZA>FB<qKBi$-+!On6!XUTceMD3<*8X>0fqz<E5;
zA{_FwYiwxH;GY$wJD+8eFJ<fS$XT!r_8IEeP8XPZUZo!b8zY!9#ATVl#ZhAgNMfZ;
zlPp3iq2fz%5s`fZ6NkckZ*9OILp)6v1of&4bVtZEXKH68=6oeY{Gdc2)JR|IhF60X
zHp_Gb#=hVs?wjPN?bGB!9|<tUq@<D|4FWN~?v`~3V>~TH``%01!;pz-TcD>Ch)sex
z*E75FhI|)R$Qclrzsa!NsZxuhRFLb;5$@`49?BBKy=aHsgb^QBSPn`%X#rjSD*R>f
zJVOMrgn2mAOY6su`oTj|Dqj9@kj%G)LYRsMxpmbl3Q`r)^Xbh4f+jya{7rZ`Fs%P;
z)DrhqL5$ZN?*H%l3h*gG^$$H4+kX?`fB(IZNkAATni~jB(no_Hi19E1W(e3GFj%6+
z?yrl$q!{zrFaV)k*90a6=6m-byf=xewCnHpAO|Vdx1XeFZ&DTB2bBVr3Dp%4lOPDp
z1Y*Td(|rPDAE0zG{jV2500N1CfZ1^&|Dr+nSwVmyK^K1ULiQkcfF%vQ2H-yo4+m^W
z;GX|~zET0vAz-Eh21vw(kOi4s9R6$e!0|G$m(>5YE2{r@cJXQO;LSy!7wyt}d*FB>
znyDN>a^EiuQ;AR1)E9fv0Ok?!j{nyiHJ}PIm%C}sd<7o3=oly<|Nk~o0*cT6XM@>4
zNCLhHNSOGq0a+6u8bE&xkEUY11iD{pa^-$0@Rfk^1OgT!V6pkHS5@~^$?s0#vGM9=
zJ*U?{T!QY>wmuD~z6|1Ka*CuXg~oy6?e3R;r7;A~pwCS~R9M=o@H@caJyki>5yTWi
zRSu#tW!eORu#4<XAXXZ6>}QAjvNR#o60{e%8WlCry-%Z{ONQ$V|2r84QRN$e3i1tD
zY1BS}m}tYlLN{sSt}$sEI9|HK17d#g{wvLUhi9rHs`gYjwLmxMJM1rMu*O~3rVh%g
N_V+s+F8@36{{W-fJLmua

literal 0
HcmV?d00001

diff --git a/public/opac/js/butterfly/close-black.png b/public/opac/js/butterfly/close-black.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ac5532fc1a9047f7b0b9d36dcec38850171da81
GIT binary patch
literal 1186
zcmV;T1YP@yP)<h;3K|Lk000e1NJLTq000^Q000^Y1^@s6sY*=F00004b3#c}2nYxW
zd<bNS00009a7bBm000XT000XT0n*)m`~Uy|A9O`nbW?9;ba!ELWdKcKV{&h8Wn^h#
zAVz6&Wp{6KYjYqtwP@0K0000MbVXQnLvm$dbZKvHAXI5>WdJZUFEKMOFgKor?f?J)
z1NTWpK~zYIm6p#-V^<W%zt10&+DxfhnX!tHX(qKb5VY77wFMWV=~fX05pm;Ax4LoX
z#%vUXxQL6a`~&Qi*j7-ft+t_Ph=s935fhp)jL{|&&2PV5<lgk=^`*mHIK1~R@7&M(
zo^$SbS0f3d;q`i9v)N#^TG7$bQSp+dX(j*!Py|3$TSOfsD{OUj6~SPz<gJWYEXIqA
zi+lY%fOi1Y1E>L@>DQB1@vyP6ft#Bfl4LHIqsQa<VPs_FcazCP)tpXeY<YRvpH8PG
z?0o<Y0P3p2$~PX52Zcg`B<c72pIfcgj2@u3uCA`+@$qq7QTHBz2S(~Z5^lE}*Vor1
z$<58p{Wk&hwy?19Oo25SsRPM!PW*oV^S6aabGzM#0`vqxi-6UXLF?=5AjwoJMT^Cf
zQ=NNzdtVI<4E&{Ew7tEZlarIjjg5`vIkVZ!NF+i9)-1xPkp%Yl_d$|tYir-Ci#Z&Q
zzhyY)=jXqX^ER6;9f?G8B)PJ(a-jN5O-=nIKwSXZ0GOpJgu`KwWPgAErRrq0TC;a|
zcT`~8ot>Sx5<-%Ti;EQ>*V@`jSx^9;s;WSeiA2IM?k<<>T!kf*$@0C==Q}m>2?PR3
z0kW&AK$7R@=T%GD<#L^8GMS1^S`A_{nYgvJ^+JF?1Mm@mMga9S0FcdQ3)MPDI2>+E
zrBW4hCnqPD)!r`@3isl+R&<Qoa_FwEuBvUw*U@OSD3!?g%bXec92^|H5{jGvJ{6^I
zLL!kMNm?wHyz0=>(n1yD^Z8DPhlgLNIh&rI{t>0-TDEvRP6hNy8FX}X^pYfJXJ@}t
zL4AFFF?~(|aA;`gPYLsSy}zoE!NI{xlHA$ZiT+0sfCnTQjYg?%K(Q}=o|%~`?-jXV
zPft&LZf@>bTU%R&n(giFuu$_AfX@MZ4B!J%;;0J-gRe<)X=&;E|7$b)FsU{^KK`4i
z;5>i<UDeeArA}*>VVanj_~mUuPN(x_Hk*~X`BH?<4&Xxo?+OMqA+5=%<-7?rHa2!5
zb0#2t0J?>mCMcajs%il6NWwy)P<nK9^i<88KJj~dd*upLAUyzV03Jc<;2KG2nx=`3
zWdiW<?Ck8qZnrl8KqiwxC=^N@9v=RY&*zIyr}K%!;dtEK+zbE+27|ZV-Q8aUC;-R;
zNC8NSYX(4(RR4gb5Y_>B2;eb*r-4A=hE>My?ruy}*8qSoM7V4KTE!X_KR%7h0Y<0H
zEF2odbFKIo{fVb2l%$1<Tk%|^vUmkZ2dhWvgwue3Pdb_oaxX%b5ugl!ydGi*QeZNa
z^-!B*<&bB)oB$S3<(y{-G5|`55$Il+AwZ6Q03v(u>C44mK>z>%07*qoM6N<$g6#()
Aa{vGU

literal 0
HcmV?d00001

diff --git a/public/opac/js/butterfly/close.png b/public/opac/js/butterfly/close.png
new file mode 100644
index 0000000000000000000000000000000000000000..a758a3d79b130e5008c5aedc5e2bdc773ced2283
GIT binary patch
literal 801
zcmV++1K#|JP)<h;3K|Lk000e1NJLTq001Na001Ni0{{R3*4}8U0002|P)t-s|Ns90
z00000000006%`c+2L}KE07^<qLqkJ3IXN>kGbku1T3T9CQc_AvN_>2Lb8~ZRYinj^
zW|^6pg@uKDe0-&)rJ0$TwzjsctgNM_rNza?y}iA*wzk&R*38Vz#l^+n-{02O*6!}^
z=H}**Iwzh$E2Kg!vP(0)PBp?#G{aOoy;VKRR5`+8OwM6Qy>DI8Zdbi{Y1MaPzJhhw
zfo<A|cFmB2)Q^DJkAK{ce#@4M-j#&mqLk07qSvaR-l?9=wXf&1r`No;-MqEe#K7yr
zy4=gh=F7$J%EI8*)aBLE^3~7q-`nx#<M-y``tIxe_xAVq_y7O@411eM0000bbW%=J
z01+ZHL_|bYRaI40W@cu0cXxM)h=`e)s;a8HySvQH%-!AY?#bPM=l}o#uSrBfRA}Cv
z)Mr=1Fcb!0Yo$&E_d<cv)D}fV1Q)mmA`bfg|Nr7m+9Yj7JjeT?ISmh4y*CpR{|SS~
zpFqa%WKzax77EieEsGweU?Yv0$!*#W?7gk!QB07j-7;j@E5wpYm^BBuJMlf{`=@=N
zIKx%S6o`0C#!(+mHlYZa>j;inEZl1Zi!sGb9ynylxI#HYtJlb~ags93eLz7C6;Af#
zQh)W*4MD3$4=(^;mO?fTsCWMh9idtn@;#hkR}Mucix)9K1L(Tkpv_->lr4=maK^Nf
zhOsxyM)Mi`jOt9OS7q1@avBv;V_GT0&asg|ZWL`o9r<z*M<vv?x!0<TRgJdMQl{-T
zl<KL2BD91@(aHBkja2)ns3V}SQijhv2f}dm=~2@}$<&C>;FkaBHKWBe#D6}Jm!E~t
zH}B~Espz1nb0z%3AAZU-5KPAtiV|}N@70894#obBcxGB944ayGUBt3UD@yYBmM2K9
zGejjPsw!PB`64f--t&MrJ9B9hDKlRPD{pTr`=ji12~(A47iO*B>RjCy0*ofHn`hGa
f<Bl4CIgO2P7x!(&C1k8K00000NkvXXu0mjf+m4Ec

literal 0
HcmV?d00001

diff --git a/public/opac/js/butterfly/external.html b/public/opac/js/butterfly/external.html
new file mode 100644
index 00000000000..c965a231f70
--- /dev/null
+++ b/public/opac/js/butterfly/external.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>Test content</title>
+</head>
+
+<body>
+
+<p>A page with test content.</p>
+
+<div id="external-fragment">
+  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. <a href="#">Aliquam  hendrerit lacinia justo,</a> eu ornare eros convallis sed. Nam lacus urna,  auctor quis fringilla in, malesuada sit amet lacus. Aliquam erat  volutpat. Vivamus turpis sapien, luctus sit amet rutrum vitae, dapibus  sed ipsum. Ut interdum suscipit pretium. Etiam semper aliquam sapien  nec porttitor. Nunc quis lacinia augue. Fusce eros neque, vulputate ut  dignissim quis, fringilla fermentum velit. Nulla lacinia sollicitudin  faucibus. In id nibh justo. Quisque hendrerit, nulla at placerat  accumsan, magna augue placerat sem, eget tempus dui ipsum eu tellus.  Phasellus interdum semper sapien, sit amet tristique metus porta ac.  Integer vestibulum, dolor eu rhoncus porta, augue risus condimentum  tortor, sed rhoncus ante dui sit amet lorem. Sed pellentesque nulla et  erat sollicitudin at scelerisque lectus faucibus. Nulla quis dapibus  turpis. Sed id velit sapien, at pulvinar nibh. In tincidunt laoreet  urna vel molestie.</p>
+    <p>Praesent mauris nisl, vulputate id ultricies non, semper quis nisl.  Integer enim neque, egestas eget consequat ut, facilisis non lectus.  Nam molestie vulputate tincidunt. Sed at dui dui, nec lacinia mi.  Praesent posuere leo eget nibh fermentum a eleifend tortor aliquet. Sed  ac urna mauris, eu cursus elit. Nunc quis felis et justo aliquet  pretium. Ut massa quam, interdum vitae rutrum vitae, auctor non ligula.  Ut facilisis faucibus lorem, vitae rhoncus felis posuere ac. Vivamus  vitae tellus eget tellus tincidunt scelerisque vel at tortor. Donec non  ullamcorper nulla. Mauris pulvinar interdum felis eget egestas. Donec  ac nunc velit, at eleifend sem. Duis mollis tempus vehicula. Etiam id  mauris nunc. Vivamus sollicitudin sem ullamcorper leo commodo non  pellentesque est fermentum. Maecenas adipiscing dui vel odio vulputate  lacinia. Vestibulum sed mattis sapien. Aenean odio justo, ultrices eu  dignissim laoreet, mattis id lacus. Vestibulum sed felis nulla, ac  molestie nisl.</p>
+    <p>Nulla rhoncus mi eget nisi aliquam id porta metus consectetur. Nulla  tempor magna ut odio tincidunt sollicitudin. Quisque ac venenatis  felis. Donec blandit nisl id turpis rhoncus molestie. Pellentesque  consequat dapibus lobortis. Pellentesque ut arcu metus. Morbi vel dui  quis augue convallis placerat non at sem. Morbi quis sem ut felis  hendrerit mattis. Proin non ante in sapien accumsan adipiscing id sit  amet nulla. Nunc accumsan fringilla diam, quis molestie nibh bibendum  ac. Aenean libero libero, placerat quis laoreet in, lobortis ac risus.  Nam lorem sapien, laoreet nec vehicula sit amet, placerat malesuada  sapien. Mauris mattis placerat quam, sit amet blandit nulla viverra et.  Proin condimentum egestas est in mattis.</p>
+    
+    <p>Nam ultrices pulvinar quam ac aliquam. Praesent vel ultricies massa.  Donec varius mi non tortor sodales quis ullamcorper odio volutpat.  Morbi dapibus eros et justo convallis eget dictum elit fringilla.  Suspendisse volutpat auctor pulvinar. Donec mattis feugiat mi eu  suscipit. Sed sed nisl enim. Sed eu urna eu risus eleifend pellentesque  eu sit amet odio. Vivamus sodales felis ac diam pellentesque ut  tincidunt sem tincidunt. Maecenas magna dolor, tincidunt vitae luctus  quis, tincidunt a justo. Mauris eros leo, varius vel vestibulum quis,  interdum feugiat nulla. </p>
+    <p>Quisque ut nisl mattis metus dictum viverra. Aliquam enim ante,  lobortis eget varius sed, tincidunt sagittis justo. In fermentum  ullamcorper eros at mollis. Donec semper feugiat justo et varius. Ut  ultrices, massa sit amet pellentesque malesuada, velit eros dictum  justo, vitae pellentesque mauris dui ac nunc. Suspendisse posuere  eleifend orci, ac dictum risus venenatis ac. Cras ut justo ac tortor  egestas condimentum. Suspendisse quis mi nec nunc convallis laoreet ut  vitae lorem. Fusce nisi odio, dapibus quis auctor quis, facilisis  accumsan sem. Vestibulum sem ante, condimentum ut pellentesque porta,  lacinia id mauris. Etiam dapibus nisi sit amet nisl euismod facilisis.  In quis lacus eget lectus venenatis tincidunt vitae sit amet nibh. Nunc  fermentum tellus mollis magna rhoncus pellentesque. Praesent  scelerisque odio a diam ultricies sed bibendum leo adipiscing. Class  aptent taciti sociosqu ad litora torquent per conubia nostra, per  inceptos himenaeos. Ut aliquet, libero eget vestibulum 	posuere, est  ante aliquet urna, ac rhoncus ligula arcu et leo. Cras fermentum  gravida auctor. Morbi ac elit eget velit <a href="#">malesuada blandit</a>. In  tincidunt nisi sed ligula viverra malesuada. Sed eleifend luctus arcu  in tincidunt. </p>
+
+      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam  hendrerit lacinia justo, eu ornare eros convallis sed. Nam lacus urna,  auctor quis fringilla in, malesuada sit amet lacus. Aliquam erat  volutpat. Vivamus turpis sapien, luctus sit amet rutrum vitae, dapibus  sed ipsum. Ut interdum suscipit pretium. Etiam semper aliquam sapien  nec porttitor. Nunc quis lacinia augue. Fusce eros neque, vulputate ut  dignissim quis, fringilla fermentum velit. Nulla lacinia sollicitudin  faucibus. In id nibh justo. Quisque hendrerit, nulla at placerat  accumsan, magna augue placerat sem, eget tempus dui ipsum eu tellus.  Phasellus interdum semper sapien, sit amet tristique metus porta ac.  Integer vestibulum, dolor eu rhoncus porta, augue risus condimentum  tortor, sed rhoncus ante dui sit amet lorem. Sed pellentesque nulla et  erat sollicitudin at scelerisque lectus faucibus. Nulla quis dapibus  turpis. Sed id velit sapien, at pulvinar nibh. In tincidunt laoreet  urna vel molestie.</p>
+    <p>Praesent mauris nisl, vulputate id ultricies non, semper quis nisl.  Integer enim neque, egestas eget consequat ut, facilisis non lectus.  Nam molestie vulputate tincidunt. Sed at dui dui, nec lacinia mi.  Praesent posuere leo eget nibh fermentum a eleifend tortor aliquet. Sed  ac urna mauris, eu cursus elit. Nunc quis felis et justo aliquet  pretium. Ut massa quam, interdum vitae rutrum vitae, auctor non ligula.  Ut facilisis faucibus lorem, vitae rhoncus felis posuere ac. Vivamus  vitae tellus eget tellus tincidunt scelerisque vel at tortor. Donec non  ullamcorper nulla. Mauris pulvinar interdum felis eget egestas. Donec  ac nunc velit, at eleifend sem. Duis mollis tempus vehicula. Etiam id  mauris nunc. Vivamus sollicitudin sem ullamcorper leo commodo non  pellentesque est fermentum. Maecenas adipiscing dui vel odio vulputate  lacinia. Vestibulum sed mattis sapien. Aenean odio justo, ultrices eu  dignissim laoreet, mattis id lacus. Vestibulum sed felis nulla, ac  molestie nisl.</p>
+    <p>Nulla rhoncus mi eget nisi aliquam id porta metus consectetur. Nulla  tempor magna ut odio tincidunt sollicitudin. Quisque ac venenatis  felis. Donec blandit nisl id turpis rhoncus molestie. Pellentesque  consequat dapibus lobortis. Pellentesque ut arcu metus. Morbi vel dui  quis augue convallis placerat non at sem. Morbi quis sem ut felis  hendrerit mattis. Proin non ante in sapien accumsan adipiscing id sit  amet nulla. Nunc accumsan fringilla diam, quis molestie nibh bibendum  ac. Aenean libero libero, placerat quis laoreet in, lobortis ac risus.  Nam lorem sapien, laoreet nec vehicula sit amet, placerat malesuada  sapien. Mauris mattis placerat quam, sit amet blandit nulla viverra et.  Proin condimentum egestas est in mattis.</p>
+</div>
+
+<div id="another-fragment">
+
+    <p>Praesent mauris nisl, <a href="#">vulputate id ultricies non</a>, semper quis nisl.  Integer enim neque, egestas eget consequat ut, facilisis non lectus.  Nam molestie vulputate tincidunt. Sed at dui dui, nec lacinia mi.  Praesent posuere leo eget nibh fermentum a eleifend tortor aliquet. Sed  ac urna mauris, eu cursus elit. Nunc quis felis et justo aliquet  pretium. Ut massa quam, interdum vitae rutrum vitae, auctor non ligula.  Ut facilisis faucibus lorem, vitae rhoncus felis posuere ac. Vivamus  vitae tellus eget tellus tincidunt scelerisque vel at tortor. Donec non  ullamcorper nulla. Mauris pulvinar interdum felis eget egestas. Donec  ac nunc velit, at eleifend sem. Duis mollis tempus vehicula. Etiam id  mauris nunc. Vivamus sollicitudin sem ullamcorper leo commodo non  pellentesque est fermentum. Maecenas adipiscing dui vel odio vulputate  lacinia. Vestibulum sed mattis sapien. Aenean odio justo, ultrices eu  dignissim laoreet, mattis id lacus. Vestibulum sed felis nulla, ac  molestie nisl.</p>
+    <p>Nulla rhoncus mi eget nisi aliquam id porta metus consectetur. Nulla  tempor magna ut odio tincidunt sollicitudin. Quisque ac venenatis  felis. Donec blandit nisl id turpis rhoncus molestie. Pellentesque  consequat dapibus lobortis. Pellentesque ut arcu metus. Morbi vel dui  quis augue convallis placerat non at sem. Morbi quis sem ut felis  hendrerit mattis. Proin non ante in sapien accumsan adipiscing id sit  amet nulla. Nunc accumsan fringilla diam, quis molestie nibh bibendum  ac. Aenean libero libero, placerat quis laoreet in, lobortis ac risus.  Nam lorem sapien, laoreet nec vehicula sit amet, placerat malesuada  sapien. Mauris mattis placerat quam, sit amet blandit nulla viverra et.  Proin condimentum egestas est in mattis.</p>
+
+</div>
+
+
+</body>
+</html>
diff --git a/public/opac/js/butterfly/gallery-controls-sprite.png b/public/opac/js/butterfly/gallery-controls-sprite.png
new file mode 100644
index 0000000000000000000000000000000000000000..9eb249870c4926a8ff2179d0d00711f54debef30
GIT binary patch
literal 2608
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
SECNIT0000<MNUMnLSTX_Hjb|V

literal 0
HcmV?d00001

diff --git a/public/opac/js/butterfly/gallery-controls-sprite.psd b/public/opac/js/butterfly/gallery-controls-sprite.psd
new file mode 100644
index 0000000000000000000000000000000000000000..5f1f9b3bc203a2e746fdf311a2557df3c12f9919
GIT binary patch
literal 84985
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
E0iA?{1^@s6

literal 0
HcmV?d00001

diff --git a/public/opac/js/butterfly/index.html b/public/opac/js/butterfly/index.html
new file mode 100644
index 00000000000..8b46b90c300
--- /dev/null
+++ b/public/opac/js/butterfly/index.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>Butterfly lightbox test page</title>
+<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.js"></script>
+<script type='text/javascript' src='jquery.resize-events.js'></script>
+<script type='text/javascript' src='jquery.history.js'></script>
+<script type='text/javascript' src='jquery.pxToEm.js'></script>
+<script type='text/javascript' src='jquery.butterfly.js'></script>
+<script type="text/javascript">
+$(function(){
+	/* Enhance all image links, and internal (relative) links only */
+	//$('a:not([href^="http://"]), a[href$=".jpg"], a[href$=".jpeg"], a[href$=".png"], a[href$=".gif"]').butterfly(options={
+	$('#examples a').not('.image').butterfly(options={
+		contentDefaultWidth: '50em', // for content
+		contentDefaultHeight: '100%', // for content
+		mediaMaxWidth: '100%', // for images
+		mediaMaxHeight: '100%', // for images
+		lightBoxMargin: '2em', // margin around screen (can be em, % or px)
+		animateResize: true,
+		//animationSpeed: 250, // in ms
+		//preloadNextGalleryImage: false,
+		//reuseFragment: true,
+		//closeButton: true,
+		//closeButtonImage: 'close.png',
+		//galleryMode: 'all',
+		//galleryLoops: true,
+		galleryContainers: '.gallery-test', // can specify more than one, i.e.  '#gallery-container, .gallery-test'
+		preloadLoadingImage: 'loading-black-on-white.gif',
+		preloadGalleryControlsSprite: 'gallery-controls-sprite.png'
+	});
+	
+	options.treatAsImage = true;
+	$('#examples a.image').butterfly(options);
+});
+</script>
+<link type="text/css" rel="stylesheet" href="butterfly.css" />
+<!--[if lt IE 9]>
+	<link type="text/css" rel="stylesheet" href="butterfly-ie.css" />
+<![endif]-->
+<style type="text/css">
+	/*
+		Styles for this page
+	*/
+	body {
+		font-family: Helvetica, Arial, sans-serif;
+		background: #efefef;
+		color: #000;
+	}
+	#page-container {
+		width: 48em;
+		padding: 1em;
+		margin: 1em auto;
+		background: #fff;
+	}
+	
+	.butterfly-gallery-demo {
+		overflow: hidden;
+		clear: both;
+	}
+	.butterfly-gallery-demo ul {
+		overflow: hidden;
+		clear: both;
+		background: #000;
+		float: left;
+		padding: 0 1em;
+	}
+	.butterfly-gallery-demo li {
+		list-style-type: none;
+		float: left;
+		margin: 1em;
+		padding: 0;
+	}
+	.butterfly-gallery-demo li a {
+		display: block;
+		float: left;
+	}
+	.butterfly-gallery-demo li a:hover,
+	.butterfly-gallery-demo li a:focus {
+		outline: 2px solid #fff;
+	}
+
+</style>
+</head>
+
+<body>
+
+<div id="page-container">
+    
+    <h1>Butterfly lightbox test page</h1>
+    <p>This page demonstrates <a href="http://irama.org/web/dhtml/butterfly/"><em>Butterfly</em>, a robust, flexible and fully accessible lightbox solution</a>.</p>
+    
+    <p>Note: This lightbox effect will not work in IE6, but the fallback (linked content) is still accessible and usable to visitors using IE6.</p>
+    <p>Butterfly has been tested and works in Internet Explorer 7&ndash;9, Safari 5, Chrome 11, Opera 11 and Firefox 3&ndash;4.</p>
+    
+    <div id="examples">
+        <p>Butterfly can link to any content, for example:</p>
+        <ul class="gallery-test">
+            <li><a href="butterfly.jpg" rel="gallery" title="The Cairns Birdwing butterfly">An image (with a caption)</a></li>
+            <li><a href="#same-page-fragment" rel="gallery">A fragment of content from the same page</a></li>
+            <li><a href="external.html" rel="gallery">Another page of content (using Ajax)</a></li>
+            <li><a href="external.html#external-fragment" rel="gallery">A fragment from within the external content page</a></li>
+            <li><a href="http://en.wikipedia.org/wiki/Cairns_Birdwing" rel="gallery">External domain, via iframe</a></li>
+        </ul>
+        
+        <p>Test also:</p>
+        <ul>
+            <li>An image with thumbnail (at right) <a href="http://irama.org/assets/images/dhtml/butterfly/butterfly-1.jpg" style="float: right;"><img src="http://irama.org/assets/images/dhtml/butterfly/butterfly-1-preview.jpg" alt="test image" /></a></li>
+            <li><a href="external.html#another-fragment">Another fragment from the external content page</a></li>
+            <li>Try resizing the window and making it quite narrow or short (or change the text size)!</li>
+            <li><a class="image" href="http://chart.apis.google.com/chart?cht=qr&chs=500x500&chl=http://irama.org/web/dhtml/butterfly/">Link to an image without an image file extension (option set to treat as imnage anyway).</a></li>
+        </ul>
+       
+        <div class="section" id="gallery">
+            <h2>Gallery</h2>
+            <p>A gallery can be created using a container element or by specifying links with the same <code>rel</code> attribute.</p>
+            <div class="butterfly-gallery-demo">
+            <ul>
+                <li><a href="http://irama.org/assets/images/dhtml/butterfly/butterfly-1.jpg" rel="butterflies"><img src="http://irama.org/assets/images/dhtml/butterfly/butterfly-1-preview.jpg" alt="Cairns Birdwing" /></a></li>
+                <li><a href="http://irama.org/assets/images/dhtml/butterfly/butterfly-2.jpg" rel="butterflies"><img src="http://irama.org/assets/images/dhtml/butterfly/butterfly-2-preview.jpg" alt="Orange butterfly" /></a></li>
+                <li><a href="http://irama.org/assets/images/dhtml/butterfly/butterfly-3.jpg" rel="butterflies"><img src="http://irama.org/assets/images/dhtml/butterfly/butterfly-3-preview.jpg" alt="Blue butterfly" /></a></li>
+                <li><a href="http://irama.org/assets/images/dhtml/butterfly/butterfly-4.jpg" rel="butterflies"><img src="http://irama.org/assets/images/dhtml/butterfly/butterfly-4-preview.jpg" alt="Green butterfly" /></a></li>
+            </ul>
+            </div>
+        </div>
+        
+        <div class="section" id="same-page-fragment">
+            <h2>A fragment of this page</h2>
+            The <a href="butterfly.jpg">Cairns Birdwing</a> (<em>Ornithoptera euphorion</em>) is Australia's  largest endemic butterfly species, with females reaching a wingspan of  up to 16 cm. Males are usually a few centimeters smaller. A closely  allied species, the New Guinea or Priam's Birdwing (<em>Ornithoptera priamus</em>)  reaches 19 cm and is the largest butterfly species found in Australia,  but it is not endemic. Cairns Birdwings are found southwards from Mount  Webb and Cooktown to Mackay in Queensland. Its favoured habitat is  primary rainforest, although the species will breed readily in a home  garden if the correct larval host plants are grown. (via <a href="http://en.wikipedia.org/wiki/Cairns_Birdwing">Wikipedia</a>)</div>
+            
+            <div class="section" id="error-handling">
+                <h2>Error handling</h2>
+                <p>These links are all broken:</p>
+                <ul>
+                    <li><a href="butterfly-error.jpg">A broken image</a></li>
+                    <li><a href="#fragment-error">A non-existent fragment</a></li>
+                    <li><a href="external-error.html">A non-page</a></li>
+                    <li><a href="external.html#fragment-error">A non-existent fragment from within a real external content page</a></li>
+                </ul>
+            </div>
+        </div>
+    </div>
+</body>
+</html>
diff --git a/public/opac/js/butterfly/jquery.butterfly.js b/public/opac/js/butterfly/jquery.butterfly.js
new file mode 100644
index 00000000000..191e5cdcce8
--- /dev/null
+++ b/public/opac/js/butterfly/jquery.butterfly.js
@@ -0,0 +1,1472 @@
+/*
+ * "Float like a butterfly"
+ *              Muhammad Ali (a not-so-lightboxer).
+ * 
+ * jquery.butterfly is a fairly light-weight and fully accessible lightbox implementation for jQuery.
+ * 
+ * jquery.butterfly.js
+ * @version 0.13
+ * Changelog:
+ *   *  0.1 Initial implementation.
+ *   *  0.2: Support for window resizing added.
+ *   *  0.3: Support added for callback functions (open/close/resize pre and post events). Error handling added for when lightbox target resource doesn't exist.
+ *   *  0.4: Accessibility features added (controlling focus for user initiated lightboxes, keyboard support) - as per: http://irama.org/web/dhtml/lightbox/#accessibility
+ *   *  0.5: Bug fixes for webkit. Blocked IE6 (no LB for them). Basic caption support (thanks to Ray Latchmanan). Gallery support.
+ *   *  0.6: ARIA style keyboard support for navigating through galleries. Keyboard access now trapped in lightbox while lightbox is open. Support for preloading next image in galleries.
+ *   *  0.7: Captions can be configured to come from link title attribute, link text (including any img alt text within), or not be displayed at all.
+ *   *  0.8: Added ability to load pages in an iFrame (kicks in automatically for external-domain URLs).
+ *   *  0.9: Support restored for IE6 (all thanks to the perseverance of github.com/bboyle - he has more patience than I). Added support for back button (through jquery.history.js)
+ *   *  0.10: Set default close icon; fixing issues reported by jslint; minor jquery optimisations
+ *   *  0.11: Fix for jQuery 1.8 compatibility issue
+ *   *  0.12: Fix for captions extending outside lightbox (thanks to Roger Kowallis)
+ *   *  0.13: Added option to treat links as image links (overriding automatic type detection). Handy for image URLs that don't have an image file extension (like Google Charts API URLs)
+ *
+ * @author Andrew Ramsden <http://irama.org/>
+ * @see http://irama.org/web/dhtml/butterfly/
+ * @license GNU GENERAL PUBLIC LICENSE (GPL) <http://www.gnu.org/licenses/gpl.html>
+ * 
+ * @requires jQuery (tested with 1.8.3) <http://jquery.com/>
+ * @requires jQuery jARIA plugin <http://outstandingelephant.com/jaria/>
+ * 
+ * @optional (but reccommended) jQuery ResizeEvents plugin <http://irama.org/web/dhtml/resize-events/>
+ * @optional (but reccommended) jQuery Got Style? plugin <http://irama.org/web/dhtml/got-style/>
+ * @optional (but reccommended) jQuery ARIA keyboard navigation plugin <http://irama.org/web/dhtml/aria/key-nav/>
+ *
+ */
+jQuery.butterfly = {};
+
+jQuery.butterfly.defaultOptions = {
+	contentDefaultWidth: null, // For content (can be em, % or px) - null default means 50em if pxToEm is available or 700px otherwise (a good line length for legibility)
+	contentDefaultHeight: '100%', // For content (can be em, % or px)
+	mediaMaxWidth: '100%', // For images (can be em, % or px)
+	mediaMaxHeight: '100%', // For images (can be em, % or px)
+	treatAsMedia: false, // Set to true for content to be resized as if it's media (good for video content)
+	lightBoxMargin: null, // Margin around screen (can be em, % or px) - null default === 2em if pxToEm is available or 20px otherwise
+	animateResize: true,
+	animationSpeed: 150,
+	useIframe: 'autodetect', // load contents in an iframe (good for cross-domain URLs). Options are: 'autodetect' (will load iframe for external URLs), true (will load in an iframe). false (will atempt to load with ajax).
+	collapseHeightWhenPossible: true, // When content is shorter than available height, collapse height of lightbox
+	reuseFragment: false, // When using a fragment from the same page as the link, reuse the same DOM nodes (persisting their state) or clone a new copy?
+	closeButton: true, // Should we have a close button?
+	closeButtonImage: 'close.png', // Set to the path of your close button image
+	closeButtonCorner: 'tr', // Top left 'tl' or top right 'tr' or bottom left (bl) or bottom right (br) - top left is the most intuitive option that doesn't overlap scrollabrs
+	clickOverlayCloses: true, // Will clicking the overlay layer (the dark tinted area) close the lightbox?
+	preloadLoadingImage: '', // Specify an image path here and it will be preloaded
+	preloadGalleryControlsSprite: '', // Specify an image path here and it will be preloaded
+	galleryControlWidth: 49, // width of each control (default based on sprite that ships with butterfly)
+	galleryControlHeight: 85, // height of each control (default based on sprite that ships with butterfly)
+	galleryMode: 'rel', // Allow navigation between lightboxed images? Options are: rel (all links that have the same 'rel' attribute), 'container' (all links within the one container), 'all' (all linked images), or nothing '' (don't use galleries)
+	galleryContainers: '', // CSS selectors specifying elements that contain linked images to form discrete galleries. e.g: '.gallery-pets, #gallery-flowers'
+	galleryLoops: false, // When you reach the end of the gallery, should 'next' take you back to the begining? (and vice versa)
+	captionMode: 'title', // Whether to use captions, and if so, where to grab the caption text from? Options are: 'title' (the title attribute of the link), 'text' (any text within the link, including image alt text), or nothing '' (don't display captions)
+	preloadNextGalleryImage: true, // Should the next lightbox be preloaded if it's an image?
+	zoomFromClicked: false, // Experimental
+	callbackPreOpen: null, // Six callback functions can be defined that will be called at various points in the opening, closing and resizing of lightboxes
+	callbackPreResize: null,
+	callbackPostResize: null,
+	callbackPostOpen: null,
+	callbackPreClose: null,
+	callbackPostClose: null,
+	treatAsImage: false // If set to true, will treat all links as image links (overriding automatic type detection).
+};
+
+jQuery.butterfly.conf = {
+	overlayOpacity: '.7',
+	lightboxClass: 'lightbox',
+	lightboxLinkSelector: 'a.lightbox'
+};
+
+jQuery.butterfly.linkCount = 0;
+
+/**
+ * Standard key mappings
+ */
+	DOM_VK_END    = 35;
+	DOM_VK_HOME   = 36;
+	DOM_VK_LEFT   = 37;
+	DOM_VK_UP     = 38;
+	DOM_VK_RIGHT  = 39;
+	DOM_VK_DOWN   = 40;
+	DOM_VK_ESCAPE = 27;
+
+(function( $, ResizeEvents ) {// start closure
+	'use strict';
+
+
+	// functions and vars
+	var resizeLightBox, closeLightBox, initLightBox, openLightBox, loadLightBoxContent,
+		lightBoxKeypress, overlayClicked, loadLightBoxComplete, galleryControlsClick,
+		isImage, parsePixels, findOffsetToCentre, checkForContent;
+
+	
+	// helper functions
+
+	/**
+	 * Get the keycode of an event
+	 */
+	function getKeyCode(evt) {
+		evt = evt || window.event;
+		
+		if (evt.keyCode) {
+			return evt.keyCode;
+		} else if (evt.which) {
+			return evt.which;
+		}
+		return null;
+	}
+	
+	/**
+	 * jQuery plugin that returns the text nodes within the target element, combined/concatenated with any alt text.
+	 */
+	$.fn.accessibleText = function() {
+		if (this.is('img')) {
+			return this.attr( 'alt' );
+		} else if (this.is('input')) {
+			return this.attr( 'value' );
+		} else {
+			return $.map( this.contents(), function( domElement ) {
+				if ( domElement.nodeType === 3 ) {
+					return domElement.data;
+				} else if ( domElement.nodeType === 1 ) {
+					var $element = $( domElement );
+					if ( $element.is( 'img, input' ) || $element.find( 'img[alt], input[value]' ).length > 0 ) {
+						return $element.accessibleText();
+					} else {
+						return $element.text();
+					}
+				}
+			}).join( '' );
+		}
+	};
+
+
+	// On DOMLoad
+	$(function() {
+		/*// IE6 fails, bail here.
+			if ($.browser.msie && $.browser.version < 7) {
+				return;
+			}
+		*/
+		
+		// If ResizeEvents plugin is available, listen for resize events
+		if (typeof ResizeEvents !== 'undefined') {
+			$(this).each(function(){
+				ResizeEvents.bind (
+					'x-text-resize x-window-resize', // no need to catch 'x-initial-sizes', lightbox not open initially
+					resizeLightBox
+				);
+			});
+		}
+		
+		// Create containers
+		$( document.body )
+			.append( '<div id="jb-overlay"></div><div id="jb-window"><div id="jb-window-inner"><div id="jb-window-content" style="width: auto; height: auto;" tabindex="0"></div></div></div>')
+			.bind( 'keydown', lightBoxKeypress )
+		;
+		$( '#jb-overlay' )
+			.fadeTo( 0, $.butterfly.conf.overlayOpacity, function() {
+				// hide when animation complete
+				$( this ).hide();
+			})
+		;
+		$( '#jb-window' )
+			.hide()
+			.click( overlayClicked )
+		;
+		$( '#jb-window-inner' )
+			.centre()
+		;
+		$( '#jb-window-content' )
+			.css({
+				overflow: 'hidden'
+			})
+			.hide()
+		;
+		
+		$.history.init(
+			function( hash ){
+				if( hash === '' ) {
+					closeLightBox.apply();
+				} else {
+					// restore the state from hash
+					if( /^!/.test( hash )) {
+						hash = hash.substring( 1 );
+						$( '#' + hash ).trigger( 'click', [/*storeState*/false] );
+					}
+				}
+			},
+			{ unescape: ',/' }
+		);
+	});
+
+
+	$.fn.butterfly = function( options ) {
+		
+		// IE6 fails, bail here.
+			/*if ($.browser.msie && $.browser.version < 7) {
+				return;
+			}*/
+		
+		options = typeof options !== 'undefined' ? options : {};
+
+		// Pre-load images
+		if (options.closeButtonImage) {
+			$('<img src="'+options.closeButtonImage+'" alt="" />');
+		}
+		if (options.preloadLoadingImage) {
+			$('<img src="'+options.preloadLoadingImage+'" alt="" />');
+		}
+		if (options.preloadGalleryControlsSprite) {
+			$('<img src="'+options.preloadGalleryControlsSprite+'" alt="" />');
+		}
+
+		// Initialise lightbox links for each match
+		return this.each(function () {
+			initLightBox.apply(this, [options]);
+		});
+	};
+
+
+	initLightBox = function( options ) {
+		var pxToEmExists = (typeof Number.prototype.pxToEm !== 'undefined') ? true : false;
+		
+		// Merge runtime options with defaults
+		// Note: The first argument sent to extend is an empty object to
+		// prevent extend from overriding the default $.AKN.defaultOptions object.
+			options = (typeof options === 'undefined')
+				? $.butterfly.defaultOptions
+				: $.extend({}, $.butterfly.defaultOptions, options)
+			;
+		
+		if (options.lightBoxMargin === null) {
+			// if no margin specified, use 2em if pxToEm available, otherwise use 20px
+			options.lightBoxMargin = pxToEmExists ? '2em' : '20px' ;
+		}
+		if (options.contentDefaultWidth === null) {
+			// if no default width specified, use 50em if pxToEm available, otherwise use 700px (good line lengths for legibility)
+			options.contentDefaultWidth = pxToEmExists ? '50em' : '700px' ;
+		}
+		
+		// Assign an id if none exists
+			if (typeof $(this).attr('id') === 'undefined' || $(this).attr('id') === '') { // cater for jquery 1.6 and previous versions
+				$(this).attr('id', $.butterfly.conf.lightboxClass+'-uid-'+$.butterfly.linkCount);
+			}
+			options.linkID = $(this).attr('id');
+			$.butterfly.linkCount++;
+		
+		$(this).data('options', options);
+		$(this).addClass($.butterfly.conf.lightboxClass);
+		$(this).click(openLightBox);
+	};
+
+
+	openLightBox = function( e, storeState ) {
+		var options, originalTrigger, href, location, title, linkText, thisLink, selector, previousOptions;
+		
+		if (typeof e !== 'undefined') {
+			e.preventDefault(); // so that links aren't followed
+		}
+		
+		// Add state to history
+		storeState = (typeof storeState !== 'undefined') ? storeState : true ;
+		if (storeState) {
+			$.history.load('!'+$(this).attr('id'));
+			return; // This function will be called again by history.load after storing the state in the hash
+		}
+		
+		// when opening, overflow should always be set to hidden (it is changed as appropriate later once the content loads)
+		$('#jb-window-inner').css('overflow','hidden');
+
+		// if lightbox is open already and fragment was reused... clean up
+		if ($('#jb-overlay').is(':visible')) {
+			options = $('#jb-overlay').data('options');
+			if (options.linkType === 'fragment' && options.reuseFragment) {
+				$('.jb-placeholder').remove();
+			}
+			originalTrigger = options.originalTrigger;
+		} else {
+			// if opening for the first time, set the original trigger
+			originalTrigger = this;
+		}
+
+		// get target content
+		location = window.location.href.replace( /#.*$/, '' );
+		href = $(this).attr('href');
+		if ( href.indexOf( location ) === 0 ) {
+			href = href.substring( location.length );
+		}
+		title = $(this).attr('title');
+		linkText = $(this).accessibleText();
+			
+		// get options
+		options = $(this).data('options');
+		options.href = href;
+		options.title = title;
+		options.linkText = linkText;
+		options.trigger = this; // current trigger element
+		options.originalTrigger = originalTrigger; // original trigger element
+
+		// custom class?
+		document.getElementById( 'jb-window-inner' ).className = options.className || '';
+
+		if (options.treatAsImage || isImage(href)) {
+			options.linkType = 'image';
+		} else if (href.substring(0,1) === '#') {
+			options.linkType = 'fragment';
+		} else if (options.useIframe === true || (options.useIframe !== false && this.hostname !== window.location.hostname)) {
+			options.linkType = 'iframe';
+			options.useIframe = true;
+			options.contentDefaultWidth = '100%';
+			options.contentDefaultHeight = '100%';
+		} else {
+			options.linkType = 'ajax';
+		}
+
+		// run preOpen callback function
+		if (options.callbackPreOpen !== null && typeof options.callbackPreOpen === 'function') {
+			options.callbackPreOpen.apply(this);
+		}
+
+		// add/remove close button
+		if (options.closeButton) {
+			if ($('#jb-close-button').length === 0) {
+				$('#jb-window').prepend('<a href="#" id="jb-close-button"><img src="'+options.closeButtonImage+'" alt="Close lightbox" /></a>');
+				$('#jb-close-button').click(closeLightBox);
+			}
+		} else {
+			$('#jb-close-button').remove();
+		}
+
+		// add class if overlay can be clicked to close
+		if (options.clickOverlayCloses) {
+			$('#jb-window').addClass('reactive');
+		} else {
+			$('#jb-window').removeClass('reactive');
+		}
+
+		// Find and store details of gallery (if configured)
+		thisLink = $(this);
+		if (options.galleryContainers !== '') {
+			options.galleryMode = 'container';
+		}
+		options.gallerySelector = '';
+		switch (options.galleryMode) {
+			case 'all':
+				options.gallerySelector = $.butterfly.conf.lightboxLinkSelector;
+			break;
+			case 'container':
+				$.each( options.galleryContainers.split( ',' ), function() {
+					selector = this + ' ' + $.butterfly.conf.lightboxLinkSelector;
+					if ( thisLink.is( selector )) {
+						options.gallerySelector = selector;
+						return false; // we found the container, break loop
+					}
+				});
+			break;
+			// default: do nothing
+		}
+		if (options.gallerySelector === '' && $(this).attr('rel') !== '') {
+			options.gallerySelector = $.butterfly.conf.lightboxLinkSelector+'[rel="'+$(this).attr('rel')+'"]';
+		}
+
+		// grab previousOptions
+		previousOptions = $('#jb-overlay').data('options') || {};
+
+		// assign link options to lightbox
+		$(this).data('options', options);
+		$('#jb-overlay').data('options', options);
+
+		// Temporarily focus here, until loading is complete
+		$('#jb-window').append('<p id="jb-loading">Loading...</p>');
+		$('#jb-loading').attr('tabindex', '0').focus();
+		
+		if ($('#jb-overlay').is(':visible')) {
+			// if lightbox is open:
+			
+			// cleanup after fragment positioning
+			if (previousOptions.linkType === 'fragment' && previousOptions.reuseFragment) {
+				$('.jb-placeholder').after($(previousOptions.href));
+				$('.jb-placeholder').remove();
+				$(previousOptions.href).disableFocussableElements();
+			}
+			
+			// hide/clear content
+			$('#jb-window-content')
+				.hide()
+				.empty()
+			;
+			$('#jb-window').addClass('loading');
+			
+			loadLightBoxContent.apply(this, [loadLightBoxComplete]);
+				
+		} else {
+			// if lightbox is closed:
+			// Disable focussable elements
+			$( document.body ).disableFocussableElements( '#jb-window *' );
+				
+			// hide button
+			$('#jb-close-button').hide();
+			
+			// hide gallery controls
+			$('#jb-gallery-controls').hide();
+				
+			// show overlay
+			$('#jb-overlay').fadeIn(options.animationSpeed).centre();
+			
+			// open small lightbox with loading spinner
+			$('#jb-window')
+				.addClass('loading')
+				.show()
+			;
+			
+			// to zoom or not to zoom?
+			if (options.zoomFromClicked) {
+				// align window with clicked element (for 'zoom in' effect)
+				$('#jb-window-inner').css({
+					top: $(this).offset().top,
+					left: $(this).offset().left,
+					width: $(this).width(),
+					height: $(this).height()
+				});
+			} else {
+				// just centre
+				$('#jb-window-inner')
+					.css({
+						width: '100px',
+						height: '100px'
+					})
+					.centre()
+				;
+			}
+			
+			// load new content to hidden layer
+			loadLightBoxContent.apply(this, [loadLightBoxComplete]);
+		}
+		// for any images in the lightbox, if they are now physically smaller than the relevant max-size, add click-to-zoom capability
+	};
+
+
+	loadLightBoxComplete = function(){
+		// once loaded
+			// init options
+			var options = $('#jb-overlay').data('options');
+			
+			// restore focussable elements inside content (in case content cloned from current page)
+			$('#jb-window').restoreFocussableElements();
+			
+			// remove spinner
+			$('#jb-window').removeClass('loading');
+			
+			
+			// Redundant settimeout for webkit, cause otherwise dimensions are 0 when image loaded from cache. Thanks JKS! <http://stackoverflow.com/users/144149/jks>
+			// @see http://stackoverflow.com/questions/318630/get-real-image-width-and-height-with-javascript-in-safari-chrome#answer-4909227
+			setTimeout(function(){
+				
+				// Establish appropriate classes for new content type before fade in
+				$('#jb-window').removeClass('type-media type-image type-fragment type-ajax');
+				switch (options.linkType) {
+					case 'image':
+						$('#jb-window').addClass('type-image type-media');
+						$('#jb-window-inner').css('overflow','hidden');
+					break;
+					case 'fragment':
+						$('#jb-window').addClass('type-fragment');
+						$('#jb-window-inner').css('overflow','auto');
+					break;
+					case 'iframe':
+						$('#jb-window').addClass('type-iframe');
+						$('#jb-window-inner').css('overflow','hidden');
+					break;
+					case 'ajax':
+						$('#jb-window').addClass('type-ajax');
+						$('#jb-window-inner').css('overflow','auto');
+					break;
+				}
+				if (options.treatAsMedia) {
+					$('#jb-window').addClass('type-media');
+				}
+				
+				// resize
+				resizeLightBox.apply(this, [function(){
+					var nextControl;
+						
+					if (options.linkType === 'iframe') {
+						$('#jb-window-content').css('visibility', 'visible');
+					}
+					// fade in new content
+					$('#jb-window-content').fadeIn(options.animationSpeed, function(){
+						
+						// set focus to start of lightbox content
+						$('#jb-window-content')
+							//.attr('tabindex',0) // add to tab index (now occurs during initialisation)
+							.focus() // set focus
+						;
+						
+						// Remove temporary loading message
+						$('#jb-loading').remove();
+					
+						// run postOpen callback function
+						if (options.callbackPostOpen !== null && typeof options.callbackPostOpen === 'function') {
+							options.callbackPostOpen.apply(this);
+						}
+						
+						// preload next gallery image?
+						nextControl = $('#jb-gallery-next');
+						if (
+							options.preloadNextGalleryImage && 
+							nextControl.length > 0 && 
+							nextControl.is(':visible') && 
+							nextControl.attr('href') !== '#' && 
+							isImage(nextControl.attr('href'))
+						) {
+							$('<img src="'+nextControl.attr('href')+'" alt="" />');
+						}
+					});
+				}]);
+			}, 0);
+	};
+
+
+	resizeLightBox = function( callback ) {
+
+		var options = $('#jb-overlay').data('options'),
+			lbMargin, availableWidth, availableHeight, contentDefaultWidth, contentDefaultHeight, mediaMaxWidth, mediaMaxHeight, w, h,
+			reductionRatio, prevWidth, topLeft, animationSpeed, buttonWidth, buttonHeight, buttonLeft, buttonTop, prevTop, prevLeft, nextTop, nextLeft;
+
+		if (typeof options === 'undefined') {
+			return; // options haven't been assigned to lightbox overlay yet
+		}
+
+		lbMargin = parseInt(parsePixels(options.lightBoxMargin), 10);
+		
+		availableWidth = $('#jb-window').width() - (lbMargin * 2);
+		availableHeight = $('#jb-window').height() - (lbMargin * 2);
+		
+		// find current default/max dimensions (convert to pixels if necessary)
+		contentDefaultWidth = parsePixels(options.contentDefaultWidth, availableWidth);
+		contentDefaultHeight = parsePixels(options.contentDefaultHeight, availableHeight);
+		mediaMaxWidth = parsePixels(options.mediaMaxWidth, availableWidth);
+		mediaMaxHeight = parsePixels(options.mediaMaxHeight, availableHeight);
+		
+		
+		// run preResize callback function
+			if (options.callbackPreResize !== null && typeof options.callbackPreResize === 'function') {
+				options.callbackPreResize.apply($('#jb-window'), [availableWidth, availableHeight, contentDefaultWidth, contentDefaultHeight, mediaMaxWidth, mediaMaxHeight]);
+			}
+
+		/*// IE6 needs help with resizing the overlay and window
+		if (
+			$.browser.msie && $.browser.version === 6
+		) {
+			
+			$('#jb-overlay, #jb-window').css({
+				position: 'absolute',
+				top: 0-$( document.body ).css('margin-top'),
+				left: 0-$( document.body ).css('margin-left'),
+				width: $(window).width(),
+				height: $(window).height()
+			});
+			
+		}
+			*/
+
+		if (options.linkType === 'image' || options.treatAsMedia) {
+			
+			
+			
+			// measure content size
+			w = $('#jb-window-content').lightBoxContentWidth();
+			h = $('#jb-window-content').lightBoxContentHeight();
+			
+				
+			// compare dimensions against max width and height
+			if (w > mediaMaxWidth) {
+				reductionRatio = w / mediaMaxWidth;
+				w = mediaMaxWidth;
+				h = h / reductionRatio;
+				// $.debug('w ratio = '+reductionRatio);
+			}
+			if (h > mediaMaxHeight) {
+				reductionRatio = h / mediaMaxHeight;
+				h = mediaMaxHeight;
+				w = w / reductionRatio;
+				// $.debug('h ratio = '+reductionRatio);
+			}
+			
+			// compare dimensions against available width and height
+			if (w > availableWidth) {
+				reductionRatio = w / availableWidth;
+				w = availableWidth;
+				h = h * reductionRatio;
+				// $.debug('w ratio = '+reductionRatio);
+			}				
+			if (h > availableHeight) {
+				reductionRatio = h / availableHeight;
+				h = availableHeight;
+				w = w * reductionRatio;
+				// $.debug('h ratio = '+reductionRatio);
+			}
+			// $.debug('max img width = '+options.mediaMaxWidth);
+			// $.debug('max img height = '+options.mediaMaxHeight);
+				
+		} else if (options.linkType === 'iframe') {
+			
+			w = contentDefaultWidth;
+			h = contentDefaultHeight;
+			
+		} else {
+			
+			// not an image or treat as media (must be content fragment)
+			
+			// $.debug('contentDefaultWidth = '+options.contentDefaultWidth);
+			// $.debug('contentDefaultHeight = '+options.contentDefaultHeight);
+			
+			// measure content width
+			w = $('#jb-window-content').lightBoxContentWidth();
+		
+			if (
+				contentDefaultWidth === '' ||
+				contentDefaultWidth === '100%' ||
+				availableWidth < contentDefaultWidth
+			) {
+				w = availableWidth;
+			} else {
+				w = contentDefaultWidth;
+			}
+			
+			if (options.collapseHeightWhenPossible) {
+				
+				// set new width temporarily
+				prevWidth = $('#jb-window-inner').width();
+				//$('#jb-window-inner').width(w); // not kicking in fast enough, use animate to lock in new width
+				$('#jb-window-inner').animate({width: w}, 0);
+					
+				// measure height
+				h = $('#jb-window-content').lightBoxContentHeight( false );
+					
+				// set width back to previous value
+				$('#jb-window-inner').width(prevWidth);
+				
+				if (
+					availableHeight < h
+				) {
+					h = availableHeight;
+				// } else {
+					// do nothing
+					// h = contentDefaultHeight;
+				}
+				
+			} else {
+				
+				// same height for all content boxes (based on contentDefaultHeight)
+				h = $('#jb-window-content').lightBoxContentHeight();
+				if (
+					contentDefaultHeight === '' ||
+					contentDefaultHeight === '100%' ||
+					availableHeight < contentDefaultHeight
+				) {
+					h = availableHeight;
+				} else {
+					h = contentDefaultHeight;
+				}
+			}
+		}
+		
+		// $.debug('availableWidth = '+availableWidth);
+		// $.debug('availableHeight = '+availableHeight);
+		// $.debug('final w = '+w);		
+		// $.debug('final h = '+h);
+				
+		topLeft = findOffsetToCentre(w, h);
+		
+		// if not animating resize, set speed to 0
+		animationSpeed = options.animateResize ? options.animationSpeed : 0;
+		
+		$('#jb-close-button').hide();
+		$('#jb-gallery-controls').hide();
+		
+		if (options.linkType === 'iframe') {
+			$('#jb-window-inner iframe').css('visibility','hidden');
+		}
+		
+		$('#jb-window-inner').animate({
+			'width' : w,
+			'height' : h,
+			'left' : topLeft[1],
+			'top' : topLeft[0]
+		}, animationSpeed, 0, function() {
+			
+			options = $('#jb-overlay').data('options');
+			w = $('#jb-window-inner').width();
+			h = $('#jb-window-inner').height();
+			
+			
+			// Show iframe
+			if (options.linkType === 'iframe') {
+				$('#jb-window-inner iframe')
+					.width(w)
+					.height(h)
+				;
+				$('#jb-window-inner iframe').css('visibility','visible');
+			}
+			
+			// Show close button
+			if ($('#jb-close-button').length > 0) {
+				buttonWidth = parseInt($('#jb-close-button').width(), 10);
+				buttonHeight = parseInt($('#jb-close-button').height(), 10);
+				
+				switch (options.closeButtonCorner) {
+					case 'tr':
+						buttonLeft = topLeft[1] + w - buttonWidth/2;
+						buttonTop = topLeft[0] - buttonHeight/2;
+					break;
+					case 'br':
+						buttonLeft = topLeft[1] + w - buttonWidth/2;
+						buttonTop = topLeft[0] + h - buttonHeight/2;
+					break;
+					case 'bl':
+						buttonLeft = topLeft[1] - buttonWidth/2;
+						buttonTop = topLeft[0] + h - buttonHeight/2;
+					break;
+					default:
+					// case 'tl':
+						buttonLeft = topLeft[1] - buttonWidth/2;
+						buttonTop = topLeft[0] - buttonHeight/2;
+				}
+				
+				$('#jb-close-button')
+					.css({
+						position: 'absolute',
+						'z-index': '999999',
+						left: buttonLeft,
+						top: buttonTop
+					})
+					.show()
+				;
+			}
+
+			// Are gallery controls relevant?
+			if ($('#jb-gallery-controls').is('.active')) {
+				// Position gallery controls
+					prevTop = topLeft[0] + h/2 - options.galleryControlHeight/2;
+					prevLeft = topLeft[1] - options.galleryControlWidth;
+					$('#jb-gallery-prev').css({top: prevTop, left: prevLeft});
+					
+					nextTop = topLeft[0] + h/2 - options.galleryControlHeight/2;
+					nextLeft = topLeft[1] + w;
+					$('#jb-gallery-next').css({top: nextTop, left: nextLeft});
+					
+				// Show gallery controls
+					$('#jb-gallery-controls')
+						//.fadeIn()
+						.show() // faster!
+					;
+			}
+			
+			// run postResize callback function
+			if (options.callbackPostResize !== null && typeof options.callbackPostResize === 'function') {
+				options.callbackPostResize.apply($('#jb-window'), [availableWidth, availableHeight, contentDefaultWidth, contentDefaultHeight, mediaMaxWidth, mediaMaxHeight]);
+			}
+			
+			if (typeof callback !== 'undefined' && typeof callback.apply !== 'undefined') {
+				callback.apply();
+			}
+		});
+	};
+
+
+	loadLightBoxContent = function( callback ) {
+		
+		var options = $( '#jb-overlay' ).data( 'options' ),
+			href = options.href,
+			caption, gallerySet, prevControl, nextControl, prevLink, nextLink,
+			lbMargin, availableWidth, availableHeight, contentDefaultWidth, contentDefaultHeight, ajaxHref;
+		
+		// Populate caption
+		switch (options.captionMode) {
+			case 'title':
+				caption = options.title ? '<p class=\'jb-caption\'><span>' + options.title + '</span></p>':'';
+			break;
+			case 'text':
+				caption = options.linkText ? '<p class=\'jb-caption\'><span>' + options.linkText + '</span></p>':'';
+			break;
+			default:
+				caption = '';
+			break;
+		}
+
+		
+		// remove previous error states
+		$('#jb-window').removeClass('error-no-content');
+		
+		// Setup/adjust gallery (next/prev) links
+		// Find the gallery set
+		gallerySet = $(options.gallerySelector);
+			
+		$('#jb-gallery-controls').removeClass('active');
+
+		if (gallerySet.length > 1 && gallerySet.isInSet('#'+options.linkID)) {
+			
+			// Setup the HTML for the gallery controls
+			if ($('#jb-gallery-controls').length === 0) {
+				$('#jb-window').append('<div id="jb-gallery-controls"></div>');
+				prevControl = $('<a id="jb-gallery-prev" href="#">Previous</a>').click(galleryControlsClick);
+				nextControl = $('<a id="jb-gallery-next" href="#">Next</a>').click(galleryControlsClick);
+				$('#jb-gallery-controls').append(prevControl).append(nextControl);
+				prevControl.add(nextControl).css({
+					position: 'absolute',
+					'z-index': '99999',
+					display: 'block',
+					overflow: 'hidden'
+				});
+			} else {
+				prevControl = $('#jb-gallery-prev');
+				nextControl = $('#jb-gallery-next');
+				prevControl.add(nextControl)
+					.removeClass('disabled')
+					.attr('tabindex', '0')
+					.attr('title', '')
+					.show()
+				;
+			}
+			$('#jb-gallery-controls').hide();
+			$('#jb-gallery-controls').addClass('active');
+			
+			
+			// Find previous link
+			prevLink = gallerySet.prevInSet('#'+options.linkID);
+			if (prevLink === false) {
+				if (options.galleryLoops) {
+					prevLink = gallerySet.lastInSet();
+				} else {
+					prevLink = $('<a href="#" id=""></a>');
+					prevControl
+						.addClass('disabled')
+						.attr('tabindex', '-1')
+						// hide it or it traps mouse clicks
+						.hide()
+					;
+				}
+			}
+			prevControl
+				.attr('href', prevLink.attr('href'))
+				.data('linkID', prevLink.attr('id'))
+				.attr('title', $.trim( prevLink.accessibleText() ))
+			;
+			
+			// Find next link
+			nextLink = gallerySet.nextInSet('#'+options.linkID);
+			if (nextLink === false) {
+				if (options.galleryLoops) {
+					nextLink = gallerySet.firstInSet();
+				} else {
+					nextLink = $('<a href="#" id=""></a>');
+					nextControl
+						.addClass('disabled')
+						.attr('tabindex', '-1')
+						// hide it or it traps mouse clicks
+						.hide()
+					;
+				}
+			}
+			nextControl
+				.attr('href', nextLink.attr('href'))
+				.data('linkID', nextLink.attr('id'))
+				.attr('title', $.trim( nextLink.accessibleText() ))
+			;
+					
+		} else {
+			$('#jb-gallery-controls').hide();
+		}
+		
+		switch (options.linkType) {
+			case 'fragment': // internal page fragment
+				
+				if (options.reuseFragment) {
+					$(href).after('<span class="jb-placeholder"></span>');
+					$('#jb-window-content').empty().append($(href)); // href becomes a selector for an id fragment
+				} else {
+					$('#jb-window-content').empty().append($(href).clone(true));
+				}
+				
+				checkForContent.apply(this, [options.linkType, href]);
+				callback.apply(this);
+			break;
+
+			case 'image': // link to image
+					
+					$('#jb-window-content').empty().append(
+						'<img src="'+href+'" alt="" style="max-width: 100%; max-height: 100%; float: left;" />'+caption
+					);
+					$('#jb-window-content img')
+						.error(function(){
+							checkForContent.apply(this, [options.linkType, href, callback]);
+						})
+						.data('full-width', '')
+						.data('full-height', '')
+						.load(callback)
+					;
+			break;
+
+			case 'iframe': // link to iframe URL
+					$('#jb-window-content').show().css('visibility', 'hidden');
+					$('#jb-window-content').empty().append(
+						'<iframe src="'+href+'" title="'+caption+'" width="100%" height="1000" />'
+					);
+					$('#jb-window-content').css('visibility', 'hidden');
+					
+					lbMargin = parseInt(parsePixels(options.lightBoxMargin), 10);
+					availableWidth = $('#jb-window').width() - (lbMargin * 2);
+					availableHeight = $('#jb-window').height() - (lbMargin * 2);
+					// find current default/max dimensions (convert to pixels if necessary)
+					contentDefaultWidth = parsePixels(options.contentDefaultWidth, availableWidth);
+					contentDefaultHeight = parsePixels(options.contentDefaultHeight, availableHeight);
+					
+					$('#jb-window-content > iframe')
+						.width(contentDefaultWidth)
+						.height(contentDefaultHeight)
+						.error(function(){
+							checkForContent.apply(this, [options.linkType, href, callback]);
+						})
+						.load(callback)
+					;
+			break;
+
+			default:
+			// case 'ajax':
+			// case '': // link to external page (or fragment of a page)
+				// ajax call on remote file
+				$.ajaxSetup ({
+					cache: true
+				});
+				if (href.indexOf('#') !== -1) {
+					ajaxHref = href.split('#').join(' #');
+				} else {
+					ajaxHref = href;
+				}
+				$('#jb-window-content').empty().load(ajaxHref, function(){
+					checkForContent.apply(this, [options.linkType, href]);
+					callback.apply(this);
+				});
+		}
+	};
+	
+	
+	checkForContent = function( linkType, href, callback ) {
+		// check if no content loaded
+		var wasError = false,
+			options;
+			
+		// checkForContent only called for images on .error()
+		// otherwise, if no children() exist
+		if (linkType === 'image' || $('#jb-window-content').children().length === 0) {
+			wasError = true;
+		}
+
+		if (wasError) {
+			options = $('#jb-overlay').data('options');
+			options.linkType = 'fragment';
+			options.treatAsMedia = false;
+			$('#jb-overlay').data('options', options);
+			$('#jb-window')
+				.removeClass('type-image type-media')
+				.addClass('type-fragment error-no-content')
+			;
+			$('#jb-window-content').empty().append('<p>There was an error loading lightbox content. <strong>'+$(options.trigger).text()+'</strong> (<samp>'+href+'</samp>) could not be found.</p>');
+		}
+		if (typeof callback !== 'undefined') {
+			callback.apply(this);
+		}
+	};
+	
+
+	closeLightBox = function( evt ) {
+		var options, href, originalTriggerEL;
+
+		if ( evt ) {
+			evt.preventDefault(); // prevent click from following link
+		}
+		
+		if ($('#jb-window:hidden').length) {
+			return; // Already closed, do nothing
+		}
+		
+		options = $('#jb-overlay').data('options');
+		href = options.href;
+		
+		// run preClose callback function
+		if (options.callbackPreClose !== null && typeof options.callbackPreClose === 'function') {
+			options.callbackPreClose.apply(options.trigger);
+		}
+		
+		// cleanup after fragment positioning
+		if (options.linkType === 'fragment' && options.reuseFragment) {
+			$('.jb-placeholder').after($(href));
+			$('.jb-placeholder').remove();
+		}
+		
+		
+		// Restore all focussable elements
+		$( document.body ).restoreFocussableElements();
+		
+		$('#jb-overlay').fadeOut(options.animationSpeed);
+		$('#jb-window').hide();
+		$('#jb-window-content').hide();
+		
+		// return focus to original trigger element
+		originalTriggerEL = $(options.originalTrigger);
+		if (typeof originalTriggerEL.attr('tabindex') === 'undefined') {
+			originalTriggerEL.attr('tabindex',0);
+		}
+		originalTriggerEL.focus();
+		
+		// Remove temporary loading message
+		$('#jb-loading').remove();
+		
+		// run postClose callback function
+		if (options.callbackPostClose !== null && typeof options.callbackPostClose === 'function') {
+			options.callbackPostClose.apply(options.trigger);
+		}
+
+		// TODO pop history? ... if this was a gallery, pop the entire gallery?
+		// window.history.back();
+	
+		// TODO
+		// load '' = jump to top of screen
+		// load '!' = no jump, back links do not work
+		$.history.load( '' );
+	};
+	
+	
+	/**
+	 * A plugin to measure the width of an element accurately (even if it is hidden)
+	 */
+	$.fn.lightBoxContentWidth = function () {
+		
+		var jbWindow = this.closest('#jb-window'),
+			jbWindowInner = $('#jb-window-inner'),
+			isImageType = jbWindow.hasClass('type-media') ? true : false,
+			isImageMedia = jbWindow.hasClass('media-image') ? true : false,
+			currentWidth = jbWindowInner.width(),
+			currentHeight = jbWindowInner.height(),
+			currentLeft = jbWindowInner.css('left'),
+			currentTop = jbWindowInner.css('top'),
+			fullWidth
+		;
+		
+		// relax size for measurement
+		if (
+			$.browser.msie &&
+			$.browser.version === 7 &&
+			isImageType &&
+			isImageMedia && 
+			this.find('img').outerWidth(true) === 0 // IE7 width === 0 on initial load
+		) { // only works with '100%' for IE7 on initial load
+			jbWindowInner.css({
+				width: '100%',
+				height: '100%',
+				left:0,
+				top:0
+			});
+		} else { // must use 'auto' for all other situations
+			jbWindowInner.css({
+				width: 'auto',
+				height: 'auto',
+				left:0,
+				top:0
+			});
+		}
+		
+		
+		// if element is hidden, unhide it, then measure
+		if ( this.css('display') === 'none') {
+						
+			// make element display for a nanosecond
+				this.css('display', 'block');
+				
+			// measure
+				if (isImageType) {
+					fullWidth = this.find('img').outerWidth(true);
+				} else {
+					fullWidth = this.outerWidth(true);
+				}
+			// restore
+				this.css('display', 'none');
+				
+		} else {
+			fullWidth = this.outerWidth(true);
+		}
+		
+		
+		// reinstate previous size/position
+		jbWindowInner.css({'left':currentLeft,'top':currentTop});
+		jbWindowInner.animate({
+			width: currentWidth,
+			height: currentHeight//,
+				//left: curentLeft,
+				//top: currentTop
+		},0);
+
+		return fullWidth;
+	};
+	
+
+	/**
+	 * A plugin to measure the height of an element accurately (even if it is hidden)
+	 */
+	$.fn.lightBoxContentHeight = function( relaxWidth ) {
+		
+		var jbWindow = this.closest('#jb-window'),
+			jbWindowInner = jbWindow.find( '#jb-window-inner' ),
+			isImageType = jbWindow.hasClass('type-media') ? true : false,
+			isImageMedia = jbWindow.hasClass('media-image') ? true : false,
+		
+			// always relax height
+			currentWidth = jbWindowInner.width(),
+			currentHeight = jbWindowInner.height(),
+			currentLeft = jbWindowInner.css('left'),
+			currentTop = jbWindowInner.css('top'),
+
+			fullHeight
+		;
+
+		relaxWidth = typeof relaxWidth !== 'undefined' ? relaxWidth : true;
+			
+		// relax size for measurement
+		if (
+			$.browser.msie && 
+			$.browser.version === 7 && 
+			isImageType && 
+			isImageMedia &&
+			this.find('img').outerWidth(true) === 0 // IE7 width === 0 on initial load
+		) { // only works with '100%' for IE7 on initial load
+			$('#jb-window-inner').height('100%');
+			if (relaxWidth) {
+				$('#jb-window-inner').width('100%').css({left:0,top:0});
+			}
+		} else { // must use 'auto' for all other situations
+			$('#jb-window-inner').height('auto');
+			if (relaxWidth) {
+				$('#jb-window-inner').width('auto').css({left:0,top:0});
+			}
+		}
+		
+		// if element is hidden, unhide it, then measure
+		if ( this.css('display') === 'none' ) {
+						
+			// make element display for a nanosecond
+			this.css('display', 'block');
+			
+			// measure
+			fullHeight = this.outerHeight(true);
+				
+			// restore
+			this.css('display', 'none');
+			
+				
+		} else {
+			fullHeight = $(this).outerHeight(true);
+		}
+		
+		// reinstate previous size
+			$('#jb-window-inner')
+				.width(currentWidth)
+				.height(currentHeight)
+				.css({left:currentLeft,top:currentTop})
+			;
+		
+		return fullHeight;
+	};
+	
+	
+	overlayClicked = function( evt ) {
+		var options = $('#jb-overlay').data('options');
+				
+		if ( evt.target === $('#jb-window').get(0) && options.clickOverlayCloses ) {
+			closeLightBox.apply();
+		// } else {
+			// do nothing
+		}
+	};
+
+
+	/**
+	 * Key pressed on keyboard
+	 */
+	lightBoxKeypress = function( evt ) {
+		var evtKeyCode;
+
+		//$.debug('Key pressed: '+evt.keyCode);
+		
+		// If lightbox is not open or if modifier keys are down, ignore key presses
+		if (
+			!$('#jb-overlay').is(':visible') ||
+			evt.ctrlKey ||
+			evt.altKey ||
+			evt.shiftKey ||
+			evt.metaKey
+		) {
+			return true; /* facilitate further bubbling */
+		}
+	
+		// Get the key that was pressed
+		evtKeyCode = getKeyCode(evt);
+		
+		
+		// handle keypresses here
+		switch (evtKeyCode) {
+			case DOM_VK_UP:
+			case DOM_VK_LEFT:
+				$('#jb-gallery-prev').click();
+			break;
+			case DOM_VK_DOWN:
+			case DOM_VK_RIGHT:
+				$('#jb-gallery-next').click();
+			break;
+			case DOM_VK_HOME:
+				$($('#jb-overlay').data('options').gallerySelector).firstInSet().click();
+			break;
+			case DOM_VK_END:
+				$($('#jb-overlay').data('options').gallerySelector).lastInSet().click();
+			break;
+			case DOM_VK_ESCAPE:
+				closeLightBox.apply();
+			break;
+			default:
+				// A different (untracked) key was pressed, just ignore it
+				return true; /* facilitate further bubbling */
+		}
+		
+		// Event already handled, prevent default
+		evt.preventDefault();
+	};
+	
+
+	/**
+	 * Someone activated gallery 'next' or 'prev' links
+	 */
+	galleryControlsClick = function( evt ) {
+		var lightboxLink,
+			$this = $( this );
+		
+		// Prevent default action
+		evt.preventDefault();
+
+		// find the gallery link, and activate it
+		if ( $this.data( 'linkID' ) !== '' ) {
+			
+			$( '#jb-gallery-controls' ).hide(); // hide gallery controls for the transition
+			
+			lightboxLink = $( '#' + $this.data( 'linkID' ));
+			return lightboxLink.click();
+		}
+	};
+
+
+	/**
+	 * A plugin to centre a visible element on the screen
+	 */
+	$.fn.centre = function () {
+		return this.css({
+			'position': 'fixed',
+			'top': ( $(window).height() - this.outerHeight() ) / 2 + 'px',
+			'left': ( $(window).width() - this.outerWidth() ) / 2 + 'px'
+		});
+	};
+	
+
+	findOffsetToCentre = function( w, h ) {
+		var topOffset = ( $(window).height() - h ) / 2,
+			leftOffset = ( $(window).width() - w ) / 2;
+		
+		//// $.debug ('w = '+w+' | h = '+h+' | top = '+top+' | left = '+left);
+		
+		return [ topOffset, leftOffset ];
+	};
+	
+	
+	/**
+	 * Find if the node is in the set of nodes
+	 */
+	$.fn.isInSet = function( currentElement ) {
+		return this.index( $( currentElement )) !== -1;
+	};
+	
+
+	/**
+	 * Find the next node in the currently selected set of nodes
+	 */
+	$.fn.nextInSet = function( currentElement ) {
+		var currentIndex = this.index( $( currentElement ));
+		if ( this.length > currentIndex + 1 ) {
+			return this.eq( currentIndex + 1 );
+		} else {
+			return false;
+		}
+	};
+	
+
+	/**
+	 * Find the previous node in the currently selected set of nodes
+	 */
+	$.fn.prevInSet = function( currentElement ) {
+		var currentIndex = this.index( $( currentElement ));
+		if ( currentIndex > 0 ) {
+			return this.eq( currentIndex - 1 );
+		} else {
+			return false;
+		}
+	};
+	
+
+	/**
+	 * Find the first node in the currently selected set of nodes
+	 */
+	$.fn.firstInSet = function() {
+		if ( this.length > 0 ) {
+			return this.eq( 0 );
+		} else {
+			return false;
+		}
+	};
+	
+	
+	/**
+	 * Find the last node in the currently selected set of nodes
+	 */
+	$.fn.lastInSet = function() {
+		if ( this.length > 0 ) {
+			return this.eq( -1 );
+		} else {
+			return false;
+		}
+	};
+	
+	
+	/**
+	 * from: http://stackoverflow.com/questions/1933501/how-to-put-targetblank-in-jquery
+	 */
+	isImage = function( fileName ) {
+		
+		if (typeof fileName === 'undefined' || fileName === '') {
+			return false;
+		}
+		var pos = String( fileName ).lastIndexOf( '.' ),
+			extension;
+
+		if (pos === -1 ) {
+			return false;
+		} else {
+			return ( /^\.(jpg|png|gif|bmp|jpeg)$/i ).test( fileName.substring( pos ));
+		}
+	};
+	
+	
+	/**
+	 * Disable all focussable elements outside the lightbox. Stores previous tabindex for later restoration
+	 * Currently targets links, common form elements and anything with tabindex > -1
+	 * @see http://stackoverflow.com/questions/1599660/which-html-elements-can-receive-focus
+	 */
+	$.fn.disableFocussableElements = function( excludeElements ) {
+		excludeElements = excludeElements || '';
+		var focussable = this.find( 'a, input, button, area, frame, iframe, [tabindex]' ).not( excludeElements ).not( '*[tabindex="-1"]' );
+
+		focussable.each(function() {
+			var $this = $( this ),
+				prevTabIndex = $this.attr( 'tabindex' )
+			;
+
+			prevTabIndex = typeof ( prevTabIndex ) === 'undefined' || prevTabIndex === '' ? '' : prevTabIndex;
+
+			$this
+				.data( 'prevTabIndex', prevTabIndex )
+				.addClass( 'jb-unfocussed' )
+				.attr( 'tabindex', '-1' )
+			;
+		});
+	};
+
+
+	/**
+	 * Restore all focussable elements outside the lightbox.
+	 */
+	$.fn.restoreFocussableElements = function() {
+		var focussable = this.find( '.jb-unfocussed' );
+		
+		focussable.each(function() {
+			var $this = $( this ),
+				prevTabIndex = $this.data( 'prevTabIndex' );
+			
+			switch ( prevTabIndex ) {
+				case '':
+					$this.removeAttr( 'tabindex' );
+				break;
+				default:
+					$this.attr( 'tabindex', prevTabIndex );
+			}
+
+			$this.removeClass( 'jb-unfocussed' );
+		});
+	};
+
+
+	/**
+	 * Converts % or em values to a number of pixels (integer).
+	 * Use pxToEm (reverse mode) to convert em values to pixels (if the plugin is available)
+	 * @param String input The dimenion to be converted (may include % or em or px)
+	 * @param integer centDimension The dimension that represents 100%
+	 * @return integer Converted dimension in pixels
+	 */
+	parsePixels = function( input, centDimension ) {
+		
+		centDimension = typeof centDimension !== 'undefined' ? centDimension : $( document.body ).width() ;
+		
+		input = input
+			.replace('px','') // remove px units if present
+			.replace(/^\s+|\s+$/g,"") // trim leading and trailing whitespace
+		;
+		
+		if (!isNaN(input)) {
+			// int already, return as pixels
+			return parseInt(input, 10);
+
+		} else if (input.substr(input.length - 1) === '%') {
+			// %, convert to pixels
+			
+			if (typeof centDimension !== 'undefined') {
+				input = parseInt(input
+					.substr(0, input.length - 1) // strip unit
+					.replace(/^\s+|\s+$/g,"") // trim
+				, 10);
+				return input/100 * parseInt(centDimension, 10);
+			} else {
+				$.debug('Warning: percentage unit was supplied to parsePixels() but could not be calculated because centDimension was not supplied.');
+				return parseInt(input, 10);
+			}
+				
+		} else if (input.substr(input.length - 2) === 'em') {
+			// em, check for pxToEm and convert (or warn)
+			if (typeof Number.prototype.pxToEm !== 'undefined') {
+				input = parseInt(input
+					.substr(0, input.length - 2) // strip unit
+					.replace(/^\s+|\s+$/g,"") // trim
+				, 10);
+				input = input.pxToEm({
+				   reverse: true
+				});
+				return input.substr(0, input.length - 2); // strip unit px;
+
+			} else {
+				$.debug('Warning: em unit was supplied to parsePixels() but could not be calulated because pxToEm plugin was not found.');
+				return parseInt(input, 10);
+			}
+		} else {
+			// unknown units, warn
+			$.debug('Warning: unknown unit was supplied. parsePixels() can support px, em or % units only.');
+			return parseInt(input, 10);
+		}
+	};
+
+
+}( jQuery, ResizeEvents ));
+/* end closure */
diff --git a/public/opac/js/butterfly/jquery.butterfly.min.js b/public/opac/js/butterfly/jquery.butterfly.min.js
new file mode 100644
index 00000000000..991d1113309
--- /dev/null
+++ b/public/opac/js/butterfly/jquery.butterfly.min.js
@@ -0,0 +1,6 @@
+/**
+ * @author Andrew Ramsden <http://irama.org/>
+ * @see http://irama.org/web/dhtml/butterfly/
+ * @license GNU GENERAL PUBLIC LICENSE (GPL) <http://www.gnu.org/licenses/gpl.html>
+ */
+jQuery.butterfly={},jQuery.butterfly.defaultOptions={contentDefaultWidth:null,contentDefaultHeight:"100%",mediaMaxWidth:"100%",mediaMaxHeight:"100%",treatAsMedia:!1,lightBoxMargin:null,animateResize:!0,animationSpeed:150,useIframe:"autodetect",collapseHeightWhenPossible:!0,reuseFragment:!1,closeButton:!0,closeButtonImage:"close.png",closeButtonCorner:"tr",clickOverlayCloses:!0,preloadLoadingImage:"",preloadGalleryControlsSprite:"",galleryControlWidth:49,galleryControlHeight:85,galleryMode:"rel",galleryContainers:"",galleryLoops:!1,captionMode:"title",preloadNextGalleryImage:!0,zoomFromClicked:!1,callbackPreOpen:null,callbackPreResize:null,callbackPostResize:null,callbackPostOpen:null,callbackPreClose:null,callbackPostClose:null,treatAsImage:!1},jQuery.butterfly.conf={overlayOpacity:".7",lightboxClass:"lightbox",lightboxLinkSelector:"a.lightbox"},jQuery.butterfly.linkCount=0,DOM_VK_END=35,DOM_VK_HOME=36,DOM_VK_LEFT=37,DOM_VK_UP=38,DOM_VK_RIGHT=39,DOM_VK_DOWN=40,DOM_VK_ESCAPE=27,function(e,t){"use strict";function i(e){return e=e||window.event,e.keyCode?e.keyCode:e.which?e.which:null}var n,a,o,l,s,r,d,c,h,b,p,u,f;e.fn.accessibleText=function(){return this.is("img")?this.attr("alt"):this.is("input")?this.attr("value"):e.map(this.contents(),function(t){if(3===t.nodeType)return t.data;if(1===t.nodeType){var i=e(t);return i.is("img, input")||i.find("img[alt], input[value]").length>0?i.accessibleText():i.text()}}).join("")},e(function(){"undefined"!=typeof t&&e(this).each(function(){t.bind("x-text-resize x-window-resize",n)}),e(document.body).append('<div id="jb-overlay"></div><div id="jb-window"><div id="jb-window-inner"><div id="jb-window-content" style="width: auto; height: auto;" tabindex="0"></div></div></div>').bind("keydown",r),e("#jb-overlay").fadeTo(0,e.butterfly.conf.overlayOpacity,function(){e(this).hide()}),e("#jb-window").hide().click(d),e("#jb-window-inner").centre(),e("#jb-window-content").css({overflow:"hidden"}).hide(),e.history.init(function(t){""===t?a.apply():/^!/.test(t)&&(t=t.substring(1),e("#"+t).trigger("click",[!1]))},{unescape:",/"})}),e.fn.butterfly=function(t){return t="undefined"!=typeof t?t:{},t.closeButtonImage&&e('<img src="'+t.closeButtonImage+'" alt="" />'),t.preloadLoadingImage&&e('<img src="'+t.preloadLoadingImage+'" alt="" />'),t.preloadGalleryControlsSprite&&e('<img src="'+t.preloadGalleryControlsSprite+'" alt="" />'),this.each(function(){o.apply(this,[t])})},o=function(t){var i="undefined"!=typeof Number.prototype.pxToEm?!0:!1;t="undefined"==typeof t?e.butterfly.defaultOptions:e.extend({},e.butterfly.defaultOptions,t),null===t.lightBoxMargin&&(t.lightBoxMargin=i?"2em":"20px"),null===t.contentDefaultWidth&&(t.contentDefaultWidth=i?"50em":"700px"),("undefined"==typeof e(this).attr("id")||""===e(this).attr("id"))&&e(this).attr("id",e.butterfly.conf.lightboxClass+"-uid-"+e.butterfly.linkCount),t.linkID=e(this).attr("id"),e.butterfly.linkCount++,e(this).data("options",t),e(this).addClass(e.butterfly.conf.lightboxClass),e(this).click(l)},l=function(t,i){var n,o,l,r,d,h,p,u,f;if("undefined"!=typeof t&&t.preventDefault(),i="undefined"!=typeof i?i:!0)return void e.history.load("!"+e(this).attr("id"));switch(e("#jb-window-inner").css("overflow","hidden"),e("#jb-overlay").is(":visible")?(n=e("#jb-overlay").data("options"),"fragment"===n.linkType&&n.reuseFragment&&e(".jb-placeholder").remove(),o=n.originalTrigger):o=this,r=window.location.href.replace(/#.*$/,""),l=e(this).attr("href"),0===l.indexOf(r)&&(l=l.substring(r.length)),d=e(this).attr("title"),h=e(this).accessibleText(),n=e(this).data("options"),n.href=l,n.title=d,n.linkText=h,n.trigger=this,n.originalTrigger=o,document.getElementById("jb-window-inner").className=n.className||"",n.treatAsImage||b(l)?n.linkType="image":"#"===l.substring(0,1)?n.linkType="fragment":n.useIframe===!0||n.useIframe!==!1&&this.hostname!==window.location.hostname?(n.linkType="iframe",n.useIframe=!0,n.contentDefaultWidth="100%",n.contentDefaultHeight="100%"):n.linkType="ajax",null!==n.callbackPreOpen&&"function"==typeof n.callbackPreOpen&&n.callbackPreOpen.apply(this),n.closeButton?0===e("#jb-close-button").length&&(e("#jb-window").prepend('<a href="#" id="jb-close-button"><img src="'+n.closeButtonImage+'" alt="Close lightbox" /></a>'),e("#jb-close-button").click(a)):e("#jb-close-button").remove(),n.clickOverlayCloses?e("#jb-window").addClass("reactive"):e("#jb-window").removeClass("reactive"),p=e(this),""!==n.galleryContainers&&(n.galleryMode="container"),n.gallerySelector="",n.galleryMode){case"all":n.gallerySelector=e.butterfly.conf.lightboxLinkSelector;break;case"container":e.each(n.galleryContainers.split(","),function(){return u=this+" "+e.butterfly.conf.lightboxLinkSelector,p.is(u)?(n.gallerySelector=u,!1):void 0})}""===n.gallerySelector&&""!==e(this).attr("rel")&&(n.gallerySelector=e.butterfly.conf.lightboxLinkSelector+'[rel="'+e(this).attr("rel")+'"]'),f=e("#jb-overlay").data("options")||{},e(this).data("options",n),e("#jb-overlay").data("options",n),e("#jb-window").append('<p id="jb-loading">Loading...</p>'),e("#jb-loading").attr("tabindex","0").focus(),e("#jb-overlay").is(":visible")?("fragment"===f.linkType&&f.reuseFragment&&(e(".jb-placeholder").after(e(f.href)),e(".jb-placeholder").remove(),e(f.href).disableFocussableElements()),e("#jb-window-content").hide().empty(),e("#jb-window").addClass("loading"),s.apply(this,[c])):(e(document.body).disableFocussableElements("#jb-window *"),e("#jb-close-button").hide(),e("#jb-gallery-controls").hide(),e("#jb-overlay").fadeIn(n.animationSpeed).centre(),e("#jb-window").addClass("loading").show(),n.zoomFromClicked?e("#jb-window-inner").css({top:e(this).offset().top,left:e(this).offset().left,width:e(this).width(),height:e(this).height()}):e("#jb-window-inner").css({width:"100px",height:"100px"}).centre(),s.apply(this,[c]))},c=function(){var t=e("#jb-overlay").data("options");e("#jb-window").restoreFocussableElements(),e("#jb-window").removeClass("loading"),setTimeout(function(){switch(e("#jb-window").removeClass("type-media type-image type-fragment type-ajax"),t.linkType){case"image":e("#jb-window").addClass("type-image type-media"),e("#jb-window-inner").css("overflow","hidden");break;case"fragment":e("#jb-window").addClass("type-fragment"),e("#jb-window-inner").css("overflow","auto");break;case"iframe":e("#jb-window").addClass("type-iframe"),e("#jb-window-inner").css("overflow","hidden");break;case"ajax":e("#jb-window").addClass("type-ajax"),e("#jb-window-inner").css("overflow","auto")}t.treatAsMedia&&e("#jb-window").addClass("type-media"),n.apply(this,[function(){var i;"iframe"===t.linkType&&e("#jb-window-content").css("visibility","visible"),e("#jb-window-content").fadeIn(t.animationSpeed,function(){e("#jb-window-content").focus(),e("#jb-loading").remove(),null!==t.callbackPostOpen&&"function"==typeof t.callbackPostOpen&&t.callbackPostOpen.apply(this),i=e("#jb-gallery-next"),t.preloadNextGalleryImage&&i.length>0&&i.is(":visible")&&"#"!==i.attr("href")&&b(i.attr("href"))&&e('<img src="'+i.attr("href")+'" alt="" />')})}])},0)},n=function(t){var i,n,a,o,l,s,r,d,c,h,b,f,w,g,y,j,m,v,k,x,C,I=e("#jb-overlay").data("options");"undefined"!=typeof I&&(i=parseInt(p(I.lightBoxMargin),10),n=e("#jb-window").width()-2*i,a=e("#jb-window").height()-2*i,o=p(I.contentDefaultWidth,n),l=p(I.contentDefaultHeight,a),s=p(I.mediaMaxWidth,n),r=p(I.mediaMaxHeight,a),null!==I.callbackPreResize&&"function"==typeof I.callbackPreResize&&I.callbackPreResize.apply(e("#jb-window"),[n,a,o,l,s,r]),"image"===I.linkType||I.treatAsMedia?(d=e("#jb-window-content").lightBoxContentWidth(),c=e("#jb-window-content").lightBoxContentHeight(),d>s&&(h=d/s,d=s,c/=h),c>r&&(h=c/r,c=r,d/=h),d>n&&(h=d/n,d=n,c*=h),c>a&&(h=c/a,c=a,d*=h)):"iframe"===I.linkType?(d=o,c=l):(d=e("#jb-window-content").lightBoxContentWidth(),d=""===o||"100%"===o||o>n?n:o,I.collapseHeightWhenPossible?(b=e("#jb-window-inner").width(),e("#jb-window-inner").animate({width:d},0),c=e("#jb-window-content").lightBoxContentHeight(!1),e("#jb-window-inner").width(b),c>a&&(c=a)):(c=e("#jb-window-content").lightBoxContentHeight(),c=""===l||"100%"===l||l>a?a:l)),f=u(d,c),w=I.animateResize?I.animationSpeed:0,e("#jb-close-button").hide(),e("#jb-gallery-controls").hide(),"iframe"===I.linkType&&e("#jb-window-inner iframe").css("visibility","hidden"),e("#jb-window-inner").animate({width:d,height:c,left:f[1],top:f[0]},w,0,function(){if(I=e("#jb-overlay").data("options"),d=e("#jb-window-inner").width(),c=e("#jb-window-inner").height(),"iframe"===I.linkType&&(e("#jb-window-inner iframe").width(d).height(c),e("#jb-window-inner iframe").css("visibility","visible")),e("#jb-close-button").length>0){switch(g=parseInt(e("#jb-close-button").width(),10),y=parseInt(e("#jb-close-button").height(),10),I.closeButtonCorner){case"tr":j=f[1]+d-g/2,m=f[0]-y/2;break;case"br":j=f[1]+d-g/2,m=f[0]+c-y/2;break;case"bl":j=f[1]-g/2,m=f[0]+c-y/2;break;default:j=f[1]-g/2,m=f[0]-y/2}e("#jb-close-button").css({position:"absolute","z-index":"999999",left:j,top:m}).show()}e("#jb-gallery-controls").is(".active")&&(v=f[0]+c/2-I.galleryControlHeight/2,k=f[1]-I.galleryControlWidth,e("#jb-gallery-prev").css({top:v,left:k}),x=f[0]+c/2-I.galleryControlHeight/2,C=f[1]+d,e("#jb-gallery-next").css({top:x,left:C}),e("#jb-gallery-controls").show()),null!==I.callbackPostResize&&"function"==typeof I.callbackPostResize&&I.callbackPostResize.apply(e("#jb-window"),[n,a,o,l,s,r]),"undefined"!=typeof t&&"undefined"!=typeof t.apply&&t.apply()}))},s=function(t){var i,n,a,o,l,s,r,d,c,b,u,w,g=e("#jb-overlay").data("options"),y=g.href;switch(g.captionMode){case"title":i=g.title?"<p class='jb-caption'><span>"+g.title+"</span></p>":"";break;case"text":i=g.linkText?"<p class='jb-caption'><span>"+g.linkText+"</span></p>":"";break;default:i=""}switch(e("#jb-window").removeClass("error-no-content"),n=e(g.gallerySelector),e("#jb-gallery-controls").removeClass("active"),n.length>1&&n.isInSet("#"+g.linkID)?(0===e("#jb-gallery-controls").length?(e("#jb-window").append('<div id="jb-gallery-controls"></div>'),a=e('<a id="jb-gallery-prev" href="#">Previous</a>').click(h),o=e('<a id="jb-gallery-next" href="#">Next</a>').click(h),e("#jb-gallery-controls").append(a).append(o),a.add(o).css({position:"absolute","z-index":"99999",display:"block",overflow:"hidden"})):(a=e("#jb-gallery-prev"),o=e("#jb-gallery-next"),a.add(o).removeClass("disabled").attr("tabindex","0").attr("title","").show()),e("#jb-gallery-controls").hide(),e("#jb-gallery-controls").addClass("active"),l=n.prevInSet("#"+g.linkID),l===!1&&(g.galleryLoops?l=n.lastInSet():(l=e('<a href="#" id=""></a>'),a.addClass("disabled").attr("tabindex","-1").hide())),a.attr("href",l.attr("href")).data("linkID",l.attr("id")).attr("title",e.trim(l.accessibleText())),s=n.nextInSet("#"+g.linkID),s===!1&&(g.galleryLoops?s=n.firstInSet():(s=e('<a href="#" id=""></a>'),o.addClass("disabled").attr("tabindex","-1").hide())),o.attr("href",s.attr("href")).data("linkID",s.attr("id")).attr("title",e.trim(s.accessibleText()))):e("#jb-gallery-controls").hide(),g.linkType){case"fragment":g.reuseFragment?(e(y).after('<span class="jb-placeholder"></span>'),e("#jb-window-content").empty().append(e(y))):e("#jb-window-content").empty().append(e(y).clone(!0)),f.apply(this,[g.linkType,y]),t.apply(this);break;case"image":e("#jb-window-content").empty().append('<img src="'+y+'" alt="" style="max-width: 100%; max-height: 100%; float: left;" />'+i),e("#jb-window-content img").error(function(){f.apply(this,[g.linkType,y,t])}).data("full-width","").data("full-height","").load(t);break;case"iframe":e("#jb-window-content").show().css("visibility","hidden"),e("#jb-window-content").empty().append('<iframe src="'+y+'" title="'+i+'" width="100%" height="1000" />'),e("#jb-window-content").css("visibility","hidden"),r=parseInt(p(g.lightBoxMargin),10),d=e("#jb-window").width()-2*r,c=e("#jb-window").height()-2*r,b=p(g.contentDefaultWidth,d),u=p(g.contentDefaultHeight,c),e("#jb-window-content > iframe").width(b).height(u).error(function(){f.apply(this,[g.linkType,y,t])}).load(t);break;default:e.ajaxSetup({cache:!0}),w=-1!==y.indexOf("#")?y.split("#").join(" #"):y,e("#jb-window-content").empty().load(w,function(){f.apply(this,[g.linkType,y]),t.apply(this)})}},f=function(t,i,n){var a,o=!1;("image"===t||0===e("#jb-window-content").children().length)&&(o=!0),o&&(a=e("#jb-overlay").data("options"),a.linkType="fragment",a.treatAsMedia=!1,e("#jb-overlay").data("options",a),e("#jb-window").removeClass("type-image type-media").addClass("type-fragment error-no-content"),e("#jb-window-content").empty().append("<p>There was an error loading lightbox content. <strong>"+e(a.trigger).text()+"</strong> (<samp>"+i+"</samp>) could not be found.</p>")),"undefined"!=typeof n&&n.apply(this)},a=function(t){var i,n,a;t&&t.preventDefault(),e("#jb-window:hidden").length||(i=e("#jb-overlay").data("options"),n=i.href,null!==i.callbackPreClose&&"function"==typeof i.callbackPreClose&&i.callbackPreClose.apply(i.trigger),"fragment"===i.linkType&&i.reuseFragment&&(e(".jb-placeholder").after(e(n)),e(".jb-placeholder").remove()),e(document.body).restoreFocussableElements(),e("#jb-overlay").fadeOut(i.animationSpeed),e("#jb-window").hide(),e("#jb-window-content").hide(),a=e(i.originalTrigger),"undefined"==typeof a.attr("tabindex")&&a.attr("tabindex",0),a.focus(),e("#jb-loading").remove(),null!==i.callbackPostClose&&"function"==typeof i.callbackPostClose&&i.callbackPostClose.apply(i.trigger),e.history.load(""))},e.fn.lightBoxContentWidth=function(){var t,i=this.closest("#jb-window"),n=e("#jb-window-inner"),a=i.hasClass("type-media")?!0:!1,o=i.hasClass("media-image")?!0:!1,l=n.width(),s=n.height(),r=n.css("left"),d=n.css("top");return n.css(e.browser.msie&&7===e.browser.version&&a&&o&&0===this.find("img").outerWidth(!0)?{width:"100%",height:"100%",left:0,top:0}:{width:"auto",height:"auto",left:0,top:0}),"none"===this.css("display")?(this.css("display","block"),t=a?this.find("img").outerWidth(!0):this.outerWidth(!0),this.css("display","none")):t=this.outerWidth(!0),n.css({left:r,top:d}),n.animate({width:l,height:s},0),t},e.fn.lightBoxContentHeight=function(t){var i,n=this.closest("#jb-window"),a=n.find("#jb-window-inner"),o=n.hasClass("type-media")?!0:!1,l=n.hasClass("media-image")?!0:!1,s=a.width(),r=a.height(),d=a.css("left"),c=a.css("top");return t="undefined"!=typeof t?t:!0,e.browser.msie&&7===e.browser.version&&o&&l&&0===this.find("img").outerWidth(!0)?(e("#jb-window-inner").height("100%"),t&&e("#jb-window-inner").width("100%").css({left:0,top:0})):(e("#jb-window-inner").height("auto"),t&&e("#jb-window-inner").width("auto").css({left:0,top:0})),"none"===this.css("display")?(this.css("display","block"),i=this.outerHeight(!0),this.css("display","none")):i=e(this).outerHeight(!0),e("#jb-window-inner").width(s).height(r).css({left:d,top:c}),i},d=function(t){var i=e("#jb-overlay").data("options");t.target===e("#jb-window").get(0)&&i.clickOverlayCloses&&a.apply()},r=function(t){var n;if(!e("#jb-overlay").is(":visible")||t.ctrlKey||t.altKey||t.shiftKey||t.metaKey)return!0;switch(n=i(t)){case DOM_VK_UP:case DOM_VK_LEFT:e("#jb-gallery-prev").click();break;case DOM_VK_DOWN:case DOM_VK_RIGHT:e("#jb-gallery-next").click();break;case DOM_VK_HOME:e(e("#jb-overlay").data("options").gallerySelector).firstInSet().click();break;case DOM_VK_END:e(e("#jb-overlay").data("options").gallerySelector).lastInSet().click();break;case DOM_VK_ESCAPE:a.apply();break;default:return!0}t.preventDefault()},h=function(t){var i,n=e(this);return t.preventDefault(),""!==n.data("linkID")?(e("#jb-gallery-controls").hide(),i=e("#"+n.data("linkID")),i.click()):void 0},e.fn.centre=function(){return this.css({position:"fixed",top:(e(window).height()-this.outerHeight())/2+"px",left:(e(window).width()-this.outerWidth())/2+"px"})},u=function(t,i){var n=(e(window).height()-i)/2,a=(e(window).width()-t)/2;return[n,a]},e.fn.isInSet=function(t){return-1!==this.index(e(t))},e.fn.nextInSet=function(t){var i=this.index(e(t));return this.length>i+1?this.eq(i+1):!1},e.fn.prevInSet=function(t){var i=this.index(e(t));return i>0?this.eq(i-1):!1},e.fn.firstInSet=function(){return this.length>0?this.eq(0):!1},e.fn.lastInSet=function(){return this.length>0?this.eq(-1):!1},b=function(e){if("undefined"==typeof e||""===e)return!1;var t=String(e).lastIndexOf(".");return-1===t?!1:/^\.(jpg|png|gif|bmp|jpeg)$/i.test(e.substring(t))},e.fn.disableFocussableElements=function(t){t=t||"";var i=this.find("a, input, button, area, frame, iframe, [tabindex]").not(t).not('*[tabindex="-1"]');i.each(function(){var t=e(this),i=t.attr("tabindex");i="undefined"==typeof i||""===i?"":i,t.data("prevTabIndex",i).addClass("jb-unfocussed").attr("tabindex","-1")})},e.fn.restoreFocussableElements=function(){var t=this.find(".jb-unfocussed");t.each(function(){var t=e(this),i=t.data("prevTabIndex");switch(i){case"":t.removeAttr("tabindex");break;default:t.attr("tabindex",i)}t.removeClass("jb-unfocussed")})},p=function(t,i){return i="undefined"!=typeof i?i:e(document.body).width(),t=t.replace("px","").replace(/^\s+|\s+$/g,""),isNaN(t)?"%"===t.substr(t.length-1)?"undefined"!=typeof i?(t=parseInt(t.substr(0,t.length-1).replace(/^\s+|\s+$/g,""),10),t/100*parseInt(i,10)):(e.debug("Warning: percentage unit was supplied to parsePixels() but could not be calculated because centDimension was not supplied."),parseInt(t,10)):"em"===t.substr(t.length-2)?"undefined"!=typeof Number.prototype.pxToEm?(t=parseInt(t.substr(0,t.length-2).replace(/^\s+|\s+$/g,""),10),t=t.pxToEm({reverse:!0}),t.substr(0,t.length-2)):(e.debug("Warning: em unit was supplied to parsePixels() but could not be calulated because pxToEm plugin was not found."),parseInt(t,10)):(e.debug("Warning: unknown unit was supplied. parsePixels() can support px, em or % units only."),parseInt(t,10)):parseInt(t,10)}}(jQuery,ResizeEvents);
diff --git a/public/opac/js/butterfly/jquery.history.js b/public/opac/js/butterfly/jquery.history.js
new file mode 100644
index 00000000000..7f91079d4a9
--- /dev/null
+++ b/public/opac/js/butterfly/jquery.history.js
@@ -0,0 +1,194 @@
+/*
+ * jQuery history plugin
+ * 
+ * The MIT License
+ * 
+ * Copyright (c) 2006-2009 Taku Sano (Mikage Sawatari)
+ * Copyright (c) 2010 Takayuki Miwa
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+(function($) {
+    var locationWrapper = {
+        put: function(hash, win) {
+            (win || window).location.hash = this.encoder(hash);
+        },
+        get: function(win) {
+            var hash = ((win || window).location.hash).replace(/^#/, '');
+            try {
+                return $.browser.mozilla ? hash : decodeURIComponent(hash);
+            }
+            catch (error) {
+                return hash;
+            }
+        },
+        encoder: encodeURIComponent
+    };
+
+    var iframeWrapper = {
+        id: "__jQuery_history",
+        init: function() {
+            var html = '<iframe id="'+ this.id +'" style="display:none" src="javascript:false;" />';
+            $("body").prepend(html);
+            return this;
+        },
+        _document: function() {
+            return $("#"+ this.id)[0].contentWindow.document;
+        },
+        put: function(hash) {
+            var doc = this._document();
+            doc.open();
+            doc.close();
+            locationWrapper.put(hash, doc);
+        },
+        get: function() {
+            return locationWrapper.get(this._document());
+        }
+    };
+
+    function initObjects(options) {
+        options = $.extend({
+                unescape: false
+            }, options || {});
+
+        locationWrapper.encoder = encoder(options.unescape);
+
+        function encoder(unescape_) {
+            if(unescape_ === true) {
+                return function(hash){ return hash; };
+            }
+            if(typeof unescape_ == "string" &&
+               (unescape_ = partialDecoder(unescape_.split("")))
+               || typeof unescape_ == "function") {
+                return function(hash) { return unescape_(encodeURIComponent(hash)); };
+            }
+            return encodeURIComponent;
+        }
+
+        function partialDecoder(chars) {
+            var re = new RegExp($.map(chars, encodeURIComponent).join("|"), "ig");
+            return function(enc) { return enc.replace(re, decodeURIComponent); };
+        }
+    }
+
+    var implementations = {};
+
+    implementations.base = {
+        callback: undefined,
+        type: undefined,
+
+        check: function() {},
+        load:  function(hash) {},
+        init:  function(callback, options) {
+            initObjects(options);
+            self.callback = callback;
+            self._options = options;
+            self._init();
+        },
+
+        _init: function() {},
+        _options: {}
+    };
+
+    implementations.timer = {
+        _appState: undefined,
+        _init: function() {
+            var current_hash = locationWrapper.get();
+            self._appState = current_hash;
+            self.callback(current_hash);
+            setInterval(self.check, 100);
+        },
+        check: function() {
+            var current_hash = locationWrapper.get();
+            if(current_hash != self._appState) {
+                self._appState = current_hash;
+                self.callback(current_hash);
+            }
+        },
+        load: function(hash) {
+            if(hash != self._appState) {
+                locationWrapper.put(hash);
+                self._appState = hash;
+                self.callback(hash);
+            }
+        }
+    };
+
+    implementations.iframeTimer = {
+        _appState: undefined,
+        _init: function() {
+            var current_hash = locationWrapper.get();
+            self._appState = current_hash;
+            iframeWrapper.init().put(current_hash);
+            self.callback(current_hash);
+            setInterval(self.check, 100);
+        },
+        check: function() {
+            var iframe_hash = iframeWrapper.get(),
+                location_hash = locationWrapper.get();
+
+            if (location_hash != iframe_hash) {
+                if (location_hash == self._appState) {    // user used Back or Forward button
+                    self._appState = iframe_hash;
+                    locationWrapper.put(iframe_hash);
+                    self.callback(iframe_hash); 
+                } else {                              // user loaded new bookmark
+                    self._appState = location_hash;  
+                    iframeWrapper.put(location_hash);
+                    self.callback(location_hash);
+                }
+            }
+        },
+        load: function(hash) {
+            if(hash != self._appState) {
+                locationWrapper.put(hash);
+                iframeWrapper.put(hash);
+                self._appState = hash;
+                self.callback(hash);
+            }
+        }
+    };
+
+    implementations.hashchangeEvent = {
+        _init: function() {
+            self.callback(locationWrapper.get());
+            $(window).bind('hashchange', self.check);
+        },
+        check: function() {
+            self.callback(locationWrapper.get());
+        },
+        load: function(hash) {
+            locationWrapper.put(hash);
+        }
+    };
+
+    var self = $.extend({}, implementations.base);
+
+    if($.browser.msie && ($.browser.version < 8 || document.documentMode < 8)) {
+        self.type = 'iframeTimer';
+    } else if("onhashchange" in window) {
+        self.type = 'hashchangeEvent';
+    } else {
+        self.type = 'timer';
+    }
+
+    $.extend(self, implementations[self.type]);
+    $.history = self;
+})(jQuery);
diff --git a/public/opac/js/butterfly/jquery.pxToEm.js b/public/opac/js/butterfly/jquery.pxToEm.js
new file mode 100644
index 00000000000..50bb9f41144
--- /dev/null
+++ b/public/opac/js/butterfly/jquery.pxToEm.js
@@ -0,0 +1,56 @@
+/*-------------------------------------------------------------------- 
+ * javascript method: "pxToEm"
+ * by:
+   Scott Jehl (scott@filamentgroup.com) 
+   Maggie Wachs (maggie@filamentgroup.com)
+   http://www.filamentgroup.com
+ *
+ * Copyright (c) 2008 Filament Group
+ * Dual licensed under the MIT (filamentgroup.com/examples/mit-license.txt) and GPL (filamentgroup.com/examples/gpl-license.txt) licenses.
+ *
+ * Description: Extends the native Number and String objects with pxToEm method. pxToEm converts a pixel value to ems depending on inherited font size.  
+ * Article: http://www.filamentgroup.com/lab/retaining_scalable_interfaces_with_pixel_to_em_conversion/
+ * Demo: http://www.filamentgroup.com/examples/pxToEm/	 	
+ *							
+ * Options:  	 								
+ 		scope: string or jQuery selector for font-size scoping
+ 		reverse: Boolean, true reverses the conversion to em-px
+ * Dependencies: jQuery library						  
+ * Usage Example: myPixelValue.pxToEm(); or myPixelValue.pxToEm({'scope':'#navigation', reverse: true});
+ *
+ * Version: 2.0, 08.01.2008 
+ * Changelog:
+ *		08.02.2007 initial Version 1.0
+ *		08.01.2008 - fixed font-size calculation for IE
+--------------------------------------------------------------------*/
+
+Number.prototype.pxToEm = String.prototype.pxToEm = function(settings){
+	//set defaults
+	settings = jQuery.extend({
+		scope: 'body',
+		reverse: false
+	}, settings);
+	
+	var pxVal = (this == '') ? 0 : parseFloat(this);
+	var scopeVal;
+	var getWindowWidth = function(){
+		var de = document.documentElement;
+		return self.innerWidth || (de && de.clientWidth) || document.body.clientWidth;
+	};	
+	
+	/* When a percentage-based font-size is set on the body, IE returns that percent of the window width as the font-size. 
+		For example, if the body font-size is 62.5% and the window width is 1000px, IE will return 625px as the font-size. 	
+		When this happens, we calculate the correct body font-size (%) and multiply it by 16 (the standard browser font size) 
+		to get an accurate em value. */
+				
+	if (settings.scope == 'body' && jQuery.browser.msie && (parseFloat(jQuery('body').css('font-size')) / getWindowWidth()).toFixed(1) > 0.0) {
+		var calcFontSize = function(){		
+			return (parseFloat(jQuery('body').css('font-size'))/getWindowWidth()).toFixed(3) * 16;
+		};
+		scopeVal = calcFontSize();
+	}
+	else { scopeVal = parseFloat(jQuery(settings.scope).css("font-size")); };
+			
+	var result = (settings.reverse == true) ? (pxVal * scopeVal).toFixed(2) + 'px' : (pxVal / scopeVal).toFixed(2) + 'em';
+	return result;
+};
\ No newline at end of file
diff --git a/public/opac/js/butterfly/jquery.resize-events.js b/public/opac/js/butterfly/jquery.resize-events.js
new file mode 100644
index 00000000000..2c9cae82a20
--- /dev/null
+++ b/public/opac/js/butterfly/jquery.resize-events.js
@@ -0,0 +1,173 @@
+/**
+ * Resize Events
+ * @version 0.7
+ * Changelog:
+ *   * 0.5 Added API bind() function to make it easier to add listeners.
+ *   * 0.6 Added support for window height changes
+ *   * 0.7 Clean up outstanding bugs (duplicate event firing) and refactor.
+ * 
+ * There is no standard event for when a user resizes the text in their browser.
+ * There is also no consistency between browser implementations of the window resize event
+ * (some trigger as the window is resized, some only trigger as the user drops the resize handle).
+ * This extension polls to detect these changes, and reports them immediately as custom events
+ * ('x-text-resize' and 'x-window-resize') that other code can listen for and react to accordingly.
+ * Resize Events also send an 'x-initial-size' event on load.
+ * 
+ * The custom events triggered are sent with emPixels, textHeight and windowWidth variables.
+ * emPixels is a unit that estimates much space you have to work with but is resolution, text size
+ * and zoom level independant. Use this value to base layout decisions on, and the layout will
+ * always fit.
+ * 
+ * This extension is based on the 'text resize' events work of Lawrence Carvalho <http://www.alistapart.com/articles/fontresizing/>.
+ * 
+ * @author Lawrence Carvalho <carvalho@uk.yahoo-inc.com>
+ * @author Andrew Ramsden <http://irama.org/>
+ * 
+ * @see http://irama.org/web/dhtml/resize-events/
+ * @license GNU GENERAL PUBLIC LICENSE (GPL) <http://www.gnu.org/licenses/gpl.html>
+ * @requires jQuery (tested with 1.4.2) <http://jquery.com/>
+ */
+var ResizeEvents = {
+	baseTextHeight      : null,
+	currentTextHeight   : null,
+	baseWindowWidth     : null,
+	baseWindowHeight    : null,
+	currentWindowWidth  : null,
+	currentWindowHeight : null,
+	initialised         : false,
+	intervalReference   : null,
+	textSizeTestElement : null,
+	eventElement        : jQuery(document),
+	conf                : {
+		textResizeEvent          : 'x-text-resize',
+		windowResizeEvent        : 'x-window-resize',
+		windowWidthResizeEvent   : 'x-window-width-resize',
+		windowHeightResizeEvent  : 'x-window-height-resize',
+		initialResizeEvent       : 'x-initial-sizes',
+		pollFrequency            : 500,
+		textSizeTestElId         : 'text-resize'
+	}
+};
+
+ // start closure (protects variables from global scope)
+(function($){
+	
+	
+	/**
+	 * A simple way to add a listener for resize events.
+	 * 
+	 * @param String events A space delimited list of events that should trigger this handler.
+	 * @param function handler The handler function to be called when an event occurs.
+	 */
+	ResizeEvents.bind = function (events, handler) {
+		
+		// on DOMReady
+			$(function(){
+				// initialise if it hasn't happened already
+					if (ResizeEvents.initialised !== true) {
+						ResizeEvents.initialise();
+					}
+			});
+		
+		ResizeEvents.eventElement.bind(
+			events,
+			handler
+		);
+	};
+	
+	/**
+	 * Initialisation
+	 */
+	ResizeEvents.initialise = function () {
+		
+		if (ResizeEvents.initialised === true) {
+			return; // already initialised
+		}
+		
+		// create text resize control element, and push it offscreen
+			ResizeEvents.textSizeTestElement = $(
+				'<span id="'+ResizeEvents.conf.textSizeTestElId+'" style="position: absolute; left: -9999px; '+
+				'font-size: 100%; font-family: Courier New, mono; margin: 0; padding: 0;">&nbsp;</span>'
+			).get(0);
+			
+		// append control element
+			$('body').append(ResizeEvents.textSizeTestElement);
+		
+		// initialise variables
+			windowWidthNow = $(window).width();
+			windowHeightNow = $(window).height();
+			textHeightNow = getTextHeight();
+			ResizeEvents.baseTextHeight = textHeightNow;
+			ResizeEvents.currentTextHeight = textHeightNow;
+			ResizeEvents.baseWindowWidth = windowWidthNow;
+			ResizeEvents.currentWindowWidth = windowWidthNow;
+			ResizeEvents.baseWindowHeight = windowHeightNow;
+			ResizeEvents.currentWindowHeight = windowHeightNow;
+		
+		// start polling
+			if (ResizeEvents.intervalReference == null) {
+				ResizeEventsPoll();
+				ResizeEvents.intervalReference = window.setInterval('ResizeEventsPoll()', ResizeEvents.conf.pollFrequency);
+			}
+		
+		// trigger onload
+			ResizeEvents.eventElement.trigger(ResizeEvents.conf.initialResizeEvent, [emPixelNow, textHeightNow, windowWidthNow, windowHeightNow]);
+				
+		// flag initialisation complete
+			ResizeEvents.initialised = true;
+		
+		
+	};
+	
+	/**
+	 * This function is called a number of times each second to check if text size 
+	 * or window size has changed
+	 */
+	ResizeEventsPoll = function () {
+		
+		// get current values
+			windowWidthNow = $(window).width();
+			windowHeightNow = $(window).height();
+			textHeightNow = getTextHeight();
+			emPixelNow = windowWidthNow/textHeightNow;
+			widthChanged = false;
+		
+		// test for window width change
+			if (ResizeEvents.currentWindowWidth != windowWidthNow) {
+				// Send custom event
+					ResizeEvents.eventElement.trigger(ResizeEvents.conf.windowWidthResizeEvent, [emPixelNow, textHeightNow, windowWidthNow, windowHeightNow]);
+					ResizeEvents.eventElement.trigger(ResizeEvents.conf.windowResizeEvent, [emPixelNow, textHeightNow, windowWidthNow, windowHeightNow]);
+				// update current height
+					ResizeEvents.currentWindowWidth = windowWidthNow;
+					widthChanged = true;
+			}
+		
+		// test for window height change
+			if (ResizeEvents.currentWindowHeight != windowHeightNow) {
+				// Send custom event
+					ResizeEvents.eventElement.trigger(ResizeEvents.conf.windowHeightResizeEvent, [emPixelNow, textHeightNow, windowWidthNow, windowHeightNow]);
+					if (!widthChanged) { // don't send window-resize event twice
+						ResizeEvents.eventElement.trigger(ResizeEvents.conf.windowResizeEvent, [emPixelNow, textHeightNow, windowWidthNow, windowHeightNow]);
+					}
+				// update current height
+					ResizeEvents.currentWindowHeight = windowHeightNow;
+			}
+		
+		
+		// test for text size change
+			if (ResizeEvents.currentTextHeight != textHeightNow) {
+				// Send custom event (with new text size)
+					ResizeEvents.eventElement.trigger(ResizeEvents.conf.textResizeEvent, [emPixelNow, textHeightNow, windowWidthNow, windowHeightNow]);
+				// update current height
+					ResizeEvents.currentTextHeight = textHeightNow;
+			}
+	};
+	
+	/**
+	 * @return The current text height in pixels
+	 */
+	getTextHeight = function () {
+		return ResizeEvents.textSizeTestElement.offsetHeight+'';
+	};
+	
+})(jQuery); /* end closure */
\ No newline at end of file
diff --git a/public/opac/js/butterfly/loading-black-on-white.gif b/public/opac/js/butterfly/loading-black-on-white.gif
new file mode 100644
index 0000000000000000000000000000000000000000..b50e9f9bb214b0ce18d12110a9f9bda61a9ad46e
GIT binary patch
literal 5559
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
MLTsGI1&USw33@~)(f|Me

literal 0
HcmV?d00001

diff --git a/public/opac/js/butterfly/reactive-overlay.png b/public/opac/js/butterfly/reactive-overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..0b89c400208e949e869970cbb6152c2f657c3283
GIT binary patch
literal 962
zcmV;z13mnSP)<h;3K|Lk000e1NJLTq001`t001@!1^@s6V}}9b0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#WJyFpRCwC#na^($Q4q%$Xpodzpom%!
z6e}u;J*lV01L0sKT)fqzcTD&Tdf>_*z!5`gjU38>9=tT1xS-fTDx~VA#fnuF3rdkv
z=nOuR4S@pPef)TKk_pQ$n|+_WneWUj67HWp1ebG+nUs7UaSYmj0e8qU+}|^}F@-Cg
z!Hp^0Z`R>ztish;+&wAp_y@~yd72MeT3WgtjYb!JKHvRb@3GlzYP=^L4nI;T6q0_Q
zDdQbumoi5S4xkpzX7e4ed9c#z>grB6us|U2Ot079Fquqqxm+$CkH_~<yK`mm0xh^N
zV9jHP!|`}|dHF#%Fr`wdX)LT<E^KUU<b{MK+BaHoPNy@pwYBxG8(=#yx7+QD#bQOF
zaJ#hNV3BoL_=|Kp{k9WeC$L~JxObXo%38i-k7=MaxK^uGZe?X<6QHy@olcMEEEbCu
zb1<LJ7sLcZYo|ar!Ee!2PE@}2_4OxKtMy*<T%}Se$>s7%vB27eB^s(&ohBTHsNHUV
z$q!Mn!8*aAYVL8A4FNqK&ua+P3jaK);u|r*+T|R_n-Z?lghTQ0`~5Bm(JB6UqtST1
zmpUi}4tH+`TuBS8RXj48%m<A|bBQl9LII^GT>CgEFwC)qg@xykgRx!<y-+x8q<;<q
z40DW#%quYgrCqM42LaZiqM`xHx?Dd1$Aq623b(el_Ef9Y8oJ3nDfI6FN&|)7(9FSX
zHoKWfB#L7099oJK;k{-Ntk*i$x`P0Gm`o=3`+a7wGtxEic_DBrl}hGvx#m)-R6Z06
zeeboC@p`>?K{Y=`B9ULT;P7`C_o{K4#ASW_7S;1gpZAOnT!nNldKTdtx`3$wu4WMq
z4aMLx_&FBg>SSub8Z^NgT%+`m_brA|78oH5tMC+5${JjAG}<Q$Dq#%{?GKqAW=CxY
z#mbihl7q9OBr;-(0lpT@g5xwTXAO=c)59(qk(8{#p&b!G{Lk;gFolL@jY5&hfnOX}
z9?~wrC^Vl*tEOTNt{J9Z$u6n~*^>^kb;4cTA)+%gh?+Qzz7YRJ+$Ih9G|e>(tLd$g
zFx@6ixQfPFMx`H|ApI#e;ab+<_=c0diHuWItikb3N$RAQxSS=pRzm^8*YW4UCkgx%
kD{v=4OL)hPGIK1z0KEN??=fJuM*si-07*qoM6N<$g7P%D00000

literal 0
HcmV?d00001

diff --git a/public/opac/js/butterfly/reactive-overlay.psd b/public/opac/js/butterfly/reactive-overlay.psd
new file mode 100644
index 0000000000000000000000000000000000000000..1d574af2f46064a4c617a7f4945904b32cfcbd36
GIT binary patch
literal 162454
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

literal 0
HcmV?d00001

-- 
GitLab