From 910ae6cba950b21c94f57f40ded2d9a922a9294e Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 19 Aug 2013 16:09:08 +0200 Subject: [PATCH 1/8] Created chat common javascript module/css/template file bzr revid: nicolas.vanhoren@openerp.com-20130819140908-iai1e58wh7ofb7tp --- addons/im/Gruntfile.js | 20 + addons/im/__openerp__.py | 2 +- addons/im/package.json | 6 + .../static/src/css/im_common.css} | 0 addons/im/static/src/js/im_common.js | 440 ++++++++++++++++++ .../static/src/xml/im_common.xml} | 2 +- addons/im_livechat/loader.js | 7 + .../static/ext/static/audio/Ting.mp3 | Bin 17293 -> 0 bytes .../static/ext/static/audio/Ting.ogg | Bin 17026 -> 0 bytes .../static/ext/static/img/avatar/avatar.jpeg | Bin 6462 -> 0 bytes .../static/ext/static/img/button-gloss.png | Bin 74 -> 0 bytes .../static/img/glyphicons-halflings-white.png | Bin 8777 -> 0 bytes .../ext/static/img/glyphicons-halflings.png | Bin 12799 -> 0 bytes .../static/ext/static/img/green.png | Bin 830 -> 0 bytes .../static/ext/static/img/logo.png | Bin 3600 -> 0 bytes .../static/ext/static/img/wood.png | Bin 102184 -> 0 bytes .../static/ext/static/js/livesupport.js | 421 +---------------- 17 files changed, 489 insertions(+), 409 deletions(-) create mode 100644 addons/im/Gruntfile.js create mode 100644 addons/im/package.json rename addons/{im_livechat/static/ext/static/css/livesupport.css => im/static/src/css/im_common.css} (100%) create mode 100644 addons/im/static/src/js/im_common.js rename addons/{im_livechat/static/ext/static/js/livesupport_templates.xml => im/static/src/xml/im_common.xml} (91%) delete mode 100644 addons/im_livechat/static/ext/static/audio/Ting.mp3 delete mode 100644 addons/im_livechat/static/ext/static/audio/Ting.ogg delete mode 100644 addons/im_livechat/static/ext/static/img/avatar/avatar.jpeg delete mode 100755 addons/im_livechat/static/ext/static/img/button-gloss.png delete mode 100755 addons/im_livechat/static/ext/static/img/glyphicons-halflings-white.png delete mode 100755 addons/im_livechat/static/ext/static/img/glyphicons-halflings.png delete mode 100644 addons/im_livechat/static/ext/static/img/green.png delete mode 100644 addons/im_livechat/static/ext/static/img/logo.png delete mode 100644 addons/im_livechat/static/ext/static/img/wood.png diff --git a/addons/im/Gruntfile.js b/addons/im/Gruntfile.js new file mode 100644 index 00000000000..3d4a7f5aa50 --- /dev/null +++ b/addons/im/Gruntfile.js @@ -0,0 +1,20 @@ +module.exports = function(grunt) { + + grunt.initConfig({ + jshint: { + src: ['static/js/*.js'], + options: { + sub: true, //[] instead of . + evil: true, //eval + laxbreak: true, //unsafe line breaks + }, + }, + }); + + grunt.loadNpmTasks('grunt-contrib-jshint'); + + grunt.registerTask('test', []); + + grunt.registerTask('default', ['jshint']); + +}; \ No newline at end of file diff --git a/addons/im/__openerp__.py b/addons/im/__openerp__.py index 61baece6c81..32a88d6734c 100644 --- a/addons/im/__openerp__.py +++ b/addons/im/__openerp__.py @@ -18,7 +18,7 @@ chat in real time. It support several chats in parallel. 'security/im_security.xml', ], 'depends' : ['base', 'web'], - 'js': ['static/src/js/*.js'], + 'js': ['static/src/js/im.js'], 'css': ['static/src/css/*.css'], 'qweb': ['static/src/xml/*.xml'], 'installable': True, diff --git a/addons/im/package.json b/addons/im/package.json new file mode 100644 index 00000000000..3ce6500a077 --- /dev/null +++ b/addons/im/package.json @@ -0,0 +1,6 @@ +{ + "devDependencies": { + "grunt": "*", + "grunt-contrib-jshint": "*" + } +} diff --git a/addons/im_livechat/static/ext/static/css/livesupport.css b/addons/im/static/src/css/im_common.css similarity index 100% rename from addons/im_livechat/static/ext/static/css/livesupport.css rename to addons/im/static/src/css/im_common.css diff --git a/addons/im/static/src/js/im_common.js b/addons/im/static/src/js/im_common.js new file mode 100644 index 00000000000..5307cb422fa --- /dev/null +++ b/addons/im/static/src/js/im_common.js @@ -0,0 +1,440 @@ + +/* + Dependencies: openerp, underscore, jquery + + This file must compile in EcmaScript 3 and work in IE7. + + Prerequisites to use this module: + - load the im_common.xml qweb template into openerp.qweb + - implement all the stuff defined later +*/ + +(function() { + +function declare($, _, openerp) { + /* jshint es3: true */ + "use strict"; + + var im_common = {}; + + // like underscore's noConflit() to easily create an amd wrapper + var tmp_im_common = window.im_common; + im_common.no_conflict = function() { + window.im_common = tmp_im_common; + return im_common; + }; + window.im_common = im_common; + + /* + All of this must be defined to use this module + */ + _.extend(im_common, { + to_url: function(file) { + throw new Error("Not implemented"); + }, + notification: function(message) { + throw new Error("Not implemented"); + }, + defaultInputPlaceholder: null, + userName: null, + connection: null + }); + + var _t = openerp._t; + + var im_common = {}; + + var ERROR_DELAY = 5000; + + im_common.ChatButton = openerp.Widget.extend({ + className: "openerp_style oe_chat_button", + events: { + "click": "click" + }, + init: function(parent, channel, options) { + this._super(parent); + this.channel = channel; + this.options = options; + this.text = options.buttonText; + }, + start: function() { + this.$().append(openerp.qweb.render("chatButton", {widget: this})); + }, + click: function() { + if (! this.manager) { + this.manager = new im_common.ConversationManager(null); + this.activated_def = this.manager.start_polling(); + } + var def = $.Deferred(); + $.when(this.activated_def).then(function() { + def.resolve(); + }, function() { + def.reject(); + }); + setTimeout(function() { + def.reject(); + }, 5000); + def.then(_.bind(this.chat, this), function() { + im_common.notification(_t("It seems the connection to the server is encountering problems, please try again later.")); + }); + }, + chat: function() { + var self = this; + if (this.manager.conversations.length > 0) + return; + im_common.connection.model("im_livechat.channel").call("get_available_user", [this.channel]).then(function(user_id) { + if (! user_id) { + im_common.notification(_t("None of our collaborators seems to be available, please try again later.")); + return; + } + self.manager.ensure_users([user_id]).then(function() { + var conv = self.manager.activate_user(self.manager.get_user(user_id), true); + if (self.options.defaultMessage) { + conv.received_message({message: self.options.defaultMessage, + date: openerp.datetime_to_str(new Date())}); + } + }); + }); + } + }); + + im_common.ImUser = openerp.Class.extend(openerp.PropertiesMixin, { + init: function(parent, user_rec) { + openerp.PropertiesMixin.init.call(this, parent); + user_rec.image_url = im_common.to_url("im/static/src/img/avatar/avatar.jpeg"); + if (user_rec.image) + user_rec.image_url = "data:image/png;base64," + user_rec.image; + this.set(user_rec); + this.set("watcher_count", 0); + this.on("change:watcher_count", this, function() { + if (this.get("watcher_count") === 0) + this.destroy(); + }); + }, + destroy: function() { + this.trigger("destroyed"); + openerp.PropertiesMixin.destroy.call(this); + }, + add_watcher: function() { + this.set("watcher_count", this.get("watcher_count") + 1); + }, + remove_watcher: function() { + this.set("watcher_count", this.get("watcher_count") - 1); + } + }); + + im_common.ConversationManager = openerp.Class.extend(openerp.PropertiesMixin, { + init: function(parent) { + openerp.PropertiesMixin.init.call(this, parent); + this.set("right_offset", 0); + this.conversations = []; + this.users = {}; + this.on("change:right_offset", this, this.calc_positions); + this.set("window_focus", true); + this.set("waiting_messages", 0); + this.focus_hdl = _.bind(function() { + this.set("window_focus", true); + }, this); + $(window).bind("focus", this.focus_hdl); + this.blur_hdl = _.bind(function() { + this.set("window_focus", false); + }, this); + $(window).bind("blur", this.blur_hdl); + this.on("change:window_focus", this, this.window_focus_change); + this.window_focus_change(); + this.on("change:waiting_messages", this, this.messages_change); + this.messages_change(); + this.create_ting(); + this.activated = false; + this.users_cache = {}; + this.last = null; + this.unload_event_handler = _.bind(this.unload, this); + }, + start_polling: function() { + var self = this; + + var uuid = localStorage["oe_livesupport_uuid"]; + var def = $.when(uuid); + + if (! uuid) { + def = im_common.connection.rpc("/longpolling/im/gen_uuid", {}); + } + return def.then(function(uuid) { + localStorage["oe_livesupport_uuid"] = uuid; + return im_common.connection.model("im.user").call("get_by_user_id", [uuid]); + }).then(function(my_id) { + self.my_id = my_id["id"]; + return im_common.connection.model("im.user").call("assign_name", [uuid, im_common.userName]); + }).then(function() { + return self.ensure_users([self.my_id]); + }).then(function() { + var me = self.users_cache[self.my_id]; + delete self.users_cache[self.my_id]; + self.me = me; + me.set("name", "You"); + return im_common.connection.rpc("/longpolling/im/activated", {}); + }).then(function(activated) { + if (activated) { + self.activated = true; + $(window).on("unload", self.unload_event_handler); + self.poll(); + } else { + return $.Deferred().reject(); + } + }); + }, + unload: function() { + im_common.connection.model("im.user").call("im_disconnect", [], {uuid: this.me.get("uuid"), context: {}}); + }, + ensure_users: function(user_ids) { + var no_cache = {}; + _.each(user_ids, function(el) { + if (! this.users_cache[el]) + no_cache[el] = el; + }, this); + var self = this; + if (_.size(no_cache) === 0) + return $.when(); + else + return im_common.connection.model("im.user").call("read", [_.values(no_cache), []]).then(function(users) { + self.add_to_user_cache(users); + }); + }, + add_to_user_cache: function(user_recs) { + _.each(user_recs, function(user_rec) { + if (! this.users_cache[user_rec.id]) { + var user = new im_common.ImUser(this, user_rec); + this.users_cache[user_rec.id] = user; + user.on("destroyed", this, function() { + delete this.users_cache[user_rec.id]; + }); + } + }, this); + }, + get_user: function(user_id) { + return this.users_cache[user_id]; + }, + poll: function() { + console.debug("live support beggin polling"); + var self = this; + var user_ids = _.map(this.users_cache, function(el) { + return el.get("id"); + }); + im_common.connection.rpc("/longpolling/im/poll", { + last: this.last, + users_watch: user_ids, + db: im_common.connection.database, + uid: im_common.connection.userId, + password: im_common.connection.password, + uuid: self.me.get("uuid") + }).then(function(result) { + _.each(result.users_status, function(el) { + if (self.get_user(el.id)) + self.get_user(el.id).set(el); + }); + self.last = result.last; + var user_ids = _.pluck(_.pluck(result.res, "from_id"), 0); + self.ensure_users(user_ids).then(function() { + _.each(result.res, function(mes) { + var user = self.get_user(mes.from_id[0]); + self.received_message(mes, user); + }); + self.poll(); + }); + }, function() { + setTimeout(_.bind(self.poll, self), ERROR_DELAY); + }); + }, + get_activated: function() { + return this.activated; + }, + create_ting: function() { + if (typeof(Audio) === "undefined") { + this.ting = {play: function() {}}; + return; + } + this.ting = new Audio(new Audio().canPlayType("audio/ogg; codecs=vorbis") ? + im_common.to_url("im/static/src/audio/Ting.ogg") : + im_common.to_url("im/static/src/audio/Ting.mp3") + ); + }, + window_focus_change: function() { + if (this.get("window_focus")) { + this.set("waiting_messages", 0); + } + }, + messages_change: function() { + //if (! instance.webclient.set_title_part) + // return; + //instance.webclient.set_title_part("im_messages", this.get("waiting_messages") === 0 ? undefined : + // _.str.sprintf(_t("%d Messages"), this.get("waiting_messages"))); + }, + activate_user: function(user, focus) { + var conv = this.users[user.get('id')]; + if (! conv) { + conv = new im_common.Conversation(this, user, this.me); + conv.appendTo($("body")); + conv.on("destroyed", this, function() { + this.conversations = _.without(this.conversations, conv); + delete this.users[conv.user.get('id')]; + this.calc_positions(); + }); + this.conversations.push(conv); + this.users[user.get('id')] = conv; + this.calc_positions(); + } + if (focus) + conv.focus(); + return conv; + }, + received_message: function(message, user) { + if (! this.get("window_focus")) { + this.set("waiting_messages", this.get("waiting_messages") + 1); + this.ting.play(); + this.create_ting(); + } + var conv = this.activate_user(user); + conv.received_message(message); + }, + calc_positions: function() { + var current = this.get("right_offset"); + _.each(_.range(this.conversations.length), function(i) { + this.conversations[i].set("right_position", current); + current += this.conversations[i].$().outerWidth(true); + }, this); + }, + destroy: function() { + $(window).off("unload", this.unload_event_handler); + $(window).unbind("blur", this.blur_hdl); + $(window).unbind("focus", this.focus_hdl); + openerp.PropertiesMixin.destroy.call(this); + } + }); + + im_common.Conversation = openerp.Widget.extend({ + className: "openerp_style oe_im_chatview", + events: { + "keydown input": "send_message", + "click .oe_im_chatview_close": "destroy", + "click .oe_im_chatview_header": "show_hide" + }, + init: function(parent, user, me) { + this._super(parent); + this.me = me; + this.user = user; + this.user.add_watcher(); + this.set("right_position", 0); + this.shown = true; + this.set("pending", 0); + this.inputPlaceholder = im_common.defaultInputPlaceholder; + }, + start: function() { + this.$().append(openerp.qweb.render("conversation", {widget: this, to_url: im_common.to_url})); + var change_status = function() { + this.$().toggleClass("oe_im_chatview_disconnected_status", this.user.get("im_status") === false); + this.$(".oe_im_chatview_online").toggle(this.user.get("im_status") === true); + this._go_bottom(); + }; + this.user.on("change:im_status", this, change_status); + change_status.call(this); + + this.on("change:right_position", this, this.calc_pos); + this.full_height = this.$().height(); + this.calc_pos(); + this.on("change:pending", this, _.bind(function() { + if (this.get("pending") === 0) { + this.$(".oe_im_chatview_nbr_messages").text(""); + } else { + this.$(".oe_im_chatview_nbr_messages").text("(" + this.get("pending") + ")"); + } + }, this)); + }, + show_hide: function() { + if (this.shown) { + this.$().animate({ + height: this.$(".oe_im_chatview_header").outerHeight() + }); + } else { + this.$().animate({ + height: this.full_height + }); + } + this.shown = ! this.shown; + if (this.shown) { + this.set("pending", 0); + } + }, + calc_pos: function() { + this.$().css("right", this.get("right_position")); + }, + received_message: function(message) { + if (this.shown) { + this.set("pending", 0); + } else { + this.set("pending", this.get("pending") + 1); + } + this._add_bubble(this.user, message.message, openerp.str_to_datetime(message.date)); + }, + send_message: function(e) { + if(e && e.which !== 13) { + return; + } + var mes = this.$("input").val(); + if (! mes.trim()) { + return; + } + this.$("input").val(""); + var send_it = _.bind(function() { + var model = im_common.connection.model("im.message"); + return model.call("post", [mes, this.user.get('id')], {uuid: this.me.get("uuid"), context: {}}); + }, this); + var tries = 0; + send_it().then(_.bind(function() { + this._add_bubble(this.me, mes, new Date()); + }, this), function(error, e) { + tries += 1; + if (tries < 3) + return send_it(); + }); + }, + _add_bubble: function(user, item, date) { + var items = [item]; + if (user === this.last_user) { + this.last_bubble.remove(); + items = this.last_items.concat(items); + } + this.last_user = user; + this.last_items = items; + var zpad = function(str, size) { + str = "" + str; + return new Array(size - str.length + 1).join('0') + str; + }; + date = "" + zpad(date.getHours(), 2) + ":" + zpad(date.getMinutes(), 2); + + this.last_bubble = $(openerp.qweb.render("conversation_bubble", {"items": items, "user": user, "time": date})); + $(this.$(".oe_im_chatview_content").children()[0]).append(this.last_bubble); + this._go_bottom(); + }, + _go_bottom: function() { + this.$(".oe_im_chatview_content").scrollTop($(this.$(".oe_im_chatview_content").children()[0]).height()); + }, + focus: function() { + this.$(".oe_im_chatview_input").focus(); + }, + destroy: function() { + this.user.remove_watcher(); + this.trigger("destroyed"); + return this._super(); + } + }); + + return im_common; +} + +if (typeof(define) !== undefined) { + define(["jquery", "underscore", "openerp"], declare); +} else { + window.im_common = declare($, _, openerp); +} + +})(); diff --git a/addons/im_livechat/static/ext/static/js/livesupport_templates.xml b/addons/im/static/src/xml/im_common.xml similarity index 91% rename from addons/im_livechat/static/ext/static/js/livesupport_templates.xml rename to addons/im/static/src/xml/im_common.xml index e1c80612487..df5b90cce08 100644 --- a/addons/im_livechat/static/ext/static/js/livesupport_templates.xml +++ b/addons/im/static/src/xml/im_common.xml @@ -3,7 +3,7 @@
- +
diff --git a/addons/im_livechat/loader.js b/addons/im_livechat/loader.js index e5ea5b2c4f5..dcb134adf65 100644 --- a/addons/im_livechat/loader.js +++ b/addons/im_livechat/loader.js @@ -13,6 +13,7 @@ require.config({ openerp: "web/static/src/js/openerpframework", "jquery.achtung": "im_livechat/static/ext/static/lib/jquery-achtung/src/ui.achtung", livesupport: "im_livechat/static/ext/static/js/livesupport", + im_common: "im/static/src/js/im_common" }, shim: { underscore: { @@ -30,6 +31,12 @@ require.config({ "jquery.achtung": { deps: ['jquery'], }, + im_common: { + deps: ['jquery', 'openerp', 'underscore', 'qweb2'], + init: function() { + return im_common.no_conflict(); + } + }, }, })(["livesupport", "jquery"], function(livesupport, jQuery) { jQuery.noConflict(); diff --git a/addons/im_livechat/static/ext/static/audio/Ting.mp3 b/addons/im_livechat/static/ext/static/audio/Ting.mp3 deleted file mode 100644 index ffbb77144b2705ffb9a3ca96da750bb0060d8141..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17293 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 yuDsIWJ!#nX{@tEh$NBhB1%Lml(bM1A!`cR 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 diff --git a/addons/im_livechat/static/ext/static/img/button-gloss.png b/addons/im_livechat/static/ext/static/img/button-gloss.png deleted file mode 100755 index 6f3957702fec30ffa4a33eaf30012e06525ca9c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74 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 B7G?kd diff --git a/addons/im_livechat/static/ext/static/img/glyphicons-halflings.png b/addons/im_livechat/static/ext/static/img/glyphicons-halflings.png deleted file mode 100755 index a9969993201f9cee63cf9f49217646347297b643..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12799 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 diff --git a/addons/im_livechat/static/ext/static/img/green.png b/addons/im_livechat/static/ext/static/img/green.png deleted file mode 100644 index 01fb373c251cb73e1d2c65ea0b18ee64b40f6302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 830 zcmV-E1Ht@>P)MUJT8>b9gTq?~7${q@YpogrN zF*KdAvRsK4vyF%>D)cdWlb|Q({yX155f**$<9wX&|Ko7axomM+tC?u67PM(j!JOt0 zk_qZ*k7n$DwNYYWnQleNwnk%jX}e`=Z)f5>K|Sr!j57a})2o>w%_+9*J-=?Q@n+sa z=TMn^WugYeIo{JA%_u|JzfPus{jznwd7vnGVWbRQ9PwvzGT;rQ!|P9jXD}7@{V9-oldzv>C`%5xjBdEFb;XqPW|F+; zmI{tO6D0p?NC7jXp#;9h!|gZ0c_$9`-WcreQNq!aD3e1jqh~5UvvS_mYr+28(I_8K z!ak%%)jiHI=e`=1ytf5ZIM5%BeZDBTd=`*HE=zZa$;D@5=G_D4P^jvG63#Id+>>e? ze54^ly<=2`%3&oc29bWMQ-R4H#bCf+j~q4H50~=T>nZ3?>jvjXO`nA$NN@~`WHG# zk2R3S46xlWEs#TQ=ovHIVo70#X0~?36s+Z^HE`kBM*~jG#o)xO5se>~!}CUuL(jB0 z^w1P6XxGe=^ZVCcTgJkzRpObQUE1$;ld-b*4VPw&X!^qW%=`BSG`u#Vb|O~ZaY_3< z#U^&F+QuT-AEk)3vZVF9#H+cdqrTdF`k*v!kUi5z5C_K$as}VZX^Z-nSR!86TUZu% zR2+d5Dv_fOQ?evWuF#ZfQv|Y)M|{ffjQl}lH${9&DOU`ew+d~FWg$6^vy?3=ffK$| z#WcnZY;9bYuql4Cuswd0P#l{fY|*b_8^a=*k!O~1mi&@_0vhppf`ieE;{X5v07*qo IM6N<$g6mO}LI3~& diff --git a/addons/im_livechat/static/ext/static/img/logo.png b/addons/im_livechat/static/ext/static/img/logo.png deleted file mode 100644 index aca5f4c60d83a9dbad64173ebd22120bb4cca615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3600 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

m#q8IL@8DbXsvcm#kZv*<@x*))M$hQMUWOY z;pd3wnt9p7A3UTcgnpVZIyvf4t*VEsfKvPgAU__yIPh&ZnPhE$ws+k{)!sy~uJp2k zJ*P(NWa5>spU+u1!Ow+Ci2U>tmgNY`vF@WZ{I)z+Dm!mWR6a zJE{C!i}G1B@?T0NgyQm5!EDh#LiPXpYOIz|kxZwS+eG(V9TBYky{M(`HzI-p_&mOi zgcek$%cIs0*aTV`--BlBkmpv$ty)?Awyr6Oj}PjsD(azFhw{nP5_8ZWwIN<)2{?~B z!7tr;RNZYhj2g^S-L;e-npcp&X0NNA%b5BW(u@57lcvJaHS&l@+D8SFtkLRj+MB5% z`jke1&K^AnEuOTj_TK%kw&xS9Dv7c?L!YZf`DO#%9A_An17LB6d z!1Q=1zLG1TDLvXXSEs|$ZaDyjP=~=QdArit>G3EN^=cTRN|60K@0wU&PJVfKD95y* z#kXdGNX2U1#4?&M930DR5~M0BiZ4>(b|v6l3;hUYS4>iR*br-2KNVDH)&3f8H}@^) zG#?A@C9ZT*JA*b#NGG)cm^vq^g*`r`%p?dj?+dJPSFIJ5x6Ok5&q;-FP1Is*| zrY4oK{&YhL0;cq1aGncbQ-!ADAu0lCAhXZgRL8RBUZ3J?d5BHJLykQ*ZhMd!0vl9 zPkv=>#V;i{RpbX{z>QY!1T8sH=Vd)tr*OR!32b4{qP2r-?~U5=^ANR%RnpY+!Z4Rt*8# zpDr~%NAAB5J@_ukmnYpYH*Tc#QXDNG_t1^n_n{{*h*Bi1VCkg!XuZhlQ#a|$dfsG8 zQ>TU$r@^Y6w<=Qn7Lw}0O z!^a8oYa!^p)mrSuM_?#pF+KQAQ@P;g|G5O z5G@>N0a~q9K^P^7drBnkX~y}hy#XurnJIs1wG0otw*vVGy3K2DY8k6%lHN93L2t>#kxu4(&hhWoWeP_HfL?wlk$o z>lomb+wo<7Rz4p54ZmOTSMEw|kHyB^55MnHUWFcBj)C#Jh+^fw>4@{(9^^ZhJt)Hh zHaDiRGZ?SU4dh(+g!`TumrrGhn8MrD$M*1JbHC==J zyp=L<^n*Sq_4!O%EzG0IrPwuB_aQSZCE7wLaS49HVr<6c2KQjUZU$UNasR%SYHE3P zH>qkyJ7!h8>Zo2xGbxA(BsL(cGgzT~eQ3~qB$5kqBdG|e`LA2Id%`80o58yH36dci zC^iPE67--+PNlHK%+RvLY1DG4pZPL%eD+P$c?kMr(ni75FTaVuF|T?(&zc7&irSo) z+}`U|OrGS2dat5vD|?^luE-Pae{=qpoi3@e@KjrSBW41_Svk@ZljBLarJEAcR}xfi zD&$~h9TpCcdk93EOG{r^`vFDo#Y~q{We5j3)>-QM9{5H4mKQft4$SJ`TtO+s52Qm1 z@mpQ2?v3qo9kDHI?FXmn#6T~3_mhcwWV)*caSqpqh_H5g*`iR?mzUr0KRaI!^qk?l zc<{VNm0tzzF0`Kh+`^QjmjfI3%F7ns{Y+bM^6`cb;rJjxUuV{cxz^>ypVGaxk`1n# zr{NL+4qWs__i%nhm(OGd!5pg@GO{lk`3MelFtxmmpxyfM{av>Qim`(i z(#q{+0ba*$*I`W-U}_d1HR)Im*@)br_AMJeU!1{Qqexc1ITD_oR-!d{UPlsr*y-$> ztT|OGd&eZbbWZooDtE@4jUbLl8Waq6m=%eLC(`hq8Hn@S5fOdd$@sGsp~vL`J@2cN`XhMe!v7K({rf46BLiHKR+3nFHk_%vLW8Tf6a;1<#ZQ|b4@-v-HqQl+?f=?s zM(;Jd$l^Wgl|4oFUFH}F&($ow=;t87uIZN@FhGDEnvw6U$LqFB%FBVlXXjRi{oN0e@S7uua{}=R zcdk;F$R_SJaL-BW z0v@&G3T5`f2Qzk%HzOd|)Bc!2DhNL&Hm=h7iwM}91)S1D5c-=523%DyPc$oa)R zE)%vy`CY!InTn;|%xLkij~ReJ5qv}7)U0l&*6I&L$ z^+{Nr^*E2gwjFOjAd>7$uDzyn*QU{DyNr+Jqkj;eX^);siF*03Qa48WRZnRz1U$Si z(EeR@H3#m8x58w`xGGy908HiQr9s9JWFX^0u1eX~5cw>M%;scE=hM=j-0aHc$k4C; zP{xND7IG1NqA`*l(paYp`#|55(l>Iy!s-XZ3`KC1p}(K$_$_pAg6R zhvn1JW&~2;30Sa5#N1`p^WdF7{h5}ryp9{|Ld4%x)rFROa?+AO{TwbbPaHd5P7sV6 zt0A1cZx+9E_V+?P7{+y)_;9*br#_pCt z)?O2BMe@7S?-=HQ;HNz9<4a*X=OxA$x&dwj7wC}?g4NLFH+nah)vt%oFHfJZFN4OI z#ox;v0JQCXY!kzvt7aJ}Lf_1hZ9}@tKl`_olcnVgtd{Au?Fz4>aM0|UluE>7Z~cn$ zH1%n3erR=%J}qaaDkSe2V-D2g@y&Iib>ReJfR-{ZJzbyVRX{wE!8pi_xqYk4)AX4n zwN^!Fn_FdedQD4GQ;EMh>1q2GdJVg5gJG;U^213~S#Ww=Dvz!-`oJcjw?vsK44zjZz~RWRYilpBvOJQEMQV$9#qypc>q2-Y?YbAlwgcZs=JI>VzVv0j zZi=e7XP~Nu)VK`RzUs(0z|@`~;`aeQS3v1KP-Q2GBrc$8*Inm;?<(S}FQ|jlp5S1s z$w$j?Nc;K=k#2OH_{jNv;5s^2ne)n^(oGN=JC;)ZR|Vt3^nB zdpK73%-Dq4im$yO6ftVLu6yspbdPZ~YUUlv?#Z{!Z@@9QYk;#oXZ`9~kW4o^ zIao>(z+b5+fyiI(t_@ahYiZ`dYnimTt&0OHL~>=hq^a)|O0CoDscbo4=wtF=O@t^#s5 z0tcKBh-k)?ObRwTr`EGq|E+*M{eLlAI|fMs-NZJcF+3HL>oo8Cy4DClwy+Wp zL+2o0ofc19Y#cMQ1u}lwYTO{PM21&CqLOS;&9F5`RTH^j+;SHNy;H8qdzZ`M5kspu zW=zcsOsETL!8NJ&X5I+MbqVpR{@pzfTESQO&c8yWT$s`0@@HZ?O^wDr-fNk{PE~~u zLt+V)3g6L@w!y1BH(`DY5hZ)QYU9m% zX8<6XD(@uNuW7*^dc9L7{Fc6L{7L^wI~@<0u#H}vccNki1UCKdLlZ2K{Rz@4ur~U= zN#8;-L%bCyybCV2ih9vwlTx5xzt0m2V&fAE`|ImUVQ@+w8TQZ4M!#Z$`FW6GZc`Ith@MVor4kyW%Es1)0hrI{0oh5r?SN4ctfdj5f$Rg;SIPz@zT3U`dKHkW@%R(@khjgm0DL4N9a|T( z&x4Xgp@O+;wRrGl;G?$1l4h&TjualZ%g@dO=okhmZ2|6B(v3q^{Vi+l4k*yQ-vpN! zHN&xBh9ymeaQR7f1Lx-uhVRX*4|To2nszAZ>Vd)<$-*LtZtcD@-P zEatk~>|N9<;|4OV*&Cyr*&@VI6OU;c2T~*WM&E|#>IdmMRu{Z?s0Kf@U3m*etFbq` z2rtQpl1b9}8!y=ct&eyzX=pdC3S2t)5Z%k;43!Os-R}XEu(VUY$1nPkkQr`V!!qyc z@SlIJ5&E(&A15EbE5@Jq*tGJx8JoV&eo^**FZ`VGu)O`pLB1AV!8R|EaJ+ghep>%N z)En)R3*r~;fOHM@hz$Z6LwE=Qn5L$TykO(s5`)?P40p0N9t@ z#Q8Nw6kKx5Csg)vf}>b@vJdp5|4yQ7onAZuNBdmV0dIMf*?oY*aiAKw`pQNOr@^rhKGOoV&|pDP5P>H5ZWb zwZQ9H&hYV@9!qF<8l%369%2ht{%d#UvVW~tIQDukQtIece;Ufkr%`F_loAgHbR|qD zqvW_4g!o8nGlUiC7S`n2LknS03ol(-4>%Dc;?>HC@6q^Ixv`dr5OjzMYjOCQpk#k< zQ&h3<=1(ln6v^q=aVO)zQv9SHSn;xV)CwoJWMz6&nlp|OTStbJIt zy7$4R&8H=A^`>L*ufKth-6N7?sg1v@!44xbw1fx6+KvjAYd#XokrG~bLLs+VaU!jn_p;M-)VvohCo8NJk%4;THi8yDyy7{i)iq%6LJ>5QR5T`V4@lZzq zijp7Hnqjw=wv&cWh~X&Xs@He`eo!>JDXE`Z3^T1)u8!M9(;w;I=bx}8ZZcSaJejws z*TdiW(7Y>16cI5)43SRSz+618)MFLmEZLc-v2b+W5R#yC+`#GRY%H3S>IuwMR5P3P zB-thVK`23L3t6>=2jnzBg&l=m_xeiozB?S@(4$M-YiL?eDwg@Mv5wrfF?0E`Yax#3 zAOgIjdVo!Ng)pW6{N2`)=5)ax3=n2-5jMk0UcsZKYax2kScL$rGBV`mPe;p=h+RMDVB}M;L`6p6q2Q4Ro$_aOLD#R33p8jEbF#ubEDESy zI~t|aqmhZ_eWrJ2R3nKVK2qB;CBZr-s1N8+Zsamf=GtJzrXz07xN1r;Yf{LzXAK0) z9gI2!VtG-4PW?-BEd3){yF6eS@=-d`I%Qlm?I42sFsWo?14%pD>myEXZT)laZ`8)k zCAzl{9faEGJ4UzP{%Mh^Tb1G22#oOMLn2CxNIDkxP~Icb!R?}BO;R)PeJ#y}%d4~J zL=sYT?N|MIL~8*n%!^oUvCQiA2;9>qy!I2Z8E-oEB|x7vW_!uEF42E9tB0B3@-Khd z(@OxVylOUwL?>RJ%PDN^>XdZ8LXUR`1%W8(w`l9Rg_JWr3c8^PR;W2BVtDiPTG(49 z?n)k33?Nz(ULG?t!lus%t0`iG%*XbQP@}IgzXBccmKJY+V~{rrX&-L)_Fmj>MF0JJ zjFFX!yp1Z~;46Ul?(N)!kF7=geVJ98+nnuK9{2MUjF_sN3Iv7Nc)5ebIkCF?)3IDgD0t&vq?C<+^PiwF%Srpvf4!CfAT+n_%Fl z04%V8zx;<|&F#Urk9TXrF{3|;7pZX$@tSMco98cd{5HhDUe5}uE~#3T{5{v-H`_pAGd*S2g5Sg}gM}*Eho;0iXe0{DBQ2KbKD-zDZT;YYQ!7T4)&uDB z)b{6NGBs%@lBt^qbqx%`<9ja*)M#wIQ6-`!R>Xf6esM(+zad2UM^E<%Wq54;6cP6>n*qCvx^4h5nX}SyZ+Oh3>NbCR#{E5Q32ws2TYJ4O{^5g5 z@yk_g?VDS~ciS-d;B<;@EU_peKXqIg2E?m=ET{Rm@tl;w;1$#TMt~58pcdoyAb8b9 zq&_mJPdm7cjt=YhAMJLkF1fi`Mqv{0!j?{@D`?87u{xVOOK4bDiT%G{FfQ))3;c0B z#_)M%=URK(t@K8s^|6MyHsrhWtuj?{R&XT+gS(_=E+fR3zj5pS47Yn;gVMRY#*#-n zQ`5nm*x3Z%#)n2*DOEr=eh=@wV|e(W^aKM9FF-a)&k{n8{hCYA(JF1!qq*8=u!y_29EYvwwSW3=ce z6+zvUmGt8a#vn~Z=X;0e#s*`ja^Pk8Z{nXpku1bDAITUFlk;dh&tH-|R#1#cGE(N| z4=_-nd-p}aD2x8pfG|fVns$s9;O8~^FpZOa=8L@>Y70T z)a!~M?7-aE{Y13OA+}|ZjTbex(^c3M|>L|)lLru z4;X`ga-tCao1CJ8xT~}g%R7v=@!!t5!1Jck%feOszm%Ds8I}5*cD%k|UUA!P6jQc@ zmSs$XyJF%mJh0J;%sC#c9?Z*20APMT*vjW4&$!RD){q{)D#;Yj)SDW{0P$hq++bk_ z7!k`+(Ri1e##ClIJeB2y-4n$JPh_@8 zrLq95PalcfzK1#r(k0omZ#QpC+I8w|2>m)s6gGDxt*bcfMaPuxI|Yz zLc(T@`i!)I+S{S1ZQY>d65Bz}P(U^|FFfW+5Pv?Nik~p@l-|ovGslkYAov%@E4Yb@ z;)YZAd3Sshn8B87tj+f_XPROkTjhI0KyG%FgzadM10>m@<5Q;zB{?v99o|19>2l!d zATnmJJ|LXc{8tpE%ix5aD}ZY$zb`);yIQd__yfcnZk0;RxhI_CFS;*EiHbx8a*27G z2{Z6NV%t0M*+vVQw`=TL}q^C!L~D3~6vAP1x_=4W~g6U6Bqyf`RBC9(r=k~LNoGI zGCK~J62AU}iEt}zd(bk-W`B4fc)@C^Ua8Q!Z6>%L!is;F(O*q*SlY8Ahk9bt`!U!c zI~{Q_#1&Mx508+SZb|j062IS3%%z{Hy}2bEu{mc2Z*eMUxQeS^r=b8$>C|ygSTO$O z?~;M+X(GgxR&Z8!Ps+^0&yq9N@kv&8a0d=X-!Crpf@y~ulIqWVY(TGE7?T4o|Ne=D zI~i~ylH)}eW5_yPhUP!%Kb8_XdU*J0EF~ZmSkh0P`xJcR>JN4*5V)cP1**nW4=yEm zT4la6G@0L(_)%(2-0ewXVaxWrw`)p$-D7Ia@c_Gy5a)uMvJHK zFJRs`Eaqdnz~8{Xnm8zSL=&*Rr~T_%QbrLZ4zFVb;(NkmMn2}JW4}#7ANYeKki9DO5nb=j_o3AqFvq<8?mYcYatagY+~6T&BxRWk>Hc&g^2* zvG}7DP+0%7_aWTAKifLr(An$E(Vzv}C~XOCg=J(>;rfCvD1?P)aB|P!AgPNH(ji?h*a=d)B59N>l3qMHnZ<0hdx99+w%ajn`#ag~8! z8r+#-`s<%Oq9b$@Qn14w`eoLlW^7H97>gF7AQpLiz-f#&C(Z8N;n=3GGajMLqZt8y z4>&DN=NAe_KQ639Z3$Dv$4CW|t;=Nw`?r!vOzFE0zHXk)vs?gLa1#;5wIiV|i0t9# zzy1X2#(8wN4khYGpfQSVHeJT`)BX*K5Jd(87HrMjNJ>{i)wXMr+oQe&*((i|@4x{K zQaiCm;`#eRJ(%mUK;S@32p5S!c!6guI4GAW=Qu&2(H5I*RIZ$8sr@%hR8f(&M;i+c z14@9#SN&u)%C_|px;%3d8F*o87Wr5{(DGDHv0#Jmp7*ATXyIU(j+gqGY#CLekDefV9KBhh zV2kf;U^(QpXE$R@ndSHLWGJnmeviy^|CBu*A(zxLwS_NYu`bOCpzi4&L|^SnSU27r>EtkQPvYuO_d!ML3Gnms^BF5k`GB6Yu0NrBlKQuXQx|X zEn;IX_%S?{+XGyX=n9G+4-afk{>XC3>;y(hCK=x41sNzx7=e5YXtp64|32SMeE%`4 zhr@PS1!ERbYkEKVya*{&JJEF~svUf{-6D!(!eSYqoff zwNoqBO$S~6W=ew|Bc=R_<4N(G<)h12ZD>~`6Ze4|#4O+7gt;RZLH*O7$y}lDbk7Kv ze>BlKeBom}6(@+-q+xXN?$;BH&nYhdHkGQCMYir+tIuEe2TSONX;bYq;*zp2j?yXU zI%>X!Y{@nSsn?pID$EM&_E=(ZU|x{6Wb)uHm?ZmX<%OH(T5W~zb$|maaHCnGPr?u3 z9&0)CUw_Jvt1%*8O{`_&uNbgttIEiA3jI0wgUM^FDc2PZI6VYNpI>;6UY=ZEGA`Y{ zP|+Q!aBQRCjq6POv_CPsUk&ct!_X~jrL`X@PV#auf_DWA$5)!fP`AbOLa5t`TNpi9 zxa2wC!lL+ifosSb+oY`hUA%JvPr1zF7{#ylWk@eNa(N^O+73&CK`bXB9$qUIJ`c2o zkR<^WI4dp~=e2&r7OD}#CJ#A!P6v8iL7+gVdHe0RA}~V;7D1R$);LaQ*;?30;?r^Z z#LMSc$o^iSz%%Y3g~9Htgw?|I`nei}--5k!=(|fiq-)?(n0sABO)ZDW&gWsTQ;U7N zLefCXB2+D?Y-qwRW%D(cl;??+Fhz!c!k7Bhiji*rpwXCA4bzVs-g?(E605TFOSvCB zq`0I@kV)7xh0D8V7q1vN7#wY4po6Kz{Xxbg`{I7K4P4U(qHkQ#m2*tK4wm8}L4#%p zl}&M)i9l!st}OdDxJtzb;)<)>AZ(7eQb;oT6R4x{Oy>X@$DAF7t^Mu^*z-K5-p=<_b6WR0j2OmI-_ zS&A5as{^z#1cVoB+6{$vL@UT$jywI#`Q?}3;k)zZUCu~iLTAGf{)$FloYe7JBBKnU zazpdhEJ<_8+QBx0WseT(xWdQi%-uX4!yFJV!pXF{Ay@Q(fl!Z|;q0`-Ik?#(=s}kq z58vn_;c{}4^sx0g`D_hSHG;4rc;#f-^K4M|>{%LMJJ$~~Ey9<48D@fYB7ST&6ws+N zKvL2xxT8$c7hjo+=iGvKt>|&K67wS>ymvzkhfxN3xJ5qP^W)S*AuMV{t zs9|X+wR^U~m>8CL`)y^>rGsjWSm7^n9OWx(Xlfy*z@T5|QfH9|7_#rHo5beh`za~A z{@?>M*#G;wB~zwu$XAfVShH1OV@b8epo#X@g|klM%5|3VrIX{BXJUUPcCXhgj$THjQMOO-ld@)`baYdOvjEy1r|_R(5e zwp5+TNO1Tu`l9ze1G!as&szY>ZK%sRnm+ROmuezHIfa4GTu~Q?i$5GCwGjGv+*8+N zj&qs1*XlkVV=%IlIdc5kgL-3nm7&P6Lk*&m7?Vy0gxgrYJFtNblE5>&l~E zuWTN|ws`X@w_vBbFCBe|QF6s&L8oie^KbOXX8iUgd6;T?q#Sj;t-xVc5b#$Nwb@w`0k9j_Ka=qcbKOYBgKT3u^XIp9p_uQaRH&Z7fl&ST3MxM{X9_L?N&S2u>ukyY;(~299V>dU1};L2uv^x zGdfMFZ~g@~|xx}nq!!ZMIyBLOf>mfJ8g zJXCjmWF(Zb2p~)sFDv?fU5}-^T@T?#*~ATl42rp5SUb+Ml_bn;O!N6(PFU8F!QB#{ z-2}%*2So?ZC#Ri70-t2Pzt9cO=;YMn+ci(Du*<;#v{2d3ZqDY#ci3r%=hN$My!Vp4 ze>kbo>q?~G?m*!%VI`cKfG@jQKMuHkVC62rguXlHq=m5Y@RI%b&AkygsK|RI8?bF; z?iNv4ArQt8!k~kE=5|;C3_%7%{C;6;!x3SFEh$RBXd8gB;&Be}0DxXV*qEnf?rL|q z0#X3L%)_SWy`lwC!8V4@^mcN;i(8}P-1hlEj#QnQ-O0@fw@jk$nr$UtJd%Ogmhr=2 z6QUD1v0qQU>tHWiEe4Vd(;*wUh1YIpxca%@*52%z5pXvTY)=4GEE3@0N_q~Bi;?E< zZ`gyz?m*zpvr+ob`K!MV|NN=UFAUwbz_Tu0N`zY$JQqhsVT^Om?fH~@2XcjlL_E#l z;8mfYP})uBHg`4$x&|FW`{j}_$2tY(28hB~`$&rp?!X}%h-d*ID~}W|YX=*{US61Z z*e$4qj&n8+W_UV-2{z&FMgah%(#LChm(jPh9N$B{O@iDBvb(?{ysh%sW$owmCV&%<&{(4h+nR##bdfESYcJN#|kN_nf>rGw0_|Kgo7XC`6^7Uy*;`pXc^7 z&c~~eut~SDgw~6ULCzF?fGvy}c0CTOtknU<^~{WW704B(1>K}W_f?wDg#|X$cTBH> zjL8TW1^`T9QiH${3`8(dG8`SyE`4{*)33lX;Bz+kgkAcw2z%}I^d_tq-wwa`{E-r<9LQgmyFo7;i%myHLAc*ssx|nUA zP+%AG^3T72=fD5??*IPJ|MQdoeD}M*{`J5ASNl8wi>JSGkz+3|ZoU3+x&gi9AKXhW z$M2u8>Cs(fhBN6r4B9pHruF0u3xU(;Sy8r&tZeJ_0GY)V)+XJLUuNy~>O9zs{C%fiZ=dh%PVXW#0Fe9R zo^rxHY~&7Dm?=T&fi#WkHa53|F=x;I^I!jr(%t9Y|4yG?zV3d{{@u7Sw|#b6ZuH$5 zjFBMFAq-^q#}?Sh<-oe{X>rIr;G{#?b`P^U!5s*eU8ur;NEZ7^r32C5CNq9B@Fw&H%VQ z+_85gwt5HLhAjYugTR68k=Y6WxgpOHKoGLYdAl7)iFy~?(z!}6;g@xDeGapX-85Uy zMvAP?hk4kyYzCH(qxaeUW^xJFn^S$fFB?z{zHPQUch2g6Jb#Lx#J=P%A-@AN)@zIyMO^}J-brC>U7eGYgE z^XAF>uJH8(zKEl)(UK2k7kXuDg@{fJ1@MyZ25#Mn`$x|^H%1e_`vhgT?+OITPPj+> zt=}<^8=ud2(N#7i&spyl%`9j2`49dn=W{-3ZqMgr-16j=b4)TQgN;?;9D&DzAT=9d z>lgxgH_CIfJWOHif-70~&V<3L2&ha0+_=5N>&nzBgRRpKlmLuw>M@yZ0RIcKK*IW_Qo$-DmByTR{z; zHqg;MdEH;<-~V@}pl=g@8O&R)z0 zSKfFzyUX8}jSoKO7W}^9R@vUsv;g$og}Z<*)U2xr>*~Rob}x)a0EH`WH+r)F%fd3hE&ua8`F^v%w8N^5IjpQmoiIe8g}JN$XSe{ulj zuodk9Agl_<;d=W}`tAb((8Cy!gQR*ZG?^$!C)eD1FX<=_6eQ1mV@0S6cH-EIf=CX_mZzvhhb=YtHT{*9BSc2{ zR%)s`-hmo(3Mc;{Sgh7Z2cq98TZLIBrIf-JDlyHL;6* z?GA+vNMr-948RMV==Xd+EA1bB_U+D|Ku>NRgT2$VTOaP>_2$psie0wihpvITHA1aq4-1@a+NH}bFy-nczMO4?4eq7mZL*HNU;wD#VGl%4d$_O-aF7+0zQ7LR z957+r%M!oGZSIwfI|d-E!Zr`vD94daXz5i@Y!7Gq{`LYq=kA1E+_NfCP4Iwlo`j?) zFK}BA+hu6x-3Svq_K@g60bJ)`-NmGIbWJ|RdnLq^}FrsIoImD zbNP$_003uSK|&{{-Cd@;h(wSU1;A`f z?kJ;5hBE>e;J4=-z_Uy7@tp5p1iME$d?m;^gLlkltQYX5a~H$d=1$N%x!2`h!T4_L z`keb34#SL1aO)zw7qI^DV(krftRfZ$48a!J+HC^4fBnQ~d-Bb`=H>YN&EvIR&RdM> z)g<5VhhH}S)&G9+-+m|G!L#St{8)jJOcu{B8#E%tp?99!;OVv_3ZV(YE6z-EdIT9N zySPoDw?f?j4eawMxczGd218(wfEkRUQxIPSHaWcxGaiW0fI~f5cFv`Zp1}`Z9mOIxWZ}-V?t3hC3_WSU@_(%G}+4#!( zBy^!+pEJ-7VLONA@Y@q24CYxM-Xb?Z%YZXjva-V%#4t_!bC$GQ&Tj*3k#l`kCLIi> z*bN*z2TG#5@8Lf0J-M928F}{iJ}$XtqOR<6PFg63o9ENZ{_ywiT^ocmDa-^QFrSRH z55+MciZvHd#--akICSD*5#B3}fOqJ8>`mTdU`Pie?FLTS+N(<#bg(iQ zzyk0%R|stN3_MQ2@MmLln?PY78C+YnpFfmoHy94+F9@!~q0H@ZW9Rbx-G_#s&p&TM zw#er~R-E_d`~CT>f3o}h6Ab{hjIspJE z0k-D_Mgv3{yM)Oc2q-A~{Le4K){L!4&nb%!!sat%`T5U%IC{K;-=FD+viHx%^H8Qs z??=D^0j}2|<~?{`%hllx0mL|#cYhcFW5`4Rv;wg4$Tq<~z&72G>3ee=W^~*Go_ENO?;qux=g;XB*ti&K z(4%3=U>#U`d0rh`SB0}Z_j7I!To1f#2&Z%7476}j!O^hC=WkE5$-A2)*)SJ}Mx+Od zB7A-ZJoJ;Ayl2nPpFbaX`1idH&;B`0*!`SuAKW?pLJ~Z__j&N1KfTY&G*5cNpeHnk zGB$kNFCCD2n7Rsh?&SL>m@iKYVW7^7z&fg7mlcI8M{!QZu;hD1pFx0ijGPTN9K*>H z01$v~QYlA>Tx3I-V}o{K@-B8;x1Z18Fkx2^;4WD%yjb=P#0+YnHwGHW#=B0c37$VcJjLj`rtl{X9u5cuQEp?vN*xkp0>+QG@j6sNkF(6e7~Lpo516&mqW z0{85lc9yCzIN(4MmhBDz5RNNu7y#ED@xq{HFhQFqOyL}u2evIin6L{2U{D5Q6{x`_ zaub4#!^%U;b63vullw{O&ZyUO0c`wLaM`xF8n#7-0y$fDZ*Rn;yMx`uGPoC%F$3ea zX#8G%&*ytVe_(t>x~(@!9?H2dxC!TR*u_kyWkrOvM_09f7a$j=IC%Vi({j|ld}{Zn z{mD*7%LT`-%_otZ-7$zy5Cp#3F)0As6Jgs1xUSWCH^%ZZj;=nIp?j5h&IO}&HE_uR z7^5&?2MjO^aHTI42T7B~X;fit;$SoONhJVF+GOML9lQ+v1kN4v!{uoo`{y%wc9?Es zK*{&lGvlIeaillzi@Q~rsA2fs85}NpxR%G&-v$I(VS5p_452^n{`xq^Bg(Fxhxamp zgB!>Wbg^cG!N9FEfcDU;;I*-G_0q`)sn9IOHx!kLM0X zWx}<{ZMFbQYv{RO0&KXtIbd`O?tFUhNj3u7k^Hf}g~9o`Q#`wjUI7{A&}SFO5^jN> zlix}7zTs;p^7(#q4xDf=rXi>K>?c>`oHx;1D4WAf0T}?j3XFc=H-LrB zzK0P@KfH$JeS0s{GhvwJy&dP00)W|A#O)k9+hKCxc5@|e-%YLuTm(=ThGP>IIN5ma zJfUA7jPDJ7*o=bbW6Sx((6}N@c7!lsqik{N>5bXpcf?<55TcYv?{|9uzd3pEv#aB1 z>zZ3cwE3+2<_L0!T-jCt)o8xv)0R{qnGX#M# z&Lz01#J?0m6z+b8&T=(YOR@zM;W$((d*=>+a5HgXNFF;jSNL(@q2+%hQ%aJD7QI7=;P2fz}wu zGJxKx_PsT(Bq|K%07njWJ^h{{89iq&=Zvrlz+fi;0LRimLI4E-05KL0GFFC6WdLJ( zt2=naZI`p|GTGmrT+Ys;XQiC!*x<{9#$k%E?~>KyB%a$Pj3<3I_Qfi+3{}TCBVEThYPS)Nj&WIo}?b`7m@Oe-RILc zPeDX5=g9*ykljGKlic5&GnO;pa8h>dP2l!<*z(yn6sI%Y=#V4Os9sNB`gS4g-V4s) z3Y$CJdc3d-$wUAI3?~_AdU<>p8GpcA1m^QZ-%C!ezB^fNjVooq2H@>>WZcRV4p)b; z(G744Y)m{` z(#2cP!-cpoA|3}zs-GdF#mnytJFwgDg@l$n20L!E$_fA^MRpVJv6DMM*g2>1aq%U+ zNaUQfq|MX2i)vtDN?=>8yYE|vhc-XMRp;8U$rRd-3mYt$mBWMsNcMSn(Cs+EVOrb` zNC9x02j}_(Fw?}znVOp~(k-Z3D9EPF0NOi&&$K7ELw`;%y z4`bzJmjdOmLHn*_BTQj;^Kc)o{r;S{nF*o`$T@SxA&h6q>#n+?JmJ2X zXUgr4w;6^_QDiT{!iFGjU2<`PO|EE!}X>p5pc7|_dwtwqLhx8ZPos;`#8z$N1rCy{{OUvS;a zlRiHP?A)v4(CxeICGQ(uKCrDjY^&am+zamhT~^4+J#OO$pYB`2-UoiD)QBG#P%@j5xm%j<3~Ocvjt6i_im5>@^bG%e9nuv$?IvJi@OYl#u|18?mh5HS>*H* z?_iL)tE_xruOm?DJ(8hjgE_n>W1gPoVfOuGiwm1W7Uh>Hh#NQ}i(StrEA_6Ni}fdmU1;#rE&96M zoFDI4sw5qk?&_@Pv@Gc1bm$xQEd^84T@ z;@JeBOyGXOkZjSDThObVEuQ7jhvj59*h&pjo?%fLKHG`{(4I&1tjiv3Ny*3{8v<;c z2ga~iBLHkWGBB95hW9Og!l?ZC=77panhfNuTb#X1I|5w;u)c`}nJuI!q;U!M*<%~0D z!m!_4-LX)0^NyMGf{a8!7aXt+&-M~2txq?zFgDX}0m^j30A^q`y*tlYzyU7eTN$qT zVTIN6!k71Zp54r20f4S-0Ao_LcIV-D0B^N6>b@CFMA!yn+%IQLkdF2UVS^+7yg$#v zBJ+MvSb<=M`~8bY?(fS4kZk~q8@h>7$@AO7sAnbt0nQfXKEE$K`S7jq-23;0wr6)& zDck`%d3ntaw@x0`(FZW)^X*}{5)HzZO&9GP$sAj@mU$Qp_ck5SF*Cf}yUTNW1&1hP zgsL63mE(mj2vWiv>V=KMoB-@(2*4I8+h9W!25~fQm*babS3e-{7i2hOR96Jn4J2vz zxB_W&+z#kE?6{&bGr5;}sJB3Veg@gbHEqJA_xYrKzZU=moq!B* z2=l%W-W;mX%`+_YXkZO@eGcC4B>jJWPo}TkVJyj=pyIyoIj>o@k=w`0=q_FaH(?W? ztUIz{A2>0gJPZUz-ND2cVGIvV4=~g1;=V7kZR5fY`(f7{Jf`FT z0EDrT`0eWxKD(T}H_nU%VWelB*#L#%U?X*SwH?ss=U%uu+pTw#=d;T>x!2Aw-xm+u z!}Gj63bcCGOMI`)2z>X+^0?6GdR)0L%9aDJP^WCun*%$JE#L|uDCx<#Jzkkk0FViH zumIUS-<$h_4A=&Rq&(84-~mLCa%|xOL(51U$o=h6xZ|7_etQNJx&sk$ zYzP2=y5-0;K?mplLeu+uVc9`jpC_$;KYO3|Br>PxIKq7x+zM;f5p_u5oSQK-Si+3D z5-1c^(L3-AmW#kSgjGlvDua@3FaegVUZ}7Ygq_YIY`Yb*GOS^nBFF$htH8$CK)wa( z1fa(oI|NV&`)q8$?!y?DA9;G8`}MvHtOL!404!w}X^Sk_I z_m6NVKj%nJzl76Yi!>*U6Lw!d-O0;AnJ|tRw<{hX=uDx?7#I!!C}n_Jyh>FdFxa-i z?k%#>h3zO3%Etb1O~A5D`DG4=sEZ8agk0CW%laMd494YM_>!w1qg!-6<~S}V};9oGt#GT ziDBLn?$mjUOc~<@79P8R z@!hknv`OOm&G}pXIc=Z!`^f^2z0EWDX4{oZ7&C|KvwKb%3ig^Dda|%UDS`||?&bU4 z1h-u#LbyFomnE`HHarstgN_KqjSH?}42E~h$zXsny$E*B3v959?3ciZfFr5icMn@o z)(et=w?q883q8H**{v@g*CkuofR4gej^5cP6Jtx3z3&c>-!;@gUEDU=|4$GcC0Vj9 zM|NChz9X~hp&!wIod5Vpp-@2JR^^H9W>mF1cJ_e4#6h)MI)^CFe@rF+e5wF~7TQQG z+(OFHi?RYtgqqHPpqO6Hd&_ARHwQpMeRnO*K5xGIZfrw;mVyN(cFR>~M_Np^t+jgS ze8-7|3b70iuZa|hS~Z|n^tP2xiV`Xct?@CXu0&cv72GO8L{Ozk>$J22Kt;VMU|>UW zi>P=<0iy;Aq!tUHf=Z{-BBYI|2q?*R5F>fp&3ROvl_%R_dR$p8tr|*0fDS85kKT3L z)E!Dh9Kx!$%QssVMJo&phpwi|RoYu`0M5^<^E>H<+y7feY zUb)4o(8U}TVNmCE*E8pXewfY8qX?9|T@5t~;@b4o8%ZI1+`1S76olJKU*Frtl+xn1 z0Hs4XLJAV_by@@{*90oCC?am9UM#3p3MYa3b>;UZr=3Kc;}eKVHqGM|fJbU*ky_4?|soksImG0|H&#iZZ_OnSjg(!6KkRdYMY16(EVyHVTq( zR8ZA2n+B?a#zi8)bO{0^ti-n9J(5z{Mzm150UG;*6v6;N5S0XNB~mN^9YDU3w-PkP z_g!he#BGf@e69=IfZZaABh)o1?l=fScE)h9QJYjjwM-oZEVv??VJo!=wn&;S#Xh~C zXaE3FYN*r_J#YY90?{&vqO44}s^2}+h)(;ILJ@e*vGnjh{WE&GJdLMErdFiQ5vR+T zwiuOxB=ZEZ3|;j)Lev%_0$N!Om?HWC1|)XD0McR`gVb6`6|798#!zL|Du|;b2tc*( zTiFS!A|gW@w?%NC60fwt*H^ zingk?kR#=uMI?}zdf(s>(Bw$ax;O%n#q6pSd0UCP(@*4FL6ER-?*_r94lHvX6qZxM%~Cz)No` z6%g>23rfmEWfcsRixZ?bHI*nZfZL{`6jC_HzricO! z6bfj7s+?YX=r$#LnO1TMJYAWnaJKh%E(( zxmC&(9uq}@GPI9SX`vF8gp^IKibg}B(9h>yq`Fr*qznZKKAL?cMPA9ptQ3Y6DiGDz ziSN&?kt-TeHq1oY3Yq((V!Y19IV08KTux3IEhVYPyB8vu>jK1g7RN+1~#nO3w25JmFPaVytj z=_vpbCfQ@{Hdg{4C=Eq8rBZ1C00Od8)Oa-ur66HLC{$o4jJDCtG`-~`RV|(@mY^+? zTWf0+Y6q-23=}s>QyDdFt&2pk+HtnpkfE|fD2$-g#xnh?=C)EtEgUSYBpTUXWVTYP zDNt%CmE3&=C`+R4pIOM3K9ss2+`Iq<8T10mB6NfkvdROG(bAgY6@b3 zVxSNJA|U{PQroK7wpuFc)B3Qq=Cb5R`XNS=blSiUQbX9=hTO^^>4qW9^fLDf zpddh2nYvrKji?0_1P$OvX=X1u(-9yQgeJ=o>n+p01qob=l_Cc^Ml<4raC~;jnIZ=S zeP7SCzfV4M@ta6ldZrMT3BT3DB@mNJtBo*|lxS268qr7$DF}$TZ3|+zpaLxjN%c{o z6p=-;5CN$r8nvO-l&-DkXuiL7?3vM5$@%)$ob&x%(*j(CK!O6aFaX*WLBfNB&`hr^ za*EiMh(fHz4WUIgf2)_KgIl5!$y7yx0oI`P<~;3If>zyp7LCLf0t03Zm=X&+aaRIB zoZbl%_2@lc?+uTGM1X}`i56c5BpLwPLLmgJrSmoeg_*P;T)FKKX5L5#wCDT&{f2(- zoVOj?An0oIJs+!b&pmgMHeeFzeL#Cy`y+-{Dl`Iz`3Tg4+PKH>Go~#rNa0<tUqiU#|dIxqxnNVPv zzIhTU6;Kh4n#6X#&i~xY>H6jT)S4Ez5DDf!S|JMn` zt(1Zipr8e8awO#G9G7v?xKUG-P@}SUP6Aw93fS+({?vuKq>AK&=#gm-NPZVfNQh;q ziVB+{LN*d9NN~H$e2wm{Cw5FlB^zxe7ePhtTj3_Oj5ab&&-7ZL2HG_Xl8_tA&-ct3 zzW&Mie%}53=ly&!pYG=?5$)a4-5gbOUq7pj&foV$%I^88SHLt>h*_W-aCH_zk>$#` zv@01*q*N39=S(RD46d=qkTC{aZGrLc-~Ha->i4g?`}^xxnOVMvU(>Y(;trh;wh&0* z#^t%Gpw&$~0(@nGT!zp{5Vg3V^h6W7NFuxbE`B3s)#Zo7t5d&HMg-r3jbWWfdKTbSm@tGRU3Y zBQ;OrRFTjE&lc~FUe0ewCOt07AC=NBvt^((j9Q`8wn_<8xfdZINS&iZs;0N51yI!@ zn}Ugq2t5?diWbu`EyA_5qEgv3uGZabOD_qbd6(X9Nd!d{gbNh6#ngpLqLd&(Em})d zMF$|90?49(gi>p>fB7|b%~xlFs!}O^0I4|#sz;Ha;Ko)ZvYW~yRC!WVph!!X=-HWK z@O)5Jpdd9n%xLfJb2(kRHE*a-MTdY~%t=QTGeuBYVYoS=xUnuPRt41HEA_RVoOwTb z4*ZzKZQ_c%z)WHRA}}h54Ua+&mzI}}s^YFJv4wif4A>({w&Y{$d zubUAXwW7S?9fEO9x(uzY(vXos=i&N^@`#j{9o1x|{?vKCzx}@a+kbaX{dY-A<-KR1 ztmt1RVh}-;uv^-@k7AsK(k*VvxH|9OzyI^!KYuY!%}9FM5y(bpdu1bS`aN; zL{+A2j{sn9eXs5Ll_j5QMoP=b%ZNY=MJwD7O)X8=rglXk#U?G1y5p8onMe?1>E1O; z0h|Key+6tJ=8EOnExl74V7U>kmD>WUP=h6J==Z%R+~5Cw|31I| zhsH5N${@no9^S8ot`bAf*LKl#=HyqAhy@f*o_s2+`J>mU7f!AgZJtiJ~mv zlnOu;04UF&f{HS2yG%vBtM7fQaV_d;kZ%^$g5OYoN(U-OVCjfrC`R1FoS&MZ6$nyQ z-l$uE0-%BoyA1bxUXU6@<#U3krbF9>B1us4k?dW(U(=4TJd$n|302W^H^cqm zJpBFj`@e60{ZEXpBRol0r|&F0K(39Im(n$Q4Co(_iy>qbXl~XQ(P!S+$cOS_hyNt+StIKNmyqzkZ#!Q@ym7c-tYZ5xRXu>vQL%0G`^IOk<~{ zwC+|&jnvzBVWa%LyB~eJm44a}K~MtK)hYTCgv}PSs0JJG1#uqiEbh^Q&(72Ek2@!Vp@B4Rsy3h03*+@eUs$G&1txq)x&T5LMBguj`L6IN= zty+T+08reUdJ>QoYPZE==;q1K`I+Z)2h)cY?knsz&Br4Om}0%bhPEXO$ViO@ zL7GLa)6ZvHOZ@%$`q%7uR24~%y|O0jqjjZ@-jxo>+Ul5c42WGAznP|2qRX(3&aS3a zEbVJzVke4FD#S%lJZcAFeYt>>R`JR0p|3*EDS|K8#m*^ z_0}%A+ae@&ZERo!lqMC$NZBBZWonS7pr9fbROsYhnbsqbAPRX#1yC0RRHETbw*qlJ z2(2cVtW9baThn)hG9GXWDHc)Fc$vZqgdK{WGhWDHt5=gED;O$?THBclj=~sAw4;P& z^nUD|^T`MRyOKh-vPa0iA%LJ&MeOS6Sj@_)6jfLnQ)o3ox2@s%=AZs9XUWj1ziKt{ zwAIsC4)oTn4CFnMYVcjrf&_+fbl9b`c--b%TR=pN5N&kSQUtcx8bU#6mKq9eRTY&R zN!`klXyt+Yok1X^&Q~F*k!cBPS0K|OQ~wE#Xq!9}#e)C=gwZJ|h&XeqQvENT#!wDend`)Glwrt2cBDG7j4 zI)IivC%X#WX#pqC} zs7j4?C8XRAnZ|&$9pOYuYQ@?swKGi`s8oRR&{hpbl`yFg#e}9%RoVi8p-41VL8>JH z3Mv%pHt1F$3Ph^>Boe(T>;_|P#-=qb4$xbH@j!JNQB^IiJg;O5&?dEtfEKkP>%m{N z<&=9 z9W)@&_Ke&GB?D0a3vj7;NEG<9~pnL5!rMxWJm!Rv8^Ja0jX^PQt+S_QGgQB zhCn2Ujy8rsAa&PZ$t}_ain78k>;fgY$a>clLP|C2DMBuCMT#hf1hsJQdKM9Yn)DnA zGTx4pVr!Z!QBW330BMazJy+jEqSmMi^eVL)o4o)6+SB47F0BIS%wkQ? z@6k_=mK~LB^`&gRqbq+dM;g?a3r0gX)ruOGAz-FnMO&rDERV2TwuddHO0DJ$2|Ff{3Png+l_HA3haG|2^<3*d@@{!qOpRlOA<2c|DId1fIf8LxzkxM=~2 z_Xpu#SqiFvq!x0MGKK$R zQ5mu4kb*{mL_{JhS~OwUmc?|OI9EifktoQ9B&r2TMWHIJ4&PS9&zIpn4upX+`7!Ge zMZ#(g0Al3c1|UWe5kxA~#TBi&^7FVo_e{R#7o5~r!|F*Z$DX`1k+9)*1;bXRaiD-C z3g@^GTXJ|lx5^f&DOAtEnnG1IH?7!G6@NKuQ=l!>I%?HoTkQ>P9xxJ;;a*yKlV;|J zsepRJBpal(2=G*}s9{S>c&H1wqN2r9RAouZk-Oa*6$t|#-JQHjbtq>7-Fs$>%IvMA z0Hj5fQ0yCx7+$1}49WO|ueEJ@5x89&x8BuxY~^cn@Mn2?MTJCp1#l#!NNQC%i?K*j zDH65&%Ayk%_b3nz9X-$ahkV|1^{06@KX3o*EA)LE{(NzMc>ev>_6qYp3{|NNIUiRJ zNbPK65PClarQPkKG)T&P{UZ^B@#wOZIFteTiROC zJ3fkmwl+wPptY+8ppgV3%d7;TN;{ku;B0(b$-1kuxEXi43#3kIYd`?K#b&7e@pMNE zNa|3Up0;*d5ye6PRdXJ~^Io)PW17{Bv{ZxSFjq%=x$5F5ZTR|Q!R|NdFKQKF-dD%d zMX8s9yOsng-aCp)t0NA<@MlI}&-;JrKmPrH@b};E&pZ0BfBoad?z#e{+a?%6E8}fJKng-c{U9mKkrpb+ z#FZAOl4u>&HmKkMAO%)n5Eqp?AT8e8w3@9Theb$e@(DAfXS&mm#ub~PAy72}HBLbr zW0GD}p#c9sL2!&9OA_Q(@BtoK{bzP5kSgzgH0l(%JJXfn0L@}5fJ&9vfLf;pJfmzz zU8FJk7*gV?dXwj;pjhwm{qK258jV}U2C8;cjU+0HX?#Q~NUd+Iv}-lpNwAA3ol)<# zG|%yKG(Yy4@z3-5oH=vms5<>!U27@5BZ|ZoVq4Y4vHJod6_r#K-FA`M0QWkrP$MLc zc~exV8Y*p#S`011LNTq7x*Jq*0i;T#u7_%fXfwBJZ=r=END4?ukXD2uh{i=mGNoya zBx8PZkK-aW35y+QF zs@tPI=kCvZUsFAPcQ!s<+M1rN5f!Mf4dE_R(sfN*jo!K~K!t-p>i28#jk2`KCd-8d zLYDdHml@4S#8}#(QY-C_I*3WAm;kg?va|QQw5|XsSk@{lt++&nDvTrupcN^t)DonY zvj8d8RJ=K=2%+y9u|QL)lDeosfKeiqNZl$XlmZf!TJ&tUR%>%q7m&0JZ_M^mVvAO} zAQ@V1r7EGXRG^`z6jYG5n)glXqe>X;7AT}ETg_T7o#{e}7(uWPZEdFaakmC_d*?wP zNmHx<9?^7qD<9ZyK^v)(y>fC9*Tf|0NKN9lg<{o=8dIPxF7R`|axD-OeC|pjB2aB4 zQ5va;(j=08G}*Q=0d$6HWf&oe=q!RGHRxNV(pLR>at2bTP#v1pQn=P)e@;LO}PV~GII?;Ufi=Uyr< zm88)Y0J3d^Ai_Xb7#7^B6_N~yrdGR8LRwc}tBCy_gH7rm9TuLL|9-*TjLFuap`2n&(a3vAXBfHW-4d_Z1 z${kyM+D#{Yaw|$VvPv}CIpK`m$PEUWOmih|A;sLaQ&&n_M*BQe2f-IGEG-CxgcL9U zG$vRqLR)&;NhT1egND5-iAcFqUq8G0$H-J$^yAf=T`o2mj8E@MCsp`xZDBdCp7 zgji@>o7n|XLN>{T&?dhul8PueByRN8cX;l>rqIBm;aPEST)kTSnzI(tForxn8 z{vU_8G2fXK+UBk~V@#1F3Nxk|YMZ&XM2^hlK1zxia-W%yG-sPDWXP>3Dfdx1(oG7L zN(eu{f8ukz->=v6wBG6Ko+Os*&h770w?PO}5KjDfGOFscs~h#ko_q89-cLu zuUs9Lql=i~fdmPQnsM7e9I$}94tKI)|HmvGE}yv^D_5&jj@g*!)IF8Rp3xi^Swad zQm)9Cy#wX;Kd1tlkGH!jj9xa`B7?LdFI-A_kyJ-0RnMH6Br*|` z1i_+&-V+{wNb1?MAV!w2NOglyQPS-Gy+wwV8p&L-tPE3%04@rcYr}w=45ov7u15Ukv`8f9)3#1IIV>-3x&S<53C`D@dUqx07bqc0 z4ht#je8O6uBeB1KtU?`d@-_DqgelZLqB|m7K6H+>NK$ySiWK3qU|b1kk|9RO;D_BG zPIssq#Y53)JkDRxn181YFu87A7~l04RUm=`6Y9LE~aRLRXc97rDIeL z4jCu?>Bv(4Fq$wmIVg3q*dEoxxcmfdZ*FC89Dh9$S{ds1gC@2)H8xW6G=PNJvv~=W zFzj;*O9h4bZ@Sq*)Dol5=Wl+72*98%PwTi8^RhAK? z16+HVcu9{at?%vuDrzsujT<=q%5DGr*oblyTAVuF#4J;Atq6N*c_lYJvy3bX2bL78 z9|#8^YVbu{8Hlk;J)ABr?ZnvG`3qr2k3Z~j1jX5;^0hbzP3q0h+KohdhQ|E@{X-KO z8YI}X_ew`DrqO{5$iXd<@P?&FTf65D9Z5RJjKO3QVh{%VikVxRM3D6;YiLXM6W%HGX34{( z_M#=Lv-k77y*~S=PBvG}avdUkEE}^Ez&JT?;5ivITAE+3tGTpxO2|NoB_hZ!MT}ub zUN748o4h_J?6WyF`PwNCNX7Fe+)jH$-k~QyntxsndZ;ar#7FgE)~V9gq-}~;|e7C zH=D_(1xqHSlm}5RNZC4iwaD0G8=3RNYfdNtWaLXq-GfKu=HCkLCt90l9kFapX4kf`0nkY*b<@yN;V3@bj_I(YuA5V;BfR0(S&{egMwWq!j z!BQHz-}GY~yx!+$o7Cne0hC@V*bY8>KDvi7yLz(o2T?g9t3gfUjnVVt2KbfE*5DA> zYYXz9C+#v;U_ha+HfPKR6(I;(@e`}QnC@!y+b-RnWPi~|oq+43?ziraeIu(|p?m`= zJjC=-9uWZ1rJ2DLo>{0E{VS)mUcddai2XJ_N5EiNRErHL z;eU$V)Xm;&EquJCWw0Ipc60WUPgJC-T}$xo3+t-B1&R^=5J9{$lbgoB=t#wV4OLhWtC_MYSg&j?S4e_v>z* zdh##v-UV8fL<0&_nd!l|jGMY~V_EwkD`_rq`hIM49;aJTbMm63Ou?Tyq)a3vx;nu? z`9xs(d%L-k;;bSPi|T7#wZKBauLIE2rN^x95k9S$6n-Q zpU}T7PAT0-|vfS%q`_=OA-V88xxqGcS4F7vc`umFr zF*(w$8}#~lj=YG*ZZ4)K4scsRUP<|UXu1kDhXvQ{4;6q2xWYU(6-2$HCKD`k6u2oc z-3eB4X!B_adkcBlE3CxTel0^XD2W1d>D85 z0g*Aet1EXQW6ikJXzz=|czAB4iHJsXd9jyrFaA8Xje1(BTN+shuw9XDbc@D0`!cA6GzP2iPNNeA(pz z&Do1hjDBuk<}I(KFS*EwkLLvH=?3NAko0n_Px6wdXBx`w9Cao_-bsa)K0~Qa|9$b| z^T56vppTi+QEAi1PW&y|vei}Gx-|6t%ov2XFU3`z+y=U5+OavuNBh+lZ+XSd4pC~( zsa$BPmAo(U;NwGSGcmr?C7EfrY1}~hq!W@aYKLiD7LO2m4q}GgBqS0!_|*K+YoE`P z#+%@@p3+h{s}Ii1bSekvc>x4p!Qp-t`cl-Y6m{A%_10krbVIT-KC`wuDJHDqo{6o&|u;7z?9KYwUMs-Z5BdiGh<(s@r>tN53` z&+z%4pBA3LJf8}FHAF-$1tioBSfZzNO4h>?-vm@L`w7fNab9%=F-cX|Nd!>55&)A| zY-YzL+!74EmyV{kr$(nL*eD6a1ik9Nb=>>tdfTtfUUou?C+T3$Xazutg5jZA z)pOQbym5qNZSq+033Tzk4n=R(FsCuQ38B{kbNuwe^9GBe53<%n%gEDpOR_1XyYs7| zJ?X7JcNDKLVg2gDnu4V?93PyFR7e|W`E}#K)>X#+lxfKzDAPc|smc!El_1|aEC8nJ zt@jC;*J7?53u}Y1Q`EfIp^G1kr$+%il~@!HV+Z6d4hXG9@#A&#sC@f54KiDW1`(A} z9+Bt`5>d21>pJ*L_Ki!+0!&7~!=-ziFY=t&YLbMxXa8|Bj(`9wOP>w+#37fQmuAIH zCtp>1wX;zgp_{T`xN~Y@V{IYd(&+HT+X@2sN@1)I(36%cC?KJXI5B_qq`LQscza;_ zH*{I{V<+6dmD1q9W%+Gw_M|_N>4qkME=_xMTOdvx+SKW?mprcY)zZ+};?>y4bipGW z#Y#b@u?sIP_4p-=mMIwnM(-i)Bx1Cmd^rwN0{r@?FnJ6g%=5g>)iB%4$fJ0gI`~TR z6d*Rqjqe_Jt$TN!B#!a%_E$(1%MNVibM!v~9H$0=?tTt{`1wticn;C;Wb^NX+_ zkdEC2gA=a)E75m$i|$5uo+NIstiQaG>;y*fZ$MO$_ue$ALIm%uZlBQjeaD~mcSl}| zzO`ehEk;jEdzBLQG?+yc)U(i zP6i~E@hcq7PJW19{Sv+VK|m3Vv9f@JyFe)?6 zWIZ#4bKmBwm&UdIr*Xd zi6Z}}W@bu^z6p7#Urtts>6H>r{%Sh|A1*C3HCMP%Y7rTWB&n3+AF5wcwlUg$<0GrL zH>=~vkGLmx^C-fo__!nQ6~3=ddLW&`UDVkF&?S5+1(Jl#T%4{EEF+g1G9n5~6wqvx z5lj0(9~LC&~VT6Imj7ACZQrqiV4Rkn?Q z8EAl{wesqQeuakrKijg3_^bU7e>qkI`MBJKMkJ5?EH?{0J%;B0tD7;5(3a7ZQC8Jd zh1u(VEEM8MH1uLWp8Mht+pC)29bSlu6EE$zwNg`fgU|$r0W=33tb8=o8c*pKKHzDx zWYmIQrsF-s@BYVK3G*+zY`!zu?lQf!BGeqfo5LvIRrCtjkECZo09?V3$00Ive#?aX zsH2vu7XXqplaR;9t4@!dFSJhSmggTj)T};M+0`s%l$%AIAnrq;T#87=lwW+sV@~L_ zn?{W=0k^9XVD@wKxS6+?Quch?7>yV*JyT}8PCScA2#!^&Ns}RJsKkR*%iz{MQx^+e z@4ngHoIGx-2;qm8pR*I|Fv7Yhg<-%F?z62#Q9TLFa*c#FO}LEyiwtJYmQQJ!Xb|6DZe) zD6tFO|D#hztbyE}umqC0u52-LQWV737j0y#y*=<_%1zencxTj~7g}Iw(13Hb`;~#w zc5B?&ez*dMpYYL3%IJH&}iea-(5xA=5&5;#R8@tn=5otHBaU7_M3%;wY3rc z2?vEkOfn}slUsvT;MEZUqXWS)SlqPSr)m5W_>~Ym2}*tST%{dVf%bxF zqGW_OBGaJm%b!)prdTz*V(@N1x~`abo3UaTl+vl;8%DPlW@WFJG@XV8O#A#$<{+y_ zWr2SAg0}=mA9Z)gOY!m5@o{ctxf5{*|NdIvesQ;JN9UW260TCrB(OQxjfhu1q`@cm zT0)RD0E^L36^r;U`Zg(}EbeV)^^VBz$F^gcy8jw)rU@m@L0OsdM3GsK94Z<2E)gb% zKixO4fw_57^gUa_wh0@T6ut6(ye5#AaNAIyKfQ}~ zyC0vAv}T_f8o}g zD@YuJKCeL$Dt|3;nQvPxwUW}WEq3~#6x+gNH7nq}5}|JUl^lta3S>oI002ydfY>D! zQCGiqR?>%DO@)I6!pyc`G@$+6lwIs4(2P0&+>Rwi6avPiYh~BVREy7urb%%$bSyoVrR()9dr1#5Hn9_q!*moF(@+1<06Z+Gp5wbxd< zcEfgewtjkVU3;)CI$1yHv#aQ;7myXdS3Gd3wD^^C50dPh^g%-WT&AZ&j30?$f7iv| zI7zg4x=I3LM$C%;8KJCQK_T;-G40svW=pckC0d>7I>9Vnwj5jaizaUqVOp zV0f7u59)s%!&g|wr|Z?o+hnSj{F-w|Ew%{5X3FNmZ!|3qAat{4zHQKK-mE=Mq0hcs zf0nXrgV4RZSJ-H$TS>@0g}1L{O+FAz@7>)cbl~0YX*_nhIIhUZhIuZA-}f|o3gV%e zWJ#iXghmlH{E2!8&*A;f%lXyS-B#1+>7DJl=)XU`H@rI|cf%G*m)Gns)}|LweGdC~ zbwv?q(1HTTO5Esw#)*TOct&1U<|T8DY1p&upK4No9<~NKKm(TSqFDwO%uNOXM!KKg z@x4!%^`wdjmcZLR>}`7o`bCwyS3)LyuFsmZFAOvOgo z=U!a3;lq(dOGM7&s$$3kBmWC)|IDi}|EVbbd$@5bK-Wp_#s1~oum{>W8<1}u_rOS# zx_F7Pcd@&_-BE0oKYI3*|E0smApzf|170+3TA0*TjoUWd@s8`g;h2OsJq_c%VjY{6 z>V?#uOb~R2Wd!Xl21(4a^$-#rD^(Z+^Ze1%Ss zIL;Os^Bx(8*G@?OwXbW~?D)->hX^$Lh7hyc{7-)@*{r%`VhTG*lqiDihpijpUD76# z(OGp&(KyoY4m+z$cW1R5ZzfYv+!=sW(wK*`@PRlits8}rY(5|vuTwz=s~W#&7T9zi z7+<`o`kdfbb&&Z%u4{XUGZpvq+{HWrLfYwtDLHRxzcdE0+*lx^=ia_1l_a-vk~7sV zW1_&wVb1IKId%fT$n?L?L9Dcu3mix;7nC=A{i=J4bvYgoclG2%2<{t(*DK9Vwfuf1 z;^Nkqh{7%ROtCMCA-SVvdcH=yrC=qq*thg`#d_Zcp_nB`Ix+>l+~D@avz%gX#Elqy z#j`h6HPcX$snVXbRcQcx)z(Yxp^~37V-$IP{7ORhxoHpIcZD3_o$d2g1v<25`t96b zkp9M58+wM7GI#eBU$zX%a(%|eY>4V#x%`8t{QV}?&1af&`X`X<{8U#>SoI3P5ik-} z)Cp2Da6&-GMBz_K9>qascnd92EmZmCtVJn~S$30ZN_U9w>C)BVd!^euwVMR6*S#^N zJHsRP7bN?nOU+8q{hl!rnQ>f8?d8i^Ts5)$elo&bJp5#zA%B^^FN@E;56u5h9>uST zt;!wN#AuJSz>yq=I_xpH9Xf4r=5oLxg`_wJ;FGV*tmO#7+T({gZs1ipe?(iTxG8%s zyrr*nP6RoYW4$)x}=^KsLHbRBK+V-&dN2_)yQ?l7lBnmTWH!h}0;1Y@{g2(c-&BAJDTVH{#e7sk&RmGG7iWGdRdI1kFm^thi z5gB7jy+QQW5J)49FOPn@_w|ohh+P0WIBPOjk9F3_%K74S?`a|-)=fj{Zf`bJ7n2I> zR`;J6X$tH%Dqsc&GHyTo zWxK;K_LaQO!B$T}>ZuHiAI_>m16k_h1G&s(IE(0`LU^v0*@Uq^nWOJL7IW{6k4Ey` zj`R&i*}xTh&rF;k;g%>~@L2~AS*e4NZzmnpP8|!Tx$48zAx=9s#o8c}^F_HeQ3 zS;ZIv>1lB}fDC@8evaxSr%b;^m~G#-dA463<(6?GQBgSd>b4D|KFK5pQ>G{hD=oYB zL-Y>%xC+FIY5UcztOS2x-}CW9L<2q1<%VD@8%nW5hS~>IRvaYiT#!b-|NAk8$qQL0 z(sE`91JE*%M5U$r%Nt=4m80c`t)DO4*+b@#K(;>GJs@uS`NMMjpOF~E>1WyvRY7g| zN}0{6iAM5Of$U8G_}|+IXmOcU(VCj^pybrgu zo}3W}AtL5JQI85};w@01=_aD+m6pP14pAX8wgJx&_?*#c4V3%2QHr^{eWN{k(K3?- zl3LN|jqIzj!b$%(nk@RWTg%nw>!_h0$;4YAc0I)okL+22Qtyc_NQg4#=ZaU`F2Y{cd(*m*< z&2fag(nd+cQDH4tKX3p3uT7}aEFPDMPsr=WOT@Yj4ya(6oWvVtzw)*vIpL4RR|(fe zVa!Y4i6pnPn0)omGb8JshZ7|`ZcOxW79OD z`%ul!zDW?_-X(E>1b)JUg%Q=#JM()}joNBX|4qh%lBmc7=Za_T!!us=8DX-0S4}^=YENc8 z#i2kB4w>oPPgXh=ZVmF~nlSk*Uv;qYZIm4_Z~x`R3m(*}+v`y#N+G(~L4&i=wvAFg z8TL<>t=xD%2&4eir2c(mN!#fOaW#3(Q(T|=#mPQvi)&<&o8al>$|6xoujRR? z>n}V780oQ8J;*5}TwCqyUXHQs>I>iN^3wA4EzE(PU+|Cn`Uxzhn~RWGz-?}K8Prb()an>&>##A zv|@>F4Ht5HY_pV&Q|KljfsJy2M3YPD%~3-kZicBp+TiQ<%`;j2o`|ZXike1DkX?}U z+ZX_Wcya_PBUa2S5K1=dV2Jj>Ne{kSLVQnx;;4C#Y)hB6119(vp>X*!);iyULQjH! z_=WrOoN{fxFn=38Fp~SZHT4|94a~Ok+^(_6$ZU~lNOAi3JxB>PMizX-+~;I!;Sg|u zlH`4kcZF_NUN;EGk1O&YIb!c8&`i5_qhu8^y6)GcsQ}as(3bzPVlgE&sOnfQvb@;| zt;1zl9X(^b{%Lf1ZQ;kw4#&2E3K1t%Z$eYBz%PJtV2`RckDxK`lnt4RAe!}5_Og9T zo7@Of6^{}biCE| zoD-v98sl|0zc=mGP%iog0B^M7gQ>94z2jgribxTxV!!u8*S)U1WcdS-7*M!mmzvfp z+OLgZ(j==&R>K6c1-ar7Uam|X{mTbrEZ1a8x>geo&=k}PM)jg5xlg|y(7km;^wSd+ z(23-IcPvV{~_M(zy$P$-`ew@3R2X`ItTAfk+RPjWxtf`;a zEl6T0$BB&!@}7^lB_5hQFml`qQbx~d*s(hQ(BN*yS|?jKnUg)?K+W^^t-MpoUKJiGE32%n-XlTlez zyj11jZISSzG$N`Zi7V{)wb)#H-@M2(UA^^B-kkbt)1=s7u@j9IdpmC6OYiyVhZ>1- zr`jlB>ugFLf{S`{)t`@p%DvlrW%=!{sA31^p%TFI9u^_3PAmz`6e-dMGxWijmqHP7 ztcae}TKJ2|-BatEqy9fTuRa0NoZ+^e?_Y#ZAQ~e+QW`nLI)8EW7y)UZ&+8ry+Q^G> z;zAxm=+q{c+ z4zc#?@_UiN>od?4t|*)v@BghPMyNofrm0b;_5gaA{%kClz#J0dXHMxdt1fp2_}tkIh9*s*smSqPF51O{XIMLrib< zMug!-B=F58egL1wGd{5v#VgGBR@M$~zdgcwA1*Bqh^%YbeS3eKTtC^5vx%idk~T+P zpcc&M;k~VRz|~L1d?IVISU2a1@RAK6+%(7KhzJf0Jz=CSKh!A0&#vc*e0^|&(mak& zwbbho%p9v7f`wKwCn|J7O?bSMi*pGMJwX=M*U-PW*Q!4ovYO^rZ`pCm&wLveGGjT1 z_X`?9C`=9rG1QTHFp0rp_5qNYTYD4>-Uu3yA|AWm7u@vte2VV$h0!)hS+4qcz8s7P zhqEg|uOhcU(478RUOLVQYySN-LQ)2A&vWpT5v&kAvn=FHKGua7(|O zP1Pi!wEH{>I-+>c;m3GJkf#WJ6lq2>AeuO+?+a$o9!=D{*}~LJ($?KOc!@H=mO&!l0;<)nDq^cJo zFJ;dA92M>ee&}Oa6F)K0dPvt^+|iwSuq@ZsR~Z6gIzSm^%{oX0GmYv3EJq^icP$P5 z%mkZ#PurKTsCn^D{;=v!EKQ4^1UOJ#KRXOKP5Xj4_5zHCMvf| zOy3#LEpf1@fkDKQ7*&vq`${CaE}ZJnfWEZW29g(XOjUlO`%s5rG`&n^G(X(e*~RDU zmQ9U!^VKaeA^R0b>??$~xSom?knVRQ(#0cQkuyzAwIiwBInIX8yU(eec&J7VP8bZg zXIe1m^#!j=K+Yo+%S0v#{EQWaKY4ZCrQ`PvNTbM?M4B`qnK1pF;yCqP`X3eIjJe}* z;OMt6>8)2NjKh-E!q3oubhSi;P*U-6PmVRDRIlJYCVJh=nrhS1GQSA=iR~GIfoEuM z*C2u|#z)ZjW0z8tcno!^oI?SVB>6KtlcuHzjg^lYL-EG52JUIFVv21>!S`=1I__Vs z^+dUxl3=kmv(u6y6hRgEw{){M2Ni1F1_bGVRI|r=qacztRf$;EAc-NYECy10>LZd| zYuR=jAEtBd`0ZfYmqgZh1tw0I0i1@<-RzoPV^XAOiC6_&ks5sw!2M8)ML@fZB+q+l zyftk|Q1~lryEch0AV8V$e^ioIP+&BSBZKJv zhC1kn6~*fIt2G2MU6Ho8SuJfh6!-qi8zYQ?mJv%uj5re5BA;)sd@jg?T?r5lyoJDd z)cEX~H!Xrb+e`=rot(&qGbLmfzYiY9f?bN%WC8f}hcmKHQ1Qab(PTw!nmD8tqJ}Ps zs+g1wGf|%;lGOD*LsIq$>=0eggc_RD#EO>78XWdBA)*zHiPGYN0E+sgFq`j6o>!h^ zHg0OuMw_x}iWbIHBKEAZAblXV9RFkDaUV_rI6(@Uv0>-|Q4P-V;eyDYj8jUPvz=@? z!E(o(T(y{Ru{JSVoR8iXOUdyl=N}|v1fIIReTS3 z?fhy!Qk$9`Qt#HDO;NwaaRXGjKl|F0{i*meRi1{rn-Sv#57V%-OTvirC})p05;14J zBGlahhr7u@L2#VHNTpwqa4rP=4VHv|XXv1y>z7sD=k;m{WOvZX+FlJ;0Ga?m= zwB|ce`iq5ts*esv{C;h6v2g!=ldgXY6#myZx%hJIdEVLInITc1iwsR3)!f65aRsxR zE8orDW@)PF_es_JX$WSkKre>gDpx=j+dpRfI(`60A>eYw_n^!DMu^IbbjA<qSvnFEAzJ5Yf4nvyP{`$ARcK7p}u3evh1FLtVTibX4wS}DA zei-O<-M!NqF2>A1>rK!{icn7{fc7jZf8i|->0Jn zkJmq9-{+tN+-jVzxX3=~Vim7iV>c@&WJ>%k!DRWTTf2Tda~hAbo#SQo0j+{bb!8eG$EprcVuAfK0s@!zxzBnk!Z<=rQ6^9h*wkK z!W^2iu=K2BE+$b0=l8@9_x}<_j_31im6t*Jei=8LD`ny`A8nk?h(-cKUq(heYL>Pa zU!{#F(*8?Z>ZGKwVb8a@iDTNIa>ho~-D4@eg`!y@X-*fc%2QP4*(WMB9pUo>yhEow zP*21H!wzgEXWrTJ1y?3dG^PqT+$Qy4wN|jdxu=&m%^Q-izJW8#en-6a5`K>-A78(% zMpop51`;_5$>2im)D&g4iyxA)b8p}8B{8!u|A5UWK9X@Du+z(L&~v?8jy_KL^E9ji z{aQ|X!Zu<;VMu7BQ8MTSX{NGeFV4X5O%}YO*RxfFnG_$vHz9+CM{+2Dn1U<;9)*ia zK0_njLD)rtoht=-sKkm=QOr_dg2Q7-^1uP2bzH#SEKZVHqOO=3Wk6fpYVFR>UU9&^ zax*uCDJXouTzst%d?~3sY)(d3N7L^%>^W_zB;4zDGE}JikzZ=EOcSNTA&fFhb@J0@ zcaJDe#OWkU6g_}d^y9^-o24mRi<8IO`l_!+mvr4fb`*91cl!zU#m&OC{Dru88&0pR z1opU2xh4MY-zeth+0ggI3H^M*iIIl6`4j+^bS+>o%2ZDfdLy+OH0+&u#^MM;hWF)V~Flc^4B-8N4Tj+je)diZi5Q(S6zalr4_tfD!jVTyEM8 zJz9Bn?sS_+PZkyFxsUJr@vG_9Ug+cghT-Y?`N&jhg?i4#+2Ne?$8$fHEuD@W0#!)h zP%a2oU=$A};zIbv_nJN(7_1{HD{xCn<1X;6!qDRXvx39A)jxYl3G^qhD3VXLU0PW$di?r=4Z@JRCI~|Jn1e z8*a2iwAYq)wg$U)w+q+TJ6&aa5Q%00B-H7Os-Cvde=(Xr9F?5|Z7wuD>Hy)-7SkOy z(atIc!by|Zqra{kC@BIZVvhxU7H0FPe)VO@Ll!R{v6Z_!5*=VoNa?*yzfaNMI{Wv? z&^AfBZgMhM^Hn`9?(1vLsjbMu56drF{6sH-_X580$IwT$c=0)yhu}v(Ysz4ApRA8W zX>N6*C{qxHh_TEOKb3^AlRzay(VxQ|ws*R7yF!t5pY{O`-gBZjDFEPn)2iX`Ju1^r6VMa z6%kK`pk!k9W>F%3y#)Z6qBw;*s>raPXy2BScVD}38hUhCXTOlW{+>_>Ra&wKld81E zeXR8a{at&lnA$?9dgSSv=a89N$Cjoi%D@MG#D5j$!aY!=AnL#tBP$DC#%7iEcN&B9{;|F#LK})rnS$%J7Qmh?I-++A% z&0Vm)QgJPZ=nQU%3gx)1f4U#Av$?+eZ+U&|^Zng_U+3E916CtdMgf+7@gd^b+!W4@ z5;9KJv5)CzxqO^P%y6rv%3F?u~xa=X9b*m0c(#R? zJGy3?S&I`dOi`^OIOKz z%-3-&C3A^Y!2s6fMV8Zxj!&JsTl!%^Za9Cme?g8;MWb9`(2fIP+E&UK$fEa0Tyu8$ zii7(5ruw+i5!mnSL%1{7tjU20C`~Hl7+=bKyc_lW`cn|Y*{JpCRDa8eE+V;)!fbKuI4X$w4I-K4ZKl*0z@fi{&VKy zKSz{y$n<@KO*k-XE^?*jwrAJAedruhu&(^O_Odz0UJvdx7-1dHn|v8*y2Jbx61~eV z(JydNVYionvWyLmKO8h(|If_qt)N?sl&5Xzif^Toq)wEVS|TO`LE_QAZDmC4n%N9J z=72yDJWfn>t7mFOdd1w}$V(CK5Q07t%pfS8`dI(_iP{Tzu9_$ef-sxIu8mfs)Jlei zzBt&2uhheDxnHWe z36rj8szAd9Mw&F(;RTq>t$<8oPELbZOpln&F`9tofkmf^oHh?-4noFqBUOf|!cN}f zP#`KfXRfxFbi7%wva8R+$0tj%sGfVgileW+Gk#82qrg-&CU)Q*yT0r_nX9e}da*V0 zT-vHSwEOOxw-0kDud$Smd;?I;ohB3OzKzPUwT0nf)1A+U2j$-EE}q=|xOEs85*=|J zc8jIRXwGAF#=jjINLKHlksaCLpT9oYUZKC4S@OAyIl*+uR;%i*6R0Vh=-Jv}ZbXS$ zMxCb!x9-DF5^$&oPQzfJk;q8tb~#d>ZMvSVY0XzXX5y-IU-E zDCc?(TMys@_^?v!rLQOD+hXRT z8|@p;rZ8(0zaal;+Xi7{U_ThFTIV~fT{#_3H0Jr9-yh+TsB`)&CM^=}ozaQIA=X0W z#gNc20?w|4TxmAEvuBk&+nFD|+qs+Zv+Mlp_3JGQ3rDwWGxzF!G)|sOIM-si@%Vg)Ygysyp%ECoHYe(P8DxN|g3k&p=QuQcAE~;fA9(sYK@uQl|MtmXAVDz@;hiPu=Mx)g_qr5tBoUF^Vf31EGdOm!bZd0$NF0E*`ET;I z&}Z!D@(*1ZlZ5G?luWY@@3TO-Wb|sn8t%x@6O%Mv)`8_ z>f9PiP2isnU4LKo@ba4to0sqs(b7k{!O7-8c+++WWs_YV2ZLRZiFa97d# zJ9|H^M@coz9?gfFR%*hl2;r8~$da{YLA4TqL~XF2@N`JdSF2xJB=N@`!*B~~pwzyP z3W@Cgt0r#GrH7gq_Go=2Oy*Q#F5=)3C`>>sk49b(B|~$ELpv210G|3@L8S1kJ?-Fhw zZZ_P{cL$>p@0IV3neNcPZ?rTIdkVc!6~}1v5DIZ4W-R-dg!k7Zo7PkxOB#XX5^a=&$m)AtKFx~t`uU+fC7$CMHoaxtMm((f z&(ngQP)!eka#sKoaq=myrI{>t4w0FxT#^5CoT}v`YCOpt6o@RgHcFwS)wbe!ft3}~ zGQ4iQnd2|M9&(A2_O zYN|o;@8FQKTnJGkvmL+Qg z;i|HrT(yS5Z|hZ|)#1~@)}DORq^H+U0w9&zTTo6z#k}-kb@Di&%m`gq0xyF#`G*Y3 zKTGPF@Rcyz-Y&1F#j2FGQeN@f8Z=_AX8L!e5|y0Wx=s}rnw81bJ{3q-=6($d2n~`f zcc>m<`i+(xtj0h`s3TC;`Hef?jXeiD#eP_R@=Q@q%Pvtp;W2zXOY@Weo9iRB3?x{} zktR*;)_-I{{Q7G}_D$h4YTQ*v!*nGK6=w7~F*xe;N#tUau5qdn4i9!DXHo=LO5Yrs z{$qLF)tEe4`{eTcHG{}RIV!LRBP+vy-q^FM(U@pQPvMq1EKE2nn0c|RY06@LV&uNd zywrV78Dy(CnSB4z3K>AXo&hqm=wcPJ_=3h0s&Q|7!9`iVKK9B~vV07xKz!~ik08>B zA$@cYG##e?{Z$c}y40~>LLNpLE6Ghpja`|4{^F_Q(sdV0OLs03;lczRGrx?ETV8m$ zuSJiUc_o9(0K=(w#0F(D(@8jSKu@ZBw5aYR!Ad#17W6*boFsfvR&w$-JJ$x?u{=>oPTSrch zh<;F=Jbl(6c#;kh*oul?ug`#LVKq+ZLny#sWTqcUL)~~`)bc8~j^(t*`msT1beA@I zr(5#n)R{P^@0cY62l*KhRmpw2y2MxwrHF$U>2B|y7p@%0h0Dd!fod3D8TRWt3$C&m zwi}XMo@)d*e+}iaDgnzmF8p6jd!0zJ*h6GE!AnZ1n{0D3jY2)U5}MU{>Cz7&tD}uF ze*?t{Z#S=ne)89*ZETgduyc|T9%{YWre|pJ5Aqv77IvX^Syf;a(Cw_vDKm)uUQBgs z(hXFm)|J5Cr}Lc-E{7y*`u?fOP>psJ6_b%{w{HE}iR^}N%;L(?A9~6PwoDGU6!zqP zIJ;U7D0oBSpc^4c`{(JBGr)^N^P_*1y$L`o0NhJF@Pql(w-=g+F8J7J3#y$Sb19e+ zF3A>UV(|WZTBhd4k=||@8x43J!tam+_@oG35I6*RtY+hEy0_X2$U)hEXIgx}mPoa( zW&C#V=7Iy6vdM1KLkXba>j@cS0mzLwE$GvpM67y?I{NMAjQ1Xc+igPMaJm%g(aenk zKyd&sO7zIXmpI4>fXygFI70{wQKFAynS%%_?tKBt+gflVhyv}#U_P$~$O$qfs zPZ*OLtp5R&Kx@C$rKqKCnLk@&wH4&>{mg`xF^PCRNXW!9g}M0ZeyfFT7xV;&ur|GrMPf5Vg@x56bS$jfEt&UcZA4t zTBSlpbP+SM0U;t)aIYGP3eYX37f9sZnMA^306-K3m@on)oqjXyjFOkV^N4F$D7_4b z3PYE%3X{$C&yV+M?w&&RurP;Il2nQ{jKNkbXsLQD13+c<=jZ#1-Xa-_u@Y&oJSr0~ zk>q)$RJ5Jxl}}Me?Z&Q&X(BO`PQ@~S#QLP?auT5-QjQ>-T^mSHfg+|A3RL^J;^jp8 z{&62x%^R6^xcERNNdwt7>3SEO;6f09o-P;!%qgIwv+J}9Y*$Rx{YYAg1hCT53#9l7YP#zO zDeMeVEkr)k+XAwXiX~9owR7A+BxnKDx=(&-0dUd-<3_VD2=KUbN^ZqRH?<|Z1uR{u zo1C+kq2{0_h1tg>` z7+5uhYUF5y=%I%jhMGc=)WR9sB51v@CzN#W21YCbBuauWumz+mqXd~!+;f!ns7NYq zsdA44005PsbO!;k$)zm_bVr4T|0-uH7Q_8l5lg6Q%W;)x`mnwKvcbB&C{(d zyoJ6ISamm2ww|rpwv;5&7x&~n$xBb9<#f1px6(!OOW!+mxj{h7W24&{uSH?>1tlOj zLeS3aO0+?Bm+ZKjWt8mJrd35Ar4r{xy&6%##TQ8!EYbEjBypb~S@PSI7JwBT+N)iI z5b=|^F${UHpy~_OR+y?x3l+3#1tNX!`(BwmV9=p}OiJ5!8JTJbfe6Lc5NazF36S+I z6l_Z?w#tGFD!^6S`qNkf_R_codx}U~1Z<5Nq?Q4>Z6(t=?x^agtFk@?y{}V2MSxmO z1f?m)z95nS8G%s4#}JV#L5sEMIcj~x=g-fNdNX>|hXO4cBQ2Pg!g0S9v?}NZJ@n}I z^F!%!pkrWY1vRt?1Z@#ibpgD9hNShS>8_;I6#x|#60L#qJlCHfK#zU(5G%bRP&F6? zP+EathEW;vdk=pfaz~890<=I85tXR>N^TVda{vUYs0BpHEECLG$XIaa^p??R9l>;ws{j7Nv4R`Z$Ai9hG_){gQOdM7m{cfQq2q4e zQWfiFw6sSEijJUCgpd*yi@HH)+TsQ@T`XAzZT-sGQc1l-+IL_`kfdc|Ar;3%ANF34 z?#pAD0XT05d`l1l#fK6QtpZdta2IEhdWO={cCiv75D3(o(iS7yEh!M%Lizb|F`S`A ziw7#v))ZM{f8lrc``z~L_iyQYGvDxg?^X~Bv;d`QpbVV({AB<9WF=S#M|Th+G!m(N zGqiQDgw#Q*`#s1l zERJTLsF3195OP+8v=)AQ*d0+q3!ii>RG~`uiy@uwiiY$6sPb-~h{#t8R*um9wq zfBgqPutcO6pnyYo*x{*k&vW4fvc$e%3H79_0Y zPG8^+c%RH9^e6NEeqE=+hd0RK-J1`wC46qMz3%(AGrT~{`8oUj5jqdHnJFUqcws=8 z)TfJO;63{U#AKRE>O2e(ZKSQzO0RPR$6kOTaJM%Uq;O|hKmc06e|`V?&mD%If6e~$ z&&Pe{<3H0!qb&s(q!bBO=Jy44_LD>QVUg+kA!em_Dm2s}(s{S4ae^%XSpYk}GBeIl z+NDHkOQ~Oz76)TT%0|W~ZY;Xcl5|c!M3*1**nckPlP3<~` z?ynP-CLBs}XUb5pSJ-0k8KG3gU8yMT6QH+wlJ~yhrQi2WUY;aB4&e|45J#nzzAjmW zU;o(q=bh2HwW>&&mXYWPn80j)>;nZX6baV3mc2o2Av!>1rK(l3F1_}qfWX#A;Xx{nS&WjY15av=Y zybs4^w9`NTeg^P;GV@uM4q=u3r4=Yp>fwCOJLmrU@9*zFFhi}b zOk2+ZC)1M9onW>27PSPdwgb}!fB^vQjf81eH<;VuzRXa_<(A#&=eFakiJ@8oa6dC; zFLkO~|V@odTn*-{C#BA=fE27a0^wA>8M~t=zHp4sufgxxME+n5={ek-%BN z4h^lhFbxWT2+^6^qzH7t78FD^4T@#lufylV-#_=x%eWLeD(J3I);2da3{4S=wA10L zP#tLt?LdK-d0LAo9q7CD*)7V1lcsYbrEs{dp%Ei)Z5kx3?;^=MK?)<##3_9=oIc1(i6fmxqFNNHO>qrF| z5*#W3Ed|>P5z_I$nVkMSKR35~t5{LcQU-x$3Ihw5wvY=mWjI5T*|$`6fXb~1p&l+k z`b9G~E9$)!IlU?Px|8u<(HR&%d#{^E3&>1)uXY|M`?++8AF)Jf3X?d!FUv(tJ=Kc- z)VrT&=gL`Qo>Cafcrykap}+pwKktltANCx|9V-?nKoN>ktEGR@{?cBzehjiyuZ$K|NGB#Uz|dSzDS`k#9JrDz-7Th z;ZU^EpTEyve*e6_-@TQ~KwJxjGUVdDOe-FGD5NN7tLJFm!oE4JGjk4vb2C$0Ew=*u zp>Ju&G2Llr>bzGGSfQmm3>?NX0d6R~OX1au`+QoerwJpG!Piyel`PD_g<2BDb_*P*cmNO;K7}G+*=ar)T)|bqk7{j4ch=LT}Yl=nN3153>mtsWX%j-5Ksop-zWOE!;U4 z!9a(@%P=W*^m@EFj@8Rz8QX{TYh{Rnz%VUR855lXbSUL+g4@xtZ^!=mukZD?pFGhh z02Mb#m}RI)5pE!L0E5NimaR4vo%aPB5u5XN0IiqL^nH_VFCU&f2B zIRXRR^%VphkuIR{I4}%9GbaUvW7&p`opG!K6jG;cz*%cSf$i&JC70Tvht6Ot0Hspq zqTD*ucdW!-EFl7+YnYCZ43LH%JA-}m^8VoS`}cj8D512#%ie2?*p3|)n7|C3wgHAx zz@hh&?2ZE7@|mTs7nz$rpHC&-ZHr@b89S(nfz87JE83a49I~iYrAq@~%rJiX4mV)gwUx&A!c5Y^+(IsOM04UUtg(@ODT(*~i zwji~@3cc3WqGRwKc{5{ZN{31!O>aFDITJcm6R-$jPCj0iI*?XNApo~H^1f_YFCYU% zo|-GJJp45eCwu1ewC^%FytTma0w8ydhmi4whovp84Pe8qB)GPtO2bUUrQ-XJpbb=^ zX*rf1d`s{aBcSGQ+%c2e_9bnH{^FIN z0T%atfM?8VJC-(9`hM0_i>oE1(sBYOJ#rQz$8+ZLanpK?&m(!cYyXXfO7!~j0Jz4CZB(7 z&*w>>EH+j=S>LjaC@r)zEd?pXD@8LCi|_L~+&eRKcZQV+S?T43dBSdPa`K8MQ`fMq z^S52@DNZ8Na&+_=ozJI!f^Gm9vLL9eDE^URO zLt%QkQMIuJ=Xr7q106673v>h}xqR9$iiMrDWo9ZXOv25OUWNpDYCANuLwmgM-P65L zrp$Mzm$n_C z^hFr3kn2!7zX$_h3S=DJT!ssMJ(!tH3*?m?qQDsD?Y)y}=hARnI>TEEG&9`=Op$Wj zhC3PGa*5+tuZeY(S*x1cGI2_#Fu|Yj>wT_Y<1J zr1Lx9{qUV0>`fSj`zl4S1uBT(g6MY)1=d1)ZU-j~($S?tI;S|;IE9CWwBU3|W}z?2 z%b>$FbijgkigMbZ6$?%waDccH_o1dvYsi%>b$?AWlP0k1XD+6ewmkrpATtF3w%H-j z0%(G_6+7IYtHP)wj5nR8gHn@8J;zI5Hl;R<>`o?y;WCxp048C#Yi)DRk~z6-YwbmE z=RQDp`!!^Sqy;U6&azA9?ac4fuMF>**C`5f%k-N=It`^%Mfu!kK0o)JmHYrG+&b(4 zrYJDjvLbD-LMgzE^i~&b(;aVVvCh|d8JptJR)EP2d*HS$3U@XD?TZM7g|rt0Q=q+2 z!`_Yuw4qRhj>zrz3(-1fGM_W)a(*A2QV?WzN=itD0tK|00fGmb0E(VTv7HVK48UyA zH2~BZ9%biJCb{&S%M2?SL1s;vd%sZ0J)E|IR`Ko^?;S3YE4*$XLqS@kB@!nWL%|QT z{AAB=CqF(vv$M9R$ll-51X$8l7P}{hnAiwFf$Kms5>mGcFjUG&1ORD9Y@{W9J1~T_ zOoP;c5fmzUlM87JduCd7l65`l5oVz!XaatH8sM^Vp8x-SzV^4@KX;Mm3h>SV%%ylr zJyIy5rH2T;!X^~Bk*${9Q82MLv{`%X?ERrBd@L*2pE9qma~0cNJ`~}ZTi@)Yw9|;) zWp@ranc7x0w|!+U_1Cnjr1(~+1r?sGpYfP4MQ#AS+$+CqFd(;Fw$u;Pm#^n1%YO0h z7D6BJ6ad620*Vznmjzm+wwj{3CZZq%(Wr&;K!c#t&IXxr?q#m$>AbaIscXxe(mU<` zwlkOPwnfMGjuPBvItsU&qBPER6J{nq|MUDl&-?tmrydMUo`Ahq0H->%LT7Ya^CAg2 z&Op+@oN)$5@2u6!xKu(rWGg>!0W7W3GP6furi|M#XyE33ounn*ws!aY{=mF*oto|` z+ag0)m68i+*47MK%a7yd$OVv@zL$&49oc)QLCRhz_1K5M?swgur7u``O9cQxNn6Nh zM~T|2pcKHRwL%f0&}ODF(L1X^ZK=hX*(c@!D>`yD%B>}b3^&vdbfHdTyIbZ~h_iJY z?oLXeO4%H_;LNY*zrVk~zki+wgF`(9iuVepMhcXHP<&g;*p`uaOM!kJ=)D6t=|HcR zavO1k`_>dFFuZ$#*{MNw>J-?UY3F@`PKt?B$8)$RRO|SY&nTn;2`h7BpF3Zx;Jn(h z9`dpC)}Y5e@4U^-b0rrn0=tm#&f)UepF1a7O4pe#Lmhxs`;^JeZqZ~dZz&`Qz<8ac zEkX;WwORrIL#wo*7x2FO>A(O{m?j6Ds!$Pd0SX*2U1+sC1?tYz%!*bNA+~|x{QBzO zfByb{`SGi8GfH>BrT}!{74IFi=q-+x!jj8Skx>Fni$(J0&W)XYtG3hkX1;=mlY7m3 zMu8U!6#b-WsDmhdtAp*fJNxcprOwS*11qthm5)K6rWF>RZSbphdR zI{;BAGc&YXx$Ml1OlO)+&uNPE9ja8#qb^JtFSK>b+hr_zISm7aC{6?Q3gSbrVJGz5a{kZ=jg@SF|(giw%V>$>6cQ>P2nOAWx2ML=?c?efYbSOiN2NG z87RajC*OB@GGA|ow1@!!Kp>A$K+Tf?00<&silk%hEm{o%ii$Wv;;kuoj?* zYM}t6i6TfZ77!6B5YAdq6+a7;jT7+qq(jqkszTY_xiX^nB zoxW#J16C1aK!2_zJ$wK5^Yz!SJ?E1b8ye@s2(7l-0+tS?K&9SDW{i{PwG>Mx)qw_p z>xXZhrk!fnKwCg=;hlaL(*xAhXPl$-mG6-`pS*Os-=Dbn4rln%ez!_R&_54tp-gQQj%=#0G2&J>|gfqFXt z)lum{urzC`EH8Kgxs2O~v3e+U87h^WHKAu+2cy;Via$ z3OQ$D(vVx0KYZT4cm0xHioOy62S~Zd^bN9y8EjL>27myC+TBR8B0xv@(uRRDT8cL$ zDD|jCcy(cb7P*zS&}}YVer_s|(lZQz`xJmQ(k=z4$NP#Wk1jJie~=Z+smmBfC^H2B zRsc$&9okI4-vv^wa!3XWLlxj~sRSvV(%bW8dRD(ale))6k=(0_)3}sUd(VB@ooW8O z{LFdjP_Cmm-2{N7%;ZXE0}S|axD1!vB%M~FPNA0xB-Hv*-N01aUhQ3e%I8eHNjp>M zQ=}9?kQ=!bM(~KY6anl7pduA5K&gUl8>~QKEWk7Y6eu7C0O}{#wj(s& zv9=xxNNBCovOx#W-_;Z#*f^&c^f0sJHp&>rS;q?^E5%6+I?+H`~Ld+et*yR<=5w-ZKZ9eDKtP~ zN-94mXr-kK#43esFGJ!$j~!K%QYhF<08NHlN(KRvPMN^{3@uak zT5Jwj+ts=EYfj4F?(I3}wcX*4ut8e63$QTmU9XL`9RLb>|9Zb?Z`v8CFy{=+I?a7h zX1(sro%XX|=da(p`1Scc=d-i_{Kpq_?7|Rj8B~EHOaTDs>&C9ZulgU8(>JH39s9zq zRI2QZ(_NF^_I?i2+X!>ES6WxMbdU-Ik|>9t*_|g}dGC8}7BF&6iQvy$AfknUG%1L# zEfk&2&rn9H^rbC08G5xq!do4|DKfoqz?V<2j$@fh!FiF{GOZTvO<-tXLfClbeY4KE zE|Mu9x?$cqPd>BKJo$Mz_w@yhFH;0z(^ju_m{#C3L7;q=bd03|Mhl}Yw%!C<7#R)4 zX@ll{u+aLRU#CCM_w!kx7C4TSAhjS3J96)RGjOo3UwPxbzV-qHR=7!Nr%l-zmU~}k zL_^Ct@3E9>}wg+>8}mJpnl+o^MDX7ck+%ScQo|AlSixv?a7muszZWV_RUL3sIhE&odp93V@Q97h&>W*%AHGXS|Fd;d%Bk_7r!hMQ3pr66%50l+wmMik-M zb|o3q0s;th0cfvGZx4;yRsuw}$Xkj4iK?8eAPu^>o2s!SAZYWnNT^#1Ab|>IbVEIR zzorDLLIVh0NtpQ9+Me^Y&shWBv{iwEDAd@X;3Btb0Yr-$Y*A1s0s~50q>2=)-RcZm z8Nz3i^-u!;=J)7$W=(+>07NQDh{{zeIc;j@QY+QskQVJCTnVzI`h5@`DeZ1iOQK-> zRusF}Zka&iB2y`mlRoe_RiaORYf$sd^;z=HkwLfCTCrwC zZ>3_yN>x!S1QkFFBT-tX08#;pKr$eytttRah2;6}Cs*q6vhmP2GxuNfcQ22lqL%SO zC5{?Ik&1=X+E?C3Sgrb9ch^q?P+7178&3g7t7czOk~x?3Xxg^wTNwllKr?~`7(9!7 zb^4xy$Eoc1S~N#ci9-c~CRE)3#Rdv!kP!t$I-G-=P=SeyK`5oPP*DLTOfOk)Ok|cy zRjYP{)S~vW)kJPvO@nr=uA~-7M*#%&{>d?UUelZNZFebWVwG9@tlShwROv)bP>DFtq6v>nR$8oCsfl$#oGb^I4}bW zHdm+207wEV6-rB?@X;*-d?_YXqk@Utax0}sBLyQ$5nRx0dJz=@(Uo1mI5wCz)nj(G z{LZ(B1ZuWJ!L-({h4;PE97XBfv)UEboK%7cOhJ^=3RDT2idF^rp+Ge>L13VsLdOz9 zGG(lG&a}1mrTKNrjhCPK_4{vs&o5C>)Br^#Q7S#BS<+&tUp_QS)Xr{Dz8geo`x$t5 zPK!A0IIBu1ob0XunN7|k4Qfy}P>dy7T^L@RJN|ivkPAS8B1EMGfU!c2OpvIAAj%BK zfIwdaP(33c5kexUkHJ(3fdLG?2x*W;rnPFIsFi0CMJ2X`(v@-=!{j1DELa>cWOX(+ z>TVv+hd@@5HE;w-6d0nGG%_~_N>SP}!>!#&&?-bOy9V0XKwZ*G0G)YrlImh|H}h1z z%I-eDe)lU+EER%jeL$F4VWuIIyB10|a13)f7ggH6=P3l@eU6H1Yxw zAh`sAptz6^v1?j$TY)Gc(^6AKMRJQ$cY4pf?|di;Ehj+^wCCr`gXa7F!zqTP06#+p z1YuMg0gZ&|g%+rU%4vYC1PB-aFen+TYE{&r3Og;i)%6)i%P8!8(9b>ohTR4LRU$TR zkq#}b!t_sjId}S)VyCB3N(CTF$0$f@+u+Su`#k3}T1FoeFGDEXh_>e-nsSPq!O(` zNXQ0>diL;jA$sLPu$%tjsIBIl{gVm_C>6Of<0kbHqaqtg&*R<6hqrR_)OHWp0Hs?J zP})f99&Jg@ULAT{mZBlHw8BlF6QzX+4ei^f0gL#ILxkg{}mz+{m{iD()gg2qH)h6ct5=aiv1)PiVD>(n{(ThZKOS8t!>642Tjc za_EipUd|BIk+D@;op+6v0nvg4VvAABxD`PPh~Q#DRYDL-Yp`XI@w8wBs*BL}C`RqO zGFv2l<1#g(C8ZS@q-BPv7-&6A@4@18jb=qG2r3j2fo{eN5QZI!*lZf7Fp*K+0=TMx z(n4Z$xcfY-zH0o;OOdiJYSmgsD&+FuG(9e+#egW1PcdYSeA<;1&DIda_OtJHWYAW_Jyxl_E*n)KLMx1?ftE#9s9YqJ8np(h zE~vByq>7^#8)+F{%~q*L(aM>G+J@y|^iWL&1-nq87It+|_u@och@Ptmis&q=s2UIz zRWQh;m`z=j_XlpS&EcXBi(N}}X6iHGynw52d=PZ8+Trb?qF6x!K-y9^>|O8+sp7nEPmOW zqaHa(G;4pPDXEH8?b{XsfCNM;luBiDLc%rHa)+kVF}ff+Px?5$_hFY25FvtSGsy5Y6I7TY9lu z?7*XH3o3S3(*Un!V+sH_1HI77q6j2LNLCB9Dg}X&c3u0sc}O2Iii=OLYzZJ9L<^y7 zP)}QH!vL8Uwrl+anxR6W!uzdi1;yvvU-oeU0HsA1-00l5aqWGt4z^9{v}fytpva4w zY~@1%QShz+5C}Rp6}ekVVo885l!BC0?IQBTPjTgsX-91oN>}!!h$31L-wJ@zj7U+k zSAFG8K2gWP&g(&3q^U#@EVO+$fHlqb`(?MVxQk|M-<3DAiYRgyiC7^<$hXt5=rkY% zDhNzNOI3=&1hqzh3={#BRtW$&v;eyTS=az3wDRLyq$YO<2Bg8-?B z0*Z}Ql!2v)Bp#}f9viE(t3}|pUIys<(L15N_Wh*XSCqbF7u+c1>Krb+={}cLNF_Us#vLtq26~N?;3Co30ygd#W4~+O;|t6f^eAm>l?qKn3Zj*NJTO=-T?z>wUW6o2i(S+fxh<+5NDtrV z^SPankD|h}i?<`JyXvAs-$j$sjyVvdZlyH}0xCz?l$I7jU;xys@ovspNSI0*`*zg0 z1-VIqic+@_1*wHb0)Zk#kcH7C7$B7(I$h0tCMj~OEI?@;&P0ax`7|Vip$l$~=|Xf- zMPn*PY1h8Y(}flxdP~}k)b^bDDMg~~S{j{=l(icwx2;TyhQ5F(K)+%ONWvr%tDEO! zHIiFQrSJ%~Y9d99X=w-Y;Ne9i?(_Sz|E^-YDy0;vQn>{TL)r4#p)K`o$CMGGoYsv%0D3k?FK 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 F{{?f$si^<} diff --git a/addons/im_livechat/static/ext/static/js/livesupport.js b/addons/im_livechat/static/ext/static/js/livesupport.js index 86b2d8a4c7b..c7f136b32d8 100644 --- a/addons/im_livechat/static/ext/static/js/livesupport.js +++ b/addons/im_livechat/static/ext/static/js/livesupport.js @@ -3,8 +3,8 @@ This file must compile in EcmaScript 3 and work in IE7. */ -define(["openerp", "underscore", "require", "jquery", - "jquery.achtung"], function(openerp, _, require, $) { +define(["openerp", "im_common", "underscore", "require", "jquery", + "jquery.achtung"], function(openerp, im_common, _, require, $) { /* jshint es3: true */ "use strict"; @@ -12,15 +12,6 @@ define(["openerp", "underscore", "require", "jquery", var livesupport = {}; - _.extend(openerp.qweb.default_dict, { - 'toUrl': _.bind(require.toUrl, require) - }); - - var connection; - - var defaultInputPlaceholder; - var userName; - livesupport.main = function(server_url, db, login, password, channel, options) { var defs = []; options = options || {}; @@ -31,25 +22,27 @@ define(["openerp", "underscore", "require", "jquery", auto: false, userName: _t("Anonymous") }); - defaultInputPlaceholder = options.inputPlaceholder; - userName = options.userName; - // TODO : load QwebTemplates - defs.push(add_css("im_livechat/static/ext/static/css/livesupport.css")); + + im_common.notification = notification; + im_common.to_url = require.toUrl; + im_common.defaultInputPlaceholder = options.inputPlaceholder; + im_common.userName = options.userName; + defs.push(add_css("im/static/src/css/im_common.css")); defs.push(add_css("im_livechat/static/ext/static/lib/jquery-achtung/src/ui.achtung.css")); return $.when.apply($, defs).then(function() { console.log("starting live support customer app"); - connection = new openerp.Session(null, server_url, { override_session: true }); - return connection.session_authenticate(db, login, password); + im_common.connection = new openerp.Session(null, server_url, { override_session: true }); + return im_common.connection.session_authenticate(db, login, password); }).then(function() { - return connection.rpc('/web/proxy/load', {path: '/im_livechat/static/ext/static/js/livesupport_templates.xml'}).then(function(xml) { + return im_common.connection.rpc('/web/proxy/load', {path: '/im/static/src/xml/im_common.xml'}).then(function(xml) { openerp.qweb.add_template(xml); }); }).then(function() { - return connection.rpc("/im_livechat/available", {db: db, channel: channel}).then(function(activated) { + return im_common.connection.rpc("/im_livechat/available", {db: db, channel: channel}).then(function(activated) { if (! activated & ! options.auto) return; - var button = new livesupport.ChatButton(null, channel, options); + var button = new im_common.ChatButton(null, channel, options); button.appendTo($("body")); if (options.auto) button.click(); @@ -59,7 +52,7 @@ define(["openerp", "underscore", "require", "jquery", var add_css = function(relative_file_name) { var css_def = $.Deferred(); - $('') + $('') .appendTo($("head")).ready(function() { css_def.resolve(); }); @@ -70,391 +63,5 @@ define(["openerp", "underscore", "require", "jquery", $.achtung({message: message, timeout: 0, showEffects: false, hideEffects: false}); }; - var ERROR_DELAY = 5000; - - livesupport.ChatButton = openerp.Widget.extend({ - className: "openerp_style oe_chat_button", - events: { - "click": "click" - }, - init: function(parent, channel, options) { - this._super(parent); - this.channel = channel; - this.options = options; - this.text = options.buttonText; - }, - start: function() { - this.$().append(openerp.qweb.render("chatButton", {widget: this})); - }, - click: function() { - if (! this.manager) { - this.manager = new livesupport.ConversationManager(null); - this.activated_def = this.manager.start_polling(); - } - var def = $.Deferred(); - $.when(this.activated_def).then(function() { - def.resolve(); - }, function() { - def.reject(); - }); - setTimeout(function() { - def.reject(); - }, 5000); - def.then(_.bind(this.chat, this), function() { - notification(_t("It seems the connection to the server is encountering problems, please try again later.")); - }); - }, - chat: function() { - var self = this; - if (this.manager.conversations.length > 0) - return; - connection.model("im_livechat.channel").call("get_available_user", [this.channel]).then(function(user_id) { - if (! user_id) { - notification(_t("None of our collaborators seems to be available, please try again later.")); - return; - } - self.manager.ensure_users([user_id]).then(function() { - var conv = self.manager.activate_user(self.manager.get_user(user_id), true); - if (self.options.defaultMessage) { - conv.received_message({message: self.options.defaultMessage, - date: openerp.datetime_to_str(new Date())}); - } - }); - }); - } - }); - - livesupport.ImUser = openerp.Class.extend(openerp.PropertiesMixin, { - init: function(parent, user_rec) { - openerp.PropertiesMixin.init.call(this, parent); - user_rec.image_url = require.toUrl("im_livechat/static/ext/static/img/avatar/avatar.jpeg"); - if (user_rec.image) - user_rec.image_url = "data:image/png;base64," + user_rec.image; - this.set(user_rec); - this.set("watcher_count", 0); - this.on("change:watcher_count", this, function() { - if (this.get("watcher_count") === 0) - this.destroy(); - }); - }, - destroy: function() { - this.trigger("destroyed"); - openerp.PropertiesMixin.destroy.call(this); - }, - add_watcher: function() { - this.set("watcher_count", this.get("watcher_count") + 1); - }, - remove_watcher: function() { - this.set("watcher_count", this.get("watcher_count") - 1); - } - }); - - livesupport.ConversationManager = openerp.Class.extend(openerp.PropertiesMixin, { - init: function(parent) { - openerp.PropertiesMixin.init.call(this, parent); - this.set("right_offset", 0); - this.conversations = []; - this.users = {}; - this.on("change:right_offset", this, this.calc_positions); - this.set("window_focus", true); - this.set("waiting_messages", 0); - this.focus_hdl = _.bind(function() { - this.set("window_focus", true); - }, this); - $(window).bind("focus", this.focus_hdl); - this.blur_hdl = _.bind(function() { - this.set("window_focus", false); - }, this); - $(window).bind("blur", this.blur_hdl); - this.on("change:window_focus", this, this.window_focus_change); - this.window_focus_change(); - this.on("change:waiting_messages", this, this.messages_change); - this.messages_change(); - this.create_ting(); - this.activated = false; - this.users_cache = {}; - this.last = null; - this.unload_event_handler = _.bind(this.unload, this); - }, - start_polling: function() { - var self = this; - - var uuid = localStorage["oe_livesupport_uuid"]; - var def = $.when(uuid); - - if (! uuid) { - def = connection.rpc("/longpolling/im/gen_uuid", {}); - } - return def.then(function(uuid) { - localStorage["oe_livesupport_uuid"] = uuid; - return connection.model("im.user").call("get_by_user_id", [uuid]); - }).then(function(my_id) { - self.my_id = my_id["id"]; - return connection.model("im.user").call("assign_name", [uuid, userName]); - }).then(function() { - return self.ensure_users([self.my_id]); - }).then(function() { - var me = self.users_cache[self.my_id]; - delete self.users_cache[self.my_id]; - self.me = me; - me.set("name", "You"); - return connection.rpc("/longpolling/im/activated", {}); - }).then(function(activated) { - if (activated) { - self.activated = true; - $(window).on("unload", self.unload_event_handler); - self.poll(); - } else { - return $.Deferred().reject(); - } - }); - }, - unload: function() { - connection.model("im.user").call("im_disconnect", [], {uuid: this.me.get("uuid"), context: {}}); - }, - ensure_users: function(user_ids) { - var no_cache = {}; - _.each(user_ids, function(el) { - if (! this.users_cache[el]) - no_cache[el] = el; - }, this); - var self = this; - if (_.size(no_cache) === 0) - return $.when(); - else - return connection.model("im.user").call("read", [_.values(no_cache), []]).then(function(users) { - self.add_to_user_cache(users); - }); - }, - add_to_user_cache: function(user_recs) { - _.each(user_recs, function(user_rec) { - if (! this.users_cache[user_rec.id]) { - var user = new livesupport.ImUser(this, user_rec); - this.users_cache[user_rec.id] = user; - user.on("destroyed", this, function() { - delete this.users_cache[user_rec.id]; - }); - } - }, this); - }, - get_user: function(user_id) { - return this.users_cache[user_id]; - }, - poll: function() { - console.debug("live support beggin polling"); - var self = this; - var user_ids = _.map(this.users_cache, function(el) { - return el.get("id"); - }); - connection.rpc("/longpolling/im/poll", { - last: this.last, - users_watch: user_ids, - db: connection.database, - uid: connection.userId, - password: connection.password, - uuid: self.me.get("uuid") - }).then(function(result) { - _.each(result.users_status, function(el) { - if (self.get_user(el.id)) - self.get_user(el.id).set(el); - }); - self.last = result.last; - var user_ids = _.pluck(_.pluck(result.res, "from_id"), 0); - self.ensure_users(user_ids).then(function() { - _.each(result.res, function(mes) { - var user = self.get_user(mes.from_id[0]); - self.received_message(mes, user); - }); - self.poll(); - }); - }, function() { - setTimeout(_.bind(self.poll, self), ERROR_DELAY); - }); - }, - get_activated: function() { - return this.activated; - }, - create_ting: function() { - if (typeof(Audio) === "undefined") { - this.ting = {play: function() {}}; - return; - } - this.ting = new Audio(new Audio().canPlayType("audio/ogg; codecs=vorbis") ? - require.toUrl("im_livechat/static/ext/static/audio/Ting.ogg") : - require.toUrl("im_livechat/static/ext/static/audio/Ting.mp3") - ); - }, - window_focus_change: function() { - if (this.get("window_focus")) { - this.set("waiting_messages", 0); - } - }, - messages_change: function() { - //if (! instance.webclient.set_title_part) - // return; - //instance.webclient.set_title_part("im_messages", this.get("waiting_messages") === 0 ? undefined : - // _.str.sprintf(_t("%d Messages"), this.get("waiting_messages"))); - }, - activate_user: function(user, focus) { - var conv = this.users[user.get('id')]; - if (! conv) { - conv = new livesupport.Conversation(this, user, this.me); - conv.appendTo($("body")); - conv.on("destroyed", this, function() { - this.conversations = _.without(this.conversations, conv); - delete this.users[conv.user.get('id')]; - this.calc_positions(); - }); - this.conversations.push(conv); - this.users[user.get('id')] = conv; - this.calc_positions(); - } - if (focus) - conv.focus(); - return conv; - }, - received_message: function(message, user) { - if (! this.get("window_focus")) { - this.set("waiting_messages", this.get("waiting_messages") + 1); - this.ting.play(); - this.create_ting(); - } - var conv = this.activate_user(user); - conv.received_message(message); - }, - calc_positions: function() { - var current = this.get("right_offset"); - _.each(_.range(this.conversations.length), function(i) { - this.conversations[i].set("right_position", current); - current += this.conversations[i].$().outerWidth(true); - }, this); - }, - destroy: function() { - $(window).off("unload", this.unload_event_handler); - $(window).unbind("blur", this.blur_hdl); - $(window).unbind("focus", this.focus_hdl); - openerp.PropertiesMixin.destroy.call(this); - } - }); - - livesupport.Conversation = openerp.Widget.extend({ - className: "openerp_style oe_im_chatview", - events: { - "keydown input": "send_message", - "click .oe_im_chatview_close": "destroy", - "click .oe_im_chatview_header": "show_hide" - }, - init: function(parent, user, me) { - this._super(parent); - this.me = me; - this.user = user; - this.user.add_watcher(); - this.set("right_position", 0); - this.shown = true; - this.set("pending", 0); - this.inputPlaceholder = defaultInputPlaceholder; - }, - start: function() { - this.$().append(openerp.qweb.render("conversation", {widget: this})); - var change_status = function() { - this.$().toggleClass("oe_im_chatview_disconnected_status", this.user.get("im_status") === false); - this.$(".oe_im_chatview_online").toggle(this.user.get("im_status") === true); - this._go_bottom(); - }; - this.user.on("change:im_status", this, change_status); - change_status.call(this); - - this.on("change:right_position", this, this.calc_pos); - this.full_height = this.$().height(); - this.calc_pos(); - this.on("change:pending", this, _.bind(function() { - if (this.get("pending") === 0) { - this.$(".oe_im_chatview_nbr_messages").text(""); - } else { - this.$(".oe_im_chatview_nbr_messages").text("(" + this.get("pending") + ")"); - } - }, this)); - }, - show_hide: function() { - if (this.shown) { - this.$().animate({ - height: this.$(".oe_im_chatview_header").outerHeight() - }); - } else { - this.$().animate({ - height: this.full_height - }); - } - this.shown = ! this.shown; - if (this.shown) { - this.set("pending", 0); - } - }, - calc_pos: function() { - this.$().css("right", this.get("right_position")); - }, - received_message: function(message) { - if (this.shown) { - this.set("pending", 0); - } else { - this.set("pending", this.get("pending") + 1); - } - this._add_bubble(this.user, message.message, openerp.str_to_datetime(message.date)); - }, - send_message: function(e) { - if(e && e.which !== 13) { - return; - } - var mes = this.$("input").val(); - if (! mes.trim()) { - return; - } - this.$("input").val(""); - var send_it = _.bind(function() { - var model = connection.model("im.message"); - return model.call("post", [mes, this.user.get('id')], {uuid: this.me.get("uuid"), context: {}}); - }, this); - var tries = 0; - send_it().then(_.bind(function() { - this._add_bubble(this.me, mes, new Date()); - }, this), function(error, e) { - tries += 1; - if (tries < 3) - return send_it(); - }); - }, - _add_bubble: function(user, item, date) { - var items = [item]; - if (user === this.last_user) { - this.last_bubble.remove(); - items = this.last_items.concat(items); - } - this.last_user = user; - this.last_items = items; - var zpad = function(str, size) { - str = "" + str; - return new Array(size - str.length + 1).join('0') + str; - }; - date = "" + zpad(date.getHours(), 2) + ":" + zpad(date.getMinutes(), 2); - - this.last_bubble = $(openerp.qweb.render("conversation_bubble", {"items": items, "user": user, "time": date})); - $(this.$(".oe_im_chatview_content").children()[0]).append(this.last_bubble); - this._go_bottom(); - }, - _go_bottom: function() { - this.$(".oe_im_chatview_content").scrollTop($(this.$(".oe_im_chatview_content").children()[0]).height()); - }, - focus: function() { - this.$(".oe_im_chatview_input").focus(); - }, - destroy: function() { - this.user.remove_watcher(); - this.trigger("destroyed"); - return this._super(); - } - }); - - - return livesupport; }); From c2366d71810ea4a2860f75dbd482dd12649318a8 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 19 Aug 2013 16:21:39 +0200 Subject: [PATCH 2/8] Put ChatButton in livechat bzr revid: nicolas.vanhoren@openerp.com-20130819142139-mvh25k95k1wbjtzv --- addons/im/static/src/js/im_common.js | 62 ------------------- addons/im/static/src/xml/im_common.xml | 4 -- addons/im_livechat/loader.js | 6 -- .../static/ext/static/js/livechat.xml | 7 +++ .../static/ext/static/js/livesupport.js | 56 +++++++++++++++++ 5 files changed, 63 insertions(+), 72 deletions(-) create mode 100644 addons/im_livechat/static/ext/static/js/livechat.xml diff --git a/addons/im/static/src/js/im_common.js b/addons/im/static/src/js/im_common.js index 5307cb422fa..e9226e4c056 100644 --- a/addons/im/static/src/js/im_common.js +++ b/addons/im/static/src/js/im_common.js @@ -1,7 +1,5 @@ /* - Dependencies: openerp, underscore, jquery - This file must compile in EcmaScript 3 and work in IE7. Prerequisites to use this module: @@ -17,14 +15,6 @@ function declare($, _, openerp) { var im_common = {}; - // like underscore's noConflit() to easily create an amd wrapper - var tmp_im_common = window.im_common; - im_common.no_conflict = function() { - window.im_common = tmp_im_common; - return im_common; - }; - window.im_common = im_common; - /* All of this must be defined to use this module */ @@ -46,58 +36,6 @@ function declare($, _, openerp) { var ERROR_DELAY = 5000; - im_common.ChatButton = openerp.Widget.extend({ - className: "openerp_style oe_chat_button", - events: { - "click": "click" - }, - init: function(parent, channel, options) { - this._super(parent); - this.channel = channel; - this.options = options; - this.text = options.buttonText; - }, - start: function() { - this.$().append(openerp.qweb.render("chatButton", {widget: this})); - }, - click: function() { - if (! this.manager) { - this.manager = new im_common.ConversationManager(null); - this.activated_def = this.manager.start_polling(); - } - var def = $.Deferred(); - $.when(this.activated_def).then(function() { - def.resolve(); - }, function() { - def.reject(); - }); - setTimeout(function() { - def.reject(); - }, 5000); - def.then(_.bind(this.chat, this), function() { - im_common.notification(_t("It seems the connection to the server is encountering problems, please try again later.")); - }); - }, - chat: function() { - var self = this; - if (this.manager.conversations.length > 0) - return; - im_common.connection.model("im_livechat.channel").call("get_available_user", [this.channel]).then(function(user_id) { - if (! user_id) { - im_common.notification(_t("None of our collaborators seems to be available, please try again later.")); - return; - } - self.manager.ensure_users([user_id]).then(function() { - var conv = self.manager.activate_user(self.manager.get_user(user_id), true); - if (self.options.defaultMessage) { - conv.received_message({message: self.options.defaultMessage, - date: openerp.datetime_to_str(new Date())}); - } - }); - }); - } - }); - im_common.ImUser = openerp.Class.extend(openerp.PropertiesMixin, { init: function(parent, user_rec) { openerp.PropertiesMixin.init.call(this, parent); diff --git a/addons/im/static/src/xml/im_common.xml b/addons/im/static/src/xml/im_common.xml index df5b90cce08..f4acd6762b1 100644 --- a/addons/im/static/src/xml/im_common.xml +++ b/addons/im/static/src/xml/im_common.xml @@ -32,8 +32,4 @@

- - - -
\ No newline at end of file diff --git a/addons/im_livechat/loader.js b/addons/im_livechat/loader.js index dcb134adf65..d2580ab272a 100644 --- a/addons/im_livechat/loader.js +++ b/addons/im_livechat/loader.js @@ -31,12 +31,6 @@ require.config({ "jquery.achtung": { deps: ['jquery'], }, - im_common: { - deps: ['jquery', 'openerp', 'underscore', 'qweb2'], - init: function() { - return im_common.no_conflict(); - } - }, }, })(["livesupport", "jquery"], function(livesupport, jQuery) { jQuery.noConflict(); diff --git a/addons/im_livechat/static/ext/static/js/livechat.xml b/addons/im_livechat/static/ext/static/js/livechat.xml new file mode 100644 index 00000000000..1c7b00466d9 --- /dev/null +++ b/addons/im_livechat/static/ext/static/js/livechat.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/addons/im_livechat/static/ext/static/js/livesupport.js b/addons/im_livechat/static/ext/static/js/livesupport.js index c7f136b32d8..d238014bdb0 100644 --- a/addons/im_livechat/static/ext/static/js/livesupport.js +++ b/addons/im_livechat/static/ext/static/js/livesupport.js @@ -34,6 +34,10 @@ define(["openerp", "im_common", "underscore", "require", "jquery", console.log("starting live support customer app"); im_common.connection = new openerp.Session(null, server_url, { override_session: true }); return im_common.connection.session_authenticate(db, login, password); + }).then(function() { + return im_common.connection.rpc('/web/proxy/load', {path: '/im_livechat/static/ext/static/js/livechat.xml'}).then(function(xml) { + openerp.qweb.add_template(xml); + }); }).then(function() { return im_common.connection.rpc('/web/proxy/load', {path: '/im/static/src/xml/im_common.xml'}).then(function(xml) { openerp.qweb.add_template(xml); @@ -63,5 +67,57 @@ define(["openerp", "im_common", "underscore", "require", "jquery", $.achtung({message: message, timeout: 0, showEffects: false, hideEffects: false}); }; + im_common.ChatButton = openerp.Widget.extend({ + className: "openerp_style oe_chat_button", + events: { + "click": "click" + }, + init: function(parent, channel, options) { + this._super(parent); + this.channel = channel; + this.options = options; + this.text = options.buttonText; + }, + start: function() { + this.$().append(openerp.qweb.render("chatButton", {widget: this})); + }, + click: function() { + if (! this.manager) { + this.manager = new im_common.ConversationManager(null); + this.activated_def = this.manager.start_polling(); + } + var def = $.Deferred(); + $.when(this.activated_def).then(function() { + def.resolve(); + }, function() { + def.reject(); + }); + setTimeout(function() { + def.reject(); + }, 5000); + def.then(_.bind(this.chat, this), function() { + im_common.notification(_t("It seems the connection to the server is encountering problems, please try again later.")); + }); + }, + chat: function() { + var self = this; + if (this.manager.conversations.length > 0) + return; + im_common.connection.model("im_livechat.channel").call("get_available_user", [this.channel]).then(function(user_id) { + if (! user_id) { + im_common.notification(_t("None of our collaborators seems to be available, please try again later.")); + return; + } + self.manager.ensure_users([user_id]).then(function() { + var conv = self.manager.activate_user(self.manager.get_user(user_id), true); + if (self.options.defaultMessage) { + conv.received_message({message: self.options.defaultMessage, + date: openerp.datetime_to_str(new Date())}); + } + }); + }); + } + }); + return livesupport; }); From d60c2a5f7e032d7636caef1bb17b5e893efd6e7c Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 20 Aug 2013 14:15:22 +0200 Subject: [PATCH 3/8] Some cleaning bzr revid: nicolas.vanhoren@openerp.com-20130820121522-en3bft0wotfnsozm --- addons/im/static/src/js/im_common.js | 18 +++++++++--------- addons/im/static/src/xml/im_common.xml | 4 ++-- .../static/ext/static/js/livesupport.js | 4 +--- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/addons/im/static/src/js/im_common.js b/addons/im/static/src/js/im_common.js index e9226e4c056..2768627f951 100644 --- a/addons/im/static/src/js/im_common.js +++ b/addons/im/static/src/js/im_common.js @@ -25,8 +25,6 @@ function declare($, _, openerp) { notification: function(message) { throw new Error("Not implemented"); }, - defaultInputPlaceholder: null, - userName: null, connection: null }); @@ -62,8 +60,9 @@ function declare($, _, openerp) { }); im_common.ConversationManager = openerp.Class.extend(openerp.PropertiesMixin, { - init: function(parent) { + init: function(parent, options) { openerp.PropertiesMixin.init.call(this, parent); + this.options = options; this.set("right_offset", 0); this.conversations = []; this.users = {}; @@ -102,7 +101,7 @@ function declare($, _, openerp) { return im_common.connection.model("im.user").call("get_by_user_id", [uuid]); }).then(function(my_id) { self.my_id = my_id["id"]; - return im_common.connection.model("im.user").call("assign_name", [uuid, im_common.userName]); + return im_common.connection.model("im.user").call("assign_name", [uuid, self.options.userName]); }).then(function() { return self.ensure_users([self.my_id]); }).then(function() { @@ -210,7 +209,7 @@ function declare($, _, openerp) { activate_user: function(user, focus) { var conv = this.users[user.get('id')]; if (! conv) { - conv = new im_common.Conversation(this, user, this.me); + conv = new im_common.Conversation(this, user, this.me, this.options); conv.appendTo($("body")); conv.on("destroyed", this, function() { this.conversations = _.without(this.conversations, conv); @@ -256,18 +255,19 @@ function declare($, _, openerp) { "click .oe_im_chatview_close": "destroy", "click .oe_im_chatview_header": "show_hide" }, - init: function(parent, user, me) { + init: function(parent, user, me, options) { this._super(parent); + this.options = options this.me = me; this.user = user; this.user.add_watcher(); this.set("right_position", 0); this.shown = true; this.set("pending", 0); - this.inputPlaceholder = im_common.defaultInputPlaceholder; + this.inputPlaceholder = this.options.defaultInputPlaceholder; }, start: function() { - this.$().append(openerp.qweb.render("conversation", {widget: this, to_url: im_common.to_url})); + this.$().append(openerp.qweb.render("im_common.conversation", {widget: this, to_url: im_common.to_url})); var change_status = function() { this.$().toggleClass("oe_im_chatview_disconnected_status", this.user.get("im_status") === false); this.$(".oe_im_chatview_online").toggle(this.user.get("im_status") === true); @@ -349,7 +349,7 @@ function declare($, _, openerp) { }; date = "" + zpad(date.getHours(), 2) + ":" + zpad(date.getMinutes(), 2); - this.last_bubble = $(openerp.qweb.render("conversation_bubble", {"items": items, "user": user, "time": date})); + this.last_bubble = $(openerp.qweb.render("im_common.conversation_bubble", {"items": items, "user": user, "time": date})); $(this.$(".oe_im_chatview_content").children()[0]).append(this.last_bubble); this._go_bottom(); }, diff --git a/addons/im/static/src/xml/im_common.xml b/addons/im/static/src/xml/im_common.xml index f4acd6762b1..c8421552a48 100644 --- a/addons/im/static/src/xml/im_common.xml +++ b/addons/im/static/src/xml/im_common.xml @@ -1,7 +1,7 @@ - +
@@ -18,7 +18,7 @@
- +
diff --git a/addons/im_livechat/static/ext/static/js/livesupport.js b/addons/im_livechat/static/ext/static/js/livesupport.js index d238014bdb0..0e13c236170 100644 --- a/addons/im_livechat/static/ext/static/js/livesupport.js +++ b/addons/im_livechat/static/ext/static/js/livesupport.js @@ -25,8 +25,6 @@ define(["openerp", "im_common", "underscore", "require", "jquery", im_common.notification = notification; im_common.to_url = require.toUrl; - im_common.defaultInputPlaceholder = options.inputPlaceholder; - im_common.userName = options.userName; defs.push(add_css("im/static/src/css/im_common.css")); defs.push(add_css("im_livechat/static/ext/static/lib/jquery-achtung/src/ui.achtung.css")); @@ -83,7 +81,7 @@ define(["openerp", "im_common", "underscore", "require", "jquery", }, click: function() { if (! this.manager) { - this.manager = new im_common.ConversationManager(null); + this.manager = new im_common.ConversationManager(this, this.options); this.activated_def = this.manager.start_polling(); } var def = $.Deferred(); From 980952c416a43316068a7315fb562518e11da36b Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 20 Aug 2013 16:15:38 +0200 Subject: [PATCH 4/8] Ported most of the old im.js to im_common.js bzr revid: nicolas.vanhoren@openerp.com-20130820141538-xsdm64uinhbf8v5g --- addons/im/__openerp__.py | 5 +- addons/im/im.py | 2 +- addons/im/static/src/js/im.js | 332 +----------------- addons/im/static/src/js/im_common.js | 93 +++-- .../static/ext/static/js/livesupport.js | 3 +- 5 files changed, 78 insertions(+), 357 deletions(-) diff --git a/addons/im/__openerp__.py b/addons/im/__openerp__.py index 32a88d6734c..84775065371 100644 --- a/addons/im/__openerp__.py +++ b/addons/im/__openerp__.py @@ -18,7 +18,10 @@ chat in real time. It support several chats in parallel. 'security/im_security.xml', ], 'depends' : ['base', 'web'], - 'js': ['static/src/js/im.js'], + 'js': [ + 'static/src/js/im_common.js', + 'static/src/js/im.js', + ], 'css': ['static/src/css/*.css'], 'qweb': ['static/src/xml/*.xml'], 'installable': True, diff --git a/addons/im/im.py b/addons/im/im.py index 505ca3627b6..97860d33e0a 100644 --- a/addons/im/im.py +++ b/addons/im/im.py @@ -130,7 +130,7 @@ class LongPollingController(http.Controller): return "%s" % uuid.uuid1() def assert_uuid(uuid): - if not isinstance(uuid, (str, unicode, type(None))): + if not isinstance(uuid, (str, unicode, type(None))) and uuid != False: raise Exception("%s is not a uuid" % uuid) diff --git a/addons/im/static/src/js/im.js b/addons/im/static/src/js/im.js index a271c9eccf0..83195d8a5d1 100644 --- a/addons/im/static/src/js/im.js +++ b/addons/im/static/src/js/im.js @@ -4,14 +4,21 @@ openerp.im = function(instance) { var USERS_LIMIT = 20; var ERROR_DELAY = 5000; - var _t = instance.web._t, - _lt = instance.web._lt; + var _t = instance.web._t; var QWeb = instance.web.qweb; instance.web.UserMenu.include({ do_update: function(){ var self = this; this.update_promise.then(function() { + im_common.notification = function(message) { + instance.client.do_warn(message); + }; + im_common.to_url = function(file) { + return "/" + file; + }; + im_common.connection = openerp.session; + var im = new instance.im.InstantMessaging(self); im.appendTo(instance.client.$el); var button = new instance.im.ImTopButton(this); @@ -45,7 +52,7 @@ openerp.im = function(instance) { this.set("right_offset", 0); this.set("current_search", ""); this.users = []; - this.c_manager = new instance.im.ConversationManager(this); + this.c_manager = new im_common.ConversationManager(this); this.on("change:right_offset", this.c_manager, _.bind(function() { this.c_manager.set("right_offset", this.get("right_offset")); }, this)); @@ -148,323 +155,4 @@ openerp.im = function(instance) { }, }); - instance.im.ImUser = instance.web.Class.extend(instance.web.PropertiesMixin, { - init: function(parent, user_rec) { - instance.web.PropertiesMixin.init.call(this, parent); - user_rec.image_url = instance.session.url("/im/static/src/img/avatar/avatar.jpeg"); - if (user_rec.user) - user_rec.image_url = instance.session.url('/web/binary/image', {model:'res.users', field: 'image_small', id: user_rec.user[0]}); - this.set(user_rec); - this.set("watcher_count", 0); - this.on("change:watcher_count", this, function() { - if (this.get("watcher_count") === 0) - this.destroy(); - }); - }, - destroy: function() { - this.trigger("destroyed"); - instance.web.PropertiesMixin.destroy.call(this); - }, - add_watcher: function() { - this.set("watcher_count", this.get("watcher_count") + 1); - }, - remove_watcher: function() { - this.set("watcher_count", this.get("watcher_count") - 1); - }, - }); - - instance.im.ConversationManager = instance.web.Controller.extend({ - init: function(parent) { - this._super(parent); - this.set("right_offset", 0); - this.conversations = []; - this.users = {}; - this.on("change:right_offset", this, this.calc_positions); - this.set("window_focus", true); - this.set("waiting_messages", 0); - this.focus_hdl = _.bind(function() { - this.set("window_focus", true); - }, this); - $(window).bind("focus", this.focus_hdl); - this.blur_hdl = _.bind(function() { - this.set("window_focus", false); - }, this); - $(window).bind("blur", this.blur_hdl); - this.on("change:window_focus", this, this.window_focus_change); - this.window_focus_change(); - this.on("change:waiting_messages", this, this.messages_change); - this.messages_change(); - this.create_ting(); - this.activated = false; - this.users_cache = {}; - this.last = null; - this.unload_event_handler = _.bind(this.unload, this); - }, - start_polling: function() { - var self = this; - return new instance.web.Model("im.user").call("get_by_user_id", [instance.session.uid]).then(function(my_id) { - self.my_id = my_id["id"]; - return self.ensure_users([self.my_id]).then(function() { - var me = self.users_cache[self.my_id]; - delete self.users_cache[self.my_id]; - self.me = me; - self.rpc("/longpolling/im/activated", {}, {shadow: true}).then(function(activated) { - if (activated) { - self.activated = true; - $(window).on("unload", self.unload_event_handler); - self.poll(); - } - }, function(a, e) { - e.preventDefault(); - }); - }); - }); - }, - unload: function() { - return new instance.web.Model("im.user").call("im_disconnect", [], {context: new instance.web.CompoundContext()}); - }, - ensure_users: function(user_ids) { - var no_cache = {}; - _.each(user_ids, function(el) { - if (! this.users_cache[el]) - no_cache[el] = el; - }, this); - var self = this; - if (_.size(no_cache) === 0) - return $.when(); - else - return new instance.web.Model("im.user").call("read", [_.values(no_cache), ["name", "user", "uuid", "im_status"]], - {context: new instance.web.CompoundContext()}).then(function(users) { - self.add_to_user_cache(users); - }); - }, - add_to_user_cache: function(user_recs) { - _.each(user_recs, function(user_rec) { - if (! this.users_cache[user_rec.id]) { - var user = new instance.im.ImUser(this, user_rec); - this.users_cache[user_rec.id] = user; - user.on("destroyed", this, function() { - delete this.users_cache[user_rec.id]; - }); - } - }, this); - }, - get_user: function(user_id) { - return this.users_cache[user_id]; - }, - poll: function() { - var self = this; - var user_ids = _.map(this.users_cache, function(el) { - return el.get("id"); - }); - this.rpc("/longpolling/im/poll", { - last: this.last, - users_watch: user_ids, - context: instance.web.pyeval.eval('context', {}), - }, {shadow: true}).then(function(result) { - _.each(result.users_status, function(el) { - if (self.get_user(el.id)) - self.get_user(el.id).set(el); - }); - self.last = result.last; - var user_ids = _.pluck(_.pluck(result.res, "from_id"), 0); - self.ensure_users(user_ids).then(function() { - _.each(result.res, function(mes) { - var user = self.get_user(mes.from_id[0]); - self.received_message(mes, user); - }); - self.poll(); - }); - }, function(unused, e) { - e.preventDefault(); - setTimeout(_.bind(self.poll, self), ERROR_DELAY); - }); - }, - get_activated: function() { - return this.activated; - }, - create_ting: function() { - if (typeof(Audio) === "undefined") { - this.ting = {play: function() {}}; - return; - } - var kitten = jQuery.param !== undefined && jQuery.deparam(jQuery.param.querystring()).kitten !== undefined; - this.ting = new Audio(instance.webclient.session.origin + "/im/static/src/audio/" + (kitten ? "purr" : "Ting") + - (new Audio().canPlayType("audio/ogg; codecs=vorbis") ? ".ogg" : ".mp3")); - }, - window_focus_change: function() { - if (this.get("window_focus")) { - this.set("waiting_messages", 0); - } - }, - messages_change: function() { - if (! instance.webclient.set_title_part) - return; - instance.webclient.set_title_part("aa_im_messages", this.get("waiting_messages") === 0 ? undefined : - _.str.sprintf(_t("%d Messages"), this.get("waiting_messages"))); - }, - activate_user: function(user, focus) { - var conv = this.users[user.get('id')]; - if (! conv) { - conv = new instance.im.Conversation(this, user, this.me); - conv.appendTo(instance.client.$el); - conv.on("destroyed", this, function() { - this.conversations = _.without(this.conversations, conv); - delete this.users[conv.user.get('id')]; - this.calc_positions(); - }); - this.conversations.push(conv); - this.users[user.get('id')] = conv; - this.calc_positions(); - } - if (focus) - conv.focus(); - return conv; - }, - received_message: function(message, user) { - if (! this.get("window_focus")) { - this.set("waiting_messages", this.get("waiting_messages") + 1); - this.ting.play(); - this.create_ting(); - } - var conv = this.activate_user(user); - conv.received_message(message); - }, - calc_positions: function() { - var current = this.get("right_offset"); - _.each(_.range(this.conversations.length), function(i) { - this.conversations[i].set("right_position", current); - current += this.conversations[i].$el.outerWidth(true); - }, this); - }, - destroy: function() { - $(window).off("unload", this.unload_event_handler); - $(window).unbind("blur", this.blur_hdl); - $(window).unbind("focus", this.focus_hdl); - this._super(); - }, - }); - - instance.im.Conversation = instance.web.Widget.extend({ - "template": "Conversation", - events: { - "keydown input": "send_message", - "click .oe_im_chatview_close": "destroy", - "click .oe_im_chatview_header": "show_hide", - }, - init: function(parent, user, me) { - this._super(parent); - this.me = me; - this.user = user; - this.user.add_watcher(); - this.set("right_position", 0); - this.shown = true; - this.set("pending", 0); - }, - start: function() { - var change_status = function() { - this.$el.toggleClass("oe_im_chatview_disconnected_status", this.user.get("im_status") === false); - this.$(".oe_im_chatview_online").toggle(this.user.get("im_status") === true); - this._go_bottom(); - }; - this.user.on("change:im_status", this, change_status); - change_status.call(this); - - this.on("change:right_position", this, this.calc_pos); - this.full_height = this.$el.height(); - this.calc_pos(); - this.on("change:pending", this, _.bind(function() { - if (this.get("pending") === 0) { - this.$(".oe_im_chatview_nbr_messages").text(""); - } else { - this.$(".oe_im_chatview_nbr_messages").text("(" + this.get("pending") + ")"); - } - }, this)); - }, - show_hide: function() { - if (this.shown) { - this.$el.animate({ - height: this.$(".oe_im_chatview_header").outerHeight(), - }); - } else { - this.$el.animate({ - height: this.full_height, - }); - } - this.shown = ! this.shown; - if (this.shown) { - this.set("pending", 0); - } - }, - calc_pos: function() { - this.$el.css("right", this.get("right_position")); - }, - received_message: function(message) { - if (this.shown) { - this.set("pending", 0); - } else { - this.set("pending", this.get("pending") + 1); - } - this._add_bubble(this.user, message.message, message.date); - }, - send_message: function(e) { - if(e && e.which !== 13) { - return; - } - var mes = this.$("input").val(); - if (! mes.trim()) { - return; - } - this.$("input").val(""); - var send_it = _.bind(function() { - var model = new instance.web.Model("im.message"); - return model.call("post", [mes, this.user.get('id')], - {context: new instance.web.CompoundContext()}); - }, this); - var tries = 0; - send_it().then(_.bind(function() { - this._add_bubble(this.me, mes, instance.web.datetime_to_str(new Date())); - }, this), function(error, e) { - e.preventDefault(); - tries += 1; - if (tries < 3) - return send_it(); - }); - }, - _add_bubble: function(user, item, date) { - var items = [item]; - if (user === this.last_user) { - this.last_bubble.remove(); - items = this.last_items.concat(items); - } - this.last_user = user; - this.last_items = items; - date = instance.web.str_to_datetime(date); - var now = new Date(); - var diff = now - date; - if (diff > (1000 * 60 * 60 * 24)) { - date = $.timeago(date); - } else { - date = date.toString(Date.CultureInfo.formatPatterns.shortTime); - } - - this.last_bubble = $(QWeb.render("Conversation.bubble", {"items": items, "user": user, "time": date})); - $(this.$(".oe_im_chatview_content").children()[0]).append(this.last_bubble); - this._go_bottom(); - }, - _go_bottom: function() { - this.$(".oe_im_chatview_content").scrollTop($(this.$(".oe_im_chatview_content").children()[0]).height()); - }, - focus: function() { - this.$(".oe_im_chatview_input").focus(); - if (! this.shown) - this.show_hide(); - }, - destroy: function() { - this.user.remove_watcher(); - this.trigger("destroyed"); - return this._super(); - }, - }); - } \ No newline at end of file diff --git a/addons/im/static/src/js/im_common.js b/addons/im/static/src/js/im_common.js index 2768627f951..7802947967d 100644 --- a/addons/im/static/src/js/im_common.js +++ b/addons/im/static/src/js/im_common.js @@ -38,8 +38,13 @@ function declare($, _, openerp) { init: function(parent, user_rec) { openerp.PropertiesMixin.init.call(this, parent); user_rec.image_url = im_common.to_url("im/static/src/img/avatar/avatar.jpeg"); - if (user_rec.image) - user_rec.image_url = "data:image/png;base64," + user_rec.image; + + // TODO : check it works correctly + if (user_rec.user) + user_rec.image_url = im_common.connection.url('/web/binary/image', {model:'res.users', field: 'image_small', id: user_rec.user[0]}); + /*if (user_rec.image) + user_rec.image_url = "data:image/png;base64," + user_rec.image;*/ + this.set(user_rec); this.set("watcher_count", 0); this.on("change:watcher_count", this, function() { @@ -62,7 +67,13 @@ function declare($, _, openerp) { im_common.ConversationManager = openerp.Class.extend(openerp.PropertiesMixin, { init: function(parent, options) { openerp.PropertiesMixin.init.call(this, parent); - this.options = options; + this.options = _.clone(options) || {}; + _.defaults(this.options, { + inputPlaceholder: _t("Say something..."), + defaultMessage: null, + userName: _t("Anonymous"), + anonymous_mode: false + }); this.set("right_offset", 0); this.conversations = []; this.users = {}; @@ -90,26 +101,40 @@ function declare($, _, openerp) { start_polling: function() { var self = this; - var uuid = localStorage["oe_livesupport_uuid"]; - var def = $.when(uuid); + var auth_def = null; + var user_id = null; - if (! uuid) { - def = im_common.connection.rpc("/longpolling/im/gen_uuid", {}); + if (this.options.anonymous_mode) { + var uuid = localStorage["oe_livesupport_uuid"]; + var def = $.when(uuid); + + if (! uuid) { + def = im_common.connection.rpc("/longpolling/im/gen_uuid", {}); + } + var anonymous_user_id = null; + auth_def = def.then(function(uuid) { + localStorage["oe_livesupport_uuid"] = uuid; + return im_common.connection.model("im.user").call("get_by_user_id", [uuid]); + }).then(function(my_id) { + user_id = my_id["id"]; + return im_common.connection.model("im.user").call("assign_name", [uuid, self.options.userName]); + }); + } else { + auth_def = im_common.connection.model("im.user").call("get_by_user_id", + [im_common.connection.uid]).then(function(my_id) { + user_id = my_id["id"]; + }); } - return def.then(function(uuid) { - localStorage["oe_livesupport_uuid"] = uuid; - return im_common.connection.model("im.user").call("get_by_user_id", [uuid]); - }).then(function(my_id) { - self.my_id = my_id["id"]; - return im_common.connection.model("im.user").call("assign_name", [uuid, self.options.userName]); - }).then(function() { + + auth_def.then(function() { + self.my_id = user_id; return self.ensure_users([self.my_id]); }).then(function() { var me = self.users_cache[self.my_id]; delete self.users_cache[self.my_id]; self.me = me; - me.set("name", "You"); - return im_common.connection.rpc("/longpolling/im/activated", {}); + me.set("name", _t("You")); + return im_common.connection.rpc("/longpolling/im/activated", {}, {shadow: true}); }).then(function(activated) { if (activated) { self.activated = true; @@ -118,10 +143,12 @@ function declare($, _, openerp) { } else { return $.Deferred().reject(); } + }, function(a, e) { + e.preventDefault(); }); }, unload: function() { - im_common.connection.model("im.user").call("im_disconnect", [], {uuid: this.me.get("uuid"), context: {}}); + return im_common.connection.model("im.user").call("im_disconnect", [], {uuid: this.me.get("uuid"), context: {}}); }, ensure_users: function(user_ids) { var no_cache = {}; @@ -152,7 +179,6 @@ function declare($, _, openerp) { return this.users_cache[user_id]; }, poll: function() { - console.debug("live support beggin polling"); var self = this; var user_ids = _.map(this.users_cache, function(el) { return el.get("id"); @@ -160,11 +186,8 @@ function declare($, _, openerp) { im_common.connection.rpc("/longpolling/im/poll", { last: this.last, users_watch: user_ids, - db: im_common.connection.database, - uid: im_common.connection.userId, - password: im_common.connection.password, uuid: self.me.get("uuid") - }).then(function(result) { + }, {shadow: true}).then(function(result) { _.each(result.users_status, function(el) { if (self.get_user(el.id)) self.get_user(el.id).set(el); @@ -178,7 +201,8 @@ function declare($, _, openerp) { }); self.poll(); }); - }, function() { + }, function(unused, e) { + e.preventDefault(); setTimeout(_.bind(self.poll, self), ERROR_DELAY); }); }, @@ -190,10 +214,12 @@ function declare($, _, openerp) { this.ting = {play: function() {}}; return; } - this.ting = new Audio(new Audio().canPlayType("audio/ogg; codecs=vorbis") ? - im_common.to_url("im/static/src/audio/Ting.ogg") : - im_common.to_url("im/static/src/audio/Ting.mp3") - ); + var kitten = jQuery.deparam !== undefined && jQuery.deparam(jQuery.param.querystring()).kitten !== undefined; + this.ting = new Audio(im_common.to_url( + "im/static/src/audio/" + + (kitten ? "purr" : "Ting") + + (new Audio().canPlayType("audio/ogg; codecs=vorbis") ? ".ogg": ".mp3") + )); }, window_focus_change: function() { if (this.get("window_focus")) { @@ -201,10 +227,10 @@ function declare($, _, openerp) { } }, messages_change: function() { - //if (! instance.webclient.set_title_part) - // return; - //instance.webclient.set_title_part("im_messages", this.get("waiting_messages") === 0 ? undefined : - // _.str.sprintf(_t("%d Messages"), this.get("waiting_messages"))); + if (! openerp.webclient || !openerp.webclient.set_title_part) + return; + openerp.webclient.set_title_part("im_messages", this.get("waiting_messages") === 0 ? undefined : + _.str.sprintf(_t("%d Messages"), this.get("waiting_messages"))); }, activate_user: function(user, focus) { var conv = this.users[user.get('id')]; @@ -330,6 +356,7 @@ function declare($, _, openerp) { send_it().then(_.bind(function() { this._add_bubble(this.me, mes, new Date()); }, this), function(error, e) { + e.preventDefault(); tries += 1; if (tries < 3) return send_it(); @@ -358,6 +385,8 @@ function declare($, _, openerp) { }, focus: function() { this.$(".oe_im_chatview_input").focus(); + if (! this.shown) + this.show_hide(); }, destroy: function() { this.user.remove_watcher(); @@ -369,7 +398,7 @@ function declare($, _, openerp) { return im_common; } -if (typeof(define) !== undefined) { +if (typeof(define) !== "undefined") { define(["jquery", "underscore", "openerp"], declare); } else { window.im_common = declare($, _, openerp); diff --git a/addons/im_livechat/static/ext/static/js/livesupport.js b/addons/im_livechat/static/ext/static/js/livesupport.js index 0e13c236170..20dedd1bc75 100644 --- a/addons/im_livechat/static/ext/static/js/livesupport.js +++ b/addons/im_livechat/static/ext/static/js/livesupport.js @@ -20,7 +20,8 @@ define(["openerp", "im_common", "underscore", "require", "jquery", inputPlaceholder: _t("How may I help you?"), defaultMessage: null, auto: false, - userName: _t("Anonymous") + userName: _t("Anonymous"), + anonymous_mode: true }); im_common.notification = notification; From 124b93b0c10e58a5d8cf6b81088a2a585337707e Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 20 Aug 2013 16:41:47 +0200 Subject: [PATCH 5/8] Fixed a lot of stuff to make it work again in live support bzr revid: nicolas.vanhoren@openerp.com-20130820144147-gnc26ul3ql86qfzs --- addons/im/static/src/css/im.css | 157 ------------------ addons/im/static/src/js/im.js | 1 - addons/im/static/src/js/im_common.js | 2 +- addons/im/static/src/xml/im.xml | 33 ---- addons/im/static/src/xml/im_common.xml | 5 +- .../static/ext/static/js/livesupport.js | 29 ++-- 6 files changed, 19 insertions(+), 208 deletions(-) diff --git a/addons/im/static/src/css/im.css b/addons/im/static/src/css/im.css index 269d411d416..03a20bb0510 100644 --- a/addons/im/static/src/css/im.css +++ b/addons/im/static/src/css/im.css @@ -105,160 +105,3 @@ vertical-align: middle; border: 0; } - -/* conversations */ - -.openerp .oe_im_chatview { - position: fixed; - overflow: hidden; - bottom: 6px; - margin-right: 6px; - background: rgba(60, 60, 60, 0.8); - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - -moz-box-shadow: 0 0 3px rgba(0,0,0,0.3), 0 2px 4px rgba(0,0,0,0.3); - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.3); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.3); - width: 240px; -} -.openerp .oe_im_chatview .oe_im_chatview_disconnected { - display:none; - z-index: 100; - width: 100%; - background: #E8EBEF; - padding: 5px; - font-size: 11px; - color: #999; - line-height: 14px; - height: 28px; - overflow: hidden; -} -.openerp .oe_im_chatview.oe_im_chatview_disconnected_status .oe_im_chatview_disconnected { - display: block; -} -.openerp .oe_im_chatview .oe_im_chatview_header { - padding: 3px 6px 2px; - background: #DEDEDE; - background: -moz-linear-gradient(#FCFCFC, #DEDEDE); - background: -webkit-gradient(linear, left top, left bottom, from(#FCFCFC), to(#DEDEDE)); - -moz-border-radius: 3px 3px 0 0; - -webkit-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; - border-bottom: 1px solid #AEB9BD; - cursor: pointer; -} -.openerp .oe_im_chatview .oe_im_chatview_close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; - font-size: 18px; - line-height: 16px; - float: right; - font-weight: bold; - color: black; - text-shadow: 0 1px 0 white; - opacity: 0.2; -} -.openerp .oe_im_chatview .oe_im_chatview_content { - overflow: auto; - height: 287px; -} -.openerp .oe_im_chatview.oe_im_chatview_disconnected_status .oe_im_chatview_content { - height: 249px; -} -.openerp .oe_im_chatview .oe_im_chatview_footer { - position: relative; - padding: 3px; - border-top: 1px solid #AEB9BD; - background: #DEDEDE; - background: -moz-linear-gradient(#FCFCFC, #DEDEDE); - background: -webkit-gradient(linear, left top, left bottom, from(#FCFCFC), to(#DEDEDE)); - -moz-border-radius: 0 0 3px 3px; - -webkit-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; -} -.openerp .oe_im_chatview .oe_im_chatview_input { - width: 222px; - font-family: Lato, Helvetica, sans-serif; - font-size: 13px; - color: #333; - padding: 1px 5px; - border: 1px solid #AEB9BD; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - -moz-box-shadow: inset 0 1px 4px rgba(0,0,0,0.2); - -webkit-box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.2); - box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.2); -} -.openerp .oe_im_chatview .oe_im_chatview_bubble { - background: white; - position: relative; - padding: 3px; - margin: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; -} -.openerp .oe_im_chatview .oe_im_chatview_clip { - position: relative; - float: left; - width: 26px; - height: 26px; - margin-right: 4px; - -moz-box-shadow: 0 0 2px 1px rgba(0,0,0,0.25); - -webkit-box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.25); - box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.25); -} -.openerp .oe_im_chatview .oe_im_chatview_avatar { - float: left; - width: 26px; - height: auto; - clip: rect(0, 26px, 26px, 0); - max-width: 100%; - width: auto 9; - height: auto; - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} -.openerp .oe_im_chatview .oe_im_chatview_time { - position: absolute; - right: 0px; - top: 0px; - margin: 3px; - text-align: right; - line-height: 13px; - font-size: 11px; - color: #999; - width: 60px; - overflow: hidden; -} -.openerp .oe_im_chatview .oe_im_chatview_from { - margin: 0 0 2px 0; - line-height: 14px; - font-weight: bold; - font-size: 12px; - width: 140px; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; - color: #3A87AD; -} -.openerp .oe_im_chatview .oe_im_chatview_bubble_list { -} -.openerp .oe_im_chatview .oe_im_chatview_bubble_item { - margin: 0 0 2px 30px; - line-height: 14px; - word-wrap: break-word; -} - -.openerp .oe_im_chatview_online { - display: none; - margin-top: -4px; - width: 11px; - height: 11px; -} diff --git a/addons/im/static/src/js/im.js b/addons/im/static/src/js/im.js index 83195d8a5d1..f0f1771537b 100644 --- a/addons/im/static/src/js/im.js +++ b/addons/im/static/src/js/im.js @@ -2,7 +2,6 @@ openerp.im = function(instance) { var USERS_LIMIT = 20; - var ERROR_DELAY = 5000; var _t = instance.web._t; var QWeb = instance.web.qweb; diff --git a/addons/im/static/src/js/im_common.js b/addons/im/static/src/js/im_common.js index 7802947967d..d89474f32f5 100644 --- a/addons/im/static/src/js/im_common.js +++ b/addons/im/static/src/js/im_common.js @@ -126,7 +126,7 @@ function declare($, _, openerp) { }); } - auth_def.then(function() { + return auth_def.then(function() { self.my_id = user_id; return self.ensure_users([self.my_id]); }).then(function() { diff --git a/addons/im/static/src/xml/im.xml b/addons/im/static/src/xml/im.xml index 795d1b3e698..1acb538db4f 100644 --- a/addons/im/static/src/xml/im.xml +++ b/addons/im/static/src/xml/im.xml @@ -27,37 +27,4 @@
- -
-
- - - - -
-
- -
-
-
-
- -
-
- -
-
- -
-
-
- -
-
-
-
-
-
\ No newline at end of file diff --git a/addons/im/static/src/xml/im_common.xml b/addons/im/static/src/xml/im_common.xml index c8421552a48..0ef8040d8c5 100644 --- a/addons/im/static/src/xml/im_common.xml +++ b/addons/im/static/src/xml/im_common.xml @@ -4,7 +4,8 @@
- + +
@@ -23,7 +24,7 @@
-
+
diff --git a/addons/im_livechat/static/ext/static/js/livesupport.js b/addons/im_livechat/static/ext/static/js/livesupport.js index 20dedd1bc75..88ada2b6b20 100644 --- a/addons/im_livechat/static/ext/static/js/livesupport.js +++ b/addons/im_livechat/static/ext/static/js/livesupport.js @@ -13,7 +13,6 @@ define(["openerp", "im_common", "underscore", "require", "jquery", var livesupport = {}; livesupport.main = function(server_url, db, login, password, channel, options) { - var defs = []; options = options || {}; _.defaults(options, { buttonText: _t("Chat with one of our collaborators"), @@ -25,22 +24,24 @@ define(["openerp", "im_common", "underscore", "require", "jquery", }); im_common.notification = notification; - im_common.to_url = require.toUrl; - defs.push(add_css("im/static/src/css/im_common.css")); - defs.push(add_css("im_livechat/static/ext/static/lib/jquery-achtung/src/ui.achtung.css")); + //im_common.to_url = require.toUrl; - return $.when.apply($, defs).then(function() { - console.log("starting live support customer app"); - im_common.connection = new openerp.Session(null, server_url, { override_session: true }); - return im_common.connection.session_authenticate(db, login, password); - }).then(function() { - return im_common.connection.rpc('/web/proxy/load', {path: '/im_livechat/static/ext/static/js/livechat.xml'}).then(function(xml) { + console.log("starting live support customer app"); + im_common.connection = new openerp.Session(null, server_url, { override_session: true }); + return im_common.connection.session_authenticate(db, login, password).then(function() { + im_common.to_url = function(file) { + return im_common.connection.url("/" + file); + }; + var defs = []; + defs.push(add_css("im/static/src/css/im_common.css")); + defs.push(add_css("im_livechat/static/ext/static/lib/jquery-achtung/src/ui.achtung.css")); + defs.push(im_common.connection.rpc('/web/proxy/load', {path: '/im_livechat/static/ext/static/js/livechat.xml'}).then(function(xml) { openerp.qweb.add_template(xml); - }); - }).then(function() { - return im_common.connection.rpc('/web/proxy/load', {path: '/im/static/src/xml/im_common.xml'}).then(function(xml) { + })); + defs.push(im_common.connection.rpc('/web/proxy/load', {path: '/im/static/src/xml/im_common.xml'}).then(function(xml) { openerp.qweb.add_template(xml); - }); + })); + return $.when.apply($, defs); }).then(function() { return im_common.connection.rpc("/im_livechat/available", {db: db, channel: channel}).then(function(activated) { if (! activated & ! options.auto) From d756dc5977130a1bde68d47febc725b4cf14ac0a Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 20 Aug 2013 16:48:43 +0200 Subject: [PATCH 6/8] Removed to_url bzr revid: nicolas.vanhoren@openerp.com-20130820144843-yeny7kpv1qcqijl9 --- addons/im/static/src/js/im.js | 3 --- addons/im/static/src/js/im_common.js | 11 ++++------- addons/im/static/src/xml/im_common.xml | 2 +- .../im_livechat/static/ext/static/js/livesupport.js | 10 +++------- 4 files changed, 8 insertions(+), 18 deletions(-) diff --git a/addons/im/static/src/js/im.js b/addons/im/static/src/js/im.js index f0f1771537b..8e21167cc9a 100644 --- a/addons/im/static/src/js/im.js +++ b/addons/im/static/src/js/im.js @@ -13,9 +13,6 @@ openerp.im = function(instance) { im_common.notification = function(message) { instance.client.do_warn(message); }; - im_common.to_url = function(file) { - return "/" + file; - }; im_common.connection = openerp.session; var im = new instance.im.InstantMessaging(self); diff --git a/addons/im/static/src/js/im_common.js b/addons/im/static/src/js/im_common.js index d89474f32f5..72097c35f79 100644 --- a/addons/im/static/src/js/im_common.js +++ b/addons/im/static/src/js/im_common.js @@ -19,9 +19,6 @@ function declare($, _, openerp) { All of this must be defined to use this module */ _.extend(im_common, { - to_url: function(file) { - throw new Error("Not implemented"); - }, notification: function(message) { throw new Error("Not implemented"); }, @@ -37,7 +34,7 @@ function declare($, _, openerp) { im_common.ImUser = openerp.Class.extend(openerp.PropertiesMixin, { init: function(parent, user_rec) { openerp.PropertiesMixin.init.call(this, parent); - user_rec.image_url = im_common.to_url("im/static/src/img/avatar/avatar.jpeg"); + user_rec.image_url = im_common.connection.url("/im/static/src/img/avatar/avatar.jpeg"); // TODO : check it works correctly if (user_rec.user) @@ -215,8 +212,8 @@ function declare($, _, openerp) { return; } var kitten = jQuery.deparam !== undefined && jQuery.deparam(jQuery.param.querystring()).kitten !== undefined; - this.ting = new Audio(im_common.to_url( - "im/static/src/audio/" + + this.ting = new Audio(im_common.connection.url( + "/im/static/src/audio/" + (kitten ? "purr" : "Ting") + (new Audio().canPlayType("audio/ogg; codecs=vorbis") ? ".ogg": ".mp3") )); @@ -293,7 +290,7 @@ function declare($, _, openerp) { this.inputPlaceholder = this.options.defaultInputPlaceholder; }, start: function() { - this.$().append(openerp.qweb.render("im_common.conversation", {widget: this, to_url: im_common.to_url})); + this.$().append(openerp.qweb.render("im_common.conversation", {widget: this, to_url: _.bind(im_common.connection.url, im_common.connection)})); var change_status = function() { this.$().toggleClass("oe_im_chatview_disconnected_status", this.user.get("im_status") === false); this.$(".oe_im_chatview_online").toggle(this.user.get("im_status") === true); diff --git a/addons/im/static/src/xml/im_common.xml b/addons/im/static/src/xml/im_common.xml index 0ef8040d8c5..4286d0c9710 100644 --- a/addons/im/static/src/xml/im_common.xml +++ b/addons/im/static/src/xml/im_common.xml @@ -3,7 +3,7 @@
- + diff --git a/addons/im_livechat/static/ext/static/js/livesupport.js b/addons/im_livechat/static/ext/static/js/livesupport.js index 88ada2b6b20..f61859200e3 100644 --- a/addons/im_livechat/static/ext/static/js/livesupport.js +++ b/addons/im_livechat/static/ext/static/js/livesupport.js @@ -24,17 +24,13 @@ define(["openerp", "im_common", "underscore", "require", "jquery", }); im_common.notification = notification; - //im_common.to_url = require.toUrl; console.log("starting live support customer app"); im_common.connection = new openerp.Session(null, server_url, { override_session: true }); return im_common.connection.session_authenticate(db, login, password).then(function() { - im_common.to_url = function(file) { - return im_common.connection.url("/" + file); - }; var defs = []; - defs.push(add_css("im/static/src/css/im_common.css")); - defs.push(add_css("im_livechat/static/ext/static/lib/jquery-achtung/src/ui.achtung.css")); + defs.push(add_css("/im/static/src/css/im_common.css")); + defs.push(add_css("/im_livechat/static/ext/static/lib/jquery-achtung/src/ui.achtung.css")); defs.push(im_common.connection.rpc('/web/proxy/load', {path: '/im_livechat/static/ext/static/js/livechat.xml'}).then(function(xml) { openerp.qweb.add_template(xml); })); @@ -56,7 +52,7 @@ define(["openerp", "im_common", "underscore", "require", "jquery", var add_css = function(relative_file_name) { var css_def = $.Deferred(); - $('') + $('') .appendTo($("head")).ready(function() { css_def.resolve(); }); From 1d5f220d128588b6055180bc61ec5ff58aa4619c Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 20 Aug 2013 17:06:07 +0200 Subject: [PATCH 7/8] Solved bottom offset problem bzr revid: nicolas.vanhoren@openerp.com-20130820150607-btn650h12nygofcm --- addons/im/static/src/css/im_common.css | 2 +- addons/im/static/src/js/im_common.js | 6 ++++++ addons/im_livechat/static/ext/static/js/livesupport.js | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/addons/im/static/src/css/im_common.css b/addons/im/static/src/css/im_common.css index bfe26b5e838..f3877af1686 100644 --- a/addons/im/static/src/css/im_common.css +++ b/addons/im/static/src/css/im_common.css @@ -36,7 +36,7 @@ .oe_im_chatview { position: fixed; overflow: hidden; - bottom: 42px; + margin-bottom: 5px; margin-right: 6px; background: rgba(60, 60, 60, 0.8); -moz-border-radius: 3px; diff --git a/addons/im/static/src/js/im_common.js b/addons/im/static/src/js/im_common.js index 72097c35f79..d1a67d26d59 100644 --- a/addons/im/static/src/js/im_common.js +++ b/addons/im/static/src/js/im_common.js @@ -72,9 +72,11 @@ function declare($, _, openerp) { anonymous_mode: false }); this.set("right_offset", 0); + this.set("bottom_offset", 0); this.conversations = []; this.users = {}; this.on("change:right_offset", this, this.calc_positions); + this.on("change:bottom_offset", this, this.calc_positions); this.set("window_focus", true); this.set("waiting_messages", 0); this.focus_hdl = _.bind(function() { @@ -259,6 +261,7 @@ function declare($, _, openerp) { calc_positions: function() { var current = this.get("right_offset"); _.each(_.range(this.conversations.length), function(i) { + this.conversations[i].set("bottom_position", this.get("bottom_offset")); this.conversations[i].set("right_position", current); current += this.conversations[i].$().outerWidth(true); }, this); @@ -285,6 +288,7 @@ function declare($, _, openerp) { this.user = user; this.user.add_watcher(); this.set("right_position", 0); + this.set("bottom_position", 0); this.shown = true; this.set("pending", 0); this.inputPlaceholder = this.options.defaultInputPlaceholder; @@ -300,6 +304,7 @@ function declare($, _, openerp) { change_status.call(this); this.on("change:right_position", this, this.calc_pos); + this.on("change:bottom_position", this, this.calc_pos); this.full_height = this.$().height(); this.calc_pos(); this.on("change:pending", this, _.bind(function() { @@ -327,6 +332,7 @@ function declare($, _, openerp) { }, calc_pos: function() { this.$().css("right", this.get("right_position")); + this.$().css("bottom", this.get("bottom_position")); }, received_message: function(message) { if (this.shown) { diff --git a/addons/im_livechat/static/ext/static/js/livesupport.js b/addons/im_livechat/static/ext/static/js/livesupport.js index f61859200e3..fd5cecfe7d9 100644 --- a/addons/im_livechat/static/ext/static/js/livesupport.js +++ b/addons/im_livechat/static/ext/static/js/livesupport.js @@ -80,6 +80,7 @@ define(["openerp", "im_common", "underscore", "require", "jquery", click: function() { if (! this.manager) { this.manager = new im_common.ConversationManager(this, this.options); + this.manager.set("bottom_offset", 37); this.activated_def = this.manager.start_polling(); } var def = $.Deferred(); From 89b3edad09c7ab1aa292612543aaa2234fe5a51c Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 20 Aug 2013 17:12:41 +0200 Subject: [PATCH 8/8] Solved style problems identified by jshint bzr revid: nicolas.vanhoren@openerp.com-20130820151241-1oi29vxm8iq34v8x --- addons/im/Gruntfile.js | 2 +- addons/im/static/src/js/im.js | 9 +++++++-- addons/im/static/src/js/im_common.js | 4 +--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/addons/im/Gruntfile.js b/addons/im/Gruntfile.js index 3d4a7f5aa50..e8c88bbec9a 100644 --- a/addons/im/Gruntfile.js +++ b/addons/im/Gruntfile.js @@ -2,7 +2,7 @@ module.exports = function(grunt) { grunt.initConfig({ jshint: { - src: ['static/js/*.js'], + src: ['static/src/js/*.js'], options: { sub: true, //[] instead of . evil: true, //eval diff --git a/addons/im/static/src/js/im.js b/addons/im/static/src/js/im.js index 8e21167cc9a..9af04bf4f43 100644 --- a/addons/im/static/src/js/im.js +++ b/addons/im/static/src/js/im.js @@ -1,5 +1,10 @@ -openerp.im = function(instance) { +(function() { + "use strict"; + + var instance = openerp; + + openerp.im = {}; var USERS_LIMIT = 20; @@ -151,4 +156,4 @@ openerp.im = function(instance) { }, }); -} \ No newline at end of file +})(); \ No newline at end of file diff --git a/addons/im/static/src/js/im_common.js b/addons/im/static/src/js/im_common.js index d1a67d26d59..a6314a978e2 100644 --- a/addons/im/static/src/js/im_common.js +++ b/addons/im/static/src/js/im_common.js @@ -26,8 +26,6 @@ function declare($, _, openerp) { }); var _t = openerp._t; - - var im_common = {}; var ERROR_DELAY = 5000; @@ -283,7 +281,7 @@ function declare($, _, openerp) { }, init: function(parent, user, me, options) { this._super(parent); - this.options = options + this.options = options; this.me = me; this.user = user; this.user.add_watcher();