* R= W 8a ׎ '  *    y - k5 > B ` j u { &  ̓ | Y  n   <   V- 3 5 8 @ C eR !f w y ~   g њ  [ U   w ~ Q  + wt>uf z#([8:.I\K0U^aql pituwxy(|  qS, itf5/ N0*wL>'zO$k@3l4355_78E99;;<`=>>E??T@@yAYB7CjDEGxI2JJKMfNNHOO.PP P 1Q Q R RSKTTVWX\]_diIjjjEkklimmwnnooNpp^qqrsRtuuTv"wxxywz={{|h}3~.Ɔk ׊,׋>jÍ]0}ȏ RZmND igǗ%s՚4xT  C  ̝ b W:ΡO`ףQۥ% x!˦"#[$%j&~'h()+%,-.P/01|23@4պ56E7м8^9:;=<=J>J?@AHBCnDIEFDGH|I)JvKLPMN1OPQvRS(TUVOWX-YzZ[R\]^^_`aAbc#defgEhijkl\mnoOpqrst3uzvwLxyzXYZ[\{]^_b`abc^de.fgKli m n= o p qi r s' t u v: w x yOz{|K&A!P !t#%).+O-.V0223R6K8g:<<==>>Y??4AAAhBBTCCFH|IIVJJJ>KKTLMM8NNN7O}OO/PPPQ4RR SZSSTTUU^VWWXRXXYZf[[\\]_]]]:^^__(``bLcddkef8h>j \l n ip r su0vv4wwwXyz}M4)  ,-.//456"789@:;<P=>?g@A(BCDAEFGZHI JnKL#MNO6PQRSV2WXYJZ[H\]^0_Xabech_m* n o ph q r sr t u= v wxgy%zi u;5Obek~3ӿSS"/q4/i!eI(U<&O IR2^mGa} NuQB%#+16^<AG MRZkbxkrzEv)b,-\@c=)wR / {   jE"nj?I` !I"#$m%&%'(5)*+,-B./012q345F6789]:;<6=>?@TABC, Du E F GP H I J" Kk L Z [ \N]U^j_B`abAegfh|iX!jq#k&l?(m)n,s/t!1uu1v!3w4x5yQ6z6{7~89<"=?@wA5BBBmCCCEDD!EEFLPRPUUURVVY[/\7ee'fhj/kk lXlllmnntpqrrXsstuuxzzk~?jc!kclc]mct|ttݴtt߷tXt\tbtttttt`ttt-tttqtPtX1

// Copyright 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var chrome; if (!chrome) chrome = {}; if (!chrome.embeddedSearch) { chrome.embeddedSearch = new function() { this.searchBox = new function() { // ======================================================================= // Private functions // ======================================================================= native function Focus(); native function GetMostVisitedItemData(); native function GetQuery(); native function GetSearchRequestParams(); native function GetRightToLeft(); native function GetSuggestionToPrefetch(); native function IsFocused(); native function IsKeyCaptureEnabled(); native function Paste(); native function StartCapturingKeyStrokes(); native function StopCapturingKeyStrokes(); // ======================================================================= // Exported functions // ======================================================================= this.__defineGetter__('isFocused', IsFocused); this.__defineGetter__('isKeyCaptureEnabled', IsKeyCaptureEnabled); this.__defineGetter__('rtl', GetRightToLeft); this.__defineGetter__('suggestion', GetSuggestionToPrefetch); this.__defineGetter__('value', GetQuery); Object.defineProperty(this, 'requestParams', { get: GetSearchRequestParams }); this.focus = function() { Focus(); }; // This method is restricted to chrome-search://most-visited pages by // checking the invoking context's origin in searchbox_extension.cc. this.getMostVisitedItemData = function(restrictedId) { var item = GetMostVisitedItemData(restrictedId); if (item) { var sizeInPx = Math.floor(48 * window.devicePixelRatio + 0.5); // Populate large icon and fallback icon data, if they exist. We'll // render everything here, once these become available by default. if (item.largeIconUrl) { item.largeIconUrl += sizeInPx + "/" + item.renderViewId + "/" + item.rid; } if (item.fallbackIconUrl) { item.fallbackIconUrl += sizeInPx + ",,,,/" + item.renderViewId + "/" + item.rid; } } return item; }; this.paste = function(value) { Paste(value); }; this.startCapturingKeyStrokes = function() { StartCapturingKeyStrokes(); }; this.stopCapturingKeyStrokes = function() { StopCapturingKeyStrokes(); }; this.onfocuschange = null; this.onkeycapturechange = null; this.onsubmit = null; this.onsuggestionchange = null; }; this.newTabPage = new function() { // ======================================================================= // Private functions // ======================================================================= native function CheckIsUserSignedInToChromeAs(); native function CheckIsUserSyncingHistory(); native function DeleteMostVisitedItem(); native function GetMostVisitedItems(); native function GetThemeBackgroundInfo(); native function IsInputInProgress(); native function LogEvent(); native function LogMostVisitedImpression(); native function LogMostVisitedNavigation(); native function UndoAllMostVisitedDeletions(); native function UndoMostVisitedDeletion(); function GetMostVisitedItemsWrapper() { var mostVisitedItems = GetMostVisitedItems(); for (var i = 0, item; item = mostVisitedItems[i]; ++i) { item.faviconUrl = GenerateFaviconURL(item.renderViewId, item.rid); // These properties are private data and should not be returned to // the page. They are only accessible via getMostVisitedItemData(). delete item.url; delete item.title; delete item.domain; delete item.direction; delete item.renderViewId; delete item.largeIconUrl; delete item.fallbackIconUrl; } return mostVisitedItems; } function GenerateFaviconURL(renderViewId, rid) { return "chrome-search://favicon/size/16@" + window.devicePixelRatio + "x/" + renderViewId + "/" + rid; } // ======================================================================= // Exported functions // ======================================================================= this.__defineGetter__('isInputInProgress', IsInputInProgress); this.__defineGetter__('mostVisited', GetMostVisitedItemsWrapper); this.__defineGetter__('themeBackgroundInfo', GetThemeBackgroundInfo); this.deleteMostVisitedItem = function(restrictedId) { DeleteMostVisitedItem(restrictedId); }; this.checkIsUserSignedIntoChromeAs = function(identity) { CheckIsUserSignedInToChromeAs(identity); }; this.checkIsUserSyncingHistory = function() { CheckIsUserSyncingHistory(); }; // This method is restricted to chrome-search://most-visited pages by // checking the invoking context's origin in searchbox_extension.cc. this.logEvent = function(histogram_name) { LogEvent(histogram_name); }; // This method is restricted to chrome-search://most-visited pages by // checking the invoking context's origin in searchbox_extension.cc. this.logMostVisitedImpression = function(position, provider) { LogMostVisitedImpression(position, provider); }; // This method is restricted to chrome-search://most-visited pages by // checking the invoking context's origin in searchbox_extension.cc. this.logMostVisitedNavigation = function(position, provider) { LogMostVisitedNavigation(position, provider); }; this.undoAllMostVisitedDeletions = function() { UndoAllMostVisitedDeletions(); }; this.undoMostVisitedDeletion = function(restrictedId) { UndoMostVisitedDeletion(restrictedId); }; this.onsignedincheckdone = null; this.onhistorysynccheckdone = null; this.oninputcancel = null; this.oninputstart = null; this.onmostvisitedchange = null; this.onthemechange = null; }; // TODO(jered): Remove when google no longer expects this object. chrome.searchBox = this.searchBox; }; } // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the app API. var GetAvailability = requireNative('v8_context').GetAvailability; if (!GetAvailability('app').is_available) { exports.$set('binding', {}); exports.$set('onInstallStateResponse', function(){}); return; } var appNatives = requireNative('app'); var process = requireNative('process'); var extensionId = process.GetExtensionId(); var logActivity = requireNative('activityLogger'); function wrapForLogging(fun) { if (!extensionId) return fun; // nothing interesting to log without an extension return function() { // TODO(ataly): We need to make sure we use the right prototype for // fun.apply. Array slice can either be rewritten or similarly defined. logActivity.LogAPICall(extensionId, "app." + fun.name, $Array.slice(arguments)); return $Function.apply(fun, this, arguments); }; } // This becomes chrome.app var app = { getIsInstalled: wrapForLogging(appNatives.GetIsInstalled), getDetails: wrapForLogging(appNatives.GetDetails), runningState: wrapForLogging(appNatives.GetRunningState) }; // Tricky; "getIsInstalled" is actually exposed as the getter "isInstalled", // but we don't have a way to express this in the schema JSON (nor is it // worth it for this one special case). // // So, define it manually, and let the getIsInstalled function act as its // documentation. app.__defineGetter__('isInstalled', wrapForLogging(appNatives.GetIsInstalled)); // Called by app_bindings.cc. function onInstallStateResponse(state, callbackId) { var callback = callbacks[callbackId]; delete callbacks[callbackId]; if (typeof(callback) == 'function') { try { callback(state); } catch (e) { console.error('Exception in chrome.app.installState response handler: ' + e.stack); } } } // TODO(kalman): move this stuff to its own custom bindings. var callbacks = {}; var nextCallbackId = 1; app.installState = function getInstallState(callback) { var callbackId = nextCallbackId++; callbacks[callbackId] = callback; appNatives.GetInstallState(callbackId); }; if (extensionId) app.installState = wrapForLogging(app.installState); exports.$set('binding', app); exports.$set('onInstallStateResponse', onInstallStateResponse); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom bindings for the automation API. var AutomationNode = require('automationNode').AutomationNode; var AutomationRootNode = require('automationNode').AutomationRootNode; var automation = require('binding').Binding.create('automation'); var automationInternal = require('binding').Binding.create('automationInternal').generate(); var eventBindings = require('event_bindings'); var Event = eventBindings.Event; var exceptionHandler = require('uncaught_exception_handler'); var forEach = require('utils').forEach; var lastError = require('lastError'); var logging = requireNative('logging'); var nativeAutomationInternal = requireNative('automationInternal'); var GetRoutingID = nativeAutomationInternal.GetRoutingID; var GetSchemaAdditions = nativeAutomationInternal.GetSchemaAdditions; var DestroyAccessibilityTree = nativeAutomationInternal.DestroyAccessibilityTree; var GetIntAttribute = nativeAutomationInternal.GetIntAttribute; var StartCachingAccessibilityTrees = nativeAutomationInternal.StartCachingAccessibilityTrees; var AddTreeChangeObserver = nativeAutomationInternal.AddTreeChangeObserver; var RemoveTreeChangeObserver = nativeAutomationInternal.RemoveTreeChangeObserver; var GetFocus = nativeAutomationInternal.GetFocus; var schema = GetSchemaAdditions(); /** * A namespace to export utility functions to other files in automation. */ window.automationUtil = function() {}; // TODO(aboxhall): Look into using WeakMap var idToCallback = {}; var DESKTOP_TREE_ID = 0; automationUtil.storeTreeCallback = function(id, callback) { if (!callback) return; var targetTree = AutomationRootNode.get(id); if (!targetTree) { // If we haven't cached the tree, hold the callback until the tree is // populated by the initial onAccessibilityEvent call. if (id in idToCallback) idToCallback[id].push(callback); else idToCallback[id] = [callback]; } else { callback(targetTree); } }; /** * Global list of tree change observers. * @type {Object} */ automationUtil.treeChangeObserverMap = {}; /** * The id of the next tree change observer. * @type {number} */ automationUtil.nextTreeChangeObserverId = 1; /** * @type {AutomationNode} The current focused node. This is only updated * when calling automationUtil.updateFocusedNode. */ automationUtil.focusedNode = null; /** * Update automationUtil.focusedNode to be the node that currently has focus. */ automationUtil.updateFocusedNode = function() { automationUtil.focusedNode = null; var focusedNodeInfo = GetFocus(DESKTOP_TREE_ID); if (!focusedNodeInfo) return; var tree = AutomationRootNode.getOrCreate(focusedNodeInfo.treeId); if (tree) { automationUtil.focusedNode = privates(tree).impl.get(focusedNodeInfo.nodeId); } }; automation.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; // TODO(aboxhall, dtseng): Make this return the speced AutomationRootNode obj. apiFunctions.setHandleRequest('getTree', function getTree(tabID, callback) { var routingID = GetRoutingID(); StartCachingAccessibilityTrees(); // enableTab() ensures the renderer for the active or specified tab has // accessibility enabled, and fetches its ax tree id to use as // a key in the idToAutomationRootNode map. The callback to // enableTab is bound to the callback passed in to getTree(), so that once // the tree is available (either due to having been cached earlier, or after // an accessibility event occurs which causes the tree to be populated), the // callback can be called. var params = { routingID: routingID, tabID: tabID }; automationInternal.enableTab(params, function onEnable(id) { if (lastError.hasError(chrome)) { callback(); return; } automationUtil.storeTreeCallback(id, callback); }); }); var desktopTree = null; apiFunctions.setHandleRequest('getDesktop', function(callback) { StartCachingAccessibilityTrees(); desktopTree = AutomationRootNode.get(DESKTOP_TREE_ID); if (!desktopTree) { if (DESKTOP_TREE_ID in idToCallback) idToCallback[DESKTOP_TREE_ID].push(callback); else idToCallback[DESKTOP_TREE_ID] = [callback]; var routingID = GetRoutingID(); // TODO(dtseng): Disable desktop tree once desktop object goes out of // scope. automationInternal.enableDesktop(routingID, function() { if (lastError.hasError(chrome)) { AutomationRootNode.destroy(DESKTOP_TREE_ID); callback(); return; } }); } else { callback(desktopTree); } }); apiFunctions.setHandleRequest('getFocus', function(callback) { automationUtil.updateFocusedNode(); callback(automationUtil.focusedNode); }); function removeTreeChangeObserver(observer) { for (var id in automationUtil.treeChangeObserverMap) { if (automationUtil.treeChangeObserverMap[id] == observer) { RemoveTreeChangeObserver(id); delete automationUtil.treeChangeObserverMap[id]; return; } } } apiFunctions.setHandleRequest('removeTreeChangeObserver', function(observer) { removeTreeChangeObserver(observer); }); function addTreeChangeObserver(filter, observer) { removeTreeChangeObserver(observer); var id = automationUtil.nextTreeChangeObserverId++; AddTreeChangeObserver(id, filter); automationUtil.treeChangeObserverMap[id] = observer; } apiFunctions.setHandleRequest('addTreeChangeObserver', function(filter, observer) { addTreeChangeObserver(filter, observer); }); apiFunctions.setHandleRequest('setDocumentSelection', function(params) { var anchorNodeImpl = privates(params.anchorObject).impl; var focusNodeImpl = privates(params.focusObject).impl; if (anchorNodeImpl.treeID !== focusNodeImpl.treeID) throw new Error('Selection anchor and focus must be in the same tree.'); if (anchorNodeImpl.treeID === DESKTOP_TREE_ID) { throw new Error('Use AutomationNode.setSelection to set the selection ' + 'in the desktop tree.'); } automationInternal.performAction({ treeID: anchorNodeImpl.treeID, automationNodeID: anchorNodeImpl.id, actionType: 'setSelection'}, { focusNodeID: focusNodeImpl.id, anchorOffset: params.anchorOffset, focusOffset: params.focusOffset }); }); }); automationInternal.onChildTreeID.addListener(function(treeID, nodeID) { var tree = AutomationRootNode.getOrCreate(treeID); if (!tree) return; var node = privates(tree).impl.get(nodeID); if (!node) return; // A WebView in the desktop tree has a different AX tree as its child. // When we encounter a WebView with a child AX tree id that we don't // currently have cached, explicitly request that AX tree from the // browser process and set up a callback when it loads to attach that // tree as a child of this node and fire appropriate events. var childTreeID = GetIntAttribute(treeID, nodeID, 'childTreeId'); if (!childTreeID) return; var subroot = AutomationRootNode.get(childTreeID); if (!subroot) { automationUtil.storeTreeCallback(childTreeID, function(root) { // Return early if the root has already been attached. if (root.parent) return; privates(root).impl.setHostNode(node); if (root.docLoaded) privates(root).impl.dispatchEvent(schema.EventType.loadComplete); privates(node).impl.dispatchEvent(schema.EventType.childrenChanged); }); automationInternal.enableFrame(childTreeID); } else { privates(subroot).impl.setHostNode(node); } }); automationInternal.onTreeChange.addListener(function(observerID, treeID, nodeID, changeType) { var tree = AutomationRootNode.getOrCreate(treeID); if (!tree) return; var node = privates(tree).impl.get(nodeID); if (!node) return; var observer = automationUtil.treeChangeObserverMap[observerID]; if (!observer) return; try { observer({target: node, type: changeType}); } catch (e) { exceptionHandler.handle('Error in tree change observer for ' + treeChange.type, e); } }); automationInternal.onNodesRemoved.addListener(function(treeID, nodeIDs) { var tree = AutomationRootNode.getOrCreate(treeID); if (!tree) return; for (var i = 0; i < nodeIDs.length; i++) { privates(tree).impl.remove(nodeIDs[i]); } }); /** * Dispatch accessibility events fired on individual nodes to its * corresponding AutomationNode. Handle focus events specially * (see below). */ automationInternal.onAccessibilityEvent.addListener(function(eventParams) { var id = eventParams.treeID; var targetTree = AutomationRootNode.getOrCreate(id); // When we get a focus event, ignore the actual event target, and instead // check what node has focus globally. If that represents a focus change, // fire a focus event on the correct target. if (eventParams.eventType == schema.EventType.focus) { var previousFocusedNode = automationUtil.focusedNode; automationUtil.updateFocusedNode(); if (automationUtil.focusedNode && automationUtil.focusedNode == previousFocusedNode) { return; } if (automationUtil.focusedNode) { targetTree = automationUtil.focusedNode.root; eventParams.treeID = privates(targetTree).impl.treeID; eventParams.targetID = privates(automationUtil.focusedNode).impl.id; } } if (!privates(targetTree).impl.onAccessibilityEvent(eventParams)) return; // If we're not waiting on a callback to getTree(), we can early out here. if (!(id in idToCallback)) return; // We usually get a 'placeholder' tree first, which doesn't have any url // attribute or child nodes. If we've got that, wait for the full tree before // calling the callback. // TODO(dmazzoni): Don't send down placeholder (crbug.com/397553) if (id != DESKTOP_TREE_ID && !targetTree.url && targetTree.children.length == 0) return; // If the tree wasn't available when getTree() was called, the callback will // have been cached in idToCallback, so call and delete it now that we // have the complete tree. for (var i = 0; i < idToCallback[id].length; i++) { var callback = idToCallback[id][i]; callback(targetTree); } delete idToCallback[id]; }); automationInternal.onAccessibilityTreeDestroyed.addListener(function(id) { // Destroy the AutomationRootNode. var targetTree = AutomationRootNode.get(id); if (targetTree) { privates(targetTree).impl.destroy(); AutomationRootNode.destroy(id); } else { logging.WARNING('no targetTree to destroy'); } // Destroy the native cache of the accessibility tree. DestroyAccessibilityTree(id); }); var binding = automation.generate(); // Add additional accessibility bindings not specified in the automation IDL. // Accessibility and automation share some APIs (see // ui/accessibility/ax_enums.idl). forEach(schema, function(k, v) { binding[k] = v; }); exports.$set('binding', binding); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var utils = require('utils'); function AutomationEventImpl(type, target) { this.propagationStopped = false; // TODO(aboxhall): make these read-only properties this.type = type; this.target = target; this.eventPhase = Event.NONE; } AutomationEventImpl.prototype = { __proto__: null, stopPropagation: function() { this.propagationStopped = true; }, }; function AutomationEvent() { privates(AutomationEvent).constructPrivate(this, arguments); } utils.expose(AutomationEvent, AutomationEventImpl, { functions: [ 'stopPropagation', ], readonly: [ 'type', 'target', 'eventPhase', ], }); exports.$set('AutomationEvent', AutomationEvent); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var AutomationEvent = require('automationEvent').AutomationEvent; var automationInternal = require('binding').Binding.create('automationInternal').generate(); var exceptionHandler = require('uncaught_exception_handler'); var IsInteractPermitted = requireNative('automationInternal').IsInteractPermitted; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?number} The id of the root node. */ var GetRootID = requireNative('automationInternal').GetRootID; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?string} The title of the document. */ var GetDocTitle = requireNative('automationInternal').GetDocTitle; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?string} The url of the document. */ var GetDocURL = requireNative('automationInternal').GetDocURL; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?boolean} True if the document has finished loading. */ var GetDocLoaded = requireNative('automationInternal').GetDocLoaded; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?number} The loading progress, from 0.0 to 1.0 (fully loaded). */ var GetDocLoadingProgress = requireNative('automationInternal').GetDocLoadingProgress; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?number} The ID of the selection anchor object. */ var GetAnchorObjectID = requireNative('automationInternal').GetAnchorObjectID; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?number} The selection anchor offset. */ var GetAnchorOffset = requireNative('automationInternal').GetAnchorOffset; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?number} The ID of the selection focus object. */ var GetFocusObjectID = requireNative('automationInternal').GetFocusObjectID; /** * @param {number} axTreeID The id of the accessibility tree. * @return {?number} The selection focus offset. */ var GetFocusOffset = requireNative('automationInternal').GetFocusOffset; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {?number} The id of the node's parent, or undefined if it's the * root of its tree or if the tree or node wasn't found. */ var GetParentID = requireNative('automationInternal').GetParentID; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {?number} The number of children of the node, or undefined if * the tree or node wasn't found. */ var GetChildCount = requireNative('automationInternal').GetChildCount; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @param {number} childIndex An index of a child of this node. * @return {?number} The id of the child at the given index, or undefined * if the tree or node or child at that index wasn't found. */ var GetChildIDAtIndex = requireNative('automationInternal').GetChildIDAtIndex; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {?number} The ids of the children of the node, or undefined * if the tree or node wasn't found. */ var GetChildIds = requireNative('automationInternal').GetChildIDs; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {?Object} An object mapping html attributes to values. */ var GetHtmlAttributes = requireNative('automationInternal').GetHtmlAttributes; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {?number} The index of this node in its parent, or undefined if * the tree or node or node parent wasn't found. */ var GetIndexInParent = requireNative('automationInternal').GetIndexInParent; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {?Object} An object with a string key for every state flag set, * or undefined if the tree or node or node parent wasn't found. */ var GetState = requireNative('automationInternal').GetState; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {string} The role of the node, or undefined if the tree or * node wasn't found. */ var GetRole = requireNative('automationInternal').GetRole; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @return {?automation.Rect} The location of the node, or undefined if * the tree or node wasn't found. */ var GetLocation = requireNative('automationInternal').GetLocation; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @param {number} startIndex The start index of the range. * @param {number} endIndex The end index of the range. * @return {?automation.Rect} The bounding box of the subrange of this node, * or the location if there are no subranges, or undefined if * the tree or node wasn't found. */ var GetBoundsForRange = requireNative('automationInternal').GetBoundsForRange; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @param {string} attr The name of a string attribute. * @return {?string} The value of this attribute, or undefined if the tree, * node, or attribute wasn't found. */ var GetStringAttribute = requireNative('automationInternal').GetStringAttribute; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @param {string} attr The name of an attribute. * @return {?boolean} The value of this attribute, or undefined if the tree, * node, or attribute wasn't found. */ var GetBoolAttribute = requireNative('automationInternal').GetBoolAttribute; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @param {string} attr The name of an attribute. * @return {?number} The value of this attribute, or undefined if the tree, * node, or attribute wasn't found. */ var GetIntAttribute = requireNative('automationInternal').GetIntAttribute; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @param {string} attr The name of an attribute. * @return {?number} The value of this attribute, or undefined if the tree, * node, or attribute wasn't found. */ var GetFloatAttribute = requireNative('automationInternal').GetFloatAttribute; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @param {string} attr The name of an attribute. * @return {?Array.} The value of this attribute, or undefined * if the tree, node, or attribute wasn't found. */ var GetIntListAttribute = requireNative('automationInternal').GetIntListAttribute; /** * @param {number} axTreeID The id of the accessibility tree. * @param {number} nodeID The id of a node. * @param {string} attr The name of an HTML attribute. * @return {?string} The value of this attribute, or undefined if the tree, * node, or attribute wasn't found. */ var GetHtmlAttribute = requireNative('automationInternal').GetHtmlAttribute; var lastError = require('lastError'); var logging = requireNative('logging'); var schema = requireNative('automationInternal').GetSchemaAdditions(); var utils = require('utils'); /** * A single node in the Automation tree. * @param {AutomationRootNodeImpl} root The root of the tree. * @constructor */ function AutomationNodeImpl(root) { this.rootImpl = root; this.hostNode_ = null; this.listeners = {__proto__: null}; } AutomationNodeImpl.prototype = { __proto__: null, treeID: -1, id: -1, isRootNode: false, detach: function() { this.rootImpl = null; this.hostNode_ = null; this.listeners = {__proto__: null}; }, get root() { return this.rootImpl && this.rootImpl.wrapper; }, get parent() { if (!this.rootImpl) return undefined; if (this.hostNode_) return this.hostNode_; var parentID = GetParentID(this.treeID, this.id); return this.rootImpl.get(parentID); }, get htmlAttributes() { return GetHtmlAttributes(this.treeID, this.id) || {}; }, get state() { return GetState(this.treeID, this.id) || {}; }, get role() { return GetRole(this.treeID, this.id); }, get location() { return GetLocation(this.treeID, this.id); }, boundsForRange: function(startIndex, endIndex) { return GetBoundsForRange(this.treeID, this.id, startIndex, endIndex); }, get indexInParent() { return GetIndexInParent(this.treeID, this.id); }, get childTree() { var childTreeID = GetIntAttribute(this.treeID, this.id, 'childTreeId'); if (childTreeID) return AutomationRootNodeImpl.get(childTreeID); }, get firstChild() { if (!this.rootImpl) return undefined; if (this.childTree) return this.childTree; if (!GetChildCount(this.treeID, this.id)) return undefined; var firstChildID = GetChildIDAtIndex(this.treeID, this.id, 0); return this.rootImpl.get(firstChildID); }, get lastChild() { if (!this.rootImpl) return undefined; if (this.childTree) return this.childTree; var count = GetChildCount(this.treeID, this.id); if (!count) return undefined; var lastChildID = GetChildIDAtIndex(this.treeID, this.id, count - 1); return this.rootImpl.get(lastChildID); }, get children() { if (!this.rootImpl) return []; if (this.childTree) return [this.childTree]; var children = []; var childIds = GetChildIds(this.treeID, this.id); for (var i = 0; i < childIds.length; ++i) { var childID = childIds[i]; var child = this.rootImpl.get(childID); $Array.push(children, child); } return children; }, get previousSibling() { var parent = this.parent; if (!parent) return undefined; parent = privates(parent).impl; var indexInParent = GetIndexInParent(this.treeID, this.id); return this.rootImpl.get( GetChildIDAtIndex(parent.treeID, parent.id, indexInParent - 1)); }, get nextSibling() { var parent = this.parent; if (!parent) return undefined; parent = privates(parent).impl; var indexInParent = GetIndexInParent(this.treeID, this.id); return this.rootImpl.get( GetChildIDAtIndex(parent.treeID, parent.id, indexInParent + 1)); }, doDefault: function() { this.performAction_('doDefault'); }, focus: function() { this.performAction_('focus'); }, makeVisible: function() { this.performAction_('makeVisible'); }, setSelection: function(startIndex, endIndex) { if (this.role == 'textField' || this.role == 'textBox') { this.performAction_('setSelection', { focusNodeID: this.id, anchorOffset: startIndex, focusOffset: endIndex }); } }, showContextMenu: function() { this.performAction_('showContextMenu'); }, domQuerySelector: function(selector, callback) { if (!this.rootImpl) callback(); automationInternal.querySelector( { treeID: this.rootImpl.treeID, automationNodeID: this.id, selector: selector }, $Function.bind(this.domQuerySelectorCallback_, this, callback)); }, find: function(params) { return this.findInternal_(params); }, findAll: function(params) { return this.findInternal_(params, []); }, matches: function(params) { return this.matchInternal_(params); }, addEventListener: function(eventType, callback, capture) { this.removeEventListener(eventType, callback); if (!this.listeners[eventType]) this.listeners[eventType] = []; $Array.push(this.listeners[eventType], { __proto__: null, callback: callback, capture: !!capture, }); }, // TODO(dtseng/aboxhall): Check this impl against spec. removeEventListener: function(eventType, callback) { if (this.listeners[eventType]) { var listeners = this.listeners[eventType]; for (var i = 0; i < listeners.length; i++) { if (callback === listeners[i].callback) $Array.splice(listeners, i, 1); } } }, toJSON: function() { return { treeID: this.treeID, id: this.id, role: this.role, attributes: this.attributes }; }, dispatchEvent: function(eventType) { var path = []; var parent = this.parent; while (parent) { $Array.push(path, parent); parent = parent.parent; } var event = new AutomationEvent(eventType, this.wrapper); // Dispatch the event through the propagation path in three phases: // - capturing: starting from the root and going down to the target's parent // - targeting: dispatching the event on the target itself // - bubbling: starting from the target's parent, going back up to the root. // At any stage, a listener may call stopPropagation() on the event, which // will immediately stop event propagation through this path. if (this.dispatchEventAtCapturing_(event, path)) { if (this.dispatchEventAtTargeting_(event, path)) this.dispatchEventAtBubbling_(event, path); } }, toString: function() { var parentID = GetParentID(this.treeID, this.id); var childTreeID = GetIntAttribute(this.treeID, this.id, 'childTreeId'); var count = GetChildCount(this.treeID, this.id); var childIDs = []; for (var i = 0; i < count; ++i) { var childID = GetChildIDAtIndex(this.treeID, this.id, i); $Array.push(childIDs, childID); } var result = 'node id=' + this.id + ' role=' + this.role + ' state=' + $JSON.stringify(this.state) + ' parentID=' + parentID + ' childIds=' + $JSON.stringify(childIDs); if (this.hostNode_) { var hostNodeImpl = privates(this.hostNode_).impl; result += ' host treeID=' + hostNodeImpl.treeID + ' host nodeID=' + hostNodeImpl.id; } if (childTreeID) result += ' childTreeID=' + childTreeID; return result; }, dispatchEventAtCapturing_: function(event, path) { privates(event).impl.eventPhase = Event.CAPTURING_PHASE; for (var i = path.length - 1; i >= 0; i--) { this.fireEventListeners_(path[i], event); if (privates(event).impl.propagationStopped) return false; } return true; }, dispatchEventAtTargeting_: function(event) { privates(event).impl.eventPhase = Event.AT_TARGET; this.fireEventListeners_(this.wrapper, event); return !privates(event).impl.propagationStopped; }, dispatchEventAtBubbling_: function(event, path) { privates(event).impl.eventPhase = Event.BUBBLING_PHASE; for (var i = 0; i < path.length; i++) { this.fireEventListeners_(path[i], event); if (privates(event).impl.propagationStopped) return false; } return true; }, fireEventListeners_: function(node, event) { var nodeImpl = privates(node).impl; if (!nodeImpl.rootImpl) return; var listeners = nodeImpl.listeners[event.type]; if (!listeners) return; var eventPhase = event.eventPhase; for (var i = 0; i < listeners.length; i++) { if (eventPhase == Event.CAPTURING_PHASE && !listeners[i].capture) continue; if (eventPhase == Event.BUBBLING_PHASE && listeners[i].capture) continue; try { listeners[i].callback(event); } catch (e) { exceptionHandler.handle('Error in event handler for ' + event.type + ' during phase ' + eventPhase, e); } } }, performAction_: function(actionType, opt_args) { if (!this.rootImpl) return; // Not yet initialized. if (this.rootImpl.treeID === undefined || this.id === undefined) { return; } // Check permissions. if (!IsInteractPermitted()) { throw new Error(actionType + ' requires {"desktop": true} or' + ' {"interact": true} in the "automation" manifest key.'); } automationInternal.performAction({ treeID: this.rootImpl.treeID, automationNodeID: this.id, actionType: actionType }, opt_args || {}); }, domQuerySelectorCallback_: function(userCallback, resultAutomationNodeID) { // resultAutomationNodeID could be zero or undefined or (unlikely) null; // they all amount to the same thing here, which is that no node was // returned. if (!resultAutomationNodeID || !this.rootImpl) { userCallback(null); return; } var resultNode = this.rootImpl.get(resultAutomationNodeID); if (!resultNode) { logging.WARNING('Query selector result not in tree: ' + resultAutomationNodeID); userCallback(null); } userCallback(resultNode); }, findInternal_: function(params, opt_results) { var result = null; this.forAllDescendants_(function(node) { if (privates(node).impl.matchInternal_(params)) { if (opt_results) $Array.push(opt_results, node); else result = node; return !opt_results; } }); if (opt_results) return opt_results; return result; }, /** * Executes a closure for all of this node's descendants, in pre-order. * Early-outs if the closure returns true. * @param {Function(AutomationNode):boolean} closure Closure to be executed * for each node. Return true to early-out the traversal. */ forAllDescendants_: function(closure) { var stack = $Array.reverse(this.wrapper.children); while (stack.length > 0) { var node = $Array.pop(stack); if (closure(node)) return; var children = node.children; for (var i = children.length - 1; i >= 0; i--) $Array.push(stack, children[i]); } }, matchInternal_: function(params) { if ($Object.keys(params).length === 0) return false; if ('role' in params && this.role != params.role) return false; if ('state' in params) { for (var state in params.state) { if (params.state[state] != (state in this.state)) return false; } } if ('attributes' in params) { for (var attribute in params.attributes) { var attrValue = params.attributes[attribute]; if (typeof attrValue != 'object') { if (this[attribute] !== attrValue) return false; } else if (attrValue instanceof $RegExp.self) { if (typeof this[attribute] != 'string') return false; if (!attrValue.test(this[attribute])) return false; } else { // TODO(aboxhall): handle intlist case. return false; } } } return true; } }; var stringAttributes = [ 'accessKey', 'action', 'ariaInvalidValue', 'autoComplete', 'containerLiveRelevant', 'containerLiveStatus', 'description', 'display', 'dropeffect', 'help', 'htmlTag', 'language', 'liveRelevant', 'liveStatus', 'name', 'placeholder', 'shortcut', 'textInputType', 'url', 'value']; var boolAttributes = [ 'ariaReadonly', 'buttonMixed', 'canSetValue', 'canvasHasFallback', 'containerLiveAtomic', 'containerLiveBusy', 'grabbed', 'isAxTreeHost', 'liveAtomic', 'liveBusy', 'updateLocationOnly']; var intAttributes = [ 'backgroundColor', 'color', 'colorValue', 'descriptionFrom', 'hierarchicalLevel', 'invalidState', 'nameFrom', 'posInSet', 'scrollX', 'scrollXMax', 'scrollXMin', 'scrollY', 'scrollYMax', 'scrollYMin', 'setSize', 'sortDirection', 'tableCellColumnIndex', 'tableCellColumnSpan', 'tableCellRowIndex', 'tableCellRowSpan', 'tableColumnCount', 'tableColumnIndex', 'tableRowCount', 'tableRowIndex', 'textDirection', 'textSelEnd', 'textSelStart', 'textStyle']; var nodeRefAttributes = [ ['activedescendantId', 'activeDescendant'], ['tableColumnHeaderId', 'tableColumnHeader'], ['tableHeaderId', 'tableHeader'], ['tableRowHeaderId', 'tableRowHeader'], ['titleUiElement', 'titleUIElement']]; var intListAttributes = [ 'characterOffsets', 'lineBreaks', 'markerEnds', 'markerStarts', 'markerTypes', 'wordEnds', 'wordStarts']; var nodeRefListAttributes = [ ['cellIds', 'cells'], ['controlsIds', 'controls'], ['describedbyIds', 'describedBy'], ['flowtoIds', 'flowTo'], ['labelledbyIds', 'labelledBy'], ['uniqueCellIds', 'uniqueCells']]; var floatAttributes = [ 'valueForRange', 'minValueForRange', 'maxValueForRange', 'fontSize']; var htmlAttributes = [ ['type', 'inputType']]; var publicAttributes = []; $Array.forEach(stringAttributes, function(attributeName) { $Array.push(publicAttributes, attributeName); $Object.defineProperty(AutomationNodeImpl.prototype, attributeName, { __proto__: null, get: function() { return GetStringAttribute(this.treeID, this.id, attributeName); } }); }); $Array.forEach(boolAttributes, function(attributeName) { $Array.push(publicAttributes, attributeName); $Object.defineProperty(AutomationNodeImpl.prototype, attributeName, { __proto__: null, get: function() { return GetBoolAttribute(this.treeID, this.id, attributeName); } }); }); $Array.forEach(intAttributes, function(attributeName) { $Array.push(publicAttributes, attributeName); $Object.defineProperty(AutomationNodeImpl.prototype, attributeName, { __proto__: null, get: function() { return GetIntAttribute(this.treeID, this.id, attributeName); } }); }); $Array.forEach(nodeRefAttributes, function(params) { var srcAttributeName = params[0]; var dstAttributeName = params[1]; $Array.push(publicAttributes, dstAttributeName); $Object.defineProperty(AutomationNodeImpl.prototype, dstAttributeName, { __proto__: null, get: function() { var id = GetIntAttribute(this.treeID, this.id, srcAttributeName); if (id && this.rootImpl) return this.rootImpl.get(id); else return undefined; } }); }); $Array.forEach(intListAttributes, function(attributeName) { $Array.push(publicAttributes, attributeName); $Object.defineProperty(AutomationNodeImpl.prototype, attributeName, { __proto__: null, get: function() { return GetIntListAttribute(this.treeID, this.id, attributeName); } }); }); $Array.forEach(nodeRefListAttributes, function(params) { var srcAttributeName = params[0]; var dstAttributeName = params[1]; $Array.push(publicAttributes, dstAttributeName); $Object.defineProperty(AutomationNodeImpl.prototype, dstAttributeName, { __proto__: null, get: function() { var ids = GetIntListAttribute(this.treeID, this.id, srcAttributeName); if (!ids || !this.rootImpl) return undefined; var result = []; for (var i = 0; i < ids.length; ++i) { var node = this.rootImpl.get(ids[i]); if (node) $Array.push(result, node); } return result; } }); }); $Array.forEach(floatAttributes, function(attributeName) { $Array.push(publicAttributes, attributeName); $Object.defineProperty(AutomationNodeImpl.prototype, attributeName, { __proto__: null, get: function() { return GetFloatAttribute(this.treeID, this.id, attributeName); } }); }); $Array.forEach(htmlAttributes, function(params) { var srcAttributeName = params[0]; var dstAttributeName = params[1]; $Array.push(publicAttributes, dstAttributeName); $Object.defineProperty(AutomationNodeImpl.prototype, dstAttributeName, { __proto__: null, get: function() { return GetHtmlAttribute(this.treeID, this.id, srcAttributeName); } }); }); /** * AutomationRootNode. * * An AutomationRootNode is the javascript end of an AXTree living in the * browser. AutomationRootNode handles unserializing incremental updates from * the source AXTree. Each update contains node data that form a complete tree * after applying the update. * * A brief note about ids used through this class. The source AXTree assigns * unique ids per node and we use these ids to build a hash to the actual * AutomationNode object. * Thus, tree traversals amount to a lookup in our hash. * * The tree itself is identified by the accessibility tree id of the * renderer widget host. * @constructor */ function AutomationRootNodeImpl(treeID) { $Function.call(AutomationNodeImpl, this, this); this.treeID = treeID; this.axNodeDataCache_ = {__proto__: null}; } utils.defineProperty(AutomationRootNodeImpl, 'idToAutomationRootNode_', {__proto__: null}); utils.defineProperty(AutomationRootNodeImpl, 'get', function(treeID) { var result = AutomationRootNodeImpl.idToAutomationRootNode_[treeID]; return result || undefined; }); utils.defineProperty(AutomationRootNodeImpl, 'getOrCreate', function(treeID) { if (AutomationRootNodeImpl.idToAutomationRootNode_[treeID]) return AutomationRootNodeImpl.idToAutomationRootNode_[treeID]; var result = new AutomationRootNode(treeID); AutomationRootNodeImpl.idToAutomationRootNode_[treeID] = result; return result; }); utils.defineProperty(AutomationRootNodeImpl, 'destroy', function(treeID) { delete AutomationRootNodeImpl.idToAutomationRootNode_[treeID]; }); AutomationRootNodeImpl.prototype = { __proto__: AutomationNodeImpl.prototype, /** * @type {boolean} */ isRootNode: true, /** * @type {number} */ treeID: -1, /** * The parent of this node from a different tree. * @type {?AutomationNode} * @private */ hostNode_: null, /** * A map from id to AutomationNode. * @type {Object.} * @private */ axNodeDataCache_: null, get id() { var result = GetRootID(this.treeID); // Don't return undefined, because the id is often passed directly // as an argument to a native binding that expects only a valid number. if (result === undefined) return -1; return result; }, get docUrl() { return GetDocURL(this.treeID); }, get docTitle() { return GetDocTitle(this.treeID); }, get docLoaded() { return GetDocLoaded(this.treeID); }, get docLoadingProgress() { return GetDocLoadingProgress(this.treeID); }, get anchorObject() { var id = GetAnchorObjectID(this.treeID); if (id && id != -1) return this.get(id); else return undefined; }, get anchorOffset() { var id = GetAnchorObjectID(this.treeID); if (id && id != -1) return GetAnchorOffset(this.treeID); }, get focusObject() { var id = GetFocusObjectID(this.treeID); if (id && id != -1) return this.get(id); else return undefined; }, get focusOffset() { var id = GetFocusObjectID(this.treeID); if (id && id != -1) return GetFocusOffset(this.treeID); }, get: function(id) { if (id == undefined) return undefined; if (id == this.id) return this.wrapper; var obj = this.axNodeDataCache_[id]; if (obj) return obj; obj = new AutomationNode(this); privates(obj).impl.treeID = this.treeID; privates(obj).impl.id = id; this.axNodeDataCache_[id] = obj; return obj; }, remove: function(id) { if (this.axNodeDataCache_[id]) privates(this.axNodeDataCache_[id]).impl.detach(); delete this.axNodeDataCache_[id]; }, destroy: function() { this.dispatchEvent(schema.EventType.destroyed); for (var id in this.axNodeDataCache_) this.remove(id); this.detach(); }, setHostNode(hostNode) { this.hostNode_ = hostNode; }, onAccessibilityEvent: function(eventParams) { var targetNode = this.get(eventParams.targetID); if (targetNode) { var targetNodeImpl = privates(targetNode).impl; targetNodeImpl.dispatchEvent(eventParams.eventType); } else { logging.WARNING('Got ' + eventParams.eventType + ' event on unknown node: ' + eventParams.targetID + '; this: ' + this.id); } return true; }, toString: function() { function toStringInternal(nodeImpl, indent) { if (!nodeImpl) return ''; var output = ''; if (nodeImpl.isRootNode) output += indent + 'tree id=' + nodeImpl.treeID + '\n'; output += indent + $Function.call(AutomationNodeImpl.prototype.toString, nodeImpl) + '\n'; indent += ' '; var children = nodeImpl.children; for (var i = 0; i < children.length; ++i) output += toStringInternal(privates(children[i]).impl, indent); return output; } return toStringInternal(this, ''); }, }; function AutomationNode() { privates(AutomationNode).constructPrivate(this, arguments); } utils.expose(AutomationNode, AutomationNodeImpl, { functions: [ 'doDefault', 'find', 'findAll', 'focus', 'makeVisible', 'matches', 'setSelection', 'showContextMenu', 'addEventListener', 'removeEventListener', 'domQuerySelector', 'toString', 'boundsForRange', ], readonly: $Array.concat(publicAttributes, [ 'parent', 'firstChild', 'lastChild', 'children', 'previousSibling', 'nextSibling', 'isRootNode', 'role', 'state', 'location', 'indexInParent', 'root', 'htmlAttributes', ]), }); function AutomationRootNode() { privates(AutomationRootNode).constructPrivate(this, arguments); } utils.expose(AutomationRootNode, AutomationRootNodeImpl, { superclass: AutomationNode, readonly: [ 'docTitle', 'docUrl', 'docLoaded', 'docLoadingProgress', 'anchorObject', 'anchorOffset', 'focusObject', 'focusOffset', ], }); utils.defineProperty(AutomationRootNode, 'get', function(treeID) { return AutomationRootNodeImpl.get(treeID); }); utils.defineProperty(AutomationRootNode, 'getOrCreate', function(treeID) { return AutomationRootNodeImpl.getOrCreate(treeID); }); utils.defineProperty(AutomationRootNode, 'destroy', function(treeID) { AutomationRootNodeImpl.destroy(treeID); }); exports.$set('AutomationNode', AutomationNode); exports.$set('AutomationRootNode', AutomationRootNode); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the browserAction API. var binding = require('binding').Binding.create('browserAction'); var setIcon = require('setIcon').setIcon; var getExtensionViews = requireNative('runtime').GetExtensionViews; var sendRequest = require('sendRequest').sendRequest; var lastError = require('lastError'); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('setIcon', function(details, callback) { setIcon(details, function(args) { sendRequest(this.name, [args, callback], this.definition.parameters); }.bind(this)); }); apiFunctions.setCustomCallback('openPopup', function(name, request, callback, response) { if (!callback) return; if (lastError.hasError(chrome)) { callback(); } else { var views = getExtensionViews(-1, -1, 'POPUP'); callback(views.length > 0 ? views[0] : null); } }); }); exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Cast Streaming RtpStream API. var binding = require('binding').Binding.create('cast.streaming.rtpStream'); var natives = requireNative('cast_streaming_natives'); binding.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('destroy', function(transportId) { natives.DestroyCastRtpStream(transportId); }); apiFunctions.setHandleRequest('getSupportedParams', function(transportId) { return natives.GetSupportedParamsCastRtpStream(transportId); }); apiFunctions.setHandleRequest('start', function(transportId, params) { natives.StartCastRtpStream(transportId, params); }); apiFunctions.setHandleRequest('stop', function(transportId) { natives.StopCastRtpStream(transportId); }); apiFunctions.setHandleRequest('toggleLogging', function(transportId, enable) { natives.ToggleLogging(transportId, enable); }); apiFunctions.setHandleRequest('getRawEvents', function(transportId, extraData, callback) { natives.GetRawEvents(transportId, extraData, callback); }); apiFunctions.setHandleRequest('getStats', function(transportId, callback) { natives.GetStats(transportId, callback); }); }); exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Cast Streaming Session API. var binding = require('binding').Binding.create('cast.streaming.session'); var natives = requireNative('cast_streaming_natives'); binding.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('create', function(audioTrack, videoTrack, callback) { natives.CreateSession(audioTrack, videoTrack, callback); }); }); exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Cast Streaming UdpTransport API. var binding = require('binding').Binding.create('cast.streaming.udpTransport'); var natives = requireNative('cast_streaming_natives'); binding.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('destroy', function(transportId) { natives.DestroyCastUdpTransport(transportId); }); apiFunctions.setHandleRequest('setDestination', function(transportId, destination) { natives.SetDestinationCastUdpTransport(transportId, destination); }); apiFunctions.setHandleRequest('setOptions', function(transportId, options) { natives.SetOptionsCastUdpTransport(transportId, options); }); }); exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Cast Streaming Session API. var binding = require('binding').Binding.create( 'cast.streaming.receiverSession'); var natives = requireNative('cast_streaming_natives'); binding.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('createAndBind', function(ap, vp, local, weidgth, height, fr, url, cb, op) { natives.StartCastRtpReceiver( ap, vp, local, weidgth, height, fr, url, cb, op); }); }); exports.$set('binding', binding.generate()); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var binding = require('binding').Binding.create('certificateProvider'); var certificateProviderInternal = require('binding').Binding.create( 'certificateProviderInternal').generate(); var eventBindings = require('event_bindings'); var certificateProviderSchema = requireNative('schema_registry').GetSchema('certificateProvider') var utils = require('utils'); var validate = require('schemaUtils').validate; // Custom bindings for chrome.certificateProvider API. // The bindings are used to implement callbacks for the API events. Internally // each event is passed a requestId argument used to identify the callback // associated with the event. This argument is massaged out from the event // arguments before dispatching the event to consumers. A callback is appended // to the event arguments. The callback wraps an appropriate // chrome.certificateProviderInternal API function that is used to report the // event result from the extension. The function is passed the requestId and // values provided by the extension. It validates that the values provided by // the extension match chrome.certificateProvider event callback schemas. It // also ensures that a callback is run at most once. In case there is an // exception during event dispatching, the chrome.certificateProviderInternal // function is called with a default error value. // Handles a chrome.certificateProvider event as described in the file comment. // |eventName|: The event name. The first argument of the event must be a // request id. // |internalReportFunc|: The function that should be called to report results in // reply to an event. The first argument of the function must be the request // id that was received with the event. function handleEvent(eventName, internalReportFunc) { var eventSchema = utils.lookup(certificateProviderSchema.events, 'name', eventName); var callbackSchema = utils.lookup(eventSchema.parameters, 'type', 'function'); eventBindings.registerArgumentMassager( 'certificateProvider.' + eventName, function(args, dispatch) { var responded = false; // Function provided to the extension as the event callback argument. // The extension calls this to report results in reply to the event. // It throws an exception if called more than once and if the provided // results don't match the callback schema. var reportFunc = function(reportArg1, reportArg2) { if (responded) { throw new Error( 'Event callback must not be called more than once.'); } var reportArgs = [reportArg1]; if (reportArg2 !== undefined) reportArgs.push(reportArg2); var finalArgs = []; try { // Validates that the results reported by the extension matche the // callback schema of the event. Throws an exception in case of an // error. validate(reportArgs, callbackSchema.parameters); finalArgs = reportArgs; } finally { responded = true; internalReportFunc.apply( null, [args[0] /* requestId */].concat(finalArgs)); } }; dispatch(args.slice(1).concat(reportFunc)); }); } handleEvent('onCertificatesRequested', certificateProviderInternal.reportCertificates); handleEvent('onSignDigestRequested', certificateProviderInternal.reportSignature); exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var Event = require('event_bindings').Event; var sendRequest = require('sendRequest').sendRequest; var validate = require('schemaUtils').validate; function extendSchema(schema) { var extendedSchema = $Array.slice(schema); extendedSchema.unshift({'type': 'string'}); return extendedSchema; } function ChromeDirectSetting(prefKey, valueSchema, schema) { var getFunctionParameters = function(name) { var f = $Array.filter( schema.functions, function(f) { return f.name === name; })[0]; return f.parameters; }; this.get = function(details, callback) { var getSchema = getFunctionParameters('get'); validate([details, callback], getSchema); return sendRequest('types.private.ChromeDirectSetting.get', [prefKey, details, callback], extendSchema(getSchema)); }; this.set = function(details, callback) { var setSchema = $Array.slice(getFunctionParameters('set')); setSchema[0].properties.value = valueSchema; validate([details, callback], setSchema); return sendRequest('types.private.ChromeDirectSetting.set', [prefKey, details, callback], extendSchema(setSchema)); }; this.clear = function(details, callback) { var clearSchema = getFunctionParameters('clear'); validate([details, callback], clearSchema); return sendRequest('types.private.ChromeDirectSetting.clear', [prefKey, details, callback], extendSchema(clearSchema)); }; this.onChange = new Event('types.private.ChromeDirectSetting.' + prefKey + '.onChange'); }; exports.$set('ChromeDirectSetting', ChromeDirectSetting); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var Event = require('event_bindings').Event; var sendRequest = require('sendRequest').sendRequest; var validate = require('schemaUtils').validate; function extendSchema(schema) { var extendedSchema = $Array.slice(schema); $Array.unshift(extendedSchema, {'type': 'string'}); return extendedSchema; } // TODO(devlin): Maybe find a way to combine this and ContentSetting. function ChromeSetting(prefKey, valueSchema, schema) { var getFunctionParameters = function(name) { var f = $Array.filter( schema.functions, function(f) { return f.name === name; })[0]; return f.parameters; }; this.get = function(details, callback) { var getSchema = getFunctionParameters('get'); validate([details, callback], getSchema); return sendRequest('types.ChromeSetting.get', [prefKey, details, callback], extendSchema(getSchema)); }; this.set = function(details, callback) { // The set schema included in the Schema object is generic, since it varies // per-setting. However, this is only ever for a single setting, so we can // enforce the types more thoroughly. var rawSetSchema = getFunctionParameters('set'); var rawSettingParam = rawSetSchema[0]; var props = $Object.assign({}, rawSettingParam.properties); props.value = valueSchema; var modSettingParam = { name: rawSettingParam.name, type: rawSettingParam.type, properties: props, }; var modSetSchema = $Array.slice(rawSetSchema); modSetSchema[0] = modSettingParam; validate([details, callback], modSetSchema); return sendRequest('types.ChromeSetting.set', [prefKey, details, callback], extendSchema(modSetSchema)); }; this.clear = function(details, callback) { var clearSchema = getFunctionParameters('clear'); validate([details, callback], clearSchema); return sendRequest('types.ChromeSetting.clear', [prefKey, details, callback], extendSchema(clearSchema)); }; this.onChange = new Event('types.ChromeSetting.' + prefKey + '.onChange'); }; exports.$set('ChromeSetting', ChromeSetting); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var binding = require('binding').Binding.create('chromeWebViewInternal'); var contextMenusHandlers = require('contextMenusHandlers'); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var handlers = contextMenusHandlers.create(true /* isWebview */); apiFunctions.setHandleRequest('contextMenusCreate', handlers.requestHandlers.create); apiFunctions.setCustomCallback('contextMenusCreate', handlers.callbacks.create); apiFunctions.setCustomCallback('contextMenusUpdate', handlers.callbacks.update); apiFunctions.setCustomCallback('contextMenusRemove', handlers.callbacks.remove); apiFunctions.setCustomCallback('contextMenusRemoveAll', handlers.callbacks.removeAll); }); exports.$set('ChromeWebView', binding.generate()); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module implements chrome-specific API. // See web_view_api_methods.js for details. var ChromeWebView = require('chromeWebViewInternal').ChromeWebView; var ChromeWebViewSchema = requireNative('schema_registry').GetSchema('chromeWebViewInternal'); var CreateEvent = require('guestViewEvents').CreateEvent; var EventBindings = require('event_bindings'); var GuestViewInternalNatives = requireNative('guest_view_internal'); var idGeneratorNatives = requireNative('id_generator'); var utils = require('utils'); var WebViewImpl = require('webView').WebViewImpl; // This is the only "webViewInternal.onClicked" named event for this renderer. // // Since we need an event per , we define events with suffix // (subEventName) in each of the . Behind the scenes, this event is // registered as a ContextMenusEvent, with filter set to the webview's // |viewInstanceId|. Any time a ContextMenusEvent is dispatched, we re-dispatch // it to the subEvent's listeners. This way // .contextMenus.onClicked behave as a regular chrome Event type. var ContextMenusEvent = CreateEvent('chromeWebViewInternal.onClicked'); // See comment above. var ContextMenusHandlerEvent = CreateEvent('chromeWebViewInternal.onContextMenuShow'); // ----------------------------------------------------------------------------- // ContextMenusOnClickedEvent object. // This event is exposed as .contextMenus.onClicked. function ContextMenusOnClickedEvent(webViewInstanceId, opt_eventName, opt_argSchemas, opt_eventOptions) { var subEventName = GetUniqueSubEventName(opt_eventName); $Function.call(EventBindings.Event, this, subEventName, opt_argSchemas, opt_eventOptions, webViewInstanceId); var view = GuestViewInternalNatives.GetViewFromID(webViewInstanceId); if (!view) { return; } view.events.addScopedListener(ContextMenusEvent, function() { // Re-dispatch to subEvent's listeners. $Function.apply(this.dispatch, this, $Array.slice(arguments)); }.bind(this), {instanceId: webViewInstanceId}); } $Object.setPrototypeOf(ContextMenusOnClickedEvent.prototype, EventBindings.Event.prototype); // This event is exposed as .contextMenus.onShow. function ContextMenusOnContextMenuEvent(webViewInstanceId, opt_eventName, opt_argSchemas, opt_eventOptions) { var subEventName = GetUniqueSubEventName(opt_eventName); $Function.call(EventBindings.Event, this, subEventName, opt_argSchemas, opt_eventOptions, webViewInstanceId); var view = GuestViewInternalNatives.GetViewFromID(webViewInstanceId); if (!view) { return; } view.events.addScopedListener(ContextMenusHandlerEvent, function(e) { var defaultPrevented = false; var event = { 'preventDefault': function() { defaultPrevented = true; } }; // Re-dispatch to subEvent's listeners. $Function.apply(this.dispatch, this, [event]); if (!defaultPrevented) { // TODO(lazyboy): Remove |items| parameter completely from // ChromeWebView.showContextMenu as we don't do anything useful with it // currently. var items = []; var guestInstanceId = GuestViewInternalNatives. GetViewFromID(webViewInstanceId).guest.getId(); ChromeWebView.showContextMenu(guestInstanceId, e.requestId, items); } }.bind(this), {instanceId: webViewInstanceId}); } $Object.setPrototypeOf(ContextMenusOnContextMenuEvent.prototype, EventBindings.Event.prototype); // ----------------------------------------------------------------------------- // WebViewContextMenusImpl object. // An instance of this class is exposed as .contextMenus. function WebViewContextMenusImpl(viewInstanceId) { this.viewInstanceId_ = viewInstanceId; } $Object.setPrototypeOf(WebViewContextMenusImpl.prototype, null); WebViewContextMenusImpl.prototype.create = function() { var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments)); return $Function.apply(ChromeWebView.contextMenusCreate, null, args); }; WebViewContextMenusImpl.prototype.remove = function() { var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments)); return $Function.apply(ChromeWebView.contextMenusRemove, null, args); }; WebViewContextMenusImpl.prototype.removeAll = function() { var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments)); return $Function.apply(ChromeWebView.contextMenusRemoveAll, null, args); }; WebViewContextMenusImpl.prototype.update = function() { var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments)); return $Function.apply(ChromeWebView.contextMenusUpdate, null, args); }; function WebViewContextMenus() { privates(WebViewContextMenus).constructPrivate(this, arguments); } utils.expose(WebViewContextMenus, WebViewContextMenusImpl, { functions: [ 'create', 'remove', 'removeAll', 'update', ], }); // ----------------------------------------------------------------------------- WebViewImpl.prototype.maybeSetupContextMenus = function() { if (!this.contextMenusOnContextMenuEvent_) { var eventName = 'chromeWebViewInternal.onContextMenuShow'; var eventSchema = utils.lookup(ChromeWebViewSchema.events, 'name', 'onShow'); var eventOptions = {supportsListeners: true}; this.contextMenusOnContextMenuEvent_ = new ContextMenusOnContextMenuEvent( this.viewInstanceId, eventName, eventSchema, eventOptions); } var createContextMenus = function() { return this.weakWrapper(function() { if (this.contextMenus_) { return this.contextMenus_; } this.contextMenus_ = new WebViewContextMenus(this.viewInstanceId); // Define 'onClicked' event property on |this.contextMenus_|. var getOnClickedEvent = function() { return this.weakWrapper(function() { if (!this.contextMenusOnClickedEvent_) { var eventName = 'chromeWebViewInternal.onClicked'; var eventSchema = utils.lookup(ChromeWebViewSchema.events, 'name', 'onClicked'); var eventOptions = {supportsListeners: true}; var onClickedEvent = new ContextMenusOnClickedEvent( this.viewInstanceId, eventName, eventSchema, eventOptions); this.contextMenusOnClickedEvent_ = onClickedEvent; return onClickedEvent; } return this.contextMenusOnClickedEvent_; }); }.bind(this); $Object.defineProperty( this.contextMenus_, 'onClicked', {get: getOnClickedEvent(), enumerable: true}); $Object.defineProperty( this.contextMenus_, 'onShow', { get: this.weakWrapper(function() { return this.contextMenusOnContextMenuEvent_; }), enumerable: true }); return this.contextMenus_; }); }.bind(this); // Expose .contextMenus object. $Object.defineProperty( this.element, 'contextMenus', { get: createContextMenus(), enumerable: true }); }; function GetUniqueSubEventName(eventName) { return eventName + '/' + idGeneratorNatives.GetNextId(); } // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the contentSettings API. var sendRequest = require('sendRequest').sendRequest; var validate = require('schemaUtils').validate; function extendSchema(schema) { var extendedSchema = $Array.slice(schema); $Array.unshift(extendedSchema, {'type': 'string'}); return extendedSchema; } function ContentSetting(contentType, settingSchema, schema) { var getFunctionParameters = function(name) { var f = $Array.filter( schema.functions, function(f) { return f.name === name; })[0]; return f.parameters; }; this.get = function(details, callback) { var getSchema = getFunctionParameters('get'); validate([details, callback], getSchema); return sendRequest('contentSettings.get', [contentType, details, callback], extendSchema(getSchema)); }; this.set = function(details, callback) { // The set schema included in the Schema object is generic, since it varies // per-setting. However, this is only ever for a single setting, so we can // enforce the types more thoroughly. var rawSetSchema = getFunctionParameters('set'); var rawSettingParam = rawSetSchema[0]; var props = $Object.assign({}, rawSettingParam.properties); props.setting = settingSchema; var modSettingParam = { name: rawSettingParam.name, type: rawSettingParam.type, properties: props, }; var modSetSchema = $Array.slice(rawSetSchema); modSetSchema[0] = modSettingParam; validate([details, callback], rawSetSchema); return sendRequest('contentSettings.set', [contentType, details, callback], extendSchema(modSetSchema)); }; this.clear = function(details, callback) { var clearSchema = getFunctionParameters('clear'); validate([details, callback], clearSchema); return sendRequest('contentSettings.clear', [contentType, details, callback], extendSchema(clearSchema)); }; this.getResourceIdentifiers = function(callback) { var schema = getFunctionParameters('getResourceIdentifiers'); validate([callback], schema); return sendRequest( 'contentSettings.getResourceIdentifiers', [contentType, callback], extendSchema(schema)); }; } exports.$set('ContentSetting', ContentSetting); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the declarativeContent API. var binding = require('binding').Binding.create('declarativeContent'); var utils = require('utils'); var validate = require('schemaUtils').validate; var canonicalizeCompoundSelector = requireNative('css_natives').CanonicalizeCompoundSelector; var setIcon = require('setIcon').setIcon; binding.registerCustomHook( function(api) { var declarativeContent = api.compiledApi; // Returns the schema definition of type |typeId| defined in |namespace|. function getSchema(typeId) { return utils.lookup(api.schema.types, 'id', 'declarativeContent.' + typeId); } // Helper function for the constructor of concrete datatypes of the // declarative content API. // Makes sure that |this| contains the union of parameters and // {'instanceType': 'declarativeContent.' + typeId} and validates the // generated union dictionary against the schema for |typeId|. function setupInstance(instance, parameters, typeId) { for (var key in parameters) { if ($Object.hasOwnProperty(parameters, key)) { instance[key] = parameters[key]; } } instance.instanceType = 'declarativeContent.' + typeId; var schema = getSchema(typeId); validate([instance], [schema]); } function canonicalizeCssSelectors(selectors) { for (var i = 0; i < selectors.length; i++) { var canonicalizedSelector = canonicalizeCompoundSelector(selectors[i]); if (canonicalizedSelector == '') { throw new Error( 'Element of \'css\' array must be a ' + 'list of valid compound selectors: ' + selectors[i]); } selectors[i] = canonicalizedSelector; } } // Setup all data types for the declarative content API. declarativeContent.PageStateMatcher = function(parameters) { setupInstance(this, parameters, 'PageStateMatcher'); if ($Object.hasOwnProperty(this, 'css')) { canonicalizeCssSelectors(this.css); } }; declarativeContent.ShowPageAction = function(parameters) { setupInstance(this, parameters, 'ShowPageAction'); }; declarativeContent.RequestContentScript = function(parameters) { setupInstance(this, parameters, 'RequestContentScript'); }; // TODO(rockot): Do not expose this in M39 stable. Making this restriction // possible will take some extra work. See http://crbug.com/415315 declarativeContent.SetIcon = function(parameters) { setIcon(parameters, function (data) { setupInstance(this, data, 'SetIcon'); }.bind(this)); }; }); exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the desktopCapture API. var binding = require('binding').Binding.create('desktopCapture'); var sendRequest = require('sendRequest').sendRequest; var idGenerator = requireNative('id_generator'); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var pendingRequests = {}; function onRequestResult(id, result) { if (id in pendingRequests) { var callback = pendingRequests[id]; delete pendingRequests[id]; callback(result); } } apiFunctions.setHandleRequest('chooseDesktopMedia', function(sources, target_tab, callback) { // |target_tab| is an optional parameter. if (callback === undefined) { callback = target_tab; target_tab = undefined; } var id = idGenerator.GetNextId(); pendingRequests[id] = callback; sendRequest(this.name, [id, sources, target_tab, onRequestResult.bind(null, id)], this.definition.parameters); return id; }); apiFunctions.setHandleRequest('cancelChooseDesktopMedia', function(id) { if (id in pendingRequests) { delete pendingRequests[id]; sendRequest(this.name, [id], this.definition.parameters); } }); }); exports.$set('binding', binding.generate()); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the developerPrivate API. var binding = require('binding').Binding.create('developerPrivate'); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; // Converts the argument of |functionName| from DirectoryEntry to URL. function bindFileSystemFunction(functionName) { apiFunctions.setUpdateArgumentsPostValidate( functionName, function(directoryEntry, callback) { var fileSystemName = directoryEntry.filesystem.name; var relativePath = $String.slice(directoryEntry.fullPath, 1); var url = directoryEntry.toURL(); return [fileSystemName, relativePath, url, callback]; }); } bindFileSystemFunction('loadDirectory'); // developerPrivate.enable is the same as chrome.management.setEnabled. // TODO(devlin): Migrate callers off developerPrivate.enable. bindingsAPI.compiledApi.enable = chrome.management.setEnabled; apiFunctions.setHandleRequest('allowFileAccess', function(id, allow, callback) { chrome.developerPrivate.updateExtensionConfiguration( {extensionId: id, fileAccess: allow}, callback); }); apiFunctions.setHandleRequest('allowIncognito', function(id, allow, callback) { chrome.developerPrivate.updateExtensionConfiguration( {extensionId: id, incognitoAccess: allow}, callback); }); apiFunctions.setHandleRequest('inspect', function(options, callback) { var renderViewId = options.render_view_id; if (typeof renderViewId == 'string') { renderViewId = parseInt(renderViewId); if (isNaN(renderViewId)) throw new Error('Invalid value for render_view_id'); } var renderProcessId = options.render_process_id; if (typeof renderProcessId == 'string') { renderProcessId = parseInt(renderProcessId); if (isNaN(renderProcessId)) throw new Error('Invalid value for render_process_id'); } chrome.developerPrivate.openDevTools({ extensionId: options.extension_id, renderProcessId: renderProcessId, renderViewId: renderViewId, incognito: options.incognito }, callback); }); }); exports.$set('binding', binding.generate()); // Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom bindings for the downloads API. var binding = require('binding').Binding.create('downloads'); var downloadsInternal = require('binding').Binding.create( 'downloadsInternal').generate(); var eventBindings = require('event_bindings'); eventBindings.registerArgumentMassager( 'downloads.onDeterminingFilename', function massage_determining_filename(args, dispatch) { var downloadItem = args[0]; // Copy the id so that extensions can't change it. var downloadId = downloadItem.id; var suggestable = true; function isValidResult(result) { if (result === undefined) return false; if (typeof(result) != 'object') { console.error('Error: Invocation of form suggest(' + typeof(result) + ') doesn\'t match definition suggest({filename: string, ' + 'conflictAction: string})'); return false; } else if ((typeof(result.filename) != 'string') || (result.filename.length == 0)) { console.error('Error: "filename" parameter to suggest() must be a ' + 'non-empty string'); return false; } else if ([undefined, 'uniquify', 'overwrite', 'prompt'].indexOf( result.conflictAction) < 0) { console.error('Error: "conflictAction" parameter to suggest() must be ' + 'one of undefined, "uniquify", "overwrite", "prompt"'); return false; } return true; } function suggestCallback(result) { if (!suggestable) { console.error('suggestCallback may not be called more than once.'); return; } suggestable = false; if (isValidResult(result)) { downloadsInternal.determineFilename( downloadId, result.filename, result.conflictAction || ""); } else { downloadsInternal.determineFilename(downloadId, "", ""); } } try { var results = dispatch([downloadItem, suggestCallback]); var async = (results && results.results && (results.results.length != 0) && (results.results[0] === true)); if (suggestable && !async) suggestCallback(); } catch (e) { suggestCallback(); throw e; } }); exports.$set('binding', binding.generate()); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the enterprise.platformKeys API. // The platformKeys API consists of two major parts: // - the certificate management. // - the key generation and crypto operations and // The former is implemented without custom binding as static functions. // The latter is exposed by implementing WebCrypto's SubtleCrypto interface. // The internal API provides the key and crypto operations through static // functions expecting token IDs and this custom binding adds the SubtleCrypto // wrapper. // The Token object holds the token id and the SubtleCrypto member. var binding = require('binding').Binding.create('enterprise.platformKeys'); var Token = require('enterprise.platformKeys.Token').Token; var internalAPI = require('enterprise.platformKeys.internalAPI'); binding.registerCustomHook(function(api) { var apiFunctions = api.apiFunctions; var ret = apiFunctions.setHandleRequest('getTokens', function(callback) { internalAPI.getTokens(function(tokenIds) { callback($Array.map(tokenIds, function(tokenId) { return new Token(tokenId); })); }); }); }); exports.$set('binding', binding.generate()); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var binding = require('binding') .Binding.create('enterprise.platformKeysInternal') .generate(); exports.$set('getTokens', binding.getTokens); exports.$set('generateKey', binding.generateKey); exports.$set('sign', binding.sign); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var utils = require('utils'); var intersect = require('platformKeys.utils').intersect; var keyModule = require('platformKeys.Key'); var Key = keyModule.Key; var KeyType = keyModule.KeyType; var KeyUsage = keyModule.KeyUsage; /** * Implementation of WebCrypto.KeyPair used in enterprise.platformKeys. * @param {ArrayBuffer} publicKeySpki The Subject Public Key Info in DER * encoding. * @param {KeyAlgorithm} algorithm The algorithm identifier. * @param {KeyUsage[]} usages The allowed key usages. * @constructor */ function KeyPairImpl(publicKeySpki, algorithm, usages) { this.publicKey = new Key(KeyType.public, publicKeySpki, algorithm, intersect([KeyUsage.verify], usages), true /* extractable */); this.privateKey = new Key(KeyType.private, publicKeySpki, algorithm, intersect([KeyUsage.sign], usages), false /* not extractable */); } $Object.setPrototypeOf(KeyPairImpl.prototype, null); function KeyPair() { privates(KeyPair).constructPrivate(this, arguments); } utils.expose(KeyPair, KeyPairImpl, { readonly: [ 'publicKey', 'privateKey', ], }); exports.$set('KeyPair', KeyPair); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var utils = require('utils'); var internalAPI = require('enterprise.platformKeys.internalAPI'); var intersect = require('platformKeys.utils').intersect; var subtleCryptoModule = require('platformKeys.SubtleCrypto'); var SubtleCryptoImpl = subtleCryptoModule.SubtleCryptoImpl; var KeyPair = require('enterprise.platformKeys.KeyPair').KeyPair; var KeyUsage = require('platformKeys.Key').KeyUsage; var normalizeAlgorithm = requireNative('platform_keys_natives').NormalizeAlgorithm; // This error is thrown by the internal and public API's token functions and // must be rethrown by this custom binding. Keep this in sync with the C++ part // of this API. var errorInvalidToken = 'The token is not valid.'; // The following errors are specified in WebCrypto. // TODO(pneubeck): These should be DOMExceptions. function CreateNotSupportedError() { return new Error('The algorithm is not supported'); } function CreateInvalidAccessError() { return new Error('The requested operation is not valid for the provided key'); } function CreateDataError() { return new Error('Data provided to an operation does not meet requirements'); } function CreateSyntaxError() { return new Error('A required parameter was missing or out-of-range'); } function CreateOperationError() { return new Error('The operation failed for an operation-specific reason'); } // Catches an |internalErrorInvalidToken|. If so, forwards it to |reject| and // returns true. function catchInvalidTokenError(reject) { if (chrome.runtime.lastError && chrome.runtime.lastError.message == errorInvalidToken) { reject(chrome.runtime.lastError); return true; } return false; } // Returns true if |array| is a BigInteger describing the standard public // exponent 65537. In particular, it ignores leading zeros as required by the // BigInteger definition in WebCrypto. function equalsStandardPublicExponent(array) { var expected = [0x01, 0x00, 0x01]; if (array.length < expected.length) return false; for (var i = 0; i < array.length; i++) { var expectedDigit = 0; if (i < expected.length) { // |expected| is symmetric, endianness doesn't matter. expectedDigit = expected[i]; } if (array[array.length - 1 - i] !== expectedDigit) return false; } return true; } /** * Implementation of WebCrypto.SubtleCrypto used in enterprise.platformKeys. * Derived from platformKeys.SubtleCrypto. * @param {string} tokenId The id of the backing Token. * @constructor */ function EnterpriseSubtleCryptoImpl(tokenId) { $Function.call(SubtleCryptoImpl, this, tokenId); } EnterpriseSubtleCryptoImpl.prototype = $Object.create(SubtleCryptoImpl.prototype); EnterpriseSubtleCryptoImpl.prototype.generateKey = function(algorithm, extractable, keyUsages) { var subtleCrypto = this; return new Promise(function(resolve, reject) { // TODO(pneubeck): Apply the algorithm normalization of the WebCrypto // implementation. if (extractable) { // Note: This deviates from WebCrypto.SubtleCrypto. throw CreateNotSupportedError(); } if (intersect(keyUsages, [KeyUsage.sign, KeyUsage.verify]).length != keyUsages.length) { throw CreateDataError(); } var normalizedAlgorithmParameters = normalizeAlgorithm(algorithm, 'GenerateKey'); if (!normalizedAlgorithmParameters) { // TODO(pneubeck): It's not clear from the WebCrypto spec which error to // throw here. throw CreateSyntaxError(); } // normalizeAlgorithm returns an array, but publicExponent should be a // Uint8Array. normalizedAlgorithmParameters.publicExponent = new Uint8Array(normalizedAlgorithmParameters.publicExponent); if (normalizedAlgorithmParameters.name !== 'RSASSA-PKCS1-v1_5' || !equalsStandardPublicExponent( normalizedAlgorithmParameters.publicExponent)) { // Note: This deviates from WebCrypto.SubtleCrypto. throw CreateNotSupportedError(); } internalAPI.generateKey(subtleCrypto.tokenId, normalizedAlgorithmParameters.modulusLength, function(spki) { if (catchInvalidTokenError(reject)) return; if (chrome.runtime.lastError) { reject(CreateOperationError()); return; } resolve(new KeyPair(spki, normalizedAlgorithmParameters, keyUsages)); }); }); }; function SubtleCrypto() { privates(SubtleCrypto).constructPrivate(this, arguments); } utils.expose(SubtleCrypto, EnterpriseSubtleCryptoImpl, { superclass: subtleCryptoModule.SubtleCrypto, functions: [ 'generateKey', // 'sign', 'exportKey' are exposed by the base class ], }); exports.$set('SubtleCrypto', SubtleCrypto); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var utils = require('utils'); var SubtleCrypto = require('enterprise.platformKeys.SubtleCrypto').SubtleCrypto; /** * Implementation of enterprise.platformKeys.Token. * @param {string} id The id of the new Token. * @constructor */ function TokenImpl(id) { this.id = id; this.subtleCrypto = new SubtleCrypto(id); } $Object.setPrototypeOf(TokenImpl.prototype, null); function Token() { privates(Token).constructPrivate(this, arguments); } utils.expose(Token, TokenImpl, { readonly: [ 'id', 'subtleCrypto', ], }); exports.$set('Token', Token); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom bindings for the feedbackPrivate API. var binding = require('binding').Binding.create('feedbackPrivate'); var blobNatives = requireNative('blob_natives'); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setUpdateArgumentsPostValidate( "sendFeedback", function(feedbackInfo, callback) { var attachedFileBlobUuid = ''; var screenshotBlobUuid = ''; if (feedbackInfo.attachedFile) attachedFileBlobUuid = blobNatives.GetBlobUuid(feedbackInfo.attachedFile.data); if (feedbackInfo.screenshot) screenshotBlobUuid = blobNatives.GetBlobUuid(feedbackInfo.screenshot); feedbackInfo.attachedFileBlobUuid = attachedFileBlobUuid; feedbackInfo.screenshotBlobUuid = screenshotBlobUuid; return [feedbackInfo, callback]; }); }); exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the fileBrowserHandler API. var binding = require('binding').Binding.create('fileBrowserHandler'); var eventBindings = require('event_bindings'); var fileBrowserNatives = requireNative('file_browser_handler'); var GetExternalFileEntry = fileBrowserNatives.GetExternalFileEntry; var fileBrowserHandlerInternal = require('binding').Binding.create( 'fileBrowserHandlerInternal').generate(); eventBindings.registerArgumentMassager('fileBrowserHandler.onExecute', function(args, dispatch) { if (args.length < 2) { dispatch(args); return; } var fileList = args[1].entries; if (!fileList) { dispatch(args); return; } // The second parameter for this event's payload is file definition // dictionary that we used to reconstruct File API's Entry instance // here. for (var i = 0; i < fileList.length; i++) fileList[i] = GetExternalFileEntry(fileList[i]); dispatch(args); }); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('selectFile', function(selectionParams, callback) { function internalCallback(externalCallback, internalResult) { if (!externalCallback) return; var result = undefined; if (internalResult) { result = { success: internalResult.success, entry: null }; if (internalResult.success) result.entry = GetExternalFileEntry(internalResult.entry); } externalCallback(result); } return fileBrowserHandlerInternal.selectFile( selectionParams, $Function.bind(internalCallback, null, callback)); }); }); exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the fileManagerPrivate API. // Bindings var binding = require('binding').Binding.create('fileManagerPrivate'); var eventBindings = require('event_bindings'); // Natives var fileManagerPrivateNatives = requireNative('file_manager_private'); // Internals var fileManagerPrivateInternal = require('binding').Binding.create('fileManagerPrivateInternal').generate(); // Shorthands var GetFileSystem = fileManagerPrivateNatives.GetFileSystem; var GetExternalFileEntry = fileManagerPrivateNatives.GetExternalFileEntry; binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setCustomCallback('searchDrive', function(name, request, callback, response) { if (response && !response.error && response.entries) { response.entries = response.entries.map(function(entry) { return GetExternalFileEntry(entry); }); } // So |callback| doesn't break if response is not defined. if (!response) response = {}; if (callback) callback(response.entries, response.nextFeed); }); apiFunctions.setCustomCallback('searchDriveMetadata', function(name, request, callback, response) { if (response && !response.error) { for (var i = 0; i < response.length; i++) { response[i].entry = GetExternalFileEntry(response[i].entry); } } // So |callback| doesn't break if response is not defined. if (!response) response = {}; if (callback) callback(response); }); apiFunctions.setHandleRequest('resolveIsolatedEntries', function(entries, callback) { var urls = entries.map(function(entry) { return fileManagerPrivateNatives.GetEntryURL(entry); }); fileManagerPrivateInternal.resolveIsolatedEntries(urls, function( entryDescriptions) { callback(entryDescriptions.map(function(description) { return GetExternalFileEntry(description); })); }); }); apiFunctions.setHandleRequest('getEntryProperties', function(entries, names, callback) { var urls = entries.map(function(entry) { return fileManagerPrivateNatives.GetEntryURL(entry); }); fileManagerPrivateInternal.getEntryProperties(urls, names, callback); }); apiFunctions.setHandleRequest('addFileWatch', function(entry, callback) { var url = fileManagerPrivateNatives.GetEntryURL(entry); fileManagerPrivateInternal.addFileWatch(url, callback); }); apiFunctions.setHandleRequest('removeFileWatch', function(entry, callback) { var url = fileManagerPrivateNatives.GetEntryURL(entry); fileManagerPrivateInternal.removeFileWatch(url, callback); }); apiFunctions.setHandleRequest('getCustomActions', function( entries, callback) { var urls = entries.map(function(entry) { return fileManagerPrivateNatives.GetEntryURL(entry); }); fileManagerPrivateInternal.getCustomActions(urls, callback); }); apiFunctions.setHandleRequest('executeCustomAction', function( entries, actionId, callback) { var urls = entries.map(function(entry) { return fileManagerPrivateNatives.GetEntryURL(entry); }); fileManagerPrivateInternal.executeCustomAction(urls, actionId, callback); }); apiFunctions.setHandleRequest('computeChecksum', function(entry, callback) { var url = fileManagerPrivateNatives.GetEntryURL(entry); fileManagerPrivateInternal.computeChecksum(url, callback); }); apiFunctions.setHandleRequest('getMimeType', function(entry, callback) { var url = fileManagerPrivateNatives.GetEntryURL(entry); fileManagerPrivateInternal.getMimeType(url, callback); }); apiFunctions.setHandleRequest('pinDriveFile', function(entry, pin, callback) { var url = fileManagerPrivateNatives.GetEntryURL(entry); fileManagerPrivateInternal.pinDriveFile(url, pin, callback); }); apiFunctions.setHandleRequest('executeTask', function(taskId, entries, callback) { var urls = entries.map(function(entry) { return fileManagerPrivateNatives.GetEntryURL(entry); }); fileManagerPrivateInternal.executeTask(taskId, urls, callback); }); apiFunctions.setHandleRequest('setDefaultTask', function(taskId, entries, mimeTypes, callback) { var urls = entries.map(function(entry) { return fileManagerPrivateNatives.GetEntryURL(entry); }); fileManagerPrivateInternal.setDefaultTask( taskId, urls, mimeTypes, callback); }); apiFunctions.setHandleRequest('getFileTasks', function(entries, callback) { var urls = entries.map(function(entry) { return fileManagerPrivateNatives.GetEntryURL(entry); }); fileManagerPrivateInternal.getFileTasks(urls, callback); }); apiFunctions.setHandleRequest('getShareUrl', function(entry, callback) { var url = fileManagerPrivateNatives.GetEntryURL(entry); fileManagerPrivateInternal.getShareUrl(url, callback); }); apiFunctions.setHandleRequest('getDownloadUrl', function(entry, callback) { var url = fileManagerPrivateNatives.GetEntryURL(entry); fileManagerPrivateInternal.getDownloadUrl(url, callback); }); apiFunctions.setHandleRequest('requestDriveShare', function( entry, shareType, callback) { var url = fileManagerPrivateNatives.GetEntryURL(entry); fileManagerPrivateInternal.requestDriveShare(url, shareType, callback); }); apiFunctions.setHandleRequest('setEntryTag', function( entry, visibility, key, value, callback) { var url = fileManagerPrivateNatives.GetEntryURL(entry); fileManagerPrivateInternal.setEntryTag( url, visibility, key, value, callback); }); apiFunctions.setHandleRequest('cancelFileTransfers', function( entries, callback) { var urls = entries.map(function(entry) { return fileManagerPrivateNatives.GetEntryURL(entry); }); fileManagerPrivateInternal.cancelFileTransfers(urls, callback); }); apiFunctions.setHandleRequest('startCopy', function( entry, parentEntry, newName, callback) { var url = fileManagerPrivateNatives.GetEntryURL(entry); var parentUrl = fileManagerPrivateNatives.GetEntryURL(parentEntry); fileManagerPrivateInternal.startCopy( url, parentUrl, newName, callback); }); apiFunctions.setHandleRequest('zipSelection', function( parentEntry, entries, destName, callback) { var parentUrl = fileManagerPrivateNatives.GetEntryURL(parentEntry); var urls = entries.map(function(entry) { return fileManagerPrivateNatives.GetEntryURL(entry); }); fileManagerPrivateInternal.zipSelection( parentUrl, urls, destName, callback); }); apiFunctions.setHandleRequest('validatePathNameLength', function( entry, name, callback) { var url = fileManagerPrivateNatives.GetEntryURL(entry); fileManagerPrivateInternal.validatePathNameLength(url, name, callback); }); }); eventBindings.registerArgumentMassager( 'fileManagerPrivate.onDirectoryChanged', function(args, dispatch) { // Convert the entry arguments into a real Entry object. args[0].entry = GetExternalFileEntry(args[0].entry); dispatch(args); }); exports.$set('binding', binding.generate()); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var fileSystemNatives = requireNative('file_system_natives'); var GetIsolatedFileSystem = fileSystemNatives.GetIsolatedFileSystem; var sendRequest = require('sendRequest'); var lastError = require('lastError'); var GetModuleSystem = requireNative('v8_context').GetModuleSystem; // TODO(sammc): Don't require extension. See http://crbug.com/235689. var GetExtensionViews = requireNative('runtime').GetExtensionViews; // For a given |apiName|, generates object with two elements that are used // in file system relayed APIs: // * 'bindFileEntryCallback' function that provides mapping between JS objects // into actual FileEntry|DirectoryEntry objects. // * 'entryIdManager' object that implements methods for keeping the tracks of // previously saved file entries. function getFileBindingsForApi(apiName) { // Fallback to using the current window if no background page is running. var backgroundPage = GetExtensionViews(-1, -1, 'BACKGROUND')[0] || window; var backgroundPageModuleSystem = GetModuleSystem(backgroundPage); // All windows use the bindFileEntryCallback from the background page so their // FileEntry objects have the background page's context as their own. This // allows them to be used from other windows (including the background page) // after the original window is closed. if (window == backgroundPage) { var bindFileEntryCallback = function(functionName, apiFunctions) { apiFunctions.setCustomCallback(functionName, function(name, request, callback, response) { if (callback) { if (!response) { callback(); return; } var entries = []; var hasError = false; var getEntryError = function(fileError) { if (!hasError) { hasError = true; lastError.run( apiName + '.' + functionName, 'Error getting fileEntry, code: ' + fileError.code, request.stack, callback); } } // Loop through the response entries and asynchronously get the // FileEntry for each. We use hasError to ensure that only the first // error is reported. Note that an error can occur either during the // loop or in the asynchronous error callback to getFile. $Array.forEach(response.entries, function(entry) { if (hasError) return; var fileSystemId = entry.fileSystemId; var baseName = entry.baseName; var id = entry.id; var fs = GetIsolatedFileSystem(fileSystemId); try { var getEntryCallback = function(fileEntry) { if (hasError) return; entryIdManager.registerEntry(id, fileEntry); entries.push(fileEntry); // Once all entries are ready, pass them to the callback. In the // event of an error, this condition will never be satisfied so // the callback will not be called with any entries. if (entries.length == response.entries.length) { if (response.multiple) { sendRequest.safeCallbackApply( apiName + '.' + functionName, request, callback, [entries]); } else { sendRequest.safeCallbackApply( apiName + '.' + functionName, request, callback, [entries[0]]); } } } // TODO(koz): fs.root.getFile() makes a trip to the browser // process, but it might be possible avoid that by calling // WebDOMFileSystem::createV8Entry(). if (entry.isDirectory) { fs.root.getDirectory(baseName, {}, getEntryCallback, getEntryError); } else { fs.root.getFile(baseName, {}, getEntryCallback, getEntryError); } } catch (e) { if (!hasError) { hasError = true; lastError.run(apiName + '.' + functionName, 'Error getting fileEntry: ' + e.stack, request.stack, callback); } } }); } }); }; var entryIdManager = require('entryIdManager'); } else { // Force the fileSystem API to be loaded in the background page. Using // backgroundPageModuleSystem.require('fileSystem') is insufficient as // requireNative is only allowed while lazily loading an API. backgroundPage.chrome.fileSystem; var bindFileEntryCallback = backgroundPageModuleSystem.require( apiName).bindFileEntryCallback; var entryIdManager = backgroundPageModuleSystem.require('entryIdManager'); } return {bindFileEntryCallback: bindFileEntryCallback, entryIdManager: entryIdManager}; } exports.$set('getFileBindingsForApi', getFileBindingsForApi); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the fileSystem API. var binding = require('binding').Binding.create('fileSystem'); var sendRequest = require('sendRequest'); var getFileBindingsForApi = require('fileEntryBindingUtil').getFileBindingsForApi; var fileBindings = getFileBindingsForApi('fileSystem'); var bindFileEntryCallback = fileBindings.bindFileEntryCallback; var entryIdManager = fileBindings.entryIdManager; var fileSystemNatives = requireNative('file_system_natives'); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var fileSystem = bindingsAPI.compiledApi; function bindFileEntryFunction(functionName) { apiFunctions.setUpdateArgumentsPostValidate( functionName, function(fileEntry, callback) { var fileSystemName = fileEntry.filesystem.name; var relativePath = $String.slice(fileEntry.fullPath, 1); return [fileSystemName, relativePath, callback]; }); } $Array.forEach(['getDisplayPath', 'getWritableEntry', 'isWritableEntry'], bindFileEntryFunction); $Array.forEach(['getWritableEntry', 'chooseEntry', 'restoreEntry'], function(functionName) { bindFileEntryCallback(functionName, apiFunctions); }); apiFunctions.setHandleRequest('retainEntry', function(fileEntry) { var id = entryIdManager.getEntryId(fileEntry); if (!id) return ''; var fileSystemName = fileEntry.filesystem.name; var relativePath = $String.slice(fileEntry.fullPath, 1); sendRequest.sendRequest(this.name, [id, fileSystemName, relativePath], this.definition.parameters); return id; }); apiFunctions.setHandleRequest('isRestorable', function(id, callback) { var savedEntry = entryIdManager.getEntryById(id); if (savedEntry) { sendRequest.safeCallbackApply( 'fileSystem.isRestorable', {}, callback, [true]); } else { sendRequest.sendRequest( this.name, [id, callback], this.definition.parameters); } }); apiFunctions.setUpdateArgumentsPostValidate('restoreEntry', function(id, callback) { var savedEntry = entryIdManager.getEntryById(id); if (savedEntry) { // We already have a file entry for this id so pass it to the callback and // send a request to the browser to move it to the back of the LRU. sendRequest.safeCallbackApply( 'fileSystem.restoreEntry', {}, callback, [savedEntry]); return [id, false, null]; } else { // Ask the browser process for a new file entry for this id, to be passed // to |callback|. return [id, true, callback]; } }); apiFunctions.setCustomCallback('requestFileSystem', function(name, request, callback, response) { var fileSystem; if (response && response.file_system_id) { fileSystem = fileSystemNatives.GetIsolatedFileSystem( response.file_system_id, response.file_system_path); } sendRequest.safeCallbackApply( 'fileSystem.requestFileSystem', request, callback, [fileSystem]); }); // TODO(benwells): Remove these deprecated versions of the functions. fileSystem.getWritableFileEntry = function() { console.log("chrome.fileSystem.getWritableFileEntry is deprecated"); console.log("Please use chrome.fileSystem.getWritableEntry instead"); $Function.apply(fileSystem.getWritableEntry, this, arguments); }; fileSystem.isWritableFileEntry = function() { console.log("chrome.fileSystem.isWritableFileEntry is deprecated"); console.log("Please use chrome.fileSystem.isWritableEntry instead"); $Function.apply(fileSystem.isWritableEntry, this, arguments); }; fileSystem.chooseFile = function() { console.log("chrome.fileSystem.chooseFile is deprecated"); console.log("Please use chrome.fileSystem.chooseEntry instead"); $Function.apply(fileSystem.chooseEntry, this, arguments); }; }); exports.$set('bindFileEntryCallback', bindFileEntryCallback); exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the fileSystemProvider API. var binding = require('binding').Binding.create('fileSystemProvider'); var fileSystemProviderInternal = require('binding').Binding.create('fileSystemProviderInternal').generate(); var eventBindings = require('event_bindings'); /** * Maximum size of the thumbnail in bytes. * @type {number} * @const */ var METADATA_THUMBNAIL_SIZE_LIMIT = 32 * 1024 * 1024; /** * Regular expression to validate if the thumbnail URI is a valid data URI, * taking into account allowed formats. * @type {RegExp} * @const */ var METADATA_THUMBNAIL_FORMAT = new RegExp( '^data:image/(png|jpeg|webp);', 'i'); /** * Annotates a date with its serialized value. * @param {Date} date Input date. * @return {Date} Date with an extra value attribute. */ function annotateDate(date) { // Copy in case the input date is frozen. var result = new Date(date.getTime()); result.value = result.toString(); return result; } /** * Verifies if the passed image URI is valid. * @param {*} uri Image URI. * @return {boolean} True if valid, valse otherwise. */ function verifyImageURI(uri) { // The URI is specified by a user, so the type may be incorrect. if (typeof uri != 'string' && !(uri instanceof String)) return false; return METADATA_THUMBNAIL_FORMAT.test(uri); } /** * Verifies if the passed metadata is valid. * @param {!GetMetadataOptions|!ReadDirectoryOptions} options * @return {boolean} True if valid, false if invalid. */ function verifyMetadata(options, metadata) { // Ideally we'd like to consider the following as errors, but for backward // compatibility they are warnings only. if (!options.isDirectory && metadata.isDirectory !== undefined) console.warn('IsDirectory specified, but not requested.'); if (!options.name && metadata.name !== undefined) console.warn('Name specified, but not requested.'); if (!options.size && metadata.size !== undefined) console.warn('Size specified, but not requested.'); if (!options.modificationTime && metadata.modificationTime !== undefined) console.warn('Last modification time specified, but not requested.'); if (!options.mimeType && metadata.mimeType !== undefined) { console.warn('MIME type specified, but not requested.'); } else { if (metadata.mimeType === '') { warning = 'MIME type must not be an empty string.' + 'If unknown, then do not set it.'; } } if (options.isDirectory && metadata.isDirectory === undefined) { console.error('IsDirectory is required for this request.'); return false; } if (options.name && metadata.name === undefined) { console.error('Name is required for this request.'); return false; } if (options.size && metadata.size === undefined) { console.error('Size is required for this request.'); return false; } if (options.modificationTime && metadata.modificationTime === undefined) { console.error('Last modification time is required for this request.'); return false; } // It is invalid to return a thumbnail when it's not requested. The // restriction is added in order to avoid fetching the thumbnail while // it's not needed. if (!options.thumbnail && metadata.thumbnail !== undefined) { console.error('Thumbnail data provided, but not requested.'); return false; } // Check the format and size. Note, that in the C++ layer, there is // another sanity check to avoid passing any evil URL. if (metadata.thumbnail !== undefined && !verifyImageURI(metadata.thumbnail)) { console.error('Thumbnail format invalid.'); return false; } if (metadata.thumbnail !== undefined && metadata.thumbnail.length > METADATA_THUMBNAIL_SIZE_LIMIT) { console.error('Thumbnail data too large.'); return false; } return true; } /** * Annotates an entry metadata by serializing its modifiedTime value. * @param {EntryMetadata} metadata Input metadata. * @return {EntryMetadata} metadata Annotated metadata, which can be passed * back to the C++ layer. */ function annotateMetadata(metadata) { var result = {}; if (metadata.isDirectory !== undefined) result.isDirectory = metadata.isDirectory; if (metadata.name !== undefined) result.name = metadata.name; if (metadata.size !== undefined) result.size = metadata.size; if (metadata.modificationTime !== undefined) result.modificationTime = annotateDate(metadata.modificationTime); if (metadata.mimeType !== undefined) result.mimeType = metadata.mimeType; if (metadata.thumbnail !== undefined) result.thumbnail = metadata.thumbnail; return result; } /** * Massages arguments of an event raised by the File System Provider API. * @param {Array<*>} args Input arguments. * @param {function(Array<*>)} dispatch Closure to be called with massaged * arguments. */ function massageArgumentsDefault(args, dispatch) { var executionStart = Date.now(); var options = args[0]; var onSuccessCallback = function(hasNext) { fileSystemProviderInternal.operationRequestedSuccess( options.fileSystemId, options.requestId, Date.now() - executionStart); }; var onErrorCallback = function(error) { fileSystemProviderInternal.operationRequestedError( options.fileSystemId, options.requestId, error, Date.now() - executionStart); } dispatch([options, onSuccessCallback, onErrorCallback]); } eventBindings.registerArgumentMassager( 'fileSystemProvider.onUnmountRequested', massageArgumentsDefault); eventBindings.registerArgumentMassager( 'fileSystemProvider.onGetMetadataRequested', function(args, dispatch) { var executionStart = Date.now(); var options = args[0]; var onSuccessCallback = function(metadata) { if (!verifyMetadata(options, metadata)) { fileSystemProviderInternal.operationRequestedError( options.fileSystemId, options.requestId, 'FAILED', Date.now() - executionStart); return; } fileSystemProviderInternal.getMetadataRequestedSuccess( options.fileSystemId, options.requestId, annotateMetadata(metadata), Date.now() - executionStart); }; var onErrorCallback = function(error) { fileSystemProviderInternal.operationRequestedError( options.fileSystemId, options.requestId, error, Date.now() - executionStart); } dispatch([options, onSuccessCallback, onErrorCallback]); }); eventBindings.registerArgumentMassager( 'fileSystemProvider.onGetActionsRequested', function(args, dispatch) { var executionStart = Date.now(); var options = args[0]; var onSuccessCallback = function(actions) { fileSystemProviderInternal.getActionsRequestedSuccess( options.fileSystemId, options.requestId, actions, Date.now() - executionStart); }; var onErrorCallback = function(error) { fileSystemProviderInternal.operationRequestedError( options.fileSystemId, options.requestId, error, Date.now() - executionStart); } dispatch([options, onSuccessCallback, onErrorCallback]); }); eventBindings.registerArgumentMassager( 'fileSystemProvider.onReadDirectoryRequested', function(args, dispatch) { var executionStart = Date.now(); var options = args[0]; var onSuccessCallback = function(entries, hasNext) { var error = false; for (var i = 0; i < entries.length; i++) { if (!verifyMetadata(options, entries[i])) { error = true; break; } } if (error) { fileSystemProviderInternal.operationRequestedError( options.fileSystemId, options.requestId, 'FAILED', Date.now() - executionStart); return; } var annotatedEntries = entries.map(annotateMetadata); fileSystemProviderInternal.readDirectoryRequestedSuccess( options.fileSystemId, options.requestId, annotatedEntries, hasNext, Date.now() - executionStart); }; var onErrorCallback = function(error) { fileSystemProviderInternal.operationRequestedError( options.fileSystemId, options.requestId, error, Date.now() - executionStart); } dispatch([options, onSuccessCallback, onErrorCallback]); }); eventBindings.registerArgumentMassager( 'fileSystemProvider.onOpenFileRequested', massageArgumentsDefault); eventBindings.registerArgumentMassager( 'fileSystemProvider.onCloseFileRequested', massageArgumentsDefault); eventBindings.registerArgumentMassager( 'fileSystemProvider.onReadFileRequested', function(args, dispatch) { var executionStart = Date.now(); var options = args[0]; var onSuccessCallback = function(data, hasNext) { fileSystemProviderInternal.readFileRequestedSuccess( options.fileSystemId, options.requestId, data, hasNext, Date.now() - executionStart); }; var onErrorCallback = function(error) { fileSystemProviderInternal.operationRequestedError( options.fileSystemId, options.requestId, error, Date.now() - executionStart); } dispatch([options, onSuccessCallback, onErrorCallback]); }); eventBindings.registerArgumentMassager( 'fileSystemProvider.onCreateDirectoryRequested', massageArgumentsDefault); eventBindings.registerArgumentMassager( 'fileSystemProvider.onDeleteEntryRequested', massageArgumentsDefault); eventBindings.registerArgumentMassager( 'fileSystemProvider.onCreateFileRequested', massageArgumentsDefault); eventBindings.registerArgumentMassager( 'fileSystemProvider.onCopyEntryRequested', massageArgumentsDefault); eventBindings.registerArgumentMassager( 'fileSystemProvider.onMoveEntryRequested', massageArgumentsDefault); eventBindings.registerArgumentMassager( 'fileSystemProvider.onTruncateRequested', massageArgumentsDefault); eventBindings.registerArgumentMassager( 'fileSystemProvider.onWriteFileRequested', massageArgumentsDefault); eventBindings.registerArgumentMassager( 'fileSystemProvider.onAbortRequested', massageArgumentsDefault); eventBindings.registerArgumentMassager( 'fileSystemProvider.onObserveDirectoryRequested', massageArgumentsDefault); eventBindings.registerArgumentMassager( 'fileSystemProvider.onUnobserveEntryRequested', massageArgumentsDefault); eventBindings.registerArgumentMassager( 'fileSystemProvider.onAddWatcherRequested', massageArgumentsDefault); eventBindings.registerArgumentMassager( 'fileSystemProvider.onRemoveWatcherRequested', massageArgumentsDefault); eventBindings.registerArgumentMassager( 'fileSystemProvider.onConfigureRequested', massageArgumentsDefault); eventBindings.registerArgumentMassager( 'fileSystemProvider.onExecuteActionRequested', massageArgumentsDefault); eventBindings.registerArgumentMassager( 'fileSystemProvider.onMountRequested', function(args, dispatch) { var onSuccessCallback = function() { // TODO(mtomasz): To be implemented. }; var onErrorCallback = function(error) { // TODO(mtomasz): To be implemented. } dispatch([onSuccessCallback, onErrorCallback]); }); exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the GCM API. var binding = require('binding').Binding.create('gcm'); var forEach = require('utils').forEach; binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var gcm = bindingsAPI.compiledApi; apiFunctions.setUpdateArgumentsPostValidate( 'send', function(message, callback) { // Validate message.data. var payloadSize = 0; forEach(message.data, function(property, value) { if (property.length == 0) throw new Error("One of data keys is empty."); var lowerCasedProperty = property.toLowerCase(); // Issue an error for forbidden prefixes of property names. if (lowerCasedProperty.indexOf("goog.") == 0 || lowerCasedProperty.indexOf("google") == 0 || property.indexOf("collapse_key") == 0) { throw new Error("Invalid data key: " + property); } payloadSize += property.length + value.length; }); if (payloadSize > gcm.MAX_MESSAGE_SIZE) throw new Error("Payload exceeded allowed size limit. Payload size is: " + payloadSize); if (payloadSize == 0) throw new Error("No data to send."); return arguments; }); }); exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Identity API. var binding = require('binding').Binding.create('identity'); binding.registerCustomHook(function(binding, id, contextType) { var apiFunctions = binding.apiFunctions; var identity = binding.compiledApi; apiFunctions.setHandleRequest('getRedirectURL', function(path) { if (path === null || path === undefined) path = '/'; else path = String(path); if (path[0] != '/') path = '/' + path; return 'https://' + id + '.chromiumapp.org' + path; }); }); exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the image writer private API. var binding = require('binding').Binding.create('imageWriterPrivate'); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setUpdateArgumentsPostValidate( 'writeFromFile', function(device, fileEntry, options, callback) { var fileSystemName = fileEntry.filesystem.name; var relativePath = $String.slice(fileEntry.fullPath, 1); return [device, fileSystemName, relativePath, callback]; }); }); exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the input ime API. Only injected into the // v8 contexts for extensions which have permission for the API. var binding = require('binding').Binding.create('input.ime'); var Event = require('event_bindings').Event; var appWindowNatives = requireNative('app_window_natives'); binding.registerCustomHook(function(api) { var input_ime = api.compiledApi; input_ime.onKeyEvent.dispatchToListener = function(callback, args) { var engineID = args[0]; var keyData = args[1]; var result = false; try { result = $Function.call(Event.prototype.dispatchToListener, this, callback, args); } catch (e) { console.error('Error in event handler for onKeyEvent: ' + e.stack); } if (!input_ime.onKeyEvent.async) { input_ime.keyEventHandled(keyData.requestId, result); } }; input_ime.onKeyEvent.addListener = function(cb, opt_extraInfo) { input_ime.onKeyEvent.async = false; if (opt_extraInfo instanceof Array) { for (var i = 0; i < opt_extraInfo.length; ++i) { if (opt_extraInfo[i] == "async") { input_ime.onKeyEvent.async = true; } } } $Function.call(Event.prototype.addListener, this, cb); }; api.apiFunctions.setCustomCallback('createWindow', function(name, request, callback, windowParams) { if (!callback) { return; } var view; if (windowParams && windowParams.frameId) { view = appWindowNatives.GetFrame( windowParams.frameId, false /* notifyBrowser */); view.id = windowParams.frameId; } callback(view); }); }); exports.$set('binding', binding.generate()); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the logPrivate API. var binding = require('binding').Binding.create('logPrivate'); var sendRequest = require('sendRequest'); var getFileBindingsForApi = require('fileEntryBindingUtil').getFileBindingsForApi; var fileBindings = getFileBindingsForApi('logPrivate'); var bindFileEntryCallback = fileBindings.bindFileEntryCallback; binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var fileSystem = bindingsAPI.compiledApi; $Array.forEach(['dumpLogs'], function(functionName) { bindFileEntryCallback(functionName, apiFunctions); }); }); exports.$set('bindFileEntryCallback', bindFileEntryCallback); exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Media Gallery API. var binding = require('binding').Binding.create('mediaGalleries'); var blobNatives = requireNative('blob_natives'); var mediaGalleriesNatives = requireNative('mediaGalleries'); var blobsAwaitingMetadata = {}; var mediaGalleriesMetadata = {}; function createFileSystemObjectsAndUpdateMetadata(response) { var result = []; mediaGalleriesMetadata = {}; // Clear any previous metadata. if (response) { for (var i = 0; i < response.length; i++) { var filesystem = mediaGalleriesNatives.GetMediaFileSystemObject( response[i].fsid); $Array.push(result, filesystem); var metadata = response[i]; delete metadata.fsid; mediaGalleriesMetadata[filesystem.name] = metadata; } } return result; } binding.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; // getMediaFileSystems and addUserSelectedFolder use a custom callback so that // they can instantiate and return an array of file system objects. apiFunctions.setCustomCallback('getMediaFileSystems', function(name, request, callback, response) { var result = createFileSystemObjectsAndUpdateMetadata(response); if (callback) callback(result); }); apiFunctions.setCustomCallback('addUserSelectedFolder', function(name, request, callback, response) { var fileSystems = []; var selectedFileSystemName = ""; if (response && 'mediaFileSystems' in response && 'selectedFileSystemIndex' in response) { fileSystems = createFileSystemObjectsAndUpdateMetadata( response['mediaFileSystems']); var selectedFileSystemIndex = response['selectedFileSystemIndex']; if (selectedFileSystemIndex >= 0) { selectedFileSystemName = fileSystems[selectedFileSystemIndex].name; } } if (callback) callback(fileSystems, selectedFileSystemName); }); apiFunctions.setHandleRequest('getMediaFileSystemMetadata', function(filesystem) { if (filesystem && filesystem.name && filesystem.name in mediaGalleriesMetadata) { return mediaGalleriesMetadata[filesystem.name]; } return { 'name': '', 'galleryId': '', 'isRemovable': false, 'isMediaDevice': false, 'isAvailable': false, }; }); apiFunctions.setUpdateArgumentsPostValidate('getMetadata', function(mediaFile, options, callback) { var blobUuid = blobNatives.GetBlobUuid(mediaFile) // Store the blob in a global object to keep its refcount nonzero -- this // prevents the object from being garbage collected before any metadata // parsing gets to occur (see crbug.com/415792). blobsAwaitingMetadata[blobUuid] = mediaFile; return [blobUuid, options, callback]; }); apiFunctions.setCustomCallback('getMetadata', function(name, request, callback, response) { if (response && response.attachedImagesBlobInfo) { for (var i = 0; i < response.attachedImagesBlobInfo.length; i++) { var blobInfo = response.attachedImagesBlobInfo[i]; var blob = blobNatives.TakeBrowserProcessBlob( blobInfo.blobUUID, blobInfo.type, blobInfo.size); response.metadata.attachedImages.push(blob); } } if (callback) callback(response ? response.metadata : null); // The UUID was in position 0 in the setUpdateArgumentsPostValidate // function. var uuid = request.args[0]; delete blobsAwaitingMetadata[uuid]; }); }); exports.$set('binding', binding.generate()); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom bindings for the notifications API. // var binding = require('binding').Binding.create('notifications'); var sendRequest = require('sendRequest').sendRequest; var exceptionHandler = require('uncaught_exception_handler'); var imageUtil = require('imageUtil'); var lastError = require('lastError'); var notificationsPrivate = requireNative('notifications_private'); function imageDataSetter(context, key) { var f = function(val) { this[key] = val; }; return $Function.bind(f, context); } // A URL Spec is an object with the following keys: // path: The resource to be downloaded. // width: (optional) The maximum width of the image to be downloaded in device // pixels. // height: (optional) The maximum height of the image to be downloaded in // device pixels. // callback: A function to be called when the URL is complete. It // should accept an ImageData object and set the appropriate // field in |notificationDetails|. function getUrlSpecs(imageSizes, notificationDetails) { var urlSpecs = []; // |iconUrl| might be optional for notification updates. if (notificationDetails.iconUrl) { $Array.push(urlSpecs, { path: notificationDetails.iconUrl, width: imageSizes.icon.width * imageSizes.scaleFactor, height: imageSizes.icon.height * imageSizes.scaleFactor, callback: imageDataSetter(notificationDetails, 'iconBitmap') }); } // |appIconMaskUrl| is optional. if (notificationDetails.appIconMaskUrl) { $Array.push(urlSpecs, { path: notificationDetails.appIconMaskUrl, width: imageSizes.appIconMask.width * imageSizes.scaleFactor, height: imageSizes.appIconMask.height * imageSizes.scaleFactor, callback: imageDataSetter(notificationDetails, 'appIconMaskBitmap') }); } // |imageUrl| is optional. if (notificationDetails.imageUrl) { $Array.push(urlSpecs, { path: notificationDetails.imageUrl, width: imageSizes.image.width * imageSizes.scaleFactor, height: imageSizes.image.height * imageSizes.scaleFactor, callback: imageDataSetter(notificationDetails, 'imageBitmap') }); } // Each button has an optional icon. var buttonList = notificationDetails.buttons; if (buttonList && typeof buttonList.length === 'number') { var numButtons = buttonList.length; for (var i = 0; i < numButtons; i++) { if (buttonList[i].iconUrl) { $Array.push(urlSpecs, { path: buttonList[i].iconUrl, width: imageSizes.buttonIcon.width * imageSizes.scaleFactor, height: imageSizes.buttonIcon.height * imageSizes.scaleFactor, callback: imageDataSetter(buttonList[i], 'iconBitmap') }); } } } return urlSpecs; } function replaceNotificationOptionURLs(notification_details, callback) { var imageSizes = notificationsPrivate.GetNotificationImageSizes(); var url_specs = getUrlSpecs(imageSizes, notification_details); if (!url_specs.length) { callback(true); return; } var errors = 0; imageUtil.loadAllImages(url_specs, { onerror: function(index) { errors++; }, oncomplete: function(imageData) { if (errors > 0) { callback(false); return; } for (var index = 0; index < url_specs.length; index++) { var url_spec = url_specs[index]; url_spec.callback(imageData[index]); } callback(true); } }); } function genHandle(name, failure_function) { return function(id, input_notification_details, callback) { // TODO(dewittj): Remove this hack. This is used as a way to deep // copy a complex JSON object. var notification_details = $JSON.parse( $JSON.stringify(input_notification_details)); var that = this; var stack = exceptionHandler.getExtensionStackTrace(); replaceNotificationOptionURLs(notification_details, function(success) { if (success) { sendRequest(that.name, [id, notification_details, callback], that.definition.parameters, {__proto__: null, stack: stack}); return; } lastError.run(name, 'Unable to download all specified images.', stack, failure_function, [callback || function() {}, id]); }); }; } var handleCreate = genHandle('notifications.create', function(callback, id) { callback(id); }); var handleUpdate = genHandle('notifications.update', function(callback, id) { callback(false); }); var notificationsCustomHook = function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('create', handleCreate); apiFunctions.setHandleRequest('update', handleUpdate); }; binding.registerCustomHook(notificationsCustomHook); exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the omnibox API. Only injected into the v8 contexts // for extensions which have permission for the omnibox API. var binding = require('binding').Binding.create('omnibox'); var eventBindings = require('event_bindings'); var sendRequest = require('sendRequest').sendRequest; // Remove invalid characters from |text| so that it is suitable to use // for |AutocompleteMatch::contents|. function sanitizeString(text, shouldTrim) { // NOTE: This logic mirrors |AutocompleteMatch::SanitizeString()|. // 0x2028 = line separator; 0x2029 = paragraph separator. var kRemoveChars = /(\r|\n|\t|\u2028|\u2029)/gm; if (shouldTrim) text = text.trimLeft(); return text.replace(kRemoveChars, ''); } // Parses the xml syntax supported by omnibox suggestion results. Returns an // object with two properties: 'description', which is just the text content, // and 'descriptionStyles', which is an array of style objects in a format // understood by the C++ backend. function parseOmniboxDescription(input) { var domParser = new DOMParser(); // The XML parser requires a single top-level element, but we want to // support things like 'hello, world!'. So we wrap the // provided text in generated root level element. var root = domParser.parseFromString( '' + input + '', 'text/xml'); // DOMParser has a terrible error reporting facility. Errors come out nested // inside the returned document. var error = root.querySelector('parsererror div'); if (error) { throw new Error(error.textContent); } // Otherwise, it's valid, so build up the result. var result = { description: '', descriptionStyles: [] }; // Recursively walk the tree. function walk(node) { for (var i = 0, child; child = node.childNodes[i]; i++) { // Append text nodes to our description. if (child.nodeType == Node.TEXT_NODE) { var shouldTrim = result.description.length == 0; result.description += sanitizeString(child.nodeValue, shouldTrim); continue; } // Process and descend into a subset of recognized tags. if (child.nodeType == Node.ELEMENT_NODE && (child.nodeName == 'dim' || child.nodeName == 'match' || child.nodeName == 'url')) { var style = { 'type': child.nodeName, 'offset': result.description.length }; $Array.push(result.descriptionStyles, style); walk(child); style.length = result.description.length - style.offset; continue; } // Descend into all other nodes, even if they are unrecognized, for // forward compat. walk(child); } }; walk(root); return result; } binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setUpdateArgumentsPreValidate('setDefaultSuggestion', function(suggestResult) { if (suggestResult.content != undefined) { // null, etc. throw new Error( 'setDefaultSuggestion cannot contain the "content" field'); } return [suggestResult]; }); apiFunctions.setHandleRequest('setDefaultSuggestion', function(details) { var parseResult = parseOmniboxDescription(details.description); sendRequest(this.name, [parseResult], this.definition.parameters); }); apiFunctions.setUpdateArgumentsPostValidate( 'sendSuggestions', function(requestId, userSuggestions) { var suggestions = []; for (var i = 0; i < userSuggestions.length; i++) { var parseResult = parseOmniboxDescription( userSuggestions[i].description); parseResult.content = userSuggestions[i].content; $Array.push(suggestions, parseResult); } return [requestId, suggestions]; }); }); eventBindings.registerArgumentMassager('omnibox.onInputChanged', function(args, dispatch) { var text = args[0]; var requestId = args[1]; var suggestCallback = function(suggestions) { chrome.omnibox.sendSuggestions(requestId, suggestions); }; dispatch([text, suggestCallback]); }); exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the pageAction API. var binding = require('binding').Binding.create('pageAction'); var setIcon = require('setIcon').setIcon; var sendRequest = require('sendRequest').sendRequest; binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('setIcon', function(details, callback) { setIcon(details, function(args) { sendRequest(this.name, [args, callback], this.definition.parameters); }.bind(this)); }); }); exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the pageCapture API. var binding = require('binding').Binding.create('pageCapture'); var handleUncaughtException = require('uncaught_exception_handler').handle; var pageCaptureNatives = requireNative('page_capture'); var CreateBlob = pageCaptureNatives.CreateBlob; var SendResponseAck = pageCaptureNatives.SendResponseAck; binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setCustomCallback('saveAsMHTML', function(name, request, callback, response) { if (response) response = CreateBlob(response.mhtmlFilePath, response.mhtmlFileLength); try { callback(response); } catch (e) { handleUncaughtException( 'Error in chrome.pageCapture.saveAsMHTML callback', e, request.stack); } finally { // Notify the browser. Now that the blob is referenced from JavaScript, // the browser can drop its reference to it. SendResponseAck(request.id); } }); }); exports.$set('binding', binding.generate()); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the platformKeys API. var binding = require('binding').Binding.create('platformKeys'); var SubtleCrypto = require('platformKeys.SubtleCrypto').SubtleCrypto; var getPublicKey = require('platformKeys.getPublicKey').getPublicKey; var internalAPI = require('platformKeys.internalAPI'); var keyModule = require('platformKeys.Key'); var Key = keyModule.Key; var KeyType = keyModule.KeyType; var KeyUsage = keyModule.KeyUsage; function createPublicKey(publicKeySpki, algorithm) { return new Key(KeyType.public, publicKeySpki, algorithm, [KeyUsage.verify], true /* extractable */); } function createPrivateKey(publicKeySpki, algorithm) { return new Key(KeyType.private, publicKeySpki, algorithm, [KeyUsage.sign], false /* not extractable */); } binding.registerCustomHook(function(api) { var apiFunctions = api.apiFunctions; var subtleCrypto = new SubtleCrypto('' /* tokenId */); apiFunctions.setHandleRequest( 'selectClientCertificates', function(details, callback) { internalAPI.selectClientCertificates(details, function(matches) { if (chrome.runtime.lastError) { callback([]); return; } callback($Array.map(matches, function(match) { // internalAPI.selectClientCertificates returns publicExponent as // ArrayBuffer, but it should be a Uint8Array. if (match.keyAlgorithm.publicExponent) { match.keyAlgorithm.publicExponent = new Uint8Array(match.keyAlgorithm.publicExponent); } return match; })); }); }); apiFunctions.setHandleRequest( 'subtleCrypto', function() { return subtleCrypto }); apiFunctions.setHandleRequest( 'getKeyPair', function(cert, params, callback) { getPublicKey(cert, params, function(publicKey, algorithm) { if (chrome.runtime.lastError) { callback(); return; } callback(createPublicKey(publicKey, algorithm), createPrivateKey(publicKey, algorithm)); }); }); }); exports.$set('binding', binding.generate()); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var internalAPI = require('platformKeys.internalAPI'); var normalizeAlgorithm = requireNative('platform_keys_natives').NormalizeAlgorithm; // Returns the normalized parameters of |importParams|. // Any unknown parameters will be ignored. function normalizeImportParams(importParams) { if (!importParams.name || Object.prototype.toString.call(importParams.name) != '[object String]') { throw new Error('Algorithm: name: Missing or not a String'); } var filteredParams = { name: importParams.name }; var hashIsNone = false; if (importParams.hash) { if (importParams.hash.name.toLowerCase() === 'none') { hashIsNone = true; // Temporarily replace |hash| by a valid WebCrypto Hash for normalization. // This will be reverted to 'none' after normalization. filteredParams.hash = { name: 'SHA-1' }; } else { filteredParams.hash = { name: importParams.hash.name } } } // Apply WebCrypto's algorithm normalization. var resultParams = normalizeAlgorithm(filteredParams, 'ImportKey'); if (!resultParams ) { throw new Error('A required parameter was missing or out-of-range'); } if (hashIsNone) { resultParams.hash = { name: 'none' }; } return resultParams; } function combineAlgorithms(algorithm, importParams) { // internalAPI.getPublicKey returns publicExponent as ArrayBuffer, but it // should be a Uint8Array. if (algorithm.publicExponent) { algorithm.publicExponent = new Uint8Array(algorithm.publicExponent); } algorithm.hash = importParams.hash; return algorithm; } function getPublicKey(cert, importParams, callback) { importParams = normalizeImportParams(importParams); internalAPI.getPublicKey( cert, importParams.name, function(publicKey, algorithm) { if (chrome.runtime.lastError) { callback(); return; } var combinedAlgorithm = combineAlgorithms(algorithm, importParams); callback(publicKey, combinedAlgorithm); }); } exports.$set('getPublicKey', getPublicKey); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var binding = require('binding') .Binding.create('platformKeysInternal') .generate(); exports.$set('selectClientCertificates', binding.selectClientCertificates); exports.$set('sign', binding.sign); exports.$set('getPublicKey', binding.getPublicKey); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var utils = require('utils'); /** * Enum of possible key types (subset of WebCrypto.KeyType). * @enum {string} */ var KeyType = { __proto__: null, public: 'public', private: 'private' }; /** * Enum of possible key usages (subset of WebCrypto.KeyUsage). * @enum {string} */ var KeyUsage = { __proto__: null, sign: 'sign', verify: 'verify' }; /** * Implementation of WebCrypto.Key used in enterprise.platformKeys. * @param {KeyType} type The type of the new key. * @param {ArrayBuffer} publicKeySpki The Subject Public Key Info in DER * encoding. * @param {KeyAlgorithm} algorithm The algorithm identifier. * @param {KeyUsage[]} usages The allowed key usages. * @param {boolean} extractable Whether the key is extractable. * @constructor */ function KeyImpl(type, publicKeySpki, algorithm, usages, extractable) { this.type = type; this.spki = publicKeySpki; this.algorithm = algorithm; this.usages = usages; this.extractable = extractable; } $Object.setPrototypeOf(KeyImpl.prototype, null); /** * The public base class of Key. */ function KeyBase() {} KeyBase.prototype = { constructor: KeyBase, get algorithm() { return utils.deepCopy(privates(this).impl.algorithm); }, }; function Key() { privates(Key).constructPrivate(this, arguments); } utils.expose(Key, KeyImpl, { superclass: KeyBase, readonly: [ 'extractable', 'type', 'usages', ], }); /** * Returns |key|'s Subject Public Key Info. Throws an exception if |key| is not * a valid Key object. * @param {Key} key * @return {ArrayBuffer} The Subject Public Key Info in DER encoding of |key|. */ function getSpki(key) { if (!privates(key)) throw new Error('Invalid key object.'); var keyImpl = privates(key).impl; if (!keyImpl || !keyImpl.spki) throw new Error('Invalid key object.'); return keyImpl.spki; } exports.$set('Key', Key); exports.$set('KeyType', KeyType); exports.$set('KeyUsage', KeyUsage); exports.$set('getSpki', getSpki); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var utils = require('utils'); var internalAPI = require('platformKeys.internalAPI'); var keyModule = require('platformKeys.Key'); var getSpki = keyModule.getSpki; var KeyUsage = keyModule.KeyUsage; var normalizeAlgorithm = requireNative('platform_keys_natives').NormalizeAlgorithm; // This error is thrown by the internal and public API's token functions and // must be rethrown by this custom binding. Keep this in sync with the C++ part // of this API. var errorInvalidToken = 'The token is not valid.'; // The following errors are specified in WebCrypto. // TODO(pneubeck): These should be DOMExceptions. function CreateNotSupportedError() { return new Error('The algorithm is not supported'); } function CreateInvalidAccessError() { return new Error('The requested operation is not valid for the provided key'); } function CreateDataError() { return new Error('Data provided to an operation does not meet requirements'); } function CreateSyntaxError() { return new Error('A required parameter was missing or out-of-range'); } function CreateOperationError() { return new Error('The operation failed for an operation-specific reason'); } // Catches an |internalErrorInvalidToken|. If so, forwards it to |reject| and // returns true. function catchInvalidTokenError(reject) { if (chrome.runtime.lastError && chrome.runtime.lastError.message == errorInvalidToken) { reject(chrome.runtime.lastError); return true; } return false; } /** * Implementation of WebCrypto.SubtleCrypto used in platformKeys and * enterprise.platformKeys. * @param {string} tokenId The id of the backing Token. * @constructor */ function SubtleCryptoImpl(tokenId) { this.tokenId = tokenId; } $Object.setPrototypeOf(SubtleCryptoImpl.prototype, null); SubtleCryptoImpl.prototype.sign = function(algorithm, key, dataView) { var subtleCrypto = this; return new Promise(function(resolve, reject) { if (key.type != 'private' || key.usages.indexOf(KeyUsage.sign) == -1) throw CreateInvalidAccessError(); var normalizedAlgorithmParameters = normalizeAlgorithm(algorithm, 'Sign'); if (!normalizedAlgorithmParameters) { // TODO(pneubeck): It's not clear from the WebCrypto spec which error to // throw here. throw CreateSyntaxError(); } // Create an ArrayBuffer that equals the dataView. Note that dataView.buffer // might contain more data than dataView. var data = dataView.buffer.slice(dataView.byteOffset, dataView.byteOffset + dataView.byteLength); internalAPI.sign(subtleCrypto.tokenId, getSpki(key), key.algorithm.hash.name, data, function(signature) { if (catchInvalidTokenError(reject)) return; if (chrome.runtime.lastError) { reject(CreateOperationError()); return; } resolve(signature); }); }); }; SubtleCryptoImpl.prototype.exportKey = function(format, key) { return new Promise(function(resolve, reject) { if (format == 'pkcs8') { // Either key.type is not 'private' or the key is not extractable. In both // cases the error is the same. throw CreateInvalidAccessError(); } else if (format == 'spki') { if (key.type != 'public') throw CreateInvalidAccessError(); resolve(getSpki(key)); } else { // TODO(pneubeck): It should be possible to export to format 'jwk'. throw CreateNotSupportedError(); } }); }; function SubtleCrypto() { privates(SubtleCrypto).constructPrivate(this, arguments); } utils.expose(SubtleCrypto, SubtleCryptoImpl, { functions: [ 'sign', 'exportKey', ], }); // Required for subclassing. exports.$set('SubtleCryptoImpl', SubtleCryptoImpl); exports.$set('SubtleCrypto', SubtleCrypto); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Returns the intersection of the arrays |a| and |b|, which do not have to be // sorted. function intersect(a, b) { var result = []; for (var i = 0; i < a.length; i++) { if (b.indexOf(a[i]) >= 0) result.push(a[i]); } return result; }; exports.$set('intersect', intersect); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the syncFileSystem API. var binding = require('binding').Binding.create('syncFileSystem'); var eventBindings = require('event_bindings'); var fileSystemNatives = requireNative('file_system_natives'); var syncFileSystemNatives = requireNative('sync_file_system'); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; // Functions which take in an [instanceOf=FileEntry]. function bindFileEntryFunction(functionName) { apiFunctions.setUpdateArgumentsPostValidate( functionName, function(entry, callback) { var fileSystemUrl = entry.toURL(); return [fileSystemUrl, callback]; }); } $Array.forEach(['getFileStatus'], bindFileEntryFunction); // Functions which take in a FileEntry array. function bindFileEntryArrayFunction(functionName) { apiFunctions.setUpdateArgumentsPostValidate( functionName, function(entries, callback) { var fileSystemUrlArray = []; for (var i=0; i < entries.length; i++) { $Array.push(fileSystemUrlArray, entries[i].toURL()); } return [fileSystemUrlArray, callback]; }); } $Array.forEach(['getFileStatuses'], bindFileEntryArrayFunction); // Functions which take in an [instanceOf=DOMFileSystem]. function bindFileSystemFunction(functionName) { apiFunctions.setUpdateArgumentsPostValidate( functionName, function(filesystem, callback) { var fileSystemUrl = filesystem.root.toURL(); return [fileSystemUrl, callback]; }); } $Array.forEach(['getUsageAndQuota'], bindFileSystemFunction); // Functions which return an [instanceOf=DOMFileSystem]. apiFunctions.setCustomCallback('requestFileSystem', function(name, request, callback, response) { var result = null; if (response) { result = syncFileSystemNatives.GetSyncFileSystemObject( response.name, response.root); } if (callback) callback(result); }); // Functions which return an array of FileStatusInfo object // which has [instanceOf=FileEntry]. apiFunctions.setCustomCallback('getFileStatuses', function(name, request, callback, response) { var results = []; if (response) { for (var i = 0; i < response.length; i++) { var result = {}; var entry = response[i].entry; result.fileEntry = fileSystemNatives.GetFileEntry( entry.fileSystemType, entry.fileSystemName, entry.rootUrl, entry.filePath, entry.isDirectory); result.status = response[i].status; result.error = response[i].error; $Array.push(results, result); } } if (callback) callback(results); }); }); eventBindings.registerArgumentMassager( 'syncFileSystem.onFileStatusChanged', function(args, dispatch) { // Make FileEntry object using all the base string fields. var fileEntry = fileSystemNatives.GetFileEntry( args[0].fileSystemType, args[0].fileSystemName, args[0].rootUrl, args[0].filePath, args[0].isDirectory); // Combine into a single dictionary. var fileInfo = new Object(); fileInfo.fileEntry = fileEntry; fileInfo.status = args[1]; if (fileInfo.status == "synced") { fileInfo.action = args[2]; fileInfo.direction = args[3]; } dispatch([fileInfo]); }); exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the systemIndicator API. // TODO(dewittj) Refactor custom binding to reduce redundancy between the // extension action APIs. var binding = require('binding').Binding.create('systemIndicator'); var setIcon = require('setIcon').setIcon; var sendRequest = require('sendRequest').sendRequest; binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('setIcon', function(details, callback) { setIcon(details, function(args) { sendRequest(this.name, [args, callback], this.definition.parameters); }.bind(this)); }); }); exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Tab Capture API. var binding = require('binding').Binding.create('tabCapture'); var lastError = require('lastError'); binding.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; function proxyToGetUserMedia(name, request, callback, response) { if (!callback) return; if (!response) { // When the response is missing, runtime.lastError has already been set. // See chrome/browser/extensions/api/tab_capture/tab_capture_api.cc. callback(null); return; } // Convenience function for processing webkitGetUserMedia() error objects to // provide runtime.lastError messages for the tab capture API. function getErrorMessage(error, fallbackMessage) { if (!error || (typeof error.message != 'string')) return fallbackMessage; return error.message.replace(/(navigator\.)?(webkit)?GetUserMedia/gi, name); } var options = {}; if (response.audioConstraints) options.audio = response.audioConstraints; if (response.videoConstraints) options.video = response.videoConstraints; try { navigator.webkitGetUserMedia( options, function onSuccess(media_stream) { callback(media_stream); }, function onError(error) { lastError.run( name, getErrorMessage(error, "Failed to start MediaStream."), request.stack, function() { callback(null); }); }); } catch (error) { lastError.run(name, getErrorMessage(error, "Invalid argument(s)."), request.stack, function() { callback(null); }); } } apiFunctions.setCustomCallback('capture', proxyToGetUserMedia); apiFunctions.setCustomCallback('captureOffscreenTab', proxyToGetUserMedia); }); exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the tabs API. var binding = require('binding').Binding.create('tabs'); var messaging = require('messaging'); var tabsNatives = requireNative('tabs'); var OpenChannelToTab = tabsNatives.OpenChannelToTab; var sendRequestIsDisabled = requireNative('process').IsSendRequestDisabled(); var forEach = require('utils').forEach; binding.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; var tabs = bindingsAPI.compiledApi; apiFunctions.setHandleRequest('connect', function(tabId, connectInfo) { var name = ''; var frameId = -1; if (connectInfo) { name = connectInfo.name || name; frameId = connectInfo.frameId; if (typeof frameId == 'undefined' || frameId < 0) frameId = -1; } var portId = OpenChannelToTab(tabId, frameId, extensionId, name); return messaging.createPort(portId, name); }); apiFunctions.setHandleRequest('sendRequest', function(tabId, request, responseCallback) { if (sendRequestIsDisabled) throw new Error(sendRequestIsDisabled); var port = tabs.connect(tabId, {name: messaging.kRequestChannel}); messaging.sendMessageImpl(port, request, responseCallback); }); apiFunctions.setHandleRequest('sendMessage', function(tabId, message, options, responseCallback) { var connectInfo = { name: messaging.kMessageChannel }; if (options) { forEach(options, function(k, v) { connectInfo[k] = v; }); } var port = tabs.connect(tabId, connectInfo); messaging.sendMessageImpl(port, message, responseCallback); }); }); exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. function watchForTag(tagName, cb) { if (!document.body) return; function findChildTags(queryNode) { $Array.forEach(queryNode.querySelectorAll(tagName), function(node) { cb(node); }); } // Query tags already in the document. findChildTags(document.body); // Observe the tags added later. var documentObserver = new MutationObserver(function(mutations) { $Array.forEach(mutations, function(mutation) { $Array.forEach(mutation.addedNodes, function(addedNode) { if (addedNode.nodeType == Node.ELEMENT_NODE) { if (addedNode.tagName == tagName) cb(addedNode); findChildTags(addedNode); } }); }); }); documentObserver.observe(document, {subtree: true, childList: true}); } // Expose a function to watch the |tagName| introduction via mutation observer. // // We employee mutation observer to watch on any introduction of |tagName| // within document so that we may handle it accordingly (either creating it or // reporting error due to lack of permission). // Think carefully about when to call this. On one hand, mutation observer // functions on document, so we need to make sure document is finished // parsing. To satisfy this, document.readyState has to be "interactive" or // after. On the other hand, we intend to do this as early as possible so that // developer would have no chance to bring in any conflicted property. To meet // this requirement, we choose "readystatechange" event of window and use // capturing way. function addTagWatcher(tagName, cb) { var useCapture = true; window.addEventListener('readystatechange', function listener(event) { if (document.readyState == 'loading') return; watchForTag(tagName, cb); window.removeEventListener(event.type, listener, useCapture); }, useCapture); } exports.$set('addTagWatcher', addTagWatcher); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var binding = require('binding').Binding.create('terminalPrivate'); var eventBindings = require('event_bindings'); // Custom bindings for chrome.terminalPrivate API. eventBindings.registerArgumentMassager('terminalPrivate.onProcessOutput', function(args, dispatch) { var tabId = args[0]; var terminalId = args[1]; try { // Remove tabId from event args, as it's not expected by listeners. dispatch(args.slice(1)); } finally { chrome.terminalPrivate.ackOutput(tabId, terminalId); } }); exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the tts API. var binding = require('binding').Binding.create('tts'); var idGenerator = requireNative('id_generator'); var sendRequest = require('sendRequest').sendRequest; var lazyBG = requireNative('lazy_background_page'); binding.registerCustomHook(function(api) { var apiFunctions = api.apiFunctions; var tts = api.compiledApi; var handlers = {}; function ttsEventListener(event) { var eventHandler = handlers[event.srcId]; if (eventHandler) { eventHandler({ type: event.type, charIndex: event.charIndex, errorMessage: event.errorMessage }); if (event.isFinalEvent) { delete handlers[event.srcId]; // Balanced in 'speak' handler. lazyBG.DecrementKeepaliveCount(); } } } // This file will get run if an extension needs the ttsEngine permission, but // it doesn't necessarily have the tts permission. If it doesn't, trying to // add a listener to chrome.tts.onEvent will fail. // See http://crbug.com/122474. try { tts.onEvent.addListener(ttsEventListener); } catch (e) {} apiFunctions.setHandleRequest('speak', function() { var args = arguments; if (args.length > 1 && args[1] && args[1].onEvent) { var id = idGenerator.GetNextId(); args[1].srcId = id; handlers[id] = args[1].onEvent; // Keep the page alive until the event finishes. // Balanced in eventHandler. lazyBG.IncrementKeepaliveCount(); } sendRequest(this.name, args, this.definition.parameters); return id; }); }); exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the ttsEngine API. var binding = require('binding').Binding.create('ttsEngine'); var eventBindings = require('event_bindings'); eventBindings.registerArgumentMassager('ttsEngine.onSpeak', function(args, dispatch) { var text = args[0]; var options = args[1]; var requestId = args[2]; var sendTtsEvent = function(event) { chrome.ttsEngine.sendTtsEvent(requestId, event); }; dispatch([text, options, sendTtsEvent]); }); exports.$set('binding', binding.generate()); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the webrtcDesktopCapturePrivate API. var binding = require('binding').Binding.create('webrtcDesktopCapturePrivate'); var sendRequest = require('sendRequest').sendRequest; var idGenerator = requireNative('id_generator'); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var pendingRequests = {}; function onRequestResult(id, result) { if (id in pendingRequests) { var callback = pendingRequests[id]; delete pendingRequests[id]; callback(result); } } apiFunctions.setHandleRequest('chooseDesktopMedia', function(sources, request, callback) { var id = idGenerator.GetNextId(); pendingRequests[id] = callback; sendRequest(this.name, [id, sources, request, onRequestResult.bind(null, id)], this.definition.parameters); return id; }); apiFunctions.setHandleRequest('cancelChooseDesktopMedia', function(id) { if (id in pendingRequests) { delete pendingRequests[id]; sendRequest(this.name, [id], this.definition.parameters); } }); }); exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the webstore API. var webstoreNatives = requireNative('webstore'); var Event = require('event_bindings').Event; function Installer() { this._pendingInstall = null; this.onInstallStageChanged = new Event(null, [{name: 'stage', type: 'string'}], {unmanaged: true}); this.onDownloadProgress = new Event(null, [{name: 'progress', type: 'number'}], {unmanaged: true}); } Installer.prototype.install = function(url, onSuccess, onFailure) { if (this._pendingInstall) throw new Error('A Chrome Web Store installation is already pending.'); if (url !== undefined && typeof(url) !== 'string') { throw new Error( 'The Chrome Web Store item link URL parameter must be a string.'); } if (onSuccess !== undefined && typeof(onSuccess) !== 'function') throw new Error('The success callback parameter must be a function.'); if (onFailure !== undefined && typeof(onFailure) !== 'function') throw new Error('The failure callback parameter must be a function.'); // Since we call Install() with a bool for if we have listeners, listeners // must be set prior to the inline installation starting (this is also // noted in the Event documentation in // chrome/common/extensions/api/webstore.json). var installId = webstoreNatives.Install( this.onInstallStageChanged.hasListeners(), this.onDownloadProgress.hasListeners(), url, onSuccess, onFailure); if (installId !== undefined) { this._pendingInstall = { installId: installId, onSuccess: onSuccess, onFailure: onFailure }; } }; Installer.prototype.onInstallResponse = function(installId, success, error, resultCode) { var pendingInstall = this._pendingInstall; if (!pendingInstall || pendingInstall.installId != installId) { // TODO(kalman): should this be an error? return; } try { if (success && pendingInstall.onSuccess) pendingInstall.onSuccess(); else if (!success && pendingInstall.onFailure) pendingInstall.onFailure(error, resultCode); } catch (e) { console.error('Exception in chrome.webstore.install response handler: ' + e.stack); } finally { this._pendingInstall = null; } }; Installer.prototype.onInstallStageChanged = function(installStage) { this.onInstallStageChanged.dispatch(installStage); }; Installer.prototype.onDownloadProgress = function(progress) { this.onDownloadProgress.dispatch(progress); }; var installer = new Installer(); var chromeWebstore = { install: function (url, onSuccess, onFailure) { installer.install(url, onSuccess, onFailure); }, onInstallStageChanged: installer.onInstallStageChanged, onDownloadProgress: installer.onDownloadProgress }; exports.$set('binding', chromeWebstore); // Called by webstore_bindings.cc. exports.onInstallResponse = Installer.prototype.onInstallResponse.bind(installer); exports.onInstallStageChanged = Installer.prototype.onInstallStageChanged.bind(installer); exports.onDownloadProgress = Installer.prototype.onDownloadProgress.bind(installer); PNG  IHDR**o`IDATx^1 C n.3(A$ހC;ߎDŽ,`N3QlyJ Ag uJ!C7'*膟.Ms *IENDB`PNG  IHDRJAuIDATx^Qj1@Q! ## K($y ,;ltYvBzO(#DQ6&}ɝE'̲ ,9VF|۲&ï&~! jY͑aRoFZ7'!fg7m>w%Za--4ȿޤI]IENDB`PNG  IHDR&N:IDAT(SI/CQ_ 6XX"$j5THMXAՐVU hQo,9ϳ9P DTF?e?1)CQW|~8NLI޼ːn!z89}3jؗAJvwG"lEpC.[fۊgk^K?!s K/O2OfqpEV74:D,GH}. vv!R!yDGDĊrC48H{Oh娛45b6$\n籰ےWȕȠ~  W6d;dZ FPT5ͅZXO8]gdlB4nߊ#w>Pgg;̠u[,*e;5 IENDB`PNG  IHDR qIDATx^ATqyYeY"bY":EZ"JSt:DZQ5EtS=-tZ c^a;L3}~|N_;_۪FYMWT?xfF6lFs?T‡$~\A;BnUF@A@A@A@A@A@[c1P[q ŷ1x7c%9;)^^46?oz++ƙ 9c3;¹BP~c9jA.^15ߍֻKQkMLQu?] B?ꞥ(K^( {H;5L-gQO# A0Yvg?FF@#O# 8A#qw:O#&oA hA#7 FpGAp44F@#hFF@## 8A#gF%4~h(9 A#ho-oF#Zmone+-..Blv2P~r& ^_ݨsw'6v4l5pm~;—xuͳk~]}p;^0f5G8tAabKGD pHYs  IDATx 1tLdM˜hhGNjz@ @ @ @ @ @ @ (pIENDB`PNG  IHDRׁSPLTEwwIStRNS 3$ 6*~0휽?c9u{N2gT0f8 G{N:+/ J f#cS>ؘu^Cc ك+m: 9i'nJp f#1UScI$3% ]$ҿt'yҴ8Ns `IȊ& ;;; 7=`I(n2p$  7A.ph%N} &#T?]}sw5{REQEQEQT(ӑvQIENDB`PNG  IHDR>abKGD pHYs  IDATx!Of "P(E4o4Q"DDA!Illwlwr|<+s66Yu&T?[:s27U=Z]vyU,Vugc3Xcu `W7ݶ83uUgmrnKS=R]չ:asXj- `RTGm|flV7v07uVglnK]ݯx 3XSuɓ:S8Utv:) `o5ǩsX8N@[ eu7?yKOL ?CخU=yN6x1dh^ s/ suVS=|"fh>58E 5c 1c1c1&v!:kIENDB`PNG  IHDRIDATx^ Ka(BA&QFb(F(EQEQaLY+eͮ0slmٹoCg~v`<``````````````ADwQ1"LZ(." #B'n!&q>_{Kn NiG*t7nC8h p TSSNbA!fѫ'OUue!^UBeq^?By(FROų'A̡~gd#x!M;5)FyzAAJg-=wHvۣ?"[U+. a'ЋF!ᒴYDvΣxa?ڤJS!fҌ% FAXl5#lKCxc?&= !ԌgHǙZ,A6|_+4#l!;B5{rJ!Ԍ# !;-Ё]la wG_Zܾag`````````````/ IENDB`PNG  IHDR4ELIDATx^ad\Y2  !B(%P2RJ)!,PPJ J RJ%PB(%,%nwF&&mFt^o$gvܻ|L̹sֳհ ˰ ˰ jXeXeXe5,2,2,òaaaY ˰ k̒7,+%rwyfX. 3pb=B X"> </( +St`X|ORzr@WyM1X9֠X+g lu $cل,W'йT-_"b8XTU8u=󆾤a B)+da]dGQb )j1av%UKXE IR.QV8VVLk$(I±!JV*u:QO5A\hX?S}d.S {Yk0tc iA{ K"+V]':2iR =Y-+-d-{7\9!Yuluh,ݑ%52`Óuޝ+hǎjx5>%7m(oeXy'^FĹi`~okźM(Vx&c5N)5;w:"۞I ԑi? #H^ wNXn=/ARocip,wj撰w''= V-(rλoJ.+KD2XrfY\s`0mY+|_ op T١b9B'b[?Suhq=ǫdX\k5{$W[X^H*nHGRe'|/M"&sآDGiX[\X3&: Q?r&$ ƲsJܰNεhX[Afİ\vYv[W)Ӽbr ˰ ˰ jeXeXe52,2,òaaaY ˰ ˰<IENDB`PNG  IHDR>abKGD pHYs  IDATxϋVU13q$DOq)jiĕF%pN"m72  s܁wӼs{}ys]@DDDDDDDDDDDDDDDDDDDDDDDDDDDCcB rF'@1p;ל 0x=9K{|^SA`3Y@Q]g6koם -`G(@ |謷8 <p[~Do)B O`r$$QݦѲ0P{}πҢ#@;O l0_e{G6'%Ԃ`#`L)@A`5~x-vrB??lz b> 0n `\o +>5ɆOX M l(yDj}*ЏOL+.O+;X@Om*fʮ}  l˜W|y P;}aH ?&UI/CEt"6W ?'ƐZ ? `}p짆9y p(8Թy p>8Ö OǾ~HG S )tp싛ؠ ~((~ pΟ`7`ֺbP`2U !-a=ໄ1G6T/MQ'ЉV&wXD~N}g\3|84 mRLA *Dd )^CyHT $}H}7& jjo#Gf(A xXṭwA ˚0 $~?+c:&Av>}iTNm)`r F$m_5 csFy{7C jw\ !p~ 0 \>r)?<.;|V9#`Y zIENDB`PNG  IHDR4EIDATx^]d$Y4M3&4!W C\ ˲,{r5 !,Ye^-0 !Uaz2IKst.usS{ynI>5FK KX%,a KXR%,a)a KX%Y(!ea{E-,_4'^ au+[ ²=tiWX[ tT5V산4+M%@Xi7{iV82TX <Fi U8Vx9lX9q:J- Ã5K bs[[0XsD*>`csRw_1X_T`9%mg+"`efPCLeyDz Lkѥj'tgRL9P.x*̚**',u)YZ|=)Um?V6۔|"Y!X9~g׮[êIM sSp:)°fhS\ܚa=mn2m 1kXQ|azk"HA(;Pgn VflCǣeG2 28gn,-8M{#΍+8}QK.BKU0o u6.N3]>Oʨcyqe#@K5*N+d5p7;H3:Xf;}KTk2X-BKzL wMU"HCCbq\k ll1]^efph/b*a_] mo+b2դ\`^yw}߃:c@7v)3:T2O'Y,$kŦV4郰r3\JV9V\9ܠNcalÝ]r ĝ +`60 a7ɥw+ںNYX-OUr%,%a KX%,a K@XD ,a KXR?XIENDB`PNG  IHDR4EIDATx^g\]0 a(%U!dmVR YuUJ *PBȪRJB(%BHMɏI&ݪks94?x1qNS @XJX%,%,a KX%,a K KX%,a== l1$gjIa6խ;auV ݶlGSuVn < Į ۆJX k_ Rb.;@XLAiP +)5aoVjºMR]ֺXWPšT.10TXJ(6TXe*̄5M]y6(MV1hEnFiU&Z sk&vkBJkZΏahX19 n0G 6"nuJû3e+ 6f2Xn;P'ޝ,lb7betX'{Ƣȗw FXqI]{ af:ݱk4aM$AbՉ}sa]XdX15ұfJԨzwhl [a,VȻʼ7 @XEQXD{?]S2nfb&C>c9Y_$ƹݢs1nb7מjX`p ;5g]S,7ܗ{kTRKX$V[~wE,׊с\ˆKX<Ŵ/,S׆KXj r}n'Yzy-ӯ"Uhp <Մh3aeTIq- +^Ko+~z!a{{z%,a K@XD ,a KXR"%,a)KXOeceIENDB`PNG  IHDR4EIDATx^ggC(e0eQ(ir(#PePJ RB)F*e4B.;푓,99^nv{r7y.)??xy~zS ,a)a KX%,a KXJX%,%,a KX]4uru.݃] +ݡ|͑&;V nD\X8GyX߁ +PwE0b*:b*kLX1<F xŚFEXթ`'ՈV ^x:JcD[uoXWjX: `դ#}U |5&5`T8 3|jTF͘ A}@뒝gPs0HS8D D3gw4p-X69ZR w`]j6%cե9XWLT,KSy²SuN NB|UNUZ`٩~uezGU~9*)SU6Xv̰V(fl<_eՁ86!fU}B`㨭̰*z~ us=>G Bj,?KcFޗB#"*{C~&maFv #O$qD ,a KXR"%,a)KX%,a KX29IENDB`PNG  IHDR>abKGD pHYs  IDATxkA;hxI\@/%"'=zqM/ =( FA9 H_A !*>ݦ_aƞꞆ7KNIo8Sw$}!J =}\lLaj /T Kr]J2)~dd,7B%5!@%=|Vп靊75w :d13eJPgLHHF2@%~TD2I&A({R& _)g 1ktF͒ɧ~tI Ez$$_%Xˤ @^3WէUHn:9heKК&K~({0%h%H){~u$سJ1{&VW) A=ϐQWHS %`%Kxݰ=w(/L y,Yk^w3ٗl`9.ir$eɝEi#@`kVZ$p-=mF8%hQ K?' N )} Sgso┠iA8%< N y:ݞ"@S\>%$S+X6u!@)r{mP|^R#"R1]x<.C"$H%VBJ o {4 B / 57t @(A[B @ -&[u`S-I:pO7G )N&Y!rXxJ :H0$ȸ  X uKPMCel/OQ{a{ MJFSSS%%Cm uH8n٬x(☬Hw$3% p < `>lL Axk_I$8q,3mH$8go<-42Ij e&ÏDPW@["Y_0OPz)Ï@jVEd.XNoIENDB`PNG  IHDR4EIDATx^oU閂* C$M$(! Ej h-V w/1&b+mRvNnf9lgL53'ܝʹ'w<$O ˰,2,2,2,˰ ˰ ˰ 2,2,2,ò ˰ ˰ ˰,2,j1v +45M<)Уnba5.i9Ê$MtbC6z@团}Y:)*!X@r,֎ c1n 9S(S>ԋu>XP`__dXL:XKUc.JD h:KTz*+Z~Aer\oST)]X{kD̅pgRU t_.]a -Ֆ SڅLQ#N]TkINu ku ,^ SU[)񄮁6 P%%5[1Ub XݺgT[p\whNh*nUT2UaATVR>jݹxE$UCh"~JQ}T5X)ciӿkAZkU\)!Ol5Sy9Y҂HZs S)e*ʩG!,9wx6Uư.DP}g.0]OFQ]źdo_݌` wk_9|\%;+XWt?3'X_5q W^ua>"}2'U$>~a?@ţ8i:@oCtqPO{;{  xOE`gA~U3ǸǷ(qWHoepelD0ހƃrWa@ٌ )p^Mt|= i'0w~|ϡw6$"jڍW(H,م㽳a +:/{gSUv[.zQQDul|cZ:8j43~tT CAq ӱMjLiC!ZSTh$Q0m2t*BLQRtN?E&uqs6qJN'cmSJV /9FĴ簾j>}^r=YCCCٖ-[o߾\fACKyl3vΜ9iAAA\m5<|( yqm޼wKyyyȨ7`Y) ^^VnўÇg 2-vҥҙ3gĉm |;F张<3fܷoV",Yhf`c& #~+VS)5kAo"/tnޏpQF/.]@eEy/@˃;~NT0O9>\[[Hdbޏ 6~<#pCG:$J{?^zćmV6Lߣ:2l|:Gs[.M<<|Z ׮]<OD߼ x?Vz]cVZOCh _^o)u0 2O>bȮkbSO& ,(cè /A%k?{ahZr$'T"+@iҤ>U`<v64xdx֬Y:tT&V%?"7o.twBӐF/Νx22̬%_ v9ظyРAsOO'=^Z^y`y䳯?G{BԚ.Ջ??eW"%@alx<Hn7t>ǔ<˞& gLI (x?˰ @kkk7D@([,K!V?r7 W30chaDRԆijZ7*taݾJ0ΟbJ=5`x@3 ~MBHߐ>Q0Πl\zy.H< / o '9e. (Q Vk=O|r~u:b @+BKà'b>LxHr@ XǏՁ4ch`j.@'8QߴbcOǸVJy?DGGqGql=Sڰ  |MXt3O>= U_A4QqA~%v^iii#φrNcѿzfT{6C }v,R)8$'z{)X7mh{K-7775%%3T[)c,Dg"J4k8HT@Lw>vtI;)VZWG%]%oڰ/[Naݔ$9mt~ܹ &R,)US=?٘%-ӱ@\RRR4A0QE$k {bSpDT;:GnBGDi/PTJjm#""` ٓ~5ӧbq݀uÂ.5]r5wm*8́ <#vMOl43tg={jȰt{q~ ɱ[{CY]ˀ-Gv8#Z1|ذaoMڈrhdցi.0)S Kz`DB#WTT,^Nc*x#&s '*h |,iPQ K;1 A!nCNW?T@;boFyֲeˎUSw] .q.<L81 Ԕ#G&3gΔ @x w) yM"eȎ; 233, :_V() 6R$,,l=… Gpu!;kV_{?/8N0wvv1Ná{^@u\9reBF@P`V;re?deeBqcb8R!T F<ːKxGkc222N蒁 B Fa湳N8ʏA,㘦e?/* /5si k2m{k` 47qwwsaIu76o-Ci-`004>S]C Ql\R@ eG/14J/Cq,|)|GHj  QD&qB@8F/@ ``t |pxp >VS0 >qjTӔc cc8@26_@K݀@/#dՎR=>jBT_Gk zt)o$OdP!Ĉ{8p(L(0> |)!W#k'%z| 2$7/Zw3kLpamz e K0@F1@%hRz/@ȢL` @_$ֱ_C:n?)gIENDB`PNG  IHDR00WbKGD pHYs  IDAThMN@P/`WڄB.z4K W~$J4v:4fl@A GZtND;JmP0_k2uVb;C^;N ͸138K  `f dFB T W+P4/ſ 4iU0W?@#%>:%gGUF+Pc^R :R r}:֦s*&r>LKWIENDB`PNG  IHDRxx9d6lIDATx^A@aSӛwFBa⢲ijGZp$]o+'Á ix,fxf>j h;S9E{T뻴 *(@;11 k.oz˰Dh9rFZ`h4Úv{>0MwpCsd=M 8 f#L;&'2 rw1UeWs' uFEZ5&:Ʉ2 -#N HQǪTG55|D0U > *piI}9w{;9瞏^{#$ޅ9v؀kF80k׮;w={SE}ܹs_ƞ , Y0K]|y… ;0~/P/Ǐ߼ygW'd` QXT9 ϟ?ބ r5Mp Z*** %ob}cK2ԩSY0P>4zi yvyW$`襥Ys}SL٦rȕ_BDAG:`:וxIII(m綵pj@6R;wuKK(VL3eO’7Kd .Y}S0&?9sf2<2Xe4 gMD1ŌIˊ[ZZGwΝf LZL66 X=Ռ޽; Ei&׷M\EDRM;j&j˚,z? 夙^{D1ύk{=\I.9\u JpA{칀祙E L((@ 2&+&*V$ߎ1S>z߼y`!kjjQ]8 4`T|%Ifɳ7<#ɥLhB iBt4Uz!Ij!R0;w(vؾ.N`lX]Qt~UעL|J`%6Y>|p NokѨp=J׮]b̘1; L5iRTTTׯ_q2Ѳ6v{4YC8Qze[F' ^TV&R%v֭yLî uuuqx}K ;v| p` Xٳ}߾}ىt@l6X]ms]c7?E?LIڟe` ;'IHH76Q h0G]NwuXOhܞ00 EX"m 0V /3J:۴-񽤤dr||ܴ+&ـ,D*-7eY1}Bk1/ըpl*((I4_ACw6셶YyиP֭[,+랄94ZjK,>]2Yɠ,"`o{w0 a N@($yv!y0ѫV{ˣ_7۫H#7B-w{оz>F^A d2B}oW+;8vNHv99N9?/9V)v leG=| ս {>o :Z}gxO).;kRibV'B_zxFq;PqPvMq灍l^@;oA^nqj~#h @rȮo'S,ĭJ܁;;>BE`0 X7 ؀;\ `֩ < l-\㻧PlXfX#w#wh6>j{"pG6>XOA7vxڰ |} QJB J`c 40tD ~NL?̷X IENDB`PNG  IHDR00WbKGD pHYs  IDAThMN@P/`WڄB.z4K W~$J4v:4fl@A GZtND;JmP0_k2uVb;C^;N ͸138K  `f dFB T W+P4/ſ 4iU0W?@#%>:%gGUF+Pc^R :R r}:֦s*&r>LKWIENDB`PNG  IHDRxxmY IDATx^N1Q<þ +\RT9r dǩuik=} 7=p;[>o_O=(L33Ԣ.By5lp͡*h`bR=\z=t 61GAvUlȼQ6 .cwm pc)VT"blp΍'{D; .b] [씱)Jpw&蔉%UM'| .6&9׸‚ځt lsLpSvq/6y$з;[hlspYݽVQ}q)ENOoV(D[%Vk+r) fH'F|Dc5H"F)i{ڞz2`|Zsf:Ѱ+3]_릾1gմmTghl@F\d KBc  khjoY ˹ȖfumUoW0؄Fh``˳=XfN͓Kt44Z۟Lu9MFZ+&г ֖KjU7UV p^x" `aeQC@>س/fSl V)u }S0"%G'Qz, k@`}ey=N ΝNO.Z\xx _)_pzi”$p3|zᲔ"plNՕש9)_\[(~Z4KrwX.liY,-Iv:Vk8x-\*Vbr1#G]zSKm }mSsoTxcNjsTqr  Q{KՏGَK`-N enCxLÞNʌ`-7~h|kB.HϹ+?OX[|*:v=Rl1M]U0r/;t8גT-NA{~MnjZd<9MIfoJnQyȗmhye.ZnmѸ=vF> &XM3.жnwTCkkR?dy=c*zN='qˀ|?[x!ٵbu^4&]'~S,gXeDwW)cm>jU>b?4c\\Z .nՂ?`U^5m4rΕGo>jvjFpt{ץMfb? ztd ]xjepz0c=+,H/l56yTFP_RK[_ dl^uC0ͿZg Se0,5zX#Z$^˧p4ؠ{zx9khMpI*α0]f{q v+>|t^ŃƩm?m׶ZH^&3*\y#kmm&жJQBU]wR.JJH^BIzN8lkD`@5؆ 2%AmS\WuJ(%k hSetC"%T ȪF#) sHLWx (rk?^,dB=auy*_}J ZkU3\a˳&GP`;҇j7(<,g37  s66Q-J"E$KjmBP3㸉ĉ(#;:*=ʓ>3Oq-%kmMCGM)Ny 6w2b-MdumB`XCp=fY*#*9mֶ N^?=?UʟnjlO4Ï*N&@mH-K+jː8ph|F؀ G3:5{A/ڞr}KzFH(VLm;yz&dkR:Ӷ֖A7߆@3Y$\ۦ#0HTt8^ zBdH$xe =H v=b)f`PK Hn Hƻ1Fn+=o_đ/=$O" '@~mK`WwSt꿁Z3wxܱ-oӥ4Z;8)$LR "JEms&N7XQۓR4XN+ hC2޹Zek=I39+Luϳm>i9L@ f%}d䐴1e NR~-,a*o76,/-c37&'m/A%J8 j0銪 k2ab'm=D<\kms貢!9ːJ<TmH[qt] &k V6#mɣ0kLmq1R)D)ҥHgʀi,J[W kwB%"@Agi,-f1Pڶ !"EYo}B'z'dPba]a 'ZvEƗ [0DPD]+cXF;LZEn9L$648gtC9 3]8#YmkJ#V[73|FeHeIqv.MVvL0M]5s)4$5;t^yD7j['EQ9A`X'%ЖC4H3L$gE"(3TA[\9VC`ك$qz`An"NzR ݱ-Bsл@N [yQbĭ>b"h($.t{s:D{CVQN$,ۊhIfa9urtw]K!߿% tdI7c֫R'+gI1b6rXF_')/e%ޝPdzÄy!=EfV2`#s<z3)>/s C<Ƴb7ƱGv4WYbI|Q\v@@u9;c6lذa6lذ6aÆ 6aÆ 6aÆ 6aÆ 2Tx|IENDB`PNG  IHDR>abKGD pHYs  TIDATxAjacH[Q  ݔхx;=CWP7A B*TL3˗w~?HI,dCIvt`d ?Hr _4Ij] Ē$ɠ&[3 Ʌ<,2;I |sVCWyjEvi X=F @ @ @6I&ydI&yf :M+yõ+\q A ?=R|G}+-b(#ن x; @ x#ApnA`EtkQ `n^p-o >Wwܞl1lg e$^M+#####@ @ lQ?-r6EG~N-65H2W˦ucK]zI$$X™$45JrҒ䰩]$y[>7s0Jr,[dIENDB`PNG  IHDR\l+PLTEyyyyyDxtRNSbiofU}z^]pm{~3R)ka86n`Y1Z> g-x|W*;uDy $'M$P$ zˉ3FafZi(Rn柫wl (WASLAviyTNuO<"0Td`&/uy4ޡNl<4T7TʶQf"9TVzT:GDNu+Ptb*˭nf\Q X5Ui:]A.%pKӱP.=<67AO)ͣ9VemGr\:FЩCq+zTo.[[D]7^-t`8q7tT Ni->ODNa QaIc1ͭٓ` *{ A=\&9p 81Vfn^O*.5Q] X h*& ~`UჁ@8+Sͣ,/m85_ܦ ӱLL".sOp 9v&Ob!m3ݳ\.mUʻ PǪ^unprY׾.1㓪\SX}E3L7aEyѥuLO9dܧ-ZDp_tʺygD!608VCja1g݊(F|9' [q@t[.oBKyo7Erwww my[ 5gAf=" AR>ݎ:769e \Qn7q':٢qtyM~ KOʁ] ]d.vH&O.:b?mܭ 01|'FۗسkobN.Z1ȶRU2lNƉLe:69082~?/}+yxD3؝$ƢtPBL8G^s䊕rJ?"oD%DK7L;4Bglnp(KpQQ]쭣j!:GáP(QCGNB#d{\`E>ZBwC?'ա)+{1sz]@ Tv: UAPȿn̤sAj}f>^{ abKGD pHYs  Ʒ.TUV } A+A+(bT͹dNN}0˞QIgf̊\nW#|"`c sQAxV45`)*=GrB"o"(=X)9q+9_aD@xl{G.Bh@ 8G #@p/ӆ@< 8G.p 8 =,|?o97TC֘J=j5.ЈBp0@@h h,a4}? `:TBP4%(`RO r]lp짋%v>&h@`2Z@} S _OahʬQ-x 9QB Z5`\ Rrɷod15M#\ pY8p=Z>,`6p&G #@p@ 8G #@p9 ؍&ज़L_M`qGw\/mSG"i@wE "z)(kӁub"p#p#p#8JY~"yE4NIENDB`PNG  IHDRׁPLTEwwwwFFFEEEDDDIIILLLJJJMMMVVVcccQQQGGGXXXnnn髫ppp՝xxxlll___OOOgggdddRRRZZZfffuuuYYYKKKPPPTTTwww```쒒E G%tRNSix?-b LfHH1CWJ0m(IMj) (DŽ(`ҕiC P2WeH%T!=J@=aBRE `> z°?fPp0G9:|%?}\2S$aJu}UU 7tEQt;:XU1*%T$<|%T'DݺI%(?v ՅLH<]g^d'px7I[UjȼIENDB`PNG  IHDR>abKGD pHYs  IDATxܱ  +PPNweD$囶G @ M/`_ ~/`@ @ @Q @ @0 ʩ4y@7IENDB`PNG  IHDR>abKGD pHYs  IDATxڱ E̙ ,w6yUtXM~@ k @  ! @ { @ Kʩ4y{IENDB`PNG  IHDR``HKIDATx=HQq(^@RZ ^H()B0Z- ]l(kKKfAQ%zmSsy~sy6`| 0 0 0b 0 0 1ߓ4A:-b0-zIc񀓬N)si49&@3ʮ VGE^Qa鼦==<+E~fȦJ_Jx WI64Fieln (Q ԟg\0Fwݓi4U*=e;o=ECzf&ь"M|f|Bs5~E.8APISЌƶqda4c\dG69y&^CjsWN sfM,[˴ehI~Vv)O,2D+ )]/ (sZi|#T)/;'&fs"N\e Ǥ< rJN/#R89#v"@"c``UǩIENDB`PNG  IHDR>abKGD pHYs  IDATx[MQLJaf눔Kry3&OI!ID.o(4 e4"n 5%"&rd܆|+I^{~N^^{}DK$"A9F1+y ${%LjcW'g3 $@-e'Hڙ >Pde-5>De-M>De-m>e!          b#"y(i\l,J ~uldS,:dd $STKJIz @|VXշb DD)@*%\LIKz"@+fHIJ2[g$%{$Ґ୑ n6_2ݮ~)8-$%Y47NrI$;Cht x@\ !A>Gn$85W A5JZɔtN2lJ z +z10DCJ >$-}! +?1hRiz\@:-@*͒Y>E[rߊ-)R~VA/ W+Q,E0y$Uz|8Ph$fQFr=OǼU\R[*/pE2cZϣ( B )uk"E흊Z  >É7 Z PSQQg"D[9s%Oqf`V \Gu@H˕;LUԙir{7:ۢXhvԨB4a'urYDz8-Bݎ 3 W0Qc%VՊ=zGv{ZW5J X +T). 5n8jTf\5&opu<n\09uQcc11'_(GjG3/{$@{Y=`*/9Ɨ:HZ_V4u& lv.x׀=u*v}1k- t ^y6Gt=> 1hkW2K':IENDB`PNG  IHDR``w8@IDATxMHTQq5Q+(2B"EH(BP7M2E6 [`)D(0 ",dӳ{}s"2f@@D@@D@@D@@D@@vM0) PTx@@ 7 o @%h@#H#Aj@lK)؆G ΃}@ Ql9 }p@.0;؍0<˝Xbk B1s))@<4p6؃$*[Z3LQ<`W3H)@1֢ "pMQK Xr;a.uR~#H Kb.\eI f`;k0w(@{c7 ?-j) 1gE}HAtF>.C20 muk,mg4ֈp&| Xx67=gثhDD1TznpO q?"m; ; yn*pw3 [|F\3L.c~gP8,\!|#xX2SܪI4*26(B8 m34{1cg3 'ac1ގu@9<IT{KcM<JŘoH= `< OvcvP<<:<Z!y)@D@@D@@D@@D@@p-IENDB`PNG  IHDR>abKGD pHYs  "IDATx[UUqJ%̐h%=DхJ({ +hXTv { K $#rtF{YAe>~>kk}ƌ9x[NZ_>wt88u+* A{YU ;`u/*jXYQv9P + հ2TN3#m PPPP # p /)]v8(v9gE8x"(@"*"\|70C`1(p# tZ' Puѱ5^R`T7x8vՂT8w WJAn/T,p5pP#p+pZ_*@M˾>L`4W_<lm+0*?|&8X< Й *@k\2DRJ+@kpV2WehmOxќsKH |/t462'.a@G>#ii8 q.R4`0sƴU{$= LӀ43?g:@nYx_ۀA:,ĸ"hnbgbL $tz H, Y N,:egffl -x>S ]8%ci~1+&v`87?Lk27WHVafb-(S/SwX]l^Fm͝?;S˲ XSsdOZ\`M([QCΔ#"""""""""""""""""""""""""""rt[!IENDB`PNG  IHDR``F `PLTE+++ 222$$$ 444===%%% 000'''KKK)))...((("""888///NNN!!!VtRNSQ8IDATxj0a[R|4M]bєwe?c8s|)xhh{j5 ty 8tIyIaЉ`8ʣ L"\ltjj'm9ʴ$7<=lCoh7^dӎ,@ z5 Pt;L*<,ggRl(wZ]ih%A^YbnPQsW/ -즀Z(2d /^v'WPs=okwwfIENDB`PNG  IHDRRlsRGBIDATxkWqN |`\((_c("7nT\(.ܨTK҄&&6&mLh[tι,7wΙ33AS-@ @ @ @ @ @ @ @={vcf͚5/_/QgPQo߾}|̙+V^wc_ bgg甃}Yj@r~]OPs~=s:T1Avqľ@ uqľ@ə\)R\Kt||( _ |Zr 6۲eΝ;g/_ݻ?9+a<{  mݺuŋ ={q֭Yy|pƍhp is7ob6 f.\xU"T\O{^xý{\ĉvKlw @311$7B#Xnݻ&TVLu>xرcZBB*ollϿZN>.+p1~WGV$qUK s, @<Bӏ92{`hhG(Rtw N:K߈+U@XQDK /۱c[9*"@Wjܹ`\riuT#|1;rU ?xs΍m۶mv!lܸq>'8eY6m`I@k4V rNbPj] \ իWoeL30Um#W R?tD+C9KSĩP՞k{puN@'s@-q,u,mEt@"șɉ{Sat>%S Fvʺ^@ggT]ߊqѶβv>iO+@jZ/}>n/|8|~)}=1mK-@ @ @ @ @ @ @ `' @ OIENDB`PNG  IHDRRlsRGBxIDATxoMY;5TA{DR/^ăDܫLv:S(Z8kszznq{]?}Ъd@ @ @ @ @ @ @@ @ ̋/z?>~ş͛~LQUYw?vcccI&c٬4e.1h5eOuC4!ƖuNd0LcK:G)R9cG?  E @@o>A!ZgΜZz4вLOO߻}={5[(gϞcǎq͛-͛7{>uł ^|5kLmذ֭[:ps^ݸqޞXߚxpȑ @/[Ӯ]tuuaOn]bG! Yk׮:}P__ߓrȣ;w!e˖W^훚*?U=L @˗+TׯXh^UVM_rΝ;,Y3lM*0G,"3?u"ˢzM.@Lч18 Vݶm[sR`7+Q 19irwޱ:AX5 `[!-q.>|8kr1]g=Yo-l'j ~)ʉ E:WG%nܪn9١ss&A$JiN gS t @Q,ˉ5Rq4/_|r׮];qp[[T9%r$%SND۩T@^h%8Ρ=8&Y>@B*RU}C@-\$& 4u8r%u4{5a{"١V~X*3ݞ6ͩD+uJNuMHlUŲ>,{t @IHerc @cf9rq*5[C.]ꏬJ '0.i+W,n #7b =RJƹC' ƛ! P^.afTC>//^L.=XGZS4^5s %Mm합Y-J& "KOl/u=J]k$/M3uTi6Q1F z$Dv("VR#W* svIuRLm?>c(DZ--@J+6Ք>*u}|DErQ"@ ReX=k-@,{◿Y' JE=1q*ĘD'f\k ` @ @ @ @ @ @ @ A $qeIENDB`PNG  IHDRׁSPLTEwwloIStRNS 3$ 6*~0휽?c9u{NL.O5~ J7҅'AP؂-7Dl m'ͽqM.!,p fؽ 8p|mcI$3%v ]$ҿt'yҴ8Ns `IȊ& {{{ 7=`I(n2p$T  7A.ph%N} &#T?]}sw5{REQEQEQ TVfIENDB`PNG  IHDRRl IDATx[LUWDjm Mhľ؉IMZjM&`L/0 bF5F4ɀ %BQ$V8ĈpQ(=(Q׬5|ss/k74V8o-a>` r$qqp8'99 . #^뢿@I7пD_CPIfh-4F?j8?qr9U>.}=9'S'qå^K"6hN ^c f4{=`kj4aӭaM5>SQ.?5N;b:v@G{dK @5-&@ZA{|מMc4R/ CsJ<=؋)&-OG՝ LDBkHO}e$AARK9V>1ϩ h[ųEJCZ⼎Ph 6ֹ9M4Q`7]0hh.} O M oOO~oi^+)+Ljruh h&f\&s;<`vmKh0[M[, lD\1AVă vsʇb+؃ M$$8w 6 t &IqKx9 Ż!@)$iCсd$:%ؔs;lLwBLHJH>Eg;Pd 9; @~^9(.P|Ea"Z&QTV O﫴,g&u [BfggJMc`$]"&''9svJ-:(Q {&K.e/_F"#!@;l۶=xRh , --?~uuu!d3) Q^ drSpVPP?~ɉHHFdѢEܹs@NfG"/(XlܸݹspӇE/`ܹuttr G(V,_]z9PBY'Inn.knnFMPoAbY,` C*(}]ݺu uE`WTTZ[[Qgg %.pHLVYYZ;Gc0Ơ8 `yfv=` #GN^f`' &+Wdׯ_Gcg p$v=z>XO`FLӧف`2"&b8= r `~v~ֆNxV@%K`8ߢaSJDLn݊QO D)HC]0#Pp~TL& .dgϞgC'![lذY"A!)9a &GPBxW 燤Xp !Q}0O< W! ߸-hA`߾}ɓ':E]_/^[;:C!=ίt!ɦM<  @nΟ?[ <Cˢ,!A߆jn޼2(>\1Vy F`+l߾555iW]?-[Ʈ\pb@D׳u@ F"=.?s 䃌Db(ޣ5|>PzMt@0Ms' ` Ve+rsmi tϗB >jUtl042[jFs ^ࣇ^\z8]kI׆CGuI>{N@ +JLR.r]{;}<^r}@W\4rЇM&`vޯsr޿[V-~IENDB`PNG  IHDR>aIDATx1jAa#"$^kx9`-%2VkXe>"jygC0figywC``````` w@޽-ck~+/~/7px2MU~u;o<+ƯyZӅc͛@7r~/kwpQ΋*7 @ z ? @A@HoTYM{^ X@j<?(Ǐh@Z!?0@-`m`- `)#wE -MO_q!_@{Rw0 0 0 0 0 0 0 K+!RާGIENDB`PNG  IHDR>asRGBbKGD pHYs B(x;IDATx횿oe?oA =[AQ;KD@j"!wx2eH4EH,'Z1%BHgeDl%CJIr>h.{;%85_ FN}ApsG[fs*]pgeKo6z!ӯc2 &xf8w1Ǹl6qMչyBD@˗zM/6Wz60 W$>Ƙ7&8=@M6+Z{7niAJT(~$@Iߑt q|I,=|߿+i,)7ƔJ>8./Up"0W|&@򭵟Y>8.O$>|p\>8.O˗xO, Ƙ'Nt"0%+ʘϻwe> Pް֞aIDATxOKQ-I#%j.-ڴkS.[$aЪj BWF~A; B&ma."͟3gy}939s+z@y ~֦/gR_鱯8UeQWfTƕQ1qʖ2L(Y0L@~XS4S&=;l+#L\Q|/$NRneI_/TZ5?`(WYE;v+qg T«K%z-X Ku                @p}[rJ+ rR2E/f 6d RKeMƲV>( PKK͵؝M P_s91団^w5{?vĦ잾Y%׭1~GʗUy/K@r6R8Y_3{(9PrZ Tc} >sӾ<׎ R * _@o갾2pa> P'`<-H}!Q^4a{7$OU ZK_@@@@@@@@@@@@@@@(EH;v;%-Ew[^eٰ7حĝ>+/wZIENDB`PNG  IHDR>asRGBbKGD pHYs B(xwIDATxOheߣu1 z,^ b)g6!Bxo҃ C2B`A1D`ъmĒAL6;|?γλJhjt96IeZלs%jf_KZHt1I͎ û I/Kg\jC{Nqax%=弤86s M~hfK ~O_ҙ(o EӒ>랖Jx)N 4}8I+,R-+Af.3@Zh$&ז1/4 z}%̎KoA譃y=#[lQ\'#I4RF$[y<냒5$I+X}SQ6w^]ċ;eق Rߎqlԝsu433MeG)}kSZLO:77[@ewùy>Fn5\.>$F<55{}EJrszۓp:EQo/}@@g/sE1eE<6}XCsfKyZvcz>v&&&b^<ԭomm={}ƻ8{}Ex) ç:}JrBH>T*tQM:f R_3k׾۰9ݥRi9' XߎlwnЋ^~= <p>~#hs߷܇[ NK^zZomjyyР=IO'lIISo\JHd5˲g%No{,ˎ&Ire' \̎*ĺ/ZՖvUl a6yIwO9/i$[Z틁^twEIiPߪjt\cg[Zs]0$-i$&m,:~=IENDB`PNG  IHDR>aIDATxJTaa ]+ hWhUx]A+7*x*$A[ E`8oCˌN~?u @ @ndwkd&!l=[˖wsl+ή +|(^>{w<}~KܙOMvFϲoxix4l-9"g+ES?~pEYg0qEq޺"Tw7K+gYwW%{Y4{2npzM@G @ @ @ @ o|l<7:~g} @ѴV M]k}~[-c/ ?xo2g@ #g4׵gg/ST&qi"αXC7a6 `ygc}Ͷ%Zl%h{^gvWwuQ>A"sk&Q}Ν8d~?׳l9[pTmeUd @ @ @g`'ip *IENDB`PNG  IHDR>asRGBbKGD pHYs B(xIDATxKa;3IQ %B&bx,u$Td$%CtX:!( QYP3oN]vtGw_}>ww7/(ccc=7%]+餤 J}k5f;{cA0P.KJ:h$ɹ(~t0ƌrt"[-of짂tQ:Rf:EY2Ë@ @ @ @pNOOm[ߟ;@ !1F@ Gsgۭg9@ v3\g6~0GGo,3tΧrsw)] sI9ql(lAVcS&fggg=Io3^'I46fbے0ێ$ɝ(3 @*JX,HZ`YXEFwZ-)3)r\B@Č_6Rz#Q8cnY{}D|zc}5 >t,5& QaLiөoHHQAT]#_T! )j2Ȱim5JW?JuO v۶BB(ETsX4Ě%D_@qoFIENDB`PNG  IHDRr ߔIDATx^Ag\Q{7!RB(a(eha4UV颺(2dJB em>5^s2ͳsN@8@ b<#( )A/0u N 7Q }5_D F|N1%bgT0TP"9piJ& XPXHgHKEY`YPհX8kG22pғmiZzAbF+<0:{Aڱ"E=ʫ8A `'cFs;segiÁ-\5=٠bCL  e[` Pq {+ +c.hJIcGu K۾<~ :{}vg_viT? M|2N}i c9:wqΎnrqg;&wp @`Wbs"<^o2Ϋ^kk."Qm__^3d H8QE씝`*1w60nQ9\r$Bљ}DjZ}PDKJF^ޥ܈Bj -5ry(Ɲ]3}SeDsu{SG/]IENDB`PNG  IHDRnv#IDATx^UDZC0ku,%X%t 98!3IENDB`PNG  IHDRJ~s^IDATx^ӽKBQEXQD&H[CK4ED2Dc9CP$DmHPaAz@S(3c&K;N ЇeLxEPd7R䨑$A )NƸ&'Kq9,!3L3#!2H\ VG+Pe@dxYB l I(]v5~%}&Bo`yiN Z h4 eXS,fy#J[%ud; ąIn&W< x@b *xS|BQ YV$dxǍ6 Ff?)ڀhds(>IENDB`PNG  IHDRJ~s_IDATx^ӻKQ7LZŭ!Ab-jPCcSej(- J.'8{ پ%BG782M1 AUxHJCNq25@/a$AAP l/ifp`B}@A80=6 4D8A*bQ: jEILErX9`1C)>J3OXLVC29n@I4xK~z&kW< x@b |s(3,C̲H)ۏ3߮ q)A̩;vIQ`?iOi#IENDB`PNG  IHDR   IDATx^Ա ! Aߋ[ 9Ml2V24@Hi 4Hi 4@Hi @Hi 4@ 4@fTwn~2\O#[w~CNG2EA$G EUn+3WC1YBf.sȾRr,*c0*"V ЀO`ͧ?ladרk Gm(u (x М0ۭ~d[/)uAC睞\c\',kFC÷h 4S 4zC{Z3 7lDgAcq5h#Y]':^lT~J- QA r錆,<:L {H0Hx Dx9ш5d-eKLM%?(J^)N<[ =DEj׌_xp,'̚Pw;est4"\_pcRcpcEgPx pI4 8ϸȍ"G["1G>ytCZ UИшEmCo (a| "9S' '8ŷvXmChx-ߣ@F=4j@T?Nx, lC!Z701qjkFw(bP]hHw@~8&F(+kxк| 1U$>ٙ[Ѯ6LfߡS3O&" d)Z78SX+!G#F=g *>Q p,h/&U01h(8|`hN7ʱH @4 A@N5jj'X0CqW=\~5I ՠJ[W1!S atwRyWx^ jkZT7g*h|APdfX^ZцTgfRTrsY(i x 0Nc~ЅV,Ŷi6c0fXJ0`!" ;FJcq(w ,({/rf qcb!W@C텐p0_F#W:"1r@1!h8(YMGba`qCF@ "[IDATx^qT1@$9^s6mP0%!xr'1rq Hm7m HFG'G1ȱBOV%vsڅp /'/Ci2rcToBOnjj =[aÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذ9~ 7v_uF=;?ރrcݷ-ilpuޮ=ӫvsǧ.65 7b=xݼ׏mKATb6BsS2ZnsE9O1 IENDB`PNG  IHDRYGIDATx^1n0g˶Z:0LKIΨ/d ߎK hBh.MMP͊P={B}|a MW` FoԍYHOt7@U"K?\=@IENDB`PNG  IHDRi7@AIDATx^Oe}GXdNqc2bSslH\fVj5]cs+=@N6蜓ؾ /pAp B    ?CSE-Ugcqe /RWN}{ |c_Ceor>nl{rX C!?Rj WF:&(7OtYnf*7uZb c|{"@6lh:H盱|3U `[ G-|SI|;BL |~gKIQ ?_|*|UUW @>_|wxfXɊQ>TS$`@ݭ,fnS|<LEztM4apXgsk!l8AUQ,a3@LKk0B]_pȡ$uxN0'5[1jOtYL#wqG~ guڔvF搇#\Ye [g5%ï%SL }?leYT eX\YL3mϣ$8r#{c' (Fyyu 'P O@@<:C ]aִwquw<y_p_f9a!@!@@=ALZꨥ28sYLvyRf,[yxS=po_g I\!TyV\<:*(ı~ݤRE18 +[|dTvxT R42us)@ Fkht P@@ړ](eA1J|ai2F@=<c@sjc1JbL^gN t!ǣ>'C f/C!bf}"EoC%ni  ۰K@߮pQ xdAG *|l('P O@@<:yu 'P O@pIө~\iv K)37vcN@pgT.>k8SC`AvG;"QٱX8|D9n6U덕;8L;X:G:\x`U~LjaK68SDX=7@nz%a14YЄ\Ac&˗m8~Y3ku ;taLF&etA,8s#^bg~__2p2 naZb lq|1[w,ɾ!Rզ H⸷%2{q'I~-$3yͶ%ޝl{),dkxw\_Fa 8~\^!OLٲC._I۶JW @>_|*|EUUW /AC]4Z_ =6GD,"8-߸I$bpyil"[" xd*N[! Brb<}TF<^ D"_$UX'0@Z\*6 R7/\}ڏ +pjtE _C]ci\D<ݽ S1,Nww_5lo?2SL*xf9SɃ !ȏK IR$ |vKj\!@!@!_!n>IENDB`PNG  IHDR rY)IDATcae`cbP(PJBQz[GZIENDB`PNG  IHDR  CIDATcafb```a0, b9`f0%\07AxΠda2 &ŵIENDB`PNG  IHDR  GIDAT @@'q 9 a!W)hj+XY>63=$ $ @0/,x\FS+ ^7IENDB`PNG  IHDR7IDATxڽ 0 De _PY JҤ+# {ȀCdməBIENDB`PNG  IHDR ';6,IDATxc`hB?\C0,!ԎiV'au< ! JIENDB`PNG  IHDR:NIDATxc@ %x@* ?-4 QO~W# T]H]ҕpOPk) v 9Q>9IENDB`PNG  IHDRAZRIDATx^a @ao] 'ZHmDTOHP%E#^а?c(AȊ߭ _镚po¢l'IENDB`PNG  IHDRAZIDATx^A@ E{&Cx <;& ^d@b7 FAȒ(lj%9&ZV ѮID.NGG@^lJu%9Q#Tr@T+^SBWV/Ƌ{oǙN8-IENDB`PNG  IHDRAZIDATx^}A @ EsA0=Wh]h5 ]KBi!۫I,ZYg޴pb`"t"Rt.4Z:#J@Zk aoR ӦG>pn PJ{F->/n\МNޚIENDB`PNG  IHDR7IDATx^ˊ@BtHK@ x]hw4]k1ϮU{0:9eq yȒ$܄K!`-V. 2 h9T+FH/lTR#{h$Je^%JgyHM|AIENDB`PNG  IHDR7IDATx^͡BAᯜE,TLٌ,> bC\}_9,~S3=}>tBN-p$#I8d 9VVH@#Q% aL5TW;FQUdÒBQp0f,R237?dw$uIENDB`PNG  IHDR7IDATx!nagF` m8C O 8W (!Z B!̾h-7һR{=5.fV iu"d lSuuh+l+RȀaJ2FPCʷ0:VԒ0+d9Kz 'ݔRdji¯ҏxY@#[HvaIENDB`PNG  IHDR$$sRGBIDATX ͘ϋ@M (BWAv݃AͿ@WPAz =U _E/ =xXMsI&LÝ$M943$3oH,g7xvyL!d&@]$~/5\^ ֔I!nG#I>7.(Ml׈nvۍ6jn^geSxpعti@_YIs*G$sk3+ > q}ʄ lm,#S* 3(Z慂 UےOC*C20!B~+;g*9ׄU{K9:JZT$R5F9+2X$&*XXygE!1.vUT6*JK-g$QL{Zaz8k $z? #u$qϢ@ Y5%8Ө:4O' Le#iY+@J=3qs?lP)4tQ>h&wqLmX6~+- K 碦e=PTLćRӲPCĥ⯩f,Qn6_FCiSb5A$k)je@~+'T3|&K$딖 W `ZYgIENDB`PNG  IHDRUIDATxc  o>+W |Vj[A@*EMzb5復eJKA_S2Xᗣm 2ӦIJk H(>R]ˀV aOgz )>M Hg)-Aip 2$(- 'IENDB`PNG  IHDRUIDATxc  8+P>+- K 碦e=PTLćRӲPCĥ⯩f,Qn6_FCiSb5A$k)je@~+'T3|&K$딖 W `"{hIENDB`PNG  IHDRUIDATxc A&V ;@DCԶ ,?06T@ jP1 *KM^C Be /G%@|d! UMe@Q|@DòPR|6@.ϮSZ\!Ң+dHQ0 5@c͊IENDB`PNG  IHDRUIDATxc eV ;@DCԶ ,?06T@ jP1 *KM^C Be /G%@|d! UMe@Q|@DòPR|6@.ϮSZ\!Ң+dHQ0 P7ڃIENDB`PNG  IHDRUIDATxc .V ;@DCԶ ,?06T@ jP1 *KM^C Be /G%@|d! UMe@Q|@DòPR|6@.ϮSZ\!Ң+dHQ0 =tB;IENDB`PNG  IHDR'<IDATx^ԱKUaxa!C2)(hn 4U 5!Ys:8AC6TFf_K\9o:;>Pۨg_lౚ(VD̺Đ3 ӚU츰OS۔o.(25"ni,R=:Yӑco YN$יaG!L:c9~s{"Ӕ"4ԓc>!>j"WOZ2`A*f@4[J[ʰAKTVe#-aC[7^5,3XHKYC~Uv[YBxw iMWoRim֫%B[X۷+ZnSd~lW5rWٰEuf*\#Q U{麰_ˀE3~PyV'>-9+0! n',IENDB`PNG  IHDR'<IDATx^ԱKUQA> + AIAAscQ >( ɚpp>iM-ip"^νp eFpHjGOZ3!S[uQf)]R2m&--Zv[Kvb9Z-ƬHViϙwü$'IudU"IgsfB2oN@dMy$B_zrfU''Y͙C"\JIRT#Ȁ̂ ]𼜳$UAKL~k| *ٸu㭆+_z%v$_իem۬+!<ֻ V3'6&!.Y@]ҙb,;-?ovmq_șa ֙qG,aZ{uQ䧼`n 5 صI.ӄ6Qcpˈr@bp`IENDB`PNG  IHDR'<IDATx^MKTQ8ch9BL Z 2 @jad:ʅ}.EjS!A pN"98'4♃>x"шU3n.1pҔz+vBد.6雋Lń%Eˎ{c_ZزzuxmF-Kj˱P9I!Ig1+z grl\2gVr_dPrlEһ9ꕬXAx!r%8*#Ȑ~R13輧!ߢTb X z!mU|jl̚VwJZ)t8\W_廹ymm[TRhH,+[bT-9o;U@5y6䣁iEaMi+. vmK0"QO|[rNiXM VK?\IENDB`PNG  IHDRUIDATxc A&V ;@DCԶ ,?06T@ jP1 *KM^C Be /G%@|d! UMe@Q|@DòPR|6@.ϮSZ\!Ң+dHQ0 5@c͊IENDB`PNG  IHDRUIDATxc eV ;@DCԶ ,?06T@ jP1 *KM^C Be /G%@|d! UMe@Q|@DòPR|6@.ϮSZ\!Ң+dHQ0 P7ڃIENDB`PNG  IHDRUIDATxc .V ;@DCԶ ,?06T@ jP1 *KM^C Be /G%@|d! UMe@Q|@DòPR|6@.ϮSZ\!Ң+dHQ0 =tB;IENDB`PNG  IHDR-|1IDATx^ݝw׵1`v_%#6n\bm'93bEB`0vl0N|9+؎ IkK!@nIݭju̅kj< I=7ti._K)6Rhx͉OV13AN&߳ 0\=u:ōME`A,Dt Q)nRtPĸ' Vtu(=Q%]wSPhGM]PlXf;6ܚ|r`9 ^Bo5~ BWׄՇLyxaa_ żOLC_'qK"U|X^aT=PN0c))uy>v *a>Pr*!׵<`χ{ԋ5 c8J0F؜RZ]l^еę}mý~X"У:y TX:XQy v6 F 릆5QSyY6WްC< v]8;[ou~Y||ؼ|e3~XF3C&a._(u v=6;̕^YG>X13[(Pt`:Eq}ߙ 6a8 < LR;)nR$8E/̃W)Z)F` K9rvVY/ꀮMlow7|X`nyukڬXe>8kMo /KKO5_+^ć.gD|Ny(=aT-˝O>Jh9ޘ8M%5 8d ke \AQ[,{TÚGCW!1䜢}S(u/nCHszq B9ÿ7uZQWUv^V#' >C&)*ukV }#և>X+tXY+=#' 9xÇ._zo<~BC>=OZN݃>굊!+c0%7Vy/-zV pb;vUL1qՋͳ=lvb>c$&glO͇s `( rꙘh0Y Ii\ѾTF)7t5)V&Epr4kܲ,ueFdoL+FkWX3Jb["^EYaTn.ǒBXa bDzX`uVϡUYmn犼YGuQl~h!B2X#rhףF!W&CȻZBErc٧7_7|skC^rrNs8[QǗw:z9/جRs$XQVۃW,z zc!ӆkL|"se1ӑ!uyk,ydMe=;nQ:\'Y6PDʭݓY[e֣0˪K:\mXŌ[7stCկYi#96mL GvXふ"X}u1"W#[2+_ч|S%k'gW ֳek}^tʡK;BY}CWkR}k`vqhdOh_iUX]jokYW`=Ka 9 Qg>r˚Lv9똞v:]r={oB& cͺ7OF\貞Tay^́%^`Ymv8#?rKyKZu8qY\tc|41(^X6A4(2݋BXG>͚7b)43x.ސ=iHSnjvk9r\Vzw~lT>TrU/b5,rRWU>T9̺`m@9?׫\0g,{!Xt9ve9֥7v>CWEYߣygֶzԼ׾!+,=z֥ ~g9F٣cћ4 u٣tiMygV%XC' ,kW@4X;+CF#S3a||=lY:L ^G1\g*.з ȟA< )V<ۧ _kc^')_k6,~o_9Æ69{FtXLW> ubk=#\eeöWgrIڈb2H$ơ+=)֔"TqjyV3}u.+_}c[YAؗ^ xV1V},U뇺Vq]/vXbX=XR5rƑ7 K$e)`֔^7$!4Nboyz*B,{3_`%q,= }C=T~x?7Ɛ75WW| ް`kaL\=D^1}X憎"hX0jzAb,[tM0]{{^t _]1A]+-AWki.3Nz~b ^V]s* 7ƙ7[>ص: e?Waօb:˽aYcO9 {s,9\u 98K5&qq??ÝmvL&{sl6.= fP,+ņUVW,@Y6 X׫PLoa:ڄXV{CyI^8~vƪȡaΒC6:!jxZl9.x,>"Vl&C%mzT]{̽Q#9|Q7΃FサQ\*xM` :A➙6)2~ڰ/)78KXaV!7sq1^ԫːkmZ4dS ,j(ެUh]g~m#ւ/p_c\ _6uscڬ71ę+yƲz]<XLseCrAuU{%s*7u!B!x.3j|I `,]Ѕz0>=4k),xPp|qhQ|I kJהPՓ01onf|hp1mCDt!P1C̊yef/\:dхbH% s T[҇2Çrkao_Y`$篥,}xVrBx^NKü{u䚍$+=eVka ^Kn (ug.FFFr>`nllnLۧqq)wNB&Va#tm[Umc8g zSHW +,𗒬pй2q֣zXm`=FH]%`EY[5ԫ,ޣD&FoRlbD{c^!aS%j5u>nGNJz-~~q63dg+XZXr(=l5nO*,ǿѵWLW'u *6]> S\Q|4S{ {=zK]/i]iMu(UZWRMgOï?󠾾>_*oW[>sM7%Yt@ QEw5u8oH}\f!kL$/u .sYzW^tA#Xo(Fr,#X,fށt R^פKXM,u L]jFK7xzPqpຎk$͢;,'7y ܣ#{MU&q^դy9PqQ|8jԐãCWX e}u7{=E$6OZyYe{cIMMz[zu%qg ]G7DRWm۶ zzݟ#GM~5;;CWNs=VtzuQ4XZ]wP/:%uM#_;qJZ}FV?4W>"ȡ]LW%u1c!/mcKF~o~ST*/ S3)odŽA.\XB +V7X= ,Z`VGՍkPKz4իP˳.":X}7^yq]y)Z6NM(C a9u ]t{cA]6aQ1os:ۏL lgpGnaaA5-k8 JRF(q%s)i]3s߰gJeޘ5zk(%Z/io|t}jVT.pbXqPYfRjFuzC篨5隅7t[{:vJ]Ԟ͊pƼf:e׋8gMBִ)t[⬄ker390Od~~c'oMXHd,W<+2deNK:K>,0^Ҟ7t Sz/O9/Mz5Εw׫K/]LI+󎛖~i]^' _8]kI:%Qt5:iUxCխ^gao@7.ޡXaMXXGɳl:}X=Zuh4SuY>ꫯrSSS`vMB,mJ:ỹ;fԓ09TD,袐cO g)ouA7'H~nzǗV_E%X5jxX_@ЕY_ -9X6 L]oeAOb?eNЧ ?t.OReA 4:z稤.IuOQ& *t(sJwXuM/b?Y^ObDuQkZzIuI+9/<&M=V_)իWCv?͵cs: E0'))K/C!*IctpþT_QIVIM ,U`uXP:z{C^O0V01Vp`!oڰBX%=_/ #ҺzN92Wrotp׋Z&?bP@^`=iI q0]ҬY{Sݒ,kbۓ Kz.t^G4y ڙ.Muz$Yjgʰ^:؝9{n k͚Q|'77{zk\v1nմ>ܪ2oc z r{?y}wͽ;PW?WzJ /r$kdAWJw+],U9Z/UI(ra]Y…J=R%+a)o,Hkz-5ZԕXzMI^{cꥅzIxMxGJ-uӧ9ꇸvz/%>B@rSWjV^erN5Eta^&2 7܌ޘ!Z ].KTR8r(79V0{>%!k0}RcFDgK|N5VҺ_oҬkuT49\Z2֢-o# CM+ MbK՟eu"788_C=[fMnڵPW?:. d/hy^d:d֪kXjU+zDS<)Yu*۟:7:f]c[d~:X5̇:Cj UXk7%:"٣ Ϸzx}Iל"ڣϕ`aN} *kM4;`Y-`)b/)L^`]j<;k?N ٬c!Rڰ!:X5`u jm|fx+[/[tY dVԼL󌥸",zMjR p{kGs-Ap_#ƙYzo*AQ9%i=,g%'z@\9٭2_J̕ Zo9Ḱϕv9 x|q`Ix#f9X)y=Ԛ1ƈDyȌRNqLE"8O4`?n Ud*+Mˠ(aAoUG|X6b蚇._իEZЬO2Ɔy kJ%}] cAϺ2癮yO:3-(*fe"٣>ΜwU?Nxw43֖<ᆽށWOߕ~X7&RͶs%wl 3O ϗs͒gec"b*+M3y95iW0 Ck mYaa~ɓSGz~ t/H:P[YJ;~Ҟ x`e>հOYXˠ(a2@P+}F0ta-07t0pEf? A5ޛ'k=XY _`ZUu4d}DMDׁӼ T ]r]scyz@Χˍ7ȡgp;b*5>>\Hʚ9t>%e)x|EO#N]~'2V\xj,ϡ VP!R~ E*Nt/>N7ѧ&Փ]|Nh/uYwq`ei4_UmAl+sӴ9%UePBXjy9IumN^=V eT_3 UV<Ç, <Çf߬;ά5ՉB=D72`7c^nև%uUZG1ֳNk]o4|ao˿7Y>e A(}#z 9=0];8 i5K.= x cB>'.I;:ډXnXt Q.W,7 ' ]nrK.p O,KռzUb/vz]=X߇vm($"+^^W# +Xvzd!v{a)_]^tu1]lA0a|yE0]UJ˭>k.X\xc^.Urz,gIW'8K]4u}r~tZֵ7ttklV^ZGzZú@V?ֱvT\YH{J2tuyԵru}X`t㍀X\{>“7< gsrC,~q_@y*\ !bb @ دfQ {MA :#saV&0d&Q}X](ZO1ba5(Vj,&=QrJzce"eֹe^1̡҃zM\5lX=6|z̡UOnb9>7u^ 3%XrWXƎx k,jd,>ia`yu|zңA]jL Fq^e+4l_.f(E)c!cz-Dsb]~4״~ob`gHx܈vuIW7Xk٣蓭Ҵ `r62:mDgu9gFzbܠ+)+وҥU, RQTP=zS]Knf9tݟMMe(]m"]Ϋ :^Vη׹ SzSbhkoL!J/ra膃(6Ys\"Y`Wup<:O-LݖF |Zx:ŠB+bdc-/5huӍ|-ja,xчmzc5_OQeadsJϡ7bEL]\cذԋ(k)*+;<.RknCza}gPz} XeXJ1j CL'l+>rاGE+QW}Jy:x9( z)o9ſ/BÜXg9HX>ysM*qНG5|UĮNW%V .Y VPu UA4-jJ *߭7`yF]{፸z\߯Ğ!grQ#Sf|X)ORqjf bXGOFFQiv An?C/zc)ޘXX{LE jBjaҵσ8EX ˅{(.YSjZ9Ils t ×.]UV0 f( Ե=m9H g]Voƛ̕`po jê7\˻GVµ?]@W]f%+`- i,Nc٧[^B7|SXtMQT / 0xϻfőUϾ2+{J9Bk5 eMިC7Х$5('pR^Y7a(uO{NqJ@WHtFB1×ʒXKp2 3}?"w^NiM{~cu2o,U\>zu^Շ=)4kn뇊4 V蚀맚QlX562]Q&&d:)nl`x(oMvQ EH1(n[]ۡg :k|qrtTWĎq9zJ"m9=O9:t@OukE78uCͱ^F+qx3Cz? >ި~wc^s\ý >͑OZ?k}l^N$O܍Z^zc2t_rS_ Ey@%]G8د,u/[G5S | 6pZhͦQ +V9^['<h{"6z lV,ۢ<$(y8QB:{ +'>= 7=?e+Oʂܛw^JQ˾r_+V Ws r*t6>z 9\7uԍH)bqIENDB`PNG  IHDRUIDATxc  b0+W |VZX 1,T5x/^zԲtKXpR m 2ӦIJk HDC2 ?hzX*^>BF%uJK+DZt\ 0 F8 * IENDB`PNG  IHDRUIDATxc  a<+W |VZX 1,T5x/^zԲtKXpR m 2ӦIJk HDC2 ?hzX*^>BF%uJK+DZt\ 0 F"(WjkIENDB`PNG  IHDRUIDATxc +W |VZX 1,T5x/^zԲtKXpR m 2ӦIJk HDC2 ?hzX*^>BF%uJK+DZt\ 0 Fj.-IENDB`PNG  IHDR i,IDATx^͔JQG] &f b `.c"6,EA`u{?>w1-ZL eD2I ^_MxWV=> X^ZP!"U 3m}xY8=T5eW̃\|v5"{y@Ia$O.%R4%2Y-Y R!42 (5h0PYAGYbXY즛2![mF03 g_6zIENDB`PNG  IHDR iEIDATx^͔=K@ًY]!(ZVF m,-k[Vb!E]4qvBqCg3cPa0vWmٺT9Hyvrt 13=7Z3ecvAepp4ܣBCmQh@0F ġB*$7Aibka>XDŔ~"USDf_v\&RU3qm$=. ?V<q$`m.ΥRK#/[Y%&}w/oyU/AIENDB`PNG  IHDR =Z/IDATxc`d_1h1\-?irU6r8:WIENDB`PNG  IHDRnvZIDATx^-ȱ 0a* ;A\6Bp}bCV ыcf!6"ZP@vFJrJbm?TNwIENDB`PNG  IHDRaIDATxڥI @E=8xv؉qH5Q4H@+ WڭԢ#jwL г`xԆou뎰Sߛ2)^i.w\Pt6@ʲ`n|3'PϜY)U3bY6o";S3`,S+Hh"0O" AiG/pDR^g)@_/ 5>IENDB`PNG  IHDR7IDATx^M 0=H?$(nlBɴ)ex XlH0j]2[f.rG!p`I Ϛsbq G0LxBp%>qK#GMG2:# 5PCn,NM[gT"to/Z)VIENDB`PNG  IHDR7IDATx^A @ P4!)!d@+ZpTol8雼`>9Ɔbji$vuuvHvU|U,#uQ>(J:L$#AQ"z[9ZX4 ɸNCSo]KߟDeIENDB`PNG  IHDR7xIDATx^1B!\gςVHC6B&fʝ&_M`'c8ބHe*  ABZn$'M8*V!H%cF4T#rL]O.7_ւR!+IENDB`PNG  IHDR7xIDATx^1 Gϼ…[©+$R4,Zl|7 sNF¸ !8(H XtÖR%8#Kxn KULO|? )7vMSozIENDB`PNG  IHDR(-SPLTEa^_[XYOMNQOPifgA*tRNS@fIDATxc 0@3T P8MIENDB`PNG  IHDR7CIDATx^1 CQ%c_,y'QsW G^x O >S a&:&8oIENDB`PNG  IHDR7ZIDATx^1 1 RB Y_ R hB(Ph~BK-R 7n/F{9+L ;;L a^xIENDB`PNG  IHDR7AIDATx^1 CQ!c2J$_yQي:$V+<A L+2lJ !qIENDB`PNG  IHDRFrIDATxcOdX|alYKTXZϔpXgSlLXU179={Tv~S 4ǯHjN-jUXrۆL>C8LQIENDB`PNG  IHDRFIDATx^A 0FX{' +xHɔP:"`ԣ<2„|LGkphYR#FYQrX3ڈY$֐?l2AFs1zGn-nwF\'^J؂IENDB`PNG  IHDRFIDATx^1 @F"X'6E]C0"Xl,V^6_IA\͑ITC-b1 ţ>/{ oXy wVG?Mf.U"@];v='"0/؇b}+y ؒAjH"Lwy0*e$rV&pڢE3վwf3fe>g:"UIENDB`PNG  IHDRaIDATxڥK/QXhU/3jie7QEP L=.m%>'UF+79s{D$F49ͺ Ű7XZV5(o.'^h\D*O)4(D=u)ox?FKm`T^ 騻n*]*NG# #D`pB9Yqq5`~D9 L}œi==D [Icm w6F"JymN"Zm (kcfq 'ϼɑlIENDB`PNG  IHDRaIDATx^ON`ŋK6,{7$IJZz 4z ws@<!%q~Lńy}!"cۋSJK.q@-PWgXf)gf\6Kk׽녝x"xmYשlu[ݴ[DNXAaE:퐿,͘wx|i4>ukq(0^yTAF(xOJ ڶRL&phЪpL!D~}=؀{޴W;%뫲]ԼS\/889Di6c6xq/pF *E5sZҎf43GlBPgD,?[388An(K0E'~j*Ʋ{Fy] W~ꪯz#%.P'MC*\T)P3J f7ľZyRa ]-z`.G}e3 -`$@5¯M^gauX@,! {+;bfLOZ+vȕ:cc%uCmLHTOǢ'XrXsۨWIENDB`PNG  IHDR7IDATx^uQ;nA b{fi^%qqgX )q!DY=l GIN"P[ L3d7&fʌl1" "z;J. g3%m' %؂2G.w7Hf~F0ˣx/aY\%O ADbҭ_ ,7-9L7VI%u5j-7B64C"(" }.UC6:Oi 51м+ׄ= ?ͤwIENDB`PNG  IHDR76IDATxc DG X )}ՀWA:02+T=9\ DWFLHd<Cmr&?IENDB`PNG  IHDR ,:IDATx^ͱ 0_A**DFP0Q+ԸAP ''p ,xIENDB`PNG  IHDR ,:IDATx^ͱ 0_HA**DFP0Q+ԸAP ''p LIENDB`PNG  IHDR ,:IDATx^ͱ 0_6A**DFP0Q+ԸAP ''p /߸IENDB`PNG  IHDRJ'!IDATxc@08@i=IENDB`PNG  IHDRJ'IDATc? @i8 D5sIENDB`PNG  IHDRJ'IDATxcp_?8rNd.'LUIENDB`PNG  IHDRJ'IDATxc.s\X0dB@&4KIENDB`PNG  IHDR00 1 `IDATx Oc_ͷ}O>ݧt}O>ݧt}O>ݧt}O>ݧt}O>ݧtͧ4|Oi>ͧ4|O?'11h0 ƣx2/`<d0 Ɠx2O`<'d0nO"2xQIENDB`PNG  IHDR00 1 IDATxQ AU'Ydr 4?O4?O4?O4?5_ͯWj~ g>8py8q<ǁ8py8q<ǁ8py8q<0py &)5TnIENDB`PNG  IHDR00 1 ^IDATx n3@`ut}O>ݧt}O>ݧt}O>ݧt}O>ݧt}O>7X"SIENDB`PNG  IHDRKIDATx^ձPaρTj"łxI#/b0x%T]T4M=/KBmH*24"p~bo8ʩh@ v2P!7(+P@B@e @ Q P$8S \)p xD{dt)P@ p"R 0"tI.;b\ʹӁG@Y} 0ײ EOQ._Er7/666! [< ݂US.H(*r$(djBXtOOOobܔJ- Eű-J_D]_ω|)/y^](`g_%S|jNVX<Uws F;a}U;.T&9 IxE./ \Ymw1^D/O_މwW}\G{87|>h L|';5oᏐF-3ߜKGyqc3V!JgWdTgRhhhLt6}4ϩ$3=lSrNmNa{fq秖xkZG#?ese GfݑHĚCC^,ZZma``F/Lϊ44tY1'F688hZ1,^__pu^΅ZR(>M$}ccc{:]Y~q7)Sl&Z9IENDB`PNG  IHDRnMEIDATx^б@.`Xm4 gW{sX-x7  \  !"B0Ϲ5֜sČicv{DI"@JzZay"& X`9,p *y2E9 vFhC袡0om%{~rD #pm' VX7XӚ]/Fu) 5UgB:3X3_ (&tוI$"P 8Dg{Ф-P'a OGy?$3BGIENDB`PNG  IHDRnMIDATx^?ha.\Z5=*IEO Rp$Hs8A$A8itA)-5Rܾ^Ky>;;TB&Y,rXd0_$Οk0{kƗ+yښL'ۋAk}{x #nޫ j-/njbc~Me15BUmf2$3X䕗 ~,b1ǷzO&7Y%Ð 2P_/=}4Nn*Sn>%Rt3?tH= caeue5* d8ēn%"p7- JJd riSS7L..޶MB5l&T5AU TTAP#Txrv6pxZZAa tG@}~Y}g  !RxtpNML(,1(y;O$LL ęBp+6WxF%[2/%Q}>L"eD6 T껾Rm C6/%w,$~el >1N\2@|ss bs|&|ݾovn! C9rK6\U%;{V% 80QdH$-NGGrg}eHYk2g,H8IWWNxGGl5Wvtcl6Ks"jd2͋=X]]FD゛M]744h/~ԫYIENDB`PNG  IHDR;0DIDATxUp$ٱsTwp@efffz2^_3>W̌(pUVUH'+zIEdatgfeU5zCWccE4(84V^ߜ\o <̡$;Yt +YC QŋyI1H~lK[8&JH Ц+cZ98~ P8^I"6+V>/a@-qVEB߸7ܴI60|@3 pL}zMO,lD{G;rcҥSS&ΉeD !lW6Kz6ǫUTc φtO8ZXxB c!%|ok̊6uLY $7Յژ7CS6$\ViKsNtq"OMCG.2gIbE9 }1|g.Kv}(wR&nbHggιgq,ɱ1pRR5 b4cc)-̂T*qlxKl+u[p"虥[Ԧ$/^K̙| iQL?ĝ7r-qM/lWNO>򳀄ץm`pҠ9UU /]x'uwc\"fԯ/̳X!D~?sA+ŭc;lOBnсaN WXJ^GDH 2d|2IDATxc``ˀY}xIENDB`PNG  IHDR mf4IDATx^A P ?gQ\@zD$h`Kn>w(LʕQ #;8Ac '`NPiƚ-y ;zQXѳJ@)/JH8?BВ7L/ &IENDB`PNG  IHDR >IDATxc@ YNhIENDB`PNG  IHDR mf4IDATx^1 @F7nFP/ `!^8~m10003P‡] z> @t!/=q t_ 7GFzVٔOLl(DB#W,9l.#O*IENDB`PNG  IHDR /dIDATxc@ NK֟IENDB`PNG  IHDR LIDATx^+0E)B;<S ܣ{%Lv,Ë6fI5n]͍^xSV%E6ZIENDB`PNG  IHDR LIDATxc)BW PJ,sXāPa9#0 ' YM" r%D;IENDB`PNG  IHDR #2sRIDATx^͡0 &B/'@ɼݛ\kVCWN$O0-=URھcTn8mʨL̵Wv4tW|IENDB`PNG  IHDR;֕J{IDATxc?٘:@8 chfaa=y[nDžA ulvwgϞ yNIENDB`PNG  IHDR;֕JIDATxc?٘:y3 C=15y6ykljA uRODMlj u5cDj><ۿgJIENDB`PNG  IHDR;֕JxIDATxc?٘:y3 C=14/z޺; y:l6_0Xn@5jV]mm$TCsFl R-mPy~d AoIENDB`PNG  IHDR;֕JIDATxc?٘r@vK;3 ?G̤~y̔ljA u ȚYRO$ u ȚٴROY3V 4ԁԏtlZ)^FO7c@uCU%lUfW_ԡ3sKPy.5$`6<,m is!IENDB`PNG  IHDR;֕JIDATxc?٘:y3 C=15y6yqb"xսЬ&\=n+؝բw``8P9Hf `b! ÅlTE ^CIENDB`PNG  IHDR;֕JwIDATxc?٘:y3 C=14/zn}]I$Rg;U uyTzז9G@ pbgIENDB`PNG  IHDR2IDATx^; 0F?S;8/\+ NRJ;cso?p Ʌ,5:\ :ԴhʾD?hcLFZ+-&+>> :84T.#=90 Mj3pK4e{"C<#NZ'T8GTʄ+q=7nzIENDB`PNG  IHDRR;^jIDATx^ 0E+N]ڥ 3EAp\wGY!p )X#$Iʮ{q4Q߻93m GBr8iYP@EQ'd*TrUU4 ~Uo۶||7eP 03!!t D %KDɑxr8s u}GX.H1L\#H _tiYIENDB`PNG  IHDR2NIDATx10FWg!X@UũO4AGc|pˆ#~VIENDB`PNG  IHDRR;^jIDATxc?E:g@ U 7۳_QnMGϟ?` =*ߑlPʷ$3 5͋y 7$leѣWwAjj 6 b1"HU+IENDB`PNG  IHDRR;^jIDATx^K `-Dm4ʢvjdHoA0 \qDT+ +BaAt(t7 s]09X 0,BX4uX0$AzAiR ,HfJeYqcjfe PL@ePHpHpUK\Л_M9=^coc @Xc{>č7~{v u;mNJŶƕ&w(*%tsvk3MB>(p,"sT`n5tu-Wk1ZAǢfA *rk8IENDB`PNG  IHDR+('IDATxcXjfac30NO@`P,dž ~aw,C|A|w,ai;ӡtr,IbԱt迟?;x4ѽѶ]@;:UA=б@J1x0cC feIENDB`PNG  IHDRJ'IDATxcP99 ^$*/WIENDB`PNG  IHDRJ'IDATxcP99 ~d` IENDB`PNG  IHDRJ'IDATxc|P99HN]8!ŃGIENDB`PNG  IHDRJ'.IDATcooqƑf0`f`pWaIENDB`PNG  IHDRJ'3IDATxco?,O+x F)=n af`c`pU`IENDB`PNG  IHDRJ'.IDATcto/H9m,lg{ afd`qt8@zFIENDB`PNG  IHDRJ' IDATxcG C8dE +`A}IENDB`PNG  IHDRJ' IDATc  2!ÏARq9IENDB`PNG  IHDRJ'IDATxc|P99HN]8!ŃGIENDB`PNG  IHDRrH IDATcfIENDB`PNG  IHDRrH IDATcg@ BIENDB`PNG  IHDRrH IDATcx-iIENDB`PNG  IHDRW{IDATxc B,5 jIENDB`PNG  IHDRW{IDATc "<4SIENDB`PNG  IHDRW{IDATxc N?B+Tʹ_IENDB`PNG  IHDRآ, IDATc zݭjIENDB`PNG  IHDRآ, IDATcr IENDB`PNG  IHDRrH IDATcx-iIENDB`PNG  IHDR!D?jAIDATx^̱ @PFћ$L`VTkkGmMԊ|/E ~+IAIENDB`PNG  IHDR!D?jGIDATxڥ1@@@8J܏=R-72P+DŦ֐`| ֠$u4_#.IENDB`PNG  IHDR!D?j?IDATcX Rn df y9[&IENDB`PNG  IHDR!D?j\*SIENDB`PNG  IHDRJ'IDATxcπ'$οH8,.4IENDB`PNG  IHDRJ'IDATxcπ$οH?8,98>IENDB`PNG  IHDRJ'IDATxcπ'$έHg8$,IENDB`PNG  IHDRJ'(IDATcπ, FaM6l|0of6_z4IENDB`PNG  IHDRJ'-IDATcπ, Fau6 #\0e\`2=p.ZIENDB`PNG  IHDRJ'%IDATxcπFaM6(LMӽ h #"IENDB`PNG  IHDRJ'IDATxcπ'$οqƟp*,A7IENDB`PNG  IHDRJ'IDATxcπ$οq?p3*,?W&1IENDB`PNG  IHDRJ'IDATxcπ'$έHg8$,IENDB`PNG  IHDRH'IDATxc,ĿK.bX%Ǫ)iEIENDB`PNG  IHDRH%IDATxc,ĿK.2$رIjvIENDB`PNG  IHDRH&IDATxc|,Ľ{K.'\ uWIENDB`PNG  IHDRHHIDATxc?[W߿?c6o^$  E^o^p!l@,b oBd>W*IENDB`PNG  IHDRHUIDATxc?[W߿cl_>} $ p VԓE_o^p.@,@,`J d3F3ǵIENDB`PNG  IHDRHEIDATxc? OX¹ǛrªP%){OşBp (bM fK`](%a!IENDB`PNG  IHDRH)IDATxct % C$ dž@ +ŠhtWVIENDB`PNG  IHDRH)IDATxct % C$ dž@f`džvW.)IENDB`PNG  IHDRH&IDATxc|,Ľ{K.'\ uWIENDB`PNG  IHDRrH IDATcfIENDB`PNG  IHDRrH IDATcg@ BIENDB`PNG  IHDRrH IDATcx-iIENDB`PNG  IHDRIDATxc?[W߿?c(h˜IENDB`PNG  IHDRIDATc?[W߿c2IENDB`PNG  IHDRIDATxc?޽Ϟ=cxIENDB`PNG  IHDRآ, IDATc zݭjIENDB`PNG  IHDRآ, IDATcr IENDB`PNG  IHDRrH IDATcx-iIENDB`PNG  IHDR!MM]IDAT(cXh'[WY .xG,X/Ty wyw[=znq6 ,lpGh"6qKIENDB`PNG  IHDR!MMoIDATŏ @|HYM`(Z&Iej(r|Se%ϏZnfS`T ֈ6z}504K߅ֈ|73/IENDB`PNG  IHDR!MM^IDAT(cXhgϞ߻w]ݏ@ .xG,X,HONa^p}b.;Ā ':ck ;H ,Y;Lb9IENDB`PNG  IHDR!PHY IDATcظq'[WY}P#aBIENDB`PNG  IHDR!PHY$IDATcظq[WDr{MnyIENDB`PNG  IHDR!PHYIDATcظqgϞ߻w]ݏ@@vNtIENDB`PNG  IHDR!MMRIDATx @ Q S$%ie₈\RƁ@@ۍgf>z@03IDATc?6UY¾' Ē(M U F_; >IENDB`PNG  IHDRHAIDATxc?6ĸ%'# WY#]*!!ȈbCE(|IENDB`PNG  IHDRH4IDATxc?6@X¾' Ē( ?_TWg %/A#IENDB`PNG  IHDRH(IDATxc?V[®l߿10?/{lIENDB`PNG  IHDRH(IDATxc?V[®l߿10?/{^{ IENDB`PNG  IHDRH"IDATxc?6[®V[naxi5IENDB`PNG  IHDRԭ IDATxc```e`[IENDB`PNG  IHDR!}4IDATxc`d0f`e``2 A0#{s IENDB`PNG  IHDR!}4IDATxc`b0fd  @ s=lIENDB`PNG  IHDR?IDATxc`d IENDB`PNG  IHDR?IDATxc``eIENDB`PNG  IHDR iPIDATx^JQm p&7AaQA>,+!  . C%PR*L pf1a in0qYIX$!مӭ{ΖQ1Te#fa>ijU%na\"C ur DטgW]\ y}aˆ=;ңY/ \k6OPA$Gg̴Dgdsjmvȭp tĘ&Ґ>)\pl`5=AQ0r!ve{;bэ 'H#b]IENDB`PNG  IHDR@4=IDATx^Ԙ銝E=#nŨWaPaРH ޔup\ɥ)36ֺt^m@Ȩ$5w4wFƨH5QlkK| p0 f4F"w>nԜU 8V V68S Rw>ZػD_MCQ#7x2e$;po abl ۙ: P%7<,xm!^ӘkcS\ZVKPD55 )߾oUw69Z/• ;"QCGԭŽ ]81;C%b"->GA*fз|uf) x.\ݫLyBWhZ5#o~T%1'd f(R lp7(o|O *]F{4oRAl웇XnfjDz5PbVbqxR/kS+pl **l{Jtج{ܺ}ltn,ƚSUl!TI˜xݭ ŎȯRdAnW6wV+v1GQ.EX'G}:> )*5lQBnp"O[Nf)gVW49#QppX;u@둼tb7#SG1ضmo" |<0Zȋ^Hlͩ28~I^BU~ny؋lXʚRzJ'gՑ=L~gff_G3KbS'˷zCp`v;='q a[r @IǢg7b!1e$ D==$ޠ>}ąsoJboƷ<||ܓ~d7RTƱ \?M GbQÅ`P?-[a*!`E^#;F'nbͅ$ # ԥmp0:k 8vd)Ec^W>!& M?>̤0cE$Qmɓ't8|YlMUM쫻$fF/Ղ 6{`&k:Kn~rl_Ä)!U[q՗Wp3c(vq؍xŚN8H}T\Uy[Y!<{\ǪWΠQi7Y QY[\A.:g 9 P{*f`+- `!}X)3VeɎ=;6c:Z 6i"/V(h @!? xZ0G׮]S$P/k |H_(KBnP 8lI҇iYJIENDB`PNG  IHDR@_XPLTEݚݛޠ᜵ߝߞࡺ♳ݟ᜵ޝߜޡᠺᚲݛޞߚޝߛݟᚴݚޟޞࡹ᜶ޢ⢼⥿夽㤾䥿䦿奾䢻㦿䤽䢼㣼㣽㡻⤾)CIDATx^Ir1SR9N,a[j] 7lm>W.Z4ǽ%s RU4wFhH/_YӺQČ]l&†qa3Af3;c.D@ƘA!0B@ Jiu6W?vٯg0(*| ك/b@ Q"_vKekץ7jmsV滽lFZ8Ku@PP LU#QpEInzu= T&*^I{Z.۷X;ck><7~:-3cB&hAvZ`|ZjtB$ HIoϙhIENDB`PNG  IHDR.ubIDATxc-D%@I+0`-jxJ %Dڡa `%t5S3#x[. XcZcsGIENDB`PNG  IHDR.ujIDATxc={v#-D+W{Y$p4$//)1,K@b0HаW0QtyYBR<-@FK,PcZc]d(`IENDB`PNG  IHDR >3IDATxc103LB,.v6(dhahfhCFdCC-KaFnIENDB`PNG  IHDR  IDATxcπb)Ԇ)@5 z 1BEIENDB`PNG  IHDR >1IDATxc1(1h!< 9| P \f !Kmt,IENDB`PNG  IHDR >1IDATxchá1030p@!'4 \ H@.3%SlIENDB`PNG  IHDR  IDATxcπb ONVo]Z~IENDB`PNG  IHDR >4IDATxcp123@! P,LAH H\ B7IENDB`PNG  IHDR >6IDATxcπ H2@Y1edK1|gd0sY@\`bpg8XE{=IENDB`PNG  IHDR  IDATxcπb2&ONR ,~IENDB`PNG  IHDRy!\IDAT(?KaߝQ[EIN*up(Q>CECN~h>E[KkSpc᠂dyo?:̑m^ֺW^$/RD)aOl0eDzDPuR2T* } v#v} dG\ 0qod\L07Ne)y YսΝs{- 9cp+VxM1Azr>?}|<ۓsJq4,d>{TȐBCaBE#M4[lE$6q4T(,6XD(P K{qIENDB`PNG  IHDRy!IDATx^1 + q&Cv8xDU0AߡU c_QR >5N4L:;w%?w2_Qa0K2*-t>5aSa`r]KY=e~'ҝVAЅ5v+iSz?WaqVCd6$saCsIIENDB`PNG  IHDR(RIDATxc`H/NdHi@ QM 31!M@~ڞtMz)N2ire|9@&soL<ܾDrNr:G% l! R1c}u}Zi쒧=>4DS:1 <NˍjޣxPjy< 0i3Ęc/xP u4mv-\ }@IENDB`PNG  IHDR25IDATx^NQ&@60h4!D# Fc@BMx:g3ilf2_]?/ *j!5TPg'|<{=(o (K( %U­fDKPPXdgj#.<; #[ٸTdґWґO4TSEzNzT W&]Ä7ґo] YzHWNT(Ymߍ;js0ݭx0 #rsvs rT993Z8c (Y{J%4;IENDB`PNG  IHDR2IDATx^n0OPœYy?$v#oB"Rcǧ7v<*7O^ #A*$"|0ȳP3 `˳*ņMbLךW:ԢL0<)\,JU[) snm#U!qBjL%?%_m#c )]OE\%/ل/ezS ݘ_2f/*qQQ u>UG>Fx+Fߕ१9 S|IENDB`PNG  IHDR2CIDATx^JaqbiQBjaK٘K7^Z!noA\^0pz%m{ag` q89driwei/WD'n5n(D Ռ}:@+$UHGI&>viaw4x' |BwRGR b(FAIj 5)S7+^mTeu7C^ҕr`<-'e&aJϭRmmGzLZlu4܀sGl64q2p-i ։-$ML1H|')#IENDB`PNG  IHDR2XIDATx^j`ǿH!8XNF .EPl..>/DBDцs.?p ,,"R,|$0Y.moar8XXh‡_@=0+E z>Z(-J\t1ͅȭa W0H 2IG U>fB&&%0݆\ NOD o|x"W3COtM /фjKR6"6ڎra XÃju- XCݚw5qxx,qRHrQ A!QN_7>LeIENDB`PNG  IHDR2IDATxڕ= gͰ3hr)u"ڡP*1F"\DHL(B O[&2C)@PrУГCUZ2/r4Z6?LY@G`6ԂDYBr^7ZvvȖ!+k Z9-lM: y1Uݯjǂ\+o-c#]A]IENDB`PNG  IHDRR;^jwIDATx^JQM wnk,Jm 6VR,\AB0@Al& ps)q}—_ {P*mŠhuK2 8 &VE   ;0?%!3pΥyLNcxT[hw1`Re{Q N] *:^['A`)lnZAWK[%l=U6r+c'sxׯ",:J@qC0w!q ,:JВ M 'WBI ь3Y$q6SKo>MsNS%A(֜_yA:IENDB`PNG  IHDRR;^jIDATxڭT=KBQHڂƢ$2A('!s!Z 4EZ*$lc!(uW{zCؔxxs=^{B \;APBG=ZfV$nj4Oj(af 4x~ö]U4Mh4afT]Wu"t:-n74遗2{\0T霼l6+~BPF"@|>G27\0_P%.r8fZ>хdCMFZ k/2\@Obb5.*܉GxQB 9fȳoo+92R::V GFL#hP!v 3h]?3A|:HIENDB`PNG  IHDRR;^j IDATx^RKkQUbnB.big !!$ PmARiTD d6"IA?Ӗ׌-d\Ւ8u1Oū+S+fuQ_Sh ;>4bO6kspi<?hǓZauq@C^dDLJF_ &y;9y _KןU>"l&, x\(QAuMx0 Q/e {p88K&PHڎ(c!!ueh% Ncq39B{,|T T*-Xگy~eqe! ,bb[8f^Wۂo6z-W?l6 (AFwWf߹DA :Jh4Y)cA NP p8Lh$Sڶw BE"3]T!KKGrrj,٬~dy <\~ժnKLF3x {z V쟞]~pȶm z=r]@c&G}F0oK%8Whp2bgL?&>lP\1wse8Ɨ/vgoڊ?<'\s9ǜeN2orA[ypIENDB`PNG  IHDRR;^jIDATxڥMKQ 5l .IrNA~@A/ZXE-DA I j6ΔLW{`0 ywi"4P5Jw][Jm]_6fuh5kpxK/T"D~5zt&oM@^Fw^2aJu<o=yI3AXPzDۺ8Bc}pЀTNmKp13؞ B,Zw?8ʔVBїt] _f[|8HJ+8|Cq@3/6Q%Ď=y65&*//eZ+,%'ѧRH^zF3xr^05Wʉ \q,pq Y'/1cgb;qSSyLscX-L.kklpIENDB`PNG  IHDRR;^jIDATxڭ.Q-܀, S[H Q;ZaCB"bA#J.Hv3m7HhԜ{424ɜ3s i`|L%.Yhޯ;i~'*E@q9֞-0{$2iFT `\E6N(dlvȞ^LU^qx9`8=u4V,udtM|4&S:Xt+g?\Iq9``θ=L*]ί)HT,ޑ%n }ѹF~vt;BUNn$\UU`9,ȔD<\ۦc`X')sЦ${J~ΐ~j~gضĴ0L;4BJKIENDB`PNG  IHDR2 IDATx^=k@ A"9UZAeů&._A?E4;;6"nB/tL٢9u{.tiIENDB`PNG  IHDR:=5IDATc=s#Q}b20ıE}3ɰoe ݍA5IENDB`PNG  IHDRIDATxc P6SNIENDB`PNG  IHDRVIDATx^e r'vqb*܋`B Q/iA1ς& W$ E17f-A/X;\o$IENDB`PNG  IHDRZIDATx^]A 1IJ#=~B_=t"l,x !̤OGAH7iA@"@ EzO[ {ek"t ?nj;TcyIENDB`PNG  IHDRѝIDATxc X6>IENDB`PNG  IHDR:=,IDATxc@AA?cʪw߱uqܩrIENDB`PNG  IHDR:=,IDATcπ |B;p:RL?˟~Fq# n>MIENDB`PNG  IHDRѝIDATxc`g`0f`d~~IENDB`PNG  IHDR:=3IDATc`ɠCp`d``5 .J,IENDB`PNG  IHDR:=3IDATc`B N f QU{ppۿŎk-,v["54_0?@T8')L1К$[Dɰ0/Ŕo5`g n p)2ek SS=uc![{U^/V0mȱ/U7KGq2-u^.!xDGh@;Q93 Auʢ9F1'flV)imJ$F3]6Ws;CBIwA6R7So"~$9A:ECsH㛄 ,W:%ǍW,'&"L.oQ)GDlU,BDb,9eTc;SimMHYAoT|"hL[dӴ)`1M1N&řH͹Rď'"RɊei[IENDB`PNG  IHDR9dR8|IDATx^kj1 '"NMhO[%zƚ!3)vlkߎ@zDE| u Uϭ Uu\ l;N% ,}78cv«[yS¡!s&T^kN~vƖ.iib^h 'xN_}9%3)ϭ8JBTxg`WJ -)#)VV=0s;lm|l%g7\ PzL@4Lԁ]m=Α x4>/F+n3"OuI+|RL1y%o.2MJu2;_!7gIENDB`PNG  IHDR9dR8IDATx^mN@QC4+t soLN)w̴Ng d+c}$")6h.Lwq3N3nzlFM768d\mKIgWN.25.=k *;sm,BEkqV⾓sI]w:־?GC+{ |bp_ta|#/ NƤb lR=0f~6$Pp5o<}o ڬGR[p`w42M{\۹.6's]LIENDB`PNG  IHDR9%>IDATx^ˊ1D?4fADDDf,@򞍗#ia٥S9G=Xe:Vfnd #Hnm)_OW[Od|s*5tlK\*IwQR 5$a4VyiVUW1FЗۂ):#`c(ߵq#\WZ;OTỗV O#/fWk؆''/^7y`"Ho*ۊ;@X]I0j PpӔEOsۂ+|X)b fUz#M3ΨYE?vB iXrIENDB`PNG  IHDR FFIDATc`Al cǬmIENDB`PNG  IHDR JΛJIDATx^1 0k-":z D,8f ׺t>&"h[:2dABH=RIENDB`PNG  IHDR JΛJIDATQ @@m㸃S8(mXP(TlTs:]tnDs;#"Ow0JIENDB`PNG  IHDR LIDATxc6W8XLGIENDB`PNG  IHDR LIDATxc@ l LljҰIENDB`PNG  IHDR YOoIDATxc@ T9-Z)IENDB`PNG  IHDR JΛ0IDATxc 0Bi&yad)%M6T&;/T!&)UL!te^nIENDB`PNG  IHDR JΛ0IDATxc X "&F4g`DiE't!Vm\\IENDB`PNG  IHDR SIDATx^mA @ FgEtkԁxzqG1ZFIENDB`PNG  IHDRrP6PIDATxkes611T )ҖAТ"V+RVoDTTވ&h A  "ASMkS6yvfv6.-{ٗ}Xw<|R5Mږ?yIHk. y/edmf_rh_f2=`&RCeKWU+3ѷ*m53i̇/jg==Ǝ;A E>7K4W~ٙaLCOi%*Q3cIJMG#·76&}I -H',.V*«pyf/M% JQ o#Y߉l4bb$}{Gh41M M7H&5]0p`2ŨLN] a $~8}dч:>?63!tT06cUVrVK1;}f}]sI|$B\Btim#:^&z<] mkkQY}.2"Vחݽ]P*fh{K՗wp] 8]k&LuIENDB`PNG  IHDRYGIDATx^} 0PeA؛A =t!Y ^11K$a rb$R. 21#:0+Ü>Z ̡7dCmtp0(F岞&\67.+&ud޿ŠXvQp!R'a =&(/DO؂$Ȅ=2Kb`IENDB`PNG  IHDRYGFIDATx^ѱ @:%^K&~g~fyC8-LC" ZxgcjJ6Xh)P=poIENDB`PNG  IHDRYGIDATx^?QFVQIT D5y*FfgDa%?̋暾'F!1%B`8ӣGę%䈜=.vZ:(`}R[2 zYbENt83ZlbG{ό+64rl6JD9IENDB`PNG  IHDRYGBIDATxڍѡ@ A/ E\9 deV4L<]L2-b̀g=tQ>؁J:IENDB`PNG  IHDRrP6IDATxڭ=O@qag4:n:nt&!t2JT" "Wy;-iB%noz}>_^b{~L-TՎcv6(>!&4M3BL~l"%Ek01Eeb +Ae]R B&kOOqruIENDB`PNG  IHDRrP6IDATx]JQqGAHBP$ABjv@)0ZA8e(M:1&U e+G]la7W(ufͤu*qv2qG⌿+ 3=yYwq~8Od;`XHˬabbC D86vNPq.7ί:|vK9 d? 6FWMcxG6t1|hAɸoo` (XJd~F 9| wF *^Ud0PUNpQs~=.fY߄xoAY+EF4dQQ %а>ͨa>Hy1STIENDB`PNG  IHDRYGsIDATx^1 @DI{Ӆ,&:i v$``dtCaFvfMœj BD=#8k(賃zqlٙ-?m:tl >D!bIENDB`PNG  IHDRrP6IDATx^MoQ_;ݺ01q"J,iwmpƶNM\B4LЁ x='QrcJIsyW7fżWPxBxFFѲ|>VXca;x :{z<ձi KS."H PUxx? djq\A@%f=M¹2zj44E>OzS8wa#}ғQ'ʲn;;X_E+Jl| ft:T*!?N&z‘'Dzy\{xdV/k N666qj /Z?ru1BV%[e{pFS(Q;Jh7B8. ^}H$r dg,dEUYC 4q fX7%,u{}y`OF7\Thc>´l~5Ε>W^l?DG I>֗7~u$'~+Ė IENDB`PNG  IHDRYGIDATx^A @Dߓ9pQo!x^ȅfȀ =Z?oΒ%2X:_kž͒feĎxGOJ:TFb7BM(@B|m"-OÊpi ㌂*F0zg^X=HIENDB`PNG  IHDRrP6IDATxb?!ӧOab c!B(BH!#>o]AA)62h8#.jR.dٌ@To +A5Rׁ͊&M[(-Ҕ&P2+(2 h@<هE}"$%@>T" 0-Cl҈@P(lLPW“EyhP(669,q2_@q3E GR@lMU"łIENDB`PNG  IHDR-#&PLTEPPZ*qIDATxc H$)`L13@yP9JWhIENDB`PNG  IHDR-#&PLTECC%oQIDATxc H$)`L13@yP9JWhIENDB`PNG  IHDR-#&PLTE==@IDATxc H$)`L13@yP9JWhIENDB`PNG  IHDR-#&PLTEJBXIDATxc H$)`L13@yP9JWhIENDB`PNG  IHDR{nIDATxc@?*$mdpBy4S8x3"4IENDB`PNG  IHDR_4FPLTE6e)b$IDATxc @$`' YIENDB`PNG  IHDR{nIDATxc? mdpBy4a|{0IENDB`PNG  IHDR_4FPLTE=`DGRIDATxc @$`' YIENDB`PNG  IHDR~^6IDATxcZEFLHY5.N IENDB`PNG  IHDR~^6IDATxcZEFLHY8;b)IENDB`PNG  IHDR'IDATxc0KL-45?^0fᒢYf8Ϗ?IENDB`PNG  IHDR~^6IDATxcX-0-hnOՅIENDB`PNG  IHDR'IDATxcMI-45?^0fᒢYf8JIENDB`PNG  IHDR9I5IDATxc<`bMQBqIENDB`PNG  IHDR""IDATxc0KLE4ƍ7jܨqq*7b8\-zbIENDB`PNG  IHDR9I5IDATxc<`hbMQ8v3IENDB`PNG  IHDR""IDATxcMIE4ƍ7jܨqq*7b8a?=mIENDB`PNG  IHDR |lGIDATx^A Dѹ'/S&D7E.&x4Lb ݟTCs*\>U1X桿LvIENDB`PNG  IHDR |l8IDATxc04~fE< ˜R @+$[ lFEsc/OEaEIENDB`PNG  IHDR |lHIDATx^ M 8F /[Bh 3Do)ǎ,Y7BlYAIENDB`PNG  IHDR |lCIDATx^} !IOh;c cԳD#!h"V$~ Y#K5NU1X%0_IENDB`PNG  IHDR IDATxcO6(ZK!3Zy^S}e Ԍ_+FZ<"S2/_Uo#Sc˰gr4Fj/qk2,ӏZ_4PEP3ߥބ5&>"?vc^&>0i:|Z~DUxiȰ_Q!ϸJf_g|N 15 }i|"x\q$eK$hEhny#P+9',C `9}-'IENDB`PNG  IHDRIDATx^J@/4(݈nNX1BIݶxEz*6d(Vq#By9uEW4Zt㭝(POHN3 zlv{,y5zϚ򭖝JN1 n?/F=pPC>~)6Kzc)\l+znA 40kܬ׳e{PYqwtOʝ+ IENDB`PNG  IHDRIDATx^MHTQ9?B?A\%M}KmE Hl\օ4I.\M3I̼чGr??y<qlʠR_'mXzG>JPJխ=m cӬ;R "c6,4h_Y8G E܀?Sa1~8+ߺK ]URF%zc"*,ѻV,HŷDZ3žIjy(݁vh;[7B`6q@;0"Bm[͞*P.%b5;ruQmZ|:5sU%]o`tL"!ףdOLJהjZ^֠^d2L }ꧡ5N6N/~1d} i^6C1tmB=?^`C$Oyׯcٵ.lT'xqG埀T"*TM`OppO?6BX S}fVV5r'~u_vuCA5p YNeZ!PQj`=A#vé;W  1d=z&EO?rdaIENDB`PNG  IHDRrP6IDATx^JQ$hBV!cr^'+m҂adA AW lf`=reHp7s瀈cu:#Q!7C."}d)>R4|Ȥ j+l[э?mR(. Û9r꼕[]qN%>L&Ge ^[[|xؽ1.C2xl x D"q`_u[A-E.ỹU{ wa&ẕ "&)ç{w},E#-JZyT%L 6Ɇ3ށ >{YBێҼwSYUgD $ R=@4!e:Lb$Wswה86uٙh{C_aDw!լO5pGdL@CPD @I ʉLxIENDB`PNG  IHDRrP6uIDATx^Փ=KBq/ Q-M%ZjiOhl RK!|!(y:8Jz=/$жms3<-Y(=6&]X.<^lN:iD/k¨PT]L6>2?k^*Z""(PP2p›=[M%qE]4 Oȣ]~7,ER)]fw2Bd% "Ĺ\IENDB`PNG  IHDR 2ϽsRGB0IDATc<𝁁ՙao F{<@qO l 730U"bf<#33Xu-3sW@Q@l 357lX 1b }XLJffll_JH|!(5,S 3u/0?"c+w] =4u',хAP=lzzE`2 >b愀0dh4[{~nLe26QIhAtz[@ޗMؘ Rծf4M3ۆԂ WIENDB`PNG  IHDRrP6IDATxڭSKavݘ061VR"z̵RK>@BO={Q(j!GC ZZ4 u湻әJHRzq7_73|(PM8;Ij fknn~QF :>#Z1JhB!KJwJDEadSSSqM6n###N^W FPaD:АѨ477;d25Ε|8q#xvMFnj]dYf86crY늊r"񣱱dXoooS6-fabbjR mmm=9LCuggGAP2,(wwwkx2vmaa`ccEt;PNVt]]]P( A!I;Ӽ,՜ΩXE'^bېNNt' /c7}>rh AI~ zX3d,X'mn:>3˕٠t&dM8ʧY:D-QRٲ`NNϊ⾉  oj?iBVs"}IENDB`PNG  IHDRrP6sIDATx^ŒJQ}E!Ǎz DEf2!B*ZFD(Z.w1l¢s~x)~W6]3x TvWW輒,%C drY5͠8l``d/p$h\*i*4R)w۶_ed2]d`+IE{d jt d9.l9sicMІLI.Όܵ8t]H}P 0,KMI0 UAd# {}ht(E0&!{;e,u:*C{h3Z,3gB?OieQ!k)?M NIENDB`PNG  IHDRrP6"IDATx^ӽJA)շRķۇ1[$v?iNsKw09XH6r$eZ#Fqm:4 ۍcRf$}<o'X.J Ma:*簈NmAM_e؇; .Pl꺳ۛuv;WoGNS O ˱3!M_U0(0lxy=<>{7fI1M]kn` b:C܃o'],-4HX}v3)4O0u-z?=IENDB`PNG  IHDRrP6IDATx^JQ`K)ڹz^EKG"wnBZs!DInH w`3jiݚ3!)qeY,3 ?1!f Lӧ1q6\.w S`ەRi hcj+`:06ϥyrXlxG;܆Sg!dRVUJ j1&zGWXL 'w< vd+h si;Y@&xrbWP*L@O8=RЏX!FB2Ɇ!6 !\?A}lSwfD֟=Yk Gh6pӣQEkl,"jVCE{Szi"A J3l&X[[piB`B! ïVVVVe^* yr֟γ,o19|D"oMW4 ($:#y4~3qa(9nK8| ,Di& ww vw5ڻ?¤MGUhlAGP(17۟- {W?7ō/Sj*L΂Ey})!O[xeGrmD j)+%%w,`oSp{g䒀3>iA ?"CBw}! f *qγ',˚s]7}pN_d1IENDB`PNG  IHDRrP6IDATx^͒KQ}?'#>"""" "zkJA/AGBU]]iQJfΏy .cKLf^HfGT Zed2 {'dD>([.㠪*Ȳl꺮S4rhv=,A׃nkjre NFxv@$ɢ(: E ޼;0>Gʩ~XDhvmjEuFQ$S0Z,gmF%:2-  QSٜ 5q&h4' iC(݅2}7խ9~S +lD%]-1(@$mڑą w>\dpq˨V: 0:ޛi:z~X(E# ^!O?MR[fIENDB`PNG  IHDRrP6IDATxڬSJQdI/h!]B ml~ V$ v 111`#Õ^\ !+893'jBO!J0YUըtM8A[*J$گ 'uIJXW-.3]yM?+T^sDq?0GcCŕaL;`wZA`^+BmmT,srl0{S8Nbۖɤ /d|>/LS]4*ޞS̜zҲoT}\EH|B90ƆA09S0"<[3 .҆ 5~GBqL(,W{4o !#{ICi84mIDATxcxs?18 |2A R7 58oOx&f8=H a@- 1IENDB`PNG  IHDRaLIDATxcxs?18 |2A R7 p$I>]ߞM  @{!€Z}Li2IENDB`PNG  IHDRaIDATxcxs?18 |2A R7D z53i= Vaϗ@| %g>]ߞM_ϻ5@`8? VlH#_E0ac/DP "QIENDB`PNG  IHDRapIDATx^С @D@Q C 3Åd9.pb͊g&/<55`l&Z[ש-gج$(X@Àn vOD sЍ'}m:IENDB`PNG  IHDRIDATxc@.QZGj:0vvoIENDB`PNG  IHDR _:IDATxc?1#.PSf^I8^I'IXQVH|HI:IENDB`PNG  IHDR,tRNSIDATxczQQFIENDB`PNG  IHDRasRGB8IDAT8͐N@gنPح!;3X@Bx ce"YIn̹9 Ŀ^I~ ) 0\Xyu<7s^cNZJ鱸MחmW\mzH^4/ލ`2Ҧ?t'D}_0 ,M-8gLa]1oeYh \q*zZCu4^Q5'avz6AEi%D[TP`#, 0La2bx}E[ܖxIENDB`PNG  IHDR&9IDATcddde_?$S/IENDB`PNG  IHDR&9IDATcddde_?$S/IENDB`PNG  IHDR&Mi"WIDAT(! o#IfP48F # @@XK=+#MV3L\=  Ex߉瘤9IENDB`PNG  IHDR&Mi"%IDATxcπX8R i 0NC=B*$?g I?%IENDB`PNG  IHDR&Mi"UIDATxc`dde`g``à_B'?H,/db`pepOqǗArqF91=IENDB`PNG  IHDR&Mi""IDATxc8W ȜȜ3]&p;^\NIENDB`PNG  IHDRa1IDATx^SOQ*[m.{Vcl`s%#6 "|00@3Y&9փix{w9=w8*Қ5A.BgrrH%>s}9 j;9%Q v6+ TDCdcո"5E1я»,tr зQW{S+%3Ǎ2p*̘HhUH5B1O/rXovX&$^.=G>j-"v)OuH:2޾fPNI6Mc-bO5.!=a ZX [H"PNI/`uaȌ5xl؈jK0tz ƺ7!¸v#/jS+gKboNtG'k߀VN}=gL4>`+IENDB`PNG  IHDRaIDATx^]KU؝Z$!YbTQĵ_oU \ivBJs2L&8INw9תk\9uu[W4]B@5@迕p~叟{w3xQƓZ M ړ ]/pqsgj/錝C~w oi0,@]z7 ԍya8HY_=K[TUƤ>^DUyIHERV UUgsT<Ʀ{5WQ/ Nhz_G3ѵ$ `%uLP575N< Ney7:O2dݒ|n S X[9?_U7q.":8:q0m60L0E4P'`87n;@$w1/4B}X!xG^(˒7_\\Tj*/έ;$vT{kk3GE0֡(J_dE̎(1g__xI̺XLp!w95\%+jDt%g9τ&'9c O0T3q. O?k{c!Y2:?(*``޿TPIENDB`PNG  IHDRF3@JIDATxcM1߶0|` A"mdIy}k͜13D3e@@ @ (1kRc=AIENDB`PNG  IHDRF3@IDATxc\-IENDB`PNG  IHDRF3@LIDATc0| A?Fg31yD*'+12MS}IENDB`PNG  IHDRdIDATcj uYIENDB`PNG  IHDRdIDATc ߶2X0 @EIENDB`PNG  IHDRdIDATcg!n B<)IENDB`PNG  IHDR2'7IDATx^ͱ 0F#HvE a ibɍst· ~ w) 9BELAܢTw{rֹu99V\ٹ%OIENDB`PNG  IHDR2'7 IDATc`|!CVQa"X.6/IENDB`PNG  IHDR2'7IDATx^!A e/pHpOOE|Bi!g+kdML;jf41Izqq:l8Wu-th@m|cVM. G;'K,xsJsZ /2-)IENDB`PNG  IHDRasRGBzIDAT8c`hQQQ-[U-"ronzWR0|]]] >$bH!AjP@G#z%IMqJ$2% ZxIENDB`PNG  IHDR 7$IDATxco@F9\ȐFP4 &G!IENDB`PNG  IHDR 7%IDAT(c@`a?5~#S#'=yK2 4IENDB`PNG  IHDR 7"IDATxc`#2F2!1L?<*Sb\IENDB`PNG  IHDRgLZ IDATxcoE"=U{IENDB`PNG  IHDRgLZ IDATxc@OI&e!xIENDB`PNG  IHDRgLZ IDATxc`!\-IENDB`PNG  IHDR)R3IDAT8c@`a$Sdj3L,OHf5F` > oIENDB`PNG  IHDR)R1IDAT8c@`a$S=djLoT`\ CǩCFpu֒IENDB`PNG  IHDR)R+IDAT8c/@`aL&S#Vr5~!W#n#èG:$ xM8IENDB`PNG  IHDR ZcIDATxc(_y `$3PF Q@Y_&?CqCo~ߦ1 yeY!Bu"I! gIENDB`PNG  IHDR ZbIDATc6 `„ 0r! q1h?c~s2g[s |2y߬g*TVIENDB`PNG  IHDR ZQIDATcǨ002bFd.7_Qp2c5͍lό0O{z{eX! tIENDB`PNG  IHDRI 'IDATxc`?+HOIENDB`PNG  IHDRI 'IDATxc [ 3@IENDB`PNG  IHDRI 'IDATxc`Ġ3:rIENDB`PNG  IHDRXvIDATx]M @ ,*" m˷]XϺ$aB`bY#$!6I&YwYKԡwAQ0 (31D`aWدCgaKJ|-nOIENDB`PNG  IHDRXwIDATx^] @'M$h2}F`|P1R|T wy:[d2>=e|y݆~us|׊u%`kzT+"1Kn@c?UHWYmfIENDB`PNG  IHDRXeIDATxc 313*a|VON3| p<`Ȇ 0X3" -BR#ѵ0FZ0pIENDB`PNG  IHDR #dIDATc (ucˀ>0 2 ?8?H63C0?#;_,R b*`?fF,f|3'gF4얰~82|y;W*SKIZIENDB`PNG  IHDR #dIDATxcZ0L53}C0f)`H @`@ @ VpK.Ȳ;3#'oOL0~=z5+ KJ7IENDB`PNG  IHDR #d[IDATxڅʱ 0@_ ` J#dmNkDZ@Ѩ:virB h9ȟXIENDB`PNG  IHDR}pIDATxc+L>F Z5IENDB`PNG  IHDR}pIDATxcX_L=;j}K`7IENDB`PNG  IHDR}pIDATxc`c0` 35 tIENDB`PNG  IHDR3nEDIDATx^}1JAE_b` f70s'; xP 4]L7021fkЁ[٣WKӃn3qtzq۵^ƫOοfjh0K2@`XZ `N;AA@ C&8>F@DakEO?cOΗ=ڠW:j4 1 1\IENDB`PNG  IHDR3nEDIDATx^}1JQ`a!v!w { B. l b#2 Lo7ߌen彃??iDۇGv{\濟}17;p;-a`a ʁaX$, \)$D&+JRʄ/UJ l\~船ԍ˖aIENDB`PNG  IHDR3nEDIDATxc/JĘ2G<pa'VLSA{]>&o _— 7I1p01_f`bb`J~ɀ)0+IENDB`PNG  IHDRXIDATx^U B D_XX%QC)JC(|s"CEmcXK}:%ne6N7{ Qo_RTEYP (m#% RDJ~Z fsIENDB`PNG  IHDR0IDATxc/ ff`edP2PpZ0&nIENDB`PNG  IHDR@@M PLTESSSSSSgtRNSv8sIDATx^1 B1Dы[qS*ՁK Ar@p?6z>AKXA8t< hwl4l {,`+Sc(74+P8 W#*IENDB`PNG  IHDRasRGBGIDAT8?NPPw`an7 8M,57J;KjLL0YyHX$03|da4Y&};mϪZiz 6M70 LP˲Xc]V`3snuA~$EW ?E@}, $n _i9;B⍗y+y?J#GQ4($qSN],لq}t8':OԞR8jF_ol 8dq+!juMz/H (0˲= Fφ:54{k*A^w:7 XE~IENDB`PNG  IHDR w&IDATxcBå oL(@ 1[ñI9 8K8! ~R@ac(b't$4D hq)@BaPOJcSWX*)@Mq& q.:LV>_IENDB`PNG  IHDR w&IDATxcb 0b&bb+bC`LR @|q,LG1#+lD4ŧX{ǥP9 *@ű) VF _ ls-&y8V>A@IENDB`PNG  IHDR eIDATx^e 0ں@lT0"(t!r{>Y10Ɋ+3K7cJ;"FlC;ӫ )hqlҩ3 dPgL*?<-t[8IENDB`PNG  IHDR w&IDATxcBå ohb[Ml@|/@G01|,C@ CŽm |I\ݏx?.@q5ű)+@@g1HR 'IENDB`PNG  IHDR jcIDATx^e Q=7-DEEJ?‘e0Cԅoل{@#E!H:S^> S4.4d'p9>/avIvK`7,IENDB`PNG  IHDRo,IDATx^UAPGk10(p %.P^l/&?Q/  q >`lcIi/t&S9@.lONil6Bս J04|B!VAXBE2;-/[@6 1nO A n~ ʹ|{;tߊdbr)xGЕ$|bx,ngh4B>f \uh<0L^h4P=D:GG-h:v%T rR5W) @@A+"JiYGИb*TŔE"ukaXVX,84~|.3ĕ=&s V5><!bzI<-MS Ez=9bݢhH9k::60 &ƇqyKjV]Y,!3hvNZ/gV.MrD0)j+i4m؅)kQ <1ҿ,:jg ~[Ol{$h7`'2$?j9IENDB`PNG  IHDRo,IDATxUMKQ=3l4@PZ7#jVV"?p4Iiۦ "hlIV E+j2zӁ>9{XIMSeOUխ^o=??+byvvFwsφQ$ID" *c a) t vlE*^Y"#[?"##a$IaEA.CPE(B*B0ٝ)svppxh4| B >}n@"n0='H߬uvqtX mR]p4.g)cv&Ϳ݇; Ezp~V5G;;Q'hD/! !z IENDB`PNG  IHDRo,IDATxc1+1;0M4 3fEh)S~~&-ҥK?}rxe ;S'_[Ǐ@>?'OgddY ,dbb GxsWWWpAA0|YY(L ZógϞ;w{`}-;v,J J?}͛J0]rE۷BBB@MDS@@???˗/{_v%wuXEDDm$)֗?\ S߿KL@IKK7DRf>dURR߁-gMx\r0&&Ɠ'O$&&nZI\\-g.^:==.M2>в[w]]SSd>DVCabo窩-z2RihZ( w@_2YܛgLsλ7iCCC~)ghE|U`}%IENDB`PNG  IHDRo,IDATx^Ŗj@ǠgE#i L&0'4u,KBO4⼄h6l[V+8 Md'ZgYi%t>%=}0nǑJ`Y* $NSΆs{.v ۶7(oQ>W`n5_*IHVC.TBi^@8}ϲL&Ch t:ܵBB7oxF&-><3%Ty\.U-| f3 p]7RAV.a<(1Y?CyLIENDB`PNG  IHDRo,fIDATx^ŖAn@`+R6vCBBTO+؅=%U#2d2?F[.? 34 ;Td"4g'T_(4u]a TTRK*BC[^D86i(`0h4BYMۼ45,I BxG8hF xiԟʾ폶%}?p8`PJ(3걖(@IENDB`PNG  IHDRo,}IDATx^ݔ?k`/1ࢂK`ZZ'պڏ% 8nƫ`BX$`PVAcY\?}SHgH^m6̂-d#0dx 6Q!j#H\u WfjWv;l6T/XV2Rd l:Ѩkc$IGl[A͖;%0x:0L8<EqA^@;Ѩ`岇L&px!H|>zBtI\.}hT*uMKsX<+uI,.N'f$U_$wxg.hn__E* h47L$, YIENDB`PNG  IHDRo,IDATHc1=1ӤI31222i[i-9 n좿AEA8##C,yΝ;ڵkϟ?%@ ܹ#ѣ~!!!)>>>[n~ZL,yӧOx@K޽s 1RA7nP}e???//]!!!xxx~ńݻCYBKT*efff|U+7@#66vׯ_Wrpp, R'OŘ?mʈXXX{*q ί˚jeTTu\PP?,Z [v/ګf'%%F "//?v,h1X[ ͿN )))111.dT8vIENDB`PNG  IHDR b]TIDATxcXjc 30H %.I! KaIJJzP uov:H$Ow +?[PIENDB`PNG  IHDRf  PLTEO5YtRNS4BIDATxc Q0 BqUI}IENDB`PNG  IHDR b]WIDATxc? KZqKKB fat@,OaKJJ]zU(]Rڵz֭" 5Ob6dIr?ɟIENDB`PNG  IHDR t$IDATxcC(-*w*6]޿BIENDB`PNG  IHDR t%IDATxc_3g@p9wۉ?? !v]+IENDB`PNG  IHDR0IDATxcO6Qi/@NҵJ/Tb8.Ҵ2ޒ3|fl)2{9@͜heBUG g5s B?c+Dj`: V)4go? }i.ߥz{ ^E,YK@m,*L|!/6?FT}$y{g%:?8/5Eþ9HHM3߇ {Yo8(^Ij"RST{F C `@<~IENDB`PNG  IHDR IDATx^OKAg-]~Sf6;PnCD,ӼlHT8%sx~ ݟ棫w?Q7 bazmU'h ݵ؟zYt!8 ) e*%tM(ԠO)yԣbGulCA0zےdB[鰈.7}>רCL4*L6 :4bF fPChh\_m c h^ۍYwvSIENDB`PNG  IHDRIDATx^KHTQƿitZQM Ud.p@ Bl",6AًVAO,SR0;/̽46pqw4Q@f(jOžI Jܫ+Oi(^h<&~Y Z !@;J] hHd"`^ d%0 wʢ (#SE HY H( PHG=] 0 &^>3Fu"f?+!_\Jcfs]qfH%"}+׻;.EplFlQ;"#NޜW47 \.(=|~hojZ)3a.w'ꎧnuآ3+^7 |)`(u';玭,jHс 'iF0Qa3z/#:k*8%#1 blWO ;Sʗpr$7[VejGգgg~<6a"axz:WjW>Ţ&0jrлֱ>a`鶥F|g+" vlhd1F`ґ b&Ȑa J.F6;.*JW1P|zr4&s3 4o*ӎT O}O²&8qT 'dl7sd +.T}|FFG$@IENDB`PNG  IHDRLIDATx^KTa߹hfڨM,,CIEZ ئEmBEA1\)!dҢ,`%r^)t^g{C CN1r$]@wZm5}pHJb9^#i^8ͭ9w_s[ Yʑ14Q$`Al!@jnO{撍YF@~aKUS_ONw-$B9פg{>[TmUe/*&?;r]Z%L? ӥԕf}?vwhE;<g_q-pQ?R!$5zp<M*dHFCQ 5ZrYVUvaxq'JplUi8td4z8v@ nS]a>tjK _{[W TlUj9:|?D[zp,ynf Hvϟ)X%&CYPL:>AAPUQ>I$cd4Cx v> :r{q @qK6VP_2Āh 4,mnO8/IENDB`PNG  IHDRddGkkbĻLJn7ڊ &Ɨ H[d* S^$E 1if3#&pH 쮃<[!➙*!q 0#0wNp1rz6w+ymrȆSH-c`vZTXU\7z!o1B.,˳ .z 77X~d%!J3(C)>XG[#ō(?E9 Q<IENDB`PNG  IHDRӄ<.IDATxcvx8d@@$@AE!ܐED!zDd#(Vzτ"IENDB`PNG  IHDR(-S cHRMz&u0`:pQ<PLTEA7B3C5C5C5C4D5L3C4??88A5C5A3A5H0B5C5??UUB3C4F8 M0C5O/AA B@B 4QBA"OI4RABF4R2S3R*U3f5S4^A?_4Q@H4S4V66Q2S4Q4Q2S3S3UC5i&B p;4S=: JtRNS3ܜ4  960]V䒧^` BFt6#.DZvۋ|[7#=OIENDB`PNG  IHDR7IDATxcOAر(`fHx ΎFϪp0ias R`e!M0?L]:!Mo2)τCcpUã!9W4@|VYHMU@MIENDB`PNG  IHDRLIDATx^AK`pPyt-gHF4rʹm%B}up;QŽxMF0q&AS* a? f@=(<[?794V[)J)Y> EA" ab;c6,-}ȱli*wͳbQICEcTEmЩ68vⵚBlԪbwy}Slr3[A(e\/# D --A5~4? 7bn4~4.=ƅIENDB`PNG  IHDRIDATx^K\Ezt1 * "0Kaw(>M7 #BbfP\)Ap$3vnwŢBUu~mgZYfrOY}/~^^m]bJWo1R888Fhr#>}` +jToJ|8q Ox@4:TxpqYL(;{/܍-%Y"cKi.u7k݄2Ja&D8u擱맶2q2roîJAT?wft9+$#g^|/ATN=B=WNko->17s(EŴ>}rkvhWvmvyN k6Vv p#jfÇ7j0ϸpP0!AMw5RF ;2N%k= "YGx̄KܘdO^ RcRYjW Py '%5& c6 Jb˼W攕`|[WG16_ R~5r3W<0R{g|p^Gs PCkrm/k.:P7 Z% i-(hftB/߁`%IENDB`PNG  IHDRIIDATx^MHTQ1gFt~̙, G\$-bDZMA \ZI,M r&]!Y )2ٌhw=I939}C ԡ0L"XdV1o'Gs1" њIO " i/au V*OU:Ú @kS#?cZ;qsl \g?G ?•}uMv`KFzi_|4W*@VkZɔzpu'jҁ{s"F+Jϻ)LTXؼz?"B(:evhm/5aWt`:+ezͿm봙 hw{gj;Ccܴî Ipe $&w՗otaCq : ̛Rě0&ZMҒV L([[^Fk" u A$ؕέW|^ȣ 0F~K/H,c1OK8ʓLT^ʋN䇼ˋGL)9 pd3Iω 䔂)OIDFJF!^IԄ0#UZ'URє4߂_k?rf2rfa^_V|+!)^6S%+ۇG-:2u֕y_r% \ʣ<0j*1c; 9IENDB`PNG  IHDR7IDATx^1 0F۵ n.x8xBKf 8 BBI~LJAW(ٳĝmx_nc\V59p9j*4M傏Xq 4=HD`Qr%>D)6H@F AU S{ '(2m\qƺ\f̀i7n<D"1wN&#Ӕi5 ,^=w11N7;Ou2OgMmmmO;L;L2~5s?k<?l#|>A*e ÐɁ{a-gˑiʴ?J&ik>_ν{6<\eO||G\C`N2뮻\yl3g++++G#Yf !"ӖyDp3soC޽{irhnDw'' ֍bQ )rYO#@3'rGXqxRǑGip/۸#ȫ2 Hr8T b`B?Xhy|;\k{6w7>*)y ` ('ɂ)3=R}T؇]%+ݻw-$"0;;̊ n`ChѢT*ud >Mj vqO֗qw#"*0 ~*s=crsK3a˸#왽ƯX;(0^^jT3Njѽ*øӿ2 F6yȼ'޽g#Yob (p%D Bs7&5XF 1w\ VHǃ5y ` @[B Ij ) >uog};ӠÕK,؄n[MHk,iyhB@[ {wzKwA!4lP1#Xs9|N;}mիu>^ [$5ЄP>+Ц~{sr׭q]~x4fܴi6Cww׫ t}so{Y3+ƵVȴdđy{ ?3<P*=q"0O3}7[%^%_,Yܖg|,iɴej'R9&N{[ť^>.UZUB+׬PPV!W=|Η. [ZOҸ-(:75PK>aЋ~8W]PT4G#S>r9 %NeS7;` -Uir%S=NKe `ħi@h_6t@g߅>ChD@@ *ৢ6?{~@%xدT*5wJ. O\kT`Q\ @Ty`C&#Hb"~ @'lE]>n @x"w&wGS!k'<?(S3\p r:餓ΔǑy9,WfA G|A@4/, 73fPf(!I%O)?''@Tms|! _`n?K/|Y~֜Ĩ2N }?@GLF=M*@ޢ.jfs[?Go;ѠAWuy?8tAx.8͝'w_0G%XWQLp&܅^D+-c]$yLOt3<SOr?<@\w@t {I%hWTw #ӓyɥ]r( >^XU|Hw .LWRoTyF!0'S :~555777NW:7oj)YA~d*h^gQpމ~#͚4_YYY?n 4=9Sp}xDM#\L@<}-ϦyL ~ءC~/`yQ' Hmf 5T/[lWuttu0Q{l<ǯ36/}`:~yp8 :aN ?w5Y@y8zҥֽùg=||bL c*OD0i@!M&MTظY;vB4{Uiqe:i/upuG[^ʹΏP#Ç0Oɥȴx7B0*꫾qIK +/Gܸvuu1B:pү[(btouMx.֜`-|̓5Qxkβ0XG6l?ݶmەB0y6?:  ?G+j`JwyQ*zvh_"j"M 9jg#u?8~6 @@pc&0?aw\!#y?NǙ(]rYm*n1Q;n(0>#4I^crqc=\Ogwܪ#fK7ju\Y:4Ikc}X aÆ](Zwb!agLҾ8L_~y %܂;:Ct' 9OrS,!2ڀ!rKX7C 48+jmm=n"NT7k>0Ped5|BAYXe\Q |thA h_|qkj@I]]0? ~oE@U@#x_v<\rj9 A?/T%A ikk#I[͛7Xm NJ]F8klj+g@ۨ=,JE@+_`0jOpII ,D@;SV`Pm(~2WG@ ;L0@'LtE@ 0@hG#}gf5ϱ#N%JLߡd3P~4E^C+`_ک?9ޗ^>gyU`@+S,ucL;]tOiN4 ( ~2][T*AJW/w0@_wkt?LE O,PrI*ʽz]ڤ#2`s=yC&~oxY0{z9B z =30 J68:$:~duzdg#DUM-tj<mϱU2|֊`we\&ˊSTEPݖڵk y\Lݻoe?ζ}P,L>ɨeep'ǝ_k=|ք\[:Oh塰ç/:G0:@XfVa6R9AD>mԗot3%#RYޱ 65 fH-i+lF}aSrUA%roQ-t#BVL#>?Vco>rG@)'Jf 2Vst ^r@!14OGOz?鿼VXY~ACDjW^:O*2W~oTi<@AQ?(je%ԛ< vA.MAD@`[LÃB}@`Ru~yN :[@̋*@IiZ =4%9A!XX_ Yq y:R/@ ucv.Я@>1s> _< 0A\F0" ^9f30^\@D[ 0i D4;u466~eeD7̴X 04yn`]zG=OG3;#@AP~2չ  ((-6[bi -;F˳sm˗Ы_L7Ft  ߳UM {hQjA q1i{Fo/0P<^6?"eg D#کc@_څ  @  @@  @@  @@x7dIENDB`PNG  IHDR@,TYIDATx1 7̈́4G pp$0@0@0@0@0@0@0@0@0@0@0@0g΃(LLTQUdMU(a!C`6@6Űp 06&F#c|,ecˇ1yFЌf$/~#G3{51=ݢIOwO+~pILP(dGxb?RX|._jepx#-@H `9x&x$rǚ@H ZMH $ZMH $`֩y$ $L-}I $H@X&> $T}WТטA `"Lڿj7k+N4ϻL@W#{}tx Wiݱ%p8"h*-@B ,_PJb @!/'k ءh*ڣ@XW H `5]Kv|/}_I$=2{MJ%Lɤd9xP^*? l $vE劅Q9wfU?- M}$5= 3nӭ/ z!襫@|nb+~8&f;|+G8 ,iD,CΎH$>~&* 4@HZ{'s,=AFyH "ٷj[/ ?{ZW@f٬Uq~^@HǻlD:A D. ~?H r@@T@ $?FQEzF@`~C}}}->H "oCbď@  r@⇞_3j $A=bZoH D.H~xOIqG9 +?@~A砙ɽ? @y %1YW&${BV|F #?_[{%mP~_ս>k߿-{ĭ@Omӕ/I*]Q-h/i BKJ.t0=Ak#oecS\Lvj+:!kց-`:If/H -i@ cetsƯvYPcvA$Cߩ!0eUGc` ~, ~?,M\YXWHDzO<( pu u @VaӐpK[+pXj_iG  @(g/1<?Kc~{?Ћ!3?JfE?9yPf؃VO d `=/Uv2dG#b ? y9 d 7/qz2?͉6؀ůLyQB\#qi.kF#666,̲ EgYUSwsQ?i5ګNm6[;KSB14,N5o0u{<[}ӴF[-uh"n+,[B̍op,}6A>oj/jQMbU2˂e~EߢmpgCn |ʣ++o{ڱAncp6fiQb,?}"O.sY]~ќ^G"CaL1x֠pY Xd@G͍7ms P] Ah8SͲ&İ$*.vޜ^cF{XԪ#?M0#~f%CYVIYIxCi Y2G{Φ>>8~e @Ak#>ߊs{<H3 6_P=ֶ.`ګo| [E 8Wks_-(by G1[lG,HQ{I j#v2qFdOKT ޶o۾ .__lSZt4V*?D%Kt\# =Mjs`&jT^'%kt~DVI q(Ծ;9MM _1jk#>vvv֨ %2~De#WcOrnU|%5y';A5gs/)s> 2AQh%lT5Q,lXJ^]Ic!mmLu9Ӗ`v%tlDΖXeAP,ӹ'H*r)Xu_PF+m ~."Cai<`uDCYf2U" 8.`K5/{t1RէP~Gݞ >g y@`:))Տ+gs/ԺOyx>c[Vk5d7l;(]wne"1 fߓիJ;5Rn~>q}`ZglOtUs%dyx[WeŊG$|ǻ> fWz,^X*mWkjytY q9$C]&b?Q&|u?mOl=)ߟ e3oGȰ>eP0zFb~].WKOIEwuIt/6I%DϷR |&Isş=M=߅3{Cp݇rʩ2qgĩ0oJ ֕2@Z=HHJJe>O .'`d? ڕw5;P+dOq>%`9t0=Lsv}=HQ0x<~hXU~ҭU+ՏBڥ^S<}@GD"%$o;ӏ^ j!_?*MA@4z $t+++/^ض+ bCϯiq>Y|x ix]>,1$0X,&#I?J|oNk4-A)06\}N]`at!$c v8ۏ}HHo8#8+bfN|޴.{i|n[^]6/<H3%A_ח?.I9Z=M;J֯o]5}|]RA&k_é);?7y$@X4ڗa{ľX=_ql_kh'@>V5'[v)}% $g]=Nl?H "Z^0@~x~gb~ $0gڼ $~UR/0U3 $9~We*Eŭ@?VCgQ&@w\|c@H -϶ O ,cpKbO ,Om+n$)9?E@Xr8f$@F $@H$A@ $@H ||r3gz2uTh4KfY`vmufXkb}zUQnv@;%wT 7*#VX8i*܈z<HG #`eZ$0M2%=w$#!o_V]]p6ZAHp:$G˲([0]c@ߵ^+K,h4J7uIhm$fBpҥrQ.-c_- ,R  NI2:Ad//:46 ; $}ؠ8P~R6HcͼfZ1mHTį@'v7aMMMl? oK_o@sҤIY6He#2Xubob t_ҕBW ]zۥ BG%s\,:X PV_al$@=1 @V gcv73No"B !@ ? @ @B0} @~ !@  % @I$P(I$J% @I$P(I$J% @I$P>ڊ2`IENDB`PNG  IHDR@,TIDATx^Ա@AGBH X/56s[ H @L/mu=                     tJc"8M߲,ǴKݺ{&+Fc4G|WX>}"2 2B`!Vz0yB`0X#01S@0zuG $ %s62d?A5(P(YS+06-f1c] AP(l)clEcXm w@ gu&IXi@c !SpP(DJ[2Q LI@PnoҤJ_@" KN'(FJm6 OB̬@ qs&LzPJ||w1M5T!@&1%#lz4rvc"||s3:~d(d/ o_ @HqplVU[e.HR0=jPx.awX8 ]US]t `BVqXrGO -Br(䘟\9&(zCFN [iHDԟ@i 'FoMtK e0w"aof6xϧ564y'J]h}2 BX W(*P_.YƭQkXd G:GcdKxXnBJİ,:[-O.h6P,1 S FV2XFR%GO}^P,V=23uI+ wΏoY3GaU-ռ 8 c[Xf @z{{ @ն#t`Mp$2,|ss#]??ѫ8_}.P.]`zdZ 3KLǍEO2V\pcXv<_L[8F?])` @|?E0ԽJ.u`!F}xv_ZsufU===q0Y~v&Q^ڷ5X4=? W_7LmP{5 ͐]T2]5A:?6 Xij{?aCߢEt:}5.]gx ǖ_`"l xY 릗(:<.ab [לb[~{Ϡ$` 1y b)B2i$ 7o~ k`6zʯ7ۛ7o&^_c9{Ru&b+WD̻k%b<~Çp p+>Hp.(3lJP9 @}%@p9 ]PK6Pn<YM_'۷Paa!@C@Ds\:6̵ %=[ K @vw?M آ J1KȖ(5 BD} 1 Qp|ݻE~h0fcG| m͚5qj5( pL/⸟盕Xy'{ 4el@[T4~O׮]c1'7fMR oD͟ ]f=rL -A=LHIϖ Q>\ \ӈ\IDGV@NIA¢ %eWe/)..Lv [w|/ ?xQt|)'O_bB,L+OLV$9 `r[\7e1?{ЂWT`! c1KDfD~& j@fna?rcӧOSb˗2uH_# m [DPv՝/Oð BBuy,aS8U Xg!tB˟~HΙ _w;'p6,9Eeڋ':`XAZ zb]/7{# m:np\6t. &Pr=(`\cWzF^!oBZ+8 Unſ۾}ƍyO4!zk׮q0'K nC ^nA~(đڰW+׷,&7ʁP2eʼn# `a~4IqXΝs?Bdn5̮kz; _72*:a,7YxA+^0\ P=@D~n85^oa{.'vԾẃ_;;.?=#nJ!≢/ F|vn̈oQP$o[2Ɨ wZ6gYbݳgWRr$> \AifySҒ167% ݤ#՛]>5F#aAmȔ' 0j_?oB uY3>P<5 =CcÕ  lXvGopց׭N]9g> f[[gDZ?y\C/d]ctcǥ(Pg`sa N3W!f ;Ջu8]PRy>^ ֡P W5 {}̰xJ:@8zu%ڻX_[L ymBQ;/I< =!"0XtUDfO7ͦ&s&,;҃6'ڜ|>cR|`5I;ȑ#!?z,G#>pRrb<Ϛawڽh0^-칲 3%‚ 2^ZZ3 .{/>ruG:Iêsz9Uף2,S$-`?x\!lO;oj @k"egUVV tx=@%` oU*(^!d A_  \'[SSrȡ;;`wڠ}좩 {U?X Eг5 -O쁏bK-r܏4Dx}@u5R2-~aAXҘx@켟C?7iIL4B៱i| !T7]F1X^Xy)j  ho rjŊAxSuz> |].ש`[~rkΜ9LJJ™3ghu׭R=ySx W*n\}͐Ql=¯VY͂f{0ut4K#[ѹcW#-}g P@y#52Vq64{@}iv<|: gʄ榭GBo_3Z^G|CkS=*ՆZ:np#lg;#Ͻt`smx9yc;s6w?b]A]puOLO^0QK4@wʑOkΖ#:~.w'B^xcC~ ׺/ٙ7]f}pH/3UmQw|᏾New Am x22XOW{LaH+ L炨:!y'Qyt0~`Ǘ6$> %;vjݷV}>HHX>9bi})@ŽO'z[L@vyV͸1: +~@7 B08pZ7oR /}dw:j*Ԭ4V3Կt+y)FNp#j]ᏽ? ?4$a{q+l:k9-?YcNX^~i#_bZFˆ XjqFk=Zߴ ZКw}Tަ&}Ew=hB3̂ 4j5kh}Z wikU/+6HUk6+j!f6dm}G:?/NU,w=6>>\)@$|jO\LǬ?WW,ڊM$$\U&WSC~Cz>KHݿ=:/xZZPOG۳$$\גJS)>@@5/hH?AoWZ-y튇n$$ wn$$|v_iSm;n$$}4-HHaDʻPWon{ݎ$$oiSU?|($|4;8 ($gh|yj9+xElU Sv[`@Ucx-@@K)٠WK'=["@@@vXbUpEhJ@.сj"+؏L%  S#66LhWp0ͣVOB]fif?®ۖ١/ gO[H? 0y ]hUZ'-s{rs~Yi[z\G/i9-]"KTپy+xh}Z/F'kZ^ O}lk6:H.u/YhA@@`Μya`A-^Rbi gkJ< ) SSK> )lo^4]   6?ݜiڴHH`piH O}/_$gc~Hky0  O,BeuH3Out IH3o_R\o?Wc৖m&s6?WctKʹ  )sv@ `g ,MvnGM h+7Q7ɘLP5BLr^D@P]G      1s~?ADDeRPĊ2 .{Pd,ZA@+2z `7-  UA|>^Jw [6AFPp=0ʠ/rv:q6n[  GOgGng-h#>&|>?|>c.OEm: P[HI SfF2͌zD5PFE"@݄NFwMR+1g*     ^.WIENDB`PNG  IHDR;֕JIDATx^-kTQ}F\Tm B: -,,$b-@ 6heV-܀1s 0\3g&l*7b(=GQN9֓fVO&Tւ+"ѷaU5 iC]grl :'ƎxD=R7 fY:)EjD>z“yw(2'%HrKn\8/9jp ُc"UەWx.C5$M(Z 8U /2h !yƱA(&TUJ1#h{<RBeӖE!}Lcnm]Unn^eNPqPuNhvma@&t!Ǣ"y"1<@0sP ~,Q-;zkƯs>|%#Q]]Dbjx 2,~NcTMQ9"v߶1V4N!@H  utPD㮵IENDB`PNG  IHDRVIDATc, Y\IENDB`PNG  IHDRV+IDATcac6{K_ʣv&fa93E IENDB`PNG  IHDRV'IDATc w_0  @ ( hy`{IENDB`PNG  IHDRx!IDATc X~0?q! vy%߂IENDB`PNG  IHDRx#IDATcdX7  Pl0LIENDB`PNG  IHDRx*IDAT[c631C&_` XE~!I P۴1nIENDB`PNG  IHDRVIDATcd{`n#IENDB`PNG  IHDRV+IDATcd``gbbbp,;fk _FYz{{%IENDB`PNG  IHDRV+IDATc``=j[.^;@a33IENDB`PNG  IHDRVIDATc, WLtB+IENDB`PNG  IHDRV)IDAT[cbHdbZ>&ƃ\ IENDB`PNG  IHDRV&IDATc i efS!A(  H)IENDB`PNG  IHDRx!IDATc X~0?q! vy%߂IENDB`PNG  IHDRx#IDATxcdH,@[\,/IENDB`PNG  IHDRx*IDAT[cҘ~!/0DfC"?Y$@1waIENDB`PNG  IHDRVIDATcdHca=0dF zIENDB`PNG  IHDRV+IDATcd``Pab`dPsm"p/JQ!W0)XIENDB`PNG  IHDRV+IDATc`HcePf``Jb5{ﹷ!dHIPyIENDB`PNG  IHDRVIDATc 1@ P)­4IENDB`PNG  IHDRV)IDATcd#᪟]f`dP|[ܨMrIENDB`PNG  IHDRV(IDATc63Dž ﹸ[ Pp"NC/JIENDB`PNG  IHDRx IDATc, l0+;Y  LH(IENDB`PNG  IHDRx#IDAT[cd1!NC@6nXIENDB`PNG  IHDRP'IDATc, l ` cEbp`A1]?IENDB`PNG  IHDRVIDATcd` gWrt5IENDB`PNG  IHDRV)IDATxc{N :;00Nߙaw Wd.IENDB`PNG  IHDRV*IDATc``ߡ5o13Sz f9 iIENDB`PNG  IHDR޲IDATxcOڍ}4 :i0!^oc&n񾾓v.cbc. ,4v75w3c*0{Pi lځ**0x 0`Ї,#]qyg׎h:Uy"eīq/_ƭ!U30B{ƳW3Zo%I{/.e *|:IڟG_R鍧 ^?' /_lx\wQ3 EF.q ͤj/qUuh~VV_]+cE Xȧ :E<0 we]t,0Ӂ>uP%vȬqp ;F$9" d,x_sƳ븫 geB |2IENDB`PNG  IHDR޲IDATxqHq*n[:wckZәÑ*K0QLK rX$EL iQa#HKmᖠ9w{`_MENW}+hIq7x:Z{hX Ȁe$q-KL ݿ2Ndѹ2c#4H",4aG#b%R+751'2SiA=yNT%s*,:CjJ?J P8ʹ7|)LJr֯=pV ՑN]@WO Ϭ F^:^[QDϋv`ЉB( wK7TAyΠ3n'T*ItnbE֛⦰CiBi}t}ƛF(Gxq&V^OC4V\vj)xZ/"W=W뮶=YGArY`@!ۮ88"Mf) @ډ0޹.P &`wؙR xB'Њl.^|Y>pst!0 J8Y>vn eǼ* -l}>)ZBl1ҝÁ+p;mP@bnĥOgQD5E{jlƔλqc@M"5Z_EMMyxж1%$Dvǥ$PBc Dav]_ܶK83̨%l[sc҇ߴj"#'ך[ 9AIENDB`PNG  IHDRVΎWIDATxT=kP~PTďźvt^8k;ةK.]8t)R\3B5=!$Msލ²,:@8P[j5kݒa$Hb15YV4P\|N\.+خ˙fjpG,Z,D(HP*wF{0L~ `BP:Gȓvd|;j6*@܉震7Ժ5-͆= ^vG7W(vT 12٬r4Ms ZB`d2:x9|a3.=/*N/γPѰ0ؑO--Iڨ9`0PA>%PNHp x@:u˹o-IENDB`PNG  IHDR޲QIDATx^QHq^Oܱ(,D+\;ONS0LA*mi"@dMKAў"J!fn7^iQ~`\[@2l|D0*D5j`fs 8ٔᢾs%9oz_` T(bu$Adѝ<<Na+fzZ4rK8poK"h/pnZpu1৯L8_BZmk+YP\h+phYoz8VrT[VЁF6F6|h)H jqhx+ʯ,ܛћgz2VZP >叓2??JNCշ>GƓEk. |pQAHsCE9sf7'_GU1c3l{ԲN8 ty{[ymxz9Kc.n2`=~*_XmIENDB`PNG  IHDRF7IDATxc rj8(9PΨ@E+BXG phjOIENDB`PNG  IHDRFIDATxc rEFrQy:ӡ8Ea!nE0ERfGP"GDUDU+Q,ߨ_lhfE΍ P+0,y!فÁ#9BP!lZ3\ Q@_ "'DN`Z84uIENDB`PNG  IHDRFIDATxc;(U/}X;ʨA9a5DQHz6J^0, ť -PZ"[KKJX/}/Er@ )LEx) bNcJe ǦIENDB`PNG  IHDRYG8IDATxcOi#)r( w¥ L#XRF8N,!<IENDB`PNG  IHDRFTIDATxc@#^GdETC" !MYG4\ُH,2L%J()̃ 5< C SDe^IENDB`PNG  IHDR޲4IDATx^_HQ 3XUVjYm_SW$QL02! Z$R77E:V,ۆ]oHA7ogmu swpdOY W99(/MqQ=t0?mQX>\甜*7NRT .\C Žc- q_AT  aRV*I~n,Gd" CI?w6-!Z;)ɻFϧs[xôh㘀h#\Ҽ|gd ~` e/qQPAM4`Ujȅ%rW)8;;k[y-2PY |s׾eU+jD]ahIEȱ[u -̾>}L#8pՐ<L؇dsS(ib3l85'yq5›4w.In ~ /g,`*$rQOO{ϦR]WIVDԭgINOO14~&Ӯ"LJjTIENDB`PNG  IHDR޲IDATx^KSq @lT67LCqF3s64E0(_@^/?r:*%@\Ώs\AgD8T"Netkըb8=pmZ>THG?ʥ߯@@"s8Qz%> '<3vB8-Jy׳3#"N$BD{)mfiGC;J1\275ٿf,n*[00B ~ql Or&DrWB [u5wy idLl טZIoFp-?mT^dףwK+,>MhCfk85q *1tтfN+(.ݛA&qY6wƢ!oJ>42O1Ikmmk_`u7|>rs[_'i1spړ%)'}w\4Go22|q2(LNxz}ϗȈHWnC{v D#ˉT*%b}GpSSS=DVEEE 8>bH#`0n :8Bxzf+zA2fxRR deeRId2n; mG@AA&TUUET*),,ƢvMjN#z~gmm-ihh }}}>T2 Ǻg[ZZ/imm<nI ZP(4LxYYsF;?8l|7.//'D<Ԑ,p=FRWWGJKK#nO0fah~V02i4}0o/ q88Gh~o9tⴽ8Xpvݣjo='Sdݓ{ƚom&efÍ{)+mP|a@>0Md罉\v].$ݘ~)yOl_N /F)2(.9,}Xp,q?ʼnUF)B%)<׎$4Di|`AxS'$uۦpz:Y\Xӂ% vH-rk:IENDB`PNG  IHDR޲IDATx^?kSQ9ιܛG"88v,bAN2 ]A}MrkY'K-|f$t#}n{h+q: "?uyrdX_H"b%yD6 Oߺ,b|F㭑GL2¼k!"Kނ<+W ̀ P h'.Gms ƍ<}pv5bqúۢ?Dy?^3 cjHe׽# AaKBfgB(]1(9Ls9( |mn9_hڪ?%o&b~AxZ427MߒJJZq\IENDB`PNG  IHDRrP6DIDATxcZr1T'! d@p(5 yF #*F5˳ ü@ z2q`CIENDB`PNG  IHDR;֕JDIDAT(cZ0H'0DԌj pLfbgdsf/zQ.IENDB`PNG  IHDR szzIDATx^ŗ=kSQ) XEAMEv']tMAn./PpitRoij t\NMr/r@tRZTȂ$!` (8c2pV`}FRVQIs?k6JF%ݝjB+0H3CU#(^87ΑrXKHY*k+c$Dgmm*Vʙ7e=F6ΜomLf~!l&%e-'} ktG{6&0!CxsGhovq  F ܁ hGlߗDD5"(  iE<=oAŕ13 \e- ^n}uH1fgcz^(Cg.U;U6 &ުEJNJJ$8[3.>_x2H* 1дoEzrPH#W@ %i>tY*O2f̀zIe `2f`? IIHNK|]F?f9ǝc7 mMʅ-6Lq7Xn'70[rzwN_+ZZ¤IENDB`PNG  IHDR~IDATxcYz?\xUFЖ ԫvIENDB`PNG  IHDR~7IDATxc~ss^cn΢ ϳ\ =x?("sy#H?Y/IgIENDB`PNG  IHDR~?IDATcYz?g.8@%,(ː=x?( $@JX9d/GaIENDB`PNG  IHDR& )IDATxcYzQ5^IENDB`PNG  IHDR~'IDATcBٹ@ *gy[(IENDB`PNG  IHDR~(IDATxcYz?:`D21@TI& h$IENDB`PNG  IHDR~IDAT[c8`Lv?@+ -?IENDB`PNG  IHDR~=IDAT[c?#(3 gRfz4xʌ/] X@*y!0(-g}IENDB`PNG  IHDR~=IDATxc81/32$M;?eơ +Fr^P j'O?$:-?IENDB`PNG  IHDR@4=IDATx^APPOe 3X hfYu?1y2Ov Lt@ WHPH@BJܕn^ EIYJNIENDB`PNG  IHDR@4=IDATx^Q!@>2r1q_D cr2'_h: J 2=`Y%ڢNXUs@\dG}k*l:m`IENDB`PNG  IHDR5A7{IDATx^ٱ 0 DQ[[R҆ hwX: 8 άUəά{?|:|Ff:o//_~%ͯwW+}o˯ogs|s^]3-=IENDB`PNG  IHDR: IDATcUQ|IENDB`PNG  IHDR(IDATxc$BF5jD6S:y +IENDB`PNG  IHDR"4IDATx^нNPHUZI @QiI(mm88;{\ܸ&uqdcp`3$:焥DYA}!`#Շ 1,tn)ASA4^tĀ7I%Z,dk#$@-T7Kl , ?OyIENDB`PNG  IHDR"40IDATx̿JBaWk8$"hJIDf`P6$QC  M56Dk4K]ADwMԷp9?g0lZpw&5j׌ o9fMq'|xë' Z(ĶhpN2%=XN 5{lW0$ʜ@yê&4 ߭$b_$G*HӰI'il%RBHIf6ޟSLke}|na5!,6 wGB NP)IENDB`PNG  IHDR"4IDATxڭԱ 0FH WHfHDY 0A$ JģQ] 2Lȋ鹞Ef4wyZ(H; 6Ңqi t"EqZ`#՗*641Wa@cnIENDB`PNG  IHDR"4 IDATx^KJP^&XBmЊ G 1Ei6PA)Uu%"a-BA h0*~Op}ȧd 4_[uj煈(bJ槩3|sͯ*~dK;1$iewndO[$6JU?V맵a-Zkkk{yUjEd~z ;RYf()$EoϹWL9FFc y5^՟LN m{^N'۽LP(6 n+5D i$-lNRQLBQ-@rEkhI9IU3'Mq}su{y$7kݵ\90Uɕ|'⺕q7~ŹO`?/kk=5vuuuͰmkkkee%%eee -C@XέZfIǪezq2c_$o;-sNHb[شj_Z^m9q\iV b]Yf;b[&sNwwaصX,li#u8lm Ԥ˽ Юavvjc^?y~fi;jk*xjqqYV^X?koogU[[K5sK^^g}(~SQuwf~UIu{cҺշ *{ǃC!r XrJ2k2UGk +kt`d:[5F^RX?*Znfd^r%;;;//׮f̼{΍_̐~rmIL>Fh}?>uʥ˟ѣGg.8 `aO:ї`t&%ԮGsXpW?z胜?6LA8 #|>7? ]g!d uRD7\aV|f$iN]K4YK/M4%ߝ.I/Eai`kT݋$T#vb.T7f.&S䑨DȐmFWCJtQ`,Wr$#KEW8<rfp(ҔU|QɘK@ݥɗx<S /P9 z7/ϝ8qR|:>|\]U8:GGWWW6h}j{]bzvSfffො Xy̙!IovN$2uXSTJ" KK>hiiWx!\Y奌Х%>rҕK.ZƚZ/_|ܹV|:t_G?ȼy²n/snzЌv^y%|zϝ;E:;" }XQA޿}βKߎ8QSSs7=5?d߹Rĉmsk׮ݺunN(K]Y-!/5773 }o^_[{7//07> Ο؇G!Psezø{FI}}=%ŅH˗?ΙpaL{P]+(O}P83@hq~ڕ˭-'O|>|MYw 9RYU+.-&_*B!k/"~W?SΟ?gEY܄KːKK x\V1] iӄrYr.㡈,5i*bQzmiiiM022T^^-ƭbNMώV !<'?MEbD 16FS2^ #>/ >`/D=rvtQNqKye7!0Nkj;[ `^IW%%%LUUvut#3hja]M-Ԥ56*+ʘ&|K8n?hji#,So!]GGGgwWI}ZhU \qqq}mIDV__[QQƜ65+:+iv>PWTT1G*?3kkq`^d]}8s,"Gg8L/M$ vz8`ڇ#M4K%A9JϜܴTL TG@xLg3ymF?~iE .w̯K+\nǬ}7ÇN&a<ɘoI>h uGC#Yǘm]Us%yjdp?޵?m2~sw*ݒ7nbln<=Afhdo n F׃ r873UM#R'OͶ-Ҏ- &~{{&p[kSF]-(UX6մ1^WZ/g$)6nyvk-ήк hƸXOM?*jW E\up Ai,l:?hwi+뾭+SU^S>ڙ 2NJ`ղ+%z΋n!7E-Uf*[* PQ;ʙ7Mnw^74ҋ&2Sy?S\҃|dԈP(fW-Di +%}3Khxw@2g=hқnh_ˋϿ‡;Dyny+.d5jARhY_X<*b=svkgpmzC1GFd0!CSKu@ ]8+9 @ڑ!# ^_@n>'jü+fZ. >ՍM{y*2_=|GD䣋tg4u&E"ĝ/*++]Kl/}Є$y 7>娮his;e=رcRE@$%/BO;RenyG E*$Qe޽{# .hm>a)f||K{O]cGeM*ԩS auYJBl4bB5!}0f=eFP!4u!5:ã}nw[3dL!|m L1SUv{v ҂Xo.m9I^o4Cj{cșyuCT|fuld1xLiȳ5WF2b1M!OnH2VT +v+͓@-9>x5g$_jI>l c~(O]/a2:|a)J>h 0x%0rov4GW#&P"n*JE;ji6yH>d RW*A>bUa7 4O,>yYa*3)*&5-⨢%B4'z"0N52#V&w눩" vvE>dXPI[R(f%w՚|dsnvQq5F 321PY\Zk#уj'P`:T5%7//c󨴋=$ 1}"0B_5S%ԮGE)JE>5ƭ'32~R|q}I>$[%å#aǹ>Emehs Qq7YH "8:k).CDB>|vwߔt-dpH @7conbqEh(JTff'VH|:7P:%$߶"TW : N>yFrH!)7 )oW%FK>G ZH|.jl}wYN,+$|7S*HF*m񡪩@lr=hkJ!EoW ZD`M?O'> S Y-DdZlAkq9 PG(Wb/fa}ZQ2PbPq"=.2r3WG/ #cA`!t.cY ;kkkq"aZ q_VVONbR[:͹x9ɯ۷wmxc-ТO 5Kʴ5hI`)'PuR4 qE/w%WD  r斵UdaII4e[uueOw'+**0qZ>?$:-͍-M87 1]|P8‚ cʢ=iWGgN;wVU46NLN[UQYTPq(**RQu#)Ss &12i&^{Yp1/buudhx\Ȉ&i*ޞY}}ͭsv +PNxֈhlimoBW(V?QĢ=6aMMLl33vg+kSS3 IR =.KNxc%j~h^q"HM.2 iy Fd$\eWX^B.Z\1kToQpnFDU[xFF(P(K:*8akWWbd)ZhEB00cckޚnG{=8`OD3*B1[#E"1`3$/Y0\Bbj9!l6V0"-ˡ<[ck^Lݝ nDu({I(?CR>m}G:ԙT|Iɑ9_}zߜ'->6{!>!&Cm '>".2EzqiIENDB`PNG  IHDRg2MIDATx^W]OY>g:Μ~֔T(!Z"7 fwrw$ €N~a"N|t;̈́E݆ I͛3Oys΋2!!*ǰ"JI1+0 4Ymt3 q ږؑroo-'UM]NgW%Xh ^h@ B`r mpa9Bu1V @4̒.~ mHRT$I$Ʈnrabj .D Ҕl!8NU49 dh@aԋ=j1}֋?]!?}}\yM/sb/޽={J}=q>uT6\-xaval~^̧K s35==-"+o˫/WddrOd% ax\Ǟ?Ysi1%.?V =[fsbbB$=;X+KS7bpx}mdtX#'7Kwlt?qǫǝFrMPSW1؊A`};ooousx2|f$H}OBj 㺮;O34.qB\Kpc0ؤ; <>a F` XF?-hzAs^.>;'@1mR0ej#v5MmU{ S!qj+*t$2x<\\|t0m{p{C̾mxs`)<&I'aNJ :jZ킮%ȴ5Z>" Wh:ZH9hjr ,QPgęa!vf( wv:5GK٣U,n@C{- Gh!Y"'Ͽٓ=K6]9Net{qt x>:7tf>g>To~W8C53т,!X꜕Xɂi࢈j``d6P5@bStHE-pA]Z/X$hlƪl]Jj @?8}n EHz>}</>oѯ{w_{| @q:N Z=ݙŅ {D/mKإ8j%(B A%HidaE&Iג +õe :J2BmJhPP3*MC0@3 0Qˢ)8!B"'d[>L;ЖZl *wpsE(~g/~Ƨ|{_|rg_;|b[o_6{B3zWrBE$SK)YsCj:i@bE Kvy*\lOVq4Z(`O~Ǐ/}r{u/n 3{OnmͯiV ;Pc,B F}@` @ `r0큁ń; 3MDyQ\WK?w!vᶤY~З6OŎ̰U5wϯ1<^H(g @0XSևOc57ņ Z??x{Gk:/÷k?z&T3)F*ψJ],ukF82:q@`H x֒sDYvm66|2 ig(șPUu3|nPPtH&HOo^~/CCS3LML3;q8Q}vs_zs{0{10;3kܻviiH,P)ʙ!T@%"=E-mks]9(Z`nVf U?7yuuo|ff{ `at=ظtw7k T V XxP`R@Ԛ_|o.?{wcP'3w1`Wn~㳯ᚶCG;pq&4A5 *"KD} A* uvQQE=l M ۶_xҗ|_/| _W? >}w?O+OkuR3b 9j*  P@Fer޻+:ιO I 6/gqܤSmmڎ3,]4ͤtvj;Kqܦn!`0 $}E{n\H8У͹ۻ9oz Ìⱎ=mOu?]y(g~}ШG%,m= B2?o=Ł*,༅IjOB;뷠WX:\@9`T3(Ɖ3V=~>=́b:UV͙3gqЭiѢE6m+b‡{Hs\ J.FI& WO|uNd|Z+ҋPC@ԇ!.帟MƷW341W^FMŒkxl}a`T5.JD"So13h3u8BeT",Bqh|3MVؾNDJc 5t-JW "0滷 -\ N_p5wl| p@J5 I0t3˺@"MALhD0MwP[4|B|䰪F;  -5[x( %H6[v\k+I00':>y>'F{/rB>`V P˕$QZC! A@ AE(#C ]#  p菛]<PF\rp BE`̓L yazfS69/;@z$`03~"e8ej7 rڭ_^y( O 68u9'Yu8g#u "TJoֹ mISP|ܖaH!5Bc+Wd e @1H'(WND8WLJ_8t]"T pS1RA΃1 EqH0R $A1 I,ƍNE-[0hOv_L . fL{ |70soU'e>QZ,P#S+mqh߳g{R$::xe]$5vn!:NLf^gZ,c hd*FS>97V/yK뎝[)_9gKdD:{Z 즆ĸٗtL"cQ}ZAfZ:& *O5bDgeG aͣ~vOj+VYE!MZg–n00R`1]OTm{=[oʲ3Vg  7 dXN9jFHٿou:7+*׮X.jccc\sͼ겎Q 0f+М&r>Z($ C^DlVP)N|뺷xbe^>Fձ1;'g974?P.Gd/鳯vɡs1]^1G$cj->P Δ+ͯ7?3#el╣=ƍK3R.\z͊w~΅,Zby>vp㚫Wh^¦iGkjj*&8!=P+ %(`G%Ww /mٵ?s˺U@h`͞_%n^#M8(V H‹gdN33BJ ƿ`۶mǏaxh2s! Ô'QP$ R:KNOsQ3l޺ǿUwWv]VM~e}c"/Mgc+~xǏWU"ŵ-Z98TUWWm[ )+Oi.]0Xak fR^RD}N=4~Q۟wptڪ;#ɈK*j+ŋ+0@Uϰ$J S1 uϥ#B,eӔeA̋ߺo{pkۧ u-q] ]w/103?x3'k?{֌^/ossO-oε5PJ&-} T! /#at"v'?Xf.nq,s67gّ(`"UఔKpq{]ot7 Ӓd8Rr$##h G16c ):(Q2 ށt׿u {qQ/Dj˃tl_{t]oNo&I`5x?<ОU% b7z|'KKȸ5A :!'՟^d$3ɲrfOy;rb%LZڙc[::3yfnqjvN:J6",m~'LH(M1 'ҋU":7kS2BhF8`D-D(#bfV=׶(%iϣt*D:grh$8n6`̨ʤ1dYfΜ!x%I  1΀ "kttS}IV/PE:UO.P.*}W-ZNY&N8xenrع$"% Ǭq{+SbùD.Wh9igyo~&F\SWxɜ2.lp*)Oqx 7>7-R"ƅ6&)],xpL8 woUm43-u}cy~4vkt($D9ȯ>Q/%B Xޝ{jkiw=72Ik pj}v苇Vm,qF@bصvNd[t|14ObQx8o ɻ|DCW6 ?".Xzxz3":!u#n존S^hI9l22Fh*b.W'jkgVԄ`4EkС qH3,Bn@t8@ե&?UUºi7xaMsg}G\/O;x~isg<#n[nwA[0tiq!0 u@@ 6[QH_.Q5MP'EJ-HX<׫~d]чW$sH*9 adopҰa-` g4JFIK*]&}HW 2[Z0xSg<|/76_߱ϼCn`rټ7gʷ?w׾+% Z'!vIv"o&A'm!>/U-jyA͙'U,''ԝ(#pOa2CY}](LCRMJ5-E2[iok}hKwg+Jy YHξ;u2_w+nf:$?Ffa{7%<kϵZ<UͳQzݖM WQ F%/QT12U,M&Ѫ$F: P &EײkV/[ |8W|>2JTg7x#4ɳ Gḣ:sPX"4WHR"ǐ.@MEdʁm[:2 ^ Oۃ!T7)ʯU{L:ɻ͎<ޯq&fl%1F H +XBW"Xec la+Vd F؊' 3GyYumvouW]>O`H8F"юtDN7[# DI "y4\gy\Yǩx%T'ykBwWkߞ=ҋ^+.X'(8;Ck͖RۆB(#.w<gέRPı6ZQCF!%E?%Mr0pGe;< X Vu˕Vؕލ! v( rJI.+A)(B:Ds/pdK>sV?R?ߟ+.#RZG8*, 8b{w#1ŀ_~@$!S|M,94:хeL""'qH`gX@ %bJ2d3)͙O  PγΘ48O>22P5ఢ58Ԅ&IND.g صb ڹ(h5< & vLs*Ӑv^L6 ֖<+ C%4Hg@Inc܆PnC28؁BRH>9sB HAx~B0n "KC+fn]^wzF{I]q۰wXN1[`68엔AG`h*!&`n˥s#m+H0e5 N$!9”wK$#]" ?, AG'oCS lJMKi9qcw/0>po$RL{C.Ʌ3යح0w8/L/\r zIO rrlZԗv$oy|iK!! ][’V] ZPK &|"EBJB"`bi Qe8X$׀sI:'h)A". ,Xg܉}K*M=h9G;iī#Qy oh.n4ۡWׅY V~ /eQkR1&yxT$ hUJAI-&gvrڬd/s 'i7lr7n_g0066seGxd3㊯<@8K43:L#^њU[$7Be8i},~'GHU~_?+מwZmw'd䟾v"JGy}1/M/OlZq)G'"%N?9 h_.>B;q{B/(儦?eGxU,( fZ.kn8h.%" wۺ}nkm==ukTܕy?{wwgǥ9=wM~ .tKYRޣwZ?~WP̾~GlB5G}tMhVwʭ<$~^աffC-Jkfr^}[rhn62S8::?X.,bxpK>v8Qk [CkGe&m,~f稗L"I5(B.SIȘRSʒ{ $8 _84걍Y1{zp᫤eäRma <;4M1WhҒ.̙na=,3O1Tխ;TJ-"l`~<|y73<6x`#؀BYH9Еӭ'Nݲ{+sg}3Y |G>t ѣ+jΕX'D0) ՞SS)LQ- ғBrP#*nRt#+4//p-+Trm9i<"9V@\co|UOϸoT2̃"q G‘ͯȁ޲! iPZ«R"(I^wR`* ūG&sTD-+abs"[фLoز=V'ÓDVsG]?vm7!C-Ʉ PDo0!] .д#i@!f1=ѢA@֖\Ba6^ ]SLFiR@,Z2ں jQ+݁p pJ|R ᛱ6L)*xH<)4"FFF?Ÿُ[a* p11q(ٺ)vO&4JP`0̇?\7a'`75rh!!^Lj  ܵkÇ8b}:ЮZ_:q>k SB@T KoQWK" BQ/DA8b#Nͨ s}4VIi:  lT5`CXÚm쳲ݚaYN"֢DJ1D41Z,y5U5jj)DXSP˜yZ CW12Jeί3J恨PzWE( #Zg<է-ܱnm{B_HyIcUo(p3JFi#(!q]w6B_ڢsML\XH)FC l0@@ 2Z=UGu1FS`C)Ed̹@*$nVH$x0)=*`t!a,- .JYӌ↑Yi4H(VBJꤻ0r@1Szz%n uٯ @V<1VH!TLQM 9 ABu 2&ZL&PbKB!DA8P:R B葘!a"ąB+̆Πp {o|RYҔ}z;_~Ia.P4r>3ŃN6zj7!H"$SJ7J˿ ۑ0/7f .QiTu}āƸX3##%!.BQ'!BjT_ 2 \p%$3s1>E^ Eq 5!\#F8)g@!kB |g.PDB1}2{Ttk} 1iߴ9_{r )6cyT-Fb؎r?8*+Tw>'N:5:\@SGJM2R:pSJDH )[MƩt7'R61yŲ TwԡgbfZuѵMqKvW_wAuJ{`ߪ#hA…i(քc(i&& p0+Rx B1t)$L.|J(\% ia˔e\` zIDMiTPV+Bzil[zvluucTC_@X|{\)=OMin{^~lssbmvmCYY|@XLJ&“PV'$6ڡa訡1( ^oO8ww_\1HɷW gv~P-Clu~PZ[uӻ; P@}s<g<_#8q6|SF2W*@޵y"X{W 5?eZw߻S}ͽ]pYO4޻玻uD0`Q9g^bI5!Wih("^&\0<GĀ;X\H1$jwnf>XI$ 'TBrtLlVu-Itң/Ug`|.xtkdR!ѸiH)ъ'_ܶQܥgP.עضmrsS7G7 |\n7]k!@G0ox^w|~ӟ0,q Y#ak<~u6x?&u\&ֵOmonR.sv5kҙyCOV9 ! a$R1ݱ;ji$VB0|U XƘlᅦB+\'~p~[t{uRcKv{X.jK;_Cd2ѱv߻?0p/.EWqsTfu>'FєTxV\'woi:nWH]&bKehmvq!Hq!&A.'$ޱ4jD5<62s\bB Eukz}I B ʹO@ .Cn1} F 'E2'+Up#Pk_3(D &, CDK% H1e EUw~KKζ-Z)5]w+|q;+cc5/----;xD<X|wtri-R&2c-Bɩ9Cf <62.q"% Kgy|mmB8yWvՇJ<|UHcN{m>{~|Ʈ];NwO55詓cJW?|$aݺ/;Uj\ʘJO~ԇߖLGFBr|-c$EBI!Q4tss!@HJK'E$ S"VP2wۅ]x5` 4 y`!FzglhXz%mue|>5۲0M4j^s,\7>7XUWwuu577zۭJDA߿Obewÿ燝LjqeB9? jT=҅ _C@+3wdZCoޑEbN{XNp$bxaf©y3Nr_{95mMŠwO'S5nܾ~.Vo߻AXw[oSRJ ᾐ! s`3/͙c/۹k:@Lk7S=3~ 8F +2-1Qf "\C"H䐄R )6I(%uѩ.,U o0|z"Q#S!'WX#PsQwDigM+T4f<_K{eǛ'qוt&[7LŅݔ 5g˕:"{ #gA 6ih7^]*f>t.Sf!H1frUN{3d/-=xOJiH+3pss_:|lXՒ %{Z;6G.tƦGJݕIVKBS;}gXX+ڻ;J%;G3K=t玹V늨nhL[NLy#1ߕ4] cad23]+J*@0BX- LI@ 1 \Zpnb`M+}ôv߷.pG_\ĭ}{wpXĻj^SkS~huR>ٵZo\RM=nnWJiv$A3M/\*xL 0=LHia7\e@^kK'Tu_hʜ_R ~w?xKw2& B 699eYT/._oK~-0q ;*gsB!W53q4uS}JX|adQ' F2+,yx`oK|";{mٶم)e>smt=%D@cH`B IF&DHp Q 606>3,1XZ,* \:u@Ġ."n2;:s#ҷ>}_p3b@\}̦1Rr&u]khuwE<: HP(<>{0P:DSJwG Rqͽ ++7L,9)KEQItjg/n`Sq Ǿ CLv[̩s_j/CޡBXrP˕dݶ rƐҋc΄EMvfgUߗz,*_jٸu1׉XK ַH)&4:. }0UFXך#U8HSbo- ´AX TB@"qc\*!PO# ~z)19u+ʭ?QmM\9؃5ʕE(B' ñB-|.nT󸪞ԅɂ~6G>hm~ϿiTThl{@D={[_.}|/ժ2́Ζ+۔iK9u_pɸQ^d/<{ﻕx@J!="GP- 'h U P P6%J )d&r~nf+(TKo8rn0˵ّ LT)ʮBXԒѨTҰ,&@#Xw0H,z8:?[SQ+5cR.?gTt-މctWY~/D-XFcy+cq t}֛Gg ފ&{׍||k*j޲N 嬌 jޯW|oU+z>L%K_su?u =yv|6}`T s3JNk۵q\J(RJ(1EPዌ3J(gWL}pP皾D{Saf9F2)I`W۟R dĒܩx<}VQU$G@IC@eck + HWyh7  dj"rS$R m9%Q|W` `h 'ʟʑ_|鍊vkՊB$]mq0`?)kN&RJF VTkv&PO-9V Kbg5vbכv.W E̩O|xzzܳGVo_wVUBhW_6JL.pqpO) auv!&o  =Fj׊͇ ]*BVġmB!ŵl}Nwsp2awC=tBFq3&D?SDHVF4_$wʝ׮Rdҗ.竚BdP) v]/,Ot>n$3/DI " U  n0@Q[|ߥ=#O/PhbV^?&۽gUkSQ"z]Oly{אIY!VCJ P&׺׼wTg/`5,][6g8[),힭_ݻɱvyxSvӆykcAPRwER*3yrӌɶTtj+JaMG7s)!9I.iZ繆e054rn챿y}xHIID9cDoMV̪kBX<*1ZFd2^*TۛgBa$ R~b PꧬVl|emok {~m/|UZٽ!w&2_wȫlBEuRI囇J\K4lzc' RMYw.R ըaFj^Da|+3h S;394S\ڸ00kqUw!%2* lTh5b@so|X3KO:Eu$ݜl[ VK(  X,7l1 #0Bxl1ffIK0ĤT*i!bYm!4VJ)!cuO^W7BCu'"Z㓋m+ĝv?L"i:?kgNLG U㙴EP腑scUN_!D-+}q׊ť k9(9Ө!GjZ<s:ŤQm&clڮ؞o3#ҳontٿ:TtP___4`!(ٟݻ|*Bh}…d2`=X>^@A̩>w蹋'L\ yMf{: ^q=fk8(,L3}3'ʹjU63;yiԉ|\ʏ̕]Y\)5+&-Kc.WR6 IAT T- @ LDt~zZ':CSxihYceA < 0aȳI*Ac |0:]GGGX,v`3l޼9_>xB"Tw߳Z=j!_m%N4n/|\26HdFhwu6:?@k-f -)PRDȈeJӇT*ˎsw=Rt5pp.uwvDIp._g._*m9BH=Q(((z!$eN?@ D)I 8<ݹn >F{rzrnimg'1O*{,O vo_Fs6]nL8ivQ82@p޸q5΋'WJ1>!Ė-[6]5R{OaZsK+Ư[yn mیsSg͕ NqGƒRQ5VNJu'g&QmWpIճn gGz :Dc㦱zC/Bsl4: B&;}'wΏ/C`ZXՁoffԬOϳ\!J@|P^h*ݔSwM ~s >o~>7񍷼-ַ~ 6 C2k|MaXt0>722SNzgϞ }pC*8X` & 1)-_Lk>Ac)a2.R ]H-)TxM9-Lf #zcJivvBwMwp$^*C.~4L`e0iڗΦfG[tɰZ3ѥv^ap~j6EV"/Vˌ sDlr|"d*Jg0&=-3c2v4 it``66ima)|z F@7ԓ>pvb%i[,Ͷ}Wf:{{vCiK1WW-Pw73߿vZcPP5~ pF4]u1/ DP D M4BM/lq0&$ Fp=BhMQU:!yq~]`uK}ffZ()Ό/! 2֎]Z}C_jmo6ksEo|0ؚ+4+N4jBk5}nk}|>Sʫ]0LaVuZ_ zE  NSt "nzfLRP!1\q dΧRȶ2E"J =Dpxެs )eϢ-B77EESY(y݈q1TiN։UOEuBL͖}se F1ĞMݹs]irX7vX(k]31\(h CUA0 BО$3T('͸!6 1rlyN_R8jjP?e*@ { Ϸ2jq1?L!\8Ȣ4I6\PRBJ Q[$E跢tA @g2IRuEnTgs|͠'/7'Mf!B/KKU-ej.Af|]'DlK jq+%4#knk5ۺuk90¡uCF  UؔL9NiZfBXʰ0AdD*V*tKɉKSccHvG$ \kR/nXiZ\)/<@ őډXfPys|] %jrT(H :,%+ F3uJ sJ"A*3_"VԨz)Ӎo3p[ufbXfj!{u[nk9nj\ᜋAlTh,*\[rVf# 0@)EÖHqB=G =@ _QDVEcnZqH_URR]_~4Pq@4 Fk[ C=X}t<*a7"B_I ˰*tH\饔j\3|FJ9P&z:WV+7Fj`(ST !Jf(eUqh8%6v IXL: GfhLD58V "b@gL&O}sFg>B8" 1X=FJaL~&qWu&:ޙVPT %X)b{K"ՒIJUOE%d:v]񸩹m/Q9m&L2>1u߽&4! _5[B陋 X$BX*mxu!EE0JJ gb_#wTWBNWp(dh>($?3Kq×7tj3P @!aObV A6NaAy"abL"VHL16Mv`7Qa BPxń@:0%YlKmoQ:z\z Da A)4_/լ\ܟk&vc9~om#rχiܻIalչI-n(0}+ꍙv䆉tBƘ'Or @:*_kNb #̌MKv{i1X4zkoxlz@g@xZP\BZ5**l-Ϟ?mvg=|8! ֬Y4=)`4%+y<mqt;dh; ኋ|/tCG"Zj5gft4s?,tDy~GS'b`Ԉj~)`5wB7rSPvvy]^?XP\.tf#]&EQO6ҙsvoٸc}腵 DLR3Y/XC!# D*.P2ۚ^ ` JZ3":gR.JI%X꺬T:N0R5 0mWs דFkљĺ)DtВ@@;9MB.Pj;cNmaW\[$SC6oڴCk8Ls"á2-kvf&u>woRb%3S!TԘ *c3$l%NAЪ͉@A68 K:y9_wt /߹su@jnjczz|O8e/̓4cۺ#dž{绚fq ,! |ܠ!Bs@5b" 0kBT2uZ _xU8 )i*ҖM jㆬp?=,ԧ-PuG@R9- f`@Er%KѼW݁ן|_^J}GdNbLllXu6;}q !Z&ACkZ/sZ[K"bjٔk;V:{qԕɨ0P+(P/7Pd8ڳwG,/>[6ʵk:''g@nH `趀1 ˁ,<_T(J`Q1Z7,@MuuzzNoae\68FGD^.Kr]v]זj(FP, P#|zL*Dq|(ͦR)ιamzN)Mr1[VKq4Ms0}1\|t<|ܛv.&,Z=ygh{r7d%v澁R3LJ'rɸE[z U߱}̓jaZ3HVW)$H& -{=&V*5wu,cdqnwP@e ")%R H ~b!-;5>h)%1"X^k&v>)Ssh}j=֋< UyP/@,9%@ )Jܨ4LB; eD>1"[9< 7J%j!:  s.|c/ CKlxl.Kئ9!M_mOiu]S'|.phwϿCHɶ?ᠥƅX7@ܝ Pz[4JfLM;ye)f]Miq}e**%%9XdRRUU) %"SX2hqaRE4**_:J [ёUѨWMf)P:H|c'vL^+eQ-E"_:ЄP`XW4x^WQ BIDcKθh">xyc0E&̕z\S':%byK ܷW26=10Yr%DpW[cq-Ɔ'^(QbQ%Pzg6ўPlVh7XsOڣN] Ih[p&D)׀ )K puwC_B:u̩Q%jQ |O*?TX׿4a^YG~+Ԋ5=P*eX'Fٜ ?0wtt X qX0R2ĮK)zh1IP0h\.3/if'<_3E{<QM {;HI@c>l.>O%6fjJ𺺺(esWϮQ5*?R" 0Wnz}{}Zo;T%4Qt'K:iͻ > M$IENDB`PNG  IHDR((msBIT|d pHYs 7˭IDATX͘_HSQǗ9C"V/Tg柺ww0҇R{" [E{V.(!"vamS7Fj޻/{~s~w~:.!.k)+qowMo)-@´+*rEjst#0Bj GhhLLiDu}4%X!?k$I؈p1aۣ}&r sFVYD"2P=0٢P8xl=%8 ( װmg"xX'7LBc{S2p"KV'pf2D;H4.Ou&GjKܛb!D߈b w/E6΄Ok5P}378^]^Ғn@?Q]^9 %+˹Pl~ݒxpXS^%&w%-W~`q)HYRzpe8`BF/1  =|&'גgCw: {4KGexQ7ܛca~9p-X cW=O_(ޚt`rxzr/o=,F`.0[U[Lx@ I￀5.`FeN ;qŒ%?۝2XӤ` al_q( C;l0OlJ (Ċ(D6cܭ{>$!ؾƗ8_s7C^4$ "Vh(b wOH" \??K'*H_3R7\ IENDB`PNG  IHDRNIDAT8픱 P ,-E@_A7iAhzwht/ꐴ}puv9€]ӏlc)g1$XR2>+Ob;E+ܹ.q?1&  ,$ ÖP .ᯧ =]y5["cG*JIENDB`PNG  IHDR<IDATxceL0q`jm? IENDB`PNG  IHDR|~GIDATxc92W`J"s(|"Et0 fnsMIENDB`PNG  IHDR|~yIDATxc92W͇!Y#~ϳ ?3 "7P9C``gH/ x0bh4/#vCP[c;pc1IENDB`PNG  IHDR|~IDATx^= BA tV6Yx-=?lka&., %r9|g竖ڗ'VDTW8Xx}J0ytD I6hi=4c I#J̉XмW?\8&IENDB`PNG  IHDR]IDATxcfdf`af`L`N QcIENDB`PNG  IHDR  IDATxc`z`IENDB`PNG  IHDR~"IDATxc\zwL$"T d̼, \g/2IENDB`PNG  IHDR~;IDATxc\yˣ]:_޼΢@ X=,H&((PIENDB`PNG  IHDR~̕Y4< Xp{w^{s^(/b(AIENDB`PNG  IHDR<IDATxcXyoLd _m !\&IENDB`PNG  IHDR<IDATxc\yW[1\ dg(IENDB`PNG  IHDR<IDATxcXyoL>̕` 5>IENDB`PNG  IHDR|~DIDATxc\y L ď"s(|~"_Tt@ZCH? MX ~4ɪIENDB`PNG  IHDR|~IDATx^m1 P"]#v+ϥ< %b36mWh1sw @`20Pk8l 0 ±A TQ%؄Jub7lLȵIENDB`PNG  IHDR|~IDATx^uα @ @{Du5+#0DvI)` FH)(9\e˧o:܇'ߙN^.cD}K)RgI- 0Pp:D*:ğ°;ĞWroO?ifIENDB`PNG  IHDRYGIDATx^+DQ{dMS^ YP?`eC)b#e!E!Ӕ Ɇ(4dҿ[q0Y=9_;b5Vf>@KO7E7V6Ȑr:gN-F4 2bi$]DY;!ԇ).- a8Y F=b<]40+41'vE,,wqXQ)nV+!ƽ)>ĆɱNKCF,}bƭ^$i2yFj RbgVoqVxԊOߛxE)IENDB`PNG  IHDRYG6IDATxcO$Y*bl2R."AWx!* Io!AW- IENDB`PNG  IHDRIDATx^α @RK.Ҟӡ \-*.qHXk(oxx _( Hx zA{YS p)<r˸A͙Zlc \s:|z6H;ކbĚWvJYlqb|Dͫ}mĂ~-*a2oA,J7iBK7O} 'IENDB`PNG  IHDRrP6IDATx^A D{^VO k]kEIy0y`[Ɉa_ME 쩲q@ʆ9w aOm.ž*'H ž*k{, es̍( OU!.˔o$I1ZY ј^ {$#Mc%{氘DIENDB`PNG  IHDR1IDATxc?Vb˞)YUIENDB`PNG  IHDR9?u#IDATxcض `aL{O Gز2Iϐ_IENDB`PNG  IHDR9?u#IDATxc?ow?~{O Gز@IŶIENDB`PNG  IHDR  IDATxc(IENDB`PNG  IHDR<IDATcؾ `amV 5.IENDB`PNG  IHDR<IDATc? 8p?4?t8IENDB`PNG  IHDRLWIDATc8x3Ў<|IENDB`PNG  IHDR'5IDATxc9x$"L Tk@APa[0 LwP9g:2eIENDB`PNG  IHDR'8IDATc:xddge @Ā*S UU`j!R<#[y;IENDB`PNG  IHDRYGIDATx^a @ы`#l#a#lFF9DF˃e^_'Az]2 h4l{b>ev1D6`9Sd d-qC>NCcFEoن*GWL&: ɀ=LEXutYA%IENDB`PNG  IHDR~!IDATxc>A?Py_&021,YֲBY=>Q7< Fy~M3+nG.tʽm$ #&JON~V݄_“VUFJ|7@cVGGߗYMHA'xs,8{`eTL{eA*v.<01c#tONN[[Jxι0X,^erltf^X,j&Xۭ:Z4sB*aa'nkdj' xm>а ?aedߢl"IENDB`PNG  IHDRYGIDATx^A !J@J@*a`%TB%  H@&%!ɶNw+'FXȣ ap5T4qijCL#/l-,7{ J:$ͺ&/L1BE1&Ywg/{C˟MnIENDB`PNG  IHDRYGmIDATx^=7?ȳFt*$*yvF;inE0_g!l/]Lk'u5 YhW?[KϚâb#f^_8JSQTYԓZ&IENDB`PNG  IHDRYG`IDATx^ҡ PaA&'&0Ѓ-__e3} pfb943p5$VEfFb2;"v#oYIENDB`PNG  IHDR(I.s8IDATx^kOg7qAdž˶,#o HAD"ƖuȢ"@ r@FUr(\P þ{*-/I_:c|;Y>'w^':+++mo9iQªiii~~~QؗGEE]~ҮnJE*sNKo?  ^PPP NKTXXX m&MBJ~X6666N룤L",H碱 ˼1999*\7! =ϟ?А733Ա!h4O_?x:<<$Boo-^@*7bW`X_YY]#,FSLOO#bJs.@}[Cqskk*0oX%911Ree57֓}(h4 PRRBOyyӓ'MVkZ^^f=22B5z! ӆ~-̣YYYYhr"3XTXXD2ݝ_]]]g2z%Z alb}l{BD$MX&Hq כEN=~}Xj|d9 9-m 7f~, Zdx>b?rQI]]]ڳgF%*_6GիfLLLVMPPqq UTT~o )T8L0## ܹs@ tRSSQŵGp/kK%(\>u:zee,D;"I$&///nC==B86J< ַU =Lc7q6t8>n/p466a} W n$6h!ODAA;y[|j&''wǏ* lrr5|v`Jlã@YѣzsX |-&/`ďIENDB`PNG  IHDRJL_IDATx^UMoG3{}mcIJu^MА Bh%`ESRȮ ›E† ! TU%8ǹsx98h=9L#sV|+'SJs1F **B UP]"o9t:vt#m!O&j4 *>ATzuS21!FD4E\x"`V$ =pn:tmlSU L_A.{aDAD -'SxjJ!D \)51FR)hBYC:$[xU9DԉN`?c4= <47OvY{-1gX(" BFfY6KY8r'`]>X^"Q"YHt`sj'fAWr#(>׹{ŏ~Y5&G&yhv&*1bQ!˦DJg5]"2_hڂ.V/\೯^{ ;~EIPB [ݯS/8ӇW^#z<׀~"_g UE1j~@kaLeT|Jkgr5c:}S#?Wu٨ԙ~>FFl'z)El~'y}웙CD t _x.S6B }.D("uo/]Я&|JLĬYlXQgObLgl  *C]74 Hve!%>/0iSqsiw1¡˴Ծ7⠢HМ(}}Sg*n~y0O;s ^v$5TSDOlﰾo.nt埰rm6 Z*$ .]a_?:#UEwj/yYVn0+=SAy)]Dbdgsҙq@սWb$Կu/b@qkyTնĪO ;+h@@R:o[cPGv}vsVqhukUtcr5u`Y6)HKhàX* ZX1N"Fݯ?c"{}HI]*:,n/^=UY:`P`.!Yn?Wp^}$DVA}q){T(!ҵ.蛵`)IENDB`PNG  IHDRUIDATx^ߋUU?ks1wfhp25Ҕ*0IHH2 ç ^""} %,S 1!ò""ɹs=g.{鱁Z{gZsfd dL6r.Y(A 窨r,T_w L9n%5+BٷIe$w@-PS}ԯ ,B|PaHP] " T4b T{2 0T@-&ʨ 8TB70/5 ``0bp~EŅ24* HHs`8uXz(Cބ 1 U7B-E2W:*We)>(GނCQ pc,P]vvb;ˡVKHYPB60 j3ܐ/ȓo..Y?6i7HXP ?;S]ֽ|a<~a˂Z?N]IENDB`PNG  IHDRUIDATx^ϋE?U=LvMTE! r"(" HNAA EE`S/ElݝzΫG?NTյIU9y]}vm9CT^0NثK!|_Jitlq`d2!7 ali5)YE &ع~?  t>@c9@#;C|*(H/,<"SkCFkhȌi!a|#RmEVDA@>lwed [,Q ]f g83kC̐R] 9:ǟΎA JHdophr`?ƶc/0y4Rz:eVA%A˪a}`C*JYD*W "FJ4C.)w\cs]IFT<0Au"xvl(Q($sJ39ojӷ e,V;tPt :9J)SJo$O lH&\QU 5bo߼.,ޗlLaӀ9]R,xQ!q8P33w0"~PA(6[3=jLcFLwiTwJAj;~I 8ptjm!`$*GRL >0`k)oh8HQHYee eh@;(&PPG`uu*IE/uD">!*7GЯ_F2U+2h#C@^O/%EJ Ay{5 JLlȼ4Z)hF?`g~VCqҤ[aEK|[ %7$#05Э#A~J[O.94)|Su̸'E6@5=wRU^xC7o}W)7H QDM{FA_wg9M3Ns`Y[ogpIENDB`PNG  IHDRϴIDATx^OUl2IKTKM//* ԛ'o~DE*BBfwvtkЁک۪U]‡K3`oUn= w|GԯZ9e;MC(Xjy]X-U͕޿w/\` p dva/aw,]!AkS`Ҩ`Tz(<0)&B4ٙ4Ey;a6G Ψ/o/=eUu AzK#`d@\$H|<5`u&|~Kp!4 +d@"N"Ѐ@\*q#, ŃCfLjo]4ܹi%H= >&:M*2l/5 63j+e4njJb>/sPMۮ6;_libjBjR/,Twn/-YۍBM2yQYg"L=4ԦAS{Hl á0~!>.,9:<5ϼw o|*ߨ藍7hj\o!=s|&NH>I^3I {@Y_t(QJxf2 W nw(z[pzʹu_=8MVIGlgHz{/;sTX`)(Pm$-<_RxHhʹؙ}g߁S:,wkyT=gئNU-t_ Q0ݧ.`b"4 Fe˟\{&p:` < \!Jn7_#1FP\PpIENDB`PNG  IHDRJLIDATxeoT?k3Ӗ[t.ܛK OQ"jO$ȫ> ĈmԢi阶SHs9礧Y]kY߽TTssnaأ!yUP 0_˅]zrܫ.IJ "ABD~WW"0WSc>/`sz~$';;{)'|DsS\5˥;!a^ݐ;W0>',x4~MxUf s|xeb҇+_~{ی DHor\\[[=?OTl4tөTfo,昽\dKX vgĿ"{QG+El?U"@pDRPXT 0K"A  Rz)♚qHҀrTdZ 4]-UWs .橌 c48ynHdޤCxh'e?'iIENDB`PNG  IHDRUqIDATx^kQe7nE*""J=~\҃*(bEhŃzZڔ&ټͣۇ~LဨP]Fe<|FW僋eujuLE>/c|OL,.JMwFv}fJg蔌^ ig033{bZCYu0O]uUxpx\I Hf^}DsϦd<$g$3>U}S"eh|HB,(N‘]w|``:C ͍<l ʡ\̸c؎N2 CZ#AlK^B)ۼq<+ =A ljxe[am/5Dɖ[ǮJ|듙K+F]?%TjoXFu6!,IENDB`PNG  IHDRdqIDATxڭ!0 9X2A.@`0( !)%"6ğs%w~* I1`Hh0B@>RfɃ a.luMA, >*2dAސWD"|\ֶTɕsX)IENDB`PNG  IHDRdqIDATx^α @EWF,`2%h ”`n`vd))"'Aޏ} yJIM)"[9s~눤2 LiFuXȍJY DY>-" 9"$"QbsIENDB`PNG  IHDRdqIDATx^ұ P)"3 0Wؑ](b`jY&@ ~|a?&=:&mRCkTTH:g!)R %D%\lMJ6q 9:6 )e×, AQ_FIENDB`PNG  IHDRdqIDATxcORdT V@% A:{>=GIENDB`PNG  IHDRdq-IDATxc`` Rx*!%R#[JAH dy$IENDB`PNG  IHDRdq'IDATxc`a@'9?V@% U}D8NH^IENDB`PNG  IHDRdqIDATxcO] V@% A }4T=y,%IENDB`PNG  IHDRdq/IDATxc`` Rx*!%R(@ C!7,^ ZiȫXAd̏}.G,_mjZ),+*tcYR$RY1 7'8wsV]DzphL fe0|멝:NT *ߧ@*=Ͼ Ée(3GPqٗʽ7LRMa7w 0v?ˤsk5z3TB['ڈ0 ŁE(ᘪWil3*oP2d8C#0ˋ'¦c(葦"q`xL6emɺ6UZBZzX xGҋ="-x $ً'??*RX{fKcl͛ہ=~3͛S0u{X+^~O:?OmsgvS)!r-y}LP?/)}*Bp;n$*ǼypjܮLf`v4?m莄fwϕ]qhIfdd\FH$BP|BHkX>hGg.pi{/Q׫+$c }u#6yż_,``\h!hsXQ,Z}Y-f(Q}@t&X'|$>hD)?rNLq fPӹϿOe4<;=ܸ;Rn PY_Osp2]CPW<-ו}_`WIENDB`PNG  IHDR szzIDATxՖ{LWIsS(&[BF)^P*-l\ԩLTn"c e h-(R.}~lҖ)<9䃜w{ ^T*[Q Elj_E%_GʕKU.X0ꥋb!2}9A…&1ꤜ6J{^+1ՑAݍ,*l$6ԇr̔'_r-I[rԣ)2G b B%ŏpp>!(Ü f1nJgW^v_[f/6nYҴoPw]d{!N/X sa,anc;0%gh4^\&?oo_Q&<(Gǘ`<ÄL)Y =h} SeMqZ ߾N3\70D-ɠC_ 6lf!]f f7G(\dC%"WR6t_[)_[v@,8+mXTcyi43 ED!e\迊\Cʸ`k9ifw`N88Udq1UmOeA`|]Z%y4ed "L#} #Э01 EU:a-4Z~;A@"bL'ȝT8xHBU$إp r]&@AP抩yph:v +'|o:va xlj5lp8E] 5˝zlO&UQs:'ianе6Dڦ4߅5!#!\01OMS H;ӎmߣ`'Ry'fD'878rhj+`eeЯ uw"d6hI$.DG~;prVWo9<哮Z蝡j!2'9*Ɋ\]R,ZEV"Fz #;ae?-}c,%aW]g L%=i12g1Y<3ƦF7M Ot>a _/:^{w'{zX2wgUG̼IENDB`PNG  IHDR m IDATx tǿ;dH$=%*EAP-¡@`*V}<Jgy(/< @&;_?;wޛ;w 㜃m?31Ned2ysszAY7mc,LG4/S]1LZQaՔa*n)azzʸ,/qM+E@U,v>2wR5n! mW\˹ϗ#ry`\"L*Z mWbJ_:͍F- lAu>9.3;ۗ1aojAS{@E'Ǐ¾h/cºhxM:VC̩<1z(ݶ.w/Rt](`;<Ò~='u=7~Ü[Q&bPP'}tbѷF!~M'^@ZC>a}u{g2ClQ}MPSߝF5' +fd?"Tvw| rh4 ȁ!O.X-m!lqiw w?}Hf!@Θ+!C: لxe%K L̠Q H"iA ,Y:Gס'h_>痢sT~3x T?>"C@=zP >7yj1 SﰶY W`D2S-:YW|d=/ =GJՉTCCq:sG L&azC9c8y)]L$[x# "Le5ۢm8ԣץWf?zw i4ՏFwPc)^h0 /jjLvƛТoTySm߇-ޢ>7s⴯N:B\73׵MĄQ|;Fm "[sD{^/Qo뤐&2&/Z/涷%1|dڃ}SP3vvܘ *7$} v*ĭC:pK@Z`ao&m3Mf,ŗşxjpHr,Fy@И4c% _ c馒<*Kkk*au{T3ȑ1U1:kœ8e,O]-3Dд2F6PVPnV$OKөFpg2l (m*VfrR{SWwwUZ.8XK4lp-{u5'374˴VvXœN8bcvqI@VCb0-f,R)2]a$.jnsP[Btq<-C&n?+Īw9f!)fv2=Q۰jf9om~@nFtu-i@mCgՆ2Bq]EޑRXmFdq̓]' ө a:]XFPJ̾7i0go:$%UCnB7c ;-۬.HY|H"KS4z | rѨH&Ai~+nn(xvPĬ36yNN>.셆@3+ @U=>9S8lt?(`@^҇фHM@-Pj*+:Ic.i_g MB-(_NglݨX^.<&K1S?cqȞ0F[a/cj;/q_ UuC&!T],NP^GU'zѳh$"nD!xVיG}:h8@@.:6F'Է ~ { wV?\[ZN wZ&?DY֠?r߶}u}։u\əhE&aHv0&U7T{{mXO ׍)l0zţ&v</ JD/"yKR\XԶ5UXU?9x2@ )UQj=uY*[+N%?zC_` ^(ˀtGKbnq` Zq lmY#V3sb",>"ST?`FPG[jm]YeX2KgDX1x.zȝF0EiQ1lMyֹ"͖#j77r74]KI1mWVl_0e{TIENDB`PNG  IHDR szzIDATxŕtdچjwǜ8m۶mھضmvƞI:i ӫc/-hp8xVY}te@ D4wG/s :1ӽ?k-p(8x.U'ޭcDK 167l>' )":F`9/W().i`ޭoUº];6|s?x:((ss n`yyqRUUőGIEEŰF&2 35, =-Y_,<~+tdKK < "Bcc#vm[tMnF1 l6&?a5L;['uf_d$ MMM$AC'mݖ_|uYg|OBS 3 b  E7_|'h"^u𸈰jDd2tL(+[s (c e-|^{5^yA#?Jz!<;gꫯ&2OȷG6JO7T'/ 2s㺛:و(t· K_~Jyѭ4Tmu5Ck`)-o]I0—ye o>} kUҩfx'>du0 @̋BHjNTu~szaa !_qZ0uqk<639a&P/%6kr8KRI%FbRLq@en՗j{/@(o]Lx\,|xc/ v'=ӗ|'dkiSz#'pH"A,8Ƚx]a(g{!:/#_܏BER#jYj<\lĵ|n,RB4v/_7jQRl][V|WOO ƽ%|7 橯9bKx]VwŸ1v(BOp=6;Ц8K\#  QΈ|qlvT^<8y̌ݾmQ+p| {V>[o7ԣawA/E p1+b =y*iZCZql%vUUJGETLwkqHڞe3qldiAU`#a}$秧uw݇*AuߑN8r/T $Xokfl^hkcZj f 'vHa%5<Dﻏ\4wtV,Ʀӻ(,Aտf)%C*ȁr,l6-S @>] bnIv@ Y8mmdb*z5t" z6TJYe5_)+P7d҉LPK x %G?sS7 8s^(vaD 1٢7%M责^&[N[4wwbOqB! P@6ݜn{ ݴ-m_(ٓ{+biP$kQq36ݟ $ք!z]>WK akqŊQ8b ;[TBu6}KcnUB1`3/3`Y@*dnj4R- @I Uw=Dxsk3V69k7=# bropI;QOX$.@6sPCygۼO& B&?Օ"xEtpVP]W|W!)\Y?9T VTTp50zh/]vFbvb}AU93BI?їpt g5h+,p4wyK.Fƍǜ9s0p7?R__O*"[:L_L׬wWxt$I$AU99I&tAL4i wiO_g)"ν`:ycaJOVoyy9GqX _~?ǘ1c6l&L~0FʂW59LNvscZZZ:u*˖-W^aP]]3f3ϐH$a2?74BM~!)_~99xle8qD>2?4*J"<-Y䨬BV%KvDu\~QSz~ɪrNN[J:"%xasNji3em#7nMAJFSv- ^(q-Cb7fn]qtP!f8TθK$S-_zQL`Vm|wdM n>Rb<#~iZ=FHתG) Yf'2+17{oQ%0c6^n M1#"WU0|Ր>/%!lѫ e\-K011mmy"/ĉK1>&-*}t9N08pI̚\ Bܸ.H̏j"ö1|![ZJ$($E\J$PdkcH mH1t;s_qq ZZJDAIH8ǯ;ޙL G35W?ﻟCxQ)R@ (Ҫ={aa LڅB`=9z61L29ҞC:6%Ւi.MϏ[村羚8 ^^H3CO;3MMhC0anaj񑱹ѫ7>tBX,pTХ$;;u- +A1UGKRmL?Ao9[]$ N[GZZ4l<KB-rA]0p-0ATQ=~9-_<4*R֓Vm:*f (Yr@cF$m%d:ێ]gcٍ]t"*چ$&S i.,86,SW.Ҵm+EXns4 ZD BP34$b2vL}a0"健F*ꂪ, .?4]Z jWHTJ(BR"ΨBYJEihjf*bmw kш뺦*dۘ fVԸ?*DpH`Ҡq8qT\A̹P kkJ9U'gVHLKffS 4u-#P*V0~75L+-/-ΰ?Y4G^RA%ƙeYfqjҹP'zn9pc yT-<{3I s/-eiKatj^x8K; `BH@XΗjn1Ę4RQ 2 W:ƅTWh)ܽ:|m6T]bޗ*!hUu72hͪPJktbu c^чhZ$Lk 'C5yhĤ;n]s6ߎD4nZ58 W"a 㩤RꂕK-8y7uz Z)BŻFx.Ckw>S.4W~DC).|bnM F"3z=$`H%1y\˵>=4> VIENDB`PNG  IHDR&HuIDATxo\W9{fl$NjI[J B]' XvCl`UԤR£!MH8ɸ9uwPٓOivw~#{BBQޟOȐf3l6~db# _9!+v~܂ $mun;W/Fo\ # fbJy[8܏}hRV(a/lwM^߹w+?}V \bR>'*Ӛ@8 ;:nk?|?H [^"h? @~bɕ"~YRNTAO̟eٵ.Wc? @5<*bޥAz { I ~*JOUNr̟g;xP.> %P p`o/~Kr;*IENDB`PNG  IHDR&HwIDATxMocW{smvdI: - t`A  ;6؂ZT*T 0|$Ibھd~W=y_KǢ|RdCt`(H"x2͐d7L2 $qO__F I-nn^FNwXCq 翽o™jmhJXÊRln~wגzl@&-Ps_}OWsX A9 }6n/7_q*Q+(g/?;}3hfthGXjSufYV.Ϻ{[@pa4Tuj4w >( *`ձlrP ʃ)P?cYyblye,Pl<^8Sc/i?VAM{;,ss_"`rbBܥce|~XNDQ(U P~bav[ťQ)я=0}``"0+ *Щ$L^𩦀d"[ SfmQ8H d'Ctp@A^ÿvoMJXb$*2b1#=[k +FrNŠ%I8O)kjg9I14VQޠK3@%= UjΚvꀏ#<|7㱘T1[ p(yWz=[PLﶺ|pJCr<rW@ ?avOJj{A xe wS#P`۷:okd1d|u'2(G.8ECo- sUin7_kpBP¨rJ@P0Uz@ڀ~_;YPF$XB[o__xLn\|FiF9`ڝ]"R A (`b}uO}Z*IF<!da#"^`~µ|i,,GL #PJT~?y!nY;@\vYL#)10)[/mȀIo% ]` ةխK ^#@c}VC'^ݚtM@ar6mXpuaC/O5>սJ\`@+=ήORr' P 'B@u/rl~HyO^_ξ쑑tMw֥ܺ4 eX. @kЀ%ax Jbx˳ 57G @qA+;f|yry,C1$4,]JRifLg&GtƳ@+> Bq7ߚH ܶuHOkih0e-حR.6_R6A !$E pVNZ e^jB{ ?qɤc R)M+1cl*$%B0L/f+D"4ÑM30 uN_Uq tlil)!l_Z0F ǗZ'3]7Za B͗e ,4/M JSJ 5j%_޷}0Q\E/^ (M +9rlJLW^Ϫ_PU2'@h:(vGр@OgK(L%^,~q&W@8`'@E0"zY@KɥTIkJ_ĊOL'JO CIOҒu4 ha/q'֢<῎\8s2yX3Hs‘fk_O|gA}2P))f <[I f:B@u\?ۇn}?{nwf) &Z;:=`hje 9 0=[I7&rRt2JMP8:*e8.OOf}M f qj8͛׵B5h @f+GRvDU_gjcq 30@EIeumfF;[+W%[;a4HMc͛vvx(!> l 9^@Mģ6=;o>>TpMC"^ J}ԾB/.G c IENDB`PNG  IHDR&HIDATx^]\W{cgfggg'$0)B mRi+ZmA}4/ЈA (XK bl_Mltnv&;3H[ m?s_9Z˃":c;H@jl9bv++|YU Hcp/}ןxW̓?9sS޵K;BU&^*eJ_H(,?04"Wt;xhlt1O?{N=Ge7F->R呝:y;@r+:=%DH!ͺds=ǘ?m+:$%lضAk`;BH 탒Oi 9bQ9-BVx` ` z`8*1_BI"m@.B9# Ȥ~2ij Q`u2UJDtP|eb$ RXtRt`Bjs~I&JYecAC rFv] Lb0 EbBB;BW$,`=lX^胀B@\ es#*fW+.+nއoU=I.Llj.ߥhZ0X""j+v?l>` []0ڀ Db:B!\[wE$2wnL!ܴbyʸ#`ej5@hDW kKg߼z>,h1T+92 -XAJ* 66i1 xv _#c kޘ (HG|Gb>`O 'L_!KyA2]1!,r?@s~~q׿}[/KQd2|?~h2*M![*'Y xdFJLdQH\PN֚P|Y[`8L@k#١|sP@bwi2|lhk@HAPID҇x o::Y֠/ s0]iln^ ;28L4q2}һ=7Zh V$ !G ./\ _9wi`_,KIVwWzP)f H`q6'}gܨ⍋iO/pz`lX]IENDB`PNG  IHDR&HDIDATx^KlW3g޹7ALHg1 xH+RP!Z$@ AwYcJ)J(M$\;dy#E\7nFgwk-\N }xT Vv˼Xo@;@##oN~Wy~~3l䡳ߟ;קᑙ@xguQRىJeGz  /a{6IW78mv~tvP^ml@a-8VqЋAiI Xp`v9Z}Dk,`֒Co/3cڠ <jЮ Rkr^|Kd2TH m:8, z`щHKlV])4PZ4UH K*K@ ̌>FKHP)X$zs{3K0 ؞JzRaEJ$h'&&YuҴm'cw Lh80Ѓ_ ڂ֤67690eW^xkS{p1\ש}=d洛w =: k mP,A` ƍ1˭7;Wɓ9 _:8I2 6xm5ٟ@o9󙕫O`Nܩg:o.Jk D$+h\:!߬CٓLEk/ ˀ'v)fXVtFr% IZ0 ̋\y",  ,|\RJ`2엾 s=ؽSF;H23Uo֐*ףX "|P:{9Wܧ'~ (}n!W||!zA(N!ՠ  xo\WWʕ/w>_h=HP.I8|קT PzqďKSW~HvZOWOIENDB`PNG  IHDR&HVIDATx^KlWIya(- EUـ6t ,T,"u<(В$D7{̙s~,yf(O:ѧ?<-%=,`gfI|q“Ȋ>P|Ls7 S2Y@␕u6íUzN:{{@OXڋF/}b?=R!Cu)Uۭtw?nQj}a~?=ڤ9 TP zT*4]%ߜ'\M6{嗽W$yrkG^:_gvoKV}о Wwkhr55G85]/~l;@N)bg/}l]oHX0qasIqRWF'b٢,1 O05 :!1 -wϩ2̱s5=8 V,L b,{pnVS@$_#CM=n+skIUz5nޢ-*4Oۉ_{ۭboev]o?2'( +w "{22ԃWp N x‚{Pbpo۹`*h./ 񀆈+CkE?6Qג(T *8U<ĘP$ID'e9r@^F<#zc}z]x:ZFC[ T"dRRXR`?ޝY?d#uJOmuGT-wqOW[?$(r_nnΛΓ#R?ƠÈ("*RupFж7>3e]HExro{ȸH(޺[7ޒ,=J MgT[rC(qZo7gǦ*~_?3 Mn֑t{~b`h`ǠQ!Mq$9  9ܱw~؝<>&l}Z*G/P* 9Vg+)R;AdC@]>xirЈ`A;&뚋sغ)'*L90YQv`AD XiyHؔ7wd; aG\օ!ij)tWj4zV?5`CD&} 1KBY#ۯۋ4eP{7[1Y+sUݗ&1 @MՖp*`ǵaAy>/$qYFT)f!l_$]%. @4OZ./E\k"WQҁVCE4G}.x2vN_ቹJpȧ29МeB@ A&1YA{d,2s nS$=6tdŠjr|<2ɡS<>,0ڀS}{S)@Q:1i %ޛD=σ8]G6ߘG^でa9=cP_<+5FK̀GT`pծ,kszhyLt|{W$'/SmŹe !w.L˧x J\Aـrmt@GN†aOR*K!DƢm\spח.CJE&eG՚G3M!cώ,7&5Y#񑤢yAH"oT'](&N5= ]\z)f8i O 岷 g<pB&t BC4?8WxƏn)vkdR&I/C.UYde*Ei!JI/e i!Pbu zeMDQ"E!,+j%E3gfYY܉q&Ncb@"BS,/,s t}?%ٔ $ QY&paΜRaS6aBaZJ ZҸ;f7;6>,#[=9-MN3ЊYw"Lx{MTޑych1saL]{fXזnRU!7sua뾶C;@R=w<7>ߞ*7PJ@#IPr{%%V&J4sHmʤ1M1dp"Nk`T'i4 r_t+݃n ] ]cv2h1|v^}X嶭@[Rtw}QaL'%RSwyzfCgjFe"CIENDB`PNG  IHDR&HjIDATx^i]ggs]ξ3J IJK&(EVBR$(JiRiQMZc4iNd}M{Z!{x?ye_|?(H T*dzsEQVx hl_E"T*Qߟ,?{;6ٶ]tL\~ xo[ٛL&_uK# vf2u8wK-F(:E<®[oF? iZ* l=<.5܌Q3xG@k@՛ 8T=W>uPn[7/! t#Su\VBzDJF3n5kU@#-5|טH$~Pe!M_gVj$cs2+&FuuPD۲( ;ڂPGC,QR1i\AKBe,]a:S#_qЌ(ZK$5CSz`EZ00em;!#f6*랾0 #RP$t˳f=[K5Dɥ /ŚJoB>_MrYU=`$/\Xt|bCQ <85/cu%<шN%I +P: -8?`DP\E?ڻ`ZyĔeXrN)TͫHCldu<\)֢:+O|QR.\ax~++'}_߇*e;y F)_=;)npDmM摵mʖD[Bcy~K@``$/o`7mj1ߟE#6]I'`,H"oo}L֝ϹS*PYci\$c%&-a䌆Id_kx-0`e_hԵx"LZ[1Pr<ˆL5\θJ4bQTkZfQ:vv"3_Gf>M)3M̓3Kz( jR(6"2鑳SJaC΁Mwn̦T6$Yj̍&{ FLmg T qrc[L(pF:h\XKH,Ncf C&T6 Qg_=ŋ%WܼQ=0_nhKᑽG.#Ȓ -iɔi }ɧyxxgAV 0_"I$U@ueLPHEj`h [w׎[?w <Tn ,[͗SSy"r@F$YFC6[bՊvr3S=~c7}\,r?PZVrdNo O$ YC*_'Tɺl7y/@]ݬ2cJ&G/7깍p=opAYdf: ܵcm]SN\itz)5d v'~ {[DIbV-wGѴ q-ApE(ۅ5dp贍޼y][;]' :>IENDB`PNG  IHDR&HIDATx^{pTƿsc7lvd b( m+J}U)# uF3uJ}utt3+j+JP II{_ΝP͙ɝ;pq.!"_x\ \Od!*WF)Eà;\vx`?029Db,̬~Yŗ&saX<7eo&3cOO\hRee=͑mAʟ J| % (Krwګ;h P`U / @yk= .`xt&0m$KQ S ݟ+uh Muͷ^~waͦظ6yR 0#Q@4T)2a"XʀȠ,ظ%[_#d$Ȕ|aP)ܫS:*{Gw!Y=<!^۹#,G_G0qZ* K8vNXVrVD={ॗ^G3x0>aSO,':98cE|pb [ ,̊^, ޞ+JPv??6#0怹.yi6 lz=l!uh  Q/@!(6#'Ih H)L +E̱,+WOnm,id qyrxqs/Y0a iç*şrh9"ABڰ\uJ=iRa4n]>[nZ7]8L˅]%!)/09P  9tȑ<*](ՓƉbth FZT4ROrF *K(|;N( > 2`@|(10n{ 0rcYk4M=޿IHPT*?Kf7gƫDh*D@SY'z _W+Ʋp_9]KQߢ*~:B`dtLfu<8~`x"SbsƋb0! l.r6xGѽ&߾ f/ʻHMK+"%@R06-y_ !wQOdӿmýi]r'w:f5qzA?EBIȘOPxxR_S!M>K]R_uEՕ"7X!X+ya|yӆطk&rYv𪙕%d[vDk c &|*P̫Ȃ㸬@+ }V:6z @F0]cC #`ܯ&F3uK"PUo3 4sNYa%緿Z[H)\@Z KCרIF"s-HTQØf0s(-ekMR@,1ۀ?X/8q=sj0gt(MہƇs{/M"%}MXoRR|T]0QmqO{1sG1̐J9E 4M'we@|(p`gZT4KHHH4irm㦱mds9ҏeKəb[EgKZGaIڱH]/4„blbBJIHс+D ?LDJVrϖu8Id3]fiB30u +u0fŒ`$T/Ru \!$cYPP$2! CꭀB˓za|c2tK /%Br-:jJP.dwo_ޝ}l6mn\6.cp^R^1Ճױɺ:LPBғuqLs _ @7$u  $LB6%R\SǔMŷJ( jx?$Յ&@992܁P9+['.4Z0=:-ɦ%zF۶L!8V.ZXZ:q+luLp/'K (A E(g榮TLj_ZhX[DjmT$AZn& 9ToK:r)cu9DZ4k % ԡݖ}yFXNS}`v,޾ `hdphӎ_je !n>h,.]+~g͜s]cUPN۴M8yBcL!u7]=)͡pIENDB`PNG  IHDR&H IDATx^I\Ww\n;$FaCPDdD,سCX VAblE2H!qrm8Po_WWOMJ>үzWW9qRxа0Zj>!PM9Fy^[G(i5jh{d@ŵ fg`ޅ,XJÃ(Ϗ8ѳD{-k"K!0AP9X}9 j W).CDqZL$0$(sMmZ1 :}|rwLog u05 ӎHÂk{̡|j½!ۯcVMQVJtK%:,yȉ} aZ1o<>p֮ ޹]+QE $fv Y:+uRY_+A`P=fӉjdi^]qRv?*nvVv|J(@w4c[8PJrq!|@AJ\8Ғ_=bI s`YddC:.,}Fe M|`ʶ!Y]WtGSJ"M.~˧!Ob{h[ VmPSRґ.*ݹ&y/{ؾyb>6\H(ႡXҀM&@9o/GϷCni|ܶ%"֯bDdz!o%dȸvL'䕊бxn~g\C'pMU2tmo+ ly\wF ۅCT 70u&PB)Jn_dZdwlϟ%~BXĴ U7Y X죲,>s(7r8UTҙ7*k5#`.TS e |v9w0L. BQyxIۅYN*DY[ 9+$سan!gf|T (U$Qi> SV1E>Uumt 'ԝ[^rN9f,L&18_: n!OUV˿tommLFxL_sl`VO*]t9@ uӕRT :sLk}}/*ctf fH\8a20TBiِYNyto1 [~=e:'@gtCUt4._1F0='g*$tl@TNh=4:N_Ie{1*/"h0R@4e@h46ac83ƵqBH  %SNec`4)s9NľG,m8)B8S8~<׬U[H-IENDB`PNG  IHDR&HIDATx^ PU?ჽwAD4@X"fx/J*%QBSD/SHi$ESve%n!`$ >yg }3f99cpC,",#H^^^|E852=DvtCGğ,45ZuXjfyI - 8Ӗd"Tncg*=L&ŸÃN8$;#=&)EJb3ꈃǿ2TVBww2!C0hyi_BES!{JGFɐ?6;? ߸HrY 6/[~(;"Ő}#n btZ,x˞F" f@l|٣2%"ro&45P:;;OT[577,?6fZiG `0@KK tuuA__6صQ1-bT7iڬg/Mer18[v&^F)GĚ%"hn~ǔHb H{ֽ$\61+dYrZ:4cR]]$1,3zP ۍnݾ[)!Zl|QR52Q"uKlsiuD ǜc{Aw Tj}qHJ:+ V"֋[w%h1.16,H< > k yrhWE_ BEGKXGGX-&#bbq ͆ 1-_$bO+gR "1``zA(a7=qc1>/\.2-ҩ+#Np vw/HRZp`}I10s)5+ƥ ~}·y \ /("]J/TIi3Pb p8\aaaD S&M%P5 KƓ0l2 \!{&rB,=J5R8g0e^8i R Qkmm-!gP"BF5}Sv&%~D5BJˉP ZBVa(1J'8A& ^>A'eWUUb"j"R(Ƀ/ͻZXKPb)&bcqF#rWɆ|.['N}k?DlvMUz>#\&|3wAxչ~2k}b:| O3g='p"`+K3 @"o!ZtE(2e9bLJ'dlWtJU魍qyHbfʙ+P(GDƤgɕtڨɱƈ'؃iTrkUIENDB`PNG  IHDR&HIDATx͘[UWk_ߙa0E,b  UP+m<b*MKK 4UJc6)0 3\ΙϾ,Jdx|;{[kR({L 4_{r쮀tX;4qŔ%9H"JͺJ5_:{M/_)HV}E),_cWT[Nk2IF[?iֽ{oFTC[:z7f} ( $mxk[~gG_}h݁)GU(AMQ҄#rІs-1sʜ;s w(]LI!`f!VR%`_p7t:עĕ'm:< N+/vaÛkV|<(3'2! P1 LTp NlZӡfR 2o^;)mFslF(Cnew?fٞ|V)o+n!Ia~ Y/+ҭ|avW,* eƸ`:Y9h ^6tW~':T/k`Icxfl M@8B#X$_\U$Cmn=2@̀eSPźuxf@l.͂Ϋ <.8#Xx])&N~|^}u;x̬.c1&z<>KZKp3Бbk;w:(Q $,[GSy;Fee%T: %.i) %灔-! A8/ ) R XIz"Д$0cQQu#6` [t Fڠǟ05Q@T@\D? x`ss Am9dRJ>` 4%0:d]E}R @C[Rc[(RSAzsL0@²Aw~>q7NT>-l r:[5=)(6}r7qZ$1E)fU^9{-}qAA†eBf@ G`c9W..x`.`)uKk(14b ( P$U9AKR,+9xcy qӞC^ b,$Z:: 4<@#G J`2lqS{@Rͼv~O͈J3L1'rQ^AzՑ摧$l>Jt"&O0(:Bf3H_~&! \?D]tрGLRy̏T`$Ӎx!sR#Tm hA#Ti%e,]k@Âw/X;?lҨx W5{ݞWhe!yS\^=N?ɽ$!4&T&d{ۻ@׃ā5saU|KNW@G':A,$uh!`J&4 Icg< @.PuCGZ9uGc$φH l!q vz)]" 0t vkvuoi\QeHP( O߶4a)xj@HGаD {Oe9m@0d]_t\BmE&<]Z9g@0F>#NkG9Gydx(^n:Rt&r| o^yz`}]YS7 AhLZrڰ<}iu*u+} ~aP܋1 un߲j H),_n䡖P[IENDB`PNG  IHDR&HhIDATx^yT_6Y!@d]})5 wL*L\(юB"j 8 r]RAEkFA. 819s31߳AA@(3JHCeBA?oyC~9=sK\!T"T<0/=m\rJ){ {܊tձ.ފO#H@|kJSքcIˑ=ŔS|lOZӺ/`_樠sPu4S9.&з=fy[JOQ}XI+z;EooVD/62Pu5DR7.d2h1YOMd^\f~*i]JTɨ?!Aww7dCmy42'ԦMvPҞvS(;[p x* AEͫ%! BM6 ?胒'O00nT6sR_ʷ0i9:;a`E.W;' =23Z>܅T iFQv==4]]!q ȢiQisq .q Le4fq_'|k$IyT'fgCbEx\SbL^#)8S Il?RͼacZ g.Tun=D(4WFwFW|͋5!nG $iIb;QwPj3B4P?D7 bb Kf~,-'ůO%ݴ!f2z1ݱ4zzP%هٸr){ek;D #.J< qX:gjǶ\tP TdcxtttA۶᳏Wz/(pe4tpjjj|G>+caIx!#d$3pz鑊&"afP:Réy[b9Id kfKģRp' g&x D?{Ѽ~E=J"<$A6IJ{b \n1tCε}*qȏ1]ϳRQރT丈1 ZUh9_kejD&.| i/tXY '*O"9S ټؐ!44>\6sʉג !+H6'B뢦X6b( FO$0fk8lqNv|y*&Z3wKQ’ٗǺ8'iw)=aa2_ūKP7s3u5 TqOgKIX?hG|^v~pc <g,[] L6-DhB0Cb8ԗ鑘;33F]WG/ϑ<O=0&uy"3rPB]rY/^R'kBD=g_FD-L5tEqs8\fKf v{8ךiBR1[3el\^Wc'6 dL@X Q-zЭa!LNv)k1T,}t'Դ 35[@kY@ kQl$vmg`yD>q8B2 {5Pv+{J3xȕe**UjԄN'ArCױeYCB[d"g0b ̓ca0>VA$`$K%w>,G.tHIENDB`PNG  IHDR&HIDATxڵy4oQJ2-WVb)RIiŴ2)$ƒ5 HǒeB !u]"NMy?s3{?ﳾ໡A`(0b #"fdo댔Pgȵ&DB 4י¹O-W|Гғ8:ojH,5ԃmj~4="(C}O3Φg}RTL6yyy&KOMqp2,\qF& N:!/|eӤrJ}iOĘ( t'[n~.R'ahYL6OIf-${g%F|o}˵k@a|,؋bo ۩!z1 2e3 )Qu#Sk"}MjxiQ~'>}=YrOSah,GsMJ|*C[%Eo47dewЀĄ>__U;zuᫀ;x ޳IhpP 7"m5.}<śrzE&ƤT$/IIpU* fvţ:d92EO3mĻ8wBrjI TnwF\6`_I" ;rFaG"<8C5DBkJFks*Iơ^0޳(ZFב{()K ,IJp^[3$ƤQr4]n LD =4.:.RI& &I옩Sac4-?‖C܇[P}u+~ݥOCku$M2|Bg:5iTpjy_R#a~J tf$8.j|t4SME@PHa7KEꬎ֪ 1Qh3-褮N;>/MSԾ:1sVBӿZ-^h8WP}L(討CGs6z: eZ:w t, i*1DlՇp7t%舺}h믱.j4h)Qz,Co;{L]{)xeH?PDM\]I)1k,7 /SE$m-= :3[pkS]E[C*dL?O@SϫJ B;J(em v+g{4ơRt TNSI.-al`C('8?ڄ%wA3jv݋m1^;'vgkJVC84GE<1m 8T*1&F" Sqqqf1)[} NMh٪zBB#5 ۣYqnRu4|560UL4sQn:ᦏ lհt Ξ tqLCȍ(v墩"ei$@G F<_ILc' kl3./r}B{ߜ:0/ g-9xSɨ֘9S!L%8L ;ʂwo);)X)d~[m;!K[A1͵ t5fz&yI1}<t\6<l6{X+@K].;pޤ1>}I0xi)Zژ1;gpqdCQugx5m[b墲LMr*J .qd H衛hh+=ɔ18;O$#r#@Bww7^bh57@  MH jMT*5}'S,ɌêD|q c m6LSq#*9BKK@2elikGZ+A6b)c7g&Aؾk~ Ɖ'xX'⤲aXQ;57Y +ף&qgHKLjY;i>ꇸaaZT?BSSJ%A%O!h_W}}Bh5mlDJ#G ccx̞5r(#>>/woyk+҂NVtLQSD{k/#]tТVՈ8uɘ)cKaDEƍxΝ:9 UR)dRjf4R.f7] Ɲ; iJvht7o!22vmX&rϘ1Q"¨3q+W,c◼|孔VP(&ƢGRfxFdSؽﰴ31Z@NPț~Ӝjdee#5DGF!pm)s8KseύGճ5im#?DAi)D*EEM-KD[.l0%"8Lb,1sXuZd!ǥim͵/5mP>ku7Ɏ]pt8%27c 㼍^5B㈩"#ɞOzs\(vwmg=re@8V=^%Xɉ$b*1p" &bPL۸8J7RIENDB`PNG  IHDR&H !IDATx͘kyefΜ^YEڛVF+D ʼnKiI~JB~)iIJq&عUr\%,K+i\;oeKEO};y# @*4`@ =k/Ա}a䱉SeW+ǽĭN7 ]ԶjhSxK`AI<<;SOό"!RȌ-+u:N.V57kWtW\fR(x_~_y_P 06k !ʓ-B_*b`Wklܼ߼|rmW:^YB I &ϙ߼чxzVѣ&! hTkLP`, 7)agޏz,GϽ_}o  '~W%u6Zǐ3R.24c"VA8)zVcP9#1W~z3@ ԽRcakKQ(ql + w/!'_8 Y,Q#wCq:(SwpE:;G;k& #ўC9(|C; Z JDEQ>v Hs,ך(o(V%>@d<. |GS#[B_ c&4cDZ ]$<\{yxK5[ U͊K?2q_CL+/T.9M6EGе6z!;fR,\'vy}c܅ w 1O-<+P}{ D|r % NCh$2{ +H<]ødfRL |W. i;2<~d2mvD63s,Cp4LTu )8#v4}N?ې*MOtf.Y7}gך mN44BX@^XEͲ+KXwȞf89A($&2wͮL ޤϹ/}Y=6{|3rڙI.QN K>4ihIkYߴZsQadh 0F&a J$ ]p&$cl(9P@DT|l0oTg.|{R Ղ6Wvd.CBw2U ,+Z nDg`H6b\e<ỄaFtt[ѥh<+NZ 1=7<3XTy ?ֹ͠aA(\RHAƗxZFD)-Y-Ⱥ#Ca Ao^j @ =cQ{Y<:tԪ"a>ۧw3r:+UD1pK>fb{/tDImq (d%’9#_Xŭ iHɩ,>l5e 7O 4_?; v^o:a` HEA" ~A{_UIFuub?6Rβr12݅w; s [89Q^٥SJ>CRe뻗g /Z.PzBᰟSd%Dbl`$U h*d*}ѓQ !P;B[*!^Lm߻+ko">@h==2_\~a8B`8Hb!RdlX,(i6:4VHNCqboTk]n4Q`]8}RԱiT^fEAIx H!!Pp2 Bk|?ˁCGZM̟3pw- ld" ②L ҁ\fTtg坱|AyWl^ -B ll=|ńzxg/- 4=c:Bz4+)dݑa+zÞ.3\zCcScV DnhM׋{ʵjFs5u1/9ivg/$ ,lkqz-B4`{N@4ǩBq_ 9Y0g!k ːs,Cf 6rIumʌ&m|0|/A|0 (aNXx#{ΏQ6'fue~ς pz⨺ǀ(Y0L (1 >%a[ 5<2x>j "Ld.:MP(azل7,ؽ CRP; K1 shVG,8^R@҃2`^s ` ,XB}(0AUAe&t:AUS93TqϠ",YĔ$؀id W?.()ʱRRĀ =6Ά}YcH?CO,y! T{pp^#㠉6?_9v3LD\gtʊ K*v%$LX`ʪH{ `5"&[HӋUcT`~EGd}bE> a ycp/N]jAvsϱS1fkpp%Qn ׂd_<>Ro|"auv~[I`FTy-!VU#4 T/O#j }uIENDB`PNG  IHDR&HIDATx^ŗ Pg\Q@PJ@TՀ(W Tu7u=7+`8xx(K>f`fxMMWQ;PVeꩿ{ =~hIt?14Dԟ `l٫fy/7==tb;E%:&& Hdb3h!S 58uًƚ`v Ck ӍjWt1'VC>4bɸEC>t8KvGYLb=T#)}z eL̽ƚofbz]ݏj(s'r}kVвi|Bl  j`ebv{_k|y;>T; p m@#bg@3D([?m{|w•M/ŭWoRDGa@ _[2g`$bgDF8. DVHY8PmFyw.o)@b?)e( wnM~bz1p*:Z[4!g7bEƸo7|@d-[DK[j<1Vi@Q~vغSJOXW) Fw,ΨsMye)ay9hʅ<% K@KePV2gh͇2;-RH/-bJ}?v 4t?M:Y>h&mJjzR.R 70@-eټOZo _$KWJjk]) _ȟ]d ԴZRI$BSzHD)U&P65g2sJ&>2ZS PZ2DdBP6iهn.Ɛ96NULk,M= 42a wS1y%(5./yl&*Tj|?Sw +ׯVPOӸL(.%)e4IeL3_A]hg}2ќyX&ՏPk(8b/y1sX[<طRvTRz Hs;U$q } KO1iz^<; 5 GzrF#b b7g &BCA<-PKnqŁ!eU8<[4?"?-x4G!-!HݹvȀ{}cPdB1aK ܂P{$i 44EN||+! E㣫@Qh _u?Vb_)3^#VK[/O (A⇶P%]<\G_AS,ECR(93:+A*oBtKAOB(@^ k@ %%О(B(ďRcoAz sKVz Uj|ޫF 䭣%r(P-Ոd҈S?x}/$SȆt{kՌɘMWGҗZ <7iWAu⅛y.xbw;)!}@SNGK,F5rmWNp y+4O+)P+ e=RJny|򪎝^S۝Okmۇs+R)J(o:i(X- 2Lt\rD)һbWVO H 3(C@$p e)xP@,k+̯wdz< X8Z~^^ 5#"@" PzEDm.{tǕw?~~o^;?|]O|K Ą NCAbJhH|rކ^߻ň&"R @>bry?O?[cO}0=H-X=B_t㥗n|7ojiVLG8!zp?;}";\mKJ <!Fh7mhL'ݷzOƮ~A\ު(]9ַnhS H$x<2J,p +|iqxwd'g+7N_ܺ2XeD[?MD߿i/!%°YKZ.iQ Heinejn'*3u4+H N VTõ#شd*JI[Ci) ,Hx2`Ec:S͵J6 %ۿNPFJ kBx!`zx<718PvQ,hw^{mᾝ_B6 $GOjj$ o =4.wFцPUq 05! TGU9Gy~ɟ=P$@9=YnOiJIBtFHD-\ק==HaRLRKL)P (QURJk,Jd%]1*R`Z+.'*XqhJU3(ÕkIśQ2A*lRaLfQL2 SsT*e I "0?p|Ooso/gL!AyKsX杙ELKzlPS9>(MyضLz K K9fNN_f[ႋFi]1/ '?D^[KN+&fKtlI?t8˾/LxГF4In,v7nlcd(aA!J%E!0%h!/QiB=6k`ByJc3#/ b,ejϻY`.Iy/q* #H{ym.$ZBTT(aA6[´ kqXEZИ XbtU`1p}:g~hg{K]fǧq*nFs*lT 1dˬ"+]'w=;Jcp5{cW_+(4h.lkStMҞ;< ɦؾ}kύ6N9=/őޘ3b9MۚLU-)X{ h_lMW\rƪd8qg\GP@)6$hj# u픀5J)" az{hlNRqģεg&&C}ٯ庯JMKg;g=M[g&@ӽ35%J *b]JH}w}ƋJEgTgz <]3h!hPkP <Sm/YZ;*S%is! E. ȀOV0 `is =?ݻ~ﱉ­2fltIENDB`PNG  IHDR&H[IDATx^[%Wk]StO方dB2@>qbtF%E#(1'胈K`QDDAD^" B$3q$Ngھs&safȢ.(jY KT+-@;_kx?mC@,"v.wMj|gՍ_|߫ nͺˬU'Ns&3:WUՊ%" hHT@RjJ$,kx-,#[+ߞ! ZxGa5 kkk;1{o yQVHO"ņu(8h9PԓȎl.M$ɦƛ-i|,K\;M+/=[K{H8؄f-WXıp|{s䖱!EYQYk@ +1eBD2v3?'pxFcyXstzD΂v3 s]K(^.UUEs%7O)b G'9kpfK=^^x OxI ֎Y`=w&?3 }ZdP@ $%<>rZ@"P2x P+OCbiwY`[>0|׶,=-(( mzūK=9?dSbT@` ((}`<+өo^'"3z<:'_11 A0b֐ cPvԘcPy^:&2(-3.iDޮ3sj4]tߝʣRe]+%6B=31&18/-z2#+=A޻;|V];5ӈ=ZV:ҳ)Vh0`jF(UIbvAY*ybP"gf_ @&1tg5hnEd3TRcG=5F~Ő:ClU%2° "Pu>$[uf&t;pD vF#̰G(Qu( (,@fP0Ә؞t iDmu$ @*ce ZB,qdPcaIHR)[ξ ZJGY􎎫qzܢ幅VGpwuq}H F!+P-( r4/̕N?]DIyz.Z˳aoFtO_@=3e3T -=f _%:}XtVY*Bk)>b@m]ģ?,A^( YAQ^v  {ȿX4BUʊ)ylZ䱿>ZTFY"'h0DxԵ#(A/6Z+Ptϴ}Ccq"6M8 A)݇.Z'֌;+#¦6a3Zz$-D_UU[_o58KDĹQd~# `ֲ93@P"2ZbUU@_x7IENDB`PNG  IHDR&HIDATx^kPT\7Q@A1`,h5aR  Fz명*(w^.Q"EEDVĊ!\D ,.aaw/>s9/s0FgW'<6z#a?O ؆%&SC؄64wlWC =Ds#yc;JQՆ??wS޷pnDi]S%[ʷ쯁lf 3$á#(+1L|bJ_Lk^ɀ >ʁ/^ tuB>X5~}&BwgyNB'dly'Ѧ]7pJs3$z{c#> ̪̿6 9-j@9HkmSS$ ;CuE[L.Hϊ /q*~q Ld4իؑnQ݂=t)v#$ԭ], Ep!Za0 sny@[,P p٩;|e\_L WEh Tȁ-d}8#G{]l/bƱ{X_ĵ[X;ГBmRd3R^6+#)Mr Jt0 tqI4%ƽd:ucJ(sGA9Fr]ӟ\>Ctt$ j€|5g߷b-M Z`ymbNf1Gjt (5͚OO#ޞFj* òd >Lhog wqT ]bM) ';I)w ofx؇ۆPѧ_6Isb`CrOATU1"pV ** i o*=L'-'|JABIĆYwTHn[p$_%bKPԂN@8VևM5J) OO`cPsgKݟ7={+,'s%ZF6)oW}Fğ&5r1uc]C%.e !ӈ1=B#5$2F d5P*ؚbs e{(`%3 s9o=^%Ly{y mJ4*RWd++d΍!G5"HCt(z)XAĚKLFfasOߖjro.ps|0]>ڻ pfK6K0#zmX= :U@ t` 71<~sWAE h; (}bDג!sfw]:3= Jy@a +DLAp>^B拌#kRŻsjpY5-mDNeD2LLbKWc?tuߊ!<WJ3v6vs.7Z1nb"fK#j:鳭-JH:Ӫ2oXl~uDbFR7ҋ-^/yC%z[si/ܬiuȕ}bLrC>ؓā$<2ڰȅxX2IENDB`PNG  IHDR&H{IDATx^ݘ{LWAPy,mQ耕VPBAS0,fles>pEqE$KTC9| NM?ۚ/s={b!=:e< @_-Z@aĸu_uaaTԐ}t'^dUt#O`}?)?x?!~O.%VTÕr\OdiU8ԷOznw=!H_:@W coM*-Fsɋɵky[~huH\1`qZ;f.nz ӡ)2Dخ! S^\ٲ_hm@]:䦓(p]1d/i3>+F[(2AFR #im bʵNs/`EfdGX-:Hdd*XV,𨘜gA;烠l]c2L+.bnz 1":&iF"ݙCEhS#V.|w 勢TA9m3E}Sy6$*C LY鋈Un';NxЉ1=B($#`Nv\mn`r[R"Qs:Sx# 㥶ݴ<Ҥ~xcH0,DdHxϵO/?3H2˹=1uͿz c1.BxD A"h$Y)7 NJS_>2""p>"7>!RkCmch)TM mCZb$@lnɲC.:5{Ck)g^%UwCHRiNP\>wb): X@Zؖ#D”Ԧv 6_@soDL!! A~P6GT,:Ƽ?Ju%d)b>$25! GkIe9: q_,!Жj!\#m  g&n@aXR{+1C-e;H>-}t($9l>XQٖY)VTO#$oDPDFd$ӂ{*7s BB՟I^ \9~/OX?<IENDB`PNG  IHDR&HDIDATx^͖ l[>8qb'n$Mhiۚvk &i@`bPL6MЂ&MiM !j0[k!PE&8 wj) !/}::/߹>BJ']B(=;QD/=](4О넺Z7n!4Amuԯ *͗֕`J@ /6a0Rq4M`v4ަK$Kp N.CoPqf w6q.]ŏtk|nTg$!(ի@/BP]S4]v^-ZB qp]=odrSxZHF>I ;㦐(,jXHˊ_Kz++avw7'Vmcey{NRWzJT {_̓j\Fs{D]K0{PW d]KV|wmZ5\`%N>8d [{&_~Cm\hz&K~T*{.r۵ڶ GSp~0'՝%LdF",P`"2Xwƭ~+kh_wěpp@U@ڜ%Յ0Br} RJtW[tXon %X>8 _O~vegς,̕G54[ps:8p~=[wwzz|1$j82AԠUQn l_Sϼc#j9R Pw!1a8nƙ,p2n6\#1fÑӐ ^Et-x1~%,@f&|q{Ia=7W*5e/߲=L范Ol(SpxNdaGBGZ^L]Jf0aq,ʱ4dg̖F=VMmt`h $Ī.x %@Wsk4]/iĕ\߃q#}\Ar*ϔnTt*n"C$ءn)$4'`~&LH塩B}VInx<HȩL1Ǣ%UnQ=zso2M6F3(` +g]k 9z910X m;7u͏j5Ha00P  5På|O:j 4֒b:˱-Ϸwݺgbk H0@4 4DJN3,¼( Dt0D{y aP @{EZG=zIF(T6 a ji(ÝS LAC 0uLLמj2rh&iI>lPE(@Y, j ׇtƦ`( Ces t2 Yz57u-ohRj.jVA( }$yB 2< U\dy޳S1 8@g[>{AA[Ly}#SYǑe@ׅLgtclА޾/-7*nn_6 gqTXX3s9سzc U8d`eEM@U%\'529e𰢔֡Ҩ6)x?: f vg 7]m_r^kÂyf(GæH$/B*ģ5FM$tCC ʣ؎mgdoo>UlW@\5ZjPaψS^HN(«[Bmd̤2 3=ҕ\V]t  `K)vr BA_Ԋ̉}p7/h@ AW}{UQ  |lvP1@ Z*dTB0GZoFq-IENDB`PNG  IHDR&#IDATx^j@C&ADEt%b$syVZ1t㿙ǁsa>nF!emYcJ)% Za2eoQak Ga&jIK6N[Xtc]1O-#c`3|s<7AWg56+~FϴXc~lRh{ze C_XèIՓRiC?JWJDž(j107j9RJ=YV̑CXl#SFa<$1LIENDB`PNG  IHDRYIDATx^r\o!8֏U"j0$c6w3i-t ~Y՟MhBЄ&4 MhBЄ&4 Mh7h4o) hbIn8:Y5K F'M㳡ÕDw3 }ݙ($tиSYdh =ZuoU-GZc1ZwԎEnu %kp֌ftKpUjE7p}Wg MWVt#֋fGp]ݠu7ft@ntqu-`Ѫ>ӆČ%`k3Ѕ9!:0+5gsѰؤu+B"vC ٛ&Nb66Նo&~!oCfGˬefgMCMfKV}TO?EGO?GhBЄ&4 MhBh{m.hopį@t7pgA!7jzѧ5ߠ>Bg\p~4 I]PW)CWaꆕi N Z2ѩ )|"% 'ueZry S1\ppļS2N^? f``YL$#5IENDB`PNG  IHDRW{ IDATxcA@w*IENDB`PNG  IHDRW{IDATxca_O (e$-jIENDB`PNG  IHDRW{IDATxc9^0V$t#IENDB`PNG  IHDR  6IDATcXB00 7_$4$G#d-}t Ƿ:IENDB`PNG  IHDR  NIDATcΟ<0`b/>?q?̿"8ιy7\Lp 3,blsIENDB`PNG  IHDR  WIDATx^0Г P$IX< A_j @4tCR vA U=}w%'9'7IENDB`PNG  IHDRJ'!IDATc,,H6d)G _rʄIENDB`PNG  IHDRJ'VIDATcg|pG{&a.VN&M\e$x2?6]0Co׹ A9/*jIENDB`PNG  IHDRJ'XIDATxc5;jIaX4@iz{6f.;d↩:9hb^)YXud 300_, @3&Y)IENDB`PNG  IHDRW{ IDATxc$qt}[IENDB`PNG  IHDRW{IDATxc6'EIENDB`PNG  IHDRW{IDATxch_5"IENDB`PNG  IHDR  1IDATxcXnE1.9pq#+ĄacFp"q#!IENDB`PNG  IHDR  LIDATxcΟ<0`bogp?9śH8`VEadbs٘&N0R-IENDB`PNG  IHDR  RIDATxeɱ @ CQOp г R].ȱ,Qt÷_dt'tE7HO8AntZ c!S̅9PmIENDB`PNG  IHDRJ'"IDATcb^$7+'Q_|ʒ6IENDB`PNG  IHDRJ'VIDATci>f``b寡?+/ sfݯL~cП0{'3;#a L߮s9@. 7#, nIENDB`PNG  IHDRJ'WIDATcʲ<}5 yUgue/olݷp↩,9pR^)YXud 300_,@&`#Q$IENDB`PNG  IHDRW{ IDATxcNC@sgSDIENDB`PNG  IHDRW{IDATcazii(@#IENDB`PNG  IHDRW{IDATxcNNK_2aA@eAb>IENDB`PNG  IHDR  7IDATc!sf7$ΑH8{#qb8H$L>rIENDB`PNG  IHDR  PIDATmǫ@@sgZ*;Məb]bCg 1O*aά۴3I:iICf ^t3IENDB`PNG  IHDR  VIDATx]ɱ 0 DQ"$hX j,%m ~thޓw3EFȷ?{qk3%"wb٢"!SbfR; 8IENDB`PNG  IHDRnv IDATxc@aAP]S H$0a> IENDB`PNG  IHDRJ'IDATxc`E@9? IENDB`PNG  IHDRJ'IDATxc`E@9? IENDB`PNG  IHDRJ'IDATxc`E@9? IENDB`PNG  IHDRW{ IDATxc`E@ yIENDB`PNG  IHDRW{ IDATxc`E@ yIENDB`PNG  IHDRW{ IDATxc`E@ yIENDB`PNG  IHDR  IDATxc`Ew8CIENDB`PNG  IHDR  IDATxc`Ew8CIENDB`PNG  IHDR  IDATxc`Ew8CIENDB`PNG  IHDRoxIDATxc0Nކh,S.IENDB`PNG  IHDRoxIDATxc0Nކh,S.IENDB`PNG  IHDRoxIDATxc0Nކh,S.IENDB`PNG  IHDRrH IDATc0NކFm7IENDB`PNG  IHDRrH IDATc0NކFm7IENDB`PNG  IHDRrH IDATc0NކFm7IENDB`PNG  IHDR iIDATxc0NކFe)e_pIENDB`PNG  IHDR iIDATxc0NކFe)e_pIENDB`PNG  IHDR iIDATxc0NކFe)e_pIENDB`PNG  IHDRoxIDATxch,M+u~ (IENDB`PNG  IHDRoxIDATxch,M+u~ (IENDB`PNG  IHDRoxIDATxch,M+u~ (IENDB`PNG  IHDRrH IDATcB?wIENDB`PNG  IHDRrH IDATcB?wIENDB`PNG  IHDRrH IDATcB?wIENDB`PNG  IHDR iIDATxcFQ^'^xIENDB`PNG  IHDR iIDATxcFQ^'^xIENDB`PNG  IHDR iIDATxcFQ^'^xIENDB`PNG  IHDR |lIDATxM1 1ES%XXo x=;Xz[akK B4B"y00 Acq LK'uřo!J:w(ڸaˁ#[IEswOLslhx&ʩB:esXPg Of)͙{A @6h$@5]U 7i?Ͽlލgl ;(,Pb1iV$4lWsNskWG6 j]٦: Hs5fd/L:a vt8aףS0gqY ͓qE3z~z?tf%~z2@C@豱As%4\hB)=EvIENDB`PNG  IHDRYGIDATx^ `]N+JD(80j;`Z)7 G}M;Vm1S2b̼̊H4h"BQ.ʽ/jO7ǦB)xd`' 1+Syú2  DVpL$LVL8'>mǘ#vY)H™PV wK]PHAQj&0Dm{,7FIENDB`PNG  IHDRIDATxcO6HVRpaX i/l4Ag9F)N@M ;4^}; Plʈ[+>eV}_ w/y+VLnY~}V)_[k/K>}*3|Z2ޅ6/=}O7!/.3rhwyFkrIENDB`PNG  IHDRRIDATx^Oh\Uƿ{{Lf&Hm`KIj)4EI 5`qP\ZhК;UwVQBXVۊ`B,1yyc}sB3 L\Cv͐Tr O=42%ݒ>,9PuLB6R#.z"\P=84 D=`UG,DP ]if(=5v\~o%x?u1*Xg˲9h|}򝹷g^9p @X3q֟O?{\12tBt!ٻ%A`J97 ps ^!%Yc޻Šr*OaؠJIVFDA+eS\F~a@ YXq87wfX#P3[ku5Quנ0g+>BtU-T3A1Xnۄ5ެ-4NjlEm_$@1"]ymVlxcJBY /H'/P2;y`ZPWf5_*N*/-o]g>UBȞD?)uS|ٯ_'%xO)g94b e0gw7jDua F = վae|SscmlV5S|#݈!S$+ghR[odphټ] ?ĪLa4Y9Lv/Z$P'u`l~n%KHR؋vW6 $IENDB`PNG  IHDRIDATxڝYHTQ93wgQ,ܒ0KzBzEz "衈"ʈz(ڡ ̭&Q&gsrNWR~sr""ő(h($4H1f Ѝ8YUΠoAbP t !Sc,Ʀװܹ8ΑQ n ~1VK٭<&1i-D=-k.:Ŧ֓e2/O>Z6₃(j$xTE& {Jg LˆbaW-rw5_joB\۳KLɠJdV,uU'U1toEGRZ,&r::A,Ua\83973k:#VvujzqO۪ $9,a|/c2ܬ\zBTPnj$0hH R] E|_7v)SfŽt@&6PfzIENDB`PNG  IHDR: IDATcUQ|IENDB`PNG  IHDRw=IDATx^[hUse3cԤR AT(E(hM`i>)J)o^IŗP IL&9.d$oa3g'"(Yl‹8C/f.v\6ڿC+] ?/xi(Bjރ?<4<:4I'rA?)yݨC,-bfeR۝zu %j]Ƴ,;w&,`ЊU҅r:{zSUWŸ;8xjrxDԀO t=\(^Q50^T\s!?#=9rBBJ$*#X={CGL׀vh284:l ^657q5|<)s_-! !)4#M"|ϬO!k)VZ&Ą.?P OJ%C# 9`f椊".N#Bg~n(ǡ0c8sh!J)3#81Fx \~rREBʻ^\FݽG:7u]}bMZkmdx`QvWxFօ[Y-|?\ rn(Y鶪4?`f7Ze'7eyGe UdX=Y$<_]ߘUMG&TfCe悥i3䩾flc&!].KKZ΁*6X`{ŰS';x@ ?8DrK-qRA-ͱ`3{֨z;[6VG1^덂(<1}jI=wK70gdHW0>ԙoM8F;&?"G悶CT^l睨!+IENDB`PNG  IHDR [4IDATxc q@pBOXwIENDB`PNG  IHDR((mIDATx^ر 0 DQNH!bA  % ?˕-1nIYvZ.L:7@e`d=G J=hY7`a4@ $p2@ $Yh^bG e @!A5IENDB`PNG  IHDRasRGBIDAT8;HA`DH%B| Xk!V\6B*A`c!irNhQE 7kV8QЁٝ5k4_ApX.b&IPWbMӜ)LmC .+n{PV낫+ bZbMj4uG6SaS' 38*'nQ+`r5mp$uݛt:݁ 9 {˲la!T*GvAߚZo" \N&&5I٬%~U:ݱHY18s<%[mCZt4}?\="JR#.^O0+C Sbq|GR)TJPFv=hk;lQ4IENDB`PNG  IHDRrP6IDATx^nQav00mH i&$`h[ ̴-;`%knŘ̌fYac47q”ܜ@ 7!flVVno3k۱h4V%r߈|>auV({r0Z'8 m #Cv"$qiGp8rhIB,k3f&F2 1–+6_%q76pU݇tZQe34xn+>E\(`mh['erA=;kئ,Zk{΢̧Q>yx5c{2kX )KkZ2s՜.)jM)?7ǿwaZI'sS k6k:9m.⠫8;?*n[lkQyRrzyC٤q0Vʚ}K\ۉ#VƎ0!jJU@q"[%xD$m'N*E?fIENDB`PNG  IHDRYIDATxcO6QI,"AH}M9"\ߥ&p/_wM4C47h)Z+ ~idjįo`! Sˀ4 {ٲB79k9\# {:L#+"VgS5rWDt8~ R4ch2}؋YW#^zo>VvFH_`,Dxt,De $x3T#8j^9]$U|ܤ[BoTě3f!LVhP!TJj_4CIENDB`PNG  IHDR3IDATx^J0Aݜ]u: nuڤmdVDx|"dxxX oB OgPcM9ϣ׿aCtJs:u[08D`'BC؆"&BӉQ@s1}>#eZ!%/FԬ&#nsV؀U(M!>k[)a8@Mx=xŪ2^5}`Ķ®J8)4ČSb}o}G8%+O^oJ%13 ?rYeeE˅藘/1 qSBIENDB`PNG  IHDRIDATxڝ[lLAƿsvku)/Z%qo$Uڒ “DRX"$%?rxҁ@Crp(RHhp8W6֌w)AdjI]WW mwLG(ua>7p]H[qT'$` 4'Y.R4G7IENDB`PNG  IHDRIDATx^;LSa7АRJ[8^7hŊ &Ff\4:h4CEb⠩ACoI'MOZr kKUJWM)[Jס06A.Pj 4`-`}0:*Q xuY10H`ˣ Gw 3DhL[ m^B…>rx~Iy6eӱ4rS6*j)^r9ʂF*li_db#ƌ5}Wؖ_+F̆;M3<,"bƛt%?MXeC䴉Yݟ% 2a"i_ŸX|TsD9 [ s3-Zr=lC{9<_D"+bJg2l>q0 ĮCg5Bw{ȡ*K@l$ĕ]rJ[ Ж7usKڟO 1í†rf! W}}}0sdCT3Ye`\!ayБ_C5ԱNe턗g R?)95#uCpt1./uCxN++ډ%gkv*^E/{D ` ((knUIENDB`PNG  IHDR&!Aw@IDATx^푱JP@u5 q`CTBp|;(tssi$/ tp,zx. C&ڦ(*\?fTT!_BbVŲ,͒'fK7Ys,Qqm*njۊk& c,9 `@ZRvC@L.ľ)'Ȱ,x}w\mLc9SݩB=;b'+`>ujm-V@,U8Є` mVsSН0J\!Q 1+YcaziJ*ЇlTv7ϩ++s5BI#! W@[m.*-84 <%^senJ0F)7x7/& nɑ\PuLaIENDB`PNG  IHDRMpIDATx^JQwt?c4Q!E`. @ # -L2eRۖFmZm $BNwF@hs6WT-`EH# hKG`)XBΒy vTuۑ<&*>yנ.=5 **s Ł2/ulPC#LCN.U&vvg8ut0TF5lA]vj%`.H!1&ޯG!Te)kp*`:0iu4֎1K'Zm*UPw]}GIT#9PZ`K(Xa}h䯓`sosRVXf춟(zr\=IENDB`PNG  IHDRMpIDATx! @Q ;f3øMf"mm1(,DA7}o&WFpKf`iciX4KkKCK`igini^-Ҙ R2;+D'g3IENDB`PNG  IHDRMpIDATx^! A<4ڢּٖɰټ`=‚?ʫpRg6ie0O+Jc^fi5z`V^L+&ies^GeV:eV ]';IENDB`PNG  IHDRIDATxcE   x$ TIENDB`PNG  IHDRMpIDATx^ϯNAB izr"r&8ФA0HE nj/()V੅׸Lyx0 =۹' Y=,?]_Dt -_,b Iy:~7 ?lZ>GDfZVB7c!P1)R3xF(C[Y#e?Y[^M %c\Sx Q:IENDB`PNG  IHDRMpIDATx^ϡNAE3-Lʒ‚6n7 L'A"q(,'!Ax S *?!~`rDi3"8Im*pmm9N۪'j:k"^Shq @ѝDκI+#F<P -_F{F P!Rit:Bush )':Xc6vLR 5:NIENDB`PNG  IHDRFIDATxcO@Elo  F@Eܾz3C!:3Í@aZUo=>>jfgUnZc_4if+ "̠A32 R$`4sZz'b dL\.䶍%?3b R10m?,^IENDB`PNG  IHDRVΎWIDATx^_LRqŋ.f R7STКfkSΗ͗慥R9}l*3jleUK/E67P|(yi]=} lv]+zx AK0R |FBQռw/Ԥ434<ܐA6)pNR LVnFj){q7;b-gHgAp 7# IENDB`PNG  IHDRFZIDATxcOҘӌP- "i>`%>@6E I_2_\&AASVG"Y-Ǯ= i>C4**IENDB`PNG  IHDRVΎWlIDATx^]HSaw6[ WPUPxUw}]^DoEDiz2U4Za6f#FDjeԜdՍ%j]ux`]ygy`gJ.[ (X=Q/fĪ@`kg#Ey C)az^1v @ã[2 ~(~w2pCYt!In0v#[Zzn99ι)3D3EYtЕV'cqUXhi#/;ɪ }mh",:CkӪ|T{ft.chAYtݔT!BAa!x&^ټ74û']B/`[ *l I @`<3wëCk0[sOߨt;I3Ĩ8/Hp,_񗙴;d6F˻>g+1ñzfK;d_yk޼3\M>#E+'hlIff6g<1k.lϣ#~'g>=8L+̂p"$ajk!"z7bC H3Q`5_p) %4䣧EfQkw8:bdp P1,qޮN?h (L rX\sb;\.-Mzߒ쫥ME'l/y2&7Ayq[||-GZMLXr`d&ծg8mp6בpP1Zk0(9s[ÙG|C81E[.=-RL4YPF 滐d~\'FSSFpitʅ إ36 JYPm{!!Oo!v>K@eeDHeӘm09;iFNN&JI_enpaɒFEv s2f)xX=}`fSߪ:YL4E K^邀X, y}s%e$a'uoI~H@ WMϜFyT0b@VBO{ 9ͼAby@=fލ\gNU3Ek8Wa;8ڂ &ͭ+>TϝGCò+ !Y^1 P A7JA4~"˦x݀<9Ҁ+XyP?ﻖ Ϯ^SDy(?& PۍR =-.҇iIENDB`PNG  IHDR@_XPLTEݛޚݟ᜴ޚޛݟݞ࠺៸᜵ޝߞߝߙݜߚݛޠᛵޞࡺ᝶ࡺ➶ޝߡ᜶ޟࢻ⢼⥿夾䦿䥾䦿墻㥿䤽㣼㤽䢼㡻⣽㤾K mIDATx^Ir1SR9N,a}^ 7NW.A?p5%G Y8c\Lbk~%WGt^㢖\KrGLNDk|ND Fޢa 1'e2m1̀;Í6lrm_ JΤ ꌦ%/1Z{jTokQF)/-R$I;3!= *#^r 0 kG/6BX.Pr ~8@s56vx|oƉI}0w4@0-/6@%'u 7PO \`ut w(pjlEFv+ ۑ- <{>{t|DHOk/^Ri9mSѿ8ǚ(xCX1o -x r3 Ԩ>/mg!;??jTpyimd<4)6O(Ck`+X(9BK Čy_ # 8α=dg|+8 '3A^Bx_f_LK׎QzFFW3<^_T)<@ ޷<?9#x(<s#}^` T˜BsrgT|]؉َը]Fݨ4jγ&.LqD !?lB %l2u! uv F jwLx.0n3|g&?$2'hKRn@E@6h@!Nߊ@Ah 9 P rD#cM˖@sPhLЙ8}My<ÿ y s_bJtU:1n@QU?$WPc$阨*20yhA`0_1yiiu|f1?p\VBS:< \Nn|jP暤E"4ԫ2DtjOF&KI:i[d3;DY:N\锢7s7sI @ AlGp sJUt@JӍOa ytB YE D' X)&1n7*^1Ng?$`QIENDB`PNG  IHDR@4= IDATx^1n0 CM?K=+*!̈ګQw}x{9-Xṕ/ 6M~Ebpi8F~ nj(r /vE1~ xb9jtAH?ުO%r0 ! *DDkxwmWV G&I:}}, J|bT ~5*?B(XXi}Rhn%-+i)9XŹVS٨%h] Gw*N`z}'fv*!i$@M'~A/-j!9'tϟ'%PV"lI]Tbrm`cÒ _W6.O _U'[M~{!J]s*&@YeF $ZȉYX\)$qƐ*rR'Va|2RN9d [Y4)<s!'P/9IENDB`PNG  IHDR@O)PLTEB IDAT8c`VIENDB`PNG  IHDRI6kNIDATx^]o\D#k-˲Isq} ]]]]Ō}m~ۮv]mo\3fs )PH xt$UP䖰=x9Y!`)-% ]ts:T Y,vy]>D&@%2K ҆ `akHlV .'9NlxuMlD26yu612V(6߶ι6Eukk•:2%KlpOC7JPâ'^2֔1tFBy)zhg TI6 }yaAtPS6̠c1,ND |ٜlYy3a Ud!v.T^F6>ZF K&6_3+[ec֖yS{alLMgXepbS5ϵܶS5!p\*:;由 >B gpת&'dfP+T&9c|inN DM1+ )JYOb3jJ'A|<l!Q}D~EUuw_^~zY. R̡ Ȣ]gV .ufLbJDt/x~y~~`u dP @T s<](5s;bG a|mNU489QK H!s!-[hHW+i=>Gs2s^@HXV#NfGeeh`{n8JucMk"e{w}km?D NdP f)K'<hD˜f"lg>ڻqO3<TH}r۫k?zo}Nv=rGx82\+-c#muaO:y,{XX=Ru SI{ B^-~Ahd!{Šap#F\$x'gd'·Ϩ[ދÇ|~,UajuĦ"Mu/<*d/ZC8 EA̞JuB6ɰ)vpYvv,S[T'ޘ,bwrPqsRE:?@P4Ӹ9Qd5 H*Y 3ۥc)ʈf-ɮ;p(uCcU8F]ع7'~>+Ӂ0FCYKuEڜ1+:*JwݑX4'/M)* K)DKe<oӁpwݢ/'y4qޯdZwݭ=c61OAd J#YPKJMD0`([i9[wzR떟̯MuhtSH ,1dw6e𸽽\n/@L bb: !UBªEt{Xa;P|H'-R a#V)dHښryuT IaM=d]$Db$ml%u=i +ϥ훙fnkC#e thVΦ*sQD:ƽ,y,9A^ #V:X,GI뵖F%.K9Vz `*2]T`XYRi3V<S8nekj *A,zYCW HH[p m\ba0sZ`VDlgtd0BLtI=&gg!u1iܔOh~RqssFnn (`#q/f\jKsrm{&4$(Sܣo۶8[Dn /m^sv0 0K&pi t'5ON(c ceTfC`iool3[lڞqմOƱZգcn,66666bcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc4p IIENDB`PNG  IHDRztRNSIDATxc0f90IENDB`PNG  IHDRaIDATxcO6QlpABZ;L?Fw U y~[b=B1&/ d+0`'h0*%F q IENDB`PNG  IHDRAIDATx^KTa;cc5.rWp!R֬pӏ?mmڵlE$Z2ΠHnR3itf9xK|7 B7vaފѴ~5dDY` wd(ⷊNl܈)0 S9^H/Nii/a8|Գ8 a=`LhjcQAP@qM(PsMaR%! i4Zq}qԄnse}סּjg\9*14}M`^,Dƚ 1tf^xsN?T]ya ea1K$ hm`"ꅭWK9)vzb~^=pkr ';ƛlƬ<) @D5V4?8YH$}b&, Yd=gh7b-IENDB`PNG  IHDRIDATx^Kka} SA) u'vHMQE?%ܸDnBi*4P!hP0[r\ t:L}e?{R/j;Ϝ7K_DG?bu*0V.Yrm&7"y <xAP(@EAT\q+ V+۩ bQVm[*P!B弉y$R%Vru\S=loUu,!.howLyՠA29S9dΙBﳛݔj(䙪$ ֱN6~sJ"hRKZyLVϺJLs3[.3]*,ī&ZU)JI3>ފU{fM|Z\\d17 NK6-xՍÄd5utsh 9CVx͏?IENDB`PNG  IHDRF3@QIDATxbgW_200b& /H1 H:yϟ￀N_@ @ `R(6ovcIENDB`PNG  IHDRF3@#IDATxbqjbɀ VBd* @kT|IENDB`PNG  IHDRF3@IIDATxbtjb,l, r˸2XH(q109}3? O0M-(IENDB`PNG  IHDRdIDATxbtjbɀ $"-IENDB`PNG  IHDRdIDATxbsW-{ P`_@IENDB`PNG  IHDRdIDATxbtjbɀJ{*0FTIENDB`PNG  IHDR2'7sIDATxbpj bI b Wi?$(=& 3@Z`0AF4ĀT&Hm 0D; Y4IENDB`PNG  IHDR2'7'IDATxb`tj.Q/`><.`IENDB`PNG  IHDR2'7zIDATxb ğaҰG+GJ鷒(G&̵e:@>HiN XH3" VAtNiaؗDkgj&@P(!wIENDB`PNG  IHDRIDATx^Q{g^u D143 3Ca_D|I_PQ#37Ht:si0k:<[O٥]?_Σʏ?{d'$o+EgZ$S}gm/Ç b{^.o+TcL0yb-8!QS*4ame 9]1"ؾQnMX\ 6AXv\(*:}A(R'IENDB`PNG  IHDRIDATx^?JQEs_IP %X%dbac܂`ZB vKy›ho.WT7lVՓv@fht̂%&|fU%bLa&bDӍ(Nw!22Ȭ_U@QL_ k-Š7O˖T;/lf\C$+Q )Hy枷G5IENDB`PNG  IHDR #RIDATxcN)r0}`./UU y~TIqã `_ wWc!aIENDB`PNG  IHDR*wfIDATxc?hchbfxffxʐadon$mV1טxÐ"7I|* fw\dC`38ĺ0tIENDB`PNG  IHDR*wiIDATxc?x*,wq:Ë <-em3D 00m|~H!rǷ+s"Ö@ D օIENDB`PNG  IHDR*whIDATxc?θt-wM1 QW[';ʷ1 y\XAHGAVWE6-8@ Z=IENDB`PNG  IHDR;֕JYIDATxc π?ޓt@ r1^@@f$@f,8x~Dܚuf21fJsf/DO@/C+*IENDB`PNG  IHDR;֕JZIDAT(cZ0H'0j4#4cDij& ?dU>.dM>`Xɚ|hو_溕3^h]_[ EaB!T\9X6@ƹ#>=cx~MrFݝ[ x^|[Xx^ p !ĹԷ!܍J*j \V+Mȕ_~^R0 n&ENβV. 0Dx}.l{fC Vg~e+0ZwEG`c[ @R=%fZcMK,4Rla7!~ NJZK>OFbzV^֬Ė5 @|_xrމM+/C50 EHH  R`aIfIENDB`PNG  IHDR\.&IDATx^jAE몞8|?! ݸ5(!5H> !Q'n"".D eC8 /USpϦEU)lljx[:zFw@ڕݓhK fpnծĕD| JFӻNq,o8YJK|+oܑhJj ''W?DҒpGEA)90,j37-'PĂЃ$U/%[2!/H9SW"B@ta IDATxàSdՈx{gT9:ʜ3ǟa9JV  a(ʪ,,P@)d\)DifyIe{m|~}MC_oRzԓɹ}7^o,IVZ]ʼn >(_r_Z 4x|>`A/x<n{ @ @/X#DX@c"+^ >!H 6 ,KJuj$I"LƨnO{0A0d? "\H0dd'l;">ִ`&$IP6!xO EQ YF~BEeae"~[F![?f߳, m$I«`8@f>  "Fw ҅<7kʲl!p(pv.E |@P,DB@ E"/|@ |@ |/|\^,n8oib> zc |h 5<+坍`߿_.,p釫EKaX09)QOa4̫k>A`y{4L»W>M^N<[ w] >FKO~` K][eYH+z9 AəO3)r;cuBҥ`^2}i^}\.wu0 x~u>~/_2;6`(MKEf0"I>"99yQW$I8]J0AC(* 9_g#DŽ % 8ch0 ?\e4JC?x>'g4˨<?Ǣ9ج;>m+_\h9E {L}X>ȁdLk`-kCGfޣtyz~ﱏ{#E w4cuϬ|OA˅DV%?pG>3엟*dlz@q9>Ytg^>#]ا?[p|%MB>kb)J {)gx?9Էh|4i?4!v%< ^0 )An`g՗0l&t dwzd#@oKGV9idg<~pN\rZ1lSƁչ /bPY mWBۅe!AR0ͧCz@nBڎ .xa)oQ6C9z=Řay-[ trD10nZdWR1y_\־WPjZD8Z/""5OH#w+GB8ʞ6^;'-_*^ z#4j~i\O>#ݾ7;+A)x\(GʧiŒG:j21SK|(OosLh *NTXuT%r A-u 4,.Fg>)o3?Z6*q"1(Jgȷ(L >vi"aݼ.c[M2?MfS9!W\fRMRilThpf/gp2Š's9Rb@t]qo(NzQ㻭=߅V(P!IAn7qv*}+^N3nEisbƈ8φhHctf=[>kUhQD#f&|"C4t6‘5G4/UAk#P <V .۫Ӗj wF_}NٌO+/U!hw ?;˸ȧΤqLNZnsC,}Q| BQ7|yϟ+e͠mSI#pk!^_4~ҞS\n < %K8LX4'_`bIogGo@+訝ڙo<5u@+]>uVsO9 t~m΅gH Gg.sG0@i, dN<20~KfA*VE~N6~wp̛pŏ4/׵kY#"޿EL{cB<hؽ~D͈Z+gWg/_=Lօq9 &/PU#Q(؜YO3~kkvsnv^~,cw\3A>M; r|gV~^ s#Q7np8g˧ rs4oD, 4xIKNqo7'gԷ 7-ZPe9+uNSx/k0 r'/ocW;C.X  .$h𐈅f+G6Fo`^͆Ykt.3[Mk|9 4x< ^;OL}  ו1')a/7Mzfv=`^n\܉zip0 ,-F^M>rvReGMM "Idrפ`qWCЫ~ PYl6 ! g@_W/M  UA^{"~ GJb|vLo2]~mJxx@"@ "@ "@ VE1I8IENDB`PNG  IHDRaIDATxka?]ՀZ5P`G77NJQ'quE %$]\Pm5$MK#pϽ|{-*Z =_DcM7VQQP@/ }ӈ A|v ɥRXYADq o`aFn"Ff@jk" E^ρӅhS5,L؍3 [-È "cQu,?mvmպIENDB`PNG  IHDR szzIDATxOw-/eQ 7ܖ qs3MSy[  i1AK)׻kw|7i{" q1^^rk*<_(p8i eiaGʹhm72~[XXx Lk4,<*@ LWDǛ [@a:E"6P;V3Dȣ ЎcX,)$I꠹k.yu g@^BcwLC-8,i}'f{ {k+@`&0j[ҊtexhO+-t}-wn/f2 (HcdSb1wan[ *7ź [U͖[Hf{Hh4X9DCf# ΢suei 4CE (2B'J7iCxD"q  o^v">WÃMϚwGȧVw>)}\bH>OëTY{-EҷPUUd0QoN+] *^_n8ko;{1Ii0])Tf<;X=pbʃJ(h f{FY0Zo5^ʃq\KޞB~WﱫB Vmt/-<_DlF0t IOa85/P{-,\S0WBU,~4 } =s Ȳ+Ps5H.t\U)<鼖ğQa8L +'nh#nj̵pW ~cDao 6LVW)ٺCDEYaOS#}ni #rIz!9G677Q %<JHH(  }w'tHC9#w%D8~ndyy駟޾u&G}/tm\>-6o޼y>YrرW^DGVO H___ .9j6M'}')rʭtxO>p8܍`mfȥhkkkk4==3H=%|rRBn^+fK~ɓ 귥Vnn䔴Y_x]U:<_ArAN/4c @ 7nؼvw}_!]bpO.\];?ŗs⦟bÑߖGҿW^^E''+(h"ܐ#r -puߑ_.--W7(q臖7~W^vR]ůwZJ~a.Rf{ِ#ϵSD, !FĊ)~䂜rDGN;__hnnn [OaU5T~tu{ Ҋ3/ K2/ C9PvH6Sh\1!6ĈX3bG9!7@_jkE1R7//ѝEU D"9ٹU5NCQ;ޣ̈́>jg73-c%@9(X1 D!VČؑrAN 9r~纳@m W?6&:hr}9ʆst^PX{t256~O calapr䊜;`@~?|h2#(Dj>U<O36*T>-4.p1G+rFTQ0”D4ߩ~2*GiuM猢˜C\3r dpJAQO!|n>U=U<9B={fS c A31K!К\3rԆF\-`bCƓፗfSM}s)J cf@!G6 ~QLex2_HVT ! oEȕ6p݌ SOύoXHn\JڭIu]^Mͯ6vO3c>#8Ďx+Bȕ`mh`ט^"?tGgSҙJWk ׊|Ʈ`Fu{@e 's;ƓZ93lݱ{<+_RccqC#ynmK]WNsٜWNzgkc*KtBj׷=LiZq@p1#v@!G䊜@=~i" oPr]G@e ^/!w9\ 9m)or R1,@NԆC7pO^1.ϵS3FDJ˥ɴJ4jW12Z)T-Vd#"6<aµz|Vէi,]}~`l9/^cw\ɨ4u[z bBlyp1ֺ & ]DeOS>B삳S7.BN0ͯj+~/ \{2@@&#@ U'x_zU~ 4 `;/g\"?f V ɠUw^':A|We pq 2B^`FL-RTxOX~ Bfd/mvOP>@@ ʷM甚"Sl b,A/Nu+ 4xJlӔF3Cs[vr[I?A 9fW&F *b_\\@M3tQVX<0'V5Z-cz;Űd y8ZaaA~ zmP75#*S&w)TBٵ.yj~}٣kRa,1tj=y6 `B<^аK@uNJ[ܺ_^HBLE`jA՗Uڌ,'-\4d>NKH3q}Efeh!Ik.\i1CM3.v l`vq7b+Ja9^e\HR~lMof 0yDBӨ`Zac"0Wa`0ATqY͑o^ם7gz&sWJLi~6uO7/Z:$~0_T333iA-x1[@Ԛ)u٧+nM)~kϦw,MB!(?F#JU fA6&g:?55%?f?I@h^h=0rrR~ `W\ 7bbB~ !p&pҀ(}drT3`0(?臿:MGP;@8!7HGOb+9\A8(VB?ѓJ8C>h[I/l g%0˜tDGJF/|d=t.4A7NM :5TA@ #XE[4V\O7' / ߗA @NIzt1qt1()1P<-RңOLM#N|મ#9<+6A  gK[*G7o>;ۇr? rzԂ* ^6V)MWJ|@8- !c_Ox46⠘hGK\ȷUx0Hn?xꩧׅ ہPb`råCdvCQ''_)Is] |,[v!!¡**5\jNCC^x{B/ /Z&;vB_@2}מ1~mkŅ\3rw ' B,STc"䊜;<O( B/c4ׅ\o#9##d  %$$P@@B.!lXIENDB`PNG  IHDR@@iq IDATx^[WW0AOqlm6k,ըQD@DxeG!(*GKjlͦ&qG{ϼ&3~x9{y~swK{ox4>xNބha}lZt7 n $ij>ÂpgpoA,8HgpЩ~gp?Hgp`AH(XLH@uhJ6E6OD#WPOLS:Dy#,đ2 22-/!a [\Jő~‹ӵɼb\>U),w)W #D},#t#pG qx|^NT+Ȅ}/@wMG^W _"ܳep o&@V5TNBSh`h0Z5Of-RԤ)6>znEX\M: Xv%o5:kG_7> )z(qJ AGLVw.Z?ô<}|>jGYWڧ!W=Yd bD/,Y+]q{vuh(X\`K,ťiQ;pDczgdbjvai6"ן=6BS"RNSc5w"O xjs]tY縧@a($HX@&ѐ=-gĶiCm^hY@(]fjPѮ!=? z )cI+Cu"_՝8'tbgSPcHBY]N47v&Y Їץ*/D]#]JڞR>ЇGq$?r*Ꜻ0Qq&n^ZyLe'q9|FqŶ{#'4jqAJX|!;#:F-4 9Z#05Qv^%EUeLBcjO\y0{GwHةDN~y6:SDv%6@uqB=JQfI2Uy '=L4{OVs5"˻> "*6ԄxPU)a%ň sx'͇4X6L EnULrRØljpx:[C"Bu2Gʬߛq^m/_\D~rfi}Li&ERErSs3 ޼ s/v_^Ez8_EM1B^\,0PY|'HĽ\W|SkiDBm}+U#8zVģݹņv4_l}2ΰ+1> Cתu|''؁LQ ҈י J}M#cpAbчT6,Χ|FK%6Au&Fl/KpTN"gn,,%jh<ސo|~i|(߮0֏]y¯ṔQ/ di/EUM7{Zaah\"Q󬊾э ѱ;Pj*\ΑC#$ D> H ehH"6>:s¿Euv2[5ɐ|uack<1Y[TGQ 2ES |@Fu|cйjOՉ*;+P+ҹ69Od_c\;Hybu ē~%%N->9n)zklm +wƨs-!q|15y֜V2 M+F: I?@^ @ B/lJ*eym«9n޶qT$55 (]V(:4%m v9zZz^#!;S"9Bu$H86bY5EЂfb:Z8g@{`3M3B!(d""FmP A#ZC 1|Zz&>k>" DD@$i5!_`@gOCR  AOk{|`/~_WfKS?v!۔&8o2^~7mQpWɄif>_[!GIENDB`PNG  IHDR&&4!%UIDATxֱ 0 A-i9+(AFH #Bsf!_ k?#e̘1cƌ3v &]*ڪ  ޮSIENDB`PNG  IHDR00 1 XIDATxر 0 A p.;BXx|EI{ܞk^ u VrG'#cH|ιIENDB`PNG  IHDR c5IDATxՕjAϩK3\`.qe\ o'{ b,1I撮sq@IYH8.TUKc9ENွAMI2I'>"&/lI^=>uq+'$_`RH.&OB 3"XXl83oq)'{r-8+N񓊀3g?,PJ~ARS/(Z"fI ' ÌEO< {j-`DF8v T\ y+L֛4Z>[WJb9<˰ !~|}<1}9YP"Y kqWio|<-P?`>{  ߿?w3gz_|S`%bXǧ?}EFyK6+}mڤ@5se㏕_[K J}e?~l^kFyZ?׷P}Nݯ_륿6A&ׂ>MmAd 7t ~~6kVUP 4|m!AwOoIENDB`PNG  IHDR `vIDATW=@@P؝+HO7P DWxT֫ʝ 3'zu9@8YŁeqп "4+hxR* ^@U=94IENDB`PNG  IHDR cIDATxcOc@|=wav5Sjj7~$s79__#͂?;x<3P#&ւ-g l(&:A>cxw ;&l}G O&>zu}jf=Rd̴s(LyypK.}r.:f9NN\ph7nZ.Ц-W7Owj={|o+a V:x3VZsv穵ӷn[: ˧xlWoxpSn5'._O؂E憖/Yݶxy~ǗhZ:~Stݫ7m^?o}g 6.XcV)-{7>xݍ[ρi(3Np 'J~aFNpmڍmcbjܥo`Ö&Nu7laGYy䙻+Vr)i}ݘ%ȉ{7DٮI_ۏ!Opx߾| _?}X?F^Y4j8ŞIENDB`PNG  IHDR ?OIDATx^!@E9"h.q4` 8 yi`+ ٬Se_E!iF]ם*jQijCplc՘皣HOu0wq f_C]$RQ|eğ ce!SeyI=0Mč8c a {S`l?Hn$М?fuQVqXIENDB`PNG  IHDR ?OIDATx^= P=x,<JmE ! I AߊVY=A CmQm+J)ox/{湌a(OϓmÜ3_/PUDZ\Bs:([-i['qDwi߁-p]m Q$ _ xGH(Hcg?KqIENDB`PNG  IHDR޲SIDATx^?KBQ^ݴW4P@4*(!.; !ւ ICCRF(BN8=[&<Py C\PW>c(0#1UdyQܗ <6]e\7<Ԇs8I"2{Pgyg\F%b,y<㗦-–M1$28IENDB`PNG  IHDR7}IDATxڥ1 EC/ 88dH^XB@JRA !AdYY:ը<t$o#y@| [̶mhQgpQg`m44ۼF v_"7,qIENDB`PNG  IHDR~6IDATx^}ͱJP{M zjm FEh)jjp/UN_}g=-!jfp.^q*P7ɗR೷quL]|5dcOpxףʂM3>VLj\(h%nup/'ⶫdOJ-IENDB`PNG  IHDRrP6IDATx^SA0,F9,;>^PҐ5=L-m[2VQ4bQym"3V,Hft1˲$yۍ0DAgLa]pIC֙5M >88"(hC}CTUE4}]a)ΰ̞$v( 5c:h1}f&-6349CD1x6_N q)&>R\^;!{>0ǥ%{IENDB`PNG  IHDRYGAIDATxcO$UYdؔ14BʀlB (Ax!Ք*+ʨ,՚!IENDB`PNG  IHDRrP6IDATx^_aƇJBѧhU7>W ( _!H*%7Dꅺ*zz5KOy\眗f^ ?BK8&fFFd2yl611Ufmd7`h462*A$y`OxJ`uS+| V L0p8T}s $dvLn4= #3,DdVW>\D"B,sTR"^b4MDC)%:&eX,ZBål |N-:3T*-tf.NNTYq͜pbт:4Es6c%[Ay O/斆!so:rE\ƏcjBt:M!2W̵"/cNښfa[ڌ0qsGI3IENDB`PNG  IHDR m IDATx tǿ;{CVF6DY.) ZAŖp,`-֣*`PJjEleR’ =-3}L&&`}3˝ss77 !12:|tDk͵W$zűn0(c@lXc5%XRY6;:v`=1y\S焦#*QRh -7OuZXIwU=n,y VJy;0DvYVǺփ߼aEQVdV;jU!=\c`vQ?Es+~S_O۹[ Xȃ~.g"냓5 eilX;XM?\/끀[Z6̭vt0tc]{9o]7'j\GHu9]v^ #, ~%1i}s7 VA!O{ՂKƲ/ѹ*Jmr_>V-Ϩ=>. V0ĩ+hOEv-j*KQBFitZ^F@mGY7nC-E T-7sPE+PPQi='8;d'|`ۋ:j0AGDAԮzԻ1 ʼBɀtZZ W! x.1&@Vp-$Oo<(c$!N\H+Un!![(e0lי' ۉ2O$|?"QM.ԯi}ڴC>6*g8zͣW ^T&Ϩ>)\.F=jXVLOA4E(O\7 }!aVrAmSk[#`#- }Yuа3J#REo51D} z'dcՋ~ZX&.DM{fkFNh@/ѱiacol\GyRI%tLS"Ljў" ?Рrbs:=$F{aυfCCwCEsr̯p݇- H. (܌u̴lLKv @nM}e,=2 5RFjs|~`zgmo[bV c@O>]%ێ0*,i8Hz oTFUzYHi@`߰;JY-l6S|횲_ܟyJ;3B#_ZI=j*:_%A?~,TAUOF&U6iVcmIeU!ޞaJpcVfi!JY(<@WA*LLH{͡kH((^ʈcfiAv#a$ځ*l%kZhME|zcA :q45N*g{A2<^SWgx33}UC3A%ѣ?8XxVi=_ (lJXMs&s>-AQ0'VՑ=cu³J;M8m r@DPAqAe1Ǻij供k[m]EJojj\ [V^<v̱NzVêfW5,ؠh1* +lAEH|:TRj%l0 +Cf8t3&(M* iB`+l9B .=pl}(ociAuP9ֽ:'X>K M5IENDB`PNG  IHDRasRGBIDAT8R=KPM^:XA:A'tPMDupqrntsI~uUZ:sӼBzq LZ1 hS