[Libreoffice-commits] online.git: Branch 'distro/collabora/collabora-online-1-0' - 2 commits - loleaflet/dist loleaflet/src loolwsd/LOOLWSD.cpp loolwsd/test

Pranav Kant pranavk at collabora.co.uk
Sat Oct 1 04:59:21 UTC 2016


 loleaflet/dist/l10n/help-localizations.json   |  232 ++++++++++++-------------
 loleaflet/dist/l10n/localizations.json        |  232 ++++++++++++-------------
 loleaflet/dist/l10n/styles-localizations.json |  238 +++++++++++++-------------
 loleaflet/dist/l10n/uno-localizations.json    |  238 +++++++++++++-------------
 loleaflet/dist/toolbar.css                    |  108 +++++------
 loleaflet/src/core/Socket.js                  |    8 
 loleaflet/src/layer/marker/ProgressOverlay.js |    3 
 loleaflet/src/layer/tile/TileLayer.js         |    2 
 loleaflet/src/map/Map.js                      |   35 ++-
 loleaflet/src/map/handler/Map.FileInserter.js |    3 
 loolwsd/LOOLWSD.cpp                           |   63 ++++--
 loolwsd/test/UnitAdmin.cpp                    |    9 
 loolwsd/test/helpers.hpp                      |    5 
 loolwsd/test/httpwstest.cpp                   |   16 -
 14 files changed, 617 insertions(+), 575 deletions(-)

New commits:
commit 998f68d0ccf9313f783223d7cfd573d5b2123910
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Tue Sep 20 15:15:56 2016 +0530

    Fix leaked connecting spinner; smooth reconnection
    
    Also, if doc is already loaded, and we try to reconnect a
    disconnected session, show spinner on bottom toolbar instead of
    on the document.
    
    List of cherry-picked commits:
    
    loleaflet: Fix some cases of leaked connecting spinner
    (cherry picked from commit f84cad1e8d8ac18cc39e68a156ed06961875e349)
    
    loleaflet: Set permission to default after reconnecting
    (cherry picked from commit 7db798992fac2975e7b785ef4c6c42bf5b3c0e21)
    
    loleaflet: Smooth reconnection of documents
    (cherry picked from commit 460ca57dab5aae99f10439dd0f66e7ebe89396c3)
    
    loleaflet: Start spinner when added to map
    (cherry picked from commit afe14df0476835b49d4d12a56e263a52c86dbd9b)
    
    loleaflet: Better to have 'reconnected' signal here
    (cherry picked from commit c23b37f352ec3ddf83f4d4d4a8ab1290368113fa)
    
    loleaflet: Move loading spinner to toolbar-down when doc loaded
    (cherry picked from commit b6448a8864aa05a9f779447cc43abcd47158e5dd)

diff --git a/loleaflet/src/core/Socket.js b/loleaflet/src/core/Socket.js
index 0c3c89f..abf9165 100644
--- a/loleaflet/src/core/Socket.js
+++ b/loleaflet/src/core/Socket.js
@@ -75,7 +75,6 @@ L.Socket = L.Class.extend({
 		if (this._map._docLayer) {
 			// we are reconnecting after a lost connection
 			msg += ' part=' + this._map.getCurrentPartNumber();
-			this._map.fire('statusindicator', {statusType : 'reconnected'});
 		}
 		if (this._map.options.timestamp) {
 			msg += ' timestamp=' + this._map.options.timestamp;
@@ -263,6 +262,11 @@ L.Socket = L.Class.extend({
 			this._map._docLayer = docLayer;
 			this._map.addLayer(docLayer);
 			this._map.fire('doclayerinit');
+		} else if (textMsg.startsWith('status:')) {
+			// we are reconnecting ...
+			this._map._docLayer._onMessage('invalidatetiles: EMPTY', null);
+			this._map.fire('statusindicator', {statusType: 'reconnected'});
+			this._map.setPermission(this._map.options.permission);
 		}
 
 		// these can arrive very early during the startup
diff --git a/loleaflet/src/layer/marker/ProgressOverlay.js b/loleaflet/src/layer/marker/ProgressOverlay.js
index 91785e9..a6f7e35 100644
--- a/loleaflet/src/layer/marker/ProgressOverlay.js
+++ b/loleaflet/src/layer/marker/ProgressOverlay.js
@@ -20,6 +20,7 @@ L.ProgressOverlay = L.Layer.extend({
 			this.update();
 		}
 
+		this._spinnerInterval = L.LOUtil.startSpinner(this._spinnerCanvas, this.options.spinnerSpeed);
 		this._map.on('moveend', this.update, this);
 	},
 
@@ -56,8 +57,6 @@ L.ProgressOverlay = L.Layer.extend({
 
 		this._container.style.width  = this._size.x + 'px';
 
-		this._spinnerInterval = L.LOUtil.startSpinner(this._spinnerCanvas, this.options.spinnerSpeed);
-
 		L.DomEvent
 			.disableClickPropagation(this._progress)
 			.disableScrollPropagation(this._container);
diff --git a/loleaflet/src/map/Map.js b/loleaflet/src/map/Map.js
index 7467a8e..ea3f06f 100644
--- a/loleaflet/src/map/Map.js
+++ b/loleaflet/src/map/Map.js
@@ -2,7 +2,7 @@
  * L.Map is the central class of the API - it is used to create a map.
  */
 
-/* global vex $ */
+/* global vex $ w2ui w2utils */
 L.Map = L.Evented.extend({
 
 	options: {
@@ -129,6 +129,13 @@ L.Map = L.Evented.extend({
 	},
 
 	showBusy: function(label, bar) {
+		// If document is already loaded, ask the toolbar widget to show busy
+		// status on the bottom statusbar
+		if (this._docLayer) {
+			w2utils.lock(w2ui['toolbar-down'].box, label, true);
+			return;
+		}
+
 		this._progressBar.setLabel(label);
 		this._progressBar.setBar(bar);
 		this._progressBar.setValue(0);
@@ -139,7 +146,13 @@ L.Map = L.Evented.extend({
 	},
 
 	hideBusy: function () {
-		this.removeLayer(this._progressBar);
+		if (w2ui['toolbar-down'].box.firstChild.className === 'w2ui-lock') {
+			w2utils.unlock(w2ui['toolbar-down'].box);
+		}
+
+		if (this.hasLayer(this._progressBar)) {
+			this.removeLayer(this._progressBar);
+		}
 	},
 
 	setZoom: function (zoom, options) {
@@ -696,18 +709,20 @@ L.Map = L.Evented.extend({
 		clearTimeout(vex.timer);
 
 		if (!this._active) {
-			this._socket.sendMessage('useractive');
-
 			// Only activate when we are connected.
 			if (this._socket.connected()) {
+				this._socket.sendMessage('useractive');
 				this._active = true;
 				this._docLayer._onMessage('invalidatetiles: EMPTY', null);
+			} else {
+				this._active = true;
+				this._socket.initialize(this);
+			}
 
-				if (vex.dialogID > 0) {
-					var id = vex.dialogID;
-					vex.dialogID = -1;
-					return vex.close(id);
-				}
+			if (vex.dialogID > 0) {
+				var id = vex.dialogID;
+				vex.dialogID = -1;
+				return vex.close(id);
 			}
 		}
 
@@ -809,7 +824,7 @@ L.Map = L.Evented.extend({
 		else if (e.statusType === 'setvalue') {
 			this._progressBar.setValue(e.value);
 		}
-		else if (e.statusType === 'finish' || e.statusType === 'loleafletloaded') {
+		else if (e.statusType === 'finish' || e.statusType === 'loleafletloaded' || e.statusType === 'reconnected') {
 			this.hideBusy();
 		}
 	},
commit c330438526d6b90c829c90d1685b9d9d5751bdbd
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Thu Sep 29 08:22:01 2016 +0530

    HA: Consistent url scheme to support load-balancing
    
    The main purpose behind changing these urls is
    to help in load-balancing. The first two parts of the URL can now
    be used in a hash-based load-balancing algorithm which decides which
    slave gets to serve the requests. Requests such as insertfile,
    downloadas need to end up in the same slave in which document was opened.
    /lool/docurl/ i.e first two parts of the URL are constant for all
    the requests that should be served by a single slave.
    
    List of cherry-picked commits:
    Serve all assets (l10n, images etc.) versioned
    (cherry picked from commit 12dee85ef8c4c8a2d849f32b13c6ccc5053af84a)
    
    Change insertfile URI to include doc key in it
    (cherry picked from commit 8c61ee3c949cb654eb1d36393c7776290a28d26a)
    
    Include docurl in document download requests
    (cherry picked from commit 8330341a8a6c66353f787b2136ccc44287f85dbc)
    
    Change main websocket url for consistency with other urls
    (cherry picked from commit d5f8c5b2e62f279d52673f297515fadcd1a6915c)
    
    Additionally, also fix testEditLock to adapt to new ws url
    
    Change-Id: I6deb9ce52ec0c9316f0b1ec2ec3cc4953a8e5845

diff --git a/loleaflet/dist/l10n/help-localizations.json b/loleaflet/dist/l10n/help-localizations.json
index 43b1bc4..8499ea7 100644
--- a/loleaflet/dist/l10n/help-localizations.json
+++ b/loleaflet/dist/l10n/help-localizations.json
@@ -1,119 +1,119 @@
 {
     "en": false,
-    "ab": "/loleaflet/dist/l10n/help-ab.json",
-    "af": "/loleaflet/dist/l10n/help-af.json",
-    "am": "/loleaflet/dist/l10n/help-am.json",
-    "an": "/loleaflet/dist/l10n/help-an.json",
-    "ar": "/loleaflet/dist/l10n/help-ar.json",
-    "as": "/loleaflet/dist/l10n/help-as.json",
-    "ast": "/loleaflet/dist/l10n/help-ast.json",
-    "az": "/loleaflet/dist/l10n/help-az.json",
-    "be": "/loleaflet/dist/l10n/help-be.json",
-    "bg": "/loleaflet/dist/l10n/help-bg.json",
-    "bn-in": "/loleaflet/dist/l10n/help-bn_IN.json",
-    "bn": "/loleaflet/dist/l10n/help-bn.json",
-    "bo": "/loleaflet/dist/l10n/help-bo.json",
-    "br": "/loleaflet/dist/l10n/help-br.json",
-    "brx": "/loleaflet/dist/l10n/help-brx.json",
-    "bs": "/loleaflet/dist/l10n/help-bs.json",
-    "ca": "/loleaflet/dist/l10n/help-ca.json",
-    "cs": "/loleaflet/dist/l10n/help-cs.json",
-    "cy": "/loleaflet/dist/l10n/help-cy.json",
-    "da": "/loleaflet/dist/l10n/help-da.json",
-    "de": "/loleaflet/dist/l10n/help-de.json",
-    "dgo": "/loleaflet/dist/l10n/help-dgo.json",
-    "dz": "/loleaflet/dist/l10n/help-dz.json",
-    "el": "/loleaflet/dist/l10n/help-el.json",
-    "en-gb": "/loleaflet/dist/l10n/help-en_GB.json",
-    "en-za": "/loleaflet/dist/l10n/help-en_ZA.json",
-    "eo": "/loleaflet/dist/l10n/help-eo.json",
-    "es": "/loleaflet/dist/l10n/help-es.json",
-    "et": "/loleaflet/dist/l10n/help-et.json",
-    "eu": "/loleaflet/dist/l10n/help-eu.json",
-    "fa": "/loleaflet/dist/l10n/help-fa.json",
-    "fi": "/loleaflet/dist/l10n/help-fi.json",
-    "fr": "/loleaflet/dist/l10n/help-fr.json",
-    "ga": "/loleaflet/dist/l10n/help-ga.json",
-    "gd": "/loleaflet/dist/l10n/help-gd.json",
-    "gl": "/loleaflet/dist/l10n/help-gl.json",
-    "gn": "/loleaflet/dist/l10n/help-gug.json",
-    "gu": "/loleaflet/dist/l10n/help-gu.json",
-    "he": "/loleaflet/dist/l10n/help-he.json",
-    "hi": "/loleaflet/dist/l10n/help-hi.json",
-    "hr": "/loleaflet/dist/l10n/help-hr.json",
-    "hu": "/loleaflet/dist/l10n/help-hu.json",
-    "id": "/loleaflet/dist/l10n/help-id.json",
-    "is": "/loleaflet/dist/l10n/help-is.json",
-    "it": "/loleaflet/dist/l10n/help-it.json",
-    "ja": "/loleaflet/dist/l10n/help-ja.json",
-    "jv": "/loleaflet/dist/l10n/help-jv.json",
-    "ka": "/loleaflet/dist/l10n/help-ka.json",
-    "kk": "/loleaflet/dist/l10n/help-kk.json",
-    "kl": "/loleaflet/dist/l10n/help-kl.json",
-    "km": "/loleaflet/dist/l10n/help-km.json",
-    "kn": "/loleaflet/dist/l10n/help-kn.json",
-    "kok": "/loleaflet/dist/l10n/help-kok.json",
-    "ko": "/loleaflet/dist/l10n/help-ko.json",
-    "ks": "/loleaflet/dist/l10n/help-ks.json",
-    "ky": "/loleaflet/dist/l10n/help-ky.json",
-    "lb": "/loleaflet/dist/l10n/help-lb.json",
-    "lo": "/loleaflet/dist/l10n/help-lo.json",
-    "lt": "/loleaflet/dist/l10n/help-lt.json",
-    "lv": "/loleaflet/dist/l10n/help-lv.json",
-    "mai": "/loleaflet/dist/l10n/help-mai.json",
-    "mk": "/loleaflet/dist/l10n/help-mk.json",
-    "ml": "/loleaflet/dist/l10n/help-ml.json",
-    "mni": "/loleaflet/dist/l10n/help-mni.json",
-    "mn": "/loleaflet/dist/l10n/help-mn.json",
-    "mr": "/loleaflet/dist/l10n/help-mr.json",
-    "my": "/loleaflet/dist/l10n/help-my.json",
-    "nb": "/loleaflet/dist/l10n/help-nb.json",
-    "ne": "/loleaflet/dist/l10n/help-ne.json",
-    "nl": "/loleaflet/dist/l10n/help-nl.json",
-    "nn": "/loleaflet/dist/l10n/help-nn.json",
-    "nr": "/loleaflet/dist/l10n/help-nr.json",
-    "nso": "/loleaflet/dist/l10n/help-nso.json",
-    "oc": "/loleaflet/dist/l10n/help-oc.json",
-    "om": "/loleaflet/dist/l10n/help-om.json",
-    "or": "/loleaflet/dist/l10n/help-or.json",
-    "pa-in": "/loleaflet/dist/l10n/help-pa_IN.json",
-    "pl": "/loleaflet/dist/l10n/help-pl.json",
-    "pt-br": "/loleaflet/dist/l10n/help-pt_BR.json",
-    "pt": "/loleaflet/dist/l10n/help-pt.json",
-    "ro": "/loleaflet/dist/l10n/help-ro.json",
-    "ru": "/loleaflet/dist/l10n/help-ru.json",
-    "rw": "/loleaflet/dist/l10n/help-rw.json",
-    "sah": "/loleaflet/dist/l10n/help-sah.json",
-    "sa": "/loleaflet/dist/l10n/help-sa_IN.json",
-    "sat": "/loleaflet/dist/l10n/help-sat.json",
-    "sd": "/loleaflet/dist/l10n/help-sd.json",
-    "sid": "/loleaflet/dist/l10n/help-sid.json",
-    "si": "/loleaflet/dist/l10n/help-si.json",
-    "sk": "/loleaflet/dist/l10n/help-sk.json",
-    "sl": "/loleaflet/dist/l10n/help-sl.json",
-    "sq": "/loleaflet/dist/l10n/help-sq.json",
-    "sr": "/loleaflet/dist/l10n/help-sr.json",
-    "ss": "/loleaflet/dist/l10n/help-ss.json",
-    "st": "/loleaflet/dist/l10n/help-st.json",
-    "sv": "/loleaflet/dist/l10n/help-sv.json",
-    "sw": "/loleaflet/dist/l10n/help-sw_TZ.json",
-    "ta": "/loleaflet/dist/l10n/help-ta.json",
-    "te": "/loleaflet/dist/l10n/help-te.json",
-    "tg": "/loleaflet/dist/l10n/help-tg.json",
-    "th": "/loleaflet/dist/l10n/help-th.json",
-    "ti": "/loleaflet/dist/l10n/help-ti.json",
-    "tn": "/loleaflet/dist/l10n/help-tn.json",
-    "tr": "/loleaflet/dist/l10n/help-tr.json",
-    "ts": "/loleaflet/dist/l10n/help-ts.json",
-    "tt": "/loleaflet/dist/l10n/help-tt.json",
-    "ug": "/loleaflet/dist/l10n/help-ug.json",
-    "uk": "/loleaflet/dist/l10n/help-uk.json",
-    "ur": "/loleaflet/dist/l10n/help-ur.json",
-    "uz": "/loleaflet/dist/l10n/help-uz.json",
-    "ve": "/loleaflet/dist/l10n/help-ve.json",
-    "vi": "/loleaflet/dist/l10n/help-vi.json",
-    "xh": "/loleaflet/dist/l10n/help-xh.json",
-    "zh-cn": "/loleaflet/dist/l10n/help-zh_CN.json",
-    "zh-tw": "/loleaflet/dist/l10n/help-zh_TW.json",
-    "zu": "/loleaflet/dist/l10n/help-zu.json"
+    "ab": "l10n/help-ab.json",
+    "af": "l10n/help-af.json",
+    "am": "l10n/help-am.json",
+    "an": "l10n/help-an.json",
+    "ar": "l10n/help-ar.json",
+    "as": "l10n/help-as.json",
+    "ast": "l10n/help-ast.json",
+    "az": "l10n/help-az.json",
+    "be": "l10n/help-be.json",
+    "bg": "l10n/help-bg.json",
+    "bn-in": "l10n/help-bn_IN.json",
+    "bn": "l10n/help-bn.json",
+    "bo": "l10n/help-bo.json",
+    "br": "l10n/help-br.json",
+    "brx": "l10n/help-brx.json",
+    "bs": "l10n/help-bs.json",
+    "ca": "l10n/help-ca.json",
+    "cs": "l10n/help-cs.json",
+    "cy": "l10n/help-cy.json",
+    "da": "l10n/help-da.json",
+    "de": "l10n/help-de.json",
+    "dgo": "l10n/help-dgo.json",
+    "dz": "l10n/help-dz.json",
+    "el": "l10n/help-el.json",
+    "en-gb": "l10n/help-en_GB.json",
+    "en-za": "l10n/help-en_ZA.json",
+    "eo": "l10n/help-eo.json",
+    "es": "l10n/help-es.json",
+    "et": "l10n/help-et.json",
+    "eu": "l10n/help-eu.json",
+    "fa": "l10n/help-fa.json",
+    "fi": "l10n/help-fi.json",
+    "fr": "l10n/help-fr.json",
+    "ga": "l10n/help-ga.json",
+    "gd": "l10n/help-gd.json",
+    "gl": "l10n/help-gl.json",
+    "gn": "l10n/help-gug.json",
+    "gu": "l10n/help-gu.json",
+    "he": "l10n/help-he.json",
+    "hi": "l10n/help-hi.json",
+    "hr": "l10n/help-hr.json",
+    "hu": "l10n/help-hu.json",
+    "id": "l10n/help-id.json",
+    "is": "l10n/help-is.json",
+    "it": "l10n/help-it.json",
+    "ja": "l10n/help-ja.json",
+    "jv": "l10n/help-jv.json",
+    "ka": "l10n/help-ka.json",
+    "kk": "l10n/help-kk.json",
+    "kl": "l10n/help-kl.json",
+    "km": "l10n/help-km.json",
+    "kn": "l10n/help-kn.json",
+    "kok": "l10n/help-kok.json",
+    "ko": "l10n/help-ko.json",
+    "ks": "l10n/help-ks.json",
+    "ky": "l10n/help-ky.json",
+    "lb": "l10n/help-lb.json",
+    "lo": "l10n/help-lo.json",
+    "lt": "l10n/help-lt.json",
+    "lv": "l10n/help-lv.json",
+    "mai": "l10n/help-mai.json",
+    "mk": "l10n/help-mk.json",
+    "ml": "l10n/help-ml.json",
+    "mni": "l10n/help-mni.json",
+    "mn": "l10n/help-mn.json",
+    "mr": "l10n/help-mr.json",
+    "my": "l10n/help-my.json",
+    "nb": "l10n/help-nb.json",
+    "ne": "l10n/help-ne.json",
+    "nl": "l10n/help-nl.json",
+    "nn": "l10n/help-nn.json",
+    "nr": "l10n/help-nr.json",
+    "nso": "l10n/help-nso.json",
+    "oc": "l10n/help-oc.json",
+    "om": "l10n/help-om.json",
+    "or": "l10n/help-or.json",
+    "pa-in": "l10n/help-pa_IN.json",
+    "pl": "l10n/help-pl.json",
+    "pt-br": "l10n/help-pt_BR.json",
+    "pt": "l10n/help-pt.json",
+    "ro": "l10n/help-ro.json",
+    "ru": "l10n/help-ru.json",
+    "rw": "l10n/help-rw.json",
+    "sah": "l10n/help-sah.json",
+    "sa": "l10n/help-sa_IN.json",
+    "sat": "l10n/help-sat.json",
+    "sd": "l10n/help-sd.json",
+    "sid": "l10n/help-sid.json",
+    "si": "l10n/help-si.json",
+    "sk": "l10n/help-sk.json",
+    "sl": "l10n/help-sl.json",
+    "sq": "l10n/help-sq.json",
+    "sr": "l10n/help-sr.json",
+    "ss": "l10n/help-ss.json",
+    "st": "l10n/help-st.json",
+    "sv": "l10n/help-sv.json",
+    "sw": "l10n/help-sw_TZ.json",
+    "ta": "l10n/help-ta.json",
+    "te": "l10n/help-te.json",
+    "tg": "l10n/help-tg.json",
+    "th": "l10n/help-th.json",
+    "ti": "l10n/help-ti.json",
+    "tn": "l10n/help-tn.json",
+    "tr": "l10n/help-tr.json",
+    "ts": "l10n/help-ts.json",
+    "tt": "l10n/help-tt.json",
+    "ug": "l10n/help-ug.json",
+    "uk": "l10n/help-uk.json",
+    "ur": "l10n/help-ur.json",
+    "uz": "l10n/help-uz.json",
+    "ve": "l10n/help-ve.json",
+    "vi": "l10n/help-vi.json",
+    "xh": "l10n/help-xh.json",
+    "zh-cn": "l10n/help-zh_CN.json",
+    "zh-tw": "l10n/help-zh_TW.json",
+    "zu": "l10n/help-zu.json"
 }
diff --git a/loleaflet/dist/l10n/localizations.json b/loleaflet/dist/l10n/localizations.json
index 836b344..c0964d4 100644
--- a/loleaflet/dist/l10n/localizations.json
+++ b/loleaflet/dist/l10n/localizations.json
@@ -1,119 +1,119 @@
 {
     "en": false,
-    "ab": "/loleaflet/dist/l10n/ui-ab.json",
-    "af": "/loleaflet/dist/l10n/ui-af.json",
-    "am": "/loleaflet/dist/l10n/ui-am.json",
-    "an": "/loleaflet/dist/l10n/ui-an.json",
-    "ar": "/loleaflet/dist/l10n/ui-ar.json",
-    "as": "/loleaflet/dist/l10n/ui-as.json",
-    "ast": "/loleaflet/dist/l10n/ui-ast.json",
-    "az": "/loleaflet/dist/l10n/ui-az.json",
-    "be": "/loleaflet/dist/l10n/ui-be.json",
-    "bg": "/loleaflet/dist/l10n/ui-bg.json",
-    "bn-in": "/loleaflet/dist/l10n/ui-bn_IN.json",
-    "bn": "/loleaflet/dist/l10n/ui-bn.json",
-    "bo": "/loleaflet/dist/l10n/ui-bo.json",
-    "br": "/loleaflet/dist/l10n/ui-br.json",
-    "brx": "/loleaflet/dist/l10n/ui-brx.json",
-    "bs": "/loleaflet/dist/l10n/ui-bs.json",
-    "ca": "/loleaflet/dist/l10n/ui-ca.json",
-    "cs": "/loleaflet/dist/l10n/ui-cs.json",
-    "cy": "/loleaflet/dist/l10n/ui-cy.json",
-    "da": "/loleaflet/dist/l10n/ui-da.json",
-    "de": "/loleaflet/dist/l10n/ui-de.json",
-    "dgo": "/loleaflet/dist/l10n/ui-dgo.json",
-    "dz": "/loleaflet/dist/l10n/ui-dz.json",
-    "el": "/loleaflet/dist/l10n/ui-el.json",
-    "en-gb": "/loleaflet/dist/l10n/ui-en_GB.json",
-    "en-za": "/loleaflet/dist/l10n/ui-en_ZA.json",
-    "eo": "/loleaflet/dist/l10n/ui-eo.json",
-    "es": "/loleaflet/dist/l10n/ui-es.json",
-    "et": "/loleaflet/dist/l10n/ui-et.json",
-    "eu": "/loleaflet/dist/l10n/ui-eu.json",
-    "fa": "/loleaflet/dist/l10n/ui-fa.json",
-    "fi": "/loleaflet/dist/l10n/ui-fi.json",
-    "fr": "/loleaflet/dist/l10n/ui-fr.json",
-    "ga": "/loleaflet/dist/l10n/ui-ga.json",
-    "gd": "/loleaflet/dist/l10n/ui-gd.json",
-    "gl": "/loleaflet/dist/l10n/ui-gl.json",
-    "gn": "/loleaflet/dist/l10n/ui-gug.json",
-    "gu": "/loleaflet/dist/l10n/ui-gu.json",
-    "he": "/loleaflet/dist/l10n/ui-he.json",
-    "hi": "/loleaflet/dist/l10n/ui-hi.json",
-    "hr": "/loleaflet/dist/l10n/ui-hr.json",
-    "hu": "/loleaflet/dist/l10n/ui-hu.json",
-    "id": "/loleaflet/dist/l10n/ui-id.json",
-    "is": "/loleaflet/dist/l10n/ui-is.json",
-    "it": "/loleaflet/dist/l10n/ui-it.json",
-    "ja": "/loleaflet/dist/l10n/ui-ja.json",
-    "jv": "/loleaflet/dist/l10n/ui-jv.json",
-    "ka": "/loleaflet/dist/l10n/ui-ka.json",
-    "kk": "/loleaflet/dist/l10n/ui-kk.json",
-    "kl": "/loleaflet/dist/l10n/ui-kl.json",
-    "km": "/loleaflet/dist/l10n/ui-km.json",
-    "kn": "/loleaflet/dist/l10n/ui-kn.json",
-    "kok": "/loleaflet/dist/l10n/ui-kok.json",
-    "ko": "/loleaflet/dist/l10n/ui-ko.json",
-    "ks": "/loleaflet/dist/l10n/ui-ks.json",
-    "ky": "/loleaflet/dist/l10n/ui-ky.json",
-    "lb": "/loleaflet/dist/l10n/ui-lb.json",
-    "lo": "/loleaflet/dist/l10n/ui-lo.json",
-    "lt": "/loleaflet/dist/l10n/ui-lt.json",
-    "lv": "/loleaflet/dist/l10n/ui-lv.json",
-    "mai": "/loleaflet/dist/l10n/ui-mai.json",
-    "mk": "/loleaflet/dist/l10n/ui-mk.json",
-    "ml": "/loleaflet/dist/l10n/ui-ml.json",
-    "mni": "/loleaflet/dist/l10n/ui-mni.json",
-    "mn": "/loleaflet/dist/l10n/ui-mn.json",
-    "mr": "/loleaflet/dist/l10n/ui-mr.json",
-    "my": "/loleaflet/dist/l10n/ui-my.json",
-    "nb": "/loleaflet/dist/l10n/ui-nb.json",
-    "ne": "/loleaflet/dist/l10n/ui-ne.json",
-    "nl": "/loleaflet/dist/l10n/ui-nl.json",
-    "nn": "/loleaflet/dist/l10n/ui-nn.json",
-    "nr": "/loleaflet/dist/l10n/ui-nr.json",
-    "nso": "/loleaflet/dist/l10n/ui-nso.json",
-    "oc": "/loleaflet/dist/l10n/ui-oc.json",
-    "om": "/loleaflet/dist/l10n/ui-om.json",
-    "or": "/loleaflet/dist/l10n/ui-or.json",
-    "pa-in": "/loleaflet/dist/l10n/ui-pa_IN.json",
-    "pl": "/loleaflet/dist/l10n/ui-pl.json",
-    "pt-br": "/loleaflet/dist/l10n/ui-pt_BR.json",
-    "pt": "/loleaflet/dist/l10n/ui-pt.json",
-    "ro": "/loleaflet/dist/l10n/ui-ro.json",
-    "ru": "/loleaflet/dist/l10n/ui-ru.json",
-    "rw": "/loleaflet/dist/l10n/ui-rw.json",
-    "sah": "/loleaflet/dist/l10n/ui-sah.json",
-    "sa": "/loleaflet/dist/l10n/ui-sa_IN.json",
-    "sat": "/loleaflet/dist/l10n/ui-sat.json",
-    "sd": "/loleaflet/dist/l10n/ui-sd.json",
-    "sid": "/loleaflet/dist/l10n/ui-sid.json",
-    "si": "/loleaflet/dist/l10n/ui-si.json",
-    "sk": "/loleaflet/dist/l10n/ui-sk.json",
-    "sl": "/loleaflet/dist/l10n/ui-sl.json",
-    "sq": "/loleaflet/dist/l10n/ui-sq.json",
-    "sr": "/loleaflet/dist/l10n/ui-sr.json",
-    "ss": "/loleaflet/dist/l10n/ui-ss.json",
-    "st": "/loleaflet/dist/l10n/ui-st.json",
-    "sv": "/loleaflet/dist/l10n/ui-sv.json",
-    "sw": "/loleaflet/dist/l10n/ui-sw_TZ.json",
-    "ta": "/loleaflet/dist/l10n/ui-ta.json",
-    "te": "/loleaflet/dist/l10n/ui-te.json",
-    "tg": "/loleaflet/dist/l10n/ui-tg.json",
-    "th": "/loleaflet/dist/l10n/ui-th.json",
-    "ti": "/loleaflet/dist/l10n/ui-ti.json",
-    "tn": "/loleaflet/dist/l10n/ui-tn.json",
-    "tr": "/loleaflet/dist/l10n/ui-tr.json",
-    "ts": "/loleaflet/dist/l10n/ui-ts.json",
-    "tt": "/loleaflet/dist/l10n/ui-tt.json",
-    "ug": "/loleaflet/dist/l10n/ui-ug.json",
-    "uk": "/loleaflet/dist/l10n/ui-uk.json",
-    "ur": "/loleaflet/dist/l10n/ui-ur.json",
-    "uz": "/loleaflet/dist/l10n/ui-uz.json",
-    "ve": "/loleaflet/dist/l10n/ui-ve.json",
-    "vi": "/loleaflet/dist/l10n/ui-vi.json",
-    "xh": "/loleaflet/dist/l10n/ui-xh.json",
-    "zh-cn": "/loleaflet/dist/l10n/ui-zh_CN.json",
-    "zh-tw": "/loleaflet/dist/l10n/ui-zh_TW.json",
-    "zu": "/loleaflet/dist/l10n/ui-zu.json"
+    "ab": "l10n/ui-ab.json",
+    "af": "l10n/ui-af.json",
+    "am": "l10n/ui-am.json",
+    "an": "l10n/ui-an.json",
+    "ar": "l10n/ui-ar.json",
+    "as": "l10n/ui-as.json",
+    "ast": "l10n/ui-ast.json",
+    "az": "l10n/ui-az.json",
+    "be": "l10n/ui-be.json",
+    "bg": "l10n/ui-bg.json",
+    "bn-in": "l10n/ui-bn_IN.json",
+    "bn": "l10n/ui-bn.json",
+    "bo": "l10n/ui-bo.json",
+    "br": "l10n/ui-br.json",
+    "brx": "l10n/ui-brx.json",
+    "bs": "l10n/ui-bs.json",
+    "ca": "l10n/ui-ca.json",
+    "cs": "l10n/ui-cs.json",
+    "cy": "l10n/ui-cy.json",
+    "da": "l10n/ui-da.json",
+    "de": "l10n/ui-de.json",
+    "dgo": "l10n/ui-dgo.json",
+    "dz": "l10n/ui-dz.json",
+    "el": "l10n/ui-el.json",
+    "en-gb": "l10n/ui-en_GB.json",
+    "en-za": "l10n/ui-en_ZA.json",
+    "eo": "l10n/ui-eo.json",
+    "es": "l10n/ui-es.json",
+    "et": "l10n/ui-et.json",
+    "eu": "l10n/ui-eu.json",
+    "fa": "l10n/ui-fa.json",
+    "fi": "l10n/ui-fi.json",
+    "fr": "l10n/ui-fr.json",
+    "ga": "l10n/ui-ga.json",
+    "gd": "l10n/ui-gd.json",
+    "gl": "l10n/ui-gl.json",
+    "gn": "l10n/ui-gug.json",
+    "gu": "l10n/ui-gu.json",
+    "he": "l10n/ui-he.json",
+    "hi": "l10n/ui-hi.json",
+    "hr": "l10n/ui-hr.json",
+    "hu": "l10n/ui-hu.json",
+    "id": "l10n/ui-id.json",
+    "is": "l10n/ui-is.json",
+    "it": "l10n/ui-it.json",
+    "ja": "l10n/ui-ja.json",
+    "jv": "l10n/ui-jv.json",
+    "ka": "l10n/ui-ka.json",
+    "kk": "l10n/ui-kk.json",
+    "kl": "l10n/ui-kl.json",
+    "km": "l10n/ui-km.json",
+    "kn": "l10n/ui-kn.json",
+    "kok": "l10n/ui-kok.json",
+    "ko": "l10n/ui-ko.json",
+    "ks": "l10n/ui-ks.json",
+    "ky": "l10n/ui-ky.json",
+    "lb": "l10n/ui-lb.json",
+    "lo": "l10n/ui-lo.json",
+    "lt": "l10n/ui-lt.json",
+    "lv": "l10n/ui-lv.json",
+    "mai": "l10n/ui-mai.json",
+    "mk": "l10n/ui-mk.json",
+    "ml": "l10n/ui-ml.json",
+    "mni": "l10n/ui-mni.json",
+    "mn": "l10n/ui-mn.json",
+    "mr": "l10n/ui-mr.json",
+    "my": "l10n/ui-my.json",
+    "nb": "l10n/ui-nb.json",
+    "ne": "l10n/ui-ne.json",
+    "nl": "l10n/ui-nl.json",
+    "nn": "l10n/ui-nn.json",
+    "nr": "l10n/ui-nr.json",
+    "nso": "l10n/ui-nso.json",
+    "oc": "l10n/ui-oc.json",
+    "om": "l10n/ui-om.json",
+    "or": "l10n/ui-or.json",
+    "pa-in": "l10n/ui-pa_IN.json",
+    "pl": "l10n/ui-pl.json",
+    "pt-br": "l10n/ui-pt_BR.json",
+    "pt": "l10n/ui-pt.json",
+    "ro": "l10n/ui-ro.json",
+    "ru": "l10n/ui-ru.json",
+    "rw": "l10n/ui-rw.json",
+    "sah": "l10n/ui-sah.json",
+    "sa": "l10n/ui-sa_IN.json",
+    "sat": "l10n/ui-sat.json",
+    "sd": "l10n/ui-sd.json",
+    "sid": "l10n/ui-sid.json",
+    "si": "l10n/ui-si.json",
+    "sk": "l10n/ui-sk.json",
+    "sl": "l10n/ui-sl.json",
+    "sq": "l10n/ui-sq.json",
+    "sr": "l10n/ui-sr.json",
+    "ss": "l10n/ui-ss.json",
+    "st": "l10n/ui-st.json",
+    "sv": "l10n/ui-sv.json",
+    "sw": "l10n/ui-sw_TZ.json",
+    "ta": "l10n/ui-ta.json",
+    "te": "l10n/ui-te.json",
+    "tg": "l10n/ui-tg.json",
+    "th": "l10n/ui-th.json",
+    "ti": "l10n/ui-ti.json",
+    "tn": "l10n/ui-tn.json",
+    "tr": "l10n/ui-tr.json",
+    "ts": "l10n/ui-ts.json",
+    "tt": "l10n/ui-tt.json",
+    "ug": "l10n/ui-ug.json",
+    "uk": "l10n/ui-uk.json",
+    "ur": "l10n/ui-ur.json",
+    "uz": "l10n/ui-uz.json",
+    "ve": "l10n/ui-ve.json",
+    "vi": "l10n/ui-vi.json",
+    "xh": "l10n/ui-xh.json",
+    "zh-cn": "l10n/ui-zh_CN.json",
+    "zh-tw": "l10n/ui-zh_TW.json",
+    "zu": "l10n/ui-zu.json"
 }
diff --git a/loleaflet/dist/l10n/styles-localizations.json b/loleaflet/dist/l10n/styles-localizations.json
index c706d58..355255d 100644
--- a/loleaflet/dist/l10n/styles-localizations.json
+++ b/loleaflet/dist/l10n/styles-localizations.json
@@ -1,122 +1,122 @@
 {
     "en": false,
-    "ab": "/loleaflet/dist/l10n/styles/ab.json",
-    "af": "/loleaflet/dist/l10n/styles/af.json",
-    "am": "/loleaflet/dist/l10n/styles/am.json",
-    "an": "/loleaflet/dist/l10n/styles/an.json",
-    "ar": "/loleaflet/dist/l10n/styles/ar.json",
-    "as": "/loleaflet/dist/l10n/styles/as.json",
-    "ast": "/loleaflet/dist/l10n/styles/ast.json",
-    "az": "/loleaflet/dist/l10n/styles/az.json",
-    "be": "/loleaflet/dist/l10n/styles/be.json",
-    "bg": "/loleaflet/dist/l10n/styles/bg.json",
-    "bn-in": "/loleaflet/dist/l10n/styles/bn-IN.json",
-    "bn": "/loleaflet/dist/l10n/styles/bn.json",
-    "bo": "/loleaflet/dist/l10n/styles/bo.json",
-    "br": "/loleaflet/dist/l10n/styles/br.json",
-    "brx": "/loleaflet/dist/l10n/styles/brx.json",
-    "bs": "/loleaflet/dist/l10n/styles/bs.json",
-    "ca": "/loleaflet/dist/l10n/styles/ca.json",
-    "ca-valencia": "/loleaflet/dist/l10n/styles/ca-valencia.json",
-    "cs": "/loleaflet/dist/l10n/styles/cs.json",
-    "cy": "/loleaflet/dist/l10n/styles/cy.json",
-    "da": "/loleaflet/dist/l10n/styles/da.json",
-    "de": "/loleaflet/dist/l10n/styles/de.json",
-    "dgo": "/loleaflet/dist/l10n/styles/dgo.json",
-    "dz": "/loleaflet/dist/l10n/styles/dz.json",
-    "el": "/loleaflet/dist/l10n/styles/el.json",
-    "en-gb": "/loleaflet/dist/l10n/styles/en-GB.json",
-    "en-za": "/loleaflet/dist/l10n/styles/en-ZA.json",
-    "eo": "/loleaflet/dist/l10n/styles/eo.json",
-    "es": "/loleaflet/dist/l10n/styles/es.json",
-    "et": "/loleaflet/dist/l10n/styles/et.json",
-    "eu": "/loleaflet/dist/l10n/styles/eu.json",
-    "fa": "/loleaflet/dist/l10n/styles/fa.json",
-    "fi": "/loleaflet/dist/l10n/styles/fi.json",
-    "fr": "/loleaflet/dist/l10n/styles/fr.json",
-    "ga": "/loleaflet/dist/l10n/styles/ga.json",
-    "gd": "/loleaflet/dist/l10n/styles/gd.json",
-    "gl": "/loleaflet/dist/l10n/styles/gl.json",
-    "gn": "/loleaflet/dist/l10n/styles/gug.json",
-    "gu": "/loleaflet/dist/l10n/styles/gu.json",
-    "he": "/loleaflet/dist/l10n/styles/he.json",
-    "hi": "/loleaflet/dist/l10n/styles/hi.json",
-    "hr": "/loleaflet/dist/l10n/styles/hr.json",
-    "hu": "/loleaflet/dist/l10n/styles/hu.json",
-    "id": "/loleaflet/dist/l10n/styles/id.json",
-    "is": "/loleaflet/dist/l10n/styles/is.json",
-    "it": "/loleaflet/dist/l10n/styles/it.json",
-    "ja": "/loleaflet/dist/l10n/styles/ja.json",
-    "jv": "/loleaflet/dist/l10n/styles/jv.json",
-    "ka": "/loleaflet/dist/l10n/styles/ka.json",
-    "kk": "/loleaflet/dist/l10n/styles/kk.json",
-    "kl": "/loleaflet/dist/l10n/styles/kl.json",
-    "km": "/loleaflet/dist/l10n/styles/km.json",
-    "kmr-Latn": "/loleaflet/dist/l10n/styles/kmr-Latn.json",
-    "kn": "/loleaflet/dist/l10n/styles/kn.json",
-    "kok": "/loleaflet/dist/l10n/styles/kok.json",
-    "ko": "/loleaflet/dist/l10n/styles/ko.json",
-    "ks": "/loleaflet/dist/l10n/styles/ks.json",
-    "ky": "/loleaflet/dist/l10n/styles/ky.json",
-    "lb": "/loleaflet/dist/l10n/styles/lb.json",
-    "lo": "/loleaflet/dist/l10n/styles/lo.json",
-    "lt": "/loleaflet/dist/l10n/styles/lt.json",
-    "lv": "/loleaflet/dist/l10n/styles/lv.json",
-    "mai": "/loleaflet/dist/l10n/styles/mai.json",
-    "mk": "/loleaflet/dist/l10n/styles/mk.json",
-    "ml": "/loleaflet/dist/l10n/styles/ml.json",
-    "mni": "/loleaflet/dist/l10n/styles/mni.json",
-    "mn": "/loleaflet/dist/l10n/styles/mn.json",
-    "mr": "/loleaflet/dist/l10n/styles/mr.json",
-    "my": "/loleaflet/dist/l10n/styles/my.json",
-    "nb": "/loleaflet/dist/l10n/styles/nb.json",
-    "ne": "/loleaflet/dist/l10n/styles/ne.json",
-    "nl": "/loleaflet/dist/l10n/styles/nl.json",
-    "nn": "/loleaflet/dist/l10n/styles/nn.json",
-    "nr": "/loleaflet/dist/l10n/styles/nr.json",
-    "nso": "/loleaflet/dist/l10n/styles/nso.json",
-    "oc": "/loleaflet/dist/l10n/styles/oc.json",
-    "om": "/loleaflet/dist/l10n/styles/om.json",
-    "or": "/loleaflet/dist/l10n/styles/or.json",
-    "pa-in": "/loleaflet/dist/l10n/styles/pa-IN.json",
-    "pl": "/loleaflet/dist/l10n/styles/pl.json",
-    "pt-br": "/loleaflet/dist/l10n/styles/pt-BR.json",
-    "pt": "/loleaflet/dist/l10n/styles/pt.json",
-    "ro": "/loleaflet/dist/l10n/styles/ro.json",
-    "ru": "/loleaflet/dist/l10n/styles/ru.json",
-    "rw": "/loleaflet/dist/l10n/styles/rw.json",
-    "sah": "/loleaflet/dist/l10n/styles/sah.json",
-    "sa": "/loleaflet/dist/l10n/styles/sa-IN.json",
-    "sat": "/loleaflet/dist/l10n/styles/sat.json",
-    "sd": "/loleaflet/dist/l10n/styles/sd.json",
-    "sid": "/loleaflet/dist/l10n/styles/sid.json",
-    "si": "/loleaflet/dist/l10n/styles/si.json",
-    "sk": "/loleaflet/dist/l10n/styles/sk.json",
-    "sl": "/loleaflet/dist/l10n/styles/sl.json",
-    "sq": "/loleaflet/dist/l10n/styles/sq.json",
-    "sr-Latn": "/loleaflet/dist/l10n/styles/sr-Latn.json",
-    "sr": "/loleaflet/dist/l10n/styles/sr.json",
-    "ss": "/loleaflet/dist/l10n/styles/ss.json",
-    "st": "/loleaflet/dist/l10n/styles/st.json",
-    "sv": "/loleaflet/dist/l10n/styles/sv.json",
-    "sw": "/loleaflet/dist/l10n/styles/sw-TZ.json",
-    "ta": "/loleaflet/dist/l10n/styles/ta.json",
-    "te": "/loleaflet/dist/l10n/styles/te.json",
-    "tg": "/loleaflet/dist/l10n/styles/tg.json",
-    "th": "/loleaflet/dist/l10n/styles/th.json",
-    "ti": "/loleaflet/dist/l10n/styles/ti.json",
-    "tn": "/loleaflet/dist/l10n/styles/tn.json",
-    "tr": "/loleaflet/dist/l10n/styles/tr.json",
-    "ts": "/loleaflet/dist/l10n/styles/ts.json",
-    "tt": "/loleaflet/dist/l10n/styles/tt.json",
-    "ug": "/loleaflet/dist/l10n/styles/ug.json",
-    "uk": "/loleaflet/dist/l10n/styles/uk.json",
-    "ur": "/loleaflet/dist/l10n/styles/ur.json",
-    "uz": "/loleaflet/dist/l10n/styles/uz.json",
-    "ve": "/loleaflet/dist/l10n/styles/ve.json",
-    "vi": "/loleaflet/dist/l10n/styles/vi.json",
-    "xh": "/loleaflet/dist/l10n/styles/xh.json",
-    "zh-cn": "/loleaflet/dist/l10n/styles/zh-CN.json",
-    "zh-tw": "/loleaflet/dist/l10n/styles/zh-TW.json",
-    "zu": "/loleaflet/dist/l10n/styles/zu.json"
+    "ab": "l10n/styles/ab.json",
+    "af": "l10n/styles/af.json",
+    "am": "l10n/styles/am.json",
+    "an": "l10n/styles/an.json",
+    "ar": "l10n/styles/ar.json",
+    "as": "l10n/styles/as.json",
+    "ast": "l10n/styles/ast.json",
+    "az": "l10n/styles/az.json",
+    "be": "l10n/styles/be.json",
+    "bg": "l10n/styles/bg.json",
+    "bn-in": "l10n/styles/bn-IN.json",
+    "bn": "l10n/styles/bn.json",
+    "bo": "l10n/styles/bo.json",
+    "br": "l10n/styles/br.json",
+    "brx": "l10n/styles/brx.json",
+    "bs": "l10n/styles/bs.json",
+    "ca": "l10n/styles/ca.json",
+    "ca-valencia": "l10n/styles/ca-valencia.json",
+    "cs": "l10n/styles/cs.json",
+    "cy": "l10n/styles/cy.json",
+    "da": "l10n/styles/da.json",
+    "de": "l10n/styles/de.json",
+    "dgo": "l10n/styles/dgo.json",
+    "dz": "l10n/styles/dz.json",
+    "el": "l10n/styles/el.json",
+    "en-gb": "l10n/styles/en-GB.json",
+    "en-za": "l10n/styles/en-ZA.json",
+    "eo": "l10n/styles/eo.json",
+    "es": "l10n/styles/es.json",
+    "et": "l10n/styles/et.json",
+    "eu": "l10n/styles/eu.json",
+    "fa": "l10n/styles/fa.json",
+    "fi": "l10n/styles/fi.json",
+    "fr": "l10n/styles/fr.json",
+    "ga": "l10n/styles/ga.json",
+    "gd": "l10n/styles/gd.json",
+    "gl": "l10n/styles/gl.json",
+    "gn": "l10n/styles/gug.json",
+    "gu": "l10n/styles/gu.json",
+    "he": "l10n/styles/he.json",
+    "hi": "l10n/styles/hi.json",
+    "hr": "l10n/styles/hr.json",
+    "hu": "l10n/styles/hu.json",
+    "id": "l10n/styles/id.json",
+    "is": "l10n/styles/is.json",
+    "it": "l10n/styles/it.json",
+    "ja": "l10n/styles/ja.json",
+    "jv": "l10n/styles/jv.json",
+    "ka": "l10n/styles/ka.json",
+    "kk": "l10n/styles/kk.json",
+    "kl": "l10n/styles/kl.json",
+    "km": "l10n/styles/km.json",
+    "kmr-Latn": "l10n/styles/kmr-Latn.json",
+    "kn": "l10n/styles/kn.json",
+    "kok": "l10n/styles/kok.json",
+    "ko": "l10n/styles/ko.json",
+    "ks": "l10n/styles/ks.json",
+    "ky": "l10n/styles/ky.json",
+    "lb": "l10n/styles/lb.json",
+    "lo": "l10n/styles/lo.json",
+    "lt": "l10n/styles/lt.json",
+    "lv": "l10n/styles/lv.json",
+    "mai": "l10n/styles/mai.json",
+    "mk": "l10n/styles/mk.json",
+    "ml": "l10n/styles/ml.json",
+    "mni": "l10n/styles/mni.json",
+    "mn": "l10n/styles/mn.json",
+    "mr": "l10n/styles/mr.json",
+    "my": "l10n/styles/my.json",
+    "nb": "l10n/styles/nb.json",
+    "ne": "l10n/styles/ne.json",
+    "nl": "l10n/styles/nl.json",
+    "nn": "l10n/styles/nn.json",
+    "nr": "l10n/styles/nr.json",
+    "nso": "l10n/styles/nso.json",
+    "oc": "l10n/styles/oc.json",
+    "om": "l10n/styles/om.json",
+    "or": "l10n/styles/or.json",
+    "pa-in": "l10n/styles/pa-IN.json",
+    "pl": "l10n/styles/pl.json",
+    "pt-br": "l10n/styles/pt-BR.json",
+    "pt": "l10n/styles/pt.json",
+    "ro": "l10n/styles/ro.json",
+    "ru": "l10n/styles/ru.json",
+    "rw": "l10n/styles/rw.json",
+    "sah": "l10n/styles/sah.json",
+    "sa": "l10n/styles/sa-IN.json",
+    "sat": "l10n/styles/sat.json",
+    "sd": "l10n/styles/sd.json",
+    "sid": "l10n/styles/sid.json",
+    "si": "l10n/styles/si.json",
+    "sk": "l10n/styles/sk.json",
+    "sl": "l10n/styles/sl.json",
+    "sq": "l10n/styles/sq.json",
+    "sr-Latn": "l10n/styles/sr-Latn.json",
+    "sr": "l10n/styles/sr.json",
+    "ss": "l10n/styles/ss.json",
+    "st": "l10n/styles/st.json",
+    "sv": "l10n/styles/sv.json",
+    "sw": "l10n/styles/sw-TZ.json",
+    "ta": "l10n/styles/ta.json",
+    "te": "l10n/styles/te.json",
+    "tg": "l10n/styles/tg.json",
+    "th": "l10n/styles/th.json",
+    "ti": "l10n/styles/ti.json",
+    "tn": "l10n/styles/tn.json",
+    "tr": "l10n/styles/tr.json",
+    "ts": "l10n/styles/ts.json",
+    "tt": "l10n/styles/tt.json",
+    "ug": "l10n/styles/ug.json",
+    "uk": "l10n/styles/uk.json",
+    "ur": "l10n/styles/ur.json",
+    "uz": "l10n/styles/uz.json",
+    "ve": "l10n/styles/ve.json",
+    "vi": "l10n/styles/vi.json",
+    "xh": "l10n/styles/xh.json",
+    "zh-cn": "l10n/styles/zh-CN.json",
+    "zh-tw": "l10n/styles/zh-TW.json",
+    "zu": "l10n/styles/zu.json"
 }
diff --git a/loleaflet/dist/l10n/uno-localizations.json b/loleaflet/dist/l10n/uno-localizations.json
index 179cecc..ca9d80c 100644
--- a/loleaflet/dist/l10n/uno-localizations.json
+++ b/loleaflet/dist/l10n/uno-localizations.json
@@ -1,122 +1,122 @@
 {
     "en": false,
-    "ab": "/loleaflet/dist/l10n/uno/ab.json",
-    "af": "/loleaflet/dist/l10n/uno/af.json",
-    "am": "/loleaflet/dist/l10n/uno/am.json",
-    "an": "/loleaflet/dist/l10n/uno/an.json",
-    "ar": "/loleaflet/dist/l10n/uno/ar.json",
-    "as": "/loleaflet/dist/l10n/uno/as.json",
-    "ast": "/loleaflet/dist/l10n/uno/ast.json",
-    "az": "/loleaflet/dist/l10n/uno/az.json",
-    "be": "/loleaflet/dist/l10n/uno/be.json",
-    "bg": "/loleaflet/dist/l10n/uno/bg.json",
-    "bn-in": "/loleaflet/dist/l10n/uno/bn-IN.json",
-    "bn": "/loleaflet/dist/l10n/uno/bn.json",
-    "bo": "/loleaflet/dist/l10n/uno/bo.json",
-    "br": "/loleaflet/dist/l10n/uno/br.json",
-    "brx": "/loleaflet/dist/l10n/uno/brx.json",
-    "bs": "/loleaflet/dist/l10n/uno/bs.json",
-    "ca": "/loleaflet/dist/l10n/uno/ca.json",
-    "ca-valencia": "/loleaflet/dist/l10n/uno/ca-valencia.json",
-    "cs": "/loleaflet/dist/l10n/uno/cs.json",
-    "cy": "/loleaflet/dist/l10n/uno/cy.json",
-    "da": "/loleaflet/dist/l10n/uno/da.json",
-    "de": "/loleaflet/dist/l10n/uno/de.json",
-    "dgo": "/loleaflet/dist/l10n/uno/dgo.json",
-    "dz": "/loleaflet/dist/l10n/uno/dz.json",
-    "el": "/loleaflet/dist/l10n/uno/el.json",
-    "en-gb": "/loleaflet/dist/l10n/uno/en-GB.json",
-    "en-za": "/loleaflet/dist/l10n/uno/en-ZA.json",
-    "eo": "/loleaflet/dist/l10n/uno/eo.json",
-    "es": "/loleaflet/dist/l10n/uno/es.json",
-    "et": "/loleaflet/dist/l10n/uno/et.json",
-    "eu": "/loleaflet/dist/l10n/uno/eu.json",
-    "fa": "/loleaflet/dist/l10n/uno/fa.json",
-    "fi": "/loleaflet/dist/l10n/uno/fi.json",
-    "fr": "/loleaflet/dist/l10n/uno/fr.json",
-    "ga": "/loleaflet/dist/l10n/uno/ga.json",
-    "gd": "/loleaflet/dist/l10n/uno/gd.json",
-    "gl": "/loleaflet/dist/l10n/uno/gl.json",
-    "gn": "/loleaflet/dist/l10n/uno/gug.json",
-    "gu": "/loleaflet/dist/l10n/uno/gu.json",
-    "he": "/loleaflet/dist/l10n/uno/he.json",
-    "hi": "/loleaflet/dist/l10n/uno/hi.json",
-    "hr": "/loleaflet/dist/l10n/uno/hr.json",
-    "hu": "/loleaflet/dist/l10n/uno/hu.json",
-    "id": "/loleaflet/dist/l10n/uno/id.json",
-    "is": "/loleaflet/dist/l10n/uno/is.json",
-    "it": "/loleaflet/dist/l10n/uno/it.json",
-    "ja": "/loleaflet/dist/l10n/uno/ja.json",
-    "jv": "/loleaflet/dist/l10n/uno/jv.json",
-    "ka": "/loleaflet/dist/l10n/uno/ka.json",
-    "kk": "/loleaflet/dist/l10n/uno/kk.json",
-    "kl": "/loleaflet/dist/l10n/uno/kl.json",
-    "km": "/loleaflet/dist/l10n/uno/km.json",
-    "kmr-Latn": "/loleaflet/dist/l10n/uno/kmr-Latn.json",
-    "kn": "/loleaflet/dist/l10n/uno/kn.json",
-    "kok": "/loleaflet/dist/l10n/uno/kok.json",
-    "ko": "/loleaflet/dist/l10n/uno/ko.json",
-    "ks": "/loleaflet/dist/l10n/uno/ks.json",
-    "ky": "/loleaflet/dist/l10n/uno/ky.json",
-    "lb": "/loleaflet/dist/l10n/uno/lb.json",
-    "lo": "/loleaflet/dist/l10n/uno/lo.json",
-    "lt": "/loleaflet/dist/l10n/uno/lt.json",
-    "lv": "/loleaflet/dist/l10n/uno/lv.json",
-    "mai": "/loleaflet/dist/l10n/uno/mai.json",
-    "mk": "/loleaflet/dist/l10n/uno/mk.json",
-    "ml": "/loleaflet/dist/l10n/uno/ml.json",
-    "mni": "/loleaflet/dist/l10n/uno/mni.json",
-    "mn": "/loleaflet/dist/l10n/uno/mn.json",
-    "mr": "/loleaflet/dist/l10n/uno/mr.json",
-    "my": "/loleaflet/dist/l10n/uno/my.json",
-    "nb": "/loleaflet/dist/l10n/uno/nb.json",
-    "ne": "/loleaflet/dist/l10n/uno/ne.json",
-    "nl": "/loleaflet/dist/l10n/uno/nl.json",
-    "nn": "/loleaflet/dist/l10n/uno/nn.json",
-    "nr": "/loleaflet/dist/l10n/uno/nr.json",
-    "nso": "/loleaflet/dist/l10n/uno/nso.json",
-    "oc": "/loleaflet/dist/l10n/uno/oc.json",
-    "om": "/loleaflet/dist/l10n/uno/om.json",
-    "or": "/loleaflet/dist/l10n/uno/or.json",
-    "pa-in": "/loleaflet/dist/l10n/uno/pa-IN.json",
-    "pl": "/loleaflet/dist/l10n/uno/pl.json",
-    "pt-br": "/loleaflet/dist/l10n/uno/pt-BR.json",
-    "pt": "/loleaflet/dist/l10n/uno/pt.json",
-    "ro": "/loleaflet/dist/l10n/uno/ro.json",
-    "ru": "/loleaflet/dist/l10n/uno/ru.json",
-    "rw": "/loleaflet/dist/l10n/uno/rw.json",
-    "sah": "/loleaflet/dist/l10n/uno/sah.json",
-    "sa": "/loleaflet/dist/l10n/uno/sa-IN.json",
-    "sat": "/loleaflet/dist/l10n/uno/sat.json",
-    "sd": "/loleaflet/dist/l10n/uno/sd.json",
-    "sid": "/loleaflet/dist/l10n/uno/sid.json",
-    "si": "/loleaflet/dist/l10n/uno/si.json",
-    "sk": "/loleaflet/dist/l10n/uno/sk.json",
-    "sl": "/loleaflet/dist/l10n/uno/sl.json",
-    "sq": "/loleaflet/dist/l10n/uno/sq.json",
-    "sr-Latn": "/loleaflet/dist/l10n/uno/sr-Latn.json",
-    "sr": "/loleaflet/dist/l10n/uno/sr.json",
-    "ss": "/loleaflet/dist/l10n/uno/ss.json",
-    "st": "/loleaflet/dist/l10n/uno/st.json",
-    "sv": "/loleaflet/dist/l10n/uno/sv.json",
-    "sw": "/loleaflet/dist/l10n/uno/sw-TZ.json",
-    "ta": "/loleaflet/dist/l10n/uno/ta.json",
-    "te": "/loleaflet/dist/l10n/uno/te.json",
-    "tg": "/loleaflet/dist/l10n/uno/tg.json",
-    "th": "/loleaflet/dist/l10n/uno/th.json",
-    "ti": "/loleaflet/dist/l10n/uno/ti.json",
-    "tn": "/loleaflet/dist/l10n/uno/tn.json",
-    "tr": "/loleaflet/dist/l10n/uno/tr.json",
-    "ts": "/loleaflet/dist/l10n/uno/ts.json",
-    "tt": "/loleaflet/dist/l10n/uno/tt.json",
-    "ug": "/loleaflet/dist/l10n/uno/ug.json",
-    "uk": "/loleaflet/dist/l10n/uno/uk.json",
-    "ur": "/loleaflet/dist/l10n/uno/ur.json",
-    "uz": "/loleaflet/dist/l10n/uno/uz.json",
-    "ve": "/loleaflet/dist/l10n/uno/ve.json",
-    "vi": "/loleaflet/dist/l10n/uno/vi.json",
-    "xh": "/loleaflet/dist/l10n/uno/xh.json",
-    "zh-cn": "/loleaflet/dist/l10n/uno/zh-CN.json",
-    "zh-tw": "/loleaflet/dist/l10n/uno/zh-TW.json",
-    "zu": "/loleaflet/dist/l10n/uno/zu.json"
+    "ab": "l10n/uno/ab.json",
+    "af": "l10n/uno/af.json",
+    "am": "l10n/uno/am.json",
+    "an": "l10n/uno/an.json",
+    "ar": "l10n/uno/ar.json",
+    "as": "l10n/uno/as.json",
+    "ast": "l10n/uno/ast.json",
+    "az": "l10n/uno/az.json",
+    "be": "l10n/uno/be.json",
+    "bg": "l10n/uno/bg.json",
+    "bn-in": "l10n/uno/bn-IN.json",
+    "bn": "l10n/uno/bn.json",
+    "bo": "l10n/uno/bo.json",
+    "br": "l10n/uno/br.json",
+    "brx": "l10n/uno/brx.json",
+    "bs": "l10n/uno/bs.json",
+    "ca": "l10n/uno/ca.json",
+    "ca-valencia": "l10n/uno/ca-valencia.json",
+    "cs": "l10n/uno/cs.json",
+    "cy": "l10n/uno/cy.json",
+    "da": "l10n/uno/da.json",
+    "de": "l10n/uno/de.json",
+    "dgo": "l10n/uno/dgo.json",
+    "dz": "l10n/uno/dz.json",
+    "el": "l10n/uno/el.json",
+    "en-gb": "l10n/uno/en-GB.json",
+    "en-za": "l10n/uno/en-ZA.json",
+    "eo": "l10n/uno/eo.json",
+    "es": "l10n/uno/es.json",
+    "et": "l10n/uno/et.json",
+    "eu": "l10n/uno/eu.json",
+    "fa": "l10n/uno/fa.json",
+    "fi": "l10n/uno/fi.json",
+    "fr": "l10n/uno/fr.json",
+    "ga": "l10n/uno/ga.json",
+    "gd": "l10n/uno/gd.json",
+    "gl": "l10n/uno/gl.json",
+    "gn": "l10n/uno/gug.json",
+    "gu": "l10n/uno/gu.json",
+    "he": "l10n/uno/he.json",
+    "hi": "l10n/uno/hi.json",
+    "hr": "l10n/uno/hr.json",
+    "hu": "l10n/uno/hu.json",
+    "id": "l10n/uno/id.json",
+    "is": "l10n/uno/is.json",
+    "it": "l10n/uno/it.json",
+    "ja": "l10n/uno/ja.json",
+    "jv": "l10n/uno/jv.json",
+    "ka": "l10n/uno/ka.json",
+    "kk": "l10n/uno/kk.json",
+    "kl": "l10n/uno/kl.json",
+    "km": "l10n/uno/km.json",
+    "kmr-Latn": "l10n/uno/kmr-Latn.json",
+    "kn": "l10n/uno/kn.json",
+    "kok": "l10n/uno/kok.json",
+    "ko": "l10n/uno/ko.json",
+    "ks": "l10n/uno/ks.json",
+    "ky": "l10n/uno/ky.json",
+    "lb": "l10n/uno/lb.json",
+    "lo": "l10n/uno/lo.json",
+    "lt": "l10n/uno/lt.json",
+    "lv": "l10n/uno/lv.json",
+    "mai": "l10n/uno/mai.json",
+    "mk": "l10n/uno/mk.json",
+    "ml": "l10n/uno/ml.json",
+    "mni": "l10n/uno/mni.json",
+    "mn": "l10n/uno/mn.json",
+    "mr": "l10n/uno/mr.json",
+    "my": "l10n/uno/my.json",
+    "nb": "l10n/uno/nb.json",
+    "ne": "l10n/uno/ne.json",
+    "nl": "l10n/uno/nl.json",
+    "nn": "l10n/uno/nn.json",
+    "nr": "l10n/uno/nr.json",
+    "nso": "l10n/uno/nso.json",
+    "oc": "l10n/uno/oc.json",
+    "om": "l10n/uno/om.json",
+    "or": "l10n/uno/or.json",
+    "pa-in": "l10n/uno/pa-IN.json",
+    "pl": "l10n/uno/pl.json",
+    "pt-br": "l10n/uno/pt-BR.json",
+    "pt": "l10n/uno/pt.json",
+    "ro": "l10n/uno/ro.json",
+    "ru": "l10n/uno/ru.json",
+    "rw": "l10n/uno/rw.json",
+    "sah": "l10n/uno/sah.json",
+    "sa": "l10n/uno/sa-IN.json",
+    "sat": "l10n/uno/sat.json",
+    "sd": "l10n/uno/sd.json",
+    "sid": "l10n/uno/sid.json",
+    "si": "l10n/uno/si.json",
+    "sk": "l10n/uno/sk.json",
+    "sl": "l10n/uno/sl.json",
+    "sq": "l10n/uno/sq.json",
+    "sr-Latn": "l10n/uno/sr-Latn.json",
+    "sr": "l10n/uno/sr.json",
+    "ss": "l10n/uno/ss.json",
+    "st": "l10n/uno/st.json",
+    "sv": "l10n/uno/sv.json",
+    "sw": "l10n/uno/sw-TZ.json",
+    "ta": "l10n/uno/ta.json",
+    "te": "l10n/uno/te.json",
+    "tg": "l10n/uno/tg.json",
+    "th": "l10n/uno/th.json",
+    "ti": "l10n/uno/ti.json",
+    "tn": "l10n/uno/tn.json",
+    "tr": "l10n/uno/tr.json",
+    "ts": "l10n/uno/ts.json",
+    "tt": "l10n/uno/tt.json",
+    "ug": "l10n/uno/ug.json",
+    "uk": "l10n/uno/uk.json",
+    "ur": "l10n/uno/ur.json",
+    "uz": "l10n/uno/uz.json",
+    "ve": "l10n/uno/ve.json",
+    "vi": "l10n/uno/vi.json",
+    "xh": "l10n/uno/xh.json",
+    "zh-cn": "l10n/uno/zh-CN.json",
+    "zh-tw": "l10n/uno/zh-TW.json",
+    "zu": "l10n/uno/zu.json"
 }
diff --git a/loleaflet/dist/toolbar.css b/loleaflet/dist/toolbar.css
index 8699372..7fc6660 100644
--- a/loleaflet/dist/toolbar.css
+++ b/loleaflet/dist/toolbar.css
@@ -213,60 +213,60 @@ button.leaflet-control-search-next
     border-style: solid;
 }
 
-.w2ui-icon.accepttrackedchanges{ background: url('/loleaflet/dist/images/lc_accepttrackedchanges.png') no-repeat center !important; }
-.w2ui-icon.alignblock{ background: url('/loleaflet/dist/images/lc_alignblock.png') no-repeat center !important; }
-.w2ui-icon.alignhorizontal{ background: url('/loleaflet/dist/images/lc_alignhorizontalcenter.png') no-repeat center !important; }
-.w2ui-icon.alignleft{ background: url('/loleaflet/dist/images/lc_alignleft.png') no-repeat center !important; }
-.w2ui-icon.alignright{ background: url('/loleaflet/dist/images/lc_alignright.png') no-repeat center !important; }
-.w2ui-icon.autosum{ background: url('/loleaflet/dist/images/lc_autosum.png') no-repeat center !important; }
-.w2ui-icon.backcolor{ background: url('/loleaflet/dist/images/lc_backcolor.png') no-repeat center !important; }
-.w2ui-icon.bold{ background: url('/loleaflet/dist/images/lc_bold.png') no-repeat center !important; }
-.w2ui-icon.annotation{ background: url('/loleaflet/dist/images/lc_showannotations.png') no-repeat center !important; }
-.w2ui-icon.bullet{ background: url('/loleaflet/dist/images/lc_defaultbullet.png') no-repeat center !important; }
-.w2ui-icon.cancel{ background: url('/loleaflet/dist/images/lc_cancel.png') no-repeat center !important; }
-.w2ui-icon.color{ background: url('/loleaflet/dist/images/lc_color.png') no-repeat center !important; }
-.w2ui-icon.closedoc{ background: url('/loleaflet/dist/images/lc_closedoc.png') no-repeat center !important; }
-.w2ui-icon.decrementindent{ background: url('/loleaflet/dist/images/lc_decrementindent.png') no-repeat center !important; }
-.w2ui-icon.deletepage{ background: url('/loleaflet/dist/images/lc_deletepage.png') no-repeat center !important; }
-.w2ui-icon.duplicatepage{ background: url('/loleaflet/dist/images/lc_duplicatepage.png') no-repeat center !important; }
-.w2ui-icon.edit{ background: url('/loleaflet/dist/images/lc_editdoc.png') no-repeat center !important; }
-.w2ui-icon.equal{ background: url('/loleaflet/dist/images/lc26049.png') no-repeat center !important; }
-.w2ui-icon.help{ background: url('/loleaflet/dist/images/lc_helpindex.png') no-repeat center !important; }
-.w2ui-icon.incrementindent{ background: url('/loleaflet/dist/images/lc_decrementlevel.png') no-repeat center !important; }
-.w2ui-icon.insertpage{ background: url('/loleaflet/dist/images/lc_insertpage.png') no-repeat center !important; }
-.w2ui-icon.italic{ background: url('/loleaflet/dist/images/lc_italic.png') no-repeat center !important; }
-.w2ui-icon.insertgraphic{ background: url('/loleaflet/dist/images/lc_gallery.png') no-repeat center !important; }
-.w2ui-icon.inserttable{ background: url('/loleaflet/dist/images/lc_inserttable.png') no-repeat center !important; }
-.w2ui-icon.next{ background: url('/loleaflet/dist/images/lc_downsearch.png') no-repeat center !important; }
-.w2ui-icon.numbering{ background: url('/loleaflet/dist/images/lc_defaultnumbering.png') no-repeat center !important; }
-.w2ui-icon.presentation{ background: url('/loleaflet/dist/images/lc_dia.png') no-repeat center !important; }
-.w2ui-icon.prev{ background: url('/loleaflet/dist/images/lc_upsearch.png') no-repeat center !important; }
-.w2ui-icon.print{ background: url('/loleaflet/dist/images/lc_print.png') no-repeat center !important; }
-.w2ui-icon.redo{ background: url('/loleaflet/dist/images/lc_redo.png') no-repeat center !important; }
-.w2ui-icon.save{ background: url('/loleaflet/dist/images/lc_save.png') no-repeat center !important; }
-.w2ui-icon.saveas{ background: url('/loleaflet/dist/images/lc_saveas.png') no-repeat center !important; }
-.w2ui-icon.strikeout{ background: url('/loleaflet/dist/images/lc_strikeout.png') no-repeat center !important; }
-.w2ui-icon.underline{ background: url('/loleaflet/dist/images/lc_underline.png') no-repeat center !important; }
-.w2ui-icon.undo{ background: url('/loleaflet/dist/images/lc_undo.png') no-repeat center !important; }
-.w2ui-icon.zoomin{ background: url('/loleaflet/dist/images/plus.png') no-repeat center !important; }
-.w2ui-icon.zoomout{ background: url('/loleaflet/dist/images/minus.png') no-repeat center !important; }
-.w2ui-icon.zoomreset{ background: url('/loleaflet/dist/images/lc_view100.png') no-repeat center !important; }
-.w2ui-icon.more{ background: url('/loleaflet/dist/images/lc_downsearch.png') no-repeat center !important; }
-.w2ui-icon.firstrecord{ background: url('/loleaflet/dist/images/lc_firstrecord.png') no-repeat center !important; }
-.w2ui-icon.nextrecord{ background: url('/loleaflet/dist/images/lc_nextrecord.png') no-repeat center !important; }
-.w2ui-icon.prevrecord{ background: url('/loleaflet/dist/images/lc_prevrecord.png') no-repeat center !important; }
-.w2ui-icon.lastrecord{ background: url('/loleaflet/dist/images/lc_lastrecord.png') no-repeat center !important; }
-.w2ui-icon.wraptext{ background: url('/loleaflet/dist/images/lc_wraptext.png') no-repeat center !important; }
-.w2ui-icon.togglemergecells{ background: url('/loleaflet/dist/images/lc_togglemergecells.png') no-repeat center !important; }
-.w2ui-icon.numberformatcurrency{ background: url('/loleaflet/dist/images/lc_currencyfield.png') no-repeat center !important; }
-.w2ui-icon.numberformatpercent{ background: url('/loleaflet/dist/images/lc_numberformatpercent.png') no-repeat center !important; }
-.w2ui-icon.numberformatdecimal{ background: url('/loleaflet/dist/images/lc_numberformatdecimal.png') no-repeat center !important; }
-.w2ui-icon.numberformatdate{ background: url('/loleaflet/dist/images/lc_datefield.png') no-repeat center !important; }
-.w2ui-icon.numberformatincdecimals{ background: url('/loleaflet/dist/images/lc_numberformatincdecimals.png') no-repeat center !important; }
-.w2ui-icon.numberformatdecdecimals{ background: url('/loleaflet/dist/images/lc_numberformatdecdecimals.png') no-repeat center !important; }
-.w2ui-icon.sortascending{ background: url('/loleaflet/dist/images/lc_sortascending.png') no-repeat center !important; }
-.w2ui-icon.sortdescending{ background: url('/loleaflet/dist/images/lc_sortdescending.png') no-repeat center !important; }
-.w2ui-icon.selected{ background: url('/loleaflet/dist/images/lc_ok.png') no-repeat center !important; }
+.w2ui-icon.accepttrackedchanges{ background: url('images/lc_accepttrackedchanges.png') no-repeat center !important; }
+.w2ui-icon.alignblock{ background: url('images/lc_alignblock.png') no-repeat center !important; }
+.w2ui-icon.alignhorizontal{ background: url('images/lc_alignhorizontalcenter.png') no-repeat center !important; }
+.w2ui-icon.alignleft{ background: url('images/lc_alignleft.png') no-repeat center !important; }
+.w2ui-icon.alignright{ background: url('images/lc_alignright.png') no-repeat center !important; }
+.w2ui-icon.autosum{ background: url('images/lc_autosum.png') no-repeat center !important; }
+.w2ui-icon.backcolor{ background: url('images/lc_backcolor.png') no-repeat center !important; }
+.w2ui-icon.bold{ background: url('images/lc_bold.png') no-repeat center !important; }
+.w2ui-icon.annotation{ background: url('images/lc_showannotations.png') no-repeat center !important; }
+.w2ui-icon.bullet{ background: url('images/lc_defaultbullet.png') no-repeat center !important; }
+.w2ui-icon.cancel{ background: url('images/lc_cancel.png') no-repeat center !important; }
+.w2ui-icon.color{ background: url('images/lc_color.png') no-repeat center !important; }
+.w2ui-icon.closedoc{ background: url('images/lc_closedoc.png') no-repeat center !important; }
+.w2ui-icon.decrementindent{ background: url('images/lc_decrementindent.png') no-repeat center !important; }
+.w2ui-icon.deletepage{ background: url('images/lc_deletepage.png') no-repeat center !important; }
+.w2ui-icon.duplicatepage{ background: url('images/lc_duplicatepage.png') no-repeat center !important; }
+.w2ui-icon.edit{ background: url('images/lc_editdoc.png') no-repeat center !important; }
+.w2ui-icon.equal{ background: url('images/lc26049.png') no-repeat center !important; }
+.w2ui-icon.help{ background: url('images/lc_helpindex.png') no-repeat center !important; }
+.w2ui-icon.incrementindent{ background: url('images/lc_decrementlevel.png') no-repeat center !important; }
+.w2ui-icon.insertpage{ background: url('images/lc_insertpage.png') no-repeat center !important; }
+.w2ui-icon.italic{ background: url('images/lc_italic.png') no-repeat center !important; }
+.w2ui-icon.insertgraphic{ background: url('images/lc_gallery.png') no-repeat center !important; }
+.w2ui-icon.inserttable{ background: url('images/lc_inserttable.png') no-repeat center !important; }
+.w2ui-icon.next{ background: url('images/lc_downsearch.png') no-repeat center !important; }
+.w2ui-icon.numbering{ background: url('images/lc_defaultnumbering.png') no-repeat center !important; }
+.w2ui-icon.presentation{ background: url('images/lc_dia.png') no-repeat center !important; }
+.w2ui-icon.prev{ background: url('images/lc_upsearch.png') no-repeat center !important; }
+.w2ui-icon.print{ background: url('images/lc_print.png') no-repeat center !important; }
+.w2ui-icon.redo{ background: url('images/lc_redo.png') no-repeat center !important; }
+.w2ui-icon.save{ background: url('images/lc_save.png') no-repeat center !important; }
+.w2ui-icon.saveas{ background: url('images/lc_saveas.png') no-repeat center !important; }
+.w2ui-icon.strikeout{ background: url('images/lc_strikeout.png') no-repeat center !important; }
+.w2ui-icon.underline{ background: url('images/lc_underline.png') no-repeat center !important; }
+.w2ui-icon.undo{ background: url('images/lc_undo.png') no-repeat center !important; }
+.w2ui-icon.zoomin{ background: url('images/plus.png') no-repeat center !important; }
+.w2ui-icon.zoomout{ background: url('images/minus.png') no-repeat center !important; }
+.w2ui-icon.zoomreset{ background: url('images/lc_view100.png') no-repeat center !important; }
+.w2ui-icon.more{ background: url('images/lc_downsearch.png') no-repeat center !important; }
+.w2ui-icon.firstrecord{ background: url('images/lc_firstrecord.png') no-repeat center !important; }
+.w2ui-icon.nextrecord{ background: url('images/lc_nextrecord.png') no-repeat center !important; }
+.w2ui-icon.prevrecord{ background: url('images/lc_prevrecord.png') no-repeat center !important; }
+.w2ui-icon.lastrecord{ background: url('images/lc_lastrecord.png') no-repeat center !important; }
+.w2ui-icon.wraptext{ background: url('images/lc_wraptext.png') no-repeat center !important; }
+.w2ui-icon.togglemergecells{ background: url('images/lc_togglemergecells.png') no-repeat center !important; }
+.w2ui-icon.numberformatcurrency{ background: url('images/lc_currencyfield.png') no-repeat center !important; }
+.w2ui-icon.numberformatpercent{ background: url('images/lc_numberformatpercent.png') no-repeat center !important; }
+.w2ui-icon.numberformatdecimal{ background: url('images/lc_numberformatdecimal.png') no-repeat center !important; }
+.w2ui-icon.numberformatdate{ background: url('images/lc_datefield.png') no-repeat center !important; }
+.w2ui-icon.numberformatincdecimals{ background: url('images/lc_numberformatincdecimals.png') no-repeat center !important; }
+.w2ui-icon.numberformatdecdecimals{ background: url('images/lc_numberformatdecdecimals.png') no-repeat center !important; }
+.w2ui-icon.sortascending{ background: url('images/lc_sortascending.png') no-repeat center !important; }
+.w2ui-icon.sortdescending{ background: url('images/lc_sortdescending.png') no-repeat center !important; }
+.w2ui-icon.selected{ background: url('images/lc_ok.png') no-repeat center !important; }
 
 .inserttable-pop {
     z-index: 100000;
diff --git a/loleaflet/src/core/Socket.js b/loleaflet/src/core/Socket.js
index 7cb235a..0c3c89f 100644
--- a/loleaflet/src/core/Socket.js
+++ b/loleaflet/src/core/Socket.js
@@ -9,7 +9,7 @@ L.Socket = L.Class.extend({
 	initialize: function (map) {
 		this._map = map;
 		try {
-			this.socket = new WebSocket(map.options.server + '/lool/ws/' + map.options.doc);
+			this.socket = new WebSocket(map.options.server + '/lool/' + encodeURIComponent(map.options.doc) + '/ws');
 		} catch (e) {
 			this.fire('error', {msg: _('Oops, there is a problem connecting to LibreOffice Online : ' + e), cmd: 'socket', kind: 'failed', id: 3});
 			return null;
diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index c11cc45..68fb0ff 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -380,7 +380,7 @@ L.TileLayer = L.GridLayer.extend({
 		var parser = document.createElement('a');
 		parser.href = this._map.options.server;
 		var url = this._map.options.webserver + '/' + this._map.options.urlPrefix + '/' +
-			command.jail + '/' + command.dir + '/' + command.name;
+		    encodeURIComponent(this._map.options.doc) + '/' + command.jail + '/' + command.dir + '/' + command.name;
 
 		this._map.hideBusy();
 		if (command.id === 'print') {
diff --git a/loleaflet/src/map/handler/Map.FileInserter.js b/loleaflet/src/map/handler/Map.FileInserter.js
index 7e90a2a..3b5401e 100644
--- a/loleaflet/src/map/handler/Map.FileInserter.js
+++ b/loleaflet/src/map/handler/Map.FileInserter.js
@@ -14,7 +14,8 @@ L.Map.FileInserter = L.Handler.extend({
 		this._toInsert = {};
 		var parser = document.createElement('a');
 		parser.href = map.options.server;
-		this._url = map.options.webserver + '/' + map.options.urlPrefix + '/insertfile';
+		this._url = map.options.webserver + '/' + map.options.urlPrefix +
+			'/' + encodeURIComponent(map.options.doc) + '/insertfile';
 	},
 
 	addHooks: function () {
diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index e9ce1d6..00e9471 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -459,7 +459,7 @@ private:
 
             return true;
         }
-        else if (tokens.count() >= 3 && tokens[2] == "insertfile")
+        else if (tokens.count() >= 4 && tokens[3] == "insertfile")
         {
             Log::info("Insert file request.");
             response.set("Access-Control-Allow-Origin", "*");
@@ -475,6 +475,20 @@ private:
                 const std::string formChildid(form.get("childid"));
                 const std::string formName(form.get("name"));
 
+                // Validate the docKey
+                std::unique_lock<std::mutex> docBrokersLock(docBrokersMutex);
+                std::string decodedUri;
+                URI::decode(tokens[2], decodedUri);
+                const auto docKey = DocumentBroker::getDocKey(DocumentBroker::sanitizeURI(decodedUri));
+                auto docBrokerIt = docBrokers.find(docKey);
+
+                // Maybe just free the client from sending childid in form ?
+                if (docBrokerIt == docBrokers.end() || docBrokerIt->second->getJailId() != formChildid)
+                {
+                    throw BadRequestException("DocKey [" + docKey + "] or childid [" + formChildid + "] is invalid.");
+                }
+                docBrokersLock.unlock();
+
                 // protect against attempts to inject something funny here
                 if (formChildid.find('/') == std::string::npos && formName.find('/') == std::string::npos)
                 {
@@ -488,18 +502,30 @@ private:
                 }
             }
         }
-        else if (tokens.count() >= 5)
+        else if (tokens.count() >= 6)
         {
             Log::info("File download request.");
-            // The user might request a file to download
             //TODO: Check that the user in question has access to this file!
-            const std::string dirPath = LOOLWSD::ChildRoot + tokens[2]
-                                      + JAILED_DOCUMENT_ROOT + tokens[3];
+            const std::string dirPath = LOOLWSD::ChildRoot + tokens[3]
+                                      + JAILED_DOCUMENT_ROOT + tokens[4];
             std::string fileName;
-            URI::decode(tokens[4], fileName);
+            URI::decode(tokens[5], fileName);
             const std::string filePath = dirPath + "/" + fileName;
             Log::info("HTTP request for: " + filePath);
             File file(filePath);
+
+            // Validate the dockey
+            std::string decodedUri;
+            URI::decode(tokens[2], decodedUri);
+            const auto docKey = DocumentBroker::getDocKey(DocumentBroker::sanitizeURI(decodedUri));
+            std::unique_lock<std::mutex> docBrokersLock(docBrokersMutex);
+            auto docBrokerIt = docBrokers.find(docKey);
+            if (docBrokerIt == docBrokers.end())
+            {
+                throw BadRequestException("DocKey [" + docKey + "] is invalid.");
+            }
+            docBrokersLock.unlock();
+
             if (file.exists())
             {
                 response.set("Access-Control-Allow-Origin", "*");
@@ -522,7 +548,7 @@ private:
     }
 
     /// Handle GET requests.
-    static void handleGetRequest(HTTPServerRequest& request, std::shared_ptr<WebSocket>& ws, const std::string& id)
+    static void handleGetRequest(const std::string& uri, std::shared_ptr<WebSocket>& ws, const std::string& id)
     {
         Log::info("Starting GET request handler for session [" + id + "].");
 
@@ -531,16 +557,6 @@ private:
         Log::trace("Sending to Client [" + status + "].");
         ws->sendFrame(status.data(), (int) status.size());
 
-        // Remove the leading '/' in the GET URL.
-        std::string uri = request.getURI();
-        if (uri.size() > 0 && uri[0] == '/')
-            uri.erase(0, 1);
-
-        // Remove leading 'lool/ws/' from GET URL
-        if (uri.size() > 0 && uri.compare(0, 8, "lool/ws/") == 0)
-            uri.erase(0, 8);
-
-
         const auto uriPublic = DocumentBroker::sanitizeURI(uri);
         const auto docKey = DocumentBroker::getDocKey(uriPublic);
         std::shared_ptr<DocumentBroker> docBroker;
@@ -841,8 +857,9 @@ public:
         const auto id = LOOLWSD::GenSessionId();
 
         Poco::URI requestUri(request.getURI());
-        std::vector<std::string> reqPathSegs;
-        requestUri.getPathSegments(reqPathSegs);
+        Log::debug("Handling GET: " + request.getURI());
+
+        StringTokenizer reqPathTokens(request.getURI(), "/?", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
 
         Util::setThreadName("client_ws_" + id);
 
@@ -884,17 +901,19 @@ public:
             }
             // All post requests have url prefix, lool
             else if (!(request.find("Upgrade") != request.end() && Poco::icompare(request["Upgrade"], "websocket") == 0) &&
-                     reqPathSegs.size() > 0 && reqPathSegs[0] == "lool")
+                     reqPathTokens.count() > 0 && reqPathTokens[0] == "lool")
             {
                 responded = handlePostRequest(request, response, id);
             }
-            else if (reqPathSegs.size() > 2 && reqPathSegs[0] == "lool" && reqPathSegs[1] == "ws")
+            else if (reqPathTokens.count() > 2 && reqPathTokens[0] == "lool" && reqPathTokens[2] == "ws")
             {
                 auto ws = std::make_shared<WebSocket>(request, response);
                 try
                 {
                     responded = true; // After upgrading to WS we should not set HTTP response.
-                    handleGetRequest(request, ws, id);
+                    std::string decodedUri;
+                    URI::decode(reqPathTokens[1], decodedUri);
+                    handleGetRequest(decodedUri, ws, id);
                 }
                 catch (const WebSocketErrorMessageException& exc)
                 {
diff --git a/loolwsd/test/UnitAdmin.cpp b/loolwsd/test/UnitAdmin.cpp
index 2ae8520..1f536a7 100644
--- a/loolwsd/test/UnitAdmin.cpp
+++ b/loolwsd/test/UnitAdmin.cpp
@@ -191,8 +191,9 @@ private:
         const std::string subscribeMessage = "subscribe adddoc";
         _adminWs->sendFrame(subscribeMessage.data(), subscribeMessage.size());
 
-        const std::string documentPath1 = Util::getTempFilePath(TDOC, "hello.odt");
-        const std::string documentURL1 = std::string("lool/ws/") + "file://" + Poco::Path(documentPath1).makeAbsolute().toString();
+
+        std::string documentPath1, documentURL1;
+        helpers::getDocumentPathAndURL("hello.odt", documentPath1, documentURL1);
         HTTPRequest request1(HTTPRequest::HTTP_GET, documentURL1);
         HTTPResponse response1;
         const Poco::URI docUri1(helpers::getTestServerURI());
@@ -255,8 +256,8 @@ private:
         }
 
         // Open another document (different)
-        const std::string documentPath2 = Util::getTempFilePath(TDOC, "insert-delete.odp");
-        const std::string documentURL2 = std::string("lool/ws/") + "file://" + Poco::Path(documentPath2).makeAbsolute().toString();
+        std::string documentPath2, documentURL2;
+        helpers::getDocumentPathAndURL("insert-delete.odp", documentPath2, documentURL2);
         HTTPRequest request2(HTTPRequest::HTTP_GET, documentURL2);
         HTTPResponse response2;
         const Poco::URI docUri2(helpers::getTestServerURI());
diff --git a/loolwsd/test/helpers.hpp b/loolwsd/test/helpers.hpp
index 3214e58..e676ff1 100644
--- a/loolwsd/test/helpers.hpp
+++ b/loolwsd/test/helpers.hpp
@@ -52,8 +52,9 @@ inline
 void getDocumentPathAndURL(const char* document, std::string& documentPath, std::string& documentURL)
 {
     documentPath = Util::getTempFilePath(TDOC, document);
-    documentURL = "lool/ws/file://" + Poco::Path(documentPath).makeAbsolute().toString();
-
+    std::string encodedUri;
+    Poco::URI::encode("file://" + Poco::Path(documentPath).makeAbsolute().toString(), ":/?", encodedUri);
+    documentURL = "lool/" + encodedUri + "/ws";
     std::cerr << "Test file: " << documentPath << std::endl;
 }
 
diff --git a/loolwsd/test/httpwstest.cpp b/loolwsd/test/httpwstest.cpp
index bd57d03..bf87306 100644
--- a/loolwsd/test/httpwstest.cpp
+++ b/loolwsd/test/httpwstest.cpp
@@ -192,8 +192,8 @@ void HTTPWSTest::testBadRequest()
 {
     try
     {
-        // Load a document and get its status.
-        const std::string documentURL = "lool/ws/file:///fake.doc";
+        // Try to load a fake document and get its status.
+        const std::string documentURL = "/lool/file%3A%2F%2F%2Ffake.doc/ws";
 
         Poco::Net::HTTPResponse response;
         Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, documentURL);
@@ -905,8 +905,8 @@ void HTTPWSTest::testPasswordProtectedDocumentWithCorrectPassword()
 {
     try
     {
-        const std::string documentPath = Util::getTempFilePath(TDOC, "password-protected.ods");
-        const std::string documentURL = "lool/ws/file://" + Poco::Path(documentPath).makeAbsolute().toString();
+        std::string documentPath, documentURL;
+        getDocumentPathAndURL("password-protected.ods", documentPath, documentURL);
 
         Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, documentURL);
         Poco::Net::WebSocket socket = *connectLOKit(_uri, request, _response);
@@ -1030,8 +1030,8 @@ void HTTPWSTest::testInsertDelete()
 
 void HTTPWSTest::testEditLock()
 {
-    const std::string documentPath = Util::getTempFilePath(TDOC, "hello.odt");
-    const std::string documentURL = "lool/ws/file://" + Poco::Path(documentPath).makeAbsolute().toString();
+    std::string documentPath, documentURL;
+    getDocumentPathAndURL("hello.odt", documentPath, documentURL);
 
     std::mutex mutex;
     std::condition_variable cv;
@@ -1179,7 +1179,9 @@ void HTTPWSTest::testSlideShow()
             CPPUNIT_ASSERT_EQUAL(static_cast<int>(_uri.getPort()), port);
             CPPUNIT_ASSERT_EQUAL(std::string("slideshow"), id);
 
-            const std::string path = "/lool/" + jail + "/" + dir + "/" + name + "?mime_type=image/svg%2Bxml";
+            std::string encodedDoc;
+            Poco::URI::encode(documentPath, ":/?", encodedDoc);
+            const std::string path = "/lool/" + encodedDoc + "/" + jail + "/" + dir + "/" + name + "?mime_type=image/svg%2Bxml";
             std::unique_ptr<Poco::Net::HTTPClientSession> session(helpers::createSession(_uri));
             Poco::Net::HTTPRequest requestSVG(Poco::Net::HTTPRequest::HTTP_GET, path);
             session->sendRequest(requestSVG);


More information about the Libreoffice-commits mailing list