author | Carsten "Tomcat" Book <cbook@mozilla.com> |
Tue, 10 Nov 2015 11:59:34 +0100 | |
changeset 271919 | cc473fe5dc512c450634506f68cbacfb40a06a23 |
parent 271918 | f2f65c103a35ed1871558a93d9600f79672e389f (current diff) |
parent 271846 | 027084bb3cb52719fdea14e6d7346068454fc445 (diff) |
child 271920 | 5c402c2e90af85231b32029a021533cca320b848 |
child 272042 | 970c80f8e6498e6b20f1aa0dd62f14b797c033e9 |
child 272082 | a31e1e6ca2369f30752ad1e6d74994bd7edda1e6 |
push id | 67793 |
push user | cbook@mozilla.com |
push date | Tue, 10 Nov 2015 11:13:20 +0000 |
treeherder | mozilla-inbound@5c402c2e90af [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | merge |
milestone | 45.0a1 |
first release with | nightly linux32
cc473fe5dc51
/
45.0a1
/
20151110030205
/
files
nightly linux64
cc473fe5dc51
/
45.0a1
/
20151110030205
/
files
nightly mac
cc473fe5dc51
/
45.0a1
/
20151110030205
/
files
nightly win32
cc473fe5dc51
/
45.0a1
/
20151110030205
/
files
nightly win64
cc473fe5dc51
/
45.0a1
/
20151110030205
/
files
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
releases | nightly linux32
45.0a1
/
20151110030205
/
pushlog to previous
nightly linux64
45.0a1
/
20151110030205
/
pushlog to previous
nightly mac
45.0a1
/
20151110030205
/
pushlog to previous
nightly win32
45.0a1
/
20151110030205
/
pushlog to previous
nightly win64
45.0a1
/
20151110030205
/
pushlog to previous
|
layout/style/crashtests/1221902.html | file | annotate | diff | comparison | revisions | |
netwerk/base/nsIURIChecker.idl | file | annotate | diff | comparison | revisions | |
netwerk/base/nsURIChecker.cpp | file | annotate | diff | comparison | revisions | |
netwerk/base/nsURIChecker.h | file | annotate | diff | comparison | revisions | |
testing/web-platform/mozilla/meta/service-workers/service-worker/oninstall-script-error.https.html.ini | file | annotate | diff | comparison | revisions | |
toolkit/components/telemetry/Histograms.json | file | annotate | diff | comparison | revisions |
--- a/accessible/generic/DocAccessible.cpp +++ b/accessible/generic/DocAccessible.cpp @@ -2067,17 +2067,20 @@ DocAccessible::DoARIAOwnsRelocation(Acce } } bool DocAccessible::SeizeChild(Accessible* aNewParent, Accessible* aChild, int32_t aIdxInParent) { Accessible* oldParent = aChild->Parent(); - NS_PRECONDITION(oldParent, "No parent?"); + if (!oldParent) { + NS_ERROR("No parent? The tree is broken!"); + return false; + } int32_t oldIdxInParent = aChild->IndexInParent(); RefPtr<AccReorderEvent> reorderEvent = new AccReorderEvent(oldParent); RefPtr<AccMutationEvent> hideEvent = new AccHideEvent(aChild, aChild->GetContent(), false); reorderEvent->AddSubMutationEvent(hideEvent); @@ -2155,16 +2158,20 @@ DocAccessible::PutChildrenBack(nsTArray< { nsTArray<Accessible*> containers; for (auto idx = aStartIdx; idx < aChildren->Length(); idx++) { Accessible* child = aChildren->ElementAt(idx); // If the child is in the tree then remove it from the owner. if (child->IsInDocument()) { Accessible* owner = child->Parent(); + if (!owner) { + NS_ERROR("Cannot put the child back. No parent, a broken tree."); + continue; + } RefPtr<AccReorderEvent> reorderEvent = new AccReorderEvent(owner); RefPtr<AccMutationEvent> hideEvent = new AccHideEvent(child, child->GetContent(), false); reorderEvent->AddSubMutationEvent(hideEvent); { AutoTreeMutation mut(owner); owner->RemoveChild(child);
--- a/b2g/app/b2g.js +++ b/b2g/app/b2g.js @@ -1023,16 +1023,20 @@ pref("apz.fling_curve_function_x1", "0.4 pref("apz.fling_curve_function_y1", "0.0"); pref("apz.fling_curve_function_x2", "0.80"); pref("apz.fling_curve_function_y2", "1.0"); pref("apz.fling_curve_threshold_inches_per_ms", "0.01"); pref("apz.fling_friction", "0.0019"); pref("apz.max_velocity_inches_per_ms", "0.07"); pref("apz.touch_start_tolerance", "0.1"); +#ifdef MOZ_WIDGET_GONK +pref("apz.touch_move_tolerance", "0.03"); +#endif + // Tweak default displayport values to reduce the risk of running out of // memory when zooming in pref("apz.x_skate_size_multiplier", "1.25"); pref("apz.y_skate_size_multiplier", "1.5"); pref("apz.x_stationary_size_multiplier", "1.5"); pref("apz.y_stationary_size_multiplier", "1.8"); pref("apz.enlarge_displayport_when_clipped", true); // Use "sticky" axis locking
--- a/dom/base/nsContentIterator.cpp +++ b/dom/base/nsContentIterator.cpp @@ -25,31 +25,32 @@ static nsINode* NodeToParentOffset(nsINode* aNode, int32_t* aOffset) { *aOffset = 0; nsINode* parent = aNode->GetParentNode(); if (parent) { *aOffset = parent->IndexOf(aNode); + NS_WARN_IF(*aOffset < 0); } return parent; } /////////////////////////////////////////////////////////////////////////// // NodeIsInTraversalRange: returns true if content is visited during // the traversal of the range in the specified mode. // static bool NodeIsInTraversalRange(nsINode* aNode, bool aIsPreMode, nsINode* aStartNode, int32_t aStartOffset, nsINode* aEndNode, int32_t aEndOffset) { - if (!aStartNode || !aEndNode || !aNode) { + if (NS_WARN_IF(!aStartNode) || NS_WARN_IF(!aEndNode) || NS_WARN_IF(!aNode)) { return false; } // If a leaf node contains an end point of the traversal range, it is // always in the traversal range. if (aNode == aStartNode || aNode == aEndNode) { if (aNode->IsNodeOfType(nsINode::eDATA_NODE)) { return true; // text node or something @@ -66,16 +67,17 @@ NodeIsInTraversalRange(nsINode* aNode, b } nsINode* parent = aNode->GetParentNode(); if (!parent) { return false; } int32_t indx = parent->IndexOf(aNode); + NS_WARN_IF(indx == -1); if (!aIsPreMode) { ++indx; } return nsContentUtils::ComparePoints(aStartNode, aStartOffset, parent, indx) <= 0 && nsContentUtils::ComparePoints(aEndNode, aEndOffset, @@ -257,58 +259,70 @@ nsContentIterator::~nsContentIterator() /****************************************************** * Init routines ******************************************************/ nsresult nsContentIterator::Init(nsINode* aRoot) { - if (!aRoot) { + if (NS_WARN_IF(!aRoot)) { return NS_ERROR_NULL_POINTER; } mIsDone = false; mIndexes.Clear(); if (mPre) { mFirst = aRoot; mLast = GetDeepLastChild(aRoot); + NS_WARN_IF(!mLast); } else { mFirst = GetDeepFirstChild(aRoot); + NS_WARN_IF(!mFirst); mLast = aRoot; } mCommonParent = aRoot; mCurNode = mFirst; RebuildIndexStack(); return NS_OK; } nsresult nsContentIterator::Init(nsIDOMRange* aDOMRange) { - NS_ENSURE_ARG_POINTER(aDOMRange); + if (NS_WARN_IF(!aDOMRange)) { + return NS_ERROR_INVALID_ARG; + } nsRange* range = static_cast<nsRange*>(aDOMRange); mIsDone = false; // get common content parent mCommonParent = range->GetCommonAncestor(); - NS_ENSURE_TRUE(mCommonParent, NS_ERROR_FAILURE); + if (NS_WARN_IF(!mCommonParent)) { + return NS_ERROR_FAILURE; + } // get the start node and offset int32_t startIndx = range->StartOffset(); + NS_WARN_IF(startIndx < 0); nsINode* startNode = range->GetStartParent(); - NS_ENSURE_TRUE(startNode, NS_ERROR_FAILURE); + if (NS_WARN_IF(!startNode)) { + return NS_ERROR_FAILURE; + } // get the end node and offset int32_t endIndx = range->EndOffset(); + NS_WARN_IF(endIndx < 0); nsINode* endNode = range->GetEndParent(); - NS_ENSURE_TRUE(endNode, NS_ERROR_FAILURE); + if (NS_WARN_IF(!endNode)) { + return NS_ERROR_FAILURE; + } bool startIsData = startNode->IsNodeOfType(nsINode::eDATA_NODE); // short circuit when start node == end node if (startNode == endNode) { // Check to see if we have a collapsed range, if so, there is nothing to // iterate over. // @@ -322,27 +336,29 @@ nsContentIterator::Init(nsIDOMRange* aDO } if (startIsData) { // It's a character data node. mFirst = startNode->AsContent(); mLast = mFirst; mCurNode = mFirst; - RebuildIndexStack(); + nsresult rv = RebuildIndexStack(); + NS_WARN_IF(NS_FAILED(rv)); return NS_OK; } } // Find first node in range. nsIContent* cChild = nullptr; if (!startIsData && startNode->HasChildren()) { cChild = startNode->GetChildAt(startIndx); + NS_WARN_IF(!cChild); } if (!cChild) { // no children, must be a text node // // XXXbz no children might also just mean no children. So I'm not // sure what that comment above is talking about. @@ -351,131 +367,142 @@ nsContentIterator::Init(nsIDOMRange* aDO // character in the cdata node, should we set mFirst to // the next sibling? // If the node has no child, the child may be <br> or something. // So, we shouldn't skip the empty node if the start offset is 0. // In other words, if the offset is 1, the node should be ignored. if (!startIsData && startIndx) { mFirst = GetNextSibling(startNode); + NS_WARN_IF(!mFirst); // Does mFirst node really intersect the range? The range could be // 'degenerate', i.e., not collapsed but still contain no content. - if (mFirst && !NodeIsInTraversalRange(mFirst, mPre, startNode, - startIndx, endNode, endIndx)) { + if (mFirst && + NS_WARN_IF(!NodeIsInTraversalRange(mFirst, mPre, startNode, + startIndx, endNode, endIndx))) { mFirst = nullptr; } } else { mFirst = startNode->AsContent(); } } else { // post-order - if (startNode->IsContent()) { - mFirst = startNode->AsContent(); - } else { + if (NS_WARN_IF(!startNode->IsContent())) { // What else can we do? mFirst = nullptr; + } else { + mFirst = startNode->AsContent(); } } } else { if (mPre) { mFirst = cChild; } else { // post-order mFirst = GetDeepFirstChild(cChild); + NS_WARN_IF(!mFirst); // Does mFirst node really intersect the range? The range could be // 'degenerate', i.e., not collapsed but still contain no content. - if (mFirst && !NodeIsInTraversalRange(mFirst, mPre, startNode, startIndx, - endNode, endIndx)) { + if (mFirst && + NS_WARN_IF(!NodeIsInTraversalRange(mFirst, mPre, startNode, startIndx, + endNode, endIndx))) { mFirst = nullptr; } } } // Find last node in range. bool endIsData = endNode->IsNodeOfType(nsINode::eDATA_NODE); if (endIsData || !endNode->HasChildren() || endIndx == 0) { if (mPre) { - if (endNode->IsContent()) { + if (NS_WARN_IF(!endNode->IsContent())) { + // Not much else to do here... + mLast = nullptr; + } else { // If the end node is an empty element and the end offset is 0, // the last element should be the previous node (i.e., shouldn't // include the end node in the range). if (!endIsData && !endNode->HasChildren() && !endIndx) { mLast = GetPrevSibling(endNode); - if (!NodeIsInTraversalRange(mLast, mPre, startNode, startIndx, - endNode, endIndx)) { + NS_WARN_IF(!mLast); + if (NS_WARN_IF(!NodeIsInTraversalRange(mLast, mPre, + startNode, startIndx, + endNode, endIndx))) { mLast = nullptr; } } else { mLast = endNode->AsContent(); } - } else { - // Not much else to do here... - mLast = nullptr; } } else { // post-order // // XXX: In the future, if end offset is before the first character in the // cdata node, should we set mLast to the prev sibling? if (!endIsData) { mLast = GetPrevSibling(endNode); + NS_WARN_IF(!mLast); - if (!NodeIsInTraversalRange(mLast, mPre, startNode, startIndx, - endNode, endIndx)) { + if (NS_WARN_IF(!NodeIsInTraversalRange(mLast, mPre, + startNode, startIndx, + endNode, endIndx))) { mLast = nullptr; } } else { mLast = endNode->AsContent(); } } } else { int32_t indx = endIndx; cChild = endNode->GetChildAt(--indx); - if (!cChild) { + if (NS_WARN_IF(!cChild)) { // No child at offset! NS_NOTREACHED("nsContentIterator::nsContentIterator"); return NS_ERROR_FAILURE; } if (mPre) { mLast = GetDeepLastChild(cChild); + NS_WARN_IF(!mLast); - if (!NodeIsInTraversalRange(mLast, mPre, startNode, startIndx, - endNode, endIndx)) { + if (NS_WARN_IF(!NodeIsInTraversalRange(mLast, mPre, + startNode, startIndx, + endNode, endIndx))) { mLast = nullptr; } } else { // post-order mLast = cChild; } } // If either first or last is null, they both have to be null! - if (!mFirst || !mLast) { + if (NS_WARN_IF(!mFirst) || NS_WARN_IF(!mLast)) { mFirst = nullptr; mLast = nullptr; } mCurNode = mFirst; mIsDone = !mCurNode; if (!mCurNode) { mIndexes.Clear(); } else { - RebuildIndexStack(); + nsresult rv = RebuildIndexStack(); + NS_WARN_IF(NS_FAILED(rv)); } return NS_OK; } /****************************************************** * Helper routines @@ -494,17 +521,17 @@ nsContentIterator::RebuildIndexStack() current = mCurNode; if (!current) { return NS_OK; } while (current != mCommonParent) { parent = current->GetParentNode(); - if (!parent) { + if (NS_WARN_IF(!parent)) { return NS_ERROR_FAILURE; } mIndexes.InsertElementAt(0, parent->IndexOf(current)); current = parent; } @@ -521,33 +548,33 @@ nsContentIterator::MakeEmpty() mIsDone = true; mIndexes.Clear(); } nsINode* nsContentIterator::GetDeepFirstChild(nsINode* aRoot, nsTArray<int32_t>* aIndexes) { - if (!aRoot || !aRoot->HasChildren()) { + if (NS_WARN_IF(!aRoot) || !aRoot->HasChildren()) { return aRoot; } // We can't pass aRoot itself to the full GetDeepFirstChild, because that // will only take nsIContent and aRoot might be a document. Pass aRoot's // child, but be sure to preserve aIndexes. if (aIndexes) { aIndexes->AppendElement(0); } return GetDeepFirstChild(aRoot->GetFirstChild(), aIndexes); } nsIContent* nsContentIterator::GetDeepFirstChild(nsIContent* aRoot, nsTArray<int32_t>* aIndexes) { - if (!aRoot) { + if (NS_WARN_IF(!aRoot)) { return nullptr; } nsIContent* node = aRoot; nsIContent* child = node->GetFirstChild(); while (child) { if (aIndexes) { @@ -560,33 +587,33 @@ nsContentIterator::GetDeepFirstChild(nsI return node; } nsINode* nsContentIterator::GetDeepLastChild(nsINode* aRoot, nsTArray<int32_t>* aIndexes) { - if (!aRoot || !aRoot->HasChildren()) { + if (NS_WARN_IF(!aRoot) || !aRoot->HasChildren()) { return aRoot; } // We can't pass aRoot itself to the full GetDeepLastChild, because that will // only take nsIContent and aRoot might be a document. Pass aRoot's child, // but be sure to preserve aIndexes. if (aIndexes) { aIndexes->AppendElement(aRoot->GetChildCount() - 1); } return GetDeepLastChild(aRoot->GetLastChild(), aIndexes); } nsIContent* nsContentIterator::GetDeepLastChild(nsIContent* aRoot, nsTArray<int32_t>* aIndexes) { - if (!aRoot) { + if (NS_WARN_IF(!aRoot)) { return nullptr; } nsIContent* node = aRoot; int32_t numChildren = node->GetChildCount(); while (numChildren) { nsIContent* child = node->GetChildAt(--numChildren); @@ -602,43 +629,45 @@ nsContentIterator::GetDeepLastChild(nsIC return node; } // Get the next sibling, or parent's next sibling, or grandpa's next sibling... nsIContent* nsContentIterator::GetNextSibling(nsINode* aNode, nsTArray<int32_t>* aIndexes) { - if (!aNode) { + if (NS_WARN_IF(!aNode)) { return nullptr; } nsINode* parent = aNode->GetParentNode(); - if (!parent) { + if (NS_WARN_IF(!parent)) { return nullptr; } int32_t indx = 0; NS_ASSERTION(!aIndexes || !aIndexes->IsEmpty(), "ContentIterator stack underflow"); if (aIndexes && !aIndexes->IsEmpty()) { // use the last entry on the Indexes array for the current index indx = (*aIndexes)[aIndexes->Length()-1]; } else { indx = mCachedIndex; } + NS_WARN_IF(indx < 0); // reverify that the index of the current node hasn't changed. // not super cheap, but a lot cheaper than IndexOf(), and still O(1). // ignore result this time - the index may now be out of range. nsIContent* sib = parent->GetChildAt(indx); if (sib != aNode) { // someone changed our index - find the new index the painful way indx = parent->IndexOf(aNode); + NS_WARN_IF(indx < 0); } // indx is now canonically correct if ((sib = parent->GetChildAt(++indx))) { // update index cache if (aIndexes && !aIndexes->IsEmpty()) { aIndexes->ElementAt(aIndexes->Length()-1) = indx; } else { @@ -663,22 +692,22 @@ nsContentIterator::GetNextSibling(nsINod return sib; } // Get the prev sibling, or parent's prev sibling, or grandpa's prev sibling... nsIContent* nsContentIterator::GetPrevSibling(nsINode* aNode, nsTArray<int32_t>* aIndexes) { - if (!aNode) { + if (NS_WARN_IF(!aNode)) { return nullptr; } nsINode* parent = aNode->GetParentNode(); - if (!parent) { + if (NS_WARN_IF(!parent)) { return nullptr; } int32_t indx = 0; NS_ASSERTION(!aIndexes || !aIndexes->IsEmpty(), "ContentIterator stack underflow"); if (aIndexes && !aIndexes->IsEmpty()) { @@ -689,16 +718,17 @@ nsContentIterator::GetPrevSibling(nsINod } // reverify that the index of the current node hasn't changed // ignore result this time - the index may now be out of range. nsIContent* sib = parent->GetChildAt(indx); if (sib != aNode) { // someone changed our index - find the new index the painful way indx = parent->IndexOf(aNode); + NS_WARN_IF(indx < 0); } // indx is now canonically correct if (indx > 0 && (sib = parent->GetChildAt(--indx))) { // update index cache if (aIndexes && !aIndexes->IsEmpty()) { aIndexes->ElementAt(aIndexes->Length()-1) = indx; } else { @@ -720,16 +750,17 @@ nsContentIterator::NextNode(nsINode* aNo { nsINode* node = aNode; // if we are a Pre-order iterator, use pre-order if (mPre) { // if it has children then next node is first child if (node->HasChildren()) { nsIContent* firstChild = node->GetFirstChild(); + MOZ_ASSERT(firstChild); // update cache if (aIndexes) { // push an entry on the index stack aIndexes->AppendElement(0); } else { mCachedIndex = 0; } @@ -738,16 +769,17 @@ nsContentIterator::NextNode(nsINode* aNo } // else next sibling is next return GetNextSibling(node, aIndexes); } // post-order nsINode* parent = node->GetParentNode(); + NS_WARN_IF(!parent); nsIContent* sibling = nullptr; int32_t indx = 0; // get the cached index NS_ASSERTION(!aIndexes || !aIndexes->IsEmpty(), "ContentIterator stack underflow"); if (aIndexes && !aIndexes->IsEmpty()) { // use the last entry on the Indexes array for the current index @@ -760,16 +792,17 @@ nsContentIterator::NextNode(nsINode* aNo // cheap, but a lot cheaper than IndexOf(), and still O(1). ignore result // this time - the index may now be out of range. if (indx >= 0) { sibling = parent->GetChildAt(indx); } if (sibling != node) { // someone changed our index - find the new index the painful way indx = parent->IndexOf(node); + NS_WARN_IF(indx < 0); } // indx is now canonically correct sibling = parent->GetChildAt(++indx); if (sibling) { // update cache if (aIndexes && !aIndexes->IsEmpty()) { // replace an entry on the index stack @@ -801,16 +834,17 @@ nsContentIterator::NextNode(nsINode* aNo nsINode* nsContentIterator::PrevNode(nsINode* aNode, nsTArray<int32_t>* aIndexes) { nsINode* node = aNode; // if we are a Pre-order iterator, use pre-order if (mPre) { nsINode* parent = node->GetParentNode(); + NS_WARN_IF(!parent); nsIContent* sibling = nullptr; int32_t indx = 0; // get the cached index NS_ASSERTION(!aIndexes || !aIndexes->IsEmpty(), "ContentIterator stack underflow"); if (aIndexes && !aIndexes->IsEmpty()) { // use the last entry on the Indexes array for the current index @@ -819,21 +853,23 @@ nsContentIterator::PrevNode(nsINode* aNo indx = mCachedIndex; } // reverify that the index of the current node hasn't changed. not super // cheap, but a lot cheaper than IndexOf(), and still O(1). ignore result // this time - the index may now be out of range. if (indx >= 0) { sibling = parent->GetChildAt(indx); + NS_WARN_IF(!sibling); } if (sibling != node) { // someone changed our index - find the new index the painful way indx = parent->IndexOf(node); + NS_WARN_IF(indx < 0); } // indx is now canonically correct if (indx && (sibling = parent->GetChildAt(--indx))) { // update cache if (aIndexes && !aIndexes->IsEmpty()) { // replace an entry on the index stack aIndexes->ElementAt(aIndexes->Length()-1) = indx; @@ -853,20 +889,22 @@ nsContentIterator::PrevNode(nsINode* aNo // this might be wrong, but we are better off guessing mCachedIndex = 0; } return parent; } // post-order int32_t numChildren = node->GetChildCount(); + NS_WARN_IF(numChildren < 0); // if it has children then prev node is last child if (numChildren) { nsIContent* lastChild = node->GetLastChild(); + NS_WARN_IF(!lastChild); numChildren--; // update cache if (aIndexes) { // push an entry on the index stack aIndexes->AppendElement(numChildren); } else { mCachedIndex = numChildren; @@ -882,66 +920,58 @@ nsContentIterator::PrevNode(nsINode* aNo /****************************************************** * ContentIterator routines ******************************************************/ void nsContentIterator::First() { if (mFirst) { -#ifdef DEBUG - nsresult rv = -#endif - PositionAt(mFirst); - + DebugOnly<nsresult> rv = PositionAt(mFirst); NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to position iterator!"); } mIsDone = mFirst == nullptr; } void nsContentIterator::Last() { NS_ASSERTION(mLast, "No last node!"); if (mLast) { -#ifdef DEBUG - nsresult rv = -#endif - PositionAt(mLast); - + DebugOnly<nsresult> rv = PositionAt(mLast); NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to position iterator!"); } mIsDone = mLast == nullptr; } void nsContentIterator::Next() { - if (mIsDone || !mCurNode) { + if (mIsDone || NS_WARN_IF(!mCurNode)) { return; } if (mCurNode == mLast) { mIsDone = true; return; } mCurNode = NextNode(mCurNode, &mIndexes); } void nsContentIterator::Prev() { - if (mIsDone || !mCurNode) { + if (NS_WARN_IF(mIsDone) || NS_WARN_IF(!mCurNode)) { return; } if (mCurNode == mFirst) { mIsDone = true; return; } @@ -956,17 +986,17 @@ nsContentIterator::IsDone() } // Keeping arrays of indexes for the stack of nodes makes PositionAt // interesting... nsresult nsContentIterator::PositionAt(nsINode* aCurNode) { - if (!aCurNode) { + if (NS_WARN_IF(!aCurNode)) { return NS_ERROR_NULL_POINTER; } nsINode* newCurNode = aCurNode; nsINode* tempNode = mCurNode; mCurNode = aCurNode; // take an early out if this doesn't actually change the position @@ -979,44 +1009,54 @@ nsContentIterator::PositionAt(nsINode* a nsINode* firstNode = mFirst; nsINode* lastNode = mLast; int32_t firstOffset = 0, lastOffset = 0; if (firstNode && lastNode) { if (mPre) { firstNode = NodeToParentOffset(mFirst, &firstOffset); + NS_WARN_IF(!firstNode); + NS_WARN_IF(firstOffset < 0); if (lastNode->GetChildCount()) { lastOffset = 0; } else { lastNode = NodeToParentOffset(mLast, &lastOffset); + NS_WARN_IF(!lastNode); + NS_WARN_IF(lastOffset < 0); ++lastOffset; } } else { uint32_t numChildren = firstNode->GetChildCount(); if (numChildren) { firstOffset = numChildren; + NS_WARN_IF(firstOffset < 0); } else { firstNode = NodeToParentOffset(mFirst, &firstOffset); + NS_WARN_IF(!firstNode); + NS_WARN_IF(firstOffset < 0); } lastNode = NodeToParentOffset(mLast, &lastOffset); + NS_WARN_IF(!lastNode); + NS_WARN_IF(lastOffset < 0); ++lastOffset; } } // The end positions are always in the range even if it has no parent. We // need to allow that or 'iter->Init(root)' would assert in Last() or First() // for example, bug 327694. if (mFirst != mCurNode && mLast != mCurNode && - (!firstNode || !lastNode || - !NodeIsInTraversalRange(mCurNode, mPre, firstNode, firstOffset, - lastNode, lastOffset))) { + (NS_WARN_IF(!firstNode) || NS_WARN_IF(!lastNode) || + NS_WARN_IF(!NodeIsInTraversalRange(mCurNode, mPre, + firstNode, firstOffset, + lastNode, lastOffset)))) { mIsDone = true; return NS_ERROR_FAILURE; } // We can be at ANY node in the sequence. Need to regenerate the array of // indexes back to the root or common parent! nsAutoTArray<nsINode*, 8> oldParentStack; nsAutoTArray<int32_t, 8> newIndexes; @@ -1035,17 +1075,17 @@ nsContentIterator::PositionAt(nsINode* a // for loop, and mIndexes only has entries for nodes from tempNode up through // an ancestor of tempNode that's a child of mCommonParent. for (int32_t i = mIndexes.Length() + 1; i > 0 && tempNode; i--) { // Insert at head since we're walking up oldParentStack.InsertElementAt(0, tempNode); nsINode* parent = tempNode->GetParentNode(); - if (!parent) { + if (NS_WARN_IF(!parent)) { // this node has no parent, and thus no index break; } if (parent == mCurNode) { // The position was moved to a parent of the current position. All we // need to do is drop some indexes. Shortcut here. mIndexes.RemoveElementsAt(mIndexes.Length() - oldParentStack.Length(), @@ -1055,22 +1095,23 @@ nsContentIterator::PositionAt(nsINode* a } tempNode = parent; } // Ok. We have the array of old parents. Look for a match. while (newCurNode) { nsINode* parent = newCurNode->GetParentNode(); - if (!parent) { + if (NS_WARN_IF(!parent)) { // this node has no parent, and thus no index break; } int32_t indx = parent->IndexOf(newCurNode); + NS_WARN_IF(indx < 0); // insert at the head! newIndexes.InsertElementAt(0, indx); // look to see if the parent is in the stack indx = oldParentStack.IndexOf(parent); if (indx >= 0) { // ok, the parent IS on the old stack! Rework things. We want
--- a/dom/base/nsDocument.cpp +++ b/dom/base/nsDocument.cpp @@ -1493,23 +1493,29 @@ nsDocument::nsDocument(const char* aCont if (!sProcessingStack) { sProcessingStack.emplace(); // Add the base queue sentinel to the processing stack. sProcessingStack->AppendElement((CustomElementData*) nullptr); } } -static PLDHashOperator -ClearAllBoxObjects(nsIContent* aKey, nsPIBoxObject* aBoxObject, void* aUserArg) -{ - if (aBoxObject) { - aBoxObject->Clear(); - } - return PL_DHASH_NEXT; +void +nsDocument::ClearAllBoxObjects() +{ + if (mBoxObjectTable) { + for (auto iter = mBoxObjectTable->Iter(); !iter.Done(); iter.Next()) { + nsPIBoxObject* boxObject = iter.UserData(); + if (boxObject) { + boxObject->Clear(); + } + } + delete mBoxObjectTable; + mBoxObjectTable = nullptr; + } } nsIDocument::~nsIDocument() { MOZ_ASSERT(PR_CLIST_IS_EMPTY(&mDOMMediaQueryLists), "must not have media query lists left"); if (mNodeInfoManager) { @@ -1648,20 +1654,17 @@ nsDocument::~nsDocument() } if (mStyleImageLoader) { mStyleImageLoader->DropDocumentReference(); } delete mHeaderData; - if (mBoxObjectTable) { - mBoxObjectTable->EnumerateRead(ClearAllBoxObjects, nullptr); - delete mBoxObjectTable; - } + ClearAllBoxObjects(); mPendingTitleChangeEvent.Revoke(); // We don't want to leave residual locks on images. Make sure we're in an // unlocked state, and then clear the table. SetImageLockingState(false); mImageTracker.Clear(); @@ -1741,49 +1744,16 @@ NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_END NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_BEGIN(nsDocument) return Element::CanSkipInCC(tmp); NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_END NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_BEGIN(nsDocument) return Element::CanSkipThis(tmp); NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_END -static PLDHashOperator -RadioGroupsTraverser(const nsAString& aKey, nsRadioGroupStruct* aData, - void* aClosure) -{ - nsCycleCollectionTraversalCallback *cb = - static_cast<nsCycleCollectionTraversalCallback*>(aClosure); - - NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(*cb, - "mRadioGroups entry->mSelectedRadioButton"); - cb->NoteXPCOMChild(ToSupports(aData->mSelectedRadioButton)); - - uint32_t i, count = aData->mRadioButtons.Count(); - for (i = 0; i < count; ++i) { - NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(*cb, - "mRadioGroups entry->mRadioButtons[i]"); - cb->NoteXPCOMChild(aData->mRadioButtons[i]); - } - - return PL_DHASH_NEXT; -} - -static PLDHashOperator -BoxObjectTraverser(nsIContent* key, nsPIBoxObject* boxObject, void* userArg) -{ - nsCycleCollectionTraversalCallback *cb = - static_cast<nsCycleCollectionTraversalCallback*>(userArg); - - NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(*cb, "mBoxObjectTable entry"); - cb->NoteXPCOMChild(boxObject); - - return PL_DHASH_NEXT; -} - static const char* kNSURIs[] = { "([none])", "(xmlns)", "(xml)", "(xhtml)", "(XLink)", "(XSLT)", "(XBL)", @@ -1850,22 +1820,37 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mScriptGlobalObject) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mListenerManager) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDOMStyleSheets) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mStyleSheetSetList) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mScriptLoader) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mMasterDocument) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mImportManager) - tmp->mRadioGroups.EnumerateRead(RadioGroupsTraverser, &cb); + for (auto iter = tmp->mRadioGroups.Iter(); !iter.Done(); iter.Next()) { + nsRadioGroupStruct* radioGroup = iter.UserData(); + NS_CYCLE_COLLECTION_NOTE_EDGE_NAME( + cb, "mRadioGroups entry->mSelectedRadioButton"); + cb.NoteXPCOMChild(ToSupports(radioGroup->mSelectedRadioButton)); + + uint32_t i, count = radioGroup->mRadioButtons.Count(); + for (i = 0; i < count; ++i) { + NS_CYCLE_COLLECTION_NOTE_EDGE_NAME( + cb, "mRadioGroups entry->mRadioButtons[i]"); + cb.NoteXPCOMChild(radioGroup->mRadioButtons[i]); + } + } // The boxobject for an element will only exist as long as it's in the // document, so we'll traverse the table here instead of from the element. if (tmp->mBoxObjectTable) { - tmp->mBoxObjectTable->EnumerateRead(BoxObjectTraverser, &cb); + for (auto iter = tmp->mBoxObjectTable->Iter(); !iter.Done(); iter.Next()) { + NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "mBoxObjectTable entry"); + cb.NoteXPCOMChild(iter.UserData()); + } } NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mChannel) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mStyleAttrStyleSheet) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mXPathEvaluator) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLayoutHistoryState) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOnloadBlocker) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFirstBaseNodeWithHref) @@ -1976,22 +1961,17 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(ns NS_IMPL_CYCLE_COLLECTION_UNLINK(mImportManager) NS_IMPL_CYCLE_COLLECTION_UNLINK(mSubImportLinks) NS_IMPL_CYCLE_COLLECTION_UNLINK(mFontFaceSet) tmp->mParentDocument = nullptr; NS_IMPL_CYCLE_COLLECTION_UNLINK(mPreloadingImages) - - if (tmp->mBoxObjectTable) { - tmp->mBoxObjectTable->EnumerateRead(ClearAllBoxObjects, nullptr); - delete tmp->mBoxObjectTable; - tmp->mBoxObjectTable = nullptr; - } + tmp->ClearAllBoxObjects(); if (tmp->mListenerManager) { tmp->mListenerManager->Disconnect(); tmp->UnsetFlags(NODE_HAS_LISTENERMANAGER); tmp->mListenerManager = nullptr; } NS_IMPL_CYCLE_COLLECTION_UNLINK(mDOMStyleSheets) @@ -3782,39 +3762,33 @@ nsIDocument::ShouldThrottleFrameRequests // platforms and is unlikely to be human-perceivable on non-APZ platforms. return true; } // We got painted during the last paint, so run at full speed. return false; } -PLDHashOperator RequestDiscardEnumerator(imgIRequest* aKey, - uint32_t aData, - void* userArg) -{ - aKey->RequestDiscard(); - return PL_DHASH_NEXT; -} - void nsDocument::DeleteShell() { mExternalResourceMap.HideViewers(); if (IsEventHandlingEnabled() && !AnimationsPaused()) { RevokeAnimationFrameNotifications(); } if (nsPresContext* presContext = mPresShell->GetPresContext()) { presContext->RefreshDriver()->CancelPendingEvents(this); } // When our shell goes away, request that all our images be immediately // discarded, so we don't carry around decoded image data for a document we // no longer intend to paint. - mImageTracker.EnumerateRead(RequestDiscardEnumerator, nullptr); + for (auto iter = mImageTracker.Iter(); !iter.Done(); iter.Next()) { + iter.Key()->RequestDiscard(); + } // Now that we no longer have a shell, we need to forget about any FontFace // objects for @font-face rules that came from the style set. RebuildUserFontSet(); mPresShell = nullptr; } @@ -10562,83 +10536,60 @@ nsDocument::NotifyMediaFeatureValuesChan nsCOMPtr<nsIContent> content = iter.Get()->GetKey(); if (content->IsHTMLElement(nsGkAtoms::img)) { auto* imageElement = static_cast<HTMLImageElement*>(content.get()); imageElement->MediaFeatureValuesChanged(); } } } -PLDHashOperator LockEnumerator(imgIRequest* aKey, - uint32_t aData, - void* userArg) -{ - aKey->LockImage(); - return PL_DHASH_NEXT; -} - -PLDHashOperator UnlockEnumerator(imgIRequest* aKey, - uint32_t aData, - void* userArg) -{ - aKey->UnlockImage(); - return PL_DHASH_NEXT; -} - - nsresult nsDocument::SetImageLockingState(bool aLocked) { if (XRE_IsContentProcess() && !Preferences::GetBool("image.mem.allow_locking_in_content_processes", true)) { return NS_OK; } // If there's no change, there's nothing to do. if (mLockingImages == aLocked) return NS_OK; // Otherwise, iterate over our images and perform the appropriate action. - mImageTracker.EnumerateRead(aLocked ? LockEnumerator - : UnlockEnumerator, - nullptr); + for (auto iter = mImageTracker.Iter(); !iter.Done(); iter.Next()) { + imgIRequest* image = iter.Key(); + if (aLocked) { + image->LockImage(); + } else { + image->UnlockImage(); + } + } // Update state. mLockingImages = aLocked; return NS_OK; } -PLDHashOperator IncrementAnimationEnumerator(imgIRequest* aKey, - uint32_t aData, - void* userArg) -{ - aKey->IncrementAnimationConsumers(); - return PL_DHASH_NEXT; -} - -PLDHashOperator DecrementAnimationEnumerator(imgIRequest* aKey, - uint32_t aData, - void* userArg) -{ - aKey->DecrementAnimationConsumers(); - return PL_DHASH_NEXT; -} - void nsDocument::SetImagesNeedAnimating(bool aAnimating) { // If there's no change, there's nothing to do. if (mAnimatingImages == aAnimating) return; // Otherwise, iterate over our images and perform the appropriate action. - mImageTracker.EnumerateRead(aAnimating ? IncrementAnimationEnumerator - : DecrementAnimationEnumerator, - nullptr); + for (auto iter = mImageTracker.Iter(); !iter.Done(); iter.Next()) { + imgIRequest* image = iter.Key(); + if (aAnimating) { + image->IncrementAnimationConsumers(); + } else { + image->DecrementAnimationConsumers(); + } + } // Update state. mAnimatingImages = aAnimating; } already_AddRefed<Touch> nsIDocument::CreateTouch(nsIDOMWindow* aView, EventTarget* aTarget,
--- a/dom/base/nsDocument.h +++ b/dom/base/nsDocument.h @@ -1762,16 +1762,18 @@ private: bool aUpdateCSSLoader); // Revoke any pending notifications due to requestAnimationFrame calls void RevokeAnimationFrameNotifications(); // Reschedule any notifications we need to handle // requestAnimationFrame, if it's OK to do so. void MaybeRescheduleAnimationFrameNotifications(); + void ClearAllBoxObjects(); + // Returns true if the scheme for the url for this document is "about" bool IsAboutPage(); // These are not implemented and not supported. nsDocument(const nsDocument& aOther); nsDocument& operator=(const nsDocument& aOther); // The layout history state that should be used by nodes in this
--- a/dom/base/nsGkAtomList.h +++ b/dom/base/nsGkAtomList.h @@ -289,16 +289,17 @@ GK_ATOM(del, "del") GK_ATOM(descendant, "descendant") GK_ATOM(descendantOrSelf, "descendant-or-self") GK_ATOM(descending, "descending") GK_ATOM(description, "description") GK_ATOM(destructor, "destructor") GK_ATOM(details, "details") GK_ATOM(deviceAspectRatio, "device-aspect-ratio") GK_ATOM(deviceHeight, "device-height") +GK_ATOM(devicePixelRatio, "device-pixel-ratio") GK_ATOM(deviceWidth, "device-width") GK_ATOM(dfn, "dfn") GK_ATOM(dialog, "dialog") GK_ATOM(difference, "difference") GK_ATOM(digit, "digit") GK_ATOM(dir, "dir") GK_ATOM(dirAutoSetBy, "dirAutoSetBy") GK_ATOM(directionality, "directionality")
--- a/dom/base/test/test_bug976673.html +++ b/dom/base/test/test_bug976673.html @@ -21,16 +21,21 @@ https://bugzilla.mozilla.org/show_bug.cg <input id="input" onfocus="event.target.value = event.type;" onblur="event.target.value = event.type;"> <button id="button">set focus</button> <iframe id="iframe" src="http://example.org:80/tests/dom/base/test/iframe_bug976673.html"></iframe> <script> SimpleTest.waitForExplicitFinish(); +// In e10s mode, ContentCacheInChild tries to retrieve selected text and +// caret position when IMEContentObserver notifies IME of focus. At this time, +// we hit assertion in nsContentIterator. +SimpleTest.expectAssertions(0, 6); + window.addEventListener("mousedown", function (aEvent) { aEvent.preventDefault(); }, false); function testSetFocus(aEventType, aCallback) { var description = "Setting focus from " + aEventType + " handler: "; var iframe = document.getElementById("iframe"); iframe.contentWindow.focus();
--- a/dom/bindings/BindingUtils.cpp +++ b/dom/bindings/BindingUtils.cpp @@ -130,16 +130,22 @@ ThrowMethodFailed(JSContext* cx, ErrorRe { if (rv.IsUncatchableException()) { // Nuke any existing exception on aCx, to make sure we're uncatchable. JS_ClearPendingException(cx); // Don't do any reporting. Just return false, to create an // uncatchable exception. return false; } + if (rv.IsJSContextException()) { + // Whatever we need to throw is on the JSContext already. We + // can't assert that there is a pending exception on it, though, + // because in the uncatchable exception case there won't be one. + return false; + } if (rv.IsErrorWithMessage()) { rv.ReportErrorWithMessage(cx); return false; } if (rv.IsJSException()) { rv.ReportJSException(cx); return false; }
--- a/dom/bindings/ErrorResult.h +++ b/dom/bindings/ErrorResult.h @@ -162,16 +162,27 @@ public: // passed to ThrowDOMException, the default message string for the given // nsresult will be used. The passed-in string must be UTF-8. The nsresult // passed in must be one we create DOMExceptions for; otherwise you may get an // XPConnect Exception. void ThrowDOMException(nsresult rv, const nsACString& message = EmptyCString()); void ReportDOMException(JSContext* cx); bool IsDOMException() const { return ErrorCode() == NS_ERROR_DOM_DOMEXCEPTION; } + // Flag on the ErrorResult that whatever needs throwing has been + // thrown on the JSContext already and we should not mess with it. + void NoteJSContextException() { + mResult = NS_ERROR_DOM_EXCEPTION_ON_JSCONTEXT; + } + // Check whether the ErrorResult says to just throw whatever is on + // the JSContext already. + bool IsJSContextException() { + return ErrorCode() == NS_ERROR_DOM_EXCEPTION_ON_JSCONTEXT; + } + // Report a generic error. This should only be used if we're not // some more specific exception type. void ReportGenericError(JSContext* cx); // Support for uncatchable exceptions. void ThrowUncatchableException() { Throw(NS_ERROR_UNCATCHABLE_EXCEPTION); } @@ -269,16 +280,18 @@ private: MOZ_ASSERT(aRv != NS_ERROR_TYPE_ERR, "Use ThrowTypeError()"); MOZ_ASSERT(aRv != NS_ERROR_RANGE_ERR, "Use ThrowRangeError()"); MOZ_ASSERT(!IsErrorWithMessage(), "Don't overwrite errors with message"); MOZ_ASSERT(aRv != NS_ERROR_DOM_JS_EXCEPTION, "Use ThrowJSException()"); MOZ_ASSERT(!IsJSException(), "Don't overwrite JS exceptions"); MOZ_ASSERT(aRv != NS_ERROR_DOM_DOMEXCEPTION, "Use ThrowDOMException()"); MOZ_ASSERT(!IsDOMException(), "Don't overwrite DOM exceptions"); MOZ_ASSERT(aRv != NS_ERROR_XPC_NOT_ENOUGH_ARGS, "May need to bring back ThrowNotEnoughArgsError"); + MOZ_ASSERT(aRv != NS_ERROR_DOM_EXCEPTION_ON_JSCONTEXT, + "Use NoteJSContextException"); mResult = aRv; } void ClearMessage(); void ClearDOMExceptionInfo(); // ClearUnionData will try to clear the data in our // mMessage/mJSException/mDOMExceptionInfo union. After this the union may be
--- a/dom/events/EventStateManager.cpp +++ b/dom/events/EventStateManager.cpp @@ -468,16 +468,24 @@ void EventStateManager::OnStopObservingContent( IMEContentObserver* aIMEContentObserver) { aIMEContentObserver->DisconnectFromEventStateManager(); NS_ENSURE_TRUE_VOID(mIMEContentObserver == aIMEContentObserver); mIMEContentObserver = nullptr; } +void +EventStateManager::TryToFlushPendingNotificationsToIME() +{ + if (mIMEContentObserver) { + mIMEContentObserver->TryToFlushPendingNotifications(); + } +} + nsresult EventStateManager::PreHandleEvent(nsPresContext* aPresContext, WidgetEvent* aEvent, nsIFrame* aTargetFrame, nsIContent* aTargetContent, nsEventStatus* aStatus) { NS_ENSURE_ARG_POINTER(aStatus);
--- a/dom/events/EventStateManager.h +++ b/dom/events/EventStateManager.h @@ -142,16 +142,22 @@ public: * EventStateManager stores IMEContentObserver while it's observing contents. * Following mehtods are called by IMEContentObserver when it starts to * observe or stops observing the content. */ void OnStartToObserveContent(IMEContentObserver* aIMEContentObserver); void OnStopObservingContent(IMEContentObserver* aIMEContentObserver); /** + * TryToFlushPendingNotificationsToIME() suggests flushing pending + * notifications to IME to IMEContentObserver. + */ + void TryToFlushPendingNotificationsToIME(); + + /** * Register accesskey on the given element. When accesskey is activated then * the element will be notified via nsIContent::PerformAccesskey() method. * * @param aContent the given element * @param aKey accesskey */ void RegisterAccessKey(nsIContent* aContent, uint32_t aKey);
--- a/dom/events/IMEContentObserver.cpp +++ b/dom/events/IMEContentObserver.cpp @@ -197,17 +197,16 @@ IMEContentObserver::IMEContentObserver() , mPreCharacterDataChangeLength(-1) , mSendingNotification(NOTIFY_IME_OF_NOTHING) , mIsObserving(false) , mIMEHasFocus(false) , mNeedsToNotifyIMEOfFocusSet(false) , mNeedsToNotifyIMEOfTextChange(false) , mNeedsToNotifyIMEOfSelectionChange(false) , mNeedsToNotifyIMEOfPositionChange(false) - , mIsFlushingPendingNotifications(false) , mIsHandlingQueryContentEvent(false) { #ifdef DEBUG mTextChangeData.Test(); #endif if (!sIMECOLog) { sIMECOLog = PR_NewLogModule("IMEContentObserver"); } @@ -246,36 +245,66 @@ IMEContentObserver::Init(nsIWidget* aWid } else { if (!InitWithEditor(aPresContext, aContent, aEditor)) { Clear(); return; } } if (firstInitialization) { + // Now, try to send NOTIFY_IME_OF_FOCUS to IME via the widget. MaybeNotifyIMEOfFocusSet(); + // When this is called first time, IME has not received NOTIFY_IME_OF_FOCUS + // yet since NOTIFY_IME_OF_FOCUS will be sent to widget asynchronously. + // So, we need to do nothing here. After NOTIFY_IME_OF_FOCUS has been + // sent, OnIMEReceivedFocus() will be called and content, selection and/or + // position changes will be observed + return; + } - // While Init() notifies IME of focus, pending layout may be flushed - // because the notification may cause querying content. Then, recursive - // call of Init() with the latest content may be occur. In such case, we - // shouldn't keep first initialization. - if (GetState() != eState_Initializing) { - return; - } + // When this is called after editor reframing (i.e., the root editable node + // is also recreated), IME has usually received NOTIFY_IME_OF_FOCUS. In this + // case, we need to restart to observe content, selection and/or position + // changes in new root editable node. + ObserveEditableNode(); - // NOTIFY_IME_OF_FOCUS might cause recreating IMEContentObserver - // instance via IMEStateManager::UpdateIMEState(). So, this - // instance might already have been destroyed, check it. - if (!mRootContent) { - return; - } + if (!NeedsToNotifyIMEOfSomething()) { + return; } + // Some change events may wait to notify IME because this was being + // initialized. It is the time to flush them. + FlushMergeableNotifications(); +} + +void +IMEContentObserver::OnIMEReceivedFocus() +{ + // While Init() notifies IME of focus, pending layout may be flushed + // because the notification may cause querying content. Then, recursive + // call of Init() with the latest content may occur. In such case, we + // shouldn't keep first initialization which notified IME of focus. + if (GetState() != eState_Initializing) { + return; + } + + // NOTIFY_IME_OF_FOCUS might cause recreating IMEContentObserver + // instance via IMEStateManager::UpdateIMEState(). So, this + // instance might already have been destroyed, check it. + if (!mRootContent) { + return; + } + + // Start to observe which is needed by IME when IME actually has focus. ObserveEditableNode(); + if (!NeedsToNotifyIMEOfSomething()) { + return; + } + // Some change events may wait to notify IME because this was being // initialized. It is the time to flush them. FlushMergeableNotifications(); } bool IMEContentObserver::InitWithEditor(nsPresContext* aPresContext, nsIContent* aContent, @@ -399,16 +428,28 @@ IMEContentObserver::Clear() void IMEContentObserver::ObserveEditableNode() { MOZ_RELEASE_ASSERT(mSelection); MOZ_RELEASE_ASSERT(mRootContent); MOZ_RELEASE_ASSERT(GetState() != eState_Observing); + // If this is called before sending NOTIFY_IME_OF_FOCUS (it's possible when + // the editor is reframed before sending NOTIFY_IME_OF_FOCUS asynchronously), + // the update preference of mWidget may be different from after the widget + // receives NOTIFY_IME_OF_FOCUS. So, this should be called again by + // OnIMEReceivedFocus() which is called after sending NOTIFY_IME_OF_FOCUS. + if (!mIMEHasFocus) { + MOZ_ASSERT(!mWidget || mNeedsToNotifyIMEOfFocusSet || + mSendingNotification == NOTIFY_IME_OF_FOCUS, + "Wow, OnIMEReceivedFocus() won't be called?"); + return; + } + mIsObserving = true; if (mEditor) { mEditor->AddEditorObserver(this); } mUpdatePreference = mWidget->GetIMEUpdatePreference(); if (mUpdatePreference.WantSelectionChange()) { // add selection change listener @@ -663,19 +704,24 @@ IMEContentObserver::ReflowInterruptible( MaybeNotifyIMEOfPositionChange(); return NS_OK; } nsresult IMEContentObserver::HandleQueryContentEvent(WidgetQueryContentEvent* aEvent) { // If the instance has cache, it should use the cached selection which was - // sent to the widget. + // sent to the widget. However, if this instance has already received new + // selection change notification but hasn't updated the cache yet (i.e., + // not sending selection change notification to IME, don't use the cached + // value. Note that don't update selection cache here since if you update + // selection cache here, IMENotificationSender won't notify IME of selection + // change because it looks like that the selection isn't actually changed. if (aEvent->mMessage == eQuerySelectedText && aEvent->mUseNativeLineBreak && - mSelectionData.IsValid()) { + mSelectionData.IsValid() && !mNeedsToNotifyIMEOfSelectionChange) { aEvent->mReply.mContentsRoot = mRootContent; aEvent->mReply.mHasSelection = !mSelectionData.IsCollapsed(); aEvent->mReply.mOffset = mSelectionData.mOffset; aEvent->mReply.mString = mSelectionData.String(); aEvent->mReply.mWritingMode = mSelectionData.GetWritingMode(); aEvent->mReply.mReversed = mSelectionData.mReversed; aEvent->mSucceeded = true; MOZ_LOG(sIMECOLog, LogLevel::Debug, @@ -1309,17 +1355,17 @@ IMEContentObserver::FlushMergeableNotifi return; } // Notifying something may cause nested call of this method. For example, // when somebody notified one of the notifications may dispatch query content // event. Then, it causes flushing layout which may cause another layout // change notification. - if (mIsFlushingPendingNotifications) { + if (mQueuedSender) { // So, if this is already called, this should do nothing. MOZ_LOG(sIMECOLog, LogLevel::Debug, ("IMECO: 0x%p IMEContentObserver::FlushMergeableNotifications(), " "FAILED, due to already flushing pending notifications", this)); return; } if (!NeedsToNotifyIMEOfSomething()) { @@ -1331,24 +1377,42 @@ IMEContentObserver::FlushMergeableNotifi // NOTE: Reset each pending flag because sending notification may cause // another change. MOZ_LOG(sIMECOLog, LogLevel::Debug, ("IMECO: 0x%p IMEContentObserver::FlushMergeableNotifications(), " "creating IMENotificationSender...", this)); - mIsFlushingPendingNotifications = true; - nsContentUtils::AddScriptRunner(new IMENotificationSender(this)); + // If contents in selection range is modified, the selection range still + // has removed node from the tree. In such case, nsContentIterator won't + // work well. Therefore, we shouldn't use AddScriptRunnder() here since + // it may kick runnable event immediately after DOM tree is changed but + // the selection range isn't modified yet. + mQueuedSender = new IMENotificationSender(this); + NS_DispatchToCurrentThread(mQueuedSender); MOZ_LOG(sIMECOLog, LogLevel::Debug, ("IMECO: 0x%p IMEContentObserver::FlushMergeableNotifications(), " "finished", this)); } +void +IMEContentObserver::TryToFlushPendingNotifications() +{ + if (!mQueuedSender || mSendingNotification != NOTIFY_IME_OF_NOTHING) { + return; + } + + MOZ_LOG(sIMECOLog, LogLevel::Debug, + ("IMECO: 0x%p IMEContentObserver::TryToFlushPendingNotifications(), " + "performing queued IMENotificationSender forcibly", this)); + mQueuedSender->Run(); +} + /****************************************************************************** * mozilla::IMEContentObserver::AChangeEvent ******************************************************************************/ bool IMEContentObserver::AChangeEvent::CanNotifyIME( ChangeEventType aChangeEventType) const { @@ -1405,28 +1469,56 @@ IMEContentObserver::AChangeEvent::IsSafe /****************************************************************************** * mozilla::IMEContentObserver::IMENotificationSender ******************************************************************************/ NS_IMETHODIMP IMEContentObserver::IMENotificationSender::Run() { - MOZ_ASSERT(mIMEContentObserver->mIsFlushingPendingNotifications); + if (NS_WARN_IF(mIsRunning)) { + MOZ_LOG(sIMECOLog, LogLevel::Error, + ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::Run(), FAILED, " + "called recursively", this)); + return NS_OK; + } + + AutoRestore<bool> running(mIsRunning); + mIsRunning = true; + + // This instance was already performed forcibly. + if (mIMEContentObserver->mQueuedSender != this) { + return NS_OK; + } // NOTE: Reset each pending flag because sending notification may cause // another change. if (mIMEContentObserver->mNeedsToNotifyIMEOfFocusSet) { mIMEContentObserver->mNeedsToNotifyIMEOfFocusSet = false; SendFocusSet(); + mIMEContentObserver->mQueuedSender = nullptr; + // If it's not safe to notify IME of focus, SendFocusSet() sets + // mNeedsToNotifyIMEOfFocusSet true again. For guaranteeing to send the + // focus notification later, we should put a new sender into the queue but + // this case must be rare. Note that if mIMEContentObserver is already + // destroyed, mNeedsToNotifyIMEOfFocusSet is never set true again. + if (mIMEContentObserver->mNeedsToNotifyIMEOfFocusSet) { + MOZ_ASSERT(!mIMEContentObserver->mIMEHasFocus); + MOZ_LOG(sIMECOLog, LogLevel::Debug, + ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::Run(), " + "posting IMENotificationSender to current thread", this)); + mIMEContentObserver->mQueuedSender = + new IMENotificationSender(mIMEContentObserver); + NS_DispatchToCurrentThread(mIMEContentObserver->mQueuedSender); + return NS_OK; + } // This is the first notification to IME. So, we don't need to notify // anymore since IME starts to query content after it gets focus. mIMEContentObserver->ClearPendingNotifications(); - mIMEContentObserver->mIsFlushingPendingNotifications = false; return NS_OK; } if (mIMEContentObserver->mNeedsToNotifyIMEOfTextChange) { mIMEContentObserver->mNeedsToNotifyIMEOfTextChange = false; SendTextChange(); } @@ -1449,26 +1541,26 @@ IMEContentObserver::IMENotificationSende if (!mIMEContentObserver->mNeedsToNotifyIMEOfTextChange && !mIMEContentObserver->mNeedsToNotifyIMEOfSelectionChange) { if (mIMEContentObserver->mNeedsToNotifyIMEOfPositionChange) { mIMEContentObserver->mNeedsToNotifyIMEOfPositionChange = false; SendPositionChange(); } } + mIMEContentObserver->mQueuedSender = nullptr; + // If notifications caused some new change, we should notify them now. - mIMEContentObserver->mIsFlushingPendingNotifications = - mIMEContentObserver->NeedsToNotifyIMEOfSomething(); - if (mIMEContentObserver->mIsFlushingPendingNotifications) { + if (mIMEContentObserver->NeedsToNotifyIMEOfSomething()) { MOZ_LOG(sIMECOLog, LogLevel::Debug, ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::Run(), " - "posting AsyncMergeableNotificationsFlusher to current thread", this)); - RefPtr<AsyncMergeableNotificationsFlusher> asyncFlusher = - new AsyncMergeableNotificationsFlusher(mIMEContentObserver); - NS_DispatchToCurrentThread(asyncFlusher); + "posting IMENotificationSender to current thread", this)); + mIMEContentObserver->mQueuedSender = + new IMENotificationSender(mIMEContentObserver); + NS_DispatchToCurrentThread(mIMEContentObserver->mQueuedSender); } return NS_OK; } void IMEContentObserver::IMENotificationSender::SendFocusSet() { if (!CanNotifyIME(eChangeEventType_Focus)) { @@ -1500,16 +1592,22 @@ IMEContentObserver::IMENotificationSende MOZ_RELEASE_ASSERT(mIMEContentObserver->mSendingNotification == NOTIFY_IME_OF_NOTHING); mIMEContentObserver->mSendingNotification = NOTIFY_IME_OF_FOCUS; IMEStateManager::NotifyIME(IMENotification(NOTIFY_IME_OF_FOCUS), mIMEContentObserver->mWidget); mIMEContentObserver->mSendingNotification = NOTIFY_IME_OF_NOTHING; + // nsIMEUpdatePreference referred by ObserveEditableNode() may be different + // before or after widget receives NOTIFY_IME_OF_FOCUS. Therefore, we need + // to guarantee to call ObserveEditableNode() after sending + // NOTIFY_IME_OF_FOCUS. + mIMEContentObserver->OnIMEReceivedFocus(); + MOZ_LOG(sIMECOLog, LogLevel::Debug, ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::" "SendFocusSet(), sent NOTIFY_IME_OF_FOCUS", this)); } void IMEContentObserver::IMENotificationSender::SendSelectionChange() { @@ -1663,36 +1761,9 @@ IMEContentObserver::IMENotificationSende mIMEContentObserver->mWidget); mIMEContentObserver->mSendingNotification = NOTIFY_IME_OF_NOTHING; MOZ_LOG(sIMECOLog, LogLevel::Debug, ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::" "SendPositionChange(), sent NOTIFY_IME_OF_POSITION_CHANGE", this)); } -/****************************************************************************** - * mozilla::IMEContentObserver::AsyncMergeableNotificationsFlusher - ******************************************************************************/ - -NS_IMETHODIMP -IMEContentObserver::AsyncMergeableNotificationsFlusher::Run() -{ - if (!CanNotifyIME(eChangeEventType_FlushPendingEvents)) { - MOZ_LOG(sIMECOLog, LogLevel::Debug, - ("IMECO: 0x%p IMEContentObserver::AsyncMergeableNotificationsFlusher::" - "Run(), FAILED, due to impossible to flush pending notifications", - this)); - return NS_OK; - } - - MOZ_LOG(sIMECOLog, LogLevel::Info, - ("IMECO: 0x%p IMEContentObserver::AsyncMergeableNotificationsFlusher::" - "Run(), calling FlushMergeableNotifications()...", this)); - - mIMEContentObserver->FlushMergeableNotifications(); - - MOZ_LOG(sIMECOLog, LogLevel::Debug, - ("IMECO: 0x%p IMEContentObserver::AsyncMergeableNotificationsFlusher::" - "Run(), called FlushMergeableNotifications()", this)); - return NS_OK; -} - } // namespace mozilla
--- a/dom/events/IMEContentObserver.h +++ b/dom/events/IMEContentObserver.h @@ -98,30 +98,37 @@ public: nsIWidget* GetWidget() const { return mWidget; } nsIEditor* GetEditor() const { return mEditor; } void SuppressNotifyingIME(); void UnsuppressNotifyingIME(); nsPresContext* GetPresContext() const; nsresult GetSelectionAndRoot(nsISelection** aSelection, nsIContent** aRoot) const; + /** + * TryToFlushPendingNotifications() should be called when pending events + * should be flushed. This tries to run the queued IMENotificationSender. + */ + void TryToFlushPendingNotifications(); + private: ~IMEContentObserver() {} enum State { eState_NotObserving, eState_Initializing, eState_StoppedObserving, eState_Observing }; State GetState() const; bool InitWithEditor(nsPresContext* aPresContext, nsIContent* aContent, nsIEditor* aEditor); bool InitWithPlugin(nsPresContext* aPresContext, nsIContent* aContent); bool IsInitializedWithPlugin() const { return !mEditor; } + void OnIMEReceivedFocus(); void Clear(); bool IsObservingContent(nsPresContext* aPresContext, nsIContent* aContent) const; bool IsReflowLocked() const; bool IsSafeToNotifyIME() const; bool IsEditorComposing() const; void PostFocusSetNotification(); @@ -178,16 +185,73 @@ private: nsCOMPtr<nsIWidget> mFocusedWidget; nsCOMPtr<nsISelection> mSelection; nsCOMPtr<nsIContent> mRootContent; nsCOMPtr<nsINode> mEditableNode; nsCOMPtr<nsIDocShell> mDocShell; nsCOMPtr<nsIEditor> mEditor; /** + * Helper classes to notify IME. + */ + + class AChangeEvent: public nsRunnable + { + protected: + enum ChangeEventType + { + eChangeEventType_Focus, + eChangeEventType_Selection, + eChangeEventType_Text, + eChangeEventType_Position, + eChangeEventType_FlushPendingEvents + }; + + explicit AChangeEvent(IMEContentObserver* aIMEContentObserver) + : mIMEContentObserver(aIMEContentObserver) + { + MOZ_ASSERT(mIMEContentObserver); + } + + RefPtr<IMEContentObserver> mIMEContentObserver; + + /** + * CanNotifyIME() checks if mIMEContentObserver can and should notify IME. + */ + bool CanNotifyIME(ChangeEventType aChangeEventType) const; + + /** + * IsSafeToNotifyIME() checks if it's safe to noitify IME. + */ + bool IsSafeToNotifyIME(ChangeEventType aChangeEventType) const; + }; + + class IMENotificationSender: public AChangeEvent + { + public: + explicit IMENotificationSender(IMEContentObserver* aIMEContentObserver) + : AChangeEvent(aIMEContentObserver) + , mIsRunning(false) + { + } + NS_IMETHOD Run() override; + + private: + void SendFocusSet(); + void SendSelectionChange(); + void SendTextChange(); + void SendPositionChange(); + + bool mIsRunning; + }; + + // mQueuedSender is, it was put into the event queue but not run yet. + RefPtr<IMENotificationSender> mQueuedSender; + + /** * FlatTextCache stores flat text length from start of the content to * mNodeOffset of mContainerNode. */ struct FlatTextCache { // mContainerNode and mNodeOffset represent a point in DOM tree. E.g., // if mContainerNode is a div element, mNodeOffset is index of its child. nsCOMPtr<nsINode> mContainerNode; @@ -256,83 +320,16 @@ private: IMEMessage mSendingNotification; bool mIsObserving; bool mIMEHasFocus; bool mNeedsToNotifyIMEOfFocusSet; bool mNeedsToNotifyIMEOfTextChange; bool mNeedsToNotifyIMEOfSelectionChange; bool mNeedsToNotifyIMEOfPositionChange; - // mIsFlushingPendingNotifications is true between - // FlushMergeableNotifications() creates IMENotificationSender and - // IMENotificationSender sent all pending notifications. - bool mIsFlushingPendingNotifications; // mIsHandlingQueryContentEvent is true when IMEContentObserver is handling // WidgetQueryContentEvent with ContentEventHandler. bool mIsHandlingQueryContentEvent; - - - /** - * Helper classes to notify IME. - */ - - class AChangeEvent: public nsRunnable - { - protected: - enum ChangeEventType - { - eChangeEventType_Focus, - eChangeEventType_Selection, - eChangeEventType_Text, - eChangeEventType_Position, - eChangeEventType_FlushPendingEvents - }; - - explicit AChangeEvent(IMEContentObserver* aIMEContentObserver) - : mIMEContentObserver(aIMEContentObserver) - { - MOZ_ASSERT(mIMEContentObserver); - } - - RefPtr<IMEContentObserver> mIMEContentObserver; - - /** - * CanNotifyIME() checks if mIMEContentObserver can and should notify IME. - */ - bool CanNotifyIME(ChangeEventType aChangeEventType) const; - - /** - * IsSafeToNotifyIME() checks if it's safe to noitify IME. - */ - bool IsSafeToNotifyIME(ChangeEventType aChangeEventType) const; - }; - - class IMENotificationSender: public AChangeEvent - { - public: - explicit IMENotificationSender(IMEContentObserver* aIMEContentObserver) - : AChangeEvent(aIMEContentObserver) - { - } - NS_IMETHOD Run() override; - - private: - void SendFocusSet(); - void SendSelectionChange(); - void SendTextChange(); - void SendPositionChange(); - }; - - class AsyncMergeableNotificationsFlusher : public AChangeEvent - { - public: - explicit AsyncMergeableNotificationsFlusher( - IMEContentObserver* aIMEContentObserver) - : AChangeEvent(aIMEContentObserver) - { - } - NS_IMETHOD Run() override; - }; }; } // namespace mozilla #endif // mozilla_IMEContentObserver_h_
--- a/dom/events/IMEStateManager.cpp +++ b/dom/events/IMEStateManager.cpp @@ -510,16 +510,23 @@ IMEStateManager::OnChangeFocusInternal(n sPresContext = aPresContext; sContent = aContent; // Don't call CreateIMEContentObserver() here except when a plugin gets // focus because it will be called from the focus event handler of focused // editor. if (newState.mEnabled == IMEState::PLUGIN) { CreateIMEContentObserver(nullptr); + if (sActiveIMEContentObserver) { + MOZ_LOG(sISMLog, LogLevel::Debug, + ("ISM: IMEStateManager::OnChangeFocusInternal(), an " + "IMEContentObserver instance is created for plugin and trying to " + "flush its pending notifications...")); + sActiveIMEContentObserver->TryToFlushPendingNotifications(); + } } return NS_OK; } // static void IMEStateManager::OnInstalledMenuKeyboardListener(bool aInstalling) @@ -679,16 +686,24 @@ IMEStateManager::OnFocusInEditor(nsPresC ("ISM: IMEStateManager::OnFocusInEditor(), " "the editor is already being managed by sActiveIMEContentObserver")); return; } DestroyIMEContentObserver(); } CreateIMEContentObserver(aEditor); + + // Let's flush the focus notification now. + if (sActiveIMEContentObserver) { + MOZ_LOG(sISMLog, LogLevel::Debug, + ("ISM: IMEStateManager::OnFocusInEditor(), new IMEContentObserver is " + "created, trying to flush pending notifications...")); + sActiveIMEContentObserver->TryToFlushPendingNotifications(); + } } // static void IMEStateManager::OnEditorInitialized(nsIEditor* aEditor) { if (!sActiveIMEContentObserver || sActiveIMEContentObserver->GetEditor() != aEditor) { @@ -792,16 +807,19 @@ IMEStateManager::UpdateIMEState(const IM if (updateIMEState) { InputContextAction action(InputContextAction::CAUSE_UNKNOWN, InputContextAction::FOCUS_NOT_CHANGED); SetIMEState(aNewIMEState, aContent, widget, action); } if (createTextStateManager) { + // XXX In this case, it might not be enough safe to notify IME of anything. + // So, don't try to flush pending notifications of IMEContentObserver + // here. CreateIMEContentObserver(aEditor); } } // static IMEState IMEStateManager::GetNewIMEState(nsPresContext* aPresContext, nsIContent* aContent)
--- a/dom/media/VideoUtils.h +++ b/dom/media/VideoUtils.h @@ -149,19 +149,19 @@ CheckedInt64 TimeUnitToFrames(const medi // Converts from seconds to microseconds. Returns failure if the resulting // integer is too big to fit in an int64_t. nsresult SecondsToUsecs(double aSeconds, int64_t& aOutUsecs); // The maximum height and width of the video. Used for // sanitizing the memory allocation of the RGB buffer. // The maximum resolution we anticipate encountering in the -// wild is 2160p - 3840x2160 pixels. -static const int32_t MAX_VIDEO_WIDTH = 4000; -static const int32_t MAX_VIDEO_HEIGHT = 3000; +// wild is 2160p (UHD "4K") or 4320p - 7680x4320 pixels for VR. +static const int32_t MAX_VIDEO_WIDTH = 8192; +static const int32_t MAX_VIDEO_HEIGHT = 4608; // Scales the display rect aDisplay by aspect ratio aAspectRatio. // Note that aDisplay must be validated by IsValidVideoRegion() // before being used! void ScaleDisplayByAspectRatio(nsIntSize& aDisplay, float aAspectRatio); // Downmix multichannel Audio samples to Stereo. // Input are the buffer contains multichannel data,
--- a/dom/media/eme/CDMProxy.cpp +++ b/dom/media/eme/CDMProxy.cpp @@ -565,17 +565,20 @@ CDMProxy::OnKeyStatusesChange(const nsAS } } void CDMProxy::OnExpirationChange(const nsAString& aSessionId, GMPTimestamp aExpiryTime) { MOZ_ASSERT(NS_IsMainThread()); - NS_WARNING("CDMProxy::OnExpirationChange() not implemented"); + RefPtr<dom::MediaKeySession> session(mKeys->GetSession(aSessionId)); + if (session) { + session->SetExpiration(static_cast<double>(aExpiryTime)); + } } void CDMProxy::OnSessionClosed(const nsAString& aSessionId) { MOZ_ASSERT(NS_IsMainThread()); if (mKeys.IsNull()) { return;
--- a/dom/media/eme/MediaKeySession.cpp +++ b/dom/media/eme/MediaKeySession.cpp @@ -50,16 +50,17 @@ MediaKeySession::MediaKeySession(JSConte , mKeys(aKeys) , mKeySystem(aKeySystem) , mCDMVersion(aCDMVersion) , mSessionType(aSessionType) , mToken(sMediaKeySessionNum++) , mIsClosed(false) , mUninitialized(true) , mKeyStatusMap(new MediaKeyStatusMap(aCx, aParent, aRv)) + , mExpiration(JS::GenericNaN()) { EME_LOG("MediaKeySession[%p,''] session Id set", this); MOZ_ASSERT(aParent); if (aRv.Failed()) { return; } mClosed = MakePromise(aRv, NS_LITERAL_CSTRING("MediaKeys.createSession")); @@ -109,17 +110,17 @@ JSObject* MediaKeySession::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) { return MediaKeySessionBinding::Wrap(aCx, this, aGivenProto); } double MediaKeySession::Expiration() const { - return JS::GenericNaN(); + return mExpiration; } Promise* MediaKeySession::Closed() const { return mClosed; } @@ -258,16 +259,26 @@ MediaKeySession::Load(const nsAString& a already_AddRefed<Promise> MediaKeySession::Update(const ArrayBufferViewOrArrayBuffer& aResponse, ErrorResult& aRv) { RefPtr<DetailedPromise> promise(MakePromise(aRv, NS_LITERAL_CSTRING("MediaKeySession.update"))); if (aRv.Failed()) { return nullptr; } + + if (!IsCallable()) { + // If this object's callable value is false, return a promise rejected + // with a new DOMException whose name is InvalidStateError. + EME_LOG("MediaKeySession[%p,''] Update() called before sessionId set by CDM", this); + promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR, + NS_LITERAL_CSTRING("MediaKeySession.Update() called before sessionId set by CDM")); + return promise.forget(); + } + nsTArray<uint8_t> data; if (IsClosed() || !mKeys->GetCDMProxy()) { promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR, NS_LITERAL_CSTRING("Session is closed or was not properly initialized")); EME_LOG("MediaKeySession[%p,'%s'] Update() failed, session is closed or was not properly initialised.", this, NS_ConvertUTF16toUTF8(mSessionId).get()); return promise.forget(); } @@ -303,16 +314,24 @@ MediaKeySession::Update(const ArrayBuffe already_AddRefed<Promise> MediaKeySession::Close(ErrorResult& aRv) { RefPtr<DetailedPromise> promise(MakePromise(aRv, NS_LITERAL_CSTRING("MediaKeySession.close"))); if (aRv.Failed()) { return nullptr; } + if (!IsCallable()) { + // If this object's callable value is false, return a promise rejected + // with a new DOMException whose name is InvalidStateError. + EME_LOG("MediaKeySession[%p,''] Close() called before sessionId set by CDM", this); + promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR, + NS_LITERAL_CSTRING("MediaKeySession.Close() called before sessionId set by CDM")); + return promise.forget(); + } if (IsClosed() || !mKeys->GetCDMProxy()) { EME_LOG("MediaKeySession[%p,'%s'] Close() already closed", this, NS_ConvertUTF16toUTF8(mSessionId).get()); promise->MaybeResolve(JS::UndefinedHandleValue); return promise.forget(); } PromiseId pid = mKeys->StorePromise(promise); mKeys->GetCDMProxy()->CloseSession(mSessionId, pid); @@ -346,16 +365,24 @@ MediaKeySession::IsClosed() const already_AddRefed<Promise> MediaKeySession::Remove(ErrorResult& aRv) { RefPtr<DetailedPromise> promise(MakePromise(aRv, NS_LITERAL_CSTRING("MediaKeySession.remove"))); if (aRv.Failed()) { return nullptr; } + if (!IsCallable()) { + // If this object's callable value is false, return a promise rejected + // with a new DOMException whose name is InvalidStateError. + EME_LOG("MediaKeySession[%p,''] Remove() called before sessionId set by CDM", this); + promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR, + NS_LITERAL_CSTRING("MediaKeySession.Remove() called before sessionId set by CDM")); + return promise.forget(); + } if (mSessionType != SessionType::Persistent) { promise->MaybeReject(NS_ERROR_DOM_INVALID_ACCESS_ERR, NS_LITERAL_CSTRING("Calling MediaKeySession.remove() on non-persistent session")); // "The operation is not supported on session type sessions." EME_LOG("MediaKeySession[%p,'%s'] Remove() failed, sesion not persisrtent.", this, NS_ConvertUTF16toUTF8(mSessionId).get()); return promise.forget(); } @@ -432,10 +459,20 @@ MediaKeySession::MakePromise(ErrorResult if (!global) { NS_WARNING("Passed non-global to MediaKeys ctor!"); aRv.Throw(NS_ERROR_UNEXPECTED); return nullptr; } return DetailedPromise::Create(global, aRv, aName); } +void +MediaKeySession::SetExpiration(double aExpiration) +{ + EME_LOG("MediaKeySession[%p,'%s'] SetExpiry(%lf)", + this, + NS_ConvertUTF16toUTF8(mSessionId).get(), + aExpiration); + mExpiration = aExpiration; +} + } // namespace dom } // namespace mozilla
--- a/dom/media/eme/MediaKeySession.h +++ b/dom/media/eme/MediaKeySession.h @@ -87,36 +87,47 @@ public: void DispatchKeyError(uint32_t system_code); void DispatchKeyStatusesChange(); void OnClosed(); bool IsClosed() const; + void SetExpiration(double aExpiry); + // Process-unique identifier. uint32_t Token() const; private: ~MediaKeySession(); void UpdateKeyStatusMap(); + + bool IsCallable() const { + // The EME spec sets the "callable value" to true whenever the CDM sets + // the sessionId. When the session is initialized, sessionId is empty and + // callable is thus false. + return !mSessionId.IsEmpty(); + } + already_AddRefed<DetailedPromise> MakePromise(ErrorResult& aRv, const nsACString& aName); RefPtr<DetailedPromise> mClosed; RefPtr<MediaKeyError> mMediaKeyError; RefPtr<MediaKeys> mKeys; const nsString mKeySystem; const nsString mCDMVersion; nsString mSessionId; const SessionType mSessionType; const uint32_t mToken; bool mIsClosed; bool mUninitialized; RefPtr<MediaKeyStatusMap> mKeyStatusMap; + double mExpiration; }; } // namespace dom } // namespace mozilla #endif
--- a/dom/media/test/mochitest.ini +++ b/dom/media/test/mochitest.ini @@ -611,16 +611,17 @@ skip-if = (toolkit == 'android' && proce [test_currentTime.html] [test_decode_error.html] [test_decoder_disable.html] [test_defaultMuted.html] [test_delay_load.html] skip-if = buildapp == 'b2g' && toolkit != 'gonk' # bug 1082984 [test_dormant_playback.html] skip-if = (os == 'win' && os_version == '5.1') || (os != 'win' && toolkit != 'gonk') +[test_eme_session_callable_value.html] [test_eme_canvas_blocked.html] skip-if = toolkit == 'android' # bug 1149374 [test_eme_non_mse_fails.html] skip-if = toolkit == 'android' # bug 1149374 [test_eme_request_notifications.html] skip-if = toolkit == 'android' # bug 1149374 [test_eme_persistent_sessions.html] skip-if = toolkit == 'android' # bug 1149374
new file mode 100644 --- /dev/null +++ b/dom/media/test/test_eme_session_callable_value.html @@ -0,0 +1,35 @@ +<!DOCTYPE HTML> +<html> +<head> + <title>Test Encrypted Media Extensions</title> + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> + <script type="text/javascript" src="manifest.js"></script> + <script type="text/javascript" src="eme.js"></script> +</head> +<body> +<pre id="test"> +<script class="testbody" type="text/javascript"> + +function Test() { + navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{ initDataTypes: ['cenc'] }]) + .then(access => access.createMediaKeys()) + .then(mediaKeys => { + var initData = (new TextEncoder()).encode( 'this is an invalid license, and that is ok'); + var s = mediaKeys.createSession("temporary"); + s.generateRequest("cenc", initData); // ignore result. + // "update()" call should fail, because MediaKeySession is "not callable" + // yet, since CDM won't have had a chance to set the sessionId on MediaKeySession. + return s.update(initData); + }) + .then(()=>{ok(false, "An exception should be thrown; MediaKeySession should be not callable."); SimpleTest.finish();}, + ()=>{ok(true, "We expect this to fail; MediaKeySession should be not callable."); SimpleTest.finish();}); +} + +SimpleTest.waitForExplicitFinish(); +SetupEMEPref(Test); + +</script> +</pre> +</body> +</html>
--- a/dom/media/webvtt/update-webvtt.js +++ b/dom/media/webvtt/update-webvtt.js @@ -4,31 +4,36 @@ var gift = require('gift'), argv = require('optimist') .usage('Update vtt.jsm with the latest from a vtt.js directory.\nUsage:' + ' $0 -d [dir]') .demand('d') .options('d', { alias: 'dir', describe: 'Path to WebVTT directory.' }) + .options('r', { + alias: 'rev', + describe: 'Revision to update to.', + default: 'master' + }) .options('w', { alias: 'write', describe: 'Path to file to write to.', default: "./vtt.jsm" }) .argv; var repo = gift(argv.d); repo.status(function(err, status) { if (!status.clean) { console.log("The repository's working directory is not clean. Aborting."); process.exit(1); } - repo.checkout("master", function() { - repo.commits("master", 1, function(err, commits) { + repo.checkout(argv.r, function() { + repo.commits(argv.r, 1, function(err, commits) { var vttjs = fs.readFileSync(argv.d + "/lib/vtt.js", 'utf8'); // Remove settings for VIM and Emacs. vttjs = vttjs.replace(/\/\* -\*-.*-\*- \*\/\n/, ''); vttjs = vttjs.replace(/\/\* vim:.* \*\/\n/, ''); // Concatenate header and vttjs code. vttjs =
--- a/dom/media/webvtt/vtt.jsm +++ b/dom/media/webvtt/vtt.jsm @@ -3,17 +3,17 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ this.EXPORTED_SYMBOLS = ["WebVTT"]; /** * Code below is vtt.js the JS WebVTT implementation. * Current source code can be found at http://github.com/mozilla/vtt.js * - * Code taken from commit f5a1a60775a615cd9670d6cdaedddf2c6f25fae3 + * Code taken from commit 364c6b951a07306848a706d1d03c2a6ae942517d */ /** * Copyright 2013 vtt.js Contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * @@ -721,48 +721,70 @@ this.EXPORTED_SYMBOLS = ["WebVTT"]; StyleBox.prototype.formatStyle = function(val, unit) { return val === 0 ? 0 : val + unit; }; // Constructs the computed display state of the cue (a div). Places the div // into the overlay which should be a block level element (usually a div). function CueStyleBox(window, cue, styleOptions) { + var isIE8 = (/MSIE\s8\.0/).test(navigator.userAgent); + var color = "rgba(255, 255, 255, 1)"; + var backgroundColor = "rgba(0, 0, 0, 0.8)"; + + if (isIE8) { + color = "rgb(255, 255, 255)"; + backgroundColor = "rgb(0, 0, 0)"; + } + StyleBox.call(this); this.cue = cue; // Parse our cue's text into a DOM tree rooted at 'cueDiv'. This div will // have inline positioning and will function as the cue background box. this.cueDiv = parseContent(window, cue.text); - this.applyStyles({ - color: "rgba(255, 255, 255, 1)", - backgroundColor: "rgba(0, 0, 0, 0.8)", + var styles = { + color: color, + backgroundColor: backgroundColor, position: "relative", left: 0, right: 0, top: 0, bottom: 0, display: "inline" - }, this.cueDiv); + }; + + if (!isIE8) { + styles.writingMode = cue.vertical === "" ? "horizontal-tb" + : cue.vertical === "lr" ? "vertical-lr" + : "vertical-rl"; + styles.unicodeBidi = "plaintext"; + } + this.applyStyles(styles, this.cueDiv); // Create an absolutely positioned div that will be used to position the cue // div. Note, all WebVTT cue-setting alignments are equivalent to the CSS // mirrors of them except "middle" which is "center" in CSS. this.div = window.document.createElement("div"); - this.applyStyles({ + styles = { textAlign: cue.align === "middle" ? "center" : cue.align, - direction: determineBidi(this.cueDiv), - writingMode: cue.vertical === "" ? "horizontal-tb" - : cue.vertical === "lr" ? "vertical-lr" - : "vertical-rl", - unicodeBidi: "plaintext", font: styleOptions.font, whiteSpace: "pre-line", position: "absolute" - }); + }; + + if (!isIE8) { + styles.direction = determineBidi(this.cueDiv); + styles.writingMode = cue.vertical === "" ? "horizontal-tb" + : cue.vertical === "lr" ? "vertical-lr" + : "vertical-rl". + stylesunicodeBidi = "plaintext"; + } + + this.applyStyles(styles); this.div.appendChild(this.cueDiv); // Calculate the distance from the reference edge of the viewport to the text // position of the cue box. The reference edge will be resolved later when // the box orientation styles are applied. var textPos = 0; switch (cue.positionAlign) { @@ -778,17 +800,17 @@ this.EXPORTED_SYMBOLS = ["WebVTT"]; } // Horizontal box orientation; textPos is the distance from the left edge of the // area to the left edge of the box and cue.size is the distance extending to // the right from there. if (cue.vertical === "") { this.applyStyles({ left: this.formatStyle(textPos, "%"), - width: this.formatStyle(cue.size, "%"), + width: this.formatStyle(cue.size, "%") }); // Vertical box orientation; textPos is the distance from the top edge of the // area to the top edge of the box and cue.size is the height extending // downwards from there. } else { this.applyStyles({ top: this.formatStyle(textPos, "%"), height: this.formatStyle(cue.size, "%") @@ -797,50 +819,61 @@ this.EXPORTED_SYMBOLS = ["WebVTT"]; this.move = function(box) { this.applyStyles({ top: this.formatStyle(box.top, "px"), bottom: this.formatStyle(box.bottom, "px"), left: this.formatStyle(box.left, "px"), right: this.formatStyle(box.right, "px"), height: this.formatStyle(box.height, "px"), - width: this.formatStyle(box.width, "px"), + width: this.formatStyle(box.width, "px") }); }; } CueStyleBox.prototype = _objCreate(StyleBox.prototype); CueStyleBox.prototype.constructor = CueStyleBox; // Represents the co-ordinates of an Element in a way that we can easily // compute things with such as if it overlaps or intersects with another Element. // Can initialize it with either a StyleBox or another BoxPosition. function BoxPosition(obj) { + var isIE8 = (/MSIE\s8\.0/).test(navigator.userAgent); + // Either a BoxPosition was passed in and we need to copy it, or a StyleBox // was passed in and we need to copy the results of 'getBoundingClientRect' // as the object returned is readonly. All co-ordinate values are in reference // to the viewport origin (top left). - var lh; + var lh, height, width, top; if (obj.div) { + height = obj.div.offsetHeight; + width = obj.div.offsetWidth; + top = obj.div.offsetTop; + var rects = (rects = obj.div.childNodes) && (rects = rects[0]) && rects.getClientRects && rects.getClientRects(); obj = obj.div.getBoundingClientRect(); // In certain cases the outter div will be slightly larger then the sum of // the inner div's lines. This could be due to bold text, etc, on some platforms. // In this case we should get the average line height and use that. This will // result in the desired behaviour. lh = rects ? Math.max((rects[0] && rects[0].height) || 0, obj.height / rects.length) : 0; + } this.left = obj.left; this.right = obj.right; - this.top = obj.top; - this.height = obj.height; - this.bottom = obj.bottom; - this.width = obj.width; + this.top = obj.top || top; + this.height = obj.height || height; + this.bottom = obj.bottom || (top + (obj.height || height)); + this.width = obj.width || width; this.lineHeight = lh !== undefined ? lh : obj.lineHeight; + + if (isIE8 && !this.lineHeight) { + this.lineHeight = 13; + } } // Move the box along a particular axis. Optionally pass in an amount to move // the box. If no amount is passed then the default is the line height of the // box. BoxPosition.prototype.move = function(axis, toMove) { toMove = toMove !== undefined ? toMove : this.lineHeight; switch (axis) { @@ -928,26 +961,31 @@ this.EXPORTED_SYMBOLS = ["WebVTT"]; height: this.height, width: this.width }; }; // Get an object that represents the box's position without anything extra. // Can pass a StyleBox, HTMLElement, or another BoxPositon. BoxPosition.getSimpleBoxPosition = function(obj) { + var height = obj.div ? obj.div.offsetHeight : obj.tagName ? obj.offsetHeight : 0; + var width = obj.div ? obj.div.offsetWidth : obj.tagName ? obj.offsetWidth : 0; + var top = obj.div ? obj.div.offsetTop : obj.tagName ? obj.offsetTop : 0; + obj = obj.div ? obj.div.getBoundingClientRect() : obj.tagName ? obj.getBoundingClientRect() : obj; - return { + var ret = { left: obj.left, right: obj.right, - top: obj.top, - height: obj.height, - bottom: obj.bottom, - width: obj.width + top: obj.top || top, + height: obj.height || height, + bottom: obj.bottom || (top + (obj.height || height)), + width: obj.width || width }; + return ret; }; // Move a StyleBox to its specified, or next best, position. The containerBox // is the box that contains the StyleBox, such as a div. boxPositions are // a list of other boxes that the styleBox can't overlap with. function moveBoxToLinePosition(window, styleBox, containerBox, boxPositions) { // Find the best position for a cue box, b, on the video. The axis parameter @@ -1136,43 +1174,49 @@ this.EXPORTED_SYMBOLS = ["WebVTT"]; return true; } } return false; } // We don't need to recompute the cues' display states. Just reuse them. if (!shouldCompute(cues)) { - cues.forEach(function(cue) { - paddedOverlay.appendChild(cue.displayState); - }); + for (var i = 0; i < cues.length; i++) { + paddedOverlay.appendChild(cues[i].displayState); + } return; } var boxPositions = [], containerBox = BoxPosition.getSimpleBoxPosition(paddedOverlay), fontSize = Math.round(containerBox.height * FONT_SIZE_PERCENT * 100) / 100; var styleOptions = { font: fontSize + "px " + FONT_STYLE }; - cues.forEach(function(cue) { - // Compute the intial position and styles of the cue div. - var styleBox = new CueStyleBox(window, cue, styleOptions); - paddedOverlay.appendChild(styleBox.div); + (function() { + var styleBox, cue; + + for (var i = 0; i < cues.length; i++) { + cue = cues[i]; + + // Compute the intial position and styles of the cue div. + styleBox = new CueStyleBox(window, cue, styleOptions); + paddedOverlay.appendChild(styleBox.div); - // Move the cue div to it's correct line position. - moveBoxToLinePosition(window, styleBox, containerBox, boxPositions); + // Move the cue div to it's correct line position. + moveBoxToLinePosition(window, styleBox, containerBox, boxPositions); - // Remember the computed div so that we don't have to recompute it later - // if we don't have too. - cue.displayState = styleBox.div; + // Remember the computed div so that we don't have to recompute it later + // if we don't have too. + cue.displayState = styleBox.div; - boxPositions.push(BoxPosition.getSimpleBoxPosition(styleBox)); - }); + boxPositions.push(BoxPosition.getSimpleBoxPosition(styleBox)); + } + })(); }; WebVTT.Parser = function(window, decoder) { this.window = window; this.state = "INITIAL"; this.buffer = ""; this.decoder = decoder || new TextDecoder("utf8"); this.regionList = [];
--- a/dom/push/Push.js +++ b/dom/push/Push.js @@ -1,76 +1,72 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; -// Don't modify this, instead set dom.push.debug. -var gDebuggingEnabled = false; - -function debug(s) { - if (gDebuggingEnabled) - dump("-*- Push.js: " + s + "\n"); -} - const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; const Cr = Components.results; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/DOMRequestHelper.jsm"); +XPCOMUtils.defineLazyGetter(this, "console", () => { + let {ConsoleAPI} = Cu.import("resource://gre/modules/Console.jsm", {}); + return new ConsoleAPI({ + maxLogLevelPref: "dom.push.loglevel", + prefix: "Push", + }); +}); + const PUSH_CID = Components.ID("{cde1d019-fad8-4044-b141-65fb4fb7a245}"); /** * The Push component runs in the child process and exposes the SimplePush API * to the web application. The PushService running in the parent process is the * one actually performing all operations. */ function Push() { - debug("Push Constructor"); + console.debug("Push()"); } Push.prototype = { __proto__: DOMRequestIpcHelper.prototype, contractID: "@mozilla.org/push/PushManager;1", classID : PUSH_CID, QueryInterface : XPCOMUtils.generateQI([Ci.nsIDOMGlobalPropertyInitializer, Ci.nsISupportsWeakReference, Ci.nsIObserver]), init: function(aWindow) { - // Set debug first so that all debugging actually works. - // NOTE: We don't add an observer here like in PushService. Flipping the - // pref will require a reload of the app/page, which seems acceptable. - gDebuggingEnabled = Services.prefs.getBoolPref("dom.push.debug"); - debug("init()"); + console.debug("init()"); this._window = aWindow; this.initDOMRequestHelper(aWindow); this._principal = aWindow.document.nodePrincipal; this._client = Cc["@mozilla.org/push/PushClient;1"].createInstance(Ci.nsIPushClient); }, setScope: function(scope){ - debug('setScope ' + scope); + console.debug("setScope()", scope); this._scope = scope; }, askPermission: function (aAllowCallback, aCancelCallback) { - debug("askPermission"); + console.debug("askPermission()"); return this.createPromise((resolve, reject) => { let permissionDenied = () => { reject(new this._window.DOMException( "User denied permission to use the Push API", "PermissionDeniedError" )); }; @@ -89,39 +85,39 @@ Push.prototype = { permissionDenied(); } else { this._requestPermission(resolve, permissionDenied); } }); }, subscribe: function() { - debug("subscribe()"); + console.debug("subscribe()", this._scope); let histogram = Services.telemetry.getHistogramById("PUSH_API_USED"); histogram.add(true); return this.askPermission().then(() => this.createPromise((resolve, reject) => { let callback = new PushEndpointCallback(this, resolve, reject); this._client.subscribe(this._scope, this._principal, callback); }) ); }, getSubscription: function() { - debug("getSubscription()" + this._scope); + console.debug("getSubscription()", this._scope); return this.createPromise((resolve, reject) => { let callback = new PushEndpointCallback(this, resolve, reject); this._client.getSubscription(this._scope, this._principal, callback); }); }, permissionState: function() { - debug("permissionState()" + this._scope); + console.debug("permissionState()", this._scope); return this.createPromise((resolve, reject) => { let permission = Ci.nsIPermissionManager.UNKNOWN_ACTION; try { permission = this._testPermission(); } catch(e) { reject();
--- a/dom/push/PushClient.js +++ b/dom/push/PushClient.js @@ -1,43 +1,41 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; -// Don't modify this, instead set dom.push.debug. -var gDebuggingEnabled = false; - -function debug(s) { - if (gDebuggingEnabled) - dump("-*- PushClient.js: " + s + "\n"); -} - const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; const Cr = Components.results; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); -gDebuggingEnabled = Services.prefs.getBoolPref("dom.push.debug"); +XPCOMUtils.defineLazyGetter(this, "console", () => { + let {ConsoleAPI} = Cu.import("resource://gre/modules/Console.jsm", {}); + return new ConsoleAPI({ + maxLogLevelPref: "dom.push.loglevel", + prefix: "PushClient", + }); +}); const kMessages = [ "PushService:Register:OK", "PushService:Register:KO", "PushService:Registration:OK", "PushService:Registration:KO", "PushService:Unregister:OK", "PushService:Unregister:KO", ]; this.PushClient = function PushClient() { - debug("PushClient created!"); + console.debug("PushClient()"); this._cpmm = Cc["@mozilla.org/childprocessmessagemanager;1"] .getService(Ci.nsISyncMessageSender); this._requests = {}; this.addListeners(); }; PushClient.prototype = { classID: Components.ID("{16042199-bec0-484a-9640-25ecc0c0a149}"), @@ -68,97 +66,95 @@ PushClient.prototype = { addListeners: function() { for (let message of kMessages) { this._cpmm.addWeakMessageListener(message, this); } }, subscribe: function(scope, principal, callback) { - debug("subscribe() " + scope); + console.debug("subscribe()", scope); let requestId = this.addRequest(callback); this._cpmm.sendAsyncMessage("Push:Register", { scope: scope, requestID: requestId, }, null, principal); }, unsubscribe: function(scope, principal, callback) { - debug("unsubscribe() " + scope); + console.debug("unsubscribe()", scope); let requestId = this.addRequest(callback); this._cpmm.sendAsyncMessage("Push:Unregister", { scope: scope, requestID: requestId, }, null, principal); }, getSubscription: function(scope, principal, callback) { - debug("getSubscription()" + scope); + console.debug("getSubscription()", scope); let requestId = this.addRequest(callback); - debug("Going to send " + scope + " " + principal + " " + requestId); + console.debug("getSubscription: Going to send", scope, principal, + requestId); this._cpmm.sendAsyncMessage("Push:Registration", { scope: scope, requestID: requestId, }, null, principal); }, _deliverPushEndpoint: function(request, registration) { + if (!registration) { + request.onPushEndpoint(Cr.NS_OK, "", 0, null); + return; + } if (registration.p256dhKey) { let key = new Uint8Array(registration.p256dhKey); request.onPushEndpoint(Cr.NS_OK, registration.pushEndpoint, key.length, key); return; } request.onPushEndpoint(Cr.NS_OK, registration.pushEndpoint, 0, null); }, receiveMessage: function(aMessage) { + console.debug("receiveMessage()", aMessage); let json = aMessage.data; let request = this.takeRequest(json.requestID); if (!request) { + console.error("receiveMessage: Unknown request ID", json.requestID); return; } - debug("receiveMessage(): " + JSON.stringify(aMessage)) switch (aMessage.name) { case "PushService:Register:OK": - this._deliverPushEndpoint(request, json); - break; - case "PushService:Register:KO": - request.onPushEndpoint(Cr.NS_ERROR_FAILURE, "", 0, null); + case "PushService:Registration:OK": + this._deliverPushEndpoint(request, json.result); break; - case "PushService:Registration:OK": - { - let endpoint = ""; - if (!json.registration) { - request.onPushEndpoint(Cr.NS_OK, "", 0, null); - } else { - this._deliverPushEndpoint(request, json.registration); - } - break; - } + + case "PushService:Register:KO": case "PushService:Registration:KO": request.onPushEndpoint(Cr.NS_ERROR_FAILURE, "", 0, null); break; + case "PushService:Unregister:OK": if (typeof json.result !== "boolean") { - debug("Expected boolean result from PushService!"); + console.error("receiveMessage: Expected boolean for unregister response", + json.result); request.onUnsubscribe(Cr.NS_ERROR_FAILURE, false); return; } request.onUnsubscribe(Cr.NS_OK, json.result); break; case "PushService:Unregister:KO": request.onUnsubscribe(Cr.NS_ERROR_FAILURE, false); break; default: - debug("NOT IMPLEMENTED! receiveMessage for " + aMessage.name); + console.error("receiveMessage: NOT IMPLEMENTED!", aMessage.name); } }, }; this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PushClient]);
--- a/dom/push/PushDB.jsm +++ b/dom/push/PushDB.jsm @@ -1,44 +1,40 @@ /* jshint moz: true, esnext: true */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; -// Don't modify this, instead set dom.push.debug. -var gDebuggingEnabled = false; - -function debug(s) { - if (gDebuggingEnabled) { - dump("-*- PushDB.jsm: " + s + "\n"); - } -} - const Cu = Components.utils; Cu.import("resource://gre/modules/IndexedDBHelper.jsm"); Cu.import("resource://gre/modules/Preferences.jsm"); +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.importGlobalProperties(["indexedDB"]); -const prefs = new Preferences("dom.push."); - this.EXPORTED_SYMBOLS = ["PushDB"]; +XPCOMUtils.defineLazyGetter(this, "console", () => { + let {ConsoleAPI} = Cu.import("resource://gre/modules/Console.jsm", {}); + return new ConsoleAPI({ + maxLogLevelPref: "dom.push.loglevel", + prefix: "PushDB", + }); +}); + this.PushDB = function PushDB(dbName, dbVersion, dbStoreName, keyPath, model) { - debug("PushDB()"); + console.debug("PushDB()"); this._dbStoreName = dbStoreName; this._keyPath = keyPath; this._model = model; // set the indexeddb database this.initDBHelper(dbName, dbVersion, [dbStoreName]); - gDebuggingEnabled = prefs.get("debug"); - prefs.observe("debug", this); }; this.PushDB.prototype = { __proto__: IndexedDBHelper.prototype, toPushRecord: function(record) { if (!record) { return; @@ -85,145 +81,134 @@ this.PushDB.prototype = { }, /* * @param aRecord * The record to be added. */ put: function(aRecord) { - debug("put()" + JSON.stringify(aRecord)); + console.debug("put()", aRecord); if (!this.isValidRecord(aRecord)) { return Promise.reject(new TypeError( "Scope, originAttributes, and quota are required! " + JSON.stringify(aRecord) ) ); } return new Promise((resolve, reject) => this.newTxn( "readwrite", this._dbStoreName, (aTxn, aStore) => { aTxn.result = undefined; aStore.put(aRecord).onsuccess = aEvent => { - debug("Request successful. Updated record ID: " + - aEvent.target.result); + console.debug("put: Request successful. Updated record", + aEvent.target.result); aTxn.result = this.toPushRecord(aRecord); }; }, resolve, reject ) ); }, /* * @param aKeyID * The ID of record to be deleted. */ delete: function(aKeyID) { - debug("delete()"); + console.debug("delete()"); return new Promise((resolve, reject) => this.newTxn( "readwrite", this._dbStoreName, function txnCb(aTxn, aStore) { - debug("Going to delete " + aKeyID); + console.debug("delete: Removing record", aKeyID); aStore.delete(aKeyID); }, resolve, reject ) ); }, - clearAll: function clear() { - return new Promise((resolve, reject) => - this.newTxn( - "readwrite", - this._dbStoreName, - function (aTxn, aStore) { - debug("Going to clear all!"); - aStore.clear(); - }, - resolve, - reject - ) - ); - }, - // testFn(record) is called with a database record and should return true if // that record should be deleted. clearIf: function(testFn) { - debug("clearIf()"); + console.debug("clearIf()"); return new Promise((resolve, reject) => this.newTxn( "readwrite", this._dbStoreName, (aTxn, aStore) => { aTxn.result = undefined; aStore.openCursor().onsuccess = event => { let cursor = event.target.result; if (cursor) { - if (testFn(this.toPushRecord(cursor.value))) { + let record = this.toPushRecord(cursor.value); + if (testFn(record)) { let deleteRequest = cursor.delete(); deleteRequest.onerror = e => { - debug("Failed to delete entry even when test succeeded!"); + console.error("clearIf: Error removing record", + record.keyID, e); } } cursor.continue(); } } }, resolve, reject ) ); }, getByPushEndpoint: function(aPushEndpoint) { - debug("getByPushEndpoint()"); + console.debug("getByPushEndpoint()"); return new Promise((resolve, reject) => this.newTxn( "readonly", this._dbStoreName, (aTxn, aStore) => { aTxn.result = undefined; let index = aStore.index("pushEndpoint"); index.get(aPushEndpoint).onsuccess = aEvent => { - aTxn.result = this.toPushRecord(aEvent.target.result); - debug("Fetch successful " + aEvent.target.result); + let record = this.toPushRecord(aEvent.target.result); + console.debug("getByPushEndpoint: Got record", record); + aTxn.result = record; }; }, resolve, reject ) ); }, getByKeyID: function(aKeyID) { - debug("getByKeyID()"); + console.debug("getByKeyID()"); return new Promise((resolve, reject) => this.newTxn( "readonly", this._dbStoreName, (aTxn, aStore) => { aTxn.result = undefined; aStore.get(aKeyID).onsuccess = aEvent => { - aTxn.result = this.toPushRecord(aEvent.target.result); - debug("Fetch successful " + aEvent.target.result); + let record = this.toPushRecord(aEvent.target.result); + console.debug("getByKeyID: Got record", record); + aTxn.result = record; }; }, resolve, reject ) ); }, @@ -237,17 +222,17 @@ this.PushDB.prototype = { * registration record as its argument, and returns a new record. The record * will not be updated if the function returns `null`, `undefined`, or an * invalid record. If the function returns `false`, the record will be * dropped. * @returns {Promise} A promise that resolves once all records have been * updated. */ updateByOrigin: function(origin, originAttributes, updateFunc) { - debug("updateByOrigin()"); + console.debug("updateByOrigin()"); return new Promise((resolve, reject) => this.newTxn( "readwrite", this._dbStoreName, (aTxn, aStore) => { aTxn.result = []; @@ -259,44 +244,43 @@ this.PushDB.prototype = { index.openCursor(range).onsuccess = event => { let cursor = event.target.result; if (!cursor) { return; } let record = this.toPushRecord(cursor.value); let newRecord = updateFunc(record); if (newRecord === false) { - debug("updateByOrigin: Removing record for key ID " + + console.debug("updateByOrigin: Removing record for key ID", record.keyID); cursor.delete(); } else if (this.isValidRecord(newRecord)) { - debug("updateByOrigin: Updating record for key ID " + - record.keyID); + console.debug("updateByOrigin: Updating record for key ID", + record.keyID, newRecord); cursor.update(newRecord); } else { - debug("updateByOrigin: Ignoring invalid update for key ID " + - record.keyID + ": " + JSON.stringify(newRecord)); + console.error("updateByOrigin: Ignoring invalid update for record", + record.keyID, newRecord); } cursor.continue(); }; }, resolve, reject ) ); }, // Perform a unique match against { scope, originAttributes } getByIdentifiers: function(aPageRecord) { - debug("getByIdentifiers() { " + aPageRecord.scope + ", " + - JSON.stringify(aPageRecord.originAttributes) + " }"); + console.debug("getByIdentifiers()", aPageRecord); if (!aPageRecord.scope || aPageRecord.originAttributes == undefined) { - return Promise.reject( - new TypeError("Scope and originAttributes are required! " + - JSON.stringify(aPageRecord))); + console.error("getByIdentifiers: Scope and originAttributes are required", + aPageRecord); + return Promise.reject(new TypeError("Invalid page record")); } return new Promise((resolve, reject) => this.newTxn( "readonly", this._dbStoreName, (aTxn, aStore) => { aTxn.result = undefined; @@ -341,17 +325,17 @@ this.PushDB.prototype = { getAllByOriginAttributes: function(aOriginAttributes) { if (typeof aOriginAttributes !== "string") { return Promise.reject("Expected string!"); } return this._getAllByKey("originAttributes", aOriginAttributes); }, getAllKeyIDs: function() { - debug("getAllKeyIDs()"); + console.debug("getAllKeyIDs()"); return new Promise((resolve, reject) => this.newTxn( "readonly", this._dbStoreName, (aTxn, aStore) => { aTxn.result = undefined; aStore.mozGetAll().onsuccess = event => { @@ -361,17 +345,17 @@ this.PushDB.prototype = { }, resolve, reject ) ); }, _getAllByPushQuota: function(range) { - debug("getAllByPushQuota()"); + console.debug("getAllByPushQuota()"); return new Promise((resolve, reject) => this.newTxn( "readonly", this._dbStoreName, (aTxn, aStore) => { aTxn.result = []; @@ -386,22 +370,22 @@ this.PushDB.prototype = { }, resolve, reject ) ); }, getAllUnexpired: function() { - debug("getAllUnexpired()"); + console.debug("getAllUnexpired()"); return this._getAllByPushQuota(IDBKeyRange.lowerBound(1)); }, getAllExpired: function() { - debug("getAllExpired()"); + console.debug("getAllExpired()"); return this._getAllByPushQuota(IDBKeyRange.only(0)); }, /** * Updates an existing push registration. * * @param {String} aKeyID The registration ID. * @param {Function} aUpdateFunc A function that receives the existing @@ -417,50 +401,45 @@ this.PushDB.prototype = { "readwrite", this._dbStoreName, (aTxn, aStore) => { aStore.get(aKeyID).onsuccess = aEvent => { aTxn.result = undefined; let record = aEvent.target.result; if (!record) { - debug("update: Key ID " + aKeyID + " does not exist"); + console.error("update: Record does not exist", aKeyID); return; } let newRecord = aUpdateFunc(this.toPushRecord(record)); if (!this.isValidRecord(newRecord)) { - debug("update: Ignoring invalid update for key ID " + aKeyID + - ": " + JSON.stringify(newRecord)); + console.error("update: Ignoring invalid update", + aKeyID, newRecord); return; } aStore.put(newRecord).onsuccess = aEvent => { - debug("update: Update successful for key ID " + aKeyID); + console.debug("update: Update successful", aKeyID, newRecord); aTxn.result = newRecord; }; }; }, resolve, reject ) ); }, drop: function() { - debug("drop()"); + console.debug("drop()"); return new Promise((resolve, reject) => this.newTxn( "readwrite", this._dbStoreName, function txnCb(aTxn, aStore) { aStore.clear(); }, resolve, reject ) ); }, - - observe: function observe(aSubject, aTopic, aData) { - if ((aTopic == "nsPref:changed") && (aData == "dom.push.debug")) - gDebuggingEnabled = prefs.get("debug"); - } };
--- a/dom/push/PushNotificationService.js +++ b/dom/push/PushNotificationService.js @@ -34,29 +34,29 @@ PushNotificationService.prototype = { contractID: "@mozilla.org/push/NotificationService;1", _xpcom_factory: XPCOMUtils.generateSingletonFactory(PushNotificationService), QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference, Ci.nsIPushNotificationService]), register: function register(scope, originAttributes) { - return PushService._register({ + return PushService.register({ scope: scope, originAttributes: originAttributes, maxQuota: Infinity, }); }, unregister: function unregister(scope, originAttributes) { - return PushService._unregister({scope, originAttributes}); + return PushService.unregister({scope, originAttributes}); }, registration: function registration(scope, originAttributes) { - return PushService._registration({scope, originAttributes}); + return PushService.registration({scope, originAttributes}); }, clearAll: function clearAll() { return PushService._clearAll(); }, clearForDomain: function(domain) { return PushService._clearForDomain(domain);
--- a/dom/push/PushService.jsm +++ b/dom/push/PushService.jsm @@ -1,24 +1,15 @@ /* jshint moz: true, esnext: true */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; -// Don't modify this, instead set dom.push.debug. -var gDebuggingEnabled = false; - -function debug(s) { - if (gDebuggingEnabled) { - dump("-*- PushService.jsm: " + s + "\n"); - } -} - const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; const Cr = Components.results; const {PushDB} = Cu.import("resource://gre/modules/PushDB.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); @@ -33,19 +24,25 @@ const {PushCrypto} = Cu.import("resource // Currently supported protocols: WebSocket. const CONNECTION_PROTOCOLS = [PushServiceWebSocket, PushServiceHttp2]; XPCOMUtils.defineLazyModuleGetter(this, "AlarmService", "resource://gre/modules/AlarmService.jsm"); this.EXPORTED_SYMBOLS = ["PushService"]; +XPCOMUtils.defineLazyGetter(this, "console", () => { + let {ConsoleAPI} = Cu.import("resource://gre/modules/Console.jsm", {}); + return new ConsoleAPI({ + maxLogLevelPref: "dom.push.loglevel", + prefix: "PushService", + }); +}); + const prefs = new Preferences("dom.push."); -// Set debug first so that all debugging actually works. -gDebuggingEnabled = prefs.get("debug"); const kCHILD_PROCESS_MESSAGES = ["Push:Register", "Push:Unregister", "Push:Registration", "Push:RegisterEventNotificationListener", "child-process-shutdown"]; const PUSH_SERVICE_UNINIT = 0; const PUSH_SERVICE_INIT = 1; // No serverURI const PUSH_SERVICE_ACTIVATING = 2;//activating db @@ -115,17 +112,17 @@ this.PushService = { // Pending request. If a worker try to register for the same scope again, do // not send a new registration request. Therefore we need queue of pending // register requests. This is the list of scopes which pending registration. _pendingRegisterRequest: {}, _notifyActivated: null, _activated: null, _checkActivated: function() { if (this._state < PUSH_SERVICE_ACTIVATING) { - return Promise.reject({state: 0, error: "Service not active"}); + return Promise.reject(new Error("Push service not active")); } else if (this._state > PUSH_SERVICE_ACTIVATING) { return Promise.resolve(); } else { return (this._activated) ? this._activated : this._activated = new Promise((res, rej) => this._notifyActivated = {resolve: res, reject: rej}); } @@ -147,41 +144,41 @@ this.PushService = { _deletePendingRequest: function(aPageRecord) { let key = this._makePendingKey(aPageRecord); if (this._pendingRegisterRequest[key]) { delete this._pendingRegisterRequest[key]; } }, _setState: function(aNewState) { - debug("new state: " + aNewState + " old state: " + this._state); + console.debug("setState()", "new state", aNewState, "old state", this._state); if (this._state == aNewState) { return; } if (this._state == PUSH_SERVICE_ACTIVATING) { // It is not important what is the new state as soon as we leave // PUSH_SERVICE_ACTIVATING this._state = aNewState; if (this._notifyActivated) { if (aNewState < PUSH_SERVICE_ACTIVATING) { - this._notifyActivated.reject({state: 0, error: "Service not active"}); + this._notifyActivated.reject(new Error("Push service not active")); } else { this._notifyActivated.resolve(); } } this._notifyActivated = null; this._activated = null; } this._state = aNewState; }, _changeStateOfflineEvent: function(offline, calledFromConnEnabledEvent) { - debug("changeStateOfflineEvent: " + offline); + console.debug("changeStateOfflineEvent()", offline); if (this._state < PUSH_SERVICE_ACTIVE_OFFLINE && this._state != PUSH_SERVICE_ACTIVATING && !calledFromConnEnabledEvent) { return; } if (offline) { @@ -203,17 +200,17 @@ this.PushService = { this._service.connect(records); } }); this._setState(PUSH_SERVICE_RUNNING); } }, _changeStateConnectionEnabledEvent: function(enabled) { - debug("changeStateConnectionEnabledEvent: " + enabled); + console.debug("changeStateConnectionEnabledEvent()", enabled); if (this._state < PUSH_SERVICE_CONNECTION_DISABLE && this._state != PUSH_SERVICE_ACTIVATING) { return; } if (enabled) { this._changeStateOfflineEvent(Services.io.offline, true); @@ -239,83 +236,80 @@ this.PushService = { case "network:offline-status-changed": /* On desktop. */ this._stateChangeProcessEnqueue(_ => this._changeStateOfflineEvent(aData === "offline", false) ); break; case "nsPref:changed": if (aData == "dom.push.serverURL") { - debug("dom.push.serverURL changed! websocket. new value " + + console.debug("observe: dom.push.serverURL changed for websocket", prefs.get("serverURL")); this._stateChangeProcessEnqueue(_ => this._changeServerURL(prefs.get("serverURL"), CHANGING_SERVICE_EVENT) ); } else if (aData == "dom.push.connection.enabled") { this._stateChangeProcessEnqueue(_ => this._changeStateConnectionEnabledEvent(prefs.get("connection.enabled")) ); - - } else if (aData == "dom.push.debug") { - gDebuggingEnabled = prefs.get("debug"); } break; case "idle-daily": this._dropExpiredRegistrations(); break; case "perm-changed": this._onPermissionChange(aSubject, aData).catch(error => { - debug("onPermissionChange: Error updating registrations: " + + console.error("onPermissionChange: Error updating registrations:", error); }) break; case "webapps-clear-data": - debug("webapps-clear-data"); + console.debug("webapps-clear-data"); let data = aSubject .QueryInterface(Ci.mozIApplicationClearPrivateDataParams); if (!data) { - debug("webapps-clear-data: Failed to get information about " + - "application"); + console.error("webapps-clear-data: Failed to get information " + + "about application"); return; } var originAttributes = ChromeUtils.originAttributesToSuffix({ appId: data.appId, inBrowser: data.browserOnly }); this._db.getAllByOriginAttributes(originAttributes) .then(records => Promise.all(records.map(record => this._db.delete(record.keyID).then( - _ => this._unregisterIfConnected(record), + _ => this._backgroundUnregister(record), err => { - debug("webapps-clear-data: " + record.scope + - " Could not delete entry " + record.channelID); + console.error("webapps-clear-data: Error removing record", + record, err); - return this._unregisterIfConnected(record); + this._backgroundUnregister(record); }) ) )); break; } }, - _unregisterIfConnected: function(record) { + _backgroundUnregister: function(record) { if (this._service.isConnected()) { // courtesy, but don't establish a connection // just for it - debug("Had a connection, so telling the server"); - return this._sendUnregister({channelID: record.channelID}) + console.debug("backgroundUnregister: Notifying server", record); + return this._sendUnregister(record) .catch(function(e) { - debug("Unregister errored " + e); + console.error("backgroundUnregister: Error notifying server", e); }); } }, // utility function used to add/remove observers in startObservers() and // stopObservers() getNetworkStateChangeEventName: function() { try { @@ -337,17 +331,17 @@ this.PushService = { break; } } } return [service, uri]; }, _changeServerURL: function(serverURI, event) { - debug("changeServerURL"); + console.debug("changeServerURL()"); switch(event) { case UNINIT_EVENT: return this._stopService(event); case STARTING_SERVICE_EVENT: { let [service, uri] = this._findService(serverURI); @@ -409,27 +403,24 @@ this.PushService = { * startObservers() - start other observers. * changeStateConnectionEnabledEvent - checks prefs and offline state. * It changes state to: * PUSH_SERVICE_RUNNING, * PUSH_SERVICE_ACTIVE_OFFLINE or * PUSH_SERVICE_CONNECTION_DISABLE. */ init: function(options = {}) { - debug("init()"); + console.debug("init()"); if (this._state > PUSH_SERVICE_UNINIT) { return; } this._setState(PUSH_SERVICE_ACTIVATING); - // Debugging - prefs.observe("debug", this); - Services.obs.addObserver(this, "xpcom-shutdown", false); if (options.serverURI) { // this is use for xpcshell test. var uri; var service; if (!options.service) { @@ -464,17 +455,17 @@ this.PushService = { prefs.observe("serverURL", this); this._stateChangeProcessEnqueue(_ => this._changeServerURL(prefs.get("serverURL"), STARTING_SERVICE_EVENT)); } }, _startObservers: function() { - debug("startObservers"); + console.debug("startObservers()"); if (this._state != PUSH_SERVICE_ACTIVATING) { return; } Services.obs.addObserver(this, "webapps-clear-data", false); // On B2G the NetworkManager interface fires a network-active-changed @@ -505,17 +496,17 @@ this.PushService = { Services.obs.addObserver(this, "idle-daily", false); // Prunes registrations for sites for which the user revokes push // permissions. Services.obs.addObserver(this, "perm-changed", false); }, _startService: function(service, serverURI, event, options = {}) { - debug("startService"); + console.debug("startService()"); if (this._state != PUSH_SERVICE_ACTIVATING) { return; } if (event != CHANGING_SERVICE_EVENT) { // if only serverURL is changed we can keep listening for broadcast // messages and queue them. @@ -544,17 +535,17 @@ this.PushService = { * stopObservers() - stot observers started in startObservers. * stopService() - It stops listening for broadcasted messages, stops db and * PushService connection (WebSocket). * state is changed to PUSH_SERVICE_INIT. * uninit() - stop listening for xpcom-shutdown and serverURL changes. * state is change to PUSH_SERVICE_UNINIT */ _stopService: function(event) { - debug("stopService"); + console.debug("stopService()"); if (this._state < PUSH_SERVICE_ACTIVATING) { return; } this.stopAlarm(); this._stopObservers(); @@ -588,48 +579,47 @@ this.PushService = { this._db = null; }, err => { this._db.close(); this._db = null; }); }, _stopObservers: function() { - debug("stopObservers()"); + console.debug("stopObservers()"); if (this._state < PUSH_SERVICE_ACTIVATING) { return; } - prefs.ignore("debug", this); prefs.ignore("connection.enabled", this); Services.obs.removeObserver(this, this._networkStateChangeEventName); Services.obs.removeObserver(this, "webapps-clear-data"); Services.obs.removeObserver(this, "idle-daily"); Services.obs.removeObserver(this, "perm-changed"); }, uninit: function() { - debug("uninit()"); + console.debug("uninit()"); this._childListeners = []; if (this._state == PUSH_SERVICE_UNINIT) { return; } this._setState(PUSH_SERVICE_UNINIT); prefs.ignore("serverURL", this); Services.obs.removeObserver(this, "xpcom-shutdown"); this._stateChangeProcessEnqueue(_ => this._changeServerURL("", UNINIT_EVENT)); - debug("shutdown complete!"); + console.debug("uninit: shutdown complete!"); }, /** |delay| should be in milliseconds. */ setAlarm: function(delay) { // Bug 909270: Since calls to AlarmService.add() are async, calls must be // 'queued' to ensure only one alarm is ever active. if (this._settingAlarm) { // onSuccess will handle the set. Overwriting the variable enforces the @@ -649,30 +639,31 @@ this.PushService = { ignoreTimezone: true }, () => { if (this._state > PUSH_SERVICE_ACTIVATING) { this._service.onAlarmFired(); } }, (alarmID) => { this._alarmID = alarmID; - debug("Set alarm " + delay + " in the future " + this._alarmID); + console.debug("setAlarm: Set alarm", delay, "in the future", + this._alarmID); this._settingAlarm = false; if (this._waitingForAlarmSet) { this._waitingForAlarmSet = false; this.setAlarm(this._queuedAlarmDelay); } } ); }, stopAlarm: function() { if (this._alarmID !== null) { - debug("Stopped existing alarm " + this._alarmID); + console.debug("stopAlarm: Stopped existing alarm", this._alarmID); AlarmService.remove(this._alarmID); this._alarmID = null; } }, dropRegistrations: function() { return this._notifyAllAppsRegister() .then(_ => this._db.drop()); @@ -711,17 +702,17 @@ this.PushService = { .getService(Ci.nsIMessageListenerManager); ppmm.broadcastAsyncMessage(name, data); } }, // Fires a push-register system message to all applications that have // registration. _notifyAllAppsRegister: function() { - debug("notifyAllAppsRegister()"); + console.debug("notifyAllAppsRegister()"); // records are objects describing the registration as stored in IndexedDB. return this._db.getAllUnexpired().then(records => { records.forEach(record => { this._notifySubscriptionChangeObservers(record); }); }); }, @@ -787,17 +778,17 @@ this.PushService = { * @param {Object} cryptoParams The message encryption settings. * @param {Function} updateFunc A function that receives the existing * registration record as its argument, and returns a new record. If the * function returns `null` or `undefined`, the record will not be updated. * `PushServiceWebSocket` uses this to drop incoming updates with older * versions. */ receivedPushMessage: function(keyID, message, cryptoParams, updateFunc) { - debug("receivedPushMessage()"); + console.debug("receivedPushMessage()"); Services.telemetry.getHistogramById("PUSH_API_NOTIFICATION_RECEIVED").add(); let shouldNotify = false; return this.getByKeyID(keyID).then(record => { if (!record) { this._recordDidNotNotify(kDROP_NOTIFICATION_REASON_KEY_NOT_FOUND); throw new Error("No record for key ID " + keyID); } @@ -815,17 +806,18 @@ this.PushService = { this._recordDidNotNotify(kDROP_NOTIFICATION_REASON_NO_VERSION_INCREMENT); return null; } // Because `unregister` is advisory only, we can still receive messages // for stale Simple Push registrations from the server. To work around // this, we check if the record has expired before *and* after updating // the quota. if (newRecord.isExpired()) { - debug("receivedPushMessage: Ignoring update for expired key ID " + keyID); + console.error("receivedPushMessage: Ignoring update for expired key ID", + keyID); return null; } newRecord.receivedPush(lastVisit); return newRecord; }); }).then(record => { var notified = false; if (!record) { @@ -847,36 +839,33 @@ this.PushService = { if (shouldNotify) { notified = this._notifyApp(record, message); } if (record.isExpired()) { this._recordDidNotNotify(kDROP_NOTIFICATION_REASON_EXPIRED); // Drop the registration in the background. If the user returns to the // site, the service worker will be notified on the next `idle-daily` // event. - this._sendUnregister(record).catch(error => { - debug("receivedPushMessage: Unregister error: " + error); - }); + this._backgroundUnregister(record); } return notified; }); }).catch(error => { - debug("receivedPushMessage: Error notifying app: " + error); + console.error("receivedPushMessage: Error notifying app", error); }); }, _notifyApp: function(aPushRecord, message) { if (!aPushRecord || !aPushRecord.scope || aPushRecord.originAttributes === undefined) { - debug("notifyApp() something is undefined. Dropping notification: " + - JSON.stringify(aPushRecord) ); + console.error("notifyApp: Invalid record", aPushRecord); return false; } - debug("notifyApp() " + aPushRecord.scope); + console.debug("notifyApp()", aPushRecord.scope); // Notify XPCOM observers. let notification = Cc["@mozilla.org/push/ObserverNotification;1"] .createInstance(Ci.nsIPushObserverNotification); notification.pushEndpoint = aPushRecord.pushEndpoint; notification.version = aPushRecord.version; let payload = ArrayBuffer.isView(message) ? new Uint8Array(message.buffer) : message; @@ -893,17 +882,17 @@ this.PushService = { Services.obs.notifyObservers( notification, "push-notification", aPushRecord.scope ); // If permission has been revoked, trash the message. if (!aPushRecord.hasPermission()) { - debug("Does not have permission for push."); + console.warn("notifyApp: Missing push permission", aPushRecord); return false; } let data = { payload: payload, originAttributes: aPushRecord.originAttributes, scope: aPushRecord.scope }; @@ -918,197 +907,186 @@ this.PushService = { }, getAllUnexpired: function() { return this._db.getAllUnexpired(); }, _sendRequest: function(action, aRecord) { if (this._state == PUSH_SERVICE_CONNECTION_DISABLE) { - return Promise.reject({state: 0, error: "Service not active"}); + return Promise.reject(new Error("Push service disabled")); } else if (this._state == PUSH_SERVICE_ACTIVE_OFFLINE) { if (this._service.serviceType() == "WebSocket" && action == "unregister") { return Promise.resolve(); } - return Promise.reject({state: 0, error: "NetworkError"}); + return Promise.reject(new Error("Push service offline")); } return this._service.request(action, aRecord); }, /** * Called on message from the child process. aPageRecord is an object sent by * navigator.push, identifying the sending page and other fields. */ _registerWithServer: function(aPageRecord) { - debug("registerWithServer()" + JSON.stringify(aPageRecord)); + console.debug("registerWithServer()", aPageRecord); Services.telemetry.getHistogramById("PUSH_API_SUBSCRIBE_ATTEMPT").add(); return this._sendRequest("register", aPageRecord) .then(record => this._onRegisterSuccess(record), err => this._onRegisterError(err)) .then(record => { this._deletePendingRequest(aPageRecord); - return record; + return record.toRegister(); }, err => { this._deletePendingRequest(aPageRecord); throw err; }); }, - _register: function(aPageRecord) { - debug("_register()"); - if (!aPageRecord.scope || aPageRecord.originAttributes === undefined) { - return Promise.reject({state: 0, error: "NotFoundError"}); - } - - return this._checkActivated() - .then(_ => this._db.getByIdentifiers(aPageRecord)) - .then(record => { - if (!record) { - return this._lookupOrPutPendingRequest(aPageRecord); - } - if (record.isExpired()) { - return record.quotaChanged().then(isChanged => { - if (isChanged) { - // If the user revisited the site, drop the expired push - // registration and re-register. - return this._db.delete(record.keyID); - } - throw {state: 0, error: "NotFoundError"}; - }).then(_ => this._lookupOrPutPendingRequest(aPageRecord)); - } - return record; - }, error => { - debug("getByIdentifiers failed"); - throw error; - }); - }, - _sendUnregister: function(aRecord) { Services.telemetry.getHistogramById("PUSH_API_UNSUBSCRIBE_ATTEMPT").add(); return this._sendRequest("unregister", aRecord).then(function(v) { Services.telemetry.getHistogramById("PUSH_API_UNSUBSCRIBE_SUCCEEDED").add(); return v; }).catch(function(e) { Services.telemetry.getHistogramById("PUSH_API_UNSUBSCRIBE_FAILED").add(); return Promise.reject(e); }); }, /** * Exceptions thrown in _onRegisterSuccess are caught by the promise obtained * from _service.request, causing the promise to be rejected instead. */ _onRegisterSuccess: function(aRecord) { - debug("_onRegisterSuccess()"); + console.debug("_onRegisterSuccess()"); return this._db.put(aRecord) .then(record => { Services.telemetry.getHistogramById("PUSH_API_SUBSCRIBE_SUCCEEDED").add(); return record; }) .catch(error => { Services.telemetry.getHistogramById("PUSH_API_SUBSCRIBE_FAILED").add() // Unable to save. Destroy the subscription in the background. - this._sendUnregister(aRecord).catch(err => { - debug("_onRegisterSuccess: Error unregistering stale subscription" + - err); - }); + this._backgroundUnregister(aRecord); throw error; }); }, /** * Exceptions thrown in _onRegisterError are caught by the promise obtained * from _service.request, causing the promise to be rejected instead. */ _onRegisterError: function(reply) { - debug("_onRegisterError()"); + console.debug("_onRegisterError()"); Services.telemetry.getHistogramById("PUSH_API_SUBSCRIBE_FAILED").add() if (!reply.error) { - debug("Called without valid error message!"); - throw "Registration error"; + console.warn("onRegisterError: Called without valid error message!", + reply.error); + throw new Error("Registration error"); } throw reply.error; }, receiveMessage: function(aMessage) { - debug("receiveMessage(): " + aMessage.name); + console.debug("receiveMessage()", aMessage.name); if (kCHILD_PROCESS_MESSAGES.indexOf(aMessage.name) == -1) { - debug("Invalid message from child " + aMessage.name); + console.debug("receiveMessage: Invalid message from child", + aMessage.name); return; } if (aMessage.name === "Push:RegisterEventNotificationListener") { - debug("Adding child listener"); + console.debug("receiveMessage: Adding child listener"); this._childListeners.push(aMessage.target); return; } if (aMessage.name === "child-process-shutdown") { - debug("Possibly removing child listener"); + console.debug("receiveMessage: Possibly removing child listener"); for (var i = this._childListeners.length - 1; i >= 0; --i) { if (this._childListeners[i] == aMessage.target) { - debug("Removed child listener"); + console.debug("receiveMessage: Removed child listener"); this._childListeners.splice(i, 1); } } return; } if (!aMessage.target.assertPermission("push")) { - debug("Got message from a child process that does not have 'push' permission."); + console.debug("receiveMessage: Got message from a child process that", + "does not have 'push' permission"); return null; } let mm = aMessage.target.QueryInterface(Ci.nsIMessageSender); - let pageRecord = aMessage.data; + let name = aMessage.name.slice("Push:".length); + Promise.resolve().then(_ => { + let pageRecord = this._validatePageRecord(aMessage); + return this[name.toLowerCase()](pageRecord); + }).then(result => { + mm.sendAsyncMessage("PushService:" + name + ":OK", { + requestID: aMessage.data.requestID, + result: result, + }); + }, error => { + console.error("receiveMessage: Error handling message", aMessage, error); + mm.sendAsyncMessage("PushService:" + name + ":KO", { + requestID: aMessage.data.requestID, + }); + }).catch(error => { + console.error("receiveMessage: Error sending reply", error); + }); + }, + + _validatePageRecord: function(aMessage) { let principal = aMessage.principal; if (!principal) { - debug("No principal passed!"); - let message = { - requestID: pageRecord.requestID, - error: "SecurityError" - }; - mm.sendAsyncMessage("PushService:Register:KO", message); - return; + throw new Error("Missing message principal"); + } + + let pageRecord = aMessage.data; + if (!pageRecord.scope) { + throw new Error("Missing page record scope"); } pageRecord.originAttributes = ChromeUtils.originAttributesToSuffix(principal.originAttributes); - if (!pageRecord.scope || pageRecord.originAttributes === undefined) { - debug("Incorrect identifier values set! " + JSON.stringify(pageRecord)); - let message = { - requestID: pageRecord.requestID, - error: "SecurityError" - }; - mm.sendAsyncMessage("PushService:Register:KO", message); - return; - } - - this[aMessage.name.slice("Push:".length).toLowerCase()](pageRecord, mm); + return pageRecord; }, - register: function(aPageRecord, aMessageManager) { - debug("register(): " + JSON.stringify(aPageRecord)); + register: function(aPageRecord) { + console.debug("register()", aPageRecord); - this._register(aPageRecord) + if (!aPageRecord.scope || aPageRecord.originAttributes === undefined) { + return Promise.reject(new Error("Invalid page record")); + } + + return this._checkActivated() + .then(_ => this._db.getByIdentifiers(aPageRecord)) .then(record => { - let message = record.toRegister(); - message.requestID = aPageRecord.requestID; - aMessageManager.sendAsyncMessage("PushService:Register:OK", message); - }, error => { - let message = { - requestID: aPageRecord.requestID, - error - }; - aMessageManager.sendAsyncMessage("PushService:Register:KO", message); + if (!record) { + return this._lookupOrPutPendingRequest(aPageRecord); + } + if (record.isExpired()) { + return record.quotaChanged().then(isChanged => { + if (isChanged) { + // If the user revisited the site, drop the expired push + // registration and re-register. + return this._db.delete(record.keyID); + } + throw new Error("Push subscription expired"); + }).then(_ => this._lookupOrPutPendingRequest(aPageRecord)); + } + return record.toRegister(); }); }, /** * Called on message from the child process. * * Why is the record being deleted from the local database before the server * is told? @@ -1127,57 +1105,40 @@ this.PushService = { * failure, the application is never informed. In addition the application may * retry the unregister when it fails due to timeout (websocket) or any other * reason at which point the server will say it does not know of this * unregistration. We'll have to make the registration/unregistration phases * have retries and attempts to resend messages from the server, and have the * client acknowledge. On a server, data is cheap, reliable notification is * not. */ - _unregister: function(aPageRecord) { - debug("_unregister()"); + unregister: function(aPageRecord) { + console.debug("unregister()", aPageRecord); + if (!aPageRecord.scope || aPageRecord.originAttributes === undefined) { - return Promise.reject({state: 0, error: "NotFoundError"}); + return Promise.reject(new Error("Invalid page record")); } return this._checkActivated() .then(_ => this._db.getByIdentifiers(aPageRecord)) .then(record => { if (record === undefined) { return false; } return Promise.all([ this._sendUnregister(record), this._db.delete(record.keyID), ]).then(() => true); }); }, - unregister: function(aPageRecord, aMessageManager) { - debug("unregister() " + JSON.stringify(aPageRecord)); - - this._unregister(aPageRecord) - .then(result => { - aMessageManager.sendAsyncMessage("PushService:Unregister:OK", { - requestID: aPageRecord.requestID, - result: result, - }) - }, error => { - debug("unregister(): Actual error " + error); - aMessageManager.sendAsyncMessage("PushService:Unregister:KO", { - requestID: aPageRecord.requestID, - }) - } - ); - }, - _clearAll: function _clearAll() { return this._checkActivated() - .then(_ => this._db.clearAll()) + .then(_ => this._db.drop()) .catch(_ => Promise.resolve()); }, _clearForDomain: function(domain) { /** * Copied from ForgetAboutSite.jsm. * * Returns true if the string passed in is part of the root domain of the @@ -1208,28 +1169,25 @@ this.PushService = { db.clearIf(record => { return hasRootDomain(record.uri.prePath, domain); }); } return this._checkActivated() .then(_ => clear(this._db, domain)) .catch(e => { - debug("Error forgetting about domain! " + e); + console.warn("clearForDomain: Error forgetting about domain", e); return Promise.resolve(); }); }, - /** - * Called on message from the child process - */ - _registration: function(aPageRecord) { - debug("_registration()"); + registration: function(aPageRecord) { + console.debug("registration()"); if (!aPageRecord.scope || aPageRecord.originAttributes === undefined) { - return Promise.reject({state: 0, error: "NotFoundError"}); + return Promise.reject(new Error("Invalid page record")); } return this._checkActivated() .then(_ => this._db.getByIdentifiers(aPageRecord)) .then(record => { if (!record) { return null; } @@ -1240,79 +1198,63 @@ this.PushService = { } return null; }); } return record.toRegistration(); }); }, - registration: function(aPageRecord, aMessageManager) { - debug("registration()"); - - return this._registration(aPageRecord) - .then(registration => - aMessageManager.sendAsyncMessage("PushService:Registration:OK", { - requestID: aPageRecord.requestID, - registration - }), error => - aMessageManager.sendAsyncMessage("PushService:Registration:KO", { - requestID: aPageRecord.requestID, - error - }) - ); - }, - _dropExpiredRegistrations: function() { - debug("dropExpiredRegistrations()"); + console.debug("dropExpiredRegistrations()"); return this._db.getAllExpired().then(records => { return Promise.all(records.map(record => record.quotaChanged().then(isChanged => { if (isChanged) { // If the user revisited the site, drop the expired push // registration and notify the associated service worker. return this.dropRecordAndNotifyApp(record); } }).catch(error => { - debug("dropExpiredRegistrations: Error dropping registration " + - record.keyID + ": " + error); + console.error("dropExpiredRegistrations: Error dropping registration", + record.keyID, error); }) )); }); }, _onPermissionChange: function(subject, data) { - debug("onPermissionChange()"); + console.debug("onPermissionChange()"); if (data == "cleared") { // If the permission list was cleared, drop all registrations // that are subject to quota. return this._db.clearIf(record => { if (record.quotaApplies()) { if (!record.isExpired()) { // Drop the registration in the background. - this._unregisterIfConnected(record); + this._backgroundUnregister(record); } return true; } return false; }); } let permission = subject.QueryInterface(Ci.nsIPermission); if (permission.type != "desktop-notification") { return Promise.resolve(); } return this._updatePermission(permission, data); }, _updatePermission: function(permission, type) { - debug("updatePermission()"); + console.debug("updatePermission()"); let isAllow = permission.capability == Ci.nsIPermissionManager.ALLOW_ACTION; let isChange = type == "added" || type == "changed"; if (isAllow && isChange) { // Permission set to "allow". Drop all expired registrations for this // site, notify the associated service workers, and reset the quota @@ -1351,17 +1293,17 @@ this.PushService = { * @returns {Promise} A promise resolved with the expired records. */ _permissionDenied: function(record) { if (!record.quotaApplies() || record.isExpired()) { // Ignore already-expired records. return null; } // Drop the registration in the background. - this._unregisterIfConnected(record); + this._backgroundUnregister(record); record.setQuota(0); return record; }, /** * Drops all expired registrations, notifies the associated service * workers, and resets the quota for active registrations if the push * permission is granted.
--- a/dom/push/PushServiceHttp2.jsm +++ b/dom/push/PushServiceHttp2.jsm @@ -23,42 +23,40 @@ const { PushCrypto, concatArray, getEncryptionKeyParams, getEncryptionParams, } = Cu.import("resource://gre/modules/PushCrypto.jsm"); this.EXPORTED_SYMBOLS = ["PushServiceHttp2"]; -const prefs = new Preferences("dom.push."); - -// Don't modify this, instead set dom.push.debug. -// Set debug first so that all debugging actually works. -var gDebuggingEnabled = prefs.get("debug"); +XPCOMUtils.defineLazyGetter(this, "console", () => { + let {ConsoleAPI} = Cu.import("resource://gre/modules/Console.jsm", {}); + return new ConsoleAPI({ + maxLogLevelPref: "dom.push.loglevel", + prefix: "PushServiceHttp2", + }); +}); -function debug(s) { - if (gDebuggingEnabled) { - dump("-*- PushServiceHttp2.jsm: " + s + "\n"); - } -} +const prefs = new Preferences("dom.push."); const kPUSHHTTP2DB_DB_NAME = "pushHttp2"; const kPUSHHTTP2DB_DB_VERSION = 5; // Change this if the IndexedDB format changes const kPUSHHTTP2DB_STORE_NAME = "pushHttp2"; /** * A proxy between the PushService and connections listening for incoming push * messages. The PushService can silence messages from the connections by * setting PushSubscriptionListener._pushService to null. This is required * because it can happen that there is an outstanding push message that will * be send on OnStopRequest but the PushService may not be interested in these. * It's easier to stop listening than to have checks at specific points. */ var PushSubscriptionListener = function(pushService, uri) { - debug("Creating a new pushSubscription listener."); + console.debug("PushSubscriptionListener()"); this._pushService = pushService; this.uri = uri; }; PushSubscriptionListener.prototype = { QueryInterface: function (aIID) { if (aIID.equals(Ci.nsIHttpPushListener) || @@ -68,92 +66,93 @@ PushSubscriptionListener.prototype = { throw Components.results.NS_ERROR_NO_INTERFACE; }, getInterface: function(aIID) { return this.QueryInterface(aIID); }, onStartRequest: function(aRequest, aContext) { - debug("PushSubscriptionListener onStartRequest()"); + console.debug("PushSubscriptionListener: onStartRequest()"); // We do not do anything here. }, onDataAvailable: function(aRequest, aContext, aStream, aOffset, aCount) { - debug("PushSubscriptionListener onDataAvailable()"); + console.debug("PushSubscriptionListener: onDataAvailable()"); // Nobody should send data, but just to be sure, otherwise necko will // complain. if (aCount === 0) { return; } let inputStream = Cc["@mozilla.org/scriptableinputstream;1"] .createInstance(Ci.nsIScriptableInputStream); inputStream.init(aStream); var data = inputStream.read(aCount); }, onStopRequest: function(aRequest, aContext, aStatusCode) { - debug("PushSubscriptionListener onStopRequest()"); + console.debug("PushSubscriptionListener: onStopRequest()"); if (!this._pushService) { return; } this._pushService.connOnStop(aRequest, Components.isSuccessCode(aStatusCode), this.uri); }, onPush: function(associatedChannel, pushChannel) { - debug("PushSubscriptionListener onPush()"); + console.debug("PushSubscriptionListener: onPush()"); var pushChannelListener = new PushChannelListener(this); pushChannel.asyncOpen(pushChannelListener, pushChannel); }, disconnect: function() { this._pushService = null; } }; /** * The listener for pushed messages. The message data is collected in * OnDataAvailable and send to the app in OnStopRequest. */ var PushChannelListener = function(pushSubscriptionListener) { - debug("Creating a new push channel listener."); + console.debug("PushChannelListener()"); this._mainListener = pushSubscriptionListener; this._message = []; this._ackUri = null; }; PushChannelListener.prototype = { onStartRequest: function(aRequest, aContext) { this._ackUri = aRequest.URI.spec; }, onDataAvailable: function(aRequest, aContext, aStream, aOffset, aCount) { - debug("push channel listener onDataAvailable()"); + console.debug("PushChannelListener: onDataAvailable()"); if (aCount === 0) { return; } let inputStream = Cc["@mozilla.org/binaryinputstream;1"] .createInstance(Ci.nsIBinaryInputStream); inputStream.setInputStream(aStream); let chunk = new ArrayBuffer(aCount); inputStream.readArrayBuffer(aCount, chunk); this._message.push(chunk); }, onStopRequest: function(aRequest, aContext, aStatusCode) { - debug("push channel listener onStopRequest() status code:" + aStatusCode); + console.debug("PushChannelListener: onStopRequest()", "status code", + aStatusCode); if (Components.isSuccessCode(aStatusCode) && this._mainListener && this._mainListener._pushService) { var keymap = encryptKeyFieldParser(aRequest); if (!keymap) { return; } @@ -223,123 +222,125 @@ PushServiceDelete.prototype = { var data = inputStream.read(aCount); }, onStopRequest: function(aRequest, aContext, aStatusCode) { if (Components.isSuccessCode(aStatusCode)) { this._resolve(); } else { - this._reject({status: 0, error: "NetworkError"}); + this._reject(new Error("Error removing subscription: " + aStatusCode)); } } }; var SubscriptionListener = function(aSubInfo, aResolve, aReject, aServerURI, aPushServiceHttp2) { - debug("Creating a new subscription listener."); + console.debug("SubscriptionListener()"); this._subInfo = aSubInfo; this._resolve = aResolve; this._reject = aReject; this._data = ''; this._serverURI = aServerURI; this._service = aPushServiceHttp2; this._ctime = Date.now(); }; SubscriptionListener.prototype = { onStartRequest: function(aRequest, aContext) {}, onDataAvailable: function(aRequest, aContext, aStream, aOffset, aCount) { - debug("subscription listener onDataAvailable()"); + console.debug("SubscriptionListener: onDataAvailable()"); // We do not expect any data, but necko will complain if we do not consume // it. if (aCount === 0) { return; } let inputStream = Cc["@mozilla.org/scriptableinputstream;1"] .createInstance(Ci.nsIScriptableInputStream); inputStream.init(aStream); this._data.concat(inputStream.read(aCount)); }, onStopRequest: function(aRequest, aContext, aStatus) { - debug("subscription listener onStopRequest()"); + console.debug("SubscriptionListener: onStopRequest()"); // Check if pushService is still active. if (!this._service.hasmainPushService()) { - this._reject({error: "Service deactivated"}); + this._reject(new Error("Push service unavailable")); return; } if (!Components.isSuccessCode(aStatus)) { - this._reject({error: "Error status" + aStatus}); + this._reject(new Error("Error listening for messages: " + aStatus)); return; } var statusCode = aRequest.QueryInterface(Ci.nsIHttpChannel).responseStatus; if (Math.floor(statusCode / 100) == 5) { if (this._subInfo.retries < prefs.get("http2.maxRetries")) { this._subInfo.retries++; var retryAfter = retryAfterParser(aRequest); setTimeout(_ => this._reject( { retry: true, subInfo: this._subInfo }), retryAfter); } else { - this._reject({error: "Error response code: " + statusCode }); + this._reject(new Error("Unexpected server response: " + statusCode)); } return; } else if (statusCode != 201) { - this._reject({error: "Error response code: " + statusCode }); + this._reject(new Error("Unexpected server response: " + statusCode)); return; } var subscriptionUri; try { subscriptionUri = aRequest.getResponseHeader("location"); } catch (err) { - this._reject({error: "Return code 201, but the answer is bogus"}); + this._reject(new Error("Missing Location header")); return; } - debug("subscriptionUri: " + subscriptionUri); + console.debug("onStopRequest: subscriptionUri", subscriptionUri); var linkList; try { linkList = aRequest.getResponseHeader("link"); } catch (err) { - this._reject({error: "Return code 201, but the answer is bogus"}); + this._reject(new Error("Missing Link header")); return; } - var linkParserResult = linkParser(linkList, this._serverURI); - if (linkParserResult.error) { - this._reject(linkParserResult); + var linkParserResult; + try { + linkParserResult = linkParser(linkList, this._serverURI); + } catch (e) { + this._reject(e); return; } if (!subscriptionUri) { - this._reject({error: "Return code 201, but the answer is bogus," + - " missing subscriptionUri"}); + this._reject(new Error("Invalid Location header")); return; } try { let uriTry = Services.io.newURI(subscriptionUri, null, null); } catch (e) { - debug("Invalid URI " + subscriptionUri); - this._reject({error: "Return code 201, but URI is bogus. " + - subscriptionUri}); + console.error("onStopRequest: Invalid subscription URI", + subscriptionUri); + this._reject(new Error("Invalid subscription endpoint: " + + subscriptionUri)); return; } let reply = new PushRecordHttp2({ subscriptionUri: subscriptionUri, pushEndpoint: linkParserResult.pushEndpoint, pushReceiptEndpoint: linkParserResult.pushReceiptEndpoint, scope: this._subInfo.record.scope, @@ -367,17 +368,17 @@ function retryAfterParser(aRequest) { return retryAfter; } function linkParser(linkHeader, serverURI) { var linkList = linkHeader.split(','); if ((linkList.length < 1)) { - return {error: "Return code 201, but the answer is bogus"}; + throw new Error("Invalid Link header"); } var pushEndpoint; var pushReceiptEndpoint; linkList.forEach(link => { var linkElems = link.split(';'); @@ -388,42 +389,33 @@ function linkParser(linkHeader, serverUR } else if (linkElems[1].trim() === 'rel="urn:ietf:params:push:receipt"') { pushReceiptEndpoint = linkElems[0].substring(linkElems[0].indexOf('<') + 1, linkElems[0].indexOf('>')); } } }); - debug("pushEndpoint: " + pushEndpoint); - debug("pushReceiptEndpoint: " + pushReceiptEndpoint); + console.debug("linkParser: pushEndpoint", pushEndpoint); + console.debug("linkParser: pushReceiptEndpoint", pushReceiptEndpoint); // Missing pushReceiptEndpoint is allowed. if (!pushEndpoint) { - return {error: "Return code 201, but the answer is bogus, missing" + - " pushEndpoint"}; + throw new Error("Missing push endpoint"); } - var uri; - var resUri = []; - try { - [pushEndpoint, pushReceiptEndpoint].forEach(u => { - if (u) { - uri = u; - resUri[u] = Services.io.newURI(uri, null, serverURI); - } - }); - } catch (e) { - debug("Invalid URI " + uri); - return {error: "Return code 201, but URI is bogus. " + uri}; + var pushURI = Services.io.newURI(pushEndpoint, null, serverURI); + var pushReceiptURI; + if (pushReceiptEndpoint) { + pushReceiptURI = Services.io.newURI(pushReceiptEndpoint, null, + serverURI); } return { - pushEndpoint: resUri[pushEndpoint].spec, - pushReceiptEndpoint: (pushReceiptEndpoint) ? resUri[pushReceiptEndpoint].spec - : "" + pushEndpoint: pushURI.spec, + pushReceiptEndpoint: (pushReceiptURI) ? pushReceiptURI.spec : "", }; } /** * The implementation of the WebPush. */ this.PushServiceHttp2 = { _mainPushService: null, @@ -446,44 +438,36 @@ this.PushServiceHttp2 = { }, hasmainPushService: function() { return this._mainPushService !== null; }, checkServerURI: function(serverURL) { if (!serverURL) { - debug("No dom.push.serverURL found!"); + console.warn("checkServerURI: No dom.push.serverURL found"); return; } let uri; try { uri = Services.io.newURI(serverURL, null, null); } catch(e) { - debug("Error creating valid URI from dom.push.serverURL (" + - serverURL + ")"); + console.warn("checkServerURI: Error creating valid URI from", + "dom.push.serverURL", serverURL); return null; } if (uri.scheme !== "https") { - debug("Unsupported websocket scheme " + uri.scheme); + console.warn("checkServerURI: Unsupported scheme", uri.scheme); return null; } return uri; }, - observe: function(aSubject, aTopic, aData) { - if (aTopic == "nsPref:changed") { - if (aData == "dom.push.debug") { - gDebuggingEnabled = prefs.get("debug"); - } - } - }, - connect: function(subscriptions) { this.startConnections(subscriptions); }, isConnected: function() { return this._mainPushService != null; }, @@ -511,17 +495,17 @@ this.PushServiceHttp2 = { chan.loadGroup = loadGroup; return chan; }, /** * Subscribe new resource. */ _subscribeResource: function(aRecord) { - debug("subscribeResource()"); + console.debug("subscribeResource()"); return this._subscribeResourceInternal({ record: aRecord, retries: 0 }) .then(result => PushCrypto.generateKeys() .then(exportedKeys => { @@ -536,116 +520,108 @@ this.PushServiceHttp2 = { }; this._listenForMsgs(result.subscriptionUri); return result; }) ); }, _subscribeResourceInternal: function(aSubInfo) { - debug("subscribeResourceInternal()"); + console.debug("subscribeResourceInternal()"); return new Promise((resolve, reject) => { var listener = new SubscriptionListener(aSubInfo, resolve, reject, this._serverURI, this); var chan = this._makeChannel(this._serverURI.spec); chan.requestMethod = "POST"; - try { - chan.asyncOpen(listener, null); - } catch(e) { - reject({status: 0, error: "NetworkError"}); - } + chan.asyncOpen(listener, null); }) .catch(err => { if ("retry" in err) { return this._subscribeResourceInternal(err.subInfo); } else { throw err; } }) }, _deleteResource: function(aUri) { return new Promise((resolve,reject) => { var chan = this._makeChannel(aUri); chan.requestMethod = "DELETE"; - try { - chan.asyncOpen(new PushServiceDelete(resolve, reject), null); - } catch(err) { - reject({status: 0, error: "NetworkError"}); - } + chan.asyncOpen(new PushServiceDelete(resolve, reject), null); }); }, /** * Unsubscribe the resource with a subscription uri aSubscriptionUri. * We can't do anything about it if it fails, so we don't listen for response. */ _unsubscribeResource: function(aSubscriptionUri) { - debug("unsubscribeResource()"); + console.debug("unsubscribeResource()"); return this._deleteResource(aSubscriptionUri); }, /** * Start listening for messages. */ _listenForMsgs: function(aSubscriptionUri) { - debug("listenForMsgs() " + aSubscriptionUri); + console.debug("listenForMsgs()", aSubscriptionUri); if (!this._conns[aSubscriptionUri]) { - debug("We do not have this subscription " + aSubscriptionUri); + console.warn("listenForMsgs: We do not have this subscription", + aSubscriptionUri); return; } var chan = this._makeChannel(aSubscriptionUri); var conn = {}; conn.channel = chan; var listener = new PushSubscriptionListener(this, aSubscriptionUri); conn.listener = listener; chan.notificationCallbacks = listener; try { chan.asyncOpen(listener, chan); } catch (e) { - debug("Error connecting to push server. asyncOpen failed!"); + console.error("listenForMsgs: Error connecting to push server.", + "asyncOpen failed", e); conn.listener.disconnect(); chan.cancel(Cr.NS_ERROR_ABORT); this._retryAfterBackoff(aSubscriptionUri, -1); return; } this._conns[aSubscriptionUri].lastStartListening = Date.now(); this._conns[aSubscriptionUri].channel = conn.channel; this._conns[aSubscriptionUri].listener = conn.listener; }, _ackMsgRecv: function(aAckUri) { - debug("ackMsgRecv() " + aAckUri); + console.debug("ackMsgRecv()", aAckUri); // We can't do anything about it if it fails, // so we don't listen for response. this._deleteResource(aAckUri); }, init: function(aOptions, aMainPushService, aServerURL) { - debug("init()"); + console.debug("init()"); this._mainPushService = aMainPushService; this._serverURI = aServerURL; - gDebuggingEnabled = prefs.get("debug"); - prefs.observe("debug", this); }, _retryAfterBackoff: function(aSubscriptionUri, retryAfter) { - debug("retryAfterBackoff()"); + console.debug("retryAfterBackoff()"); var resetRetryCount = prefs.get("http2.reset_retry_count_after_ms"); // If it was running for some time, reset retry counter. if ((Date.now() - this._conns[aSubscriptionUri].lastStartListening) > resetRetryCount) { this._conns[aSubscriptionUri].countUnableToConnect = 0; } @@ -675,22 +651,23 @@ this.PushServiceHttp2 = { this._conns[aSubscriptionUri].countUnableToConnect++; if (retryAfter === 0) { setTimeout(_ => this._listenForMsgs(aSubscriptionUri), 0); } else { this._conns[aSubscriptionUri].waitingForAlarm = true; this._mainPushService.setAlarm(retryAfter); } - debug("Retry in " + retryAfter); + + console.debug("retryAfterBackoff: Retry in", retryAfter); }, // Close connections. _shutdownConnections: function(deleteInfo) { - debug("shutdownConnections()"); + console.debug("shutdownConnections()"); for (let subscriptionUri in this._conns) { if (this._conns[subscriptionUri]) { if (this._conns[subscriptionUri].listener) { this._conns[subscriptionUri].listener._pushService = null; } if (this._conns[subscriptionUri].channel) { @@ -705,88 +682,90 @@ this.PushServiceHttp2 = { delete this._conns[subscriptionUri]; } } } }, // Start listening if subscriptions present. startConnections: function(aSubscriptions) { - debug("startConnections() " + aSubscriptions.length); + console.debug("startConnections()", aSubscriptions.length); for (let i = 0; i < aSubscriptions.length; i++) { let record = aSubscriptions[i]; this._mainPushService.ensureP256dhKey(record).then(record => { this._startSingleConnection(record); }, error => { - debug("startConnections: Error updating record " + record.keyID); + console.error("startConnections: Error updating record", + record.keyID, error); }); } }, _startSingleConnection: function(record) { - debug("_startSingleConnection()"); + console.debug("_startSingleConnection()"); if (typeof this._conns[record.subscriptionUri] != "object") { this._conns[record.subscriptionUri] = {channel: null, listener: null, countUnableToConnect: 0, waitingForAlarm: false}; } if (!this._conns[record.subscriptionUri].conn) { this._conns[record.subscriptionUri].waitingForAlarm = false; this._listenForMsgs(record.subscriptionUri); } }, // Start listening if subscriptions present. _startConnectionsWaitingForAlarm: function() { - debug("startConnectionsWaitingForAlarm()"); + console.debug("startConnectionsWaitingForAlarm()"); for (let subscriptionUri in this._conns) { if ((this._conns[subscriptionUri]) && !this._conns[subscriptionUri].conn && this._conns[subscriptionUri].waitingForAlarm) { this._conns[subscriptionUri].waitingForAlarm = false; this._listenForMsgs(subscriptionUri); } } }, // Close connection and notify apps that subscription are gone. _shutdownSubscription: function(aSubscriptionUri) { - debug("shutdownSubscriptions()"); + console.debug("shutdownSubscriptions()"); if (typeof this._conns[aSubscriptionUri] == "object") { if (this._conns[aSubscriptionUri].listener) { this._conns[aSubscriptionUri].listener._pushService = null; } if (this._conns[aSubscriptionUri].channel) { try { this._conns[aSubscriptionUri].channel.cancel(Cr.NS_ERROR_ABORT); } catch (e) {} } delete this._conns[aSubscriptionUri]; } }, uninit: function() { - debug("uninit()"); + console.debug("uninit()"); this._shutdownConnections(true); this._mainPushService = null; }, request: function(action, aRecord) { switch (action) { case "register": - debug("register"); return this._subscribeResource(aRecord); case "unregister": this._shutdownSubscription(aRecord.subscriptionUri); return this._unsubscribeResource(aRecord.subscriptionUri); + default: + return Promise.reject(new Error("Unknown request type: " + action)); } }, /** Push server has deleted subscription. * Re-subscribe - if it succeeds send update db record and send * pushsubscriptionchange, * - on error delete record and send pushsubscriptionchange * TODO: maybe pushsubscriptionerror will be included. @@ -804,17 +783,17 @@ this.PushServiceHttp2 = { this._mainPushService.dropRegistrationAndNotifyApp(aSubscriptionUri); } }) ); }, connOnStop: function(aRequest, aSuccess, aSubscriptionUri) { - debug("connOnStop() succeeded: " + aSuccess); + console.debug("connOnStop() succeeded", aSuccess); var conn = this._conns[aSubscriptionUri]; if (!conn) { // there is no connection description that means that we closed // connection, so do nothing. But we should have already deleted // the listener. return; } @@ -835,32 +814,33 @@ this.PushServiceHttp2 = { } else if (Math.floor(aRequest.responseStatus / 100) == 2) { // This should be 204 setTimeout(_ => this._listenForMsgs(aSubscriptionUri), 0); } else { this._retryAfterBackoff(aSubscriptionUri, -1); } }, _pushChannelOnStop: function(aUri, aAckUri, aMessage, dh, salt, rs) { - debug("pushChannelOnStop() "); + console.debug("pushChannelOnStop()"); let cryptoParams = { dh: dh, salt: salt, rs: rs, }; this._mainPushService.receivedPushMessage( aUri, aMessage, cryptoParams, record => { // Always update the stored record. return record; } ) .then(_ => this._ackMsgRecv(aAckUri)) .catch(err => { - debug("Error receiving message: " + err); + console.error("pushChannelOnStop: Error receiving message", + err); }); }, onAlarmFired: function() { this._startConnectionsWaitingForAlarm(); }, };
--- a/dom/push/PushServiceWebSocket.jsm +++ b/dom/push/PushServiceWebSocket.jsm @@ -46,18 +46,23 @@ const kPUSHWSDB_STORE_NAME = "pushapi"; const kUDP_WAKEUP_WS_STATUS_CODE = 4774; // WebSocket Close status code sent // by server to signal that it can // wake client up using UDP. const prefs = new Preferences("dom.push."); this.EXPORTED_SYMBOLS = ["PushServiceWebSocket"]; -// Don't modify this, instead set dom.push.debug. -var gDebuggingEnabled = true; +XPCOMUtils.defineLazyGetter(this, "console", () => { + let {ConsoleAPI} = Cu.import("resource://gre/modules/Console.jsm", {}); + return new ConsoleAPI({ + maxLogLevelPref: "dom.push.loglevel", + prefix: "PushServiceWebSocket", + }); +}); function getCryptoParams(headers) { if (!headers) { return null; } var keymap = getEncryptionKeyParams(headers.encryption_key); if (!keymap) { return null; @@ -70,25 +75,16 @@ function getCryptoParams(headers) { var salt = enc.salt; var rs = (enc.rs)? parseInt(enc.rs, 10) : 4096; if (!dh || !salt || isNaN(rs) || (rs <= 1)) { return null; } return {dh, salt, rs}; } -function debug(s) { - if (gDebuggingEnabled) { - dump("-*- PushServiceWebSocket.jsm: " + s + "\n"); - } -} - -// Set debug first so that all debugging actually works. -gDebuggingEnabled = prefs.get("debug"); - /** * A proxy between the PushService and the WebSocket. The listener is used so * that the PushService can silence messages from the WebSocket by setting * PushWebSocketListener._pushService to null. This is required because * a WebSocket can continue to send messages or errors after it has been * closed but the PushService may not be interested in these. It's easier to * stop listening than to have checks at specific points. */ @@ -164,19 +160,17 @@ this.PushServiceWebSocket = { disconnect: function() { this._shutdownWS(); }, observe: function(aSubject, aTopic, aData) { switch (aTopic) { case "nsPref:changed": - if (aData == "dom.push.debug") { - gDebuggingEnabled = prefs.get("debug"); - } else if (aData == "dom.push.userAgentID") { + if (aData == "dom.push.userAgentID") { this._shutdownWS(); this._reconnectAfterBackoff(); } break; case "timer-callback": if (aSubject == this._requestTimeoutTimer) { if (Object.keys(this._registerRequests).length === 0) { this._requestTimeoutTimer.cancel(); @@ -185,20 +179,20 @@ this.PushServiceWebSocket = { // Set to true if at least one request timed out. let requestTimedOut = false; for (let channelID in this._registerRequests) { let duration = Date.now() - this._registerRequests[channelID].ctime; // If any of the registration requests time out, all the ones after it // also made to fail, since we are going to be disconnecting the // socket. if (requestTimedOut || duration > this._requestTimeout) { - debug("Request timeout: Removing " + channelID); requestTimedOut = true; this._registerRequests[channelID] - .reject({status: 0, error: "TimeoutError"}); + .reject(new Error("Register request timed out for channel ID " + + channelID)); delete this._registerRequests[channelID]; } } // The most likely reason for a registration request timing out is // that the socket has disconnected. Best to reconnect. if (requestTimedOut) { @@ -206,47 +200,47 @@ this.PushServiceWebSocket = { } } break; } }, checkServerURI: function(serverURL) { if (!serverURL) { - debug("No dom.push.serverURL found!"); + console.warn("checkServerURI: No dom.push.serverURL found"); return; } let uri; try { uri = Services.io.newURI(serverURL, null, null); } catch(e) { - debug("Error creating valid URI from dom.push.serverURL (" + - serverURL + ")"); + console.warn("checkServerURI: Error creating valid URI from", + "dom.push.serverURL", serverURL); return null; } if (uri.scheme !== "wss") { - debug("Unsupported websocket scheme " + uri.scheme); + console.warn("checkServerURI: Unsupported websocket scheme", uri.scheme); return null; } return uri; }, get _UAID() { return prefs.get("userAgentID"); }, set _UAID(newID) { if (typeof(newID) !== "string") { - debug("Got invalid, non-string UAID " + newID + - ". Not updating userAgentID"); + console.warn("Got invalid, non-string UAID", newID, + "Not updating userAgentID"); return; } - debug("New _UAID: " + newID); + console.debug("New _UAID", newID); prefs.set("userAgentID", newID); }, _ws: null, _registerRequests: {}, _currentState: STATE_SHUT_DOWN, _requestTimeout: 0, _requestTimeoutTimer: null, @@ -303,26 +297,27 @@ this.PushServiceWebSocket = { _dataEnabled: false, /** * Sends a message to the Push Server through an open websocket. * typeof(msg) shall be an object */ _wsSendMessage: function(msg) { if (!this._ws) { - debug("No WebSocket initialized. Cannot send a message."); + console.warn("wsSendMessage: No WebSocket initialized.", + "Cannot send a message"); return; } msg = JSON.stringify(msg); - debug("Sending message: " + msg); + console.debug("wsSendMessage: Sending message", msg); this._ws.sendMsg(msg); }, init: function(options, mainPushService, serverURI) { - debug("init()"); + console.debug("init()"); this._mainPushService = mainPushService; this._serverURI = serverURI; // Override the default WebSocket factory function. The returned object // must be null or satisfy the nsIWebSocketChannel interface. Used by // the tests to provide a mock WebSocket implementation. if (options.makeWebSocket) { @@ -339,28 +334,26 @@ this.PushServiceWebSocket = { this._networkInfo = options.networkInfo; if (!this._networkInfo) { this._networkInfo = PushNetworkInfo; } this._requestTimeout = prefs.get("requestTimeout"); this._adaptiveEnabled = prefs.get('adaptive.enabled'); this._upperLimit = prefs.get('adaptive.upperLimit'); - gDebuggingEnabled = prefs.get("debug"); - prefs.observe("debug", this); }, _reconnect: function () { - debug("reconnect()"); + console.debug("reconnect()"); this._shutdownWS(false); this._reconnectAfterBackoff(); }, _shutdownWS: function(shouldCancelPending = true) { - debug("shutdownWS()"); + console.debug("shutdownWS()"); this._currentState = STATE_SHUT_DOWN; this._willBeWokenUpByUDP = false; prefs.ignore("userAgentID", this); if (this._wsListener) { this._wsListener._pushService = null; } @@ -368,32 +361,30 @@ this.PushServiceWebSocket = { this._ws.close(0, null); } catch (e) {} this._ws = null; this._waitingForPong = false; if (this._mainPushService) { this._mainPushService.stopAlarm(); } else { - dump("This should not happend"); + console.error("shutdownWS: Uninitialized push service"); } if (shouldCancelPending) { this._cancelRegisterRequests(); } if (this._notifyRequestQueue) { this._notifyRequestQueue(); this._notifyRequestQueue = null; } }, uninit: function() { - prefs.ignore("debug", this); - if (this._udpServer) { this._udpServer.close(); this._udpServer = null; } // All pending requests (ideally none) are dropped at this point. We // shouldn't have any applications performing registration/unregistration // or receiving notifications. @@ -421,32 +412,33 @@ this.PushServiceWebSocket = { * If we are in the middle of a timeout (i.e. waiting), but * a register/unregister is called, we don't want to wait around anymore. * _sendRequest will automatically call beginWSSetup(), which will cancel the * timer. In addition since the state will have changed, even if a pending * timer event comes in (because the timer fired the event before it was * cancelled), so the connection won't be reset. */ _reconnectAfterBackoff: function() { - debug("reconnectAfterBackoff()"); + console.debug("reconnectAfterBackoff()"); //Calculate new ping interval this._calculateAdaptivePing(true /* wsWentDown */); // Calculate new timeout, but cap it to pingInterval. let retryTimeout = prefs.get("retryBaseInterval") * Math.pow(2, this._retryFailCount); retryTimeout = Math.min(retryTimeout, prefs.get("pingInterval")); this._retryFailCount++; - debug("Retry in " + retryTimeout + " Try number " + this._retryFailCount); + console.debug("reconnectAfterBackoff: Retry in", retryTimeout, + "Try number", this._retryFailCount); if (this._mainPushService) { this._mainPushService.setAlarm(retryTimeout); } else { - dump("This should not happend"); + console.error("reconnectAfterBackoff: Uninitialized push service"); } }, /** * We need to calculate a new ping based on: * 1) Latest good ping * 2) A safe gap between 1) and the calculated new ping (which is * by default, 1 minute) @@ -466,49 +458,49 @@ this.PushServiceWebSocket = { * valid ping, to ensure better battery life and network resources usage. * * The value is saved in dom.push.pingInterval * @param wsWentDown [Boolean] if the WebSocket was closed or it is still * alive * */ _calculateAdaptivePing: function(wsWentDown) { - debug('_calculateAdaptivePing()'); + console.debug("_calculateAdaptivePing()"); if (!this._adaptiveEnabled) { - debug('Adaptive ping is disabled'); + console.debug("calculateAdaptivePing: Adaptive ping is disabled"); return; } if (this._retryFailCount > 0) { - debug('Push has failed to connect to the Push Server ' + - this._retryFailCount + ' times. ' + - 'Do not calculate a new pingInterval now'); + console.warn("calculateAdaptivePing: Push has failed to connect to the", + "Push Server", this._retryFailCount, "times. Do not calculate a new", + "pingInterval now"); return; } if (!this._recalculatePing && !wsWentDown) { - debug('We do not need to recalculate the ping now, based on previous ' + - 'data'); + console.debug("calculateAdaptivePing: We do not need to recalculate the", + "ping now, based on previous data"); return; } // Save actual state of the network let ns = this._networkInfo.getNetworkInformation(); if (ns.ip) { // mobile - debug('mobile'); + console.debug("calculateAdaptivePing: mobile"); let oldNetwork = prefs.get('adaptive.mobile'); let newNetwork = 'mobile-' + ns.mcc + '-' + ns.mnc; // Mobile networks differ, reset all intervals and pings if (oldNetwork !== newNetwork) { // Network differ, reset all values - debug('Mobile networks differ. Old network is ' + oldNetwork + - ' and new is ' + newNetwork); + console.debug("calculateAdaptivePing: Mobile networks differ. Old", + "network is", oldNetwork, "and new is", newNetwork); prefs.set('adaptive.mobile', newNetwork); //We reset the upper bound member this._recalculatePing = true; this._pingIntervalRetryTimes = {}; // Put default values let defaultPing = prefs.get('pingInterval.default'); prefs.set('pingInterval', defaultPing); @@ -517,112 +509,116 @@ this.PushServiceWebSocket = { } else { // Mobile network is the same, let's just update things prefs.set('pingInterval', prefs.get('pingInterval.mobile')); this._lastGoodPingInterval = prefs.get('adaptive.lastGoodPingInterval.mobile'); } } else { // wifi - debug('wifi'); + console.debug("calculateAdaptivePing: wifi"); prefs.set('pingInterval', prefs.get('pingInterval.wifi')); this._lastGoodPingInterval = prefs.get('adaptive.lastGoodPingInterval.wifi'); } let nextPingInterval; let lastTriedPingInterval = prefs.get('pingInterval'); if (wsWentDown) { - debug('The WebSocket was disconnected, calculating next ping'); + console.debug("calculateAdaptivePing: The WebSocket was disconnected.", + "Calculating next ping"); // If we have not tried this pingInterval yet, initialize this._pingIntervalRetryTimes[lastTriedPingInterval] = (this._pingIntervalRetryTimes[lastTriedPingInterval] || 0) + 1; // Try the pingInterval at least 3 times, just to be sure that the // calculated interval is not valid. if (this._pingIntervalRetryTimes[lastTriedPingInterval] < 2) { - debug('pingInterval= ' + lastTriedPingInterval + ' tried only ' + - this._pingIntervalRetryTimes[lastTriedPingInterval] + ' times'); + console.debug("calculateAdaptivePing: pingInterval=", + lastTriedPingInterval, "tried only", + this._pingIntervalRetryTimes[lastTriedPingInterval], "times"); return; } // Latest ping was invalid, we need to lower the limit to limit / 2 nextPingInterval = Math.floor(lastTriedPingInterval / 2); // If the new ping interval is close to the last good one, we are near // optimum, so stop calculating. if (nextPingInterval - this._lastGoodPingInterval < prefs.get('adaptive.gap')) { - debug('We have reached the gap, we have finished the calculation'); - debug('nextPingInterval=' + nextPingInterval); - debug('lastGoodPing=' + this._lastGoodPingInterval); + console.debug("calculateAdaptivePing: We have reached the gap, we", + "have finished the calculation. nextPingInterval=", nextPingInterval, + "lastGoodPing=", this._lastGoodPingInterval); nextPingInterval = this._lastGoodPingInterval; this._recalculatePing = false; } else { - debug('We need to calculate next time'); + console.debug("calculateAdaptivePing: We need to calculate next time"); this._recalculatePing = true; } } else { - debug('The WebSocket is still up'); + console.debug("calculateAdaptivePing: The WebSocket is still up"); this._lastGoodPingInterval = lastTriedPingInterval; nextPingInterval = Math.floor(lastTriedPingInterval * 1.5); } // Check if we have reached the upper limit if (this._upperLimit < nextPingInterval) { - debug('Next ping will be bigger than the configured upper limit, ' + - 'capping interval'); + console.debug("calculateAdaptivePing: Next ping will be bigger than the", + "configured upper limit, capping interval"); this._recalculatePing = false; this._lastGoodPingInterval = lastTriedPingInterval; nextPingInterval = lastTriedPingInterval; } - debug('Setting the pingInterval to ' + nextPingInterval); + console.debug("calculateAdaptivePing: Setting the pingInterval to", + nextPingInterval); prefs.set('pingInterval', nextPingInterval); //Save values for our current network if (ns.ip) { prefs.set('pingInterval.mobile', nextPingInterval); prefs.set('adaptive.lastGoodPingInterval.mobile', this._lastGoodPingInterval); } else { prefs.set('pingInterval.wifi', nextPingInterval); prefs.set('adaptive.lastGoodPingInterval.wifi', this._lastGoodPingInterval); } }, _makeWebSocket: function(uri) { if (!prefs.get("connection.enabled")) { - debug("_makeWebSocket: connection.enabled is not set to true. Aborting."); + console.warn("makeWebSocket: connection.enabled is not set to true.", + "Aborting."); return null; } if (Services.io.offline) { - debug("Network is offline."); + console.warn("makeWebSocket: Network is offline."); return null; } let socket = Cc["@mozilla.org/network/protocol;1?name=wss"] .createInstance(Ci.nsIWebSocketChannel); socket.initLoadInfo(null, // aLoadingNode Services.scriptSecurityManager.getSystemPrincipal(), null, // aTriggeringPrincipal Ci.nsILoadInfo.SEC_NORMAL, Ci.nsIContentPolicy.TYPE_WEBSOCKET); return socket; }, _beginWSSetup: function() { - debug("beginWSSetup()"); + console.debug("beginWSSetup()"); if (this._currentState != STATE_SHUT_DOWN) { - debug("_beginWSSetup: Not in shutdown state! Current state " + - this._currentState); + console.error("_beginWSSetup: Not in shutdown state! Current state", + this._currentState); return; } // Stop any pending reconnects scheduled for the near future. if (this._mainPushService) { this._mainPushService.stopAlarm(); } @@ -631,34 +627,35 @@ this.PushServiceWebSocket = { return; } let socket = this._makeWebSocket(uri); if (!socket) { return; } this._ws = socket.QueryInterface(Ci.nsIWebSocketChannel); - debug("serverURL: " + uri.spec); + console.debug("beginWSSetup: Connecting to", uri.spec); this._wsListener = new PushWebSocketListener(this); this._ws.protocol = "push-notification"; try { // Grab a wakelock before we open the socket to ensure we don't go to // sleep before connection the is opened. this._ws.asyncOpen(uri, uri.spec, 0, this._wsListener, null); this._acquireWakeLock(); this._currentState = STATE_WAITING_FOR_WS_START; } catch(e) { - debug("Error opening websocket. asyncOpen failed!"); + console.error("beginWSSetup: Error opening websocket.", + "asyncOpen failed", e); this._reconnect(); } }, connect: function(records) { - debug("connect"); + console.debug("connect()"); // Check to see if we need to do anything. if (records.length > 0) { this._beginWSSetup(); } }, isConnected: function() { return !!this._ws; @@ -689,17 +686,18 @@ this.PushServiceWebSocket = { * WebSocket by sending a ping. Since incoming data is a sign of the * connection being up, the ping alarm is reset every time data is * received. */ onAlarmFired: function() { // Conditions are arranged in decreasing specificity. // i.e. when _waitingForPong is true, other conditions are also true. if (this._waitingForPong) { - debug("Did not receive pong in time. Reconnecting WebSocket."); + console.debug("onAlarmFired: Did not receive pong in time.", + "Reconnecting WebSocket"); this._reconnect(); } else if (this._currentState == STATE_READY) { // Send a ping. // Bypass the queue; we don't want this to be kept pending. // Watch out for exception in case the socket has disconnected. // When this happens, we pretend the ping was sent and don't specially // handle the exception, as the lack of a pong will lead to the socket @@ -708,17 +706,17 @@ this.PushServiceWebSocket = { this._wsSendMessage({}); } catch (e) { } this._waitingForPong = true; this._mainPushService.setAlarm(prefs.get("requestTimeout")); } else if (this._mainPushService && this._mainPushService._alarmID !== null) { - debug("reconnect alarm fired."); + console.debug("onAlarmFired: reconnect alarm fired"); // Reconnect after back-off. // The check for a non-null _alarmID prevents a situation where the alarm // fires, but _shutdownWS() is called from another code-path (e.g. // network state change) and we don't want to reconnect. // // It also handles the case where _beginWSSetup() is called from another // code-path. // @@ -733,79 +731,79 @@ this.PushServiceWebSocket = { _acquireWakeLock: function() { if (!AppConstants.MOZ_B2G) { return; } // Disable the wake lock on non-B2G platforms to work around bug 1154492. if (!this._socketWakeLock) { - debug("Acquiring Socket Wakelock"); + console.debug("acquireWakeLock: Acquiring Socket Wakelock"); this._socketWakeLock = gPowerManagerService.newWakeLock("cpu"); } if (!this._socketWakeLockTimer) { - debug("Creating Socket WakeLock Timer"); + console.debug("acquireWakeLock: Creating Socket WakeLock Timer"); this._socketWakeLockTimer = Cc["@mozilla.org/timer;1"] .createInstance(Ci.nsITimer); } - debug("Setting Socket WakeLock Timer"); + console.debug("acquireWakeLock: Setting Socket WakeLock Timer"); this._socketWakeLockTimer .initWithCallback(this._releaseWakeLock.bind(this), // Allow the same time for socket setup as we do for // requests after the setup. Fudge it a bit since // timers can be a little off and we don't want to go // to sleep just as the socket connected. this._requestTimeout + 1000, Ci.nsITimer.TYPE_ONE_SHOT); }, _releaseWakeLock: function() { if (!AppConstants.MOZ_B2G) { return; } - debug("Releasing Socket WakeLock"); + console.debug("releaseWakeLock: Releasing Socket WakeLock"); if (this._socketWakeLockTimer) { this._socketWakeLockTimer.cancel(); } if (this._socketWakeLock) { this._socketWakeLock.unlock(); this._socketWakeLock = null; } }, /** * Protocol handler invoked by server message. */ _handleHelloReply: function(reply) { - debug("handleHelloReply()"); + console.debug("handleHelloReply()"); if (this._currentState != STATE_WAITING_FOR_HELLO) { - debug("Unexpected state " + this._currentState + - "(expected STATE_WAITING_FOR_HELLO)"); + console.error("handleHelloReply: Unexpected state", this._currentState, + "(expected STATE_WAITING_FOR_HELLO)"); this._shutdownWS(); return; } if (typeof reply.uaid !== "string") { - debug("No UAID received or non string UAID received"); + console.error("handleHelloReply: Received invalid UAID", reply.uaid); this._shutdownWS(); return; } if (reply.uaid === "") { - debug("Empty UAID received!"); + console.error("handleHelloReply: Received empty UAID"); this._shutdownWS(); return; } // To avoid sticking extra large values sent by an evil server into prefs. if (reply.uaid.length > 128) { - debug("UAID received from server was too long: " + - reply.uaid); + console.error("handleHelloReply: UAID received from server was too long", + reply.uaid); this._shutdownWS(); return; } let sendRequests = () => { if (this._notifyRequestQueue) { this._notifyRequestQueue(); this._notifyRequestQueue = null; @@ -818,49 +816,50 @@ this.PushServiceWebSocket = { this._currentState = STATE_READY; prefs.observe("userAgentID", this); this._dataEnabled = !!reply.use_webpush; if (this._dataEnabled) { this._mainPushService.getAllUnexpired().then(records => Promise.all(records.map(record => this._mainPushService.ensureP256dhKey(record).catch(error => { - debug("finishHandshake: Error updating record " + record.keyID); + console.error("finishHandshake: Error updating record", + record.keyID, error); }) )) ).then(sendRequests); } else { sendRequests(); } } // By this point we've got a UAID from the server that we are ready to // accept. // // We unconditionally drop all existing registrations and notify service // workers if we receive a new UAID. This ensures we expunge all stale // registrations if the `userAgentID` pref is reset. if (this._UAID != reply.uaid) { - debug("got new UAID: all re-register"); + console.debug("handleHelloReply: Received new UAID"); this._mainPushService.dropRegistrations() .then(finishHandshake.bind(this)); return; } // otherwise we are good to go finishHandshake.bind(this)(); }, /** * Protocol handler invoked by server message. */ _handleRegisterReply: function(reply) { - debug("handleRegisterReply()"); + console.debug("handleRegisterReply()"); if (typeof reply.channelID !== "string" || typeof this._registerRequests[reply.channelID] !== "object") { return; } let tmp = this._registerRequests[reply.channelID]; delete this._registerRequests[reply.channelID]; if (Object.keys(this._registerRequests).length === 0 && @@ -868,43 +867,43 @@ this.PushServiceWebSocket = { this._requestTimeoutTimer.cancel(); } if (reply.status == 200) { try { Services.io.newURI(reply.pushEndpoint, null, null); } catch (e) { - debug("Invalid pushEndpoint " + reply.pushEndpoint); - tmp.reject({state: 0, error: "Invalid pushEndpoint " + - reply.pushEndpoint}); + tmp.reject(new Error("Invalid push endpoint: " + reply.pushEndpoint)); return; } let record = new PushRecordWebSocket({ channelID: reply.channelID, pushEndpoint: reply.pushEndpoint, scope: tmp.record.scope, originAttributes: tmp.record.originAttributes, version: null, quota: tmp.record.maxQuota, ctime: Date.now(), }); - dump("PushWebSocket " + JSON.stringify(record)); Services.telemetry.getHistogramById("PUSH_API_SUBSCRIBE_WS_TIME").add(Date.now() - tmp.ctime); tmp.resolve(record); } else { - tmp.reject(reply); + console.error("handleRegisterReply: Unexpected server response", reply); + tmp.reject(new Error("Wrong status code for register reply: " + + reply.status)); } }, _handleDataUpdate: function(update) { let promise; if (typeof update.channelID != "string") { - debug("handleDataUpdate: Discarding message without channel ID"); + console.warn("handleDataUpdate: Discarding update without channel ID", + update); return; } // Unconditionally ack the update. This is important because the Push // server requires the client to ack all outstanding updates before // resuming delivery. However, the server doesn't verify the encryption // params, and can't ensure that an update is encrypted correctly because // it doesn't have the private key. Thus, if we only acked valid updates, // it would be possible for a single invalid one to block delivery of all @@ -916,58 +915,60 @@ this.PushServiceWebSocket = { update.channelID, null, null, record => record ); } else { let params = getCryptoParams(update.headers); if (!params) { - debug("handleDataUpdate: Discarding invalid encrypted message"); + console.warn("handleDataUpdate: Discarding invalid encrypted message", + update); return; } let message = base64UrlDecode(update.data); promise = this._mainPushService.receivedPushMessage( update.channelID, message, params, record => record ); } promise.catch(err => { - debug("handleDataUpdate: Error delivering message: " + err); + console.error("handleDataUpdate: Error delivering message", err); }); }, /** * Protocol handler invoked by server message. */ _handleNotificationReply: function(reply) { - debug("handleNotificationReply()"); + console.debug("handleNotificationReply()"); if (this._dataEnabled) { this._handleDataUpdate(reply); return; } if (typeof reply.updates !== 'object') { - debug("No 'updates' field in response. Type = " + typeof reply.updates); + console.warn("handleNotificationReply: Missing updates", reply.updates); return; } - debug("Reply updates: " + reply.updates.length); + console.debug("handleNotificationReply: Got updates", reply.updates); for (let i = 0; i < reply.updates.length; i++) { let update = reply.updates[i]; - debug("Update: " + update.channelID + ": " + update.version); + console.debug("handleNotificationReply: Handling update", update); if (typeof update.channelID !== "string") { - debug("Invalid update literal at index " + i); + console.debug("handleNotificationReply: Invalid update at index", + i, update); continue; } if (update.version === undefined) { - debug("update.version does not exist"); + console.debug("handleNotificationReply: Missing version", update); continue; } let version = update.version; if (typeof version === "string") { version = parseInt(version, 10); } @@ -978,33 +979,33 @@ this.PushServiceWebSocket = { this._receivedUpdate(update.channelID, version); this._sendAck(update.channelID, version); } } }, // FIXME(nsm): batch acks for efficiency reasons. _sendAck: function(channelID, version) { - debug("sendAck()"); + console.debug("sendAck()"); var data = {messageType: 'ack', updates: [{channelID: channelID, version: version}] }; this._queueRequest(data); }, _generateID: function() { let uuidGenerator = Cc["@mozilla.org/uuid-generator;1"] .getService(Ci.nsIUUIDGenerator); // generateUUID() gives a UUID surrounded by {...}, slice them off. return uuidGenerator.generateUUID().toString().slice(1, -1); }, request: function(action, record) { - debug("request() " + action); + console.debug("request() ", action); if (Object.keys(this._registerRequests).length === 0) { // start the timer since we now have at least one request if (!this._requestTimeoutTimer) { this._requestTimeoutTimer = Cc["@mozilla.org/timer;1"] .createInstance(Ci.nsITimer); } this._requestTimeoutTimer.init(this, @@ -1040,17 +1041,17 @@ this.PushServiceWebSocket = { messageType: action}); return Promise.resolve(); }, _queueStart: Promise.resolve(), _notifyRequestQueue: null, _queue: null, _enqueue: function(op) { - debug("enqueue"); + console.debug("enqueue()"); if (!this._queue) { this._queue = this._queueStart; } this._queue = this._queue .then(op) .catch(_ => {}); }, @@ -1096,39 +1097,40 @@ this.PushServiceWebSocket = { if (!this._ws && this._notifyRequestQueue) { this._notifyRequestQueue(); this._notifyRequestQueue = null; } } }, _receivedUpdate: function(aChannelID, aLatestVersion) { - debug("Updating: " + aChannelID + " -> " + aLatestVersion); + console.debug("receivedUpdate: Updating", aChannelID, "->", aLatestVersion); this._mainPushService.receivedPushMessage(aChannelID, null, null, record => { if (record.version === null || record.version < aLatestVersion) { - debug("Version changed for " + aChannelID + ": " + aLatestVersion); + console.debug("receivedUpdate: Version changed for", aChannelID, + aLatestVersion); record.version = aLatestVersion; return record; } - debug("No significant version change for " + aChannelID + ": " + - aLatestVersion); + console.debug("receivedUpdate: No significant version change for", + aChannelID, aLatestVersion); return null; }); }, // begin Push protocol handshake _wsOnStart: function(context) { - debug("wsOnStart()"); + console.debug("wsOnStart()"); this._releaseWakeLock(); if (this._currentState != STATE_WAITING_FOR_WS_START) { - debug("NOT in STATE_WAITING_FOR_WS_START. Current state " + - this._currentState + ". Skipping"); + console.error("wsOnStart: NOT in STATE_WAITING_FOR_WS_START. Current", + "state", this._currentState, "Skipping"); return; } let data = { messageType: "hello", use_webpush: true, }; @@ -1162,53 +1164,53 @@ this.PushServiceWebSocket = { /** * This statusCode is not the websocket protocol status code, but the TCP * connection close status code. * * If we do not explicitly call ws.close() then statusCode is always * NS_BASE_STREAM_CLOSED, even on a successful close. */ _wsOnStop: function(context, statusCode) { - debug("wsOnStop()"); + console.debug("wsOnStop()"); this._releaseWakeLock(); if (statusCode != Cr.NS_OK && !(statusCode == Cr.NS_BASE_STREAM_CLOSED && this._willBeWokenUpByUDP)) { - debug("Socket error " + statusCode); + console.debug("wsOnStop: Socket error", statusCode); this._reconnect(); return; } this._shutdownWS(); }, _wsOnMessageAvailable: function(context, message) { - debug("wsOnMessageAvailable() " + message); + console.debug("wsOnMessageAvailable()", message); this._waitingForPong = false; let reply; try { reply = JSON.parse(message); } catch(e) { - debug("Parsing JSON failed. text : " + message); + console.warn("wsOnMessageAvailable: Invalid JSON", message, e); return; } // If we receive a message, we know the connection succeeded. Reset the // connection attempt and ping interval counters. this._retryFailCount = 0; this._pingIntervalRetryTimes = {}; let doNotHandle = false; if ((message === '{}') || (reply.messageType === undefined) || (reply.messageType === "ping") || (typeof reply.messageType != "string")) { - debug('Pong received'); + console.debug("wsOnMessageAvailable: Pong received"); this._calculateAdaptivePing(false); doNotHandle = true; } // Reset the ping timer. Note: This path is executed at every step of the // handshake, so this alarm does not need to be set explicitly at startup. this._mainPushService.setAlarm(prefs.get("pingInterval")); @@ -1222,127 +1224,131 @@ this.PushServiceWebSocket = { let handlers = ["Hello", "Register", "Notification"]; // Build up the handler name to call from messageType. // e.g. messageType == "register" -> _handleRegisterReply. let handlerName = reply.messageType[0].toUpperCase() + reply.messageType.slice(1).toLowerCase(); if (handlers.indexOf(handlerName) == -1) { - debug("No whitelisted handler " + handlerName + ". messageType: " + - reply.messageType); + console.warn("wsOnMessageAvailable: No whitelisted handler", handlerName, + "for message", reply.messageType); return; } let handler = "_handle" + handlerName + "Reply"; if (typeof this[handler] !== "function") { - debug("Handler whitelisted but not implemented! " + handler); + console.warn("wsOnMessageAvailable: Handler", handler, + "whitelisted but not implemented"); return; } this[handler](reply); }, /** * The websocket should never be closed. Since we don't call ws.close(), * _wsOnStop() receives error code NS_BASE_STREAM_CLOSED (see comment in that * function), which calls reconnect and re-establishes the WebSocket * connection. * * If the server said it'll use UDP for wakeup, we set _willBeWokenUpByUDP * and stop reconnecting in _wsOnStop(). */ _wsOnServerClose: function(context, aStatusCode, aReason) { - debug("wsOnServerClose() " + aStatusCode + " " + aReason); + console.debug("wsOnServerClose()", aStatusCode, aReason); // Switch over to UDP. if (aStatusCode == kUDP_WAKEUP_WS_STATUS_CODE) { - debug("Server closed with promise to wake up"); + console.debug("wsOnServerClose: Server closed with promise to wake up"); this._willBeWokenUpByUDP = true; // TODO: there should be no pending requests } }, /** * Rejects all pending register requests with errors. */ _cancelRegisterRequests: function() { for (let channelID in this._registerRequests) { let request = this._registerRequests[channelID]; delete this._registerRequests[channelID]; - request.reject({status: 0, error: "AbortError"}); + request.reject(new Error("Register request aborted")); } }, _makeUDPSocket: function() { return Cc["@mozilla.org/network/udp-socket;1"] .createInstance(Ci.nsIUDPSocket); }, /** * This method should be called only if the device is on a mobile network! */ _listenForUDPWakeup: function() { - debug("listenForUDPWakeup()"); + console.debug("listenForUDPWakeup()"); if (this._udpServer) { - debug("UDP Server already running"); + console.warn("listenForUDPWakeup: UDP Server already running"); return; } if (!prefs.get("udp.wakeupEnabled")) { - debug("UDP support disabled"); + console.debug("listenForUDPWakeup: UDP support disabled"); return; } let socket = this._makeUDPSocket(); if (!socket) { return; } this._udpServer = socket.QueryInterface(Ci.nsIUDPSocket); this._udpServer.init(-1, false, Services.scriptSecurityManager.getSystemPrincipal()); this._udpServer.asyncListen(this); - debug("listenForUDPWakeup listening on " + this._udpServer.port); + console.debug("listenForUDPWakeup: Listening on", this._udpServer.port); return this._udpServer.port; }, /** * Called by UDP Server Socket. As soon as a ping is recieved via UDP, * reconnect the WebSocket and get the actual data. */ onPacketReceived: function(aServ, aMessage) { - debug("Recv UDP datagram on port: " + this._udpServer.port); + console.debug("onPacketReceived: Recv UDP datagram on port", + this._udpServer.port); this._beginWSSetup(); }, /** * Called by UDP Server Socket if the socket was closed for some reason. * * If this happens, we reconnect the WebSocket to not miss out on * notifications. */ onStopListening: function(aServ, aStatus) { - debug("UDP Server socket was shutdown. Status: " + aStatus); + console.debug("onStopListening: UDP Server socket was shutdown. Status", + aStatus); this._udpServer = undefined; this._beginWSSetup(); }, }; var PushNetworkInfo = { /** * Returns information about MCC-MNC and the IP of the current connection. */ getNetworkInformation: function() { - debug("getNetworkInformation()"); + console.debug("PushNetworkInfo: getNetworkInformation()"); try { if (!prefs.get("udp.wakeupEnabled")) { - debug("UDP support disabled, we do not send any carrier info"); + console.debug("getNetworkInformation: UDP support disabled, we do not", + "send any carrier info"); throw new Error("UDP disabled"); } let nm = Cc["@mozilla.org/network/manager;1"] .getService(Ci.nsINetworkManager); if (nm.activeNetworkInfo && nm.activeNetworkInfo.type == Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE) { let iccService = Cc["@mozilla.org/icc/iccservice;1"] @@ -1351,58 +1357,59 @@ var PushNetworkInfo = { // In Multi-sim, there is more than one client in iccService. Each // client represents a icc handle. To maintain backward compatibility // with single sim, we always use client 0 for now. Adding support // for multiple sim will be addressed in bug 927721, if needed. let clientId = 0; let icc = iccService.getIccByServiceId(clientId); let iccInfo = icc && icc.iccInfo; if (iccInfo) { - debug("Running on mobile data"); + console.debug("getNetworkInformation: Running on mobile data"); let ips = {}; let prefixLengths = {}; nm.activeNetworkInfo.getAddresses(ips, prefixLengths); return { mcc: iccInfo.mcc, mnc: iccInfo.mnc, ip: ips.value[0] }; } } } catch (e) { - debug("Error recovering mobile network information: " + e); + console.error("getNetworkInformation: Error recovering mobile network", + "information", e); } - debug("Running on wifi"); + console.debug("getNetworkInformation: Running on wifi"); return { mcc: 0, mnc: 0, ip: undefined }; }, /** * Get mobile network information to decide if the client is capable of being * woken up by UDP (which currently just means having an mcc and mnc along * with an IP, and optionally a netid). */ getNetworkState: function(callback) { - debug("getNetworkState()"); + console.debug("PushNetworkInfo: getNetworkState()"); if (typeof callback !== 'function') { throw new Error("No callback method. Aborting push agent !"); } var networkInfo = this.getNetworkInformation(); if (networkInfo.ip) { this._getMobileNetworkId(networkInfo, function(netid) { - debug("Recovered netID = " + netid); + console.debug("getNetworkState: Recovered netID", netid); callback({ mcc: networkInfo.mcc, mnc: networkInfo.mnc, ip: networkInfo.ip, netid: netid }); }); } else { @@ -1414,42 +1421,41 @@ var PushNetworkInfo = { * Get the mobile network ID (netid) * * @param networkInfo * Network information object { mcc, mnc, ip, port } * @param callback * Callback function to invoke with the netid or null if not found */ _getMobileNetworkId: function(networkInfo, callback) { + console.debug("PushNetworkInfo: getMobileNetworkId()"); if (typeof callback !== 'function') { return; } function queryDNSForDomain(domain) { - debug("[_getMobileNetworkId:queryDNSForDomain] Querying DNS for " + - domain); + console.debug("queryDNSForDomain: Querying DNS for", domain); let netIDDNSListener = { onLookupComplete: function(aRequest, aRecord, aStatus) { if (aRecord) { let netid = aRecord.getNextAddrAsString(); - debug("[_getMobileNetworkId:queryDNSForDomain] NetID found: " + - netid); + console.debug("queryDNSForDomain: NetID found", netid); callback(netid); } else { - debug("[_getMobileNetworkId:queryDNSForDomain] NetID not found"); + console.debug("queryDNSForDomain: NetID not found"); callback(null); } } }; gDNSService.asyncResolve(domain, 0, netIDDNSListener, threadManager.currentThread); return []; } - debug("[_getMobileNetworkId:queryDNSForDomain] Getting mobile network ID"); + console.debug("getMobileNetworkId: Getting mobile network ID"); let netidAddress = "wakeup.mnc" + ("00" + networkInfo.mnc).slice(-3) + ".mcc" + ("00" + networkInfo.mcc).slice(-3) + ".3gppnetwork.org"; queryDNSForDomain(netidAddress, callback); } }; function PushRecordWebSocket(record) {
--- a/dom/push/test/test_multiple_register.html +++ b/dom/push/test/test_multiple_register.html @@ -115,17 +115,16 @@ http://creativecommons.org/licenses/publ .then(unregister) .catch(function(e) { ok(false, "Some test failed with error " + e); }).then(SimpleTest.finish); } SpecialPowers.pushPrefEnv({"set": [ ["dom.push.enabled", true], - ["dom.push.debug", true], ["dom.serviceWorkers.exemptFromPerDomainMax", true], ["dom.serviceWorkers.enabled", true], ["dom.serviceWorkers.testing.enabled", true] ]}, runTest); SpecialPowers.addPermission("desktop-notification", true, document); SimpleTest.waitForExplicitFinish(); </script> </body>
--- a/dom/push/test/xpcshell/head.js +++ b/dom/push/test/xpcshell/head.js @@ -189,17 +189,17 @@ function disableServiceWorkerEvents(...s /** * Sets default PushService preferences. All pref names are prefixed with * `dom.push.`; any additional preferences will override the defaults. * * @param {Object} [prefs] Additional preferences to set. */ function setPrefs(prefs = {}) { let defaultPrefs = Object.assign({ - debug: true, + loglevel: 'all', serverURL: 'wss://push.example.org', 'connection.enabled': true, userAgentID: '', enabled: true, // Disable adaptive pings and UDP wake-up by default; these are // tested separately. 'adaptive.enabled': false, 'udp.wakeupEnabled': false,
--- a/dom/push/test/xpcshell/test_reconnect_retry.js +++ b/dom/push/test/xpcshell/test_reconnect_retry.js @@ -42,30 +42,31 @@ add_task(function* test_reconnect_retry( } if (registers == 2) { equal(request.channelID, channelID, 'Should retry registers after reconnect'); } this.serverSendMsg(JSON.stringify({ messageType: 'register', channelID: request.channelID, - pushEndpoint: 'https://example.org/push/' + registers, + pushEndpoint: 'https://example.org/push/' + request.channelID, status: 200, })); } }); } }); let registration = yield PushNotificationService.register( 'https://example.com/page/1', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false }) ); - equal(registration.channelID, channelID, 'Wrong channel ID for retried request'); + let retryEndpoint = 'https://example.org/push/' + channelID; + equal(registration.pushEndpoint, retryEndpoint, 'Wrong endpoint for retried request'); registration = yield PushNotificationService.register( 'https://example.com/page/2', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false }) ); - notEqual(registration.channelID, channelID, 'Wrong channel ID for new request'); + notEqual(registration.pushEndpoint, retryEndpoint, 'Wrong endpoint for new request') equal(registers, 3, 'Wrong registration count'); });
--- a/dom/push/test/xpcshell/test_register_5xxCode_http2.js +++ b/dom/push/test/xpcshell/test_register_5xxCode_http2.js @@ -86,25 +86,21 @@ add_task(function* test1() { let newRecord = yield PushNotificationService.register( 'https://example.com/retry5xxCode', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false }) ); var subscriptionUri = serverURL + '/subscription'; var pushEndpoint = serverURL + '/pushEndpoint'; var pushReceiptEndpoint = serverURL + '/receiptPushEndpoint'; - equal(newRecord.subscriptionUri, subscriptionUri, - 'Wrong subscription ID in registration record'); equal(newRecord.pushEndpoint, pushEndpoint, 'Wrong push endpoint in registration record'); equal(newRecord.pushReceiptEndpoint, pushReceiptEndpoint, 'Wrong push endpoint receipt in registration record'); - equal(newRecord.scope, 'https://example.com/retry5xxCode', - 'Wrong scope in registration record'); let record = yield db.getByKeyID(subscriptionUri); equal(record.subscriptionUri, subscriptionUri, 'Wrong subscription ID in database record'); equal(record.pushEndpoint, pushEndpoint, 'Wrong push endpoint in database record'); equal(record.pushReceiptEndpoint, pushReceiptEndpoint, 'Wrong push endpoint receipt in database record');
--- a/dom/push/test/xpcshell/test_register_case.js +++ b/dom/push/test/xpcshell/test_register_case.js @@ -49,17 +49,13 @@ add_task(function* test_register_case() let newRecord = yield waitForPromise( PushNotificationService.register('https://example.net/case', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false })), DEFAULT_TIMEOUT, 'Mixed-case register response timed out' ); equal(newRecord.pushEndpoint, 'https://example.com/update/case', 'Wrong push endpoint in registration record'); - equal(newRecord.scope, 'https://example.net/case', - 'Wrong scope in registration record'); - let record = yield db.getByKeyID(newRecord.channelID); - equal(record.pushEndpoint, 'https://example.com/update/case', - 'Wrong push endpoint in database record'); + let record = yield db.getByPushEndpoint('https://example.com/update/case'); equal(record.scope, 'https://example.net/case', 'Wrong scope in database record'); });
--- a/dom/push/test/xpcshell/test_register_error_http2.js +++ b/dom/push/test/xpcshell/test_register_error_http2.js @@ -44,20 +44,17 @@ add_task(function* test_pushSubscription serverURI: serverURL + "/pushSubscriptionNoConnection/subscribe", db }); yield rejects( PushNotificationService.register( 'https://example.net/page/invalid-response', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false })), - function(error) { - return error && error.includes("Error"); - }, - 'Wrong error for not being able to establish connecion.' + 'Expected error for not being able to establish connecion.' ); let record = yield db.getAllKeyIDs(); ok(record.length === 0, "Should not store records when connection couldn't be established."); PushService.uninit(); }); add_task(function* test_TLS() { @@ -85,20 +82,17 @@ add_task(function* test_pushSubscription serverURI: serverURL + "/pushSubscriptionMissingLocation/subscribe", db }); yield rejects( PushNotificationService.register( 'https://example.net/page/invalid-response', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false })), - function(error) { - return error && error.includes("Return code 201, but the answer is bogus"); - }, - 'Wrong error for the missing location header.' + 'Expected error for the missing location header.' ); let record = yield db.getAllKeyIDs(); ok(record.length === 0, 'Should not store records when the location header is missing.'); PushService.uninit(); }); add_task(function* test_pushSubscriptionMissingLink() { @@ -112,20 +106,17 @@ add_task(function* test_pushSubscription serverURI: serverURL + "/pushSubscriptionMissingLink/subscribe", db }); yield rejects( PushNotificationService.register( 'https://example.net/page/invalid-response', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false })), - function(error) { - return error && error.includes("Return code 201, but the answer is bogus"); - }, - 'Wrong error for the missing link header.' + 'Expected error for the missing link header.' ); let record = yield db.getAllKeyIDs(); ok(record.length === 0, 'Should not store records when a link header is missing.'); PushService.uninit(); }); add_task(function* test_pushSubscriptionMissingLink1() { @@ -139,20 +130,17 @@ add_task(function* test_pushSubscription serverURI: serverURL + "/pushSubscriptionMissingLink1/subscribe", db }); yield rejects( PushNotificationService.register( 'https://example.net/page/invalid-response', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false })), - function(error) { - return error && error.includes("Return code 201, but the answer is bogus"); - }, - 'Wrong error for the missing push endpoint.' + 'Expected error for the missing push endpoint.' ); let record = yield db.getAllKeyIDs(); ok(record.length === 0, 'Should not store records when the push endpoint is missing.'); PushService.uninit(); }); add_task(function* test_pushSubscriptionLocationBogus() { @@ -166,20 +154,17 @@ add_task(function* test_pushSubscription serverURI: serverURL + "/pushSubscriptionLocationBogus/subscribe", db }); yield rejects( PushNotificationService.register( 'https://example.net/page/invalid-response', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false })), - function(error) { - return error && error.includes("Return code 201, but URI is bogus."); - }, - 'Wrong error for the bogus location' + 'Expected error for the bogus location' ); let record = yield db.getAllKeyIDs(); ok(record.length === 0, 'Should not store records when location header is bogus.'); PushService.uninit(); }); add_task(function* test_pushSubscriptionNot2xxCode() { @@ -193,20 +178,17 @@ add_task(function* test_pushSubscription serverURI: serverURL + "/pushSubscriptionNot201Code/subscribe", db }); yield rejects( PushNotificationService.register( 'https://example.net/page/invalid-response', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false })), - function(error) { - return error && error.includes("Error"); - }, - 'Wrong error for not 201 responce code.' + 'Expected error for not 201 responce code.' ); let record = yield db.getAllKeyIDs(); ok(record.length === 0, 'Should not store records when respons code is not 201.'); }); add_task(function* test_complete() { prefs.setBoolPref("network.http.spdy.enforce-tls-profile", tlsProfile);
--- a/dom/push/test/xpcshell/test_register_flush.js +++ b/dom/push/test/xpcshell/test_register_flush.js @@ -75,30 +75,26 @@ add_task(function* test_register_flush() }); } }); let newRecord = yield PushNotificationService.register( 'https://example.com/page/2', ''); equal(newRecord.pushEndpoint, 'https://example.org/update/2', 'Wrong push endpoint in record'); - equal(newRecord.scope, 'https://example.com/page/2', - 'Wrong scope in record'); let {data: scope} = yield waitForPromise(notifyPromise, DEFAULT_TIMEOUT, 'Timed out waiting for notification'); equal(scope, 'https://example.com/page/1', 'Wrong notification scope'); yield waitForPromise(ackPromise, DEFAULT_TIMEOUT, 'Timed out waiting for acknowledgements'); let prevRecord = yield db.getByKeyID( '9bcc7efb-86c7-4457-93ea-e24e6eb59b74'); equal(prevRecord.pushEndpoint, 'https://example.org/update/1', 'Wrong existing push endpoint'); strictEqual(prevRecord.version, 3, 'Should record version updates sent before register responses'); - let registeredRecord = yield db.getByKeyID(newRecord.channelID); - equal(registeredRecord.pushEndpoint, 'https://example.org/update/2', - 'Wrong new push endpoint'); + let registeredRecord = yield db.getByPushEndpoint('https://example.org/update/2'); ok(!registeredRecord.version, 'Should not record premature updates'); });
--- a/dom/push/test/xpcshell/test_register_invalid_channel.js +++ b/dom/push/test/xpcshell/test_register_invalid_channel.js @@ -45,17 +45,14 @@ add_task(function* test_register_invalid } }); } }); yield rejects( PushNotificationService.register('https://example.com/invalid-channel', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false })), - function(error) { - return error == 'Invalid channel ID'; - }, - 'Wrong error for invalid channel ID' + 'Expected error for invalid channel ID' ); let record = yield db.getByKeyID(channelID); ok(!record, 'Should not store records for error responses'); });
--- a/dom/push/test/xpcshell/test_register_invalid_endpoint.js +++ b/dom/push/test/xpcshell/test_register_invalid_endpoint.js @@ -47,17 +47,14 @@ add_task(function* test_register_invalid }); } }); yield rejects( PushNotificationService.register( 'https://example.net/page/invalid-endpoint', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false })), - function(error) { - return error && error.includes('Invalid pushEndpoint'); - }, - 'Wrong error for invalid endpoint' + 'Expected error for invalid endpoint' ); let record = yield db.getByKeyID(channelID); ok(!record, 'Should not store records with invalid endpoints'); });
--- a/dom/push/test/xpcshell/test_register_invalid_json.js +++ b/dom/push/test/xpcshell/test_register_invalid_json.js @@ -46,18 +46,15 @@ add_task(function* test_register_invalid } }); } }); yield rejects( PushNotificationService.register('https://example.net/page/invalid-json', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false })), - function(error) { - return error == 'TimeoutError'; - }, - 'Wrong error for invalid JSON response' + 'Expected error for invalid JSON response' ); yield waitForPromise(helloPromise, DEFAULT_TIMEOUT, 'Reconnect after invalid JSON response timed out'); equal(registers, 1, 'Wrong register count'); });
--- a/dom/push/test/xpcshell/test_register_no_id.js +++ b/dom/push/test/xpcshell/test_register_no_id.js @@ -50,18 +50,15 @@ add_task(function* test_register_no_id() } }); } }); yield rejects( PushNotificationService.register('https://example.com/incomplete', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false })), - function(error) { - return error == 'TimeoutError'; - }, - 'Wrong error for incomplete register response' + 'Expected error for incomplete register response' ); yield waitForPromise(helloPromise, DEFAULT_TIMEOUT, 'Reconnect after incomplete register response timed out'); equal(registers, 1, 'Wrong register count'); });
--- a/dom/push/test/xpcshell/test_register_request_queue.js +++ b/dom/push/test/xpcshell/test_register_request_queue.js @@ -50,19 +50,15 @@ add_task(function* test_register_request ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false }) ); let secondRegister = PushNotificationService.register( 'https://example.com/page/1', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false }) ); yield waitForPromise(Promise.all([ - rejects(firstRegister, function(error) { - return error == 'TimeoutError'; - }, 'Should time out the first request'), - rejects(secondRegister, function(error) { - return error == 'TimeoutError'; - }, 'Should time out the second request') + rejects(firstRegister, 'Should time out the first request'), + rejects(secondRegister, 'Should time out the second request') ]), DEFAULT_TIMEOUT, 'Queued requests did not time out'); yield waitForPromise(helloPromise, DEFAULT_TIMEOUT, 'Timed out waiting for reconnect'); });
--- a/dom/push/test/xpcshell/test_register_rollback.js +++ b/dom/push/test/xpcshell/test_register_rollback.js @@ -72,20 +72,17 @@ add_task(function* test_register_rollbac }); } }); // Should return a rejected promise if storage fails. yield rejects( PushNotificationService.register('https://example.com/storage-error', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false })), - function(error) { - return error == 'universe has imploded'; - }, - 'Wrong error for unregister database failure' + 'Expected error for unregister database failure' ); // Should send an out-of-band unregister request. yield waitForPromise(unregisterPromise, DEFAULT_TIMEOUT, 'Unregister request timed out'); equal(handshakes, 1, 'Wrong handshake count'); equal(registers, 1, 'Wrong register count'); });
--- a/dom/push/test/xpcshell/test_register_success.js +++ b/dom/push/test/xpcshell/test_register_success.js @@ -55,27 +55,19 @@ add_task(function* test_register_success }); } }); let newRecord = yield PushNotificationService.register( 'https://example.org/1', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false }) ); - equal(newRecord.channelID, channelID, - 'Wrong channel ID in registration record'); equal(newRecord.pushEndpoint, 'https://example.com/update/1', 'Wrong push endpoint in registration record'); - equal(newRecord.scope, 'https://example.org/1', - 'Wrong scope in registration record'); - equal(newRecord.quota, Infinity, - 'Wrong quota in registration record'); let record = yield db.getByKeyID(channelID); equal(record.channelID, channelID, 'Wrong channel ID in database record'); equal(record.pushEndpoint, 'https://example.com/update/1', 'Wrong push endpoint in database record'); - equal(record.scope, 'https://example.org/1', - 'Wrong scope in database record'); equal(record.quota, Infinity, 'Wrong quota in database record'); });
--- a/dom/push/test/xpcshell/test_register_success_http2.js +++ b/dom/push/test/xpcshell/test_register_success_http2.js @@ -59,25 +59,21 @@ add_task(function* test_pushSubscription let newRecord = yield PushNotificationService.register( 'https://example.org/1', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false }) ); var subscriptionUri = serverURL + '/pushSubscriptionSuccesss'; var pushEndpoint = serverURL + '/pushEndpointSuccess'; var pushReceiptEndpoint = serverURL + '/receiptPushEndpointSuccess'; - equal(newRecord.subscriptionUri, subscriptionUri, - 'Wrong subscription ID in registration record'); equal(newRecord.pushEndpoint, pushEndpoint, 'Wrong push endpoint in registration record'); equal(newRecord.pushReceiptEndpoint, pushReceiptEndpoint, 'Wrong push endpoint receipt in registration record'); - equal(newRecord.scope, 'https://example.org/1', - 'Wrong scope in registration record'); let record = yield db.getByKeyID(subscriptionUri); equal(record.subscriptionUri, subscriptionUri, 'Wrong subscription ID in database record'); equal(record.pushEndpoint, pushEndpoint, 'Wrong push endpoint in database record'); equal(record.pushReceiptEndpoint, pushReceiptEndpoint, 'Wrong push endpoint receipt in database record'); @@ -102,25 +98,21 @@ add_task(function* test_pushSubscription let newRecord = yield PushNotificationService.register( 'https://example.org/no_receiptEndpoint', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false }) ); var subscriptionUri = serverURL + '/subscriptionMissingLink2'; var pushEndpoint = serverURL + '/pushEndpointMissingLink2'; var pushReceiptEndpoint = ''; - equal(newRecord.subscriptionUri, subscriptionUri, - 'Wrong subscription ID in registration record'); equal(newRecord.pushEndpoint, pushEndpoint, 'Wrong push endpoint in registration record'); equal(newRecord.pushReceiptEndpoint, pushReceiptEndpoint, 'Wrong push endpoint receipt in registration record'); - equal(newRecord.scope, 'https://example.org/no_receiptEndpoint', - 'Wrong scope in registration record'); let record = yield db.getByKeyID(subscriptionUri); equal(record.subscriptionUri, subscriptionUri, 'Wrong subscription ID in database record'); equal(record.pushEndpoint, pushEndpoint, 'Wrong push endpoint in database record'); equal(record.pushReceiptEndpoint, pushReceiptEndpoint, 'Wrong push endpoint receipt in database record');
--- a/dom/push/test/xpcshell/test_register_timeout.js +++ b/dom/push/test/xpcshell/test_register_timeout.js @@ -72,20 +72,17 @@ add_task(function* test_register_timeout } }); } }); yield rejects( PushNotificationService.register('https://example.net/page/timeout', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false })), - function(error) { - return error == 'TimeoutError'; - }, - 'Wrong error for request timeout' + 'Expected error for request timeout' ); let record = yield db.getByKeyID(channelID); ok(!record, 'Should not store records for timed-out responses'); yield waitForPromise( timeoutPromise, DEFAULT_TIMEOUT,
--- a/dom/push/test/xpcshell/test_register_wrong_id.js +++ b/dom/push/test/xpcshell/test_register_wrong_id.js @@ -56,18 +56,15 @@ add_task(function* test_register_wrong_i } }); } }); yield rejects( PushNotificationService.register('https://example.com/mismatched', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false })), - function(error) { - return error == 'TimeoutError'; - }, - 'Wrong error for mismatched register reply' + 'Expected error for mismatched register reply' ); yield waitForPromise(helloPromise, DEFAULT_TIMEOUT, 'Reconnect after mismatched register reply timed out'); equal(registers, 1, 'Wrong register count'); });
--- a/dom/push/test/xpcshell/test_register_wrong_type.js +++ b/dom/push/test/xpcshell/test_register_wrong_type.js @@ -47,23 +47,18 @@ add_task(function* test_register_wrong_t uaid: userAgentID, pushEndpoint: 'https://example.org/update/wrong-type' })); } }); } }); - let promise = - yield rejects( PushNotificationService.register('https://example.com/mistyped', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false })), - function(error) { - return error == 'TimeoutError'; - }, - 'Wrong error for non-string channel ID' + 'Expected error for non-string channel ID' ); yield waitForPromise(helloPromise, DEFAULT_TIMEOUT, 'Reconnect after sending non-string channel ID timed out'); equal(registers, 1, 'Wrong register count'); });
--- a/dom/push/test/xpcshell/test_registration_missing_scope.js +++ b/dom/push/test/xpcshell/test_registration_missing_scope.js @@ -16,14 +16,11 @@ add_task(function* test_registration_mis serverURI: "wss://push.example.org/", networkInfo: new MockDesktopNetworkInfo(), makeWebSocket(uri) { return new MockWebSocket(uri); } }); yield rejects( PushNotificationService.registration('', ''), - function(error) { - return error.error == 'NotFoundError'; - }, 'Record missing page and manifest URLs' ); });
--- a/dom/push/test/xpcshell/test_unregister_empty_scope.js +++ b/dom/push/test/xpcshell/test_unregister_empty_scope.js @@ -26,14 +26,11 @@ add_task(function* test_unregister_empty } }); } }); yield rejects( PushNotificationService.unregister('', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false })), - function(error) { - return error.error == 'NotFoundError'; - }, - 'Wrong error for empty endpoint' + 'Expected error for empty endpoint' ); });
--- a/dom/push/test/xpcshell/test_updateRecordNoEncryptionKeys_ws.js +++ b/dom/push/test/xpcshell/test_updateRecordNoEncryptionKeys_ws.js @@ -72,18 +72,17 @@ add_task(function* test_with_data_enable }); }, }); let newRecord = yield PushNotificationService.register( 'https://example.com/page/3', ChromeUtils.originAttributesToSuffix({ appId: Ci.nsIScriptSecurityManager.NO_APP_ID, inBrowser: false }) ); - ok(newRecord.p256dhPublicKey, 'Should generate public keys for new records'); - ok(newRecord.p256dhPrivateKey, 'Should generate private keys for new records'); + ok(newRecord.p256dhKey, 'Should generate public keys for new records'); let record = yield db.getByKeyID('eb18f12a-cc42-4f14-accb-3bfc1227f1aa'); ok(record.p256dhPublicKey, 'Should add public key to partial record'); ok(record.p256dhPrivateKey, 'Should add private key to partial record'); record = yield db.getByKeyID('0d8886b9-8da1-4778-8f5d-1cf93a877ed6'); deepEqual(record.p256dhPublicKey, publicKey, 'Should leave existing public key');
--- a/dom/workers/RuntimeService.cpp +++ b/dom/workers/RuntimeService.cpp @@ -1585,17 +1585,16 @@ RuntimeService::RemoveSharedWorker(Worke WorkerPrivate* aWorkerPrivate) { for (auto iter = aDomainInfo->mSharedWorkerInfos.Iter(); !iter.Done(); iter.Next()) { SharedWorkerInfo* data = iter.UserData(); if (data->mWorkerPrivate == aWorkerPrivate) { #ifdef DEBUG - fprintf(stderr, "njn: RemoveSharedWorker\n"); nsAutoCString key; GenerateSharedWorkerKey(data->mScriptSpec, data->mName, aWorkerPrivate->IsInPrivateBrowsing(), key); MOZ_ASSERT(iter.Key() == key); #endif iter.Remove(); break; }
--- a/editor/reftests/reftest.list +++ b/editor/reftests/reftest.list @@ -77,17 +77,17 @@ skip-if(B2G||Mulet) fails-if(Android) ne needs-focus == spellcheck-non-latin-arabic.html spellcheck-non-latin-arabic-ref.html needs-focus == spellcheck-non-latin-chinese-simplified.html spellcheck-non-latin-chinese-simplified-ref.html needs-focus == spellcheck-non-latin-chinese-traditional.html spellcheck-non-latin-chinese-traditional-ref.html needs-focus == spellcheck-non-latin-hebrew.html spellcheck-non-latin-hebrew-ref.html needs-focus == spellcheck-non-latin-japanese.html spellcheck-non-latin-japanese-ref.html needs-focus == spellcheck-non-latin-korean.html spellcheck-non-latin-korean-ref.html == unneeded_scroll.html unneeded_scroll-ref.html skip-if(B2G||Mulet) == caret_on_presshell_reinit.html caret_on_presshell_reinit-ref.html # Initial mulet triage: parity with B2G/B2G Desktop -skip-if(B2G||Mulet) == caret_on_presshell_reinit-2.html caret_on_presshell_reinit-ref.html # Initial mulet triage: parity with B2G/B2G Desktop +skip-if(B2G||Mulet) fuzzy-if(browserIsRemote,255,3) asserts-if(browserIsRemote,0-1) == caret_on_presshell_reinit-2.html caret_on_presshell_reinit-ref.html # Initial mulet triage: parity with B2G/B2G Desktop skip-if(B2G||Mulet) fuzzy-if(asyncPan&&!layersGPUAccelerated,102,2824) == 642800.html 642800-ref.html # Initial mulet triage: parity with B2G/B2G Desktop == selection_visibility_after_reframe.html selection_visibility_after_reframe-ref.html != selection_visibility_after_reframe-2.html selection_visibility_after_reframe-ref.html != selection_visibility_after_reframe-3.html selection_visibility_after_reframe-ref.html == 672709.html 672709-ref.html == 338427-1.html 338427-1-ref.html skip-if(Android||B2G||Mulet) needs-focus == 674212-spellcheck.html 674212-spellcheck-ref.html # Initial mulet triage: parity with B2G/B2G Desktop skip-if(Android||B2G||Mulet) needs-focus == 338427-2.html 338427-2-ref.html # Initial mulet triage: parity with B2G/B2G Desktop
--- a/gfx/angle/src/commit.h +++ b/gfx/angle/src/commit.h @@ -1,3 +1,3 @@ -#define ANGLE_COMMIT_HASH "ffabe8783f4a" +#define ANGLE_COMMIT_HASH "c7fc1b46df29" #define ANGLE_COMMIT_HASH_SIZE 12 -#define ANGLE_COMMIT_DATE "2015-10-14 14:24:04 -0400" +#define ANGLE_COMMIT_DATE "2015-11-09 16:31:17 -0500"
--- a/gfx/angle/src/libANGLE/moz.build +++ b/gfx/angle/src/libANGLE/moz.build @@ -299,16 +299,17 @@ DEFINES['EGLAPI'] = "" LOCAL_INCLUDES += [ '../../include', '../../src', '../../src/third_party/khronos' ] DEFINES['LIBANGLE_IMPLEMENTATION'] = "1" DEFINES['ANGLE_ENABLE_HLSL'] = "1" DEFINES['ANGLE_ENABLE_KEYEDMUTEX'] = "1" +DEFINES['ANGLE_DEFAULT_D3D11'] = "0" if CONFIG['MOZ_HAS_WINSDK_WITH_D3D']: OS_LIBS += [ 'd3d9', 'dxguid' ] else: EXTRA_DSO_LDOPTS += [ '\'%s/lib/%s/d3d9.lib\'' % (CONFIG['MOZ_DIRECTX_SDK_PATH'], CONFIG['MOZ_D3D_CPU_SUFFIX']), '\'%s/lib/%s/dxguid.lib\'' % (CONFIG['MOZ_DIRECTX_SDK_PATH'], CONFIG['MOZ_D3D_CPU_SUFFIX']), ]
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..56a937c014ecbf9fceb70e447260bf8617c8c869 GIT binary patch literal 14560 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®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
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0748b78437892efd61074f4284bc3a7dfd7d59ff GIT binary patch literal 79899 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
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..16f7f867f3afb0462984f51dbf79592c04ac8e5c GIT binary patch literal 179793 zc%0<BbyOU0wy2G}r6Fi=Yuw!>Sa5f@;1VnlT!Op1BoJJJy9H@91Zmvez0un<=XdAK zoICe?=l=bz#d@E5-d%g|+Eu-PW;Nu|C@9*6v08AimhaV6S!5O8YjCkxn7LcIvwrga z1T)sTlyoE)$8zuAW$tg<=Qbl!QNHJBt!&Uews3GDx~C_TPWWd353M@jHg33vT)i2G zHi?SVUP8+{HB-pb1rjXuF0fzXeC=f`;Hf6yRqUmCu=^$8^`-lD>Gi7SmB`rgxeem{ zdS&u@6|nkzy<^j8?9e0<&|39czo@;mYSSzPuJnEJyfbFCeC9PsJK|$mD+iy~=;S}z ztvo$DC5$<kIIWdG2Rt?lQJQ#&tj$lRgL=FDAZ3W<FPh+yt~T=WJpvQYM>mu4rrByT z-)pHWD=jCRtMPjK@JF&m?H%)5%KTY3KIX5LqG_|``txIl<YQ^|NzYC$ITQ58+B<ud zf-in_H}3+hO^>-rfs^W@5w#g7_AFD5JWC@cT6AbIMaxd08uY39r}DS+!`7{Oe>609 z`^I>*8nhrm38yXbNnKrY?IVE=3u)cfvKbC_S-BiccaLr_t51?x%B_{9jpbfrGIr07 z+nJ8`(HcYrY4z3C-IjF$li_WP8tv8^BOQx+W_FLQlLLB3<$1?ijy9gLfi^6kR~&S# z<|?Ini9N}e#+RB5XR|GhoVsI7V~>8MF2#8CeGE;tY8*H0F>0(zce<@ed3Io{uq%GV zD4~4iw^LVyskrPu%w0U{B^P6}U%I*x=6x{v!n<qE^w9=>x{=$?Rd;b*aOV2c`g7&( z<2XJ-T3R-QT&7YVEcyvM`KkkKH7oszXWF4>-Vx%7B4GN#HNw^)Mu>mL&2Y*RQxAJe za`?gA$9_Q2f2pHO6wUQf9=4D***``@eM@TIS%^u$A+%Lu67yTJcY~m<w*g;wHYt3S z-G-eQnpy)o@#2J0;Kk#u%}Ggi2o=U~(-~XRro&1X7PVKz$mgo^_l)+Wl_9fs2ISZQ zbMWBUUXhpT2VnDf;_NPKL_&=%cAiGO+RFyB@bKp0ow4VQAnTFb3yYPodYr%YH&Caa z;=BEa!V4)DzD8?hqTQ#Sd&)zp`wcPAncb6zAE+Un&P_Ky_N?tI)&@)$C6p&BO1fKa zcS8e-UF4a<ig~t1*zx3T;IE*?1r?%;!^}v*9FBax$<+Q^bG0vj=+BJ4=x2i5LRa?h zpSLD2^B#;5kFMww>HBkDQXX?$bwi%KP+B$h#TrB~3r*)EyE2KEQHSK*$Id#Q7I_bj zr@J9Zqq$?qVXdz>=@#ann%A^F64tg~6=9T$mJrz2{QP#{{v=K;)AYgiQ1!u5n1l|_ zw;5(y@>6f4yUGkF7WwS5|9qc+D(+_43SSqMTxH-zq3v4laZEB$WOE1P4H|p!ybsdb z&<BD6jjCe+@Tcl9^R(gb9<q21i;ZS6oO*a?evNjXdAZ^O!5(mw(je_VWr|Q+aQOmK zy{!dbk`aHjGTGUo7}i0KUs#9iNa7*cAhTK%*=lhH?dV(&6JGR#M-QP@JyTvaNBR7( z5rT?X_ykZ{pyRthLm67(jfL5Bq+#aF_ix+Pmmp~1_%v!uF=EBv4sTCnL*%ons!46} zzmW#QkJzcLUm@m5*gI3Wg|-FNq9#?P@Zs=E)X$z_m`%4DU_=91PKfhKmbI@w|LIqA zYN+~!z3PAZ9^a#u@ybo$5w-_d&w>B@$q1J}-!9@ryp3s%5oV%aA(S#>F^id(sed~U z28~I)7H;52<PlhTrf4}Gm+u#Z!=0*~1ZYv=32(KKCsbglv4|Op!!lpF3PTiQj}09@ zgru8-60rGficj<g^-`I=A&v^L`)o?c@#X<dz684<leUp=4tZ)UNgwxQ#g=fTk!}@v zN<69W&wNe-d2j<tw89iNygq^q?XfTH_-Ks6IyU^Kw2UnebKNV<G!+lcv{;~ZB7V~S znGDwv*EW?Y3?>bOWGn{(f|QG=**F1Gh_|QfI04ERZ;JQ4CP0kM-tEC34bMepgi}<U z*PCVt<?p@s-w&{t>&+Gt;8Lshas{gTABPPR>Vjw%*w`NmnEMvlxCINwMjgA?_d_I6 zzD^nS49c?24WK8)yS1mg2`qilboa?+7vjV2diuP^T){x};1t-0hEoZ{L2lX#vC0hE zz397bk$CX(@olaZ6E-2t=Q}qUF*lp(!Id<VLD6ucz`m2jtxm=2e!X1UruSF$FUok5 zhJNKd4V)$C-$VCaL?Mv@ivF7>G7KZ-PlS)Y5uOUk{;fWgZoIc{7pH|YVN(^X>1lf^ zzCi3vq3(Q@Es}oaos4oGH-X@c;h!`15Whu!It3kYlAov!1q^3ta&_ti>M!ZCt>r|O z3ivVU({~oTT!Pd&9~JA>mH2A6J_Km|>Jm=1FLi=-`+iQ+Z~CK69LAE<QHwq*Hf~z~ z1{N%*cdSK^7OY%7c-UK~Cb>{4!A;WXP~m}{Xw`(3>fYex^XJ%dy|v@8YDmrk7b`yT z*LO{%M7nP=WYiKR*(vPA;#pa2#IT47&UVTTxQy*F_V2Rf$BredBWyjb##wiWBao8t zidrDEhSVF!eb%$?v7rs<*;>;#gjgj5dOSwd8>)Sq*Zeh=_RM+m#u{ex-qOiq-+x!D zef6y3ed`q~i=cq1=4|j~9zia79rD(gdP5OzZ{AxZyn)HnKXqP?KcyDu3oqX1*g^Q= zY@I_MVjK!r<GOi5@f4Z8RNq*nfk=!$M`KYn7hmaqobZ_7nkii_RdoI8U-VctzT<g= zFM^t21Ot4|in7m&7~8Dj(53U?0(Fy_f*XY!U>q>;rDeVX_T~a(;Yf@S<_coZN_`+F zQc-?rTeliSd~UfgxM#>t?3Yg4pCw={zpoA76ff*=uMK0uf#s}Lp+>Q9xjc-yu>d4; z-X<#s@9!)R--s)ACJNnI^84x5EE{#z&XnzNGp-PV=^Sxb?c02DSawe-X>x3<8T?`* zOYC@(i%k<lmFTWH=<@8Ed`Ls0O3*nvx9SrAT#aACi&rFy`W4Ms7uQh0&^?fiw_wc& z62h;<e*ONDZ&D;dyoi5mIUcP9opW3y!KDbMe;FN(2Avm#T@W<zMy3^=ZIaIBPyLEW zhRN71jNNA{IQ5A+Y#sr`TNpIz^=$-Qa!uuzqc`}H138u_B56O$9T9Sr)HRHj*x!lU zE2TP8udDW%b1!Hw^CDqWID7gm5ef%(fDxUr&s7(5j5eXWbZn}HR~5@Lu#3{X^R2O= zKO-HhKlx&ysye$@Ey>B1tP_efr?<xr{v2^)@+JwfNd{|Q-ojuPY%~=$b9l4+a6~y) z`jQ}i#S!SfbbLo8x&O4-9PyQXcB00gBmyOc_{VxUTuWjCZ!ZU}i-wD%Mj%5lNhG?e zzar5xp5eW)X%l=IzzI<6$cWMCg5B#tMN+;I-UD;!R2Jcj68;9acswnsWyp5MeiQl& zS%cwd(YrOD&D&ND>q~D0)>7+BUzd6(qUzeND@9M^W?dX7Ss+fUJv&qTE#;(gE&Al> z1*2s%ZU=mSt<ZY|pg#*gQ$N<c%^n!t&dRsR%`?ieq{F_?U97{f-{-YsJW#X;l=XzA z*dRd~gt}wLS!*G#=0J($MZ+4^umTegJ6PXHwC!38{KXG1g7|K5)wY(LYM1Er@XCV0 z9Xx5A-sYPx^W*t=q(>RQ5|`Hgw{t=l=8x3mx}0is77g@=LY%S1U(*U$s_b4N-d5;U z+m&zKa$V>vA~viUBHLk)YaO-Y%7|M?78>Lmeske>R(Y8mK^{FD(z?rkWPY7%U?bug z<3l0XvXIUE^PvIvdt<4R+!_fEjQcVZU4d^HZ*MN1i~3d%_$L8pH+klhw)IeP=D51e z*E_EEz{{oY6ROU3x4}C+s=2+Z;A6>#M)h3Ewbf%dZf-5;&epLk$e~6MzH1sBhHU#& zFr<449G11@=7IDXbcF`GE#H%($j+7Sx`q(WIY>>{1jL2%f_3hr3*zf2o6;{7_AR{I zjl#R%3F0qVH=x!;ipmUu-51e|<A>N6Kc80==MEE{#f$byfWKU2mtd;}X_H?nAMjfy zj1P4fJ>U>KT$r6@ib~5a`i_y5QWvVtk=>jgNV$Yp4RwV*xS(WwlkJHAjF<xn3L`on z|HI*(Nkp_jPhj0cpf$7(yEA?W=9TJd7DU6Lb9HL(CA#OCtIL4t9VfTT2wJlvjYdr) z{dRbZ%|ABf+!lxQKGON2q#xsX^T<~9=e_DI-<LzPaDSp(4xs*{BY8kZ?^^7MM3^6n zxs3M*Pc&9DGF4yL%b>4B8{=TLmL8=bh~+@c1(hRq?eo<eu4|^oVu|U^;---21_0N! zeN((dP&>?dVI<L0)slqfk}SRT{hc#?&n7)=JGKLPamL2l2q`@J8s@J_jWLv({oD0T zQ7sOO&PpMo93Gak+~CL1!I&GkGjEsmRapN&<}$wd&B!bFLD59l<EyS;Rez}Y_TO(n z&2bI+tN3iQKbi%SAH?f7TUUu2{S}91cfe!HL9XV+()0B`=W6>9efrrdr6SYPiI1OO z>nW+Yapo!MSgWwtVuOxzilyTE-3++m9@9*3q$2xidA1{LSby3X=c?Raib(tRT3Put zhKzi2WlaZXw^3wPI0OHVm^#2C9+<HsV!l&#HlD3Sgu5g&Y_x-w@=nM_gF2~w%7|Uh zeg%n>&5MN9d9Y^fElBsYV#s~|0iVjIu!fykd!tQ|J|MM5b?k#*n3dkz6^R$v-3_j` z>Vik^g)v|C_{fjdc9aL51#e0rf9i6s?dW+h27C}WVss~3mNR?SQ@<~+W29S6cWrJ3 zj>q~b{H3LXHj6`K&&FM+>&9=wEgzQI-tR{t$Y_CAe9kV9QV?Tc-{M+X<N12&o<Ugb zygq5rJo94NNsBeT;n}*0xmjR~jLbey48}^h8!{{W%<6pBK;ASIeGpHcXCGQ)=D$G3 zMps#1xt2D2d|!M~Y%G?VD}3-iv&o~~^pe+wK>Zi*X+&mAW_uupXg9i3d7`t$Hl5Lf z>R5%dQr~r9W@ArA$^m@HM=AfL@9^~WdNb%2jZC}SN^I|B7%)b1jJYfIw`si=#nWge zagwxz#^m!U`5S^^lEkF~*?H<{!xnYHBZbC<6>$qm?>lu->@AhZZi;#}`x6uo;YJl0 zF=5O;QHzam2ZqnYKb6eD5bH{DCaXFE-8l~_bF@s@M}9<Ppse)LRLGcT9ph8@%p#3_ zF!!*~<@uHH=MYJ9Kb&%e2f^}p@N&ugX{Vv)(n^`hXUKv!^qpJB;tB84fl5r7(m_CF znooPx?jv}}x3yw|g;?CQX6dqOI?Av`<7g(6*$&4i)y{r<9@ciJWp2l<DM7{oqDKT- z2`t>jet$+bIqE{&Zr#11-2y)~TBrZzxZ67W+9cL`X`!)zy<?&q-OLlV-$m+Rg(b_! z#E)r+4ctA6Poe~(BbpXgU1Gly_4yi*Xxi3jqFGa)w#(-^12Gcudpgtq<Mv~=(va=A zoEu9d;HLT_dqg<KWl_my>F1;V8A#<T3U)XQ$W=xR^A?_|k5n-Ii-eU)0vMU`QQVsR z$1!!5$e+XIVq)eK+T}XkWvqk-N5lDRn4rn~H<voq_A&j2YgiZXj53orSZ;WJ0%*}r zd7fKMoD4PuqoDC{G4_eP*bC}yw!;h#|4vZX;+K@GD8|uQc0(Uta!mm{Z`RlOo$t%@ zVjP4qk^TH58u!B*2|J06{fCA~u8H5y6A-&tOU1Nq-FxM{IRktg4Joz4w{R>4;#gNC zvW|lG?HfFGa~eZvhQwGF+IM^j>3z`1efG5-y7a2n&8*faEcLY8mO=H9plHpze%QE{ zU+&WMit~=q&$>M3DE)pp-?=T&CRDnXYbFKWW-&l4w*3&hO=~Jvy7V)6TClNu&M_L- zMxU@l%+3%)-I=G}p(6}kr3JCvuuudRSKrNg(jHyvN5Fho4FQ=OCJ;(p7yK|=U;(Z8 ze)*J{I;?m4ez%U*wo>VI+p^Mr{^wjhWbokWl)|`@q?w!};L9mTta1$j&d9}MO?Fby z^KQHyCe3nKoMrrOw2il)jdPPvE=ygT3%tWZVY)As#?w;RWj&KldO@cL?2DQcNbA;N zJ0`WeEVp>}cGE)d3z<ys=(HqK!|DA-o$%H%Ty2ps*+fCpl3n$ZQJPe%@WZnSQt4W3 zTDO~#H)4trtTjQwF<gdGXnnM)XSWpi8Os&nm!=$_@?AXUqthlkjE10fL7!}1--o<) zYLy<4yJ(6Rws#EL`XZmxROzt3u+-e9Kz+E)Ffq<YTSacs&|7t<wQE9u@P||~EK@ek z&+O8@X@%<`oCQvVE{sGLscq1?kU{twg!3turGM?7^C=e!sD-ffi|KOi>%aUt-2OAC zq#s5#^31-?lgVP$Z1dQ0MZsE+M^=v~T91IOXY23MnK_=GEtS=-y-)nwxroZrb4WU_ z)7Gce)~DCD&Y0V5Eu(W#v}60TLVM?P{+0h7WF&ojs2W0d)qFMfwhMaOA*>mDUPF9K zVH;K%Wc>YbemUs1_zhYDYfhY4C0;mejov~aA(iK^5GL1nNK=j$KG$meR~x+^J$%)) zh-igv%{-Wmcj(-*$HHBs^>CcRJ(Q4<qvJAB{x||Tc9o7dZE!qq&8i99p29LK_dblb z?;nQ>bQL<6yAew^YVzM~;o~(SMmiSMV$w7v_VFeyyeOMJ3guK)gHGlvQE{h*PKYyy z+6wAeaqeh%R9~jQ`QIOQ!<JqPi9ed1BGrq#Gxxlk^sjw*D#Iq7g?m(Zx=(y6VO%b` zG^|*s({f2+Y?FUW`t4ywseBEr?udOrRV`e~!Jd>e9jmnppMb>X;{@m48BX+4kGs1g z*K%}*5iV*`_T-Txth+(41Dg)A`j#^{Y~_*H%GxWHwod)wI)V0K__95Mx%+YWk`G(& zWtSSXCSnO`k7s^8PuL+Bt$&J+V1C`)W(sh3P3snr-`aY}^?Su8*n5RfYG_l4AxhGj z2bOmAT-u2Sd@5dySIBKi!xzF1lFymv{%sF;^g##b$*{TbW5>MorhQSK;cu)QQXd)Q z24^0<vIt1fw*YLFT@x1wf#r+K%305zLalXltu;uM#p|sHc@9zmNVV1qILw)FGW`*z z4Fk~tDZ&HAfe3DyjjwFSUSvW|ug(dA^lqZ_mxCak!>4%cOXnV<tBI{uBw6>G*KD~L z{M<qw;aKO8kk<UHUA5Fw8;ooD-J6ASV!v>K;$SeDAo+<hdUW2ofeYPTfBEGC`FiWq zw9qYC-sr38@>jTb=dFv_Vr`$+-D!0j-WTL|Da#15@Lh>{4iq$qV12jrwJFbZi1FiU zPpF@EW|#Z6PgE`L##Flumt@f6Y9K}6foVL;^GR=h%EM^HW_GcE&1#UaPYOQJk{?VI z^rMG|BF7?VS9e_iiCb3VH4juOz}2<t>3@BRRD5g=dN{l6MxKwhy>~Mr*d4w6Hsvo( z1G?ICVcPy=9K_kO8A+vA&3AL5(bWFz&|G5yw3s}uyLUiEt4BceJj;b!vKTVoK3=1` z(k0-Y%V-s~&^G~`$V%5T6QmdHe3EIn>KKw{uWDKvKX9Kq!i;mEXO3fwDxhqVV+3_t zcD(w2J|Fz!+kt3)e|pa|Rw&WD!*lDzjnjVE@Y0_9aq@1Xa1UFl5uI=V{320L#?Rgj z2daTN7t($e_q=$Uk~<I1C*2@!tYdQ`pbPm(!H$XdJ+X&-@d0)=K26Uk5DPo+#c{uF zI=Jo{;Ug@mzBhLo_TVuI&M&oj58XN+1CU7s0b+7j;jkx#yY5og;w2%t06e?b6-RdU znKeMn_mClxX@gYth0{<1oZ60y(SMSoEbux!=XuS+8F~XQ-_*OKklOp)rAHk6%UB#` z2t=~Pp2YWcDpPUR7ove7J4mTm_T5-DfTHmlEw#U?pq8c9Vef3G3F1Vyi1gEiAtv!* zDH_vk6~Z6~bEIsDvSraZ&<2qicy2!TL^;KlVMmnO!xPu${^Zm0g6Oj{nKoNtRVTQ? zZ2t+pCAHa$rk9#5e8ca?wWE8fJKY{-h?gpS2exMQXf|J;m6CbsD`6U))O>L7`A2mp z6v>D`q@mOFwo#&H?mrhzcguQv+1pN?jM{~(D4tH$E*!AQf4>CJi1cnkM(y2eLcaS- zf2*Zc9lSC;aAU)0A}|%+qpQ}_#`wK9j1kL^XLQz#K;jy!WbvY}Z}(d^$f8B3aU_RS z!@67Iz6tuxEucW)Mci#!{)%*SSCyj%fA+I6<=#*9oY80GWFfoN6TXraTV2n8`y<5q zjt|)0O-cNa!AV0(k)BVQZN(R0;eWFO+wn}AR}Guwg4ptFNa6g88N&BfxZSY_*au{* zK9woyRm6C&-fdFv4)~1bYCdu;izoe$NED9~uv47eYXrrkQyhW4I)Aw8S?;n=w0ih+ zZIR`YLBDsbZ{59se3QAsL&K1x`LND}e2h_@THP)tBlYk1B=}=@^`7##N_u`uStaju z;A<^)NA$gD9%LQxui|NA?_sm*ndBMW<CV?gb<*(J!?+BUs$Ch<60EdOrx=b=k#>kP z`iPtrs$J@0yt1&8UF)^PCmb!&j{4_%HJnTZ8Y(}G;vE6Tnhlxd^rvOM*UH!rzGb#a z>(zHfjNWM%NgMgIfIJAV?nK?7OHLQw*Cz3+-uU<KXZf5XTF2`2fmZ(|Z7YqWJ0q0F z?A&>LU|$crpHG_TB{R|GvgQvp{8DF(dYTW&@@a~sTTX9pu{NAA4*e;d;LC4uQ}cM% zlqSyVvrntYRAV+0zp9&|1<_+|)hb*Mn$@6sG1MM^x&1o-;<7-(`WW0sKl~WfOpx(N zG4hgr99JcvtRv&SazGl&h;D=xjuFvJjg@(LmKX^5)Z;$4&L6j96z{sfUgms7clB9G z1>H~N9Vg5&>EL_fpURjR{fT=m4^?KUo6GT>Rmv7!dS|ygpT(-Z&n}nPhOnOMU#8@T z;+z8I(Ou9B?R{1pbnx+QP;ledm@)htVxRjtZ?Tsa!mN(_cs*-lNF6L>K?~Eow`XZ} z0nM?`e4vE@=t*8sKn)wT@LC)DEVy)VRN=Q6GxioOd>k7k+u@P=$f3g5?+^QF{FAHF zB|c;eKh0I@rKOkCX^fn2>DTvh>&yz>QX3ZPSN52kDuaku!7n-oj;-=D6D1-1FftYD zbDpBecre*lY>Pxj2{4tOR}VR+rJq8BE`9{;&6{6U_#AB^M;W3g_x_|{X8|h02YoDH zk45<YruW*r&1uz_pLa_1B{$Q7k2%n}b!lYj^8*30Oo18rt*R$thEZTWx~b=zQP#}` z@NX7)Z~kyG(20&CDUK7wu_3=ZU0f^xP8xx7Y21#^KJZ%`MWOC<<u2maIast|rgd*b znwqa$Z|e-?N4XnIA-ZyKlW>y_;>43i?u7<op<MX{(*2aaYU5U^zMJhx>@Evqclby{ zLzr9LI{7<#7*gs#FyS|^;QQ%)hYoItZImZ4k%C9CVQ|NC@L=c=L*-%EQR(Q0a&4!R zxPo&BvANK*{b6FF`YNM>$D;a<M>+N@`|-!IESGR_$Pj}g9r>1mA9)c%WrIxBGv@aQ z9~RQ~-m#F_42r+!FvLO)$o~G5a!eRcT$)l5qrx5Cyp2%=1-`YTQ=+f#0oKCm5+1~* zaC_QCp?ll3=)G)eIXP5EAJ34|h8W}m30lAGA4PQ2J_?4rd<fdQu`pL!Q=bb+ah@$P z@fWaBawq!?KCCC!kywCigY>#~QR<nSQ(+JJk6;RZg1h@6hT8S=%L{5Z<<9JJ_934^ z1Y@&w&yvO_6^`!k3z`F?8%L^QJ>H0fY=q~xCgfUIL|0m^`Q6zxj?{12X`(;1KWpzj z5-ATW_rPJ=zR}ByKk;)&i$FJznOYN^M`|8s0a@K>3sJ1h2H2Q;L3n+*!pu48S%8S< zJV9b;M<pCPo(BFw9PzJ`L1cvL?D6$BVYoxur<mHts;)Or7dhrKA5SUYP{6_h#wi+G z87L_7Vd3H5F!)J^q7ky<BvQ$geAT0GmuuZ^3xfs6z=31oz;RI-_+g6ClHcEB&m>tr zVpi|pm-TMu!_?DXK0-|WMD_C~n@)8m1CY3awZaYE{liSHO;ahetiJB1vX3O#XHLW$ z+$HJqCF^=66PJotX%x&cs2<_vIBPg?E1xaqmBZUtGQUm<u2@fhr0h7>&K`duh2gH5 zdpwcBhbfzXSo3Lc=l@~D!7mJ{uNr;NxEEkab{kL8-Be$r3`{QJpM|p#Nx|j+NiHJ8 zjvuJ;-MzusU(b|PPn~H>wsqx0>(5B;=}*@xBV$psSp-~*AKk1yQL$&+aUHipK61jZ zPNouFe(r;T;|m*2roNG#v6eZ`;N!Bk->kLuEcR+H*ByiV;W@bd#}#|7&;hm)=YZK7 zwopbKmuZ=@N@%UpB%O0jB?c3zFtE}=!LzlrUk)6k6L>LonU%AyzPdW8gWGWTfKAT+ zQ>zij=*u=@*vHn)*TnZb=a%zI)v#3_LAE`5S{0hFEO2&u{*Ir->^~2TRA??OgNEzM z5D|G)RjCng?xtf~5BGQPjmCdqcO38T)GtrmW`i%ff8kT!z~x|_-Q>G7GRgKUS9KG^ z3U|_Y&;Wyu3a{~$Z#Ac)%$J6-=0os-IZW!v)f5}Tg+~Fgkrw4CJ37A~m?U6RieN`o zVR!a>V6m#<9W{jwO0WzqHZvtX3J?{}^%Pud73yjfTo6X<;78f@MyGYG9IAMAq!6AO zvd;L@Q0`IAtFnnsSbi13&3%XGQ(Zs;EXkRX5IKYuqxJnp+yI8u{*>T9q+tFc_wI|_ zKd+`=_<an@I1Md0GmzkB#Lb9N6;UhLVs;279?+#=LyKYiRAD#v#m)D{H~({mSwsi+ zV*-b;f&FiQL%6{Hx4<C+;2;rjgakN93LGH^4pIU~sDXpDz!7@jAOmoO2{_0C9AV4B zHB^0X8>HTXgf!o?K}=*wBuIfri<5+p@*Xp^1X)rIf%2ndk*y@vKdt6gZ&H)rYii@G z3Ft{%{f8)HNe~Gj>}=ztBuc6NhtTE{r?}av{{A7sP>S@IsOJ=<@Jq<M2CHu(&<>(1 zMB+Meo4L{UznM@4`J%h*JDXOoeGbg(6zpsXr%IMk6xR6gJjV`9u`k#cr#KL&*cXQ$ znC^?O?~9l0i_;v4)BOFw5_-HJ=#mpu+Y!XR9OUv8r1~y6K{(jOFu2w)m^~-hr6X8% zIXK}d*yUYFt#AmtVTg-gh-ywqLPv;OM@W4~2<P7q)H_0w{zp4fo8A!vmspV-q<|qI znkX+hnzID{Rm!>!DRXGx0xNQp6fh!06Xzwze3n4CO6l4mRpcEZeTikGQ5-YS=~mw~ zD#y-5-(D6YU6#aYsvtkl!0@3sB_%0|6IDUp7kKcqBBi)BN!e0CK$P*|PeBTGToRSR zx6loRsIC+MBO`;Pssg{o@rVnY=oc-<^!bB}4?t4}4x-?n)uSwBIA77iegHBU!#+~6 zE8%@l`&~pS7oH{)oF)_XpX+7@T5ks0U=~_`4%$#2T7LoBP!U>x3EI$iwB9nb!E&_z zO0=PBwEkMOp?b9bpJ+o(jJ-{agH4S6O^ieTy8d7G>4F`V@RqU&n|NFu?9CVE2I{IJ z%?xn=n?Rn%pM~xBrk2%kl<seVnHA#0hKLHgj5wS+LCLLXp@!lG+i-By1UUSyfjz^B z2+FJ!>~63@$>=DdGg<{X)o@#%-tw1L^za)YP8=|@E9(Tgx1oi4^Qdml_I%ZWr#Hro z@#b;)yR`qDog$*VBEfEkN$2Db{3%ips2}gU(6dg=Z-|aGAKaq_RG^??!HFV9k;e`# zLXrF(Dm@)4{ZA{x96}*K5~UAPVG9x^1gVf8nbHS&qXpRvg1o_xV&;Rg(Sl+ILD}F( zHS<B;XhAiDpl<M^nfai7^G2in*LBAm&FcSSjgr2=i`-@a3~JCMmCE6%B+BJcxeC8G z_lX*S26h+#LmD(`rE>375_SJIz*=LXewm;!D#b{P{i8&<1S+GWyg>S;f=Y)Fw|dO~ zEnH!46L_P78o)ip!oMWyT?(!MkjYI|dAp!;SVAB%WRp6gr|b<%4sp<55O4LsE-|?K z2Zpdpe2@Qz%D;gKt0a5lFZ8s2#H`Go`v+PvDzia<LA(_mqolp(FZ8q;pjWmx{sR?g zmF?w!LA>=DwPY#(FZ8r3p;j)X`~$ftl}nL-L&;L4_{bfydY72$<#SN#8FtQ-kLk`N zJbeI}F663bL>5_FRM6#eIw&<BE9c3{bjJ&xzMDi2vJ#xg#lkNz6Py&rET=adoHWm* z>(d#W#K0t%Ss$G2!>F5C8k{`BpqrT!oJ7JP*P0ldY!B3J4G(trWYe{|3w9%Bl`Gu{ zc5h?WEd>R;>odufHU_)BFzD{(2fOD1b@w8Jaq|f(?>p89+Kv3^y}bGT1B)c|Qy;4o zOFhxg-JbjxE+)Z<oY<-j^EQNcTrT(iNW@#g11%IBSo!aAZC&JJ1pGc;86@nce|v){ zPmPu(gGVEzHg$|3OP@eI?RSTA!d1<|pcwRdN@k~)1?V84A9#)HsEKBPr1QH2KgDOq zRzhMrIJg86agYp;#<yn*z62lGPYWEP2M#d+K}^6Q79fZXIK%-2aRK{zfJ1!1Apsyr z2sk7H1c?EMB!D0(VE=pIknB6rvbftfEUH*K1!T)TN%#2gx@e5VAHI_4Vws>B%q`>R zw9+0(_D+Wde?vzc;>BZL5}!r_#r}FT?o#Xu9n}RvhK&m&tCKUN7Ls+1k~Yx1e$K-0 zhiSa~hB<;QjK$swePTK3Q{no)Wbf~=U<(qoG{*v4czps<_`wf`z4iCOjfIGcTZXm# zGuLn@9Qr-X6Ewd%1Xy+56=$M@zY!p+u%V@m1HE}eN{C!Kf&Bg@rjW$o9a*$Iat2-h zlJ$Sce;Zl9PqgO3eH!Lrj%L%QU+m$YK#b;6V(alQ!5rIEG#|^}3g#K&?gZ+7Ry)5g zG6ly3+i=Nc1<j#H5l}*Kl8_4_*hzN<5UixV0tjZ*JOu<JX{Z2#p440bK}#wvfS^XD zo96PMP3RT>4Rd<M>;DJ-`&dXy10%mcMQ~~Zqb?Nb{}um(7=NQKVg-JM>8$zN4*kkt zt!S-tyE-&&7VX}O!T(7xI%$?_=cgPIi@s=d%6QREy<8@<K3R0qAk|K-91*krOH@i{ z(N48oCX@bZR8k`&j59%=Ajbq>1<es-bK=&)MY@K{@P~YzBjopwu2rNgLWyDT^}KU% zquqnuM0xKO5mxpk>FV&w9L+A3g;#Z11U$FeU+J|i$YM7sV(-6F8(-3p`_wMZUAwft zh-rf!rXr8SKA0>#;iije`(m*KI=uwV78Jf2R!1?xxJaPB*nt_6SDH!44hY=(7W7Zs z6t=U|(Y*Sg-{pD#v@3V-URE3T*e7&`e$vA>fZIJ4_tYmaJ{|WofGc*^Gbwy_756wc z^Ku~65{m0jz!}+iZi}AmwRsV4@Fp$^$0M|qN)dB|0YyU$3;C&-WNX{ywD#jzn7mQT zGH$Za8TUX-!hVR&B|$xmWI9D6t?9C+p=b!EN<ed>d}WxdK}H8|Jl`rGX}7JMT<dk< zRSSA*M*^6h@o}JiLuU@NoAWFu)oZWPxH;?4z2e8QFVD_u#g8GSxJzfZKU=5b5HIAz z#42t7CjCeO&2KxZsTp7meQTA>R=S;?tdtB`HGL%MRvTBVyunm|faayVYNieDPOehQ zJ4z-VNo!fhp(~YwFnb%na)ds7iF;0(CJa=@{x7k{6rrQGCkMcB>S=tsvw^MH*`x{1 zjvj&d0*`O)w{fz@!^gO(BHGS^=qGS{PZ4w3r-y=MK9mhAnzsm@5K#c`^)6Y?kWtxo z*qEpq*y3jQR+K`#0TF}A-3wK`kXd*la*)VD4QnB$LH(cZsI@I>@6PguIw5*={W(89 zzKx``o6!`UN2H@EmQ7(IKGl)5MJ`G!1uanSpR$ynVhZcI!biu<7}z4dZ7W8pb1^80 zPBPsH*KBKiQ&&kH6*>bRbrg@G82Y?vxipuu8Vpy6(M`dx1I|P+PDU_}N04n52CoZG z4%5u_6|*R=Mh*!{_%u6{p}PbI&&6e<%fcC%T`0Zl(sgX<G-6&?BiE-st;S<W2^$iq z<G0}1x_zk)l>K8n-qOxpqKZ$pH?Wz5l85cgb?V9x^VdtAONt9crWih>U(dEAY*=tw zcgsR0*mJp;^Byg-c8ZW5V9}ur+!HUV#Endfqfrn_1|Fyub!ebcCr-nTZ7_5HmbA>Z zt;FTJE9zK|uCIq59l-*gEtgliS6nJ<jtZ(Vu+8acSJn)mXnuTC_Is0>c2HK~YE|KK zRpFXJ;fjH;l0IN-^ZF!a+1c<XxpT8BjNk8K^7#kEq`X^H@d=}0;2b<AZXiII7?D;< zb_t;X@5?^$R^)G67_l%*$SWs+ghw+|gfhIlaln-NbxdGV(Fzx=qfD52qOEm`?R)1% z+Cawu3cU}+AF1}*Wl(J&{UgR}fiV<?*kmLOhKn>k#UZ?$>L!b%fF86NSge)&`3CbB zj5Qq2Iea>_Gbaa6=H)kaeKc9TbWF-!k+x>PMaUwEJXYUF@Qb_?Am$==q%A)G9ZQI5 zw-;)&A8N_Q3TtI~-W6djT~VbA>rmP*OCenoNj1;|<Bh#WOwqUUgeg20Z+OC1_?4X- zZX?C-#M4=2XV{8JfNUhdFQPKC-nKZR|MM$oy2^^LQ1T`&C{`jq&Ezx=pWTcMt6#8x zL2OnubWEs!-P_CJG2hGuphPmWhY^x|dcmJ(Ls&o-_ip?O13t}Z!1gB>#=;cpi19Kh zcR|NlA=rlSXYMIkkY70Lk@6i(3fI{C_eAs=&MtEhM5S)>wWDJ<$FbZvwkpb8W%eqH z{yn@IvLv4*%F2y?v*A6WU^xpJxYIWN$Cn{+85}Oc%DG%SfzAA@bTo7h@a-38aFe{< zVB@yogdCRe5n-3oEG>-ba6T93vi2_$>N!!jK3wtma0~E+_cy8eQbKL@vH)Sb7a@SU zG~fC06Q6Qu;TylJwTlLq@c>!l(?TIiQoWIgmyLUfbFFHpMay<KHNTYrI|h$>%&^d? zlecHdS6nmO&^_6x3oc<1^_cvPkBR0_7%EYC8|q?cD?LSVL=$|_?Oq;rgtK*fDKAHQ z{_j6|;3l)sB$8x{DcsLpJzrHSx#MMePbpj5ayz52;sSg~J0-k+->cDg=Qk&8O?uAc zdneA<Z5oMP)hFL9)n}dD?sVC;DCd-$RsI02NLJW9TNEE5h8rMfMXppoXjI%hDJ<rG zJQQ4Ke_{=QExe1hHeRy2iKO(xw%(+xX|QXpV2+u<K_R>8K2|&o2x<xZj>IX&1gXU5 zde^Mn;Ya;Kb(FuOPCS4im~LaQ-~Ow9LUhz|e5-RYviA>0KXKX?Nz2Rlj<wDtO@<3S zYp5$O61<`sIYrEt$*gAx{pS!gi*`L7?|Mg7LLDQ}k#&3DRVQ+|i>OStYEyH9c%FCX z$p9i}_>mI<bLd&MLs33U+KI?MH(yKHF38P*S8PQoV6(3TkxM2o0(gUM<Ca(SkV0pV zb1HN9Zk>AL>KYfwRWPX?&q=Mbu6X*lKblNq{5DkqYqm-$aw1#c?b)=Z*5~E8b+0M> z{(>kgirUvFqBMnle0+y3We{{L9u_Z*sGrCCRR3hhJe;rpx>@mOBDm%K>8~P%rgH5c zWc?aFU6eoEsw-By>^RL0a?g%T{8DeWQQ&y#bbrtApY#^GdBlku)wpYFGiNY;;)#mp zc2`P`5RPzd@!U#L6L8!$YD|JykF2P4TC~aO^PqaDa4f;ATN&;TsqgM|2~M808EWn8 zS}rH3Bs83-H+YBV^qNep)9#II@mjQ@`0(T<ht{v2fOd^X-JMsl9`N*{ZHD!QW#`T@ z^hVl${_T_hU^Z|!`3$?$XJO&<8B5kYS}wiPgCEq4kJfEpuSvWaUwxjb%MpfPztawR zb#K>nr_DMoI_HxFo8*yEE3fslRoGFsJ@C&leNoOVtV>9q^PmBS03!|vf({5m4hYPY zyF~>Qy9qVB`HxhlXW8PK{AXXO6&*tqOxyc4R@A&Xzq)0dqAK2DeE03kIrVz?-4|(A z#O9fyt!>ZtsOyE?%#K78ZiyxDFs(0HBBlR2w&yyw_d1rn)Y$-Qh7W0$Z{k7Y(@kt~ zmGjLjipEkw9~kLLo}FDe*zA@dZ_gwJLWA>M!u}l1@hwN-*<A6Ez(%_pMd+}GZ8Y!U z$@2I`W#VP8jOnAz7mgNxjuwC$b5OFy$72d9lh@7TDz<P+{sK2o0vlho+j%S%kD+x) z&>lo0Qw46CH0%J`LP5a2%|`JskE_DBFYaMM<Mxl!(89COUnNh74DT?iLly1UE%ix+ zhNtGSCsr4^FnVEA8`}AoqU*bxyvq%cCPVi!fmiYrZQt0HVi<PD4oEE2*Z3PAWERv8 zV(Uwr41S%ix!sD%8p#VC#rCEq+0ZXHBTRhxV1Z2Zkj3wN6l;cpRhF|d2sRFVetY31 zmFUWcXVZNy9H8b6pt~lpk$I(pj^B4pU~v<mHuriI-O~vB&9;X?3b705d3eOuH$bK; z!1XAfsUJmqPh$wkQ)Li3K8mgz?CO$hini#G`wUvJLe`vE_E+0Yv+M=7A4fNU4r!?e zkddJehBWUmuJ=kscv6f(7!~({-bO|YMNtf>_-a}ClAm(3c7|$5q8f#COvG4Qy71!} z*~}cfEGKhC?R%Ozs%NPE7A~Vz#K~O@OVe7i1Hq7Y;&oab2s%#dipGC5bC?8M-6Xx) z41s41I>A@*0Iln7`lR9Ig`%<uaAlz=GTb3rjp#ln)xS79BUEDo-@~sGGM>xSX*fr+ z*Fmp(%!xtcLmh&FBxNsZYJLCeDxtygNvvf%|F7th<`^SS@tv^~5-TTp{Fr*sDt~*W zF{h-Ti}+yuTgffT!cSxXnIp=LYbdTLH$IUAWFDbL4p4xnqV%8uD5F!E-9Uj$W#&N% zkR+ihyru-mP*ZJuq5{Y;QEgm9!38yHfPxSe<qb7JSqge44M6z=G>--#sX<lvi54JZ z06h~53+S1202zCz(E$|Pp&jS}%D&Jup$LKI0RfWH&<;=}L-QB_GTG2Gp(uvtF#;4S zpdFxSfaWm)6xyK%ML*P-0SX|fK`{e07J$MM)K~z@ThN-U0OccS2UdXO6|^QBK=KjV zfej!7PrdPp9Uy~Fy>ZPBP{5_8^xyy}kWf?JKtT;PPJjXv)S%#k8W(gvs6inGHE!s9 z)MhtOXi%GZ@BkzYs0**5u%Isd#0#AdS`!L)Xa_!kf-f`=iV$cXKR_WGYEUFYO#q;f z4K*l=p(Y5O4{Cw{<pyX?A%Jo_w1W^pvL9Mg7$6CPb`S>0%s^|30A!Y+9Yg>MThKgF zfWi?p4~i?Oi2;-!p?Ofi)0laPL!Tdw*$ou9P?G>ClRym$YN$y9l$oFg1sBw$0Lns8 zlLAOe(G-4?21tIODZG{j$Y{`Pe0mRkel#1`?*R%HG?X4P00ny*${Q%$p(YD`e$YH9 zLZDUT0Lsx&gCZGf@&M&*s6kN-H3fij1=OHufZ7M>d{FxUoe$bi5jr2VpCWWVXg?+B ze9(SM(D|Spl%exM`$2I9H5KT5&^##MY0W%Tq4Uw2-9Uj0H8tpbP=kURYU<GWpaumO z)HI;;K}|y;)L$X;w+aKt0|TwH*tdcG(iHyZ6hLvl`sTHULJBnaM}@%^8q|gc4@y&X zp~1p@^&)661{$3CKQh1Nt5ZSC=0Jn9|Hzbv27&)s_Fprlp=ITu!P0zn^Z(3z0}U$t z-!j#pLG}O4{Hy0*SNrdS|Nesh?I`~*W&hhd^zZNO|3lfog8#ehUw7!QvVYy7fB(q- zOWA+DxBum8|0lu!KlD7@FTHkty%2ku?-r93eYNGgm^Z=S=~@o>qS>wn_euEfvTZr# zrf~0k64m_z#qRg#n-EfC-tZ|wiVa;v!U`D6w`P@8QM2XCA=>AGp%!mVE8!BfLhIlv z3o7p#c3))_YzQ&PL*?(0f?d&o%CJKWMf|Xz<VlzjZD;s!zT!$2RwuYr!o_I8)JL&v z!&E6`kGpx^M<o9Fd$8hPgOUTx8MfafAQ&jD`LF|Yk_)EV41QE|KO}-`C0t;~KZK5< zTc=W4rc&8LSF!g~{*slr$CXV>&K_6_@Hw?(W6J!5c8=_L%^r<QI_S)Uyw=vd2RkY( z>6eT**z}hW|5{Oa-Fhh_@ysiK#KvinuYdTGa#Jf^JF4q&#;if(HQ39N#)W3uxN>Jm zSdG<Fs5CA)ouDNlm&lq8cKa9_@8}49t7Do?y@?~SVuvvv{3xO^gXJCxPdU%q12Uur zYMjss{xZ_QOd6Vs;%^8ntBC0P&8i@jZO<KZ7j(28FV2_(t7jys2gW~rRA3|Dx68k& zi1L*9CQ!wnagzw0__pcmgk0EtVI&XWLVx>BNyGY(ro#3ep)uZ#b^rZ+02xT0&YH5C z?2G)4@@^(L#y4l#5G0~5P_;KE#f;GK{)X|$PP^;0;zZHwZQwd7P3WG?Onnw<0FoIP zX<%&U%@Gjtkr?L+3>&@v=uRCCo?LP0%p`rCQM|!_(_4RwAv>@uHil6%E&f>gXQvCc zN>nV3GyVD4!eHD==at8r3v+!>e^E)PQZ(mp{|216Je$mRv${Hw)h(!7OouAGG;(N> z`Qv)4fQz7t{K;EEtfY3jqo#19Bl|wK?}3DH0)j)PDrZ8urAIEz8gcuUJLk@C<~TzI z>x!2@tDV=>c7k3NX5OuxrQ0t0nxN;8k=ahx74^XTzDP@_Jbyi>-JRbVSYHA&TM?Se zoIyl8xUuAO7zx0L=kZ$yjPvmE8F9d`4LA}BYmBB?)zpqjVU9Bw`OHa?XFVD>kJ zp_mJ-`T32rGHJ>7+yn%DZzLfedGy^lA2_Qc;#w`q^G^1URnGLndRD$S)Dc~)yj!x? zVdLwjOKSJO-ua}zsO`IAohOBS&Z$!x<{fPJ)W;NPijD=U(cj%242P+Em!3V2oU#R* z(DSBa!A6l{#v%_>s8A=v<@-m2)PRB?WD*;O+1-ha+O};3hLyka?1(n9kBHNYTiXv+ zs^+euiuwp#5bjd_<}_T1x63@mS%@SjZ>E{R<MeKJWIlQaZfrV{z03!KiJbErNKB8z z^FbD7pW<q)XD0=#7afk)GN0MmkA6vUG526ZJ3OaO2^N-L{$zT+F&_|$qon*4)= z(Y<fdG~E%s&@;l?(hKV+Xs5T<LAw;ac7|<nSQL)Wtw!{2>35dL2|SluMe~sIoHNk# z&c)P!sGSiwL|u}&hsd1Teh8zB-N1Nv<wXL9HN@L8`cfeJ^OMj|R@j+SSXo!GJA;q) zkEXl1Q!=aQj@22UFNmCmq~0>&<V)lJGjk2e9zUHskQdl@+g875UVV46<7il=iIr*o zyhiuKBQq@;P_!==K6Es0m11!~tncBp9{CjCAf2}P87G_>^MNBQieQ6;Wc$R7t`r@o zPDA6S4Xiz6&QZ5?L8h3J{={l4Xc80RXNk-n<?cT7d;762)LAXaLFEqDrHiix_-kn1 z1tmo&ki(|Ce|Iq9L>i%9+PMXJL3~#hIn?G$NVM70hubsccu)Qo>XxQAvCQ#z)#<}e zOCDJnw?*dQB0~eQ%EUA1dsTv!&sFgfzlOiVPv)tGoX{S>OgH|i`*o;EWJ)y`&Uq<l z$e+bvq#EN8$Htp=;MbpFgFLWLj8Y=6^AR_Y(`ZWk*mN(FRlI$oe}Bak_L^Mg1RtZG zAP^UMx0w;U@NomXXUl<{G5Ex{HN*&hd5e;8a|ZrPnM_l6Q@z+w2iTeRHb|m1_wXbE zV=_T|sk0rw&A4=nynHggYC0SnMoNJEnmoCi6s}1h;;xvfnfCadncR(M8rxp<G1qu{ z;PNDb=Tf9ASd)Cwqn)dv1Ch&3NGtdBgI*D#r<DHLc-P^K9*cJ;BEH*`Bi@>sEzX&g z7D2{2Cf(PA)AV;|I|YVks#ViH)|53SKxE$t>o}zyKPC@R3rB5WeSFV2WP_<Y*kT1+ zs0!sMup#@heP~R6hRMBw^!>|AoyFR3`A)M(3A!p3az$yENNd)5-pNr|xE|_7pM||* zACoabN?8nqWE4~L{N$|wU7MYlU^84w2P$hel^5$Nb{tbSN<t%3oU9m%>(~&z#<#=N zmVR_)Hf^vmtn3L|@Hh{@Mj~;Qn?GwHiHTltLJ)(ihurBd5ZEuYf*vC<EmXcFw{3mw z->1v=jyE&q?6mjYyRv4f9Sa@7Xuj!{?6>wasL1-LdCC!UWWHs_`Ex$muGoybrp<|U zoS-4z&EVD7L`l$eMI^`Z(_@0$?kyS9B%arnDWMhdJ{bi@se=U=J#53ujXuOh?gXxm zOYhNG1U|6=64>=^_-8<fOG|249Ty}zuQ4!@>vLj-e~gB=p~&s;Wr274d}LfPnf}{v z%qN!bEOsHOX2Q(<iegtVI3SLtGvUyIOKwP^TCMj99{<W18#qp*5}`EvQ3R9-O8Xcn z+q>BaJ2AICL&i*;;}8)K8W1UI9=)ksFIgn5mbx01{vLAGl78j$Y(xBr+mZST5zUf% zebbiuTnIlr^zFw(UC2%44<iF!<BDaSAu@tJ(K+6a-{W>^R;&!#<h+PjnCgwRkD8w! z@uG(4>$xbahTQSD5fTWpjYS*?g}4qo{1@3jdkTa7ML!sQzfS!q=BBw9_DAY8j#e?E z`!$hrh<YHWmGl?$Ix{*m=&Tt)Y=K3yg!F6DL1Xzd8TH>jXuZz$MJ)JzlreG^5m9V^ zBYU+r`D2Yex!VoWhNq|ZH|G3X6c=GHGFObFilq&3$L${z(5U&Y;6~3A8gn<?IGZU1 zk-Pir4gvk=J+bl{lk5|7zLVx|a+3as(;w+0Co&HdbS%F_hQV#w895R$hG{$V14wk8 zgfetj<p)6mC)vvIKpEZ|&~JVwWCZHy6}tv-_mX!GdyFET*YQb6t)09~{wypWb@t$| zU&a2b<)ztGYD#<tOc5q$_1vt(Z~EE{;%cN9JV9^z%fIbRlo#$yROjwt*JWy6BbaY< zRz-Z?yOKfDFxb4K(A_h0%!z1B4Fa#g`#o=0fBb@D&DLGl4pBnQz`k<G5P0GqG8Th% zo&Te0g&myu{!0hPVibI^me7ZW5kbj}#w(lF)Zf*`HiQ)>$txYp#HlwJ&<@Y`Jb#;} z!p&sC`yI|Pb8zN+nA)$__;2c{@&kDw%oK`nf%1XukuY>$XHf%ZQ4{`UjSQTP{O9#{ z7NR#EYws>z+kj$?58FePrI(>2ef)vyE6<z9A{2A2fiC7?-E>Qn^w57<33$j`-@5E- zw|fF5h5l5NMonQg+DB0Rv}lFgn04UV<5a$M>3^+`k)EKCVLiLNb+U8|Wxu?4nswZ~ z#I)#i2WGDtE^T&`)R3~W6N<w2(-+)7tz|Ky6vN}#jlVR!q>i&qjpp{aTp?O|Ax31i zzq;G)tV%Hhx%Ph>Q|oW3C-mZE4B{k=;AD*BWK81}%;J<BqHEv1Ezv@oVMP3x+V@kz zO#hpBm3oOb!$OfV>+;#)FcY>PSi9Zsu|a?AlJWJFEP&zev5ID8?_&>+@v7k(^$T;e ziPDh+MmHC6)QaDgv17$p@fFOwD3j;p&l0;pe**q@-GX0r*}6@ilwE-S5lvg-!E4?< zZ&&v{jW@LKQ6e^VPWi@t-+&?C%%t%^H@n3zvGL{p+w^vfOBulL<W^2fCgk{0;AwDh zS#FQ%GPfgNn{!r8$o&`iO}`Pl)Xbp+#Qu*fo??&>M#bl*o=B}8ACB`_yqNInR?teF zL2iqW``C4=W1nJYep2H{={0KqQ70=<?Z{#qWiHpjY2+e~G14Nr0(cI$^z`0$qW>>O zz5=YOZd)6qLmCO`kd#KcV^h+INNh?%lx{ZN-Q6wHY>;jQq)QNy?(W{ezvR2;p6{M> z&-35s8Sk2Ntaq$2=R0e!4Lp3HB?H)nSGP|?X5i7kDNZY9Fo^gr(+Ds&W036$H<xH> z8`@1EVQp;lzTDj+UE7E@tYWkV4~DHcKk;`98uhG`5h%wePSR}*s9{MK_fSV@OLEAN z7g)_DX5*_On1V<DO1r?PJJom-5@`JO=adI!T@C~AR(@$8ik^t2%4kq|qVrO`C+clO z2!z4LintMj>;Uqh_DRgp{1$<Dq{(xO!faNQpdQ56)Tbuo+j(K(%=DJ>S)2|W7lx`C zZa?cv3%o5a(bx|?IBf@b{b8g>2ZB_w!Q#jZ_AR|e*B{ni`p_n+eX6c@L`k@pR}~o= z9-ZW5h>a10Wyrza&b;`A@_~GPQ^i8{?|=U8oH&F-5kdX-dg&L+8?lCaUqYM;Ut7YS z-5g^l)p5bkZ^<=lv6$bW5SIIgO-s=K?93lo)5a3@LG&=;AAK?$&zYM+@?MGQy>cQ) zu|lc_{ZNVh*%@QoGI=m4Whpb-{GDpbJx9AR7kY}3Hi?GPD$IL(mu1h;BQm6}@@*Ps zR@i0<W>zr_l~wP)*PlDUx<FTxU$+3-1ix;(uEhRLJvZ^q(K{9b8JxHmjPA08V)+WG zYU>B(elde=RgHVkn7dJHW5#bW1UtJ@jo#a8eR(C0ko@Y!JA|rgs^C(t2Ik;hnacac z2kALqQrz|jBc8xcjbq`&&QtVwoJOy1uIX%Cqh%77(CP_dK5)dZoE>}>!z!1c0rEZl zO?woGH&jon8CwtOn2$mk+s>w%vYN{SHA7UFCtl{RtVQ82dGg8;uBGLrd5Qbr#|<&m z6ut-j7!0>~k%%SSr^8r6p))D`MWrVW&M*S{h%Lf3p7MJQt1|6WN-=otRqeSw6foBQ z&&ir!@Kgr9-sTR7BU+VL-OW!aq4QoEDw@2_Jk|(UGL$*G&${4*sarO(`Iu1YvrhzO z)#NS*j^|Tx_-HTvGm}r9Rd);*^T>k>F`b1_ok$O#g;UQ;pdU~il1G$AzU-dkWVETW zdMWTUoU+UWXMxALgvOxe_8ZN+82I6iL+JDH{vW-fr;7SeHm8EutC=Kba?|X%M%hpI z%wRkhDwH}k*6~UtWur+kDEXH8QgE9%Uj-1Yu&C1%4Q1<}V0kPW^$G1cB+u{T;@={6 zi>g(rT<zjt-jFyIadDnL>sH$cKG4T@2%z>@J13sd7-Oi&-_%@)O3WmKG1jkt`NdbS z0EcNpdiQM0gLl-MbMVF|%&knmo-;N7c%53I6HK`B&edWj=MA-U7H_>b_7BcW%unRp zr1rz?oa0EDCErYBR~1|+jkpS%DI;m-=NXlT$w(tv=3A#ZfIGwHi*9?bC|{n9iLghW zj@Md>+VU+z`fol>u&ac~>#DS{@|_l;Y%-B%w+`n08eT|Bcf6ZKgC_WjT9(gUl~622 z>%!6{px>k6K@P#gFh)m&+nM37qKWbjZ&@yX>>M?cjBqJYe5d+Rd0F)77y>oO5M}Ma zwfw~~rRB%;`z+UW7ZLx%3O{lv8*xq6cb0ciYFnrmm2<-%zK%<&sz1oSZoCNG^tIZL zxtV!L+i;1bB`FX*kZPP+n?#vRQ^9-dxr*S(eS3PjZ1F^xqJy>j>BTjZ?OS`_x}S60 zy)Jvfub?I%LpgZ0bhRza3+Glh%*e@ee-d4A+1xO{4g+z&D>7RBkGwSY!B0qU!?4QA zG^Ps@R))E?>ELc}IW4BA7Q27t{|ru{Dw5))54aeE6DJXTB1e3O^)YzX#$dq`d&D5B z8COF6BIpVy)O~z-4~$I-$MtjEi(_o)MdG@F_!m3m?xE))?=S{?%BEvx)|Y9&Zpx(G z8*PrK7#4+)bNhTSE^YSUOZ)OGMiZKEmN>o7ZI1{g;G=lP-m?ln#H9zia)qbJNuLF4 z;;VR~{u*k|<PvxhWaaT=AoJ%|G%-ADV2ip;Lomu|Wm0n(v&0Ns0xv(NbP5cCEyWH5 z`L5^R*X_IB9Qi7>ON4lkb=IYKdF*n9C*NEMt+sU)h3mUxYU{a~cV_7VjLW>Y7|STm zgx}@EfZ}U%<9A)=`mKq>M770t7lV*#o<I`%zF}_m%E8x-*>|trGyi#c(&6jJ7K)}s zr3lOf8LiqiIDFq66SgJ=M<PxQQGI%)h~eLTI{7ubqVOWPc#C5-7LAaNeDp`(dGr_I zR$|*L^xcvS^R&XW5Mj&6rmEz1?R`!2^U9CKo|`9}#9?zFfd_=%eMIE+`nwen>?yAe z2>8U<-<bKRbw6W<k#`vxY|OvN>QomL_faCxHEEDO#K1qm^gMdjAT0*3?;yg$%uPW@ z;;9nDixj5b-;Tz4n*_!XLC#JkqoU8)&xVLBQ;=gi%izs+D1dM0rnNV|!x`E?n175D zzVo;>?1aSr67o^XShrk^$cz}ywBfn-aOLp!nQuU$vqhYZ^fKh$JTDS0+`m|F5-s3u z6lM7#B+T7C@B2gGSgV4lc#r^bPU7Pehb>Jpzxq=#1B$HL(Sff>$Qwb<9@t|7d$Gz# z$8cmMa6yek$$iA8MU*RZqvPr4&&Oc%T}D?Dk$Nb3sf88k?P+{6NDYm9$TIeUBUbDc z)cztR)(xlM9SUfzKE81$YcZ;}Mz(k*s^KFF$w1t``axENgCMoE#`yTYqOGYG1nQL6 z0C|AzIYNYWf_mZP>?=Mb=r*@O6*+vKnt3(4p~#-&_ZcY!*oJE$!w=fuKRsDF!$w$S z_^8$+(Tz3Ep&fBR9rEkjFGdj)+p{qGfU3)Dw?>^Oj!U!<x5n)DdOd=7LBX_e1wY?7 z9lhcG*;lDYeT{91kfL20eK&(PsdP??*}I=02p21q+xfHZ^f^`BCspE^i^%68R?i7K z&Qtg&x)rf1gTG8!(zoEN+L`03ruI-VXO!1z8siX()%V(mN@ybL&USwCMtR}0eQn}w zB~nD;6L6dB+p;(~FBEwGk|XBS7^;_)(byJ@d~$!kL>=hCC+zd!1x@W_Lk$u?zQu*m zkx7FN74R;xKEf90><*<j_f+E$TWQ6Wm0#OI>cq(<tdEW`?RaTSP*R-H>SBOb=%{9A z!Mg)RW*4sP#6j@-4BKj_lh&w2uS4;6zpMSR)@Z~KcUD>Q7Xc(C_Y)yCA<rPTQRVD{ z!F++!vpX;2UQK<9k<{`H{b~2S<n&?CNPxbWsOLyU_DJg2-AxCxgPZG&??REOA|B<N z#VX+4<BV%7_%$U%jE-8JNcW$iCO>=L4DTUweL7&%Cto)<ZT&0?;>!_zxEQ=<tNZh- zZMB4EN|Dx8x4Z`{mfIaz@Fy*{j(+n%I&m;NT&w`j1Eze+*()CBX(7wWqCk$rnFKd< zZzPrR8;_eQCYl{FD{8?b0U_Te0t9t&S>U}MBkZ~zMRwSW{ryD1(q_8xjZjQ3_Xsx( zVQ5(~tp1hA7Um}goir4@rJ0mkRO#>sA5o{Uv0a?E7ouZ(o;km6JL)cd%?=Sp7f>o% zu}wWFKVOL2?t3oH-7Xm(BFrqH)U;w_U5L8=yzQ^Kj5Rx?{jmV5XpQFapme(swcq!o zo4b{(yNtCuq+MJ9p?FX>UWmr+dpcHK+GVt6I}_P5ZD)HCjk(um!mL7+8lx#A1xg|e zan9Y3jWl(0_$%te0<wPD7{XvH@{6>zZ^4_K;*N(@M#7x~9?_v$Y6Z_6SGzW!DW?|I z!&lb(=GOb>)cfYu`xeyu7S;O}*83LM<5t$k=GMpN)W_!4#}?Gb7S+cV*4xS16o2c# z{Q**jK-~5uGL@2A@;gtbEpZlFp7-YC|CDm>uf+|q5+^`-e`$lV{n}PSdJAM;6>Jj- z@4B*QQn%HKGvs85-t`OH|2t^y>j8-`J<{Oov!@aUPs0kyNrPJ1KKlN=_ir$wz?6vh z-%xJwFq1w=Z(+p}>~-Rt^5lM7Y)N23{Ct$GL59L-(u}-Nf);scSWE>q?j9ONj@^Ow zdtBGYb%R(9rkL*a<zDqG{B6r|LlQ|ts(kfiNSI|54$opocv^3iqyc^nzo~cU9OIfs zZ%U1G9I-H^<N_-NL&SLD&Du9#1%i;xaB&eZ;>I<N?I@A2XB#T)R3;~z-LLzah6A|a z(S|y8Dnpgc{^SmVOEyB}>)nP*u^HYW3P!xYrWqS0>Rg84>WvU}ZbNV(K(PzK-P#Oa zvVF{R#1BTy1`0tiV)3brtq@px<(fu)lqlA%E#&v9jA=GI%>x8?doz5?wk>4nRAw!U zo#q^Z`+YN9P7Ev^4BW_O&+EIUsR17GZVNd(m2u<;OD6+`AXpkmd<GOZ*EE6|k9kB! zh{iV|xUE0|bcP{|{l$eu`Nr+A^ViARbenaPm4M%(o=rBfpYBe%Cs!$JHjP(s+%SZU zW3J84t954jHPx(TbLAa=;Ut4|(SL{#zy5l<aD-c7&T}z9{;F;F#3@n^ECu2W4w4?Y zZvB>uY;QqO#KXgVZAew5^wC7XTKEfA&FhVRc=9)~R%$OWcdE16y4-cfn(sP!3TTlX zVj|7n^hIt`QP1@&lTJ(N&c1N@)!@Z4R3|^#=d8C|9CGkJ@sKb)4UU*IE!eT8wxa=F z#I%3`<3;3d9`uZ$tJarXI~B5$CEBp*E(UVlY`8Wf4qm!m4lz)#>E7b>cmKXapsGSV z_c}RKa+k?psIp11Kp@fQ@<z-Cuf@a~6ff#7$0x8&-B7PZNjAem>>a01`G&o+3Z|3f zIka}$^Ley(KmW~g=;V^gJVJXEjq8*eVzOY^k|qdOc$d-7hFr$BJRfz$iJ-GJibgm$ zisouYEx`PrK`lFseqbP|A|Let2x|WCfPhT^#Q+$7s3DF5!MY&a3?QQixs0nafHwft z0lWiX4B!I*GXU2AZ1KO60SN+%0hj~W{8LT?C4gc83^Qtomx5tO0RSQZWB}*^Fa=-; zz;6J10AK*l0H~;faACWQUEDj2T^a!50dNDp0{{&G@c<?Ph)Dol@gkSGGXI<(0zAB> z2Ex_fVa(GYmpLoT4{38E7_W<>5u8zz23o%YTHgYLaI^mw^d&#U3kYhAqG<wx4*waD ztpPwC05EtWyNr3j2s>8fhX8|jEC4_UfII+80HFX%0HgwF{AY{*NCqUxegi-YfHnXf z0Kgz;zXPBL!kyn`T*2RATmhu6H~_#0d_dv~Aa@0jy8;Dp3ILG1@<;AjWq!ygpjM>> z0MPwWK<8*VQ2zs<hbjR7fCzNu+KB*H6~ws@r7E>=PaOR{>i1i89+uPL)nW^5tsM?y zoYP>}q9}=Y#1p2h47)8WDI&D<^DhUvRg@wbg2*a(6VtxlXm(u@oIH^y`aMh<eMDi+ z-ba**LnOg0xHC_U+R^#!E<&cCKLj?EOm5L;M0@Aia17Kx17XWJYg2ecoWu9R#xtge z<b`)cZ!xhLKIck=)Yx83FEPRrsTt?HW67rbC0KzE8h*8>QC$f^UlSoCTAru9<AUu_ ztwTh2)Qz>|pYTiFu|L(T=M$tb`FVmh2M-94u#}6EeGKjgjk>Qh8=Fw_o4K<^Hr-E1 z1+wOTHHP-jyNs{G2t7x@<LfZOOrY3@5t5IB#}8qIBBTF(a}!3`I`ZE)k70!RqyHLt z34{Q}HH>h6^j{<Y>*noa$ns>apRFxU9&3XBD`9l+_eUQtUFm{(?Qz0eqpvnAm(@}x z#=gc4UYEKo@W0!1zTe3f$L`F4;R%pIgz<ElzoxJB`T0A@)$NJKE*+V=qiwCXlfBBA zyDl~7Xc9V|b;#PRtX^#_&rA=Q^4zq&u@~@g%V>d&=o=KXwR0!Wg$^FKtlRxM5wL2^ zsLdGBu`Xuq<4#&c8$5-qJ2jmM={9DTk&S9q6f<vfCmx0l+zPKdr`ZcDUS}2vkE*p5 zGahm$oT3dp+%voX2FqmMmTuX56J{P%=FQz{IkvQid0lFcpWZV!0c0^iI(QSd0_5VI z))_!X0pvMA&Vyz80Mf;qP~@;O?+_r{+QUWw^6sAb1|UZP($$+#A0SVGwC(L-3zyml z=l<jQUK}@5*s{qtoxnRe@%#=-zR8{8St(^i7C;tyaR~mvmdyr8EivLdfHc1|bS$Hc zr~t@vfSksbZ3jplF=EeMlzbO}te}keleW@}!yO>|0P>v}aV9`|0BHg8{!g3UMrYe# zV*MK;+2Z@a@p5k?$2~Cd9pH`vZXw|AfQdZ;w-RtGfnb0oza^5L`S;*@fIR>cX9Dcy zzXvx0!G~btR=|C@55)Qr%vKjnkr*uM6l|as?8O^wO&A<?9z^jYNVG19Eip*hDacwY zD2g}8i!dnbJka1rpjTa>bz)$YQ(%Qw;0SME8)4wWd4TngfT+3vuf%{Xr+_xCfCb)w z5yAkCT@;Y#eS@1d-?BE?fNyRV0<9=^YR&$E`Sty&RkPa4Q<|0ndl#IwnLeeR_Ee5f z@wN=*4;E`P>qTp}qBPw)m0tq4!nl6SjPWcapxO9$H?|MX3BB)a_m$6Jf_grEx~5+) zdI5&k>OhuJ!A4I~2X3^cBMBeqZ!dN3&dge4XuDW{^unTNOFz1FxKRq_ltv6rX!mrx z@}M2|(S}Y}JM*VHJK@v_Bdcg3gyOGYk@UN_>3Dv0Y&ASO=#U+8IWK;*D`4JxSnWGB zlU^#eELU%IoaT9rrUz}0&Aq8E+t3y(@s_U^oCw99PhZ^la(~!bRwsEdg5^kc`<1fu z^so~}p-P9n9kpk!O1v#RvdEopnPl-vyd&A(ZOK9#ivmr_tBl*eudf<+ub=Jl%vH&? zr3>De;#jXfA*o!0zRP%q)lM!n?z`tb?X`cTT_;xhm4AV+LA+PY>sA7-#M+i*oJG`3 zM)u1OYw$}S>K$C{Q5><%`VQBT+w!4@tF)H`p4UykVQF_h@$Hnp>@pI`dHvsKD3QnO zrXJp{Z!R6eQ!!ojRi*B}!u;5;8U-)w@TzzbL=An*{o;9?$Ds^g(E@16o|xN=G{)ty z<7?4;Ftwd<iM&g<YZl%{@$b`MlkX^kO=c1P@u>0Eln4>45ei?U{gFp_8Gndkk@h{0 zvG5K-pRq7W^Tgy(=eCu<I6mqp4^>c$M(VQzz4+PJy?TW(v5T!{_mTShIc@{le6PD( z5jdEB8f3hhf-tdzt>*g?UjDqViodNP;pVL^nTxdK9VcrPJ5A<2aS~2;SH8L->j$~Q z%kIwW&SJa-&>;x9aJ(2(JUQ2JFeY0{OncOPa|}=^a0aL>1ysttdQ`bN_79a(fXa=r zf2foKRBnttsuXa1RJl3!m&(GwR7yRn9LW7kW$<4rrT$Wh^_NP4vqzN!l8-7k#vWDL zZ#}9MIQyr{^|42le;7dJpB@4#$^KG_^_R-vzp3oc{f9~^K;`<_KU5}5J)E=kseT*7 zDkAF6kf)5ysD|WMapOnhSD_8P);VWdl0GO1<tv_{d}`QV6&+l3{9?F?^Tz_V&G)a- zl7Tga>%aG<1P4=--T0#A67X!hhAGjRlSMGZ;GYkW#fE1GL}j{&%X;AnCbV+0i#<!p z-45D=A%3i?Ftk652f-a`OILW%h-yC3Z1XxnRb`6MxvlO{9ohJO=W3BQ(!GjkZwmK) zRmDH}gwO1>?}>@PbBCM!*xWMC)Vt6tRkX6}yYYV2>1oyn3sdE_!4Q{fHEXlp2WlFB zdXsnXB@e+%K6~E1#1wG^SaEMF;FX?Q-cX4r!zC2)nB=?`P*XQaLs{~{fP3SR7Q2-p zkMjP3<mCrhTIgE`GqSjAl=?3u2w`gq%D1<#$~Yq|<!_o_m6Hh2?Q!f)HWazAYIbE$ zwG<JNB_9;?R&8e!zpcrh?kOUoh}$vesc|a^+K?72NgeKxq?v?G1-(Lej+RWt@TzW` z94>vO_|?~K@+Wai<~;S=GRTFO0#B`FnP>%RmU`hjrbH{pU$cwSRgYRYPex<P?`n`P zoJrEg-}DsmwIUd*-z4<%wT`6(h!$QCuO7wYj7zS*)!?H1g}8}JXQW`13i-g2u`R{l zuXeOvWqSPjr5zwy2cn>x!8ulR_M(J$1i@DPS@sVKb2>ru2?-sDY<$LeKkIY`NwDd0 z=dgXR4^3kn^s4Qp1E$HlnyZRW4zgHiLYFtSBirN{iQgFNMz@jr-XB}Obi83ePWo0{ zH@+PRJV{dSNKuk25U%o}n7b;bpH;N3aHK=FYrP}%lao72huLvSxs!Xa4-mNT<Q@w& zs~n!GHV_hp+Q13N5k6{FHyMuoeTDni{u!-Q%~e8@Q0o|wq<UZZ5H5vPwD4S+o##ck zie>vLKa5Vgc8q^I;al+6Wj93m6!o{yvVTRG-~9Ez15awM!iO=(6U|Y3GlsLDWK}1b zEOSq0PA&<+Ue5w+Mi0$3+;HS9nz%b=KRaN=bW|7KWW(DQQSri?l_QON{}~+Dm-bq> zdiW5D#+oN1<3;0R6SFobMV<NAwAN@vSa4v3j!&Ia@N({^{hccQeU<Pph_bm+y;P{U zeoY385Bd%aZ({l-eM`yD_K7sJ9{HgnX?}nd)V|?iA$I^QaSNsh0T|j(+l^kmdjeY? z7bRuy8ypLPvc@~6C5wY;vIhd&ccuzqpmB(U!@Y^Pyq>%UX8%KUC(3X5wWq6eD$BId z$D$omS>|v^F3-g+C%EzE(-7(FcHAPO8_^7T_ejLxKEd10z(tIRXmo`BwuDAEJ%MvM zCJDtb8ybDM{d!vc)N1Iy`PDgz81o6)!Q?M<3x30m?5QPlRLZo=;<{^+3~JNq?CCx8 z9#UHS`vPRa?o))3D~-7=%w1+4Mdgo0+&sv_b1I)oxOvc-XGSf`xDlfU&m4a3M*L9q zvnld0`IwYF^TFH#RWmAk+}0e2EOEKGcAi8MW%Dw0*d?gf=lvzqOV^+=qef2!+AOtk zYK9F&DDUQZ?rS&M9Qz`o)Tv_U&F`e&Kxthvq$ZM!Qzd}Z<gwzjU6N4iVT-t?3*p{A zx-*?tk6vtXT{u0-?C~CRbpBYOPZw%vp0-liu?>d3uz)rjbIQ4@-hehM@9g7zn&{u6 z`d&dn2rtg$TfKsga?w2B^<{UGNWM6;^z@c3<D|(|*(u}}7F!Ast;-*&s*uEA?r9U0 zGU>p-nK}@Z%Fn^OiJ%aYT51RoEuI{C`;`95tckDp#hIJFOHhzF{TWHC3vwsWz5+@X zwWF<M_RnB*3(U8Y*%OiGsN_jN@7G8O$?c7mIdmN)DSu^~BQl%2$D(<D$j>TMgA_37 z6{Mz(Ekbxg()Vi@D>B_1@6seFysqEwG+6ml`y{tS+`jFXXXZjp%S_Mm2{TDg{Z1Yk zYU2L3?AP|QpX*{&E83I_wMbzG9*mPLa<BoEs{xde0hHcH1Kh3w(A5BFWB}CrXs`j$ z*?>w5897P_*oAI*uk;jGF<>p#ty9=I^oY$sPSk)=*?`f&0M*)n*vsH3%0Mp5fU&}W zvCRN=#DI9g;OM|W?%seA3(QCXMr8vNi-MPx!2$+g5^FGt7x*{|jFtsH&H~G4ftel+ za7q6EcOHUDww(>>tya%F;Nc-+w!vsRNwmzcpd5^6{X`IuEjIcZdMkZHAl(*R67zlD zl6!TP-ncf>{x|fibL@h1?1V=PILD4SkG?vOE;x@)c(j1?=%aI#Ocxs*v{Gz(^mf4p z0|rKoqxH^nL0rA|DoDF+M!RiGJIC*KRaiUD6F4IoxGpsK0DJ^gT2veb0;&KG@waw9 zwol-frJr=6A_d@KFp3hZ25qYQZK{VkY56&6g(0c>A*m)IsVZ=MF6h@1s1C0&e!1?d z^IisN;1~rk1%3*~b+Y^j#y0}E^;`hg6F3lp8Z(2r8~OU@&2@6^EGsUTK@~?H{p>@W zJ})%PHPBz=+yz0(u?m5-uKPA8v;`sB#qcCbcp>(iuH`_v^!}SHXBLg-#NzpZDeHAh zzKQ0#MdL~XaA{+;PYwdk9r}VlHAf(hzW)+<+(Q^$h4hRC65YEb@8|i=#uc&6Sq+K0 z1@CA3fu{UYB_>w6M~>B-qw%t(T%ArS=o2v1&)-a@$xMcFIE*5VP=tr&gqNj;7elK_ zj2{kMnPR*IPTd3B7m;mgGv6j>P#TA7M9{NIBsECutl*f1f->k~;))qGFYVCkdg!O| zf(;dg^Ik3o>#h*kgerE>v*9N52k5QfIxvZBsb_yy6zO6+4{1)IbS;ruD}?ncX40@b zg|<x5pQs1-D~iytuY(MB2;52(*9zHUlLe&>c5vO8#7@+U`xW*7iljb~TztdEeDrDk zCDrm*dkfT`q>E1_8_OXafbgzQ>r2GK@=NuJ2((9a;moL;Uu(?gOX4`JSv+P$#&}t- zEZ!WA{gLilsnaO|rO}7xMVrZBKT5w&Bb-e`8k#u6?wDaIB2Jha$f7qNkZ361)3Nso zp;zWiYCzOk!FwMnl|oNpmvn^i(k`sFhkgn#`K=<E-^=5WuK|?Sp&BjpZ1Bkq(t0a6 z_MxDm!m}Jj&pfts)aEJL19h*ZLaf;26Iynsut&|w{fgu??B^jZ36yRn8jqTr0L?gV zC7^#B9SnEf+50iJm8KdDTu<<|1?CW!OO#)GH5n(S8pT=WdbdPKjiJp;O3dXP6FoIl zqGW{d(L^LKCxM15-%4<&e7j$`7ZTAOI@S%L@EOa=Ig8-7w&Qr^Rvvg<qMb&+UG+MB z8JDaU7_@t42SZ@ca@e_1rst{8@G5^QLj2f|L)&_2VR*?`ieyhXj>9^77!dKZiIs%? zIP5~ZdZ;n+EBTcmPdJZ5dwOUI@RQ#vU3aDk%9!lnMU^ND7h%Dtx=Wkx;KY__OBada zrrrP!ZfuF7bP*PAs=JKo4t{KjigXbLZfeuNhjmtpRNGiOQ*%{_TpwCGM|Cw`IJ#*- z9jJQiio2WB?nvRDGHlscVX=v76HL@G+y)MVO!&97mv*&nCn}fnz@0Mfe*Rua*mq%& zyD;S&Lj5zArY&v9u}Zlac2kAmyZeo$CJm%zJ&!o>GK2$BA4(?4ejL`?!*GR{y`?DJ z#cmhc-a`$CUx}&&k>ofI?d+jN#ZP8bBI^PMqPvFy2R~a*Nm!E8F7#UhWkiVvPZ8U4 zN>h)?4o*x7=>Mefe;EjpL&dbY55<b6iwm?==Za~UQaCr**~rx1@=ynYES@QLOXrBr z_<$?=;bz>cUowONcl5*4O&aveUh=1A^9cG-zi2Zg>|u0ZWnZNclJT%i@Uq-kyg3^y z+sf66t<;Gv*GXVUoyU4y>}%|nUz0MJP=I#I={JMlt`L}nD#p;WsU`6T=&azHqlt~- z70W5=NxrlTt?Qxwi5G35c(t6w|4nxV&o)%ChaQVM*|kSc0lR66VMjf>N>OBmZ5`#$ zO8(c~s~+92cnxfA8G{|X$9)cL2zP0Nf#{YgrpFEOCo-hP6+D4B|7PKddV7I<OL@!l z02ux2gHP-8{D5vQ8<u9G?8zTlF1oYL2bvN;!4n1ZZ?K+r&XkGIlr81|IoJGx&5+v6 zkWhxh9EZb1AI~*+i#KalZ%nP8tz$^m&J8Tkn}<o<$GzD7YHx`6Rry$o)h?{MhrS;# znNg9fi}g4J8bE0gs!>4CmYdYj^KJ#_V<@PW9%ieUu>u@+4L$TLc)>A>!p3ZcDEd42 zP9>n9g%ozlCkTIf|9{xd|Jz~L!){4a!P1P=2%a$2e+#U0pnJyyH4an<$vl?HNq3~; zJE|&8U&-_!6^v)>miE?cl#$Ch;Q!P1<_Dv#=$T?w2x;M5B=a!2q+$o<SS3kq(Hm4J zUm=25@I6C8SM+Sh$^3|hD}=tGDyT0+Ia6E_jaKjiL#2pc7}%v;AsVmXhlYX}U$9lD zocMD(h4oI+lW8QoDv>|oIuGfeqNdTP3{mo=;W`iPpQ5GFNDfgV2b{3}DFzyi><}dp z8ZM{Me+#4alE-)2|L*nrbeuS1p>xVgC7F*`2xY}fKHhy_-b?4S69-GMmoV_2{`Eo~ z!$ah7=QnJ~9Xha&_0CutwzO@>DwlG>v6bL)`S!eUFBzh{Fkle2Z@yhC;2i#nzkjmX zEwR-klNfOOSAv%#%Ym0@Z9NP(c+p3SdMoU9s2x2lPw=yGlpw|&$EaOB^yv7(97-)K z9LH!qJq&pG(W**%#+>UYCOZU?C5rq-Y{w~rh>zP=O1jA4uRRQGTVSiR;id`#4&mb- z26p$KGY{|I!pxd3lqN{~FU}Mj-zwol5jx!IZ{WCWhMUFriL#=BFaPB;snHyEN}rMw zyF;#i1mhw77QU#&Pbj%Iu(QZ~0$E2eUq>)`G_Q38qjg%yI<5ISt;wT#t<$=%J4~Yc z`&>DJCTbV+&oQE1vLsKkB<-@hjuib|lq64-B<)^zRbBh>-ALBlNOImvR^Q4gzHeoq z?4S!MkPOWX#F0d!pT_qaBnleUZkW`Ln$ZrL)An1`ZdufhThtC))DHR&b--FywSzXb z{Wi73{&o%86sy1&?eq>*95}UCzav<fL3<}Tk==F8tgAR4)iD*-G5Kf{QR0(PauZSg zQ&Ihsj|SAoqgIzGvtPG$)Nth_3~~9MYyFDj8uaBK^nEqx%R3m$Js8VB82f54HpQQA zO%bj6P|&8|h|D5_Hq<U-oXau*bDfWkrMUO|8!lIHVHZC)c?vhVD>u0XH@Q4Fc`7%# z8*rU{Da#gBja})WPB-G)Cs4x=8ekL7E*>M|)oy4(*X~Mu8tBqIO_*g-WNTe%Ol1i& z`~X_A{9}fepd3pOoh8Wh18B|ikC|Gc6b8kqUAy?MPie$4!=aVwPU7-I$wHuH7ErRc zP%;51Styju5;|0ZS1`4N>kNJ_5JQYYx+-TpR5ECi5a+oX_u))V<~`=ZJ_%YuD%Mac zR!b^YZE93OYSd6_R7>g$tsJ$1X5!l;WWg$a6pGFMl?eA@*!$w|vK7eU?Sx(kp*oq! z1P^bnM3|#q-jpBdDv@dI=`MeghV4j&;w_**{CO?D(p{d}C0Jsi<Y%EIezYSNN>mog zWfn>S7D|#wJ7%FAXNhi_v4UTjA(zJoGS(ltZZgpwG7(%dVYbt`_R-Oe(h<ziVWzXY z=Cjk4vJ*hr37Vs8HMi=!Dml=oOH_@`sRL9cL(c=2P6C%t2@lQ^SI-ldFA|q72@fw5 z*De!RE)$pkLwyCPUnMSICoWwluKew~eBD{e?6Mqp(vqPm7Ra|=exz(Dd!L+7?ps3c zTl{E+<i17Zu?6I@CFHTik5)(?n@|2zTUf|YheTDuEVU!;=#481D+}#F+ImOYdVlJ= zT*kUw`nueZ1l~zuz<i%8OAAJFeEb?m6!*IqkukZ_?LXYI?^aA%NLom20$rACPCnND zk7<b-+IvPz)b}$up}tGVSAc{aZ&PkIa7jC{+18D)B7o&Ny3K&@a%KnXJ}TWls?t8H z@S_1P&wdEqeu&b3i14Ga?&nOYaxp)2*tjlCi#{$PG@!+f6ElG^Gl42I0edq6Jad5w zvs4Xwxsp!WJ<(p>W&H-$-q@ZLjpRN?dMTi*+R7kiW|Jec7Q%%<#f<Ha^lkC<ZMn4V z{*3MZbW3$4(!!STYHTJT?~_S>&@=O&y2~v3zxsc`0aIr~#aTM(v$BZZ4*FIt1FWd< zP?IoEmX^p6uqUHhm+tc7F5-K1Zx)#Q|LHtZyL5jk4r`*d1TsE6qc{`}ToVag5e-~U zMm$UbzK#a0qy-qABH5e;nw|$5Uj!Oo#wMZPy}2TMK}|=fu*VvJqrh05g`?NT0cq>X zY_o4^<NDo(2WwloYm0-msl(d1{zDzG74mj2;dVUXcJ;qqxrD{8wAR`5)U%S~cZ!dS zfH6WF>VL4WrRAujJ*xd<RkgHZwX|`yv|M$xC$)d9rk2*e7U4F`99T363g21r-{LQz zANst1FRk-Gwl!I(fShDoLe(wtpH*USA4k?}Cp%bx%ayQIFL($AXMCjh=UXj5V$*w* z75Qq?_tj)9&t$B?WGvrgZ0fx6+6wV)%*h*91`dW*nH4goW*pcTdm^^Vu0-4SQp>O1 zSX%H?fYn{_|5@w_qzba@lvhtj=YE0Ik*Iumm&=c^-Y&4B{9;9!W(AF~f>u~TzgQi< zATsf~{$sU&<BubD*f}9CH2u@nf$hgbD5Acr**5fF&&=0f#PbteI4`IlcONNm24Q-z zK&Zt&t$lzy(_Q9^N%>(ZeryxCn7{Hf4_HXwdN{we5iZE~REj1r0)07j^5Y5wR#vMr zeA|gH^u)LNkHNQ}_*R|Zww=U6PhzY87;gIsZtKZskJe{YUh}a$Kt}KX<0o367YhtM z9w!c+-uam%Dt*FRm4EpO2AUW6*b6N01!nSk{AtF2)gK-h4))`o%R9fHCrO;e<p|{V zKV>tKFEi8A2(6<xa;gxyDfNyWqEsijcWc$GG|)d2hYRsR>EeclG=XoLz^e1?1qVdx zmx|!4@Xs(L&3j2^Z}`Oam;tc(I(yzpIHgurSKv*HQYmHib2nxPUdq-3*DS87Gh#A% z=X;RqEbd!px&(50Gm!mkte!JnBKddI;0xSQw6|Xn!W@&}OMQ#G7z|6I7}wWxS~4P% z@z3my4V0@;(9RTne}IGuMFR)V=t#m(Np}n2$ra8uGFK0XCd=veUSy$XcNN}zOesb< zb(G9fo|ydZCiwl}*?2hZH1&z*6&=UqvEN5!Q^K%69b6}<=tz8O%=btnlEc3T#mwUB z{pq8`dywI5tg16zD*5;KfBLBDOhu|7dClO}b*g!b$^`dcJrrO^+4x%z%{2W&kg?x- z_Gm0?G$edO(;3=2L1jw4DH(~)z`{$!b;ef-R9W`R!Wx<MbrYmkVc6bY6Mo7xhT}$5 zjTH+d^yN&CuhF?IKf3$0NxOTidpskB4KFjgD<(D2PT}rX0@b`bA2X5b$XC~htqi7U zqB=8p+F$DH%8OcAv`~uX#*16YTu$gMa)zpAUFdj@0LB)PeA+P~&icAzLbDPUM|5ZW z#S8a+yU*VyQ4N^HON=kKfm3%hJ6_wnUJ_32F->5(d3MibU@D1JuQ5vgIm00X?DvL~ z#7Tn1G@ITXA6A~*n7rNjt>7lW$j-33j@X)!l8i6R^rZNm;W_o9YkJ3f<*0~nZjqTT zJ`M%2=dbg*(H)BD_GH_RU->F#263pMY-|SzXBHI4pE|~w<E->Zmq~3rx6$YrYDBCN zh}B}eFY6^vYD^EXo`fq6Wj~HE`qv@1{vC763N!{@N$n_PRqi+5hzf5=iuIOXJ^O&( zltT@))x+(J;V#Jkx3+j3)BW`ladu;_@kR+a%pBBT4e}(5%}uuN+j+D$9!?ohz*+L9 z#CN2HkV}^GraJs|AN)o-Oky#%8nPYW>@dOG=_X=WiL!G})tZ$tgMZ<kXTVT4^Fh2g zma{Z=UZ(PCrY!c@iTF#Ev6BMlq%Jwd>as$)U+PpgOi}d&L%QheFJ(@WR$LW3TMAVd z)am|tI}o@Xq8K|=D88Z2=)e@yNHCy>ZptRZMO2>i2|nupA?J?B_L+~YGf>AEQ$rO* z|1L}YR83A8-ICwUUmwAi7e8%|9&$l9GD1~(d`j)grfs#mF>1d@l9_>$JFDMStP<@? z_as`nD^?Cf7Z)upIAXDe7OyuGg6wJsckvr}lzLpNoDlZ11M0GQ^oflhLtLr_ZWKg) z#E3{9Xqq1r#7IYhbkR%HDu$%Zohxt9Rcsz}g!xlQ>m*I3TqL9QNgz9{-wh{igB~J9 z=NB!#6f4J%w;dvV66<4wGG6-1UZ0k9`y2d`0G$X*qqF-%PWAb<H_gDdl-{Q+gP!de z>l?&()_etNqOuz;uZfivim>nSQu_SQU1KP)$5un#gmt1Bw(UBcWtlt?m1dRp7&DY^ zP=)!M{cD8;n(=?V4x?cRtcicJEpG=a;P6ss6=RCaCg@i|UuF1q5>In2@B6pg-&N3Q z8IiaWR)`g1F$?*F)aj&{qH+oPRf%VpiOEIh;_nEov2xJeBe1g1mr)VPe5Gk)Ac%2M z;wPJy75E+HM(Vf1@X=Y7YPY9pqStoCpA_Ek3l`-v*w{WR*l>G7AxbpyKWE6>*BoTa zo3F6R1UXac9ijSOHzbGNx3wk0=W#nQ46n%_J${UeNbc)H8)JbO7cD-4D{f=){ke+u z)A*(hG}oW^ru!fpiOxX*1uj>2tM3MrzEG<3A^al<!INmoF*UhY=$0XpD{6*^XZ<W( zKts$MOb~Zuv{7+3BMME@4PQJ??2Irsxc5T{UrZ?YsZYh3Q&BVrggf4C_~LV87o@p~ zuMZ)VnN#pf08|=^=7exZ+6Fv6FLurs;HhDRFIE)dMyEc^=_sndgmZoY6d!g@lN;6g zFhZ#f1-~!wR0fLXif{+%rZ2t#cENy~`1=urG6xF&T!6|%(cA&r0w^Kuf?sZM>mvwX zTqwjlfrMEoswcuZX`8-;BG|P%ZXNGO{Ut7itGYIQ--u#2oVjsWWTU)+36Je;!Y7Mi zBj26EVdS9b!Haa@ZNbloV^^WNcW8|vu=-QjlAm>8<e~)Qx%(83AyfoXxN@E?sY+p2 zk-2xAk0G#!P>_Xf`6fwYx4dxAkr_v*45P5nIqTTXLwQ3iGB&UUpDc@w{OPPCEFa|^ zxyaJVR%cE$#arJqah3uUJsJ^Wo(TljI11auGq^$E27^e4<Tkvv0(O<Adq>>_0(%k# z*@tcTBt`571NSAQNq;F$k&d`+_!%Ya77KUV&qXNjUWptvZTmh`#%{59&ncWl_?+1` zckkZh^}7z7Idau?omX6wzsK6}A_nCsxFvzZJAggAvs0_s8uYen)41cc@ds2kJnG*w zNk`*y;_)e@e&N#SE}Qfa9=tKSqM(@3)!i1^y$Xh{g!A8RJQQ#l2(@{A2tE!z(_OA` zW-498c!N=LW{5R3QP`bIsO#c%x67{BL$0b7QZ-~ziycGA>pYC<%PE-Ojm7W%xQJq) zIUkYMnCPS|-`Vv)5uOK8H47}UVyRr45_I7NcI4wY62wJHlIF#@5=_|LZ``0PeGnBS z%jZUg0E>?58cOAI|7xnPYxmu_Q~A%PH$hErT=iL+DhPFF22^LzE3E=&>il-!EjyJj zJu(dyg!(i6EG}nX$y+QKRC<5s5{qKzgN#lHhRA)Eq3rH^^eQdCjfg}y^FVq>)@04k zKq_lXMr0zv{vg}4v!@g-opaV_z3J`eMK*2QQ6T@rj`Y<REytJ3PumG?j^<q*e#h|L zXSFQXuRm?$wuwqV?On{~gFVY^mGAT5i)_=dfepLoAI?1Y9$eUJz6e@ufD#=9-8#dX zGTT0xv(G(s*}u{f@|+wosC|Agdu-(lQ^E$<th($S5ej*AV}Ywyi(j9)&)YUffh#6m zcK3cXEt`?Izb!ueF>B@2T`uTVGLk*`lf?-pOWvm1cR0Dcdq#VEOA+kt8k8uE?G1-0 zj3X9Z5xPn(dLjo~fx8i)!v4mN1=kCofqbb4D}W}b<gj6N$oi)tUw-`Kj!yi;g}{~> zI}lDVj#BQHC}c!v#YB+nzLpfP75C*#Bc5l#EN+)l@Q2b=d!=jWV;IIUL)T>)S)N?u z3<tc$3aFusxg3iKUKeB?geSoou$D9E<|2(7tYQsXV`p^06)SHFh`uBnJHQseUZK9B zhqNq;gJ_QA=*U7HrD?9^3f2p-E=c>GB88RP`Qac6=9@7=__VI-E}Bg%Ec(ld6-x@* zQ3~3SLY9^ZLcQ$)we7G<$8XwAc`W+Ji4|LqOw$CR!S<LH<N`Unr3IuiwzQlo$_E9R zoz-GeBy4kYc?ip@^e*M5h+;#5<<OSd{K0(mV68e+q&hy>=^{g!V*LAa$BSq4w((Jm zMXPtQvWumBgZu8>zpMG~i(1Do_lNCw7cgB8Bins#&O{*4-@Sa@nUGbRjpaGFwwcKz zj~lawa+|A6PwwBp`C#{L$Msi7^lhtH+3j6@Hb=`CkiI(+Z_nt(h3@3bsAiA*oh-4t zNuo<wtBB{P(Zyer$rrHHgw`6D-#<@@F0MR9Ao_<5<(urg$Ib3nUl!~%M!{3hN34%{ zMZ6VNz!Rq~XJ>@1M~!#G`}^k`$JKWZ-mQ1%RvwevvADnI@a~=J7cKN^_<de{0hYov zhd|^i=jYUx_qYPl-MF81T7vYZ^WSw9bE9YUjN^P1^@Z{i`-~L%K$*y92_UbKvR_M> zYb?zs*uE;HO^+KbT7xoee^hvtuIXqGpEW{njqXmqo{?_RHO?B5Pr?XV-F3>xaE5B` znK8~rR=Py8xeluzr{%8kN)4|%>(;$;a7Kj5jbm=+1!>HhEv-H+R*l?LMT-AyU-fy# zQgd1Oiv@+&GYTza3N7Ji<}^@ZASlrnL^zrswxRZZS?&GOACti^SxMDgR{Dae^u_jt z7V--%{&?mr`Bs_qwlN{%Z}upw4ZpaDwvU<++t;{<HkS^1V(gX&8*Ja}HE^*BlMod} zC@S_Avae1g+HDUsoSEtgaw)SYhzf;lCUx5G`j4WzdadkHW$B`*ICkM@I!ZHq8kg5_ zoR}W$JES|x^l`mdfiXrcw3)ne`?SNln(1{uH!yPUO|I|lrQCB%I2ygOEtF0}P=s1Y zFS#AA+C-Dk7R9!hzHy1THXlKRxw>`oZo?tX#>9cv@v0N=3_m4y6i5urL;;kbGe6 zZv<xNb2gF=g>PEmg-#4TL@>WY9&XfcNalG)AWSFb+5#ox^>TmF5|rucBf4PvlhL98 zC=>Z?0^}8a_G@`_jhfj4<3x-jM>ac+F)<9T%@=95JQ%AM$OGe7?(<uI^Q?r;Bnr-} zyZZSU22jlwGe);z)zgOgH+QW4d#G2jc_bq;Pm61YJNlk0=aP=*qQ6jEH&pvJ`MJwY zb6offtMC_0;V-TfT0GIr7}3lK(ac#O!r}aZuKa<HKNj{v{Tp{lSE?pS%0H(_I37>T z!q$smkUV1b!zc&CnobNx(DI=f83|Ea1cr8RAj@i3yq(cNL#?Ua4Hug}NpeMmqDpTe z?P{&xHq_tMngp|6^eV!~Tw(-krP1j~nn8G69^^RjER#ou;ZrLFru<|PEd*erSGM+r z%;IN?Mz|KXwXF(9|1mF6s!h=GS>|h8bd7)syxcPxMtxibFev%(^{K~`6V`sDZvLj0 zq-%?8q-%Yb0domi+Z}U>XDDMmuEGKLIx!9=s@!T~7&XFAcro^&REk%QvcB<fSxBkj zulO;5Po~pxEdKPa*w>xr8b`APj<1liUZa_72-YxNe^d}nj~gj6h01?pCR*CoTPe!% zer7uInrGSKS?@SzLjLi2(>PMI4zn|N!d~x8vn)}IS&8eg>PcGehFx>{jSlc7@`zT3 zJ0qM_`F*-?G+%}!Z<Z9HQr<vkURbeO;OXZ)H%%Q^O%hkl<Ntm4{MkUS3&PCR1G!7M zIQ}^`t}p1l#+G1=NkYVZKeCLJ`=L}snB9xR{9J4h5~7O7d0|-XO0cv1-f;F_ujz4K zvLX~gy_QIm<|xO%xrnVjk4WH0{W8dV9CnvNm0k1VqqYiO3R;FK|8l>+%0z6##{pQ% zZ{u?=LoX^{XTEQltelq1-hB{kx`$=_HDUj8v;0{jc8+c@Psc?u?C0+DA<s+^i@lzi z+QGe!=#$#YMiSsd=EVp0&LFKSbW9YZCP2lUfFEs1C#KQD9~uKJeaij+|1nnfU&q*u zxx~hAY5XWNBeG#}0a9?~bN#CHLSsIu@79o3E5}Z&q_7!G`bv@y6!mjovXN5B;l<Q> zx*I<)YknoUa_wf)Touslr29g~`o)!0i~oN=yT1KxvH%;G2Ik<;*@Y0#oFSj+D^ED` zXPQ<}o{mHtH~QP@?UQT-2xHiHa=_*zXji+E?Uo1roMNtAY)T}_NfC<R-a?kgQ|x<# zqiMz)4o_#C(U<<q(<s@vN38v`62kRZSz7@Ng4-d=zw+XXwhGFVqZj3ugy4@^`>)l= zT0Q$dp8T59=@q*B5P8;kUzxu<IvVQwYz@Yk)dppfGzwFF2h0a*A&cbp?$$}GrI(6$ z7E+@jF(`S4i}Kh-;-Y@y&@ZDabn&AIHoN<@Igbx)csd-I4b}EpcS|^7yd|C(KHX6v zmMx0_dQzhhS>QEOkkm3%mNc((SQ=)wiv)2+USdOPnRPdc=rG3((xDR#H+A{!C$A~+ zR`ZzWi|zk@%!F;K$((+!Ir_}?XnCQU$A9}IcpOc_(SjcKFG74F#gxWdD$Cq73!QG( zI4a&f_?f`zK|U_8>o`G>S?ff8bb!`|Pj$E?EEJZHv7GYSAbq66RYmgNx`~@X3*_yW zjemkQ0?l_-?k_?OWRkQDRlT7}s6Z_|-20xLcP--UhO&8WM7F6m2&ruf&)(l&yl7}$ z_^o(O1g&~U-iy?2u_7uK^DfzLR_?5<M=&xRxkhGy<E3P~oiBbjVR@A-OT;)jxORfD zyjGSaa(u<S=!dT!SCpk}kiKdqcB5%o)i84eRAH`c0*a6nikK9SloXAe6p4})j*^s! zk`#-Q6#XCSfQ6$bMWZD}q9w)t?HY~tfjyj^Vrb5W>jLEyH=-jK5%$Kum|H&4!d4-- zyJfUNT7L2cTU5Ew`#Bxd`Qi0^fo8#x+4Z_cbHm-^&xhsgBI820B5eYAO__tBQ)hx9 zTucYVNz%?U5XU^O(!=cU8K<Lt&Je7v=iLIMyVKX4H#v6*)YyVD@24bA^DW{Hd9Vtf zz9U1;!Y{ylN7_e7@1<VAYO&yN6sE~fOV}nC_)^_6OjD3Hu}yCI)Obo9quX_(`w)^r zU}5yxc9;p`pfHm$QL~#Eyq6fepBQ<N7=D--dYBl0m>7MS82KOSfQ23<Mjj`IA16lt z?HYN^sXe{fTXPWuxf7j%i5HGGR+ov;Tdj4GHuA`_&BrR*tWC_P+c{<E-J+Eo3J9fC zYnx=~8hA9rSByM$qW9dWvff+yX(qShK7wVoPw4tThtZ+FJlk+iN0oQ<dOX71ZgY>A zX|%(_4LLf++_uCGIX%OiW5*3SImi5n$sIYrz`W{%J96@8^P>{LD>JX!0lX@J^FYq8 z1vn4n_y+T;5)b6`7T`Ic=rHGCh9IZ+m~(u9AjkIu90WOg$lP`Zf}A`CJm-m=KLtGJ ziJbfs$O(AAft-N11aMx+`D*~@g`B(va9+sidq7U0I0ABdBd4DMIlYmKugs6Wcq2n$ z=2g3Z2WN4_?1KzNw5YQ3K`utMIQjy3m=;yLKFFmw791?T$fX1p99BR<Y{5|q6l4}0 zyS~WvR2D}pe#oVC0OyBX&uDQ}3V5sl2Y4I+=Z{>;V_|Cr6#N#pr9dHUQMK)V@U=aw zg3@LGS|wN50_$AyE3Lz9pp@l=k#m*QK9*SBxW&;P7AZ@U*~)r;qw!|i(v(jHYEYG( z`?W<c>bn>Gyg4j>Ods*UqG_CdNodMXQAdvz;d``0;;V(Z9rm+Vmp`6D_t+kbveskU zsMg6I{>+b)eLSC7C%>_m4^8wld48PuMq7?K(NFGKHvWyMTxq-?H*#<68>VO3ST9PX z(pWEi<lboSEhM7SGJW^YM$*1+iu_7KaS;s}$M87oB5OU8WzQT}^f;R!YdyQP*Yjka z8?m2y$2r0_1XbMKo0zAxJ-6TEZ5`rmZQ*Ur;BEc)I$&l0^V-5Y&w#}B#pmM_Dlo&h zAJWwqDiP)Q;F+Eu9Mu;J5ufnD!9737sxM?BUgD;k_0i36I=g&~BsWp%n;zkGw*UB= zEFHb?bB|rAT}v35%}lvYoxpJAn5A{5GIyy{nig~tHjue7eaHh1E7qwK9<JQ7wANSQ zF7?Pjr*yEXcB>N|F2Axgm{)Nq^-j}9m>N=`D#q!rK;RnmX<?=+M(wYF=Th`(L8mH) z>#um=9P}Q#qb|MbE4!;!@E#hVEIsP`?aMLXwfBV*y46>DZKvS17e)zP>MOmp8}Quw zKneZX=SktB;5no~SvuBNc3M3E31G)}cMU>Xc)^2#(W1OHQOz^UAx3&4nQMay8pU=i z9ODauej9xyb5Jfx)Sz{35MhJ48Iflm_B%b0&9?MppK_6SghXbPps^lfI2x_RU~8pQ z$pN}wIQ2Y;jbt1;s(MJ=WGX#MTCl+7XlCNTsm6lA%cV+rTYId`zUpZIns%`ESdks- zXs<w<UVALZ?(b+1Vz8>^l%>@@JC<gUI<u2vU^zRMpv5O>ms&j;A8LJR;xfSpS|OB9 zjy5~6a-${QKrQ0++m1GDqD}Gsf9$+vR9xHgFN!8eHUtmBEjYp5B}fR?SmVLn-Gc;o z_uw?vNbn#bSkQ#v1VYf@+PK`+WS@QZx%Zs^xgXve<9&EzROVXM(`r`DS+jmM7Rlc> z*|xekeX?pM4G1=O=rsC#S06=py5DeZNPlfeZ*53tZRr1e2T1o{OTD$2BkIz+0eU7* zcRkw?LWjKGSz``&E!!9Z2j$*bB@TBr+gJDwcRjO$hns<VxRe$Y1Jg*(?g73r6c%Is z(|d=EKG|F3ZQcEqM;vFrGPU-<-3D!y&NhgRR3TU!kf~f@TE8=&M&W7VEc1d%>^?6G z$<$|__#R1BVLh-AWov$;QeP3C34S@T6IozBMZnY4I>5wsWE1s$oVvblfQjX3JMw!S zb$$5&6Vs7R<o85s5Bkr{49?pTADpS1G6$HSIiE3Rt5J6*4zSX4ZiiQLQg=oUuu^l{ zgjeEHcLoixQr6|oRvl3_c@Hp?JKKbP7^nKF8^_z!M1d?~OR-)3O_!#*iFIXq!N1Vy z%Q8Y{cwE@|4AFoUX`IB!Dr?k$7ip~c$TH7r9o7b}XpZU<ZR}g4WAyCaj|f1N{$GI< zb=sdmYWw}h|8;ce_N|^~NjB1)pNJ=WkQbT4fj`t*IE*P>Iwe?!K)Dd(Z_&&0f521# zWy%3D42Ff8nbAK3_d~@k*140=#gBgl?P1e&=X80mMIU<5zm3K;yhl<gPCq|4vzzJZ zaI*Q`BPp%EV)~Ww1ScKv89XR_^j4R`_eB@pb9fLh=vjc5`>TjX&?-tPvmmL_K-8c9 z%|1#G9@B=b)5$4W{bw7H1@Zn##g7ip>bvb<m&Y#Di<&<E_{u+K@$=bb7+3)u6*5kc zf8yqPvB=#?Pw9}>{yRj>`{ujtL%3S&&y<Hs{1F0RT2gVmmBYtCs684ZF(M5B&Lgx5 zmiJ>pEI+>yqbebJ5}LBjEwQWuU{_XX$reKv9=8LK>dP#?Cof(0tIYv;+zvo0!K}oQ zX9N{`fu$}HSwR3k6X5$AQV4z`%cT<AH@*FWXvZ8fGon&QVz~cQ{~)t?nMdlg&D+fW z-9`Y_nag&?;g2}7S@WmZJrG@V#F+HN(qNBZdKkr&`+{Kf--qje$5sGwCotv0!}Y<g zf0}4HBl%n+__$De&xlmZ=dA$MSdbq3qX52@f#!qz)Po)|QEoIQsIQoAWjqa@dT=$< z^X6nDBQ7OS%mX0QkWn-2qXh~O@dI&uRWQBa&j=+!z$Cwl7zM4i*H%1m&y~c1T7P_5 zhaVhSA9&qT50yG~X#D<Rmt0f<vB=VW+enpk>f}_k;^&f^kt&yht-cPKKk(u$B-ozx zeO+r9mc3#b*lz`iVsZw708Gmt_^fY*>I494B*B>x0N`B1DFXvQ7<``;LIIG3-usW> z0RZ#Fxp&Rt$J%0uW(AFvysKwCuvOsC8c%rj*#dMlo9xO<m-UKCvjstU1D6l=rk>Kp zz5rdeo;}w59cc`7I)-g#M6EU}-;}Rok*9Tu=Vh<W+r;TdJaO}OlYqfv11T6Yf9g#* zGR;5o{qPgN{E)QV2v-A(P(wI|Df{2Y{(nC`09jIN2>%mF{WeW67vo{@gALi*?;rWA zPanBR-UFCh`@V$#o)Sv`drF9K^?ynU!7<a{Q$h_dF7@uFzrr>)r0)&(9}f$Bk3<&^ z*<{3>g5&2;DgOU_(Eq3MLE)X4b)6~xM638p09^I*{8}$sh`8#|Xg~^B<8ox`CGt`N zLg^a-z%GI%WNBEwqDgTF#l0B+D)*9m{P7?5&zAXgpD%slLhxW*8kxd0K@p8&AErJ8 z)3*ITmcmh8Xps=Uc`Oxxk%x1LHR=-Vc}erXq5kba59Na#1OTees*>uX!BM~KgFYYJ zBad%60uaGVyzA_E564`xUKdGT83sihg_j}YMER~V41N~MxA-Ib=)*$%W7sSFaXRaT zlls@T%6E<ZyRdbG^3L?o$t`xaCok~MF5XPEMi0Fxu%Mf=(&LV2ReNiNa~Xq~{iND5 zlt<@vwB~t1O0{J%kB(I|p%_;c)@q`YA{XaQkhk9eok^&j=Id;YIrEfUvKmF&nrxOD zU+x-P;Tk>Rno8lCXyF>)|L_iwo^*|`VvVh0P4wSNUquxku<xPKqJL7Ym}M5#yQCIR zc89yqB!3Ub-+MUOE-=oIO8&BEqZpZ;bQ)!Yj))-Z#>x6Q_-#fk&h8(MBz)P`6U}TY zG>SD!r%9heD-jFYj5WF(Tkoh2c8HU36$ipMFN3DhxUUa)DbT#WFftWlWm3pwp%gkX z*nL?RKggyu`!dd7&2X4RZ6<L{{s>gmO$<4ZVX{q702PfBLr!Ec@`wr_=sfA;qVV5X zDH6w&3bj%CnFVTHPfpc`3Y$WsZK1ZVP(5F$qAxVt7wYQ^wfzt804at*ZKI)j(NN#N zmA27wEp?)NsSRPP+h;B751IT%W6X9L!8Alu1H~N9o3VP{G--Q_(G@GJbINjlW3wNl z+n=s{Kbo8W!_m#YjCqqQ%*}+TpI1t4+QpsS2HN$nYRqf1yFr;B4J!8<jWZXH60+!* z^Lp@Nh|9A_IQZoV*UYMLu<96BGm1#C@>i}WbRxkT-?*Bk0dA7(i5b96b2Wzm+$`6V zVt||HO79T~ezgGf6A4!R!8L;-8m#)0YlaqhtZ=1Eiw3`1<2pAL4F+uh{X~P6H-Ubl z!5Z6K%{>6O%k^Xp;P!#}#DbL%f%(LOHI9M#01n1AV=5M`dd4*q0z59bW{QBv6&HW6 zSg_U&SNfV*u>KtvKdN}J79w{#op`W5GB>{rz@c)dn*rQIZtYO<U@$tjb}{h4<ks#5 z9)ECauK^Ei?q*bpU_%^kZ90iyFdlca48Rd^YnuTa5qEPaz!7tM7E1){l5l(W0uM57 z&oznQR}`*IH!#<mW}C49j5P_DGQ&Euj3G8sg(R%{U@~iub4bjKU<;2g+FyC_o>Pnv z2u-7uK5&&`4~h9UB+K>U3+G1&qCSq|>!kCeuhBT~6&<a`J!1_qC_5yxqt`MrZ0<<0 zEwb{=Jc#cfyD?!dJ2}t#HchicORP*X*!-=`QeP--nk2E2Tbaeb*!yJ?!`5MG7WpF9 z(lm_C{Fg~6uc)PI5HFUcX#nryhKcX1dA&~HAaxE-+r1w-s0mn&GMFhOTK^Tw=e-$i zFjtti{;Rk%ZDk8I>z-OT73t*uI#*xEB5m(Bup-R_x@lIuxmLBgR=H{Rf4sw~>R(Er zR+KSb71b0E;X;tH`dMT{fU#}PdF!+4w-F6m#<of4g0$7^;SJA?Z6jv5g`Ty<*0!10 z>^$)iY;=#UO){}ro>Aw2K^LnVv!b!;*=9ddK4Rq`s^qfmnhCD@R+*WzuC>SA<X@Vh zAv{vPX5}xV?6U2h30_!HKTr3G8mWL;+4m|RZ~15H-hBJ;^qsjTl0c}qJ6SyV!KwzL zfQ-2NAMs$MRSg6IRB`v4IPk5>9yYjF%zQUa<I+U)Ry$N|9V<lj)I{qhT}I4cBo1_B zqII2)DrV3g2ih~yx=QaA-8*guZJB6ZYKMxN=fr8O)A(k5`NYL?z?%=&UUHL6i!J{A z_Tp<i5r&@$zqkJYb7%)gHmiRlqq74+Ygg6anX#`4zXiSsXmydr^^I<d!`*qG<0yl7 z$w0flrN815Op*xOJTuGgdGR8<>*w%Xzqj7~U+8GOrzl~m`CKGfQ4u=evV=F6Go>*e z-o&LzHc!DNF^1k5#Yv#2vqdqo-o!;oLW1DJ7>=j21#$F(#07CAg5dl(?57#;&dHv_ zajhM3TT+JrE|jv>m)pf~h~y)?EPEA>VgSlFvX9r8`V_j#LrwjZ&uK3E9H(OAT>P!} zsb^Y6Z<!4Dm<-pM45ye3|Ic@T7XP(eXL3j;5=fB|RZXZ}F}7*+ykZ$8jH+!jwyE^= zVH$OhtW7euDe%0aADxO&ez=;5AaEt#K^R|uwPJJ4?<3mb9;ZCJqJB0*AZnfx*CIRp z!8`AiNL_5C`o_v0RpodqaL!N#nWybpSxbt<NCmcafCSydj!yo%<|D9%)SiJU*LGN@ zzRbk1PJy`=K2LphS<9r1rc;8U?rJJwMv9E)>jXos)l`BE4H-?<1VhkjDt?QQyn#f5 zuJURMUdyDk0Y^fc^3P=4ixg>lssymCX$sDThO|9S0$9p4<?#i9v^`?N&9Hq6cFUxc z!C}0v&}s@6`VVi{CO_XDKjm*LEAxE^+xDHR?N^&mK(Nbli-|ZMHr~@GnwI;z-+QOX zgD~s}0v_)_#u-3><oC$#iXziBsNc1e#PO$yo}l)2#4i!y-XL`wF5^142Q)9<D%<T{ zvR;Q!M-I|9vl$y6C}w1QqBj@E&$V*x_V!}T419L{mLmtER;p@dOTRTGuY#$VUcgl{ zlg!9#5vlmptl?_ob(`0m=n3%!RzbBRUQK4WAHsIU9CzK6wHsYl_oNO>l>v>)Gx~}3 zEt^TF?-Qrx+uu}YFy!AZ*X5VFGB8m@%A>tI4ad?gwN&9jiqk8^sk!VS|L`JMoFGcr z|COxnhmsnp8Qb()bfdKx!5G%ABw}@2j1;Oc4CR9E`m!Z%wN!ZtJ82ARbyUcB|D;gK zfNIJvr7fq%4db%}bYqh^BbXOu<0(S&KoCM5Wf=?FGt8jRL6mir@hozbn2CcyrgfAV zEOOMCYI&$kIw9HC>4lHn{Hd^5hvnDUwNdCSpU_)AX0&|FY>CEd`RKVN3WwzrF3ZO} zmXG-?(F80X30b0uSUwT6d@N!4SjrMj#`2LYLm(}FFK%Q$dhbC9b+{yzVm?}l$`cSn zI3s=!KE`W|UiMJxbjjC>`IIFpk3kF}jQF4MBaJXZIYNWdB_$N|AD6sqI^FOOpyxg& zP_oYR47g$Z0S<`Nx>3IHzGEEi&Fcrxc-Xji2B?)Oh`yd^vPkO6{N*dL?eKNIW-_(H z;af?<q^6C-WQil>5n}WM`x&J|G;P*SD-v0bcROgDLP0~ZOLa75J7_FIxP!5@^)xLz za%@70gR!P{Qj=tvfyK^J4t2LBd)$HES(AM3rHDlgvQh%F$nvttVA)TWvMZjlh2gSN z8M4R_S>zVkPXn?mGqQ!hWTh@-k<sOliRC^q$gS|pNzfL_5vq~?!5ABcFC&d%LM_9Q zAekZeMzKiznc5RP#@Gn_UTF+7YE;eyqzt*&ibed-)bQ~blOym4q%lmXLpgBztY>$Z z(Tlz-83o)%><o*&(O;&o6T3!n*6=>|Y`QC5u-&WXJ8R0>_rE|IH@ikt7v8=J?(0aq zE6P27SmHStY(0w1v6=5Om30-c*Z6$X`R3%y?d*^J0EayCTV}+I!<rVmtSg6(S~udC zjvF^sh*NeB7H@yG-`qYBHV!zeI`TO9h^BJtVaRE?mlt?LQFDh33s|~Up1DK65>ve^ zZDhJ>UbsE3S+K?!6e848DR~(G_Sgii?49CAno|&}87@UMf|;0x%Cl=cpzCSCyIbt< z@UE}#=(hsgB)n|TaHaB`nk6|Oq`f^rC1;{6{o>pP>E`HuE37p0iXaLv59QZB!VOt^ zCo;?<=vL{=kBAGBn$}~+_@Q{>iioPBvyUN|?}F<D_~9S-zH+cX&8$D-!jg69TN>|b z?~*!M$JepvlW}-46W@>C#^~*`oCJ*at`qs#;~ji7^h+U*0Ax+BlXaAg+RPaRN^ci5 zvgDDEv)Rcb*51eOzq&f)I`MmRJxF`7he}?+2N#dgo9nlDU$g$bc$xWp^aIh8J(@^g zv!s5#v&9-+FS6DAmKC$*ZXIl(Y`1g;`NLD9LBgSoca>oBZF}LIW12e2QL43+0myE~ zr~D5O)dnhua^6)9pt1s})W~X?XL{wP!gI!F=@Ee3bjD{C5D?6J&Sx4H@Tu{fPcJS& ziuZ!gG!5V``1JAs?vl^66yPrT^q>J;(>v4Z4>cTIgL!5796el-8)f+{16-we<@jvF zTt79)@tMW}oIIax8o<f(ndSkU0-tRuz$x&#w5x&LniFTedZ)seTgCMf2$myRakMOB znuDTx2(;;{zi>K*PDL;`tLVK+S;k-`(6X!os(J~uS*yR4nz}PpZDaW<nLiX`s7KCA zp3RRN+!?SibKm*IDYR#mL3YtR9P4Xf-Y?2tzml6in-Dh)RGYi+NO1}6L4fL+;aDGg zb6HXT`cJvpvv1-?cWNvw+yN9Rw6h6RpARe11uf)bf7w~0w{%~k;TAd}&Lq2dJQC{{ zY2GjLqMjzNa5e#Zd}oH<%KdvGx6lz7sAdPMGl6O)pt^L{343B^fZp1DhK5JzAS09P zRAmIqx7<8TL=&j4n1xK#3Y~n;B)hf*er_}m6V(HLuAZ%po8D>OuyJ2S<`p_Z&my}D zABpwp10*#Cs_TI2S)kh1eKnX@Xiq+i?4oQ0%V)~`p{OmekVar3^E)*gcJ9BB`Ghh~ zeELP5>kIQ*07(~iW=iedf0^(JowsC>oiB}G`5ggsde;Z%wa>o6{;~6=)WQAN3Q&Ck zR3nVW`XO1+e+$~5v2b)hk>VFRV$3GHdNPXThh_0lEF4gI51{hpoi7$n?gyXvg$}H; z$u9YUYI2}D9;hCetu5HjQQT`Xk(n0Kac!po9-6N0QouvowH+CFsQ+g!(z%xGc4t2? zV2amcJK$nv?Doh0$ku9qkaJyhGh20Odb^AXy0Xb@4=ZgHb#GPk*Jrt%>}x7l>=UAo zs<5T@KdE1_Pl_s5VH5Zq4&50zj2_<+?w6VL+&=kW#N;sn5{?NSCv!t7J1H2J+>G_+ z{C8dHgtiuL^I+@3ciJBcV{xub4uT-xRh1992^BmhaNdnaabgw=ZGBFb+WiFdelPl{ z9UHU@@7*A(?le(RO?Im=rUpgJ^e$e9Xn7ZS(^-^jA!xMYx=b<)fZG%6Cz%7Q4I(bK zQnG6dJ`-;fh=ZX$*)RoV9cXLgHM59aJGJL_N@lacX2y0(cB=v6cbI~r0d#c-rl4d9 zMY#2*dsd_6{J@8<v_=adtQ|K=8%B6_E{08p=X=rM8I=>bgWbbi<{U+a7-^eqUuz-_ zp?Bj|Xqx#34*MQQb!HNN^CXZ0wAY_}#nJ1ZY+Ji~J6qOo_e04CfqKz#BjKvhCA{jp z|Au1&;Y+?1uu=Drb5ya=Ni=iNk&}ujR$u?e3w}ll`n45P-w)mvowIkh?VX*s=ge_A zVt2I{7bD7_6{$`{@qMve^lj-?ucD?=Yb1SqhNi$O`Bi>#+IeqKoW*U*-<7kWytJ|L z5Yd06`D=wj<r+C6fbtNV@>Zfp40fo@a2wGhmT*r0IDi=Y;&A4+W&iySs-zN~l7vix zS19U04@&j8u|Up~e5NV_yhuDnYP_C4-0WpaV`Cdw<uZdYqN#)m_^~1(N)oDssRSiB zUYw9N1@*J31SdFNn()_?J{P}PG1s}%NUDt|H0r9Ji;jq?9H=Y};8Cu=8a1C@#T9(~ z&kq|~P-gibWz89gEbwFLK5lue&4!YUiMS?7+45MCjWz)@Vog%AC0>P%HW5>B>+s~@ zT1+U$r#BuHhf~fV?$C??OGiqbV<{y!(T21eZ#iK^t_IKP1$mRcePsvD^(GBt4c9|s zAwn7q4Rof8*F$?olsFLD<4l#WC&xg9`x%uC<~cKcV^`_~ed4^uAxVJx>kp!L<e)CK zthEV~N6ZaciXuu93BD>>FID0`)j)P9L2)ZJs0o;F)+EJS9;>jSBw~JCmBej{*Jh(l z#zbF}q;8=sA-_8loA(KQ^PK+?s(_5<gKdJW0&2V^=XqiU&Y;x!S1L((Ml8x`^&FYb zj}^M@!>dU{Im<}Vxn+@t6A)ZzYe>=AWD^Gyq+Mt~lFGBo;tt`EwYSVRwkcg1P_7oO z<E!HrYiS1#DlRdxrsAdJl#lCh*a>{3<&>~x`3S<Ie%7ctrW8v}C{Boyg8I=^f*t%= znh+%s72Q-q4IHmXNSlNzZ~8{1_OhmBQ*-cx(Jz9E(lRFfF=n=W?Hq*Exk|0dSfk?8 za)Ju_cXFa-BQp3E4_|}kF&Q-Dx(TJ(P*UOc0ah=^hLVISzba{bZ=Yn$h}EE2@9V|0 z$QQXd;gX_n0cE0U8}ukkgf?zPEu(4dfvc)6ojsS|h+jVqH$*<L5%+)91C2Q6LF|0i zh%HXCi^y9~PpQjh0y|XbyZ+xV{J6@!V!tY_%HwFtecl|Sa><FuR-*ubfabpAl@329 z=Ac@!2|QnC*VX~yP%oUQW#K7O-sZ;zh#z9p-oEJ(3p{^_b2rg1mVZu<dndh|Cw`qY zdxy@15P$WxdL$mH&-oWSPiXW68iOp-2;2%?r06WNK|={e&a_|etuUO><4l`RYIU}? z>M4OzCu#kQs!SNWDAiwLkOrHSi^Ofzc37gGgMQ=%DG!PBlx^4RdezdAK2kmsmqpv2 zH}zEXqYp?0NZi(Khx6+>N=ILi3XwSP`Od#acySOBrSae`*<*JK`*jo$rLE}9WXAs( z@=Dhgo<yjsDB&k!g_=qt%B#p-zo|D@wHPrT&FszQiQ=~*be>{assvAf>(lGaIV?t~ zM>9jSc`$(rw<(tOO7JkaKD^$X%3`F6?Clb&VVAaDAU~4v#m~2~2dF(;!R=&&3F7xk zV3$Q2N?3BHg^<c~!<B&ILR(8J(9o)t-nPl>!1XJ%r9Zv=u}C3q_jjDiF9z-GXDI5H z6*}oYDCnz!Q|i*`SHvt;Re|hhl-mCn)<BbyZR3@~crrxwdJmsdjpp6|bSx4=oTWW_ zM5W=zV4xbliB6qR1Lo&a>f)$Z-5Bm8<tA|%x9w4_2bTGOl$XS9&UV<To?`>B5I>3Y zvTavFy{g4%AE_XT%a(0VZ9Ub7QiG0b^q;oi>i&*yRHDZIKmM6sgsJQ%Ug5iJ23j(V z&ml;O@8ZvqEk+7{TS35v&}oWgwG!L~t}nZ{0$?5)zzRTx;}px*y%hlS;8=`Ej%GR+ z|3YEcB%zEA)W$-0DUHwYMqHD7CxB}di;_<BW=+mfAW=P*Hj@T@T`ou<Q9Cv~w1v+j z>qmfhCj~4h{|;-Fv3v_p2in||MoAx7%)8x*DiD-1S8@Av6`dgw+u9`oTarBFmEH3L z`GLa!;=<z9V~omz4GaVupdi|yx?CLCsF9Q#%1~P1G2ItmbZ$eW;WWx)x)xt~enZ@m zH0fiykG}FOhNiM-c#5=AJ$*=ZKRz`_RHeKOz@~Xis!!tKZa49>LA7+ckJOOF)!%La zvC)Zs<^|bn61TT@!&HqDr893yO-MXq?It7|Rq1E@NX<xGQwb_G=@UL~Nz|hExl1z$ z|M5x#j|mhsl1#}(H=u~l20|K6?%|}HRg~uhB@QRAa?<51GE&Q948;Yh6~3!vpryhX zL|whs`F_z*c5I`%F>O2wMa?n96zC-M@Mqn+)|t3yNI$lb*qD|ah4$tcMhSKjy7{xN zU+a9i(5MQ^dHZ1dVIL#qHu2%%BVG+qjW0UCA<{^i_%U6VFFL1T;!s-1G2K^Rd2U18 zVItU7knY`f^qVtOzE!`EF<yp_g^NVr!vS{P@8hexj-?kLo;OqNW7>bY3L-h^Sb7Vv zn?HWH06P5PZRm&$bchGo8=%GE?-mk3hc19U0{XW<Z*~IMC4jvIY612Qz)k?{S;x|Y zj_1w!06PP)=l`}bEAa35%jNm|UBBd0R7rnZ5mW-1O#(vxW+nJFLZL5PreM<>HvQ*C zzcC#g9#J)!XB78e?h%Qt`lUkO&FyYP&d+%9PZ4MRho1y`BhLDfj&*U;%_yRCf`W#V zmpJLV6y;e!i6hChTy&om<=H@L9vwIBKg4$NOTQ~q-he%DbqHFXJ1&103af512zZd& zH>F!GimgoLG8^<HHalK<B|;l3JGKAt5zGI$2Ox?G6et^qUW-UmG_K@dGJIbn2xcLT zmN=Tiziam8Ma_Bj#sbtmn;d)pUGrE;QN0xm{Vs3!_Uv>sf1&bbA+BxrMohVFe`M!m zI;j4Hc)*Q{{LN`@CJ~|xuX`SM8cuQU#O#b;yk4f;z|9k9v9~jEi02$@{)#OWpq>8P zs*8R*AK$s}KWwKnPY!)Hd4-VYNMe<>7c_;?8S6pK3rZ%DBIWNv&6`RiA_xHwmd4_* zxE=>QTN*>T&TtN3;{ADZNxYZ$UUwf2D)eA1y!($clvl5FoU=qizj-N}<~SRQ<l0*L z5$XI09rwsT)wlLb)A><6?h$lzwEp_;ym=~pnu7V*9jRve$|1h)JK0A!*(LwG10R>^ zTMt;vPdss*_H`AXmBY}A3e#`tf-gfg>>jA^YCwv+1^EPSD1D!XC`;{sGxE(0QBFFr z+VW#6i|XX%n>V})3*f_UviU<OFn(|NxVinSfb`Vvs0*-bLWNFPDi_;~Z9=b3qVa+b z?btj1=x&m@;3fX?Y-OI-mwBd%qOo(Yk*{Lo^44Y3UnFLhBn4Z2K~yBPtWK?2Oj**p zo$<X|Grh8+@JYv`_UBT&LzKQ5-i9TMX^_)m^D(~}*WH%qVp{txc<Diw9|{!CzT*@O zDtxVoU_+Yn*0itv6(b#0jW*aXal!wD;^D?hk#BZ#T+*S_28q+6zi<8Bjm2@z?!_)( z*_D;MdAq$%zIv<ZQH#FOplZy$N49*0?I>E-PV`M8aZC-3`;eOYck2H+3}s|g%j>#3 z3$S)6tvMh-V-zSI7_@AEE!As*q~{={_V&dW@3x2_*T`sdh4>6y(-M?4MnrQ3<BUYx z650$#d2<El4C-=|J7HTs<@vBhu5XCZ@87;!VWM^qXQ?)<|6<)%++g!S+pfOO{?$s* zfByUHU(D)fueb4|$~AftY*5BDSbr_?JbhDcIB;mg`$1w|X{iOzaStV1=*_xPO-qvL z9&N4=`i4?>OOoYYIL1<A)0W*@u|4KQ6RYY(qaxk>*3fin8CcgVe-3HV>Sb~fD=4h- za=D(4X;jm|yiwe478liQNIjvd!__vy+o>~POO(OSNUov}rHq<AuV#6UBZj#_TSuZq zrFe>IdjN$Y<v#|A-CL5!N03uD&h}u#YW&StR3FR~b=%+Me$peFke`S%#Ub%|#Qgq@ z72I>57ru$sMgTunhvN*u2R#NqmLsH%N0m2&;|#zDC7?z+PtXixg;EU;p=lG9nrKR< zztYH(@|T<$naD{}d5}W$W?e4u{u)iC`M4&hCXi?uOPdbAMvVoiA>fK$4=&0<Zyw}% ziVDWis6|t^;-}1dC%iTl6Q&5kpQ8|tscSx<u{=i_jCyxOo$*1A{W<PXRL>E0{s$GU z!cnP-_tY{SuaRUSU=9pZVeOI=i*gyqF82~^#ITCqng>}tAI)FIgYhh<Xw!M*End}u zlWeDGGk6k>n|3Q4b=|=8TQ;+V3`V*|)__5*F(*o^S{dwMDVCVYd8}$KjYpF8sO3YN z`f81rf_12o{e+Mwx?UMGxDBs!0_`y*z*HsdS5lm~_2DrZX_0swQ8PMrAD_sw1hSwp z!8682b(G;OXtbEP13^Xi8RKV|i335CGHV<D0ZnSpJ<h-Jgrywr2VCp5YmEj~Mg4rF z$6$w9We0ixDp8pkJV+bD#G`b8g2ONQs5X?UiM^N5n$yhX?gv(IZa~#w+;fIED`H)e z7FrCu3OV`(+|Apw%((%qFN1}CVjUt93bsjFX>IK!PR4ZX%4@S0g-UAE6s<{U6JL%m zIb9u9-)!8Si_nM$oVw3x-yv<vzjG744cZELbw{cRHEV~i<-OQyDBpiG%1Ek#g8BkI zcS0D}+Eu={!O?Gkt$HF!-2O%8x$9R<jT1@2c6^!VDPLdepQsVFtIIs+`RZdufF5*) zR2Zq>DIX@6IRKkK2`!AsDqrQX8nNjvm=4i^ejYUVHrZan<oinJBD3a%=k=~l-SV{S zBos1em^9V-j3w}uHeyyK3a|bjEUGvxW&|wy#4P$`EE-fSU^*5JIu<KBme=<Lu=@Y~ zmkDjyT;?v<20_6**2miuP#xC|eq~)=A`AwKXU@qvy@TxDjJU6j`G4PsQq1q3dS7i% z*9*k`$oa&r;BmFdvNP8_f`FL`N~4Ub+OyZs=_k<jbtL)rQR_KMm~#kc020M#qQP4n z!33fG21hrt)<-0Rqyy(1!ijwGu+k;zsSoyM4t5cFrW%5zL6s^q>gKXPnTUAPGB^ai zrmzupsmpLbB~d1ZaL|U3OMDNfc|pr8$%r!?Ce9hcNfrIz4QV*7ILp<~GVISjmgAqe z$dMOn9m%qP{Q{5fk9?CN={WWXu(fySygCc`zOzs9{CI0KZjp2E;;#L&WAKn=s%g1B z@bogQuZC~Cb>~vfA>rGzrI1s%Hv8x)i-q|*+zWe@XZ2O{4yD=!4eTM#IsOHkl|FZ2 zgCDS&&6p*ZyX3_oF-Uw$H07G%J#l!Bl2<6A+1;S3l;rAFeCX=+`F%^b3ff6#0T?rQ zxz9>^RzZGOK?$aidhUp!T(4=Y;=J*kJI8JRP9@{)b+L7dB`H5TLxbuP(DbXq*K;Q% zCCj|7Fpy_KLxEoZoW}L(y|AXtQXkycn45mMnQ%`=##d_{TJN6CGp3do6u)0AX<l6K z7gJyN(}q--L8_Y|&?a0!#=$MH^|oF4c2y5BTxLU}+IqI}dbYy}waoAZf>NV`+DJBN zEL+At`vrbg@&xCGI+sNPcIkn-4P6nlKo7Hk=xsjd{wIY6CUlqr){R1Hv(r=6Mm5Q{ zM5*>fI$+s&RRn8-Q`O5&V%%@r!SuSs%MHwiEjQI9g%HgU*Y-#)o6a9fwNt-j4SsHQ z+{}qx-&Pasi{WhwuYZ}k^ogE!Iuu2ovdL21uSI|>Kr&}*1zEM|Dm@f$j{YD|;f6zD zQ^}hvuJnD)_Oc(MN{fPYY%-ICxj5b4M7czt7u!*(3Jxba<6*HH0jJU#KJ*|NdN7K4 zfhxW^D1U>YY#bW(9ikDTxawW5<+-KRJdmc)FksbsX7Fung^_iqwagF!znV0Krg$)c zSS3QJVJktky5gEqJzh~#!55;Q5IwHn)-hSpwqYFbK(R$<)#j=8R}7*pb-I;oLa50F zljgZ{F&i;a1^)C#^7O`N)D5b*)xt|ZKcxau_{3R?>gDRw8xzwO3C~l?lfJnsb08}V zAn$h^z~{}L;5wjv(mb4_LomoN4I1eJjdhuIsF$nuZIUk&kRK5&GNNcBBv)sDfgVt5 zHV@?JxD85Ihk1vF`G-aU(n0<qoh&~)a)}=65zil$mZ6w#<ta`|QPZ`)1kBg;An5no zGymhZ1>fn|v%H82W*18vKheJJc&y<-*xWM^lm$V-4!>EY)ZjuKAEIUcGvpNgx>OAs zt=5`!Jq*`TA{q+<lUBq)f*Ne_QCUxp4s4KrOy(B9T<aMX9U!e%-)8PIK`vZcoO@{} zpa-<~(!u~~OT9x&e@hF^F7biN8Idbny-t%hLR4vXR*y|C*ZOTrtrsoTfGOL5o3fo# z!DIJQ6S_yf+4U&hxnW?MyQYAEZ33dzC%|gZf22_fY>jqKHciIrF-GWE4(^+ORXg<W zYTruvOYNz^QZTfXwun7(AL*?tRe75wZ$r$NAQnrUhD?*pE3Vjw7}ysW`^i8%1udmt zTAq)Y^;Y5SsHdgcyQMn2W#9{bv01JEV{3AOhAbTsR84r1`9Sl1cc>tsm(t#C?T$!- z+oUor^6d?eyW6wQ{^JXpH{)jHHm_VuzGx~uGS9!<No3F?{0a9sN`-b8-FOVTgk7eM zZdb4Jtuo}6uq5Ayl+@cdm>S_IHBr-IC2wk*Q=!^VSZSBk=`718_?taYS&~X|H)Co6 zwI+f-BnlNFMmctCByOc-U#74)6)IJ5X3RqLKSK;Y<5HA!Gp(%d;UKZ(Z&vEEB5H>u zRpG`Uo3$o`<=&9EWhO@qPo1k4$z~wppQ{whWXRdypXLVKKrq9?;A5!%#o(?-&I=#T zl#k;uCWERQe~_h8iGqs4wq4}5U4P0gb#_f^aqD79$D+dbvTx~%Q+X3p^Xk*O5!f1Y ziB8U?$pWS60v`Gc&$~Zs%9m%jY-Q9B#0au}mNqX<6)4RVi1IBPk5{DgkkfJw*K+PB zxS`H=ObPL(3-hOY2@DvmXzp&Q<y@v!*AvE6H6ZQGJYDNf0BtYG3mva|bU2p+{q8?) z^_~g@T!+x*$+>;LlxL<RXP#L8&&ItNI{Ud|01v}<O+H4It+-EhOFqU@)D<c?8Ft_! z90hmWw;+gE@{bj8A4q4$?T`&<pr;u{%BT@k*4ghu4r;QNzQt#feE(xbAgoMRjM3mH zqv6jSqNC;g!(nr;EiF&n`~9IHeJPU56{to6KMyj0ji>q?7*8>^0vIp$_jrxo>cDt% z_v10>ip{~Q3>HL)uDXHY%o=@PAv5dzl*}oYJ{QTA;m`L&x`Ry64elSZ+`Fn7qJTJy z#uvpMqV%eHGQgR6RRj!!40z4um&IGs7b3Z4!o{KbM7MC^Ouhcv<QOu46HfIX!qK5T z28QDu0`_#U_D^aL>q*A({ljd;<T(c502UWqk&oeKj<#a`3<Ol=lEG^Dtt(O!a1%N> z{&5yK@arjn6E+yRe@J?*SY)6I{P+|qB}n;O)9uv%&@?RaZ<^NnYjPa;<ZKl(a0f5} ztRfDg%R?Q2G08j!$RIUQmG|3`D@6pJ`v}*Ab1w;UdoYMvKotfF{&5?R-c7uS01h_6 z+L>qSVKSk+JW9`xm5k5MfFIu?fSq}cnha{j4dzM0B2RsUHy)d9%l>wg_wwnP5B=p% zLI8n6e&00h1wb8V?szxb?@4)>U@(D*OBUx+&35V=@-brI(#M5+iGLU*5iK0pUrB3# z_mF3I%mD5Vf=ys*z?~+at3mEnLVWM*#IHqiXIZdsFtC5$Mo>9mFFa7OF6>EDfJN^4 z2*0!x+!icC{?}dLE%Vndke^`g+}>*oxV!qXa&es?zR4Na@JtY7c{jVL7xBm^6n6#| zS+91<j#+$^)>kbm()VblRr3TX{Y#_zT<Suje6l*+0<CGkp1d;2G0%_v8q$#jF4d_m z^=yxF$56I;9m%?5*p7ty11WvDanH>svbaXE-dwrXR1^<fqEppx*>2+&UGko-c&fPi z)`R<L>KE6kP5y(2>2Faz!cmC2T>ZZ}{lsR6*l~(pqtZ7#Z#cCA*P4DE<o;YAuV!Bf zZhz>jSr=G(P$Zh{Y&xPqPQ&C?XDt%P0kSVnWPLgHUXDl%nPGJ}bMpGLE1iv3^s|$k zcp)3jL&n@#u?o!tM&n3U^}1ilb-(cIe*rH5VNu;8rH?vD66WaKll6Ux5T(Qur6dxi z!~v&NmL*1E2zCRD;MzSQ66QGH)9?0baAE}ynQ-UtC$k9l-qYHB*}&4e@v)8$2+*Jw zQYlVQBT1RJA(-Sro7W{<$rPXDcawDJ8(AAVUYf<J)mxg4O^r&rKVM)Ju2Pfgy>qqk zyr!)!H>}qCj5j6}WjCRl?krYPZ3qE>E7)kWKxmsje)0;k^yNT&K|$0nR{tBbR`v4N zq*Jx4iK*h50LTiL0#=pT7s=a7(=n>$07Dg~07kF+bRJBB`tKHylZ;f>sFu2HMjNlX zbh@zEdC1h(=Da}iwf0zS!}s(9!^oRb(_S?t7V{njQ5LgL`OD7b1U}cIPsp$}>y79h zPF=AU`{UIaLU3t%6r!8Xat6EyAf_M5o|}RZzFoYUlTvcS7Dy3Uoj8pL%}Xi03(MXj zci!?DVBDiBO(%Ovcz~Zf5eEE(B(jQs77tpKQu4wUSo__6K}yLATcEfST$kE!Dfz<+ z=(SH(`aUdsncO+jX8>aMl~KdENIT-N#Hd9+1FlxO7fdNn1pQw5>rMU=rk~W^=x0tX zJ`J4{g}6z&r&!ay*h+blSS%D;df$&~vMMU|kh@@RFkY89FvXh0Op&=kAzGc8gLd01 zx<uW$NIimTqC9Hq5I=XS`?2m5XUvAv&2vdPuxmKjl>tug_XzJED{k;HMq%+pVX@wq zbWvCW_b(z*SR8OlU0mCqIykQyQ6nTnxUUS92}{4HRGF|$nXqIyVeVhKF<+eI{FEdl zb0#D+zAx3_RJHm==K<^Ln8Il`wLc6MIFyNeQQ-Pyt|;RA_~#X~b?MAQ8Fi`jQDEmS z?Ii1}Tz_<l&vCFF?U5MRu=Y??L#6g$L~peA=dfa1eho$W2IIKS_WYHP)`XR7UDgjO zS3CWFh+n9l?M~nRJoBjXyvz92_6!K?ZbbUFJ^vVel-|?0s8ur-2yEB7syo)5B*$$E z-`vooxip<CHKV*8A9_sSHb8x;bvBs<lAc7G^1Co~9+kv&V+NnyB+*GXq%bzA)t1Zr zkjQ{X;o4*6(0tMr$W+}{6a!v;3b<6aw|u`~c*TlUu{IR4`Y1<B_SjPaGexiUY-Fbt zrTLg+9?V~Smz>>tw!6a>C~2^8=YL8(pgvz_K3&kua^nnyk?AHCnhkqbj4#8D4I^6` ztwWhR3+tjGP27kt8!C0*PlXz)XM`j>J4`ZZ`DvMvD{o0LKGdqRUpUi9eLSgI@?C+I zM45v`S%5^D6;AsfXfs1Wm&${EppknTgO_-(S0ENE@->Ia^#D12?bh^<Ff(7b=FLSQ zQ4Wlu@9x7hT0yTlRIfjrs6WJqlhfCy(|-A8&Z9cKxz6{5a6bzV$-dvKYhmDeh)ug5 z?v_t^M$HEC)ViJsaa-^inP0Y`>?IuBec6Bwny1%bHQ!9rGZ#mFsdK@TCeRxmE5<b4 zc$CF9l<xf!=8miRY-vpWR8hl5|2#BJUhbpdwBMSU&dY-3gh7JptEnN}f;okT7;j9_ zUcdSgB`c8@mlGrQblpMxVgIeiL|ke4+7IVb*0sgJeYI^Np6yf@`#`6Pi^gobutbur zshYic_Lt$-%#*xZtcooZ4Ldr+RcpgKLlwQ1g06ZhO^F&mqBHux>6A4n+v!K%(3^cV z4wWAuc$V|LIxjSdNl~(b9X-Fh=xPmy8E8!M=c?93b|=o>C;hT2{ZN|YoXV;*Gx&UX zcv$bpH>IM|oTFTKB#~Vd?>Y37_n?JuN`A^hy&}8#^$u`ldYL<qZrwM)KYI^a{HElk zEHr5=+>4Qv%&aJA7$}BGuaRD)`MO}@v0Eof0HTVmNtxZF_84Q#;$apTMiMRlvjV!R zYlV?)a@sWvyxKm)#t#jK6&bSk|9j%(Jfo=<L^Hj};5D_*Mk{n$ky%o$l09MT(rjDz zf*?y^_)lMvLQ2zPE4*qe{2oqv5IL0(F9WQ*jd{tvdC9HsOC4Tv1QKi!66~OuuxvO* zxuFj>R9&x+aF#5NBe49@qt>3IW{&f_wK1I7CfOLYn)h`1;To5+H$%`Yx5IaS^iP{5 zJJsKMod3gS>x<6otZNJ2Q>+``5mq#h?F8nP=vKz7UN1Dc!1wjr?}G@Hz&SC+Ft%s4 zn9?y|HJ^l-fLl{4FH1&+|LN4+eDya@JI}Iy?5?-Df4EaTamx{S-ylk{;`U*{@`0kU z?mp&?1#m5cW~c6W@8p|daam*C^1Cmq{1|JLPu+4*fmkM}xZ<jHl(E1Xal50MOTZ#O z6qpA11=xLq$+{5j$pYy1a5wrcUZut4v|H?<x(yiSmJ=~MSoy8W82DxV@I7J4Ot-r8 z+tDb97Z7<Wuq|A@y#*nCzYsrS$sP|-P+GWhza<u@g6;+I-90ibw^OgT`D&c%uW#`{ zeYjSmLg&mahfccod9R*sLwAbdG`Md<H#4wUXNpy4yBoR<An=wZ>y!#Wx;T1ResXYy zX4BrbAY9Wx;E)<qnjTY{9aEYLCl3Rnk#0s{Gp|6*@5usQM%2L1HSLV&;4DDRmamyR ztGT#bc<v8>7u-DnhaY9evwYTbYt}OoPR*7vztzEdf9wU|P2sa-#+-E&1;DXu|8}(b z&msjpoHX?hdB6^8-D_Xpz2=HH##}oso(qHQCY2M`pKJ?qy$b@iZR=>Zv2;I0ijD4t zTaKAxd$G3=Iy2sZ1(Q!nc>^0zO<QD?1D~;qPW4c34P)9*-vV9Lu6XW6dnn_X36ocR zYE(r=b8?ss*mL0A<nHRaA2fO7AaIrH?9k-_f#qbn4GHjdHBb8Ljy6ht{=>~i`(CRJ zz?O#*mVA%Xac5nhayGA8n>5xW6J#sX{ag;%74Y2?bES=Jy|+nqmbKlqs~Ab6S|`9B zA$XRrkshM*di=)w7FE19=Fe3DCw$9iPX6Tn01FHevf8dqyP2C;?_1H2-=F9=|8N12 zJ*(1=(wya7_sH3%e<;)KzConV9OM4I2LU`V;B*E7rvv?U?{w5E*j25=TMfrL5f~ad zCV1a2zNigVGf(vnmB+=v`<kc;Y#Jr(MCZ^5?Um=ci*vvd3Lh9*QKoL~;@7=bXI4~$ zvg1^_EKIwV5Ku8{rpvkA)WP7|Cp90adejBDQ-xR@;KVxLpK=}EYIRzM#W69S*Bti; zp69+~CBY7i3CoRn__0rF6i&UZC~I@@sfj@jRtTvNj3J9kjP+>0TXVoE&6+5gS?^Dc zQ#ElS0B#pU;O#$cHrNdQr_Bgm90ZP2kL*SM=Cex^oi+iV{d-^k=|R*vQ8}7YxolXW zg!Nk!wJZw?n!vUo2LknQ)<-R&I#+;98;v&`03zrgxxGEq6+ORBSb8aZtZh@k720@Y zCQ`5B=Put7Qin$W9y;%qx$oio6TO4K7U4dv8M#lVNb4w@WQ+dFV!?WLg*w|_Mvj!h zr|A-aY%$-$%L%9t3xBmwas?t$DE)*?DJW<;M`}4ggy@CfRVS)LS0|vR5hSHJX3TUA z%mS0l;N?$@!XrAHUaDW=kZ}@<pz~*zVc#_?6d#^3e6PmskKg{>=7Gu*(Dtj2YPHEO zlfl)yQI=$Tv+(I^-?h^=rQ^nU$fMNXS<S5FKmGvGF%-jidtr@*vn^=!mH#cNc}?|- zh+_kpf0jv}$3;oRg|Ov*Vzr@c&`7q-?+k5x_3C5jDi(P4?^y=^7zSO&eErY)@O+8V z&xol=XEGbD!#U>5f60MlasM+1VkPN6;dj*#aDJoDycqCo+-o?$3U>Acy0Yx|pmLfw zW6=Z=z<2OWL;u49xibz-`uEC9Vkws<$>TXE=5RMM-Ft=f&N(F<o@*EmQ~+RMaP+a> zs&YQHDXtm-=$TBj_x?&ZU<Qt-B>jbfaWe*B>d=D;sAIzO6zha<uKVpJdHweZ2jKYV z2{6ejq|k7^!v!!sO`)FF1*nV?h@}8bN=;nc=I&Ra<uTTK`!8uVg}<fM^#7SwBf0`6 zZcV$q%$D{e1SaOqC{u@2k3pbg)P_tN^rf4*#t(9xA1wO)yr1_kAk37kT3wp?rZo4> zkS|2NF#4NF53}$p^9K-G4FZF{K)&HmiAu)=05B&<=wZV!0Ax&bp$1X=hjej{M*os) zW&UTbwZy<HKxWWmm)~y|Od*mfrMrF1VG!nObgy)8vp<y%8~imQ`jldDf*CImo<m_S zOx~jvgU6_Cv`CnNgBsM%Me6OG$V^TEw&xsmNe~O&N|Bd?rxa40T1!1cOMOE<6i^5e zikazQ%)$`_Z15xiXTmnb;3vfJC-r@<FwV$Ez_as(5k~Dx>Y6{*KFR!B?aX+F?gTC_ zIeczgDRk1amtU(LU|V|$Si^ygT2X%ie6#Ft%Wf=&y%=y2SBz7ZFSCy>zuzZOr`ji` zH)yx&?~|yjY16$h0T>Lt`m)$t=A!-LKF<TsdHx)f7eQ7IdNcGpt5E9uS61POq;cpU z>m5(QyCfk0D}PdW_*ed9!Q&8)<=x~ShWwz<8nXQ>lNov7qw+gzlT@a)c<WSuceCNK z0K0aLd0_rD-_X&Sc&{AF{ECK|mYhfmb9awOQxA>hJ($|OnUrJ@x63mpa>-T&aa-f; z)PiRISfnMY7E<|@1lpD%N}=5jD{oukO4x0kZ6(e6{IuJ1!EU3a3wNqwk7!KBefQO% zS+h!Gc+AxIqMSd9W~_T}CTHD#94~wU#t@Nl_^|hO{km>i7ut#^fHzx>wZAr_IQ6)1 zyY+Sh>7_Pwt3EHrR(ATp*_O%Xq;FgB^9FK7lfh)02+{1MVN3@a(I8>%*8=EN9wsof zyn~~m@_d*W_SJkV`0f*r-$%#~O!CAwH1}7o^l#|mO7tUH>U9nnX3Uy7qX^;*_0ghN z-_F_2f|M<m%Nli0T)$?hJWHX8xc>~wD3&&rMt)5$Zv0l#h+1~ld?@#Wc5Kmi`>%Ld zL-`?`A;Z{gLe1abaR$!|CC&-qE(qa%zo&Vjn#)9WKl%3^wAzNamCqw4(^j`$s##=6 zk8z^sn&Ao$(YmL~@3A0jJgpmb)OcILp&m*MzRr0t|LxQI?cvz1Q`?@Fjkj|l1?E%d z4UXv^muM!dUVW5`TCFc3Z3yZn6$Ll$=;fk#MGuBr?O(o0(qY+ZV(n#1h?ZlcNgNC> z;-t=qmZPQd_7+KdH^?PvQ&U;k_*k&2x4>Xdawpuks}6Axl>skaIPf%7`ZRR)G_>fR zOixiu)M(Wh6D#oLH6n|cWH?i(^A!>XE~s0MWz;sJibjb(XFtakG<?j1T=7JuJ+K^A zjk#6OplQBz_tU<6C-|;S!@-K;PVcbs6jMb@#76i{g_qQ&Sr=0l!9GnVil!NKX(5Q{ z9TG8)`U{j4oR6l`;=~DZFKE+n<jthjh!YfFxN20m-`S4vIan+P)R!paT&t_(k5W}f zEHjoAaq1(K*J!9Dj7l=?>_DYA9``0-Qy)o4i=HH4QywwK`En*GQy<Aoi^3B2%h}vI zz0UVx>!*$F*Jt}PF4r$5a`=&(pFN_FPh@f;2N^-$y~vir*M>Ah#V{FT+eX!Ad2Vcr zTpJ_Vepv*kT%Ob8!@nJryT%I-*joAFqUuYiMiP(@sbfBG(MGo;(C-*SeM#>3>{NO+ zqItVesq$h1dJ!_^OKl^Xz?0XN`SA35V*dht_ab5kPUt%q@;euhjcatLTWS6P>TEH@ z(L9umwEf%RMdh9Ao(|{_SlgWB*?a)+4?8r!>la@zGDCG%j+EKuuPo53h6E*sEXXT{ zIAyXd5EThQp<Z<*qtYz+rx8yD@P5jf*@DRD@%wpuYhPK}f{5pHMZ1yGnHq7AO-It5 zxM_h_>?@9FG!?NGyybK0Of=>C6%f4&M#Bn5gL~4i8295(xpEvl`-#8*iE%Lu)QVl| zPN77{rzF6q#BooId`hf*gnI*9H`;9^HfP3bO5Z1k&yQ=`?a%nI=l4f9e}x4#_Hiyg zg;LNcJSDZDy4uBmFF1;DI$vh#oh>!-LeIRc@*yV?ZANi{{eWJ!8u^7Ob)NKUQn>FH zP2SPKS@!uDl>!ZvOMOZ#13hU}O_kp4nbKA>jp{>VENMM*2cw))-yHh-(Io8+`O4!7 zsLKsj-VvE-2AOEYJ;8*0k%W8)FMK(DMbSm`Q1X;T@{|L|D$cx3OCO$k8KtG|A1>VF z%<m4~j&5Mf+~jzDXt=$TOon+7!es>>2v>IMFpt#74LE7UOuPGvsPg8Jnocf)(qviD zi~)L_3tH;D%YjniqxO+-I%%s_x3>ycLU^yo!Av{*iaqjV9<*EH!*9ZeR{p3wPKF+v zPI=*O3rD!+Ub<EP_zCLxL|^}jz7|fU{$a{SVaft|%5TT$KW-!~9YZ#b(GR>}25~zl zU82}KM@J$Z(9Ze*UmeCJfy?58PxX(QnNa%UGs(xmif@V|*~W;a-=rjpjtR&)eRnI_ z(h+e<7@sY-J{?A7{`>d$cN6`c6%tNZ_glBMaZIr?q_O;|7}v){*}Mo5953p<%Q8G0 zQJ9TrK2P32rn2b>ea-qC5iyvLzod^p^*tf^_~ZKcZwUlQW{csB=AmsU2OiUZyjW`! zt3SgN606<c_PDui{35t8_Vu}j9aZho#uK$^!f~5`SXF>+xU_gC-R_g2cgICRlLMJ+ zjMqVOB?LYF*AH|-6nA^Kp?a9yB#im@ZLokg!~tF>88dhZ^vl(8g0<_Q&UHMU<A}-& z=_y|%8}gZBQ0E5y`wjZKd#c%>uiYrkJ*Mxu!25X};dqO}AAp-}*m1?>BUXEich%uP zy>E?aXYT;zi;LUMb7=o?zO5DH{sn2~X+K4m{G9lZXAU98oY+gtoGHdR(J066b8E%q z2JdHu1+}UZ%NdUptyi+evq9t=$^8PoPD*y!K9_$)Ikxgg0j=yymZ|GhC+adVqPYhz zpH$FP#zJ{pw|KJWc(S{mDqY;u;Zwr>NytJ4-b@9kL#xyms&r_Ov(+xxKq`b7o8x>> z#<4lpv8)RXFrP;6e$D;qxrNpWw<B#at@lbD{&bc(EP+){=ZM)wZgtVqR{8JT>O!Wh zatho4R1gjAlLl{_axy(7k*P}h+*QOoiryoz=A`764I<r`=xf;+?nEn%svm&2Vq&9) zw}N!Z6;{U83U+UuTNhRse1hnILa+Rp422Uu^fe&fT)W_#cEL3tx52Y5d_ele3eZq3 z-qH-?#yzdiK-Oo*^>sTfDm-jq{#6TAZ94Rw+x9ZstAKK+J_E`P1C*;nf3I8}dbo07 zpaWEPeOoEg`N#ddMYVs}!5voez3+0e1wEawuDWi#vFO#jg)x8B>_BMj`}xo@vC5Yi z`b`qx@7Igj@#lJpeDBw*fADYCTk6;L=X!~J@7Jq;@c+VkryG>W8<k;>;Lg?E|3#}; zM^zm?`znZ%(jXuqAT6PE3KG)Y(%m4Phm-~>LAvA6UD93B&EXKzB^`$Y?~D3=_rA66 z`}3~#UEkSz&u7ofo|*mKvk#QtxmjP{FWHns?+*Ct<nQjZTfHP2=AqEK`unrT)r~OM zQ)nOl%&<`?Q!`YMB#&($L&|ve0CdFFwiwx4g;~K-2RYm`lNTht_lZPuP3bGx>nj+U z+?yPpJ-Bn{spZHYepFg%p(hX8-MN7VU)1PiK$PhqGbJP2C|_;0XUvYNW$Fc3#(nNm zvP04`2TI~Zf4`71O`*#!u(#Uxges+H>CT+J>xcN<n|YfPt~y<mVjMo)@6K0sdiSb- zBZ}d#(DP>n!C$5O;w}^*pHS;(L>}C!H-qM1>aux8@QL4$t^0U+6sFk0AzM@vBb$em z(wLy%>sy=0p2A62=k@$PXE4~o`s9Vn`R^kkJ)yhJRfALL9&`~Z)K;&yDJ)v&MeW$! z26;|A6!mI$@%n;g)^5(~4IcvbeD?7?g0XA5^e3*Myjq#{{?q=w(z|N+x!YwyXQl;~ zCqejWusLM&7Fnner9AwH=dE1u%bb$>%?ga;88lA;r*aOfr?xHLc1z{Z3gy&u0@CUU zpP|j)O|DE1=81~UrK*jNPs<hso##f|UCLfal9Ez6YvnPWRQqNpykYxHrf8fukz?jJ zyLjt@x^O2iU`OmtTf`NiD}8t=k7Lzp-*lNM=ot0B$!5oO6xn=a=S~7ruLlc;LW%C+ zw8ioVeQkQ{1DJu+PmZ2s_I>#|38Rh}PG9~og_J2!=W<vS$NJV&r4=_rKwe4xmx$^c ztxjd0c%Dg6CS%e7zgoS?LWQ(@|Fgo_^|ZctP4GEW=b2!A{K%1ztIozIqOgIOE56`k zrMW2`r6_w3CN1fcC=j%k&{biCt(Qx4v+ZEV)O9|j9CV(B-wI9j>01fS0F7D&KRP<q zwQ27=n$@mYv;2H=X~hI2qmW>q=hf-&&%ti>*NrXO<S|IB2{wB<wSoCnw%*i<V>24A z&G6cy=7QxAxz4l2YQeBcZa6_{^b)&Vv=|HD?*i-cp?qcPP*r#biLm7UF6Jt-Wu(p} z%xZis<wLAStzcNS0#5UcgaZLE+{WqZIxF8C><zEhChwq+x3!v)u*Jz=Oh3m?3EZjQ z5<p>B<P(n5qzzl6PaPIiRgqs&ds{jxtu)faA52$U6<)>sLF!<ivV7>P5?{G*gWju{ zHcCTKkLZ0^$i1riQ~u@sd+XU}u<fnAK0Wfzb!d6LzPEl9sBO@H7W88`9ON8mh>*9K z9Mvw<;j}o3oll=6=$T${HZFV=HBbMo|E<`qxIX0~Ugb-_^ZARTGKh@{8)?o!iE_6y zf}CjvWgV`)_XXsz=W+TIm4!m&Q}*l$DY1$I>{*TLA1!VCj2B;i@b>@Nf|y$mdv6bs z3#EGZ(`}_6njvTO>#CBR3|35<s?wZ9R?NEIx&RZVkR6=l;ihv3oxr&HdcnGI`(oQC zQ5P1%zN3#AZ1x*ecmfJ*s@B6c&<*uQjxf$%#&$CxDdKcHJ;~1$_ouT3-Mil$%?7YC z4)cg@?}mHd!zJD!d#l|p9UV1AxFKy<XTi-p9j8sYNklU6kCd9o-YvgUI|w}ADuY<- zk`;qmls{FTrcsovsgx7d&iHrfl{e?KwE0XH)WFWwWU@*Y`UIgSXO6HRL}i%6=wG|@ z*Tc>IZ2Ei|?H1Y;xY~5n?{vrqiRfZ<T9*0H8Z9Lj_-&!uHH;V8<>Z&<Iy28fx3Khi z5Ly2WYy~%a5|=bzChN>?!*`+Va_I5L0<)&!@4Y+6KiMwzjxvo><;c&8InZi*%b*9x z8~E{~=f}4Ah=O<C(MT|%MOY%}&TDSTnvaR6cjsgPa;Io8&i1oO`FKy8RBzH@1m$XP zmNW<S3v#b%*GU-I9#!naSJrx++c5-fh1|I>c%PQvyLn?k#lEE9ZU!lq+#fUU>6{N8 z@mG1?EMC65218qKVIw~G_MY%I0T=R?Wy6+x!6r1~8q7squDx?siE<~e>t?8IZwmZK zC?)vl`Q2S{Ez0%rDF^-a@uIWj_3@sw1@Jl#bvN{OeVaBc@ntqGo%}r`?%8P9MZSQ~ zeR-QR5p&h~FRr6<H0YAgUPq_<S3CS#i=;#r50}Lg1j>qyjW{Pr-49=6Yj^iP&-ynk z6gqWYKki!J89g_kzHl-fc@@!}{&ScoFlKJ@yFf52lqy2+<H4e`+nw0aQ)l$bi3B~0 z;>rCN*^5!rJI?6iHhsG_ykE8}ay&oqB4N)>B)s-7-NwpiRDQBJ_DV**PR3Rk8te}L zA){X9MR}$*o<Ng<+@j|6x}R309ABsCIJBaUefrW$86`|v60D3es4TgwjDo5n$)JKF zr6OsmA{nL<3RaOER0-WxkwjGuWl)urQVq3KJtr(yQYqeLQO_$>pVq68Qmh2G8LLW+ z+-M#g?ra#Tqy*PpySr)z?4C&o`Pd0Aqr0}adw7@&wVk`iNw2hSKwh`AAVEha?}Saa z=&jpY$dNyXoB6?PeCqa!$m(VfE;ln~3tng3jHGqOn;;teMsR9_aKWHLi|`AAN-yjm z(2K?3k+xZ(z1i|oity-m<Llpdku1lX_Wle@BnvGQOGI;Wo*DNWqg{6y!6QeBKNgmC zjzDmaCBbt|zGn+Z+AXDyncj7+%UC)>)`$1=F5g{4Ce6k@>*^Psh3=a$U*5smTCncR z5U;91n@Z)#Rv2?oA^5^l4GhG*u1C&y&<FDPbX^^NzeQPX27(_Wj1-%BK))Qdke+=W zvoo0&tAHk4>pf?vs`Xx#8s=}u)zmOVleS$YTp6u%&;7iEK@tWhY2eqFnsc2>xoJeY z@I}<<)V&t8f5iCni@NcS?r+m#&PFFS0{x9w)OEBkGmYHe@1uQQ8HI1c4;CH?bBlf{ zd0N={s_KWS7c5~rF<=laW^BgLT0j^nw0rfDu_<f3NHqL8Y4-qSQk)nTZMd%-!7D+{ zz*}SNwK%ay$Gx0^6!HWesZ49%Rxw#X&iCaF$ZY{4bt1G(?YPe>l3HFCiz=;SU3=E& zRIk{PE(sz+S-*Z;M6aPSHnP`@N%i}-@W!?$QZa9az|cl`#{W&zckHoStV2hmzP*l0 z#2XwzUPNo7aq@YI`5Zp<(f1!h>Fb+6Ht!(9Cs@5MzLH>ZAUKR=_~q|^sY`o*Ekof& zLm`NZoPokbyAt`@O%Rtl10{YGSw869SRte@eTUEO&VBA4<SpJxam&rGx)f+%kS;OX z;D)1Dr#G5|R%%C!*pDuRM6mEFexzsK%by9_vGpwLop{5v+*9F5(36a9+c^6WT!>BV z&$L{ZlwT)oMG%?}CboS}i+LNIWt-Rqo7`t(lKQ=-#-7;Z0?{Ybw&y8QOE^RYH8oh$ z9f(`hf=Rejb&ucUJ{ytLA2U6FrR>mk9n?j}o!C3p=w*tx<I}?a#fxT2*y*XREvWK> z(57wOw~0NTwzxaxT*f|0aV%hO;>DHBZyiQ~>xBKX1gA}!W~<lfl65+ak<DsaE~Un< zZ>}G|XbDOqd$g4AOU33$#TOZ|k-xl)Q2GUP`1Z|#lhgdcGZJ6kk2&>qXoz%})2^^Z zLB5Q~Se3u=%6hA5`>RI0P}R*UH7L9gimI#6TnG$kPerfU-x_noG@eKdVdBbOEL|Y0 zWV9)1hgagqsg3$O*1cP-&{g#Q;jn8wpxn@1R#Mx*8Xmg7hR1Bk7Bk%85H{u*M!_w% z%_BzPnfyDGEvR_?E(}&9|6=#0uOJt9X!)nM?a2VWtDDou=jf}1PKum_X72_XuV@!G zpS@BhGcZ`mu{qsdLZv8SnezzA$s&bIdNE%IEFT3d90e>syb+gZYf}$D9X04NOhe|q zpBacLRU>XUZ7YBHX!qOn+1O7%9C29#t2ZoTCn9eo@;IvzD;)J5g)ka3^bcv1VJMqE zZ{4W~t?hLhP@EX%AE!MXi%Ib{snWK#Q@l`8dQ>5O`Mg}IRo*%Gh3?jP+bCwP?hP6K zt&D{HP_q4-TbXFg?_xxz!l&<}cRhS4`m`h$wIsbta}7$VTh(HR-}rN_Y3bGRHSi-e zGOrPQ!f^;Md)j?rX!FdSW|8N1%V2Vz(@Xfhtv{_FM+aZfx6&&~{j8BSZK$$LRvwau zR!CmNTc@YVRU`xYjofE+P~)&6HioZ#T2^RP1j>xVIRP^t7OQmA?W>}94=-r_Vsx~u z9UVAvw;~@hk-7-+7x82J$oCE6k3LZ)k;=KrB|R~9dum*JYxN2jCa`J0(oDvJNOyCu z$36ELV|rH(lLGQyvG%azQF}+^#2%SGp{cW<S`Ky6>^^gZf4<;{aN+qw1pWpbELeD5 z2IYu(u#d+hd+aBz_s{C?pEdk>H(G`9kl)+|&yy0RKY6dG$IN_lgfFO|0U5kSZnDZA zV9QO6IHd|P6Sh#H>FB8=wD7E~%khZ6#$M5Ex1u1mq8Q-#x=;M^GX{0Mz~?lSIar#1 zUo08cH!SZJ`cHI2(*%U3Y<c9GhZt7o=~6}f^HBkG84|@mSYy2ie-|cf@g^Jc2JIzm zd87{W53*sVQhKltp;2kh$lT1xoLJG2TG3o{#F>A26^}E^+yxnb_aSqS%61?RyM7<6 z|Bzy_{-23A4<O|SlOwh*-;W-hpq=n6-Ob5TNE5(cmi;tbeSP&L_vg=vMa{spez8kR zZZp2P&IP^$hY1VjfGzvbh#9R<Nj;X9oWbE5GSrUtFo*5Sb&8Aiv7^3V7nka<%W`wr z=sh1<dzP76KXd4Nv>15_D8HKW=o=H8|CBmH9bk~)F%<BXKH8r6V}5<a&(cSoH~yu; zFED3<lY6#eg|^{>g>b=!hqrE5r0!it-$mPEtK0+{!U<Lvbwz%M3+fxI5jg}j8v>yc z`!M>Nnn%)TmGS1~atM1i&n;V!>X-es>>iiZKbp~|*n8u9P9RDa0^Marl%0<>uDC6I zE^$rcDc|`5zu%~|7D;o6-;WPbc8dQz!0mK9^Bl{2Qpm-%v)&1_L>7U{TJ9m)j4=0x zb1umS7vLaHSDS-%o};$ATb7JznB!rKe`dJ&Hu~!DivokG{-3RUNiMc5lo5OD9<)(o zXUOeL#6ppqNfO7Wbbb82M*W0C6Wrg>1M;W592sU)2e}Ha-^5F`7C{zxSX?Z=TaH8S zE<ASG1BQ?G_2-tDR-29a57429&*WU!8*E2Gx{_OU{5WrmH&fIce-?Y4GHm^z=|j~f z`0@^|D=}zwxbwG(fySi>+!i$8_S1PY&ESRU)wJ_lYZ}~u?_1)}>|H+cN@Hq%4fr0> z=Qzqb{I2E~_+3Qxhr0y#WVOwu_9mXTp|GgBv-(?$%O(`&=<E#HQ<;LsP383Kcq_pI z|D^h*r|)bHshu!LBfga9j%(=uc<%bz>$785ql=IYq}7;dOKOr}U%KzKjF;d49o2$5 z1@HKV@Hy$ljxvof+i3J=nvRCqRw$__PLq?2NB%e5ajq|L>C?!zchE5??nrIZ@^k&0 zIbH5wdP!ziTNa^P>Nwxc__$d4x5gLPXimRZ-fs@Cv;0ggl%`eR&3$WNK<A|U%-gDK zibmXVIEwJw)ieqVOLFoLFYen9TmxudCP(ecn!MpzP`kEwhtOn)+dLvqLoX&fM+py$ zvo=21RdF@#?%rztXS(M!oE6f&MrLj*x69Q;+|#<O)bB<c?~oh6wDDa)Q{8WSz6YCZ zzT4SEg{}Ptx!)bTZjnR1B6hE%FEU0ZFFZl8zJu~bgC2RGCH~Q43r7R{e9+B$g7M{} zAKb;Km*dy4PwPLLUD_c0B`>ZIg6*Q3TNm$P1%&ID7j@G|wn;iLv)RWd$!Fe^?m^q> zBaBk_#@V2^ufEG5)5O8!BnOO7yx%esd}_X5`mUa2|9kJy<Xx{8N!EwlpZny(q1LEr zvRPI1&YaHFzZ~IimRz$3v#5-MpvAO^f{#`@w?UKNLulXQc#4?Fo9{~|2*7t->!Ge1 z$0t^*sAT%iyw~`WabNTlC{sktlnbq;(q!Q%*H?DUXGSP!ZR)Q#u(b-Bp_S~R?#MLN zjPWi(Kg(1Wrem_5p*{!XKIO&pdP0YCKe4B@<jEg7=Wo!*_GW+8#G?#XGL50YR3|v< z${6~rsL&dnDSADp*DfC;Vy@a>B9*1;Km19jC;GARJblqRt$sGTs>%tQ+Q&C&Stj(g zB~<Dl_)<CR>a{vV^E#+<rj!La?fMdB+~UL8B328haT|trs1qFKP~E7-b+c%PFX<dO zwL0ONdiR9yN$eahgQtj*Ja`{FSI=ecYt@;w;!Pd{Tq(|{NUCirR}VbFg0xeAL40{y z?|u2bfYn=$M|3xIf<$h#XA>pNPzz$Uic3RXjXGT-@~$|3m_fCAS2HoCui#)^xlcah z9;%npq+MGPjeRq_LA|^il972{Rz}aAWs_C=CcZ9jrtZ$`DCa}Li>mH~@f_@QI(Jnk z3smN*i=dfSl|@>q_34^jyqq}Qk#>tznk;RqAIu9Jk@=}*){!XNbL`1(by;aPQf4W; z^DZU#Fqi7s+7@_KKn*FP6U&KYL#?Jg!b~GY!I;yxps6Y>t#3+0P1Qfbi_=63PgHxR z#O;$)@sDfhYp}ElmG+dZ(`Y<rm1>kj1ix?w&^RRdXGE@eY|pbN*_VNXrbkEeJ8G0M zc2tykrt#!!jRx9;x~7jO$%VM04@`SxqI{q&RRv=+H0^9^TW?bz#m(bOHH(<3GaT%W z9+F!%&W#_L(1Z02`ZTif@PC(MtI!>wrs)*bNPo>fDmQU&Thg$b#Fit6Y5CvYhk7n< z)Ww+SoJPGAH_6iY;rs3#h-R~Ucpr+Yk&iMQ^WIKrpL1q9ntCzzBLZHi*YetOWs~Rm z+vS^n+TypxzPX^2UX_*^fvK}6MrL?BSyXo}lonV0vTUE%CCH9rBzpQQIo3x9lIyKN zh|;z_+zPp-zu(6jY(-PofAYc$?89ItI0_TTTzt~S=`|Na=7NXrdGVHQ*v;7IAiP5x zW@tat`XaTK<*D64xPk3K_~SxvHddgUebKX0?#)I4G&BFl<^uri&E^X<OD=lar(0hX zE)XKB!wfSm_0T^7f{MM_xPhhy&;)P_051Qc=RJT+0&uD@LtlVd1~fHbhV6f+_yIV3 z00;gnuVR5Pp!%Z67cj6Lz-ht^R{)$bfCEH-1#lIB2}S>z;tNd41aNA9MQi+(clBRW z{+aq{=8xzHy$|x1fhOPv3M)NybHLORZ???8q9643FA#Q>000HRPqVErZvXnJLl0*7 zd**M~73eDdU4g=1jjaDxF!k3XD!^2)_pJJQ&(X(d5fRTz+uOaUSrzo2p%0rqMm!g2 zf8>qK%H8_tMUwjcv;DOD#~$;b_sb{bg|o0{n=N;b-LpWM%fHBz)UTfXg24SeEI_`? zGvu3qHA{e^hQD^s{q>K&)!)UI{#^tREnfh)0x)&{GM)Z1$NtWIH1&6;F5t1h%l9ku zW~%_0H9(|h|1!0JhyqM|AU$0EX3Re=k4yi$wC1l%$Nrk|8<@8J*QNhtJ}&!f4WO|7 zpVR)Ec+LOP4Y<DjA9Lof)qs#By}v0s_BUb=VfyqJ`w;f3zq(WZ%Z&cNN%-Gz4>lG8 zx&ejMKvNj72uNW%AYfkqW78jypbSJ5kPrqm_5QBk|F56^hvp~PT3;LFvcP5L!@E7b zmje6+2)&iv=Nzo!c*CVwTe9n^QZJrG|I`iZQ!(}9p<(Yr!89>tuBM`FPugTIpk)w8 zAIN+~^fvb+I=#q;6Q+PuE8|o_%m!Q~S|ib+16<M42nTv9n8~L$%6S&T?03bcFNH8x zP*i?$D}K(|DNkpkG5(Yhv8(*+M)Z+8yr7|A)KTF^u$Oc^yWPn<ijUdExGiE&of;-a z!Ml~R#D?@-`AEGn#}W_x^XPLycf>(TjCZ&-^wZeS(prZTZeK=4yLFX83<d>9Bb9-6 zU80#{<O|eSju+qLr=dyTPDgpF_o!64X=>09zWWJ;n~!3tk$MWL$E>Gjf-Z^<$iYKw zMW*&g=m$E1o?F?MyQri`qmNUYz)oIc_P9GmQx0?nqC&&a=#OVz;WMepq<!-5lHB)P zQt7b!d8}L`P>5z}b8he&1z)`vR~Mp0HtzO~c=<I3;qB-5;;8-okBP7;w)Es+Le@!G zCvs7zj$d$JLpk0YV|O*+v2zCWnl8;n5Nika5;Rs`^Sh|^M0W*mc?<HE3A-_=UK)vv z9yu!<L|gFWz|5@gDIr3g&wi}pX+HafE8E7_&x%(3^t0U9l^`*sum2JoaS{8QL4vR# zb}kJj>TKZ+#n$<pa6o!+prd};*VEYFNmTrs{n7KaZ->DzKL0LZ++GKNNySYaeWJ$m zD}rpEFTm5x{D^Xi&)3VWL}CV;hh?V@@x`{mwCK-mqU8?(o-dBcl=w$6k1GZ#x6U&| zjn??Ut^JxjPTi@^*p;LjX1_`(`BwU$bFU$~ym@-c5cN`!zhJXJ31Q__0TQFgQSbS- zRwDmD;X__)8;;(n;H5S@yN$yPvX|kArDrpOnHobW7rCBjN$A8nN-b|=l*@khD}zpa z^o||nxJL2)fmNh*(wJ|2oBslY7a?TXi&;kF$nY%{+i(^KG#xu?LLcjuAT5~CEfLL3 z)q3+fLyF<4oqvaf&u_)ISH%Qh?O=ziJ6+Fan!iVTH$wRZZ9SlqddYUp;rVN+?ZK+M zhZ)ls?%xy!$QMoF4NVo6LrB>mWZ&i+^@PI%MooJ?kkw}aZ|%HFpH{}smfT1X1?pu2 z2mG02O~x1P<tN{`f;ME0+}GdOp$<tboha&G7gl&pX$YQti*DFxCR^TvKA9JsFugAv zxQOStX{MZ$_6a}2^Yo&f|HU`X3`MECma7_dy%mSjyWGfCO}l2dwBlM{q#4&AT^+P4 z?_Z`FcO8lH`OwatG*=2hUBxT*W?IUPSWwUCJ1S|6zF~r?#i**>Ks-@$q8+VOe%&$D z5c!vng(;59&=7r};eb>l>)Yt}?Qmcz{dY7KZIb)s?l6fUcux17qVYXl1?bm7bUN8f zhR&Am$Wd~N9|N8F1<_bO;iz?Ya#feE$s=vb2X|?Pup@RDh!*(~ujG?43lU#Ad_<=( zip)vT$7vMk+td#43s9c$s#1^9i#+bg>U8vIoWE(hU=Su}ObvNkcTFeV$(}!SnbftT zlCb}V#NegXn!tuImgo!eKnwKW$m_B*Pw<ig5hfM%8Bk?}{VeE05KyxN{R^`wz;q#~ zs4K|p7O-18FCEW>OsWW6#a>Qw6Un4rr)x4t?lf?0iwRYPk?fBGeq?{-^#In$$7BXS z29kXd;uQ3WQDwyZ=;>H7kQCnw$17lQ;ECcRDGEP+X<*F-yK64DD#vjObf6rZ+st7? znM`7a8a*#iR;{YH4s<99y^Mb*jAh`3mCx2r6~U#6tDujAD)Ygwh>jHrDL;z>l`aGa zHT#QyVKxN=or36#Vvw4^SPLPMWUd1f`oc~C`}5h5y8JCxQ`$kNawP2jn6lhH;`b`! z{ml&sn6fG->I<SyNfFN{#|@--WyFGawnHd+vm>GkbEp`0LKt{g=r(<(1+F|Uv)}hI z_a#U82^PjGME0-2H}rY2kzj-3v=XsSLJm)!toAoEqdy`GyjA5`zRQ0IupK2VrTvbk z5(q6h{zWtnOd<xJ(|&g*owK;P3_~3Xe{wgmT}gM=H1bUI44#Rt)7rN}B0>u`wp&dU zk7hqkKcS%0CH5xFXIs%DhBI0rpvs5<L1D#5%Fk?P#}j>wq$nahrGTZ1CyIn*A9&nw zeb+TxO^C$X$~|L@ekz>s#6pzdh~?QtDBYYoXBBsBE-aLa0-15y+2GOd%(Zgx@dZ~9 zT-FeTI}d$w!4(Rpvb!&=0L9M<h3%6gT?8YB+Rk$Qtmo8yy{)h&8ecgqp&6UY23Yx0 zwg514-giv{_lO?TpCbQ?LdM8f0^hERCbOLyFX;<{vZ6jJ5F}wd1+3S2qCnWigjE!L zC0^*<cP-YMp$K+z<K$VNG7oh+fq{JN-q8T^k<{R&<wHJx6@6jX$^H~bqUaJ7I#v`Q z$n7e4N&Y}yVj<y)q97@L5LQvd!pHl~(Ue?Z2bnyyn0%b~LC_op>>^ue6eKTqz8d>x z5(Bx<_nX7_*u*pP@^cR6vb|<3a#^B^I0EC}bf^KOJ1McGlT}8BE;2u(B<I=K_!I}^ zrmApz_C<O46bGZ20~g}hrgTX}52h8TbjidI(7F{p9VluOC6qiZ=xPc3lsuhTYiA{t zJ#Dya)%%n^E#B7>N~m}`f2^JDQ}MJ>s8yFx^|a6ckgA@}`T$bR)5g4Zwp(o!+;*;) z@|i4))V!mu=q>&8G<vduNiK}Zld8Lvy8B-L23kpe98dVsigjv?S&93^qlk4LZwRss zKSEf4#t8hrY4MT;lrleniCTXDV~=aG?{~3O`{8Y9-K5v#ZvW5Q#vdj3k32I%1HA9y z^_Nd8e8|zdPFo0LTN7hjXJcE{<671KzGHxAnG;iJ?m2nk+PmS)%a5}y2e#^$ki%<o z2!dYn5fnRyrJa&9@6yB-%FnL->Ed;~a!9fWyT9p)$8Zg$Ettz-MuXf$mI{q1V%~7{ zV=N7yQm?fO*osnT&a$w8G@OB{54M<8H4y&_hV8eSOJPxus55NZ2c}UJvkCH8$fCAm zSss#emd!=eu&KZQ5|Syr6+>onW~AA@MwOk96`A>+^_hTTw`@<-R$+;S@vDFi;jJQS zi??E9JZ1ls6#4&Dv{`cbF%;_mlhA^Fo1cLCp!Zpt(LWu@G}|u~zr5*%B~fpCEeTOj znvc2XN)W*{2r92a3h70u%xQ*&<?$SpD-U@XtcW%H_3g*p86=Zsu$`jzl0OpG5${@n zGaXe(>Pe42XJ?*@5o7R1BS|(N3vVTXB~=u)v(ocXcqQTu!jA=MP<Y#1@Bg<|)Q?=2 z?YJgk5qm|MD?N&kq<SKQoFc{DnctP_s-kKrI1@yhCrgV#jQw1x&&1*#ga5RJ4Xz~` zQ>bSygIn5E;+*n&a`yX+a(?3BsL+YJUjYmBCUNxZ7hM8MxWD8I(Mk%B#YX7&EL(I+ zU6Qao7d*hBCj3+rGK24!tr=F4Q=*2{`cz(T1~|^pTTDs@i08_iNC0}I<jiPmWeeX_ zP#?xrO)k)ThYE0%74bI0sYcV6qe3R?@KV?0=u%{e>d6mdvXvnY&VKkDt%cXV;5}^Y z3q<e-fqkS+D$UJ<4P`~;5b-gYrJ>Efu!f=)^^rc~KN)uCyDJ*Y{{0ssSWyRer&H~N zfb7NN=_F2DzU2)Sas>hDYH|fqlvo#BulF3;mN=?YYJ~-%f|<Ok|HA(Rx{rkoB*;Wg zgb!1=hL`9RUN$y6?q((}phn~JWdcVelQApzHh%)OY(6q?-$PnzW1O?Aj`4sa7o%Kx z6vwV9BcG=A`R78eG96{6slkP%3i6Xr(x?V2dfdq4o}|gkM*lD8u=Q8i`IlCGJ5jFv z$X{VCF-w(P$<h~J+Dz<>XZItw(_650YPi5D7vlEQ%iD(wB-19IIZZYI^C0q9Ym1_8 z16LEtrMT<HGV;+9$?ZgoBBY5c+3Hf<@n|`Od6}eR#51Sa!%oHZD026tB?i*U)qn2! z0oulujdmse84>!iY=vZm)T>LcldDSmO56zp8gjTwGA-ss)evguq<$Q^%iOA{)5}%0 z2*639bVutXkRY#|<`}y`^%D#qT4*8j2FXaNS5D(MJJHLN$Q8rZamX+ixcFM!nG4#_ zyp>XrkNFjyB!P_4a7GB*)LMwfig-SRIKpvWS=Mh{KarG>GlA8VmsgM!+a!`URDm{L zHa}t!^FmNFp0|v-BD)hq)o-_$o1`fHV-*2jH#nz>W+JHcsb>bAF6m^iO~G$I&Hll{ zmB+;ly3>Kh$>yqfC8&m~I)&gc6;(ellbmW`Q74@$LGGZTicSbPR3Yy%m{kz}OTplF zJf@sUWf2`azF0oET?IQ4wM$7;g#k^<WI9z#Jg97IDh!pkHa1MIG&fhdxM*kUL@Z59 zQ?)=%Wu^#!+SyVyC{0V)q(Du5p-6Sw#Zt8g;5rwmDJ>VN&bV4SBc*HU1Qn=htQGZG z@z;VW<xBGim5b?5r^0smYyCy!OUovdiy6+Rz?K5FRfh6!azqk6Eyd2$wIn+LA;(42 z@m`kK$?~No+scgKo2jrt!CG*Wd}-!y<>KPoDX^4KEqDRoUMVvc-AyqJ3Dq{;05Tt` zFqS-;UVELXrHWCgru+mvt>R}XW|FBTOj@X>jto{+^|w^b%hb|*Q}|6Wt5~=;`?Er6 zE}04=J@T|AgGjBHWTBcGE*Kv_$Wlx-OG{O=P)&glJdOXwQZ)hSS^!)UZ~|ViWx{lp zmX13hlN^js5Mp_Zs#ppZRVgmQp0*4Vt<7doEX|ZrDK5sH2BV7Af~6Eo%T!d*23C5q zwNz^X!<fO-Q{k3kNI6=<J%Et6VAbgeOI5KPEzRjdHAPM^{!FB$Nf6N80JyvWILb1w zCr8WRyiiR;5Ue^AZF!BLR9fP%!pQJyI?VDT;9#ZF>@XEZCaUSd-H)|ZB1)xYu@4$+ zbG202iqw>4!PD_^fP-_jgoTUL)D^+13GtSy9C=!ribZOQs$l$Y36>_#K-U1^Y69SI zmU*>#S_Te9Y8pCV)o+QG*EfL1b`?f2>vWiuOf8sLxiq^U@b}y4!9khYDqiK%!(uo= zY)9LoohtcZeKO0X_DBJ&bbAr5_WRhU80OKY>fH(jw?geq$bZ*|v0Q1d(%zQtliaCY zV1tTbVQtf1y-=yPb-N()llo4UYweAK+c)=bK#Z`YHhk|9Xqe!ZohtOSJ`D3ldzBDg zx*rG3lx?FkhBsalVheXoQwa>7^;LyTONh$8A{KsU5ap2_k`m@TuBbWLFY+|t!=$q0 zgmGAf)2CU{riy6=dF7y-oP~x1w?tf|Y?cZ07amL>7a}o*`&4AJ!xm7_*=4tRveC68 zF4-i<8gI^Vv4sPE0xGrv6+Qn~#q+-^M*pb@`1wagrsIE9Af^3Z6={HqG50?zc>hbq z*nd=9S7=iGZ=SUIygTR-sNOR~qQPmxpBIRz`_hCRmx-<rM=AJ@(X**WDR@uO!5>B` zxX;m>j7BqgFVVpP0Ph+-HfJ=GABNu4HJZr>NAFx8_00f1oqlXSmg@U-1lt@d&F^W) zEAz25|EJSz<_c*6Pv?cr^;NcW#wd8vFk-vLD0nb1lGn%DGlHMa`vLHfr{ggIF7#<f z7BDO9>2xK~3x7J_Vg5BW;_1dXFc|q1vTBZ%9`*FrjlJ-vM8KvmySd!Qfb9@=<ewh{ z4!^P&%1H+7CaK`X9o~7ux(h4X-gr=lzyoJ1nNMLlRKPhCnOoWb{lpjZ>j3F~ZK1F% z)QP@$96*6X7i3Qsv)4QGaq?yRZc_K_#Uy&%5m8g+&lj^<7WVDJ$r!VHac}FklYqlb zGoVtC_Qqx$+hV~Q!7i>lSLa@))3zrtpS*hv*;yoU%|MFGU@fA7z9*+WHOWz)VMu0> z_eRrwa<J=5(E5^vMUVx);*q;I?p}Ba<MAg|QLj3T?~%^TOsH`}oPOd%%AKgNlgd*b z=QyymHN){I*-zg2NHHePg2nV{H#Wf`6(-7<=M^}{5>+zimH+C9PaO?LVoNIaMGb6! zvMxtDHyx-{<KiVqr#WJntvRM9jZGB$Y8)1inF|;~ZkR^CeGtH*KA@os;{8t<A(ffV z&_%HBEps{}Tz^P}e^DAhCA@EcuaU?zPp-%jYDsO=1L;lucyi%?WGD_)4$_*DK6@)F zxV0(2N&_4Wlu;)0jlAV9W;zPF?cV#H7A^C-jhjMwxz$7?Y2EhpWoFo`N;)($a9f;N zDP>b+S8QUF&icActAmWk3eQAis_u$d4Pg)4Mtn*?X(-AZHKMm^Kd_=GkZrQ#cqfU@ zieD^{H_!U5$&ydSWl{DN3Q%6*+tQ(`fWmWPc8jR3gay?|XaB5s4#s}GTL_d*K~PDN znSz7Uwm{>tujisM2rDWtD(@bO6e>&BVH*i{BypoO7m+!Y&ZM1{ug)^@9O;zCX-b^m z-`Wbz!Bk%D1va&Zp>p8`m9+JYe?3=;t)(EZ`nS>cy_3H>0~;-^^N9M@o=f#n+lRO2 z{T|sLAKNoTXn<6J^<s0p*sP;UM#!m@<9lVzU@+`t-_J`kNGy+CB}f0KP~7(he{~ko z(H9FM2@{!tt^ooV2DH9nYW}OuE(B%!d4bwYZq>EvtMmCN_*vf7*trIN(5h%^j)BaA z(*!mb<=#X=6Xgfgm!6-N;@1j!@LwH<u-YkT7V>4;DmjPBBIz<<c=u^zX{v3M4YFR< zJ{H6ijM*q<Kn<1nQ_kkLO9#C=Nows*XSk0K9J(w%^ivcL_+=y<7Kp18=*y-WS13NA zmUN#kb#h_o?eg#?i=STk>M9C^o^mV=3n*7?cxSd$gby12L_RcoPThvxS3prTvM;za zrz$_j1f%yRl}3~_E`NmPH|I#b&f?}BN~}TK0k2y3a=ak6scsxu97m+JC`NA!)CWw@ zN_^`AYxooTai~jVNL6o~*CI#Ozt|779uTV&YACLL0oyg}_RQNg%Ta5hp#r1R|DrDn zOtM(7Q@%>0Huhffk`NuUKmQp07GB9@c#i#d&m`rf)2-zj>Nq{b>1)Tz*qI7Yc~dg| z%b=-AmDTOSKZUob-*z}V@fR|*SeNw=V-McQt`iZE#r24y`?Fv0o$e?+E(4-?LBEg3 zF*}~$eW+@?ZC7t0?`z$mEdWY?f>gN^sk2I^YBeYS*-VLtZ}{^QxwDDWB33IVH=QH) za_+Y6iEy0)k5YG0qU!I|Iy<5)Y#=;w0oiY5PGI$K1waLeJ|7Kf;2S9(plwPTd9ou# z>yCY`LvYTn*fe3G%SZNLwL$GBA!X;&v|x{<@n~bB@QkoO7umI!XByaC`1|QbKqP|D z#h<0o#^w%C3vWGq0u73@(rM6m|9u-!c{B3nGfzK$tx2H(3UZE621~}NNl~Dhe{0RQ z+{X^B7hsPTdPQ`BR&OM>FMEP(uqklD_IJxJ?cEmunch);AB~nG_2L~VymT=H*t7$) zwzz{d%Do5AJTvyg>mB~=+QOUd1JzXc?ty4*ZRSdI{om_OK#Tm@!D7;%eQWVkvRN+# z*^8%~hxPz(D>rQ|wI(h#&gF{7qJWq7fE^gwOs&C9i*vc<v7qInJrD&(wo_}AfsruB z2{|{pg@K=veDeStU~U5=PI3#9z{mhF0*Jf<MqK0;LV=NSKmac-M4;5?Era=-J5vZe z{scHR_y+%TYP1UeIW<ns|DGBhkGDf;EV;yxc^@|Qf>X(8QRkS0!?G{J7Oq%!`GPqe zPy`T1V~R_d$WjdvN1XG>zUQU+^UX_6I&-LYx6JB4lMRoQmoQ;_(K}5<Mg#0aQg`Xk zx&p6Cs%ZA1W>d1@p9}F(HU;rWY6;zqTfbx(%h^gg^-PYBzSF2|Ch(LoQ2N;UMTYk| zBjw|F_fM|n<EbYpua;-exmP`oR5VFv2+b!~gWnY8IgQcXsKkmGiV_(ZJZ#;VTH?)d zqiocnN+14*ujx-8dnbM{s<r|)zPwb5TrwBsK`@xkO-k25D)d7bB~)nFe2Om{B_$@> zg*H(3wM<IX#Rpj@KIWe!3Tu9`As3$Yo|ZQ-{DMI7TBB?{^qd7`G-V*(Q8jQ@5Lx2% z+}HE%hueAFw?HZgiq6uvF!RfY(-D93m$x$hxg1v}8@OLmtnw&DkQg2XUVFMhwIT`J zx=+OcJ}!#<0HX~3iIgn=4|fsKIXXA0>z*1T&E5-=j`F<7hkcwnX)D?m=fW^djOH>P zxk)&o>$H>Pl5^u+gKaWw8cX3qb)!=g-C0;LkUbN*OE{kYcP~XMa3$-B@QwFa(;!Q7 z#X{eECW;Bj;sw~UxA|~BTw1dix?QRluZQS=6jq$qF5@>+z9>(2GRa0%Y$&%r_=Xv~ zWT$wRa$s~i1~)^J%A$@0EA90+a973408Zpx6YqX$D57rs(M6q`%2vu@D)o00&+B0l zl^B#XWv-&8?tBCmRg;fqT7N#u*{M4%kJ&w5ByN-rnkh~$&`c3%D6Qlr?^`PA8OkSs zq)tl7N8r1CrZBr|cvM){tJ6T{i}iKfli{Oi`S27ae$?Rsc>HaA)o||b=)sIQu2Oz$ z4ep5aZ)!<u*isp@T$Qc;O*o^fK~rXnU*|QpI<wnvjBw4(1zwj_u#oF!{Iv*YbUJYU zk40P6vHG6PH^&uCpw7TC3Qy5E1S1*ZSB4MgBsM4M=28wA=d_YpfZm4JVl2e|H$Ss< ziXt|<yj6;Vw!Y*Nm8$SbE^wL<&*CBVf;Pr8-DKkHUX!EC)BpQzBzeX4;mC_*0V6Ei zAR_%>5pinwEJ5kCr<9FhrTP04jMJvFYUs7SI$0uT8oRlu;0kF>-UuD48*R<MUtl_Y zT|WWdiL}~9SXOuET@k>}v!O?ElSue;TfY3L+0K^_+?IO@IfUwF`E8o@E>rq4qG7?b zTG4QnR>_^jd-}q2(DxrfbhaHnMP>uPs1!yO<AEm*kHcpeo<2?Fkj6q@Ls8XXK%%(( zWiSVGfsPdwF4KeX4j)aS2gV6^Oy8P%y(}>C#4e;#Ji8U!FCdy-$?zo-4db_@5)J=1 zX^F+0$8m88c?IG1C	Sp{9X%%#g{xJ|*Kp!|(LrCfw@+8SvE=3!Bis4EA>I)tb;k zTalFwTG{PBij4e1;MtPg7zd}_Zl@}4O|R*AmBbX<iEb`Vz&)-1OHKO_7p!3VV$0>! zTmFaNi6VwTa0ZU4T3Ge2@2k;0i6X&D_S9*@OI<!bMSea-8F`f}rn&)n>EhdO%gaJm zufnv)+*q26L7WKZFU783it$L+kaunEnbjbrm+)xcKiGueYT8qDQ(*K}UU>?5PIFJp zM>b1%B=3KqB#`Dd*X*LhPsODoa@vi1aN_W#E5tl`JZuGvn10*#e7~l}5Vb*UkT@;a z$T-vE7giJyRvh`->&d}avle(;{gnNb1(L#Hww}R}MIPXlob8jGole`HlTjzz25X!z zeNTVJ<fW3JiIt!Ccrpz;n%AKdUeJ>OCy<j;0iG%xhw|>aJrtc#vx&ts&FjK=!YkTl zj*Nq5C(CRX%j|C?Q_8ES`}772>KwH5Tjx0{8P4iGk1wv5t;}e{fM+M>szg6v`lUK3 zo8`MFM6Q@O?=BbV8hOeQZv%L!vwR}bC8LKX?uxl11q;Z6c1uQ2g2%Qz%2E^Q(h})j zi?3w(>!>;W@>0`b-D-lXI!<`0=`DF4?28`ni?RuHmzS2Mt1b4G*@ZyuZz+23+-@5V z?Jl=GN8pG1@l}~yXVGEuQfM&d?^nm&=m$cu$qC%fDj#W6Z|fYF%a*;20{;di7*!y% z5>@hk#cGd*3jQJ654y;qu$u_^8uM2-jM2;@M%l4<Yt{UotL_Bmbvl#K@-p~o+u{%N zCw-WI{|I^047pp}ojuieVKHiip<1eDsy(W;PM^u@Pq{wQRbx{-j&82Xey&8unUdi+ z;O1TTnV;n4X!82JTP@2^_Qi}o3J`y>T9)Nw)#^seTs@!s9d@?e6p+}K`&P$f!rsn` z$HFIhy`wzG3ODzsC!-ccVR5Lb@guR6-X|q1GQs@CJVPXU_*;!@u$<{ziLP4-o4Xvs zCaAQ`ZHv1lv*q>?`Q3^9>6mxhq5y|H1g<j+YGZBW_V9ta3UMy>T_Zq)TisJ<1CACq zq0M$Ma-sD5184cx;S1^Yk$0(kcZU{^uSo0=?rob3rmfz7ZgZcrK1#lWL7?}?wzC3v zUK%m}polZXsijL8WEW=D>r7;FIchPlJShZe@jSP^i_=T5g9z!I+K-3)MDe;luCPci zlZ<9jXl8I1D4sq41l6r+NcUc}CaWlG33KpnwsTpkX$fmNw-KyN$tbott!cC`<zYGg z>@~j3wjC9AW8**#8{JJm+zF>%mhW5@r@r<<rKyP<-liJerjpsNKiq-Z)+01utH<nb zbeTdRT$uVS_YAQuUPX^*tOpuzi$7j`uJ^c(`H|@5zqi#)Q=$C>{l?&Y@6h6^@$>$R zXK(df<QL&BP!b6-_zX|{fjY2mY5!N-Cs~}3Q`2UfFI#kXLW~WI<bfRCJ{sqHvyll$ z=j0Z$ZTO@#l&u9Wwaz6>EYYBO_@V%$-gQ)wt|C934#8@-c#}N(#tpkZpoxz`_8eBe z@xAO$6>*NIae}(Gl^qV4kUS=2#<M5e=Ke{*CiuFmttN<Nanp15jE~Ow`+Ny`dNGO5 zHGb_$m$%J1XHIQO#EdQbf?M2pZ)^^{Rm)DjcrD#?ZXcspd&Ut{t7XLefF`GwB$9L4 zxJFFC_3|Wm(Br@}E~rm)MjNWdBqYTsDAn9SXLPJca6Sx^J%*pP40NtD?R~d<^Nl<Y zpF9tuA76Pz7w)ln8kZ+<`u|~?ItJL+HA?a?#$%eNXp7d!UVp7?6q5nEmO!_51fz3d zlg7bDS+K&!7JHs^<HO=6K_$>_0J;!P7LrTb^Xhp{7CScrm+6>ZJI;&FpPmaBZzOEF zUN%CUejR_IVmaCYjutze`;)p041RdwaY`ioX}Ztc{|oXSnp|E<E@&ALkk`J;E@<hI z1t=JxIsmN#sExd5z+U<V&82|NHCo060hgf7H6uV>0V)m9dcgyXGVg_yC0NY{i_e1g z(rwK~`2&RmeGo8yS5x0`XJO}f4=6$?Y#G2%@C;zgyr6M?e}KX42LKRi>l>b0+BsrQ zEw4}l09gP~`~VOJ009drso3@P+$6Skjx<ZlD@+Y714Q<o0oBk88ne~|jGrFS0tvV8 zkFG(Gv(fA_94<4Hw%es!M#r0D7d)Al_0*pa#!XQp`vxQWq#|j*5y{6#Z(V1EyN!AB zy%tw#4_Hp7XD4HPN5;sJu3^gWf$1?<^8aIsU1Ta);-YT2WGR@Fp!Qq<gbKCCC0oIq z5$I(rSiS>zISS@{Ko1}v0A8+wxirHs$>#fILHy%fObmP?<;U_Kb_G)*C1W8ab0LOV z*gFC{qtS%;j)jvKQc)GYo@wmrZeD6GUTPj*mHSts1xIZltALkXc0DX3T#&>VT3I@o z`z-93db0XV@}L0;10-?mjhv8OMXcIcA)EICPg}H|Uf*U<@`<Z=zT<7Na<YWF!DEPy z>yEQ9&Og?Woh*y`IVAbKR5N_3DD=D~_+x!^J;ARWx)m}V?E7t0?vLu-ADR%DDWPKN zgqI^~Es<W<qJjja1zzSk-5*QZKbG`=H1v!4D6sMH{|Hm*CzaUO8a3%BS&=wYl?YUo zlvJTe;*{s{2c}Svy60e@_%EYzkHKJ0sfcdWi0-fmYJwM`%gT3sLdC5i^<L(M{Yj{9 zBc6PD;>JPZ#y#SAXptXxC4rm1@PR1#f<m<D9`BJX-izR!K7-f2*yrnGrZ>P9T{3+K z1e9I`4*B=X;-N7belZ#`G2IAMF&=~K;^{3vxL%P3&qyq5(XoXg&|Hs2`H0exhvO58 z5jAVDHH%(r7{(~ZS4uPKC(5Oh3%PiIcL<qXm&?FttIy(+%sOvSHoJ&U6D$DP<%H;z zB<W;(F;(`{4bJ6_c`$jGuGt~(vTYNtmvvj-He<Jl0V%>tHW}SB81aCP*U9!_svPDH zn|uAOVn|mo-aAxrTYcR-bo$Db3d#CpS<VmpyAP|H=}QwPqaG&Q^MFv3Ud7(Gigw>O z6Zz*rRwDe*kF#&<gK%=_^kYS~@Y}TCUTc&*sP74ze?8cT6CRNrp<_tYY+nCO2&1qs zQ!k<!r`RF%G%UarHKOm#sPgSPogpEkNn#<nG}F5%N|(^r`&EgUd7^=Bv*o=o02^}} z*5!g4(SH{3fHfjwH2q#kE(2iSejCqFUlIat(i<%De;j<gH+f_ePb7&w8PC(~W;Fz8 zK#k0e_b$owHuO907NMdy$<P=SoQT|NL4k8iF-_@wPiSf{>UH=a)@%H_*C?-7sb5g- zr(k8bn_*EUUX?tPQHHnQYW%?Si`Qzq-T=5ev`<o6Ox)!4Q)2);D55qdQrYbbfa9wa z{9HMC;d~@Ip#Z%GD9~>bIkI-@S)Ski1yCe_qPA3z<9nLr#I*s`%`AuU?5DW;ep+OG z&&i_cse+-Rk4-^$@<r*`&28xzgH8FH1daJtd@bmjmGtYGK)Vy-26@Ko>7T)zQ&iZA z9o|;i{oGPXc`{C?_4Jd`y+BaE+LWZ)Wc#oKK}DU<e;;4%xn!NbKxuX6AZ;T4TDLr! zn1MV0^Cm-$KRLU3p1A4jK9wm`wFT44seZ!&HvC#mKm4}E^T;2`BY*Y+^D+4X9UBfK zD-Pq^SPgw@MZVaw`>f0OOMt29IjBwYTHFvx+)zv$2Q5MrPQpAgS$`;btL+{<f=4vk zI_CS_j&Oh+1Kv_|Ykhb>3uy&ilki009<#83u0b~=7i_oSSp7{wD@EZRi<Gu|HJ8*r zn{PxrLwa|`4FdOjG#9t!By*>2w)&&@Iqp}AQ>k_sQfdw7mZuFK3oe(x-Y<)`@t543 zD>H^8(h@6;*-ymNk-hwXK38JLA+4?~pgSMc_Qa@U26pB~A<{Y(TNO2H6*YU6%DKW{ z>9y_*t12l4Z|`c{8CIlH3Mh3S8t;KdYc<f|Oew%2JH>I~!i0dNti}6m5{SPq1p~6U znHjm58F|VyY(H6I!p4`%eXQ&5ITw$Ry!LBqKj*~3<|U29`T!4`n)DG!N68*IEKWxU zPkV=c{9TdvHYe6|Uid>#FOWyZ8@+hakwv}|lAs!UFu-D1Ra}6wzO)&XiX0e>r2j^& zJe4{w#5szQ)pB2Y^*Qe5^nOW*A0lw?iZq-vLN_cp@il=cI)PZ8>0Nr^%Td$&nuWX3 zgU#j_4LL4Sk^QKV{b7-G1jLHMyFLk36VlQ>{V>(R6kRO_vto^5wGHHm9&3EGg~71- z!LWz7RFf9JO^VN@W3_gu>+(Mlg{hH%J9|EJ-l&H09g{itUzIEE2l+FKGMN@@jHy*7 zm4=mVwi&V^NS6^*&RM=9oxYqtWxk&~XTdbTT#oxT7&#agIfxp?KtPfZ-(ChH`@(<1 zXP!4~Uea$~GG=ZVGaeFEc&`Z&vZ-@joc?gC?fbGP^eQoUOX&8#u4z<V2uPCdYtGUu zx`U@V5j_$_($Q6n(bleLrp+f~F7=spjL|l(XttLdjS#5+qPM&4W&MhaUiu;&qXABS z-(p8L7>q)m+%oQVz`0(l9m%z9`lEieu^D>|G7@rV8|dWvF29*X7y^mdg+~@HL;pKr zCh{z)FW$7MedGDwVPadh*RuXaF~qdwn82t7sS6@YacC>*;EEg3OyaNvdGhN}ochR4 z<mB%EA(3lgoqfdXZ=kkQF4c;Q7!ss*oVzL5%aG^Chu<Px>jQo?zutfxupZeCT;I8* z9@+hOk{F?(X3`a}x-)02%1NP_5GA5!@*!Gv$IVEUyI%u8nn^9FD^&IPg`q09J<ugk z3;GbKdfcF|%KZZ9K2i&+hfhad+}H)t!_`tJ{yX_P;d82TwZC7{bCOfDmQzC#@s@zx z#KExnq~E1pzm5?T@Tq0<$(+kSXTE8GByPEY{^Mu6jYhZ&nr&Oc*2UtR2Dn=KVr-1f zBqmafw_WM}cFFd3$?t8$@o{{r)2v^HH_KY{<C^2+nyceI**T02vx$&R>7(B!T$d9t zkNG$7B$=~dn){Gt_>%3R-knC9I7stQ<!<Qm{s6{e(DQ46#^kwunHb};A=CVt!t&P- z4j-QPVDQ9q{E7xOA5B16`6ta4jaut1xXe!%UVAN`LAj!5Z|7N{$vUq0S#f2-ZJ#RJ z(h{#u60nMpW8R0nc!h%!lZ+)9*zb=u5ZI677b#3&P$!aEie<_8WD#|>PNcmQ>oemM z2&w@W#r{*%7O^=D<mShJI)M=13KA?A#Llu;`^24PY#j*yTK{?3iq1tMH)9)cy^Uf1 zuMXwDcp!w>pk92g6x+or5Rxo8iS<DL?+|XMt;n1#ax;nn*Q<S+&4|Z;Xdoo8qWS%t z4#hq*mJ1<rGg=@7sq@gEhvLJ(v3H%e;&UU&%|r%VRQslZkcf(u?~^(Yv{`gchjO18 z+a(dXSvnB%y7Lgnz%{g@*|?16TPsOpG4mTCT!-bsmI0Lr8GYl3n9vBBk$!4%(~f>) zaZ{94iT}giRd`jkbzeF~kPtz-OAwKeM!LIGq(eZuLqtMAE&|f2bW5iQ(jAxX?uN@H zeg{O}_r3SN|KK;qzGtpE=Q(@ryV(2Qr8tJK?%C-Gk*Q;~<N3cuEY=Zvs*cr-=Wma= zM?{tcU&buViyXKDb3>Z#eO&Hi^}^1NktJcwk7WtM-$r+r7cY6m16NS?h_c%V{vzZ_ zl+E@Sdpg3rV60yDW_#JMemD3>LY;ph#7i5vg0PoBmW1P24ts;m_I@sUg1jtbN%&a3 z=z%MU%?EJvu0q5kLbn=_L73MxaOK`!0(lZ!vweU|&(PWp>b>M;Ay10I>Xi;$p>96F zo_9svtMzx$Qv%cX)U-gm7b*($J)Mu13j+_{?8$yJG=igi{ZYoq$U=;U^%=St4cjwm z6alo?feUDGRell$WS<!Wm(cvG{LBi-5*Tl)k>v<v7yL(QkoK&wdc_b4Z==614{oa= zA=>j7xhaih;0ob<Re(zY5HjHT-{7qz_g|&SD#iFyqMJ&<?$!GIM}gLh?%!%X|18Zn zx#Vm7s}lcRAW*ej)%F{^>wnlcQ3I8|>OE+vE5E<iKFEd^A!n}R%<>{ziJSpekyV76 zf`L5^gcXID26_-hEliBSB5cz#tIc|@cCQgn*tUgChxMNNy=FXNI|I7=eS}>KM2~{u zZ^*qC-&C%rxX1y9ujx1f4Bx#(y^ZcJ^KA-51i_TTcK#HGe-R_PuzM}+!gk#XI&8RL zApAVadV{wTZNPl9Lc*h99AP^{I=Maw!VTVQ2}*VOp-^i;r}q?><xw#Hy%zL<c|?b< zU$>fRz<ifN0zojFu$>8A&%Kt|R4(DnmTPorSEx0j(|d-?LJ%BtuSGgwo?3Vhl<I=2 z>&C@`VXDfLsJ5qf(Vgq;CPpjBjkG2rks08Col)xJ@GPS=gR9x+TVMfQ24nDAuwQjr zRsmfeWAH{WTuoZrecUlv?Ogg2cu}X6YvN16qhN#_yeSxAjXNe5VXg7#<!y9#A*L^( z6m`mI3)AqI{fpp^MNrgyYb&5Hu?*gfqp0}>62HMel1M}%T?vk;Q(BuG?ieZ$e(E&_ zQSc}lvCx&^<Bp*RZz75w`%$<HMbtHho&V8fA`<CK*hHPawe{eR#ZvGn8<}oCkH1D1 z`jQyjG3nq<YSCj5g}Y=#T}GRpk`YUB2;mOmasnu4kYO6V%T-jhcNIaRl`IiuZRnGn zpTomXasdv}xE~(%;r8RbcMxUORa8*N9mad_C~BvxXrO*m0s~9-f7FARt|XLVg02Ju zUHCTo>++`r4?>FmvmQK3Mqu1AU@F-NU1cM%#=gW2-b(*b51<aORw!=kLHi$-NNLkk zxGB(R1nI5zk9q`eeoQpE!M|1Fu0T$T_DhJ%4O8Bi2SsrQT?yFv$ntuwRj#L2OD-H- zN$jnq{d-nhE*vkCbh(nc!%SmHICKnL+j4l#R7uJiFm<9n6m+~(Uz*F^hf#AyK__YQ zv)tOpddTaKi23S=u*U9P_{9~44fECVI0>JB?1!fZSSBP*UAJPtu*M<QLq2~|b%bSd zCO4E2lBTo|MXTgYJyNvGQFbrfob=qDmKt^L4gNU#UX>J9kZB1XY(F||I&yI0t2^wU z_wN?hUiz88zo!QA$@OSf<zHkVwU5HA?hx1ARm4xQObD-@O=mvMLg!!i`z!1cPlRN# zt&FUv_jnA&hI1b%n%;^b{Of7q)vM{u+?3p;j{V}ghl==~L!zXP>NI56zij9(pRhiw z>F!Nj=qIRnoDK&zW?jIJ(x*73?qYdxfnBCg0ik~A6|@<n0cZBW1<peaCIwH>43SI= z_M;k12A-ffqJb7{0+P?5U|u>*ChY8Um}>%KO9&$e-)IiQ#qOgF&&6)|6Ztl}yM)4I zKA3$Dmmo&*4Dm1GqpZHpv4Lj(vMK6aca1_EHmZN%1BwW&Y}5#mKqiz3nLwroqmPUp zm@p!YqotO=EXv1v!-z16Mqcr<FaNq_cw;c4eb+y{5xi?Eem4#{Ol1GnM*tU~We6;K z{J@D4XN}@7(zHFSsdrTey%5+k5#ZW*yS=z)IoPD^+rfxc3%86HsOLM*_^B2Sy-@HN zjcJMuqUcbnQS~Zs^10d@B1X>esK;#`vPMf{C2!dXCS{PW&Q?vHRmR?XL-Q`aefBPt zv}ZGaL(|=0UK9JAGjiEvU{WUTR!om?2Og=8{dg%c&~4<vMldBK#u?dv9ctFZ=1s|r zyrHq=j4TtVv->Zhz1!$5TkNC^%}uz!GWmukGQNG$<XKg$PUSzwDW>0~4D-z};fx&X zHgaN%o%$=h$c%hLQySm?^?!}4Hjm4){w{TRaReexL3@34qDT}k)B|ae29d2839q2{ z`V>&=Xc#SoB$#A87&AmHE!aRcm~=cCb3_F#*e_}~8wP8G?s}tO{B8GO%nrfGg^upR z{*L~-P&S$)TyL0&KpEIOa<h9zU^3Yo%`t4X;1fnf&=7C%R*Hj>!)Y{!<C2BRM4f&9 zpo;&FIKbLg!*J=sBrwCs;lpI2`wSx5(IMVyCO(7rY~x_%*c#1|xVm9731*+;WM*EY z1FCH`0+%ja0yC^!3{0l9&meW<8uqM%B+&uScJbw<+2E#L?Zx__dV|PP%>NhVK;Jq1 z==;`4yw^dc+vNu+M81b^k@NW6@kBozElQib60a*CYYMGQo4g9|;hXoHY8q!ja4Cn% znvmkWa~(CWr;GxzQKa1+y(UW^O7{l|&K-~px({zqAn}L1>F!;a30ZqCkcecp=EdE8 zOO`VS&mH2DdsZ{q&elG9aZ_U1-C+7(lBGamS#r;~yy;eEDH1ltf3V}h*mDOOfy8!s z)BT%}O#kFgT50;nfa8+eAFSHF9<dh=CIX3L@}|dsg-CKdH=*?Z8naKQ?Ow3wYRy*q zt;Ct@)it7q!k9fuc>o(q*eBuh3$Cxt=NHJ}9&8j@8HGYViW(!_NN`FSg>62H9wXdn zFc}9{Gm?=tbsz>pvF{D>8x_QQjA95cl=q;SP$-Xl4(2wxyI4^Lh9VS4ka18vVET(- zH;eg=#*vlN1m>d}TKbI=N>-y>;~xn}$ciFR7NIzZjN?Hw&0>Pj4f>6WVAYTX>S8rB zqZr~N6r=l%A_{H7y%?vs)!2lrXac(tiet$*aGFj0MrE+#BL+3Dv4$#87rU7m)i4I3 zSlVxtT4)nQ<|K(#Bf^YTP{X8saaOgKoV*eDp{lq0G<f51ZG#ysmQ<L~i@b8M?7`2S zT$tEPyK;cOaxextALtB!EXd*;h5w_Y(_ra+(Y}&~D{EdYk(wSBBTLW^X+zt>_j=gx zVwz{ESzRRW{S`iE30kJ^pPVR(5jg;v>0x(Er@8(XS=}T*>S3qHG_QtX)lrGD1ocZB z9)cd-gk>?!<I;v()WydjjhaZj{}R5`QqiykwM!fB--OQ7o7AkXk}`VOkulBh|2d#2 zt<v*N*TWEawvNh#C1~tFLeIEWYF2ki9k>56sxiw=^;f&jj?FhAkQlaudUrxqlsAa> zj3N~;x6~xwynnAvUV|6yl?Fq1p`zx+#3&FGMcUONZ?Ys_x?idZnajI5N3a@f7ymd~ zKxlq*s$jLNljRO>$?Xwi`*WmFL=yh%Xr=#kk~E=fdA|N_|G_T)>u3oiqPBtml763} z{~9o1k>?J~H{%~i3kZD&<*vh(f&VeExjr_OG)}LB2fb>pTSR>iZkPQI3Xc!HYGJ1D z7Bua79~1YEgqcPzjJ;nN+jMbSd-W4B`a@pFJGG@(x%-W(uB$n`E~+H;444K{ABtwl znJPz^|JEJ;4u3a>1zY`px<&G?Tk*O(ylE62L=FCQhc}Jle4c}$-q-DP)0MBtY`ONN z0>nD<@f&NaZq-hFi8}HuI`XFAL21$_a-$yKRrx0wNNu7pD?7w>mV^uTS=AvaxgJA^ zq>ewTenI}$9o~e$8$<gy`G2}aQpe@r;&pd;cGD=br5)UMhkqKyVg7XsQpd9J>Tz-1 zEg340{}T2UV?2haNgdm7!URZec=cjBGbBrzfBoS<N6%{<Qb+WgF($5itQg}tWc(lD zig{vq^=A5;wf{AEsg9GddBTGlxO;&YW^e<yJn#w!UcJBzGX&tkD;#)1?DdtoAP0IX zE;bCc>Uh&NXgkL5Ps*Fzb?0gevl8$hs_srlzJS<IYpV1}hjh4FD!wRu!mv^&x>Q@4 zmB5J~b+DfHc3M|uxh~6bf2FoQE8zst;L_ht8>sX!e(Z4lp!kA?m0{(H*i!AUth5tZ zSX%F%ctDR*e6jP4VZ~U?acM)P`{&Q8aMc5flK6|+k2}xBNE)`S^H~4CgZ!5cGEaU_ z91-Xs5BNJs|G!xxI`DoQ?$}@0U+bw_Hpb5(fBpBYP%rR>>Cwfe;4e~FlD^*ZD)gBh zuQy3Ly(i4R(2I)UME%s0u(Yu^@pEB{dyc;nXo?{;uA>4@o`W-mL^?!fr#$m>3lfO2 zc=)uGQkQZB1`PfLJHgM=L>z-tQ8aACexW=-%ol3)3y2;3G3s=&wY`)KzF3D&6--$r zZ?D%Jo+m?!5+j>y)_&~NW*Lg<3VJbrbRKg-p;K$XkY_|2XwcGWeabX5+^4x9$g8r* zZJuK8*~Q*U)+%tdleUwPlU6E6(Yq0B0+wD|84nJNM?n8FcXo8e_+<_=C%9+e9_ebZ z3BKv6h<3kSq=7H%=FItHhZCF8tp?wds{l+GLLr2{PvnAZ58!p|kxroqyX&;|{<&co zSNsR#mgoWn#E0z%b@C}S2mCvmjnfnF>Ppd7_X*~fTuqUyd3FwZ?r+xd?GlpDK$4Ex zw;y{RhfTeJj<G>%Oy8eFjm+yY?u+o+D|*&hHYI8|P9Y|XUP@JF1v=Mf@`Zw(WgS;M zr>jUd&sMxW#m!u}=e1%y>J>82dLXCg%em{VQ)f#oy-#_{TZIXFt+<4#Z88?`eXg|w zamu_Em+T>He@yv8n99a~5#!V3-h(0{iriGohY5BdHW|1ys+qy0VwN4Xg6`QPS8-&I z+(P@kqx`y_ui&bEH+;RB>J1$y&)fq0e#e5UX=*UeX_d!R*{`!`jTyA~I-KpP`E#BG z%h-ebw*{g-6~7?STq|fRTC*M-@s_R!`ETl5x~s}xM050ZENhPHY{Xe=cJ^dDF<Wf2 zZ$Z~rl-->hT+gf4)Gs1U-#?B>tHzrr&J=OXk#bG|6)LmX*STvQolFVWFMRe$bW5`M zCQtf)S$D$Iwd#3YJv@s%gn9lxu3Mpq^NPByv*FH8%k)&}*sCADel<8#iTXdLg6bOZ zz1}SX#h<?KVoDBOX|xX7Wb?l&*;e_*NgIY<BaE8zSa0LBU~AfnXs5Op%Kh|ee_QZJ zogNp(3=W>YX@X@8SlmQ^(Gz#q0k*R1G0uK>Fwf$?xX!juC#enO=M%E=x5(O;8lA)z z5XvXsDTvLQZ6&DraXn+Ut=ikR=t1Scq{{}EEi=A;xj55N<8=z|VDpn_TY6tFLcTkP zI<fRm<Bit|)__f~_BYX~5-ol0`Hq=er-!+qv@;Ft*gWa>FAfU=dRqEw9=gT6Jds+} zL8;qFu_rhz@S7Ixt3#@e7Mwv_)rLvjNVbP`Zks!^cr^lFi!^dUcDm?$VMFuW94AV4 zFFPk#uUh8)qbpu-cedDN$AUw=1zZyBTOm-%of9u{20rq^DOLsv(_<N%V+m&>8*1Wg zvc$FRM|c@*?%y~+rtTA`3OV?HiR$V?HB8;)#M-l-`|{a4OlO9Gq*HK;Ja748fA`(R z0&(ixPT-1mGbNr;on2iYXWHTpZV?hT|I(@6o<j2k-r_`y9qSbnIXM{)ECnnX&K2t% zDeeXN4^kW`c`7Lmgw>Z6_vBUQ(@He>(s#|?5~m+Tz5N5c<#=c0NwO<>gg0T@kOcFt z+V;cqF1zOC^Df#3<nzwkn!@v-T_ro14!&gw8Y@A@Ng7LRuW?Nnzd0EixKgXB8`x2g zs2Q4zs;L>gq8?E-(4<yVHB=NGQ8@vv>nmQMGZZDkb()KH`7(X$)9Uc#;eOKQ#M;cG z6}~llZX-o|6nGzdCPr@k0Wm^7dm<>_mD-A}qdu;5GuO5A4k|Wtt2+OOn7f$^0Ujva z%zbg^5h@-Je<~?legd`F27m=>AvmUPALYre4?wghyUmz7e8<gQyvF+7s>j0~0B9Z$ ze<>+M`s=P+Fdb7ri2fg<_sv9qTf;58UFI$O*IWKuOa~qSSSIkk{_<)7=)4pE+xs_h z{2X}0bWn>h0O+9>NdPcFEv8Efopg?m;%b6oLQ=OZDztSSdG;=cVulAV5@t||6;~6n z?Y-3ORDKRdEMLCScBNem4|EpX@mx#o;c~n@pQm^xMEc#wm3vdO*QuKaYKf4=E;1A+ zWP!m}Mw6;ls*<mm_bJxB8q>M36=V7<H2kCYp68ByxMN%H_jljSK6Lko#bpq4N;hEE zC0)5dhu&~P9ih<R!n9Gs$X_n;tIjN2T(5b%KksDN*DK4N$?<G7oaD!#3turcSUxCq z>nly#A|!XV-RqT^_N8L~(0Z{+O<cz-=`Oj;d=(jUS#p{z0Htoxr=R9q)Wn?Pa}pqp zPi9N<^xT<+ToHv=6ZXF7_3GnX=dD=-i<`3RT}e5Wh3b>WnPxVG>+ua$a1<tetww7| zy0YJ*n<0&7EA~!KVwY~k<l%Yh+_cPgVFxqTe{NNfTS$KC2I(wQyE;uNoYRaJ@SL0q zvdp|XeRaiTq>gXGhE@OTd}E0P{A_nmNdIT)Bd(hpFl^6@ydRe2q9fnaA=%YAXOy$? zK9g3x%306#f$WYRE%SSv=Dgsx;Ouqby2u&$SbXWaX+g)&%jf*<K8cf)!M1<5Lr^-b zk@&$ubhCQs#=En3t-PT<->cZZ3k+3y4d~8Y^uv^-yME}-{p8JeWg3v#z_)7YQcyw4 zx4qqbFNViuQ~-T!7!eshRqpyd^1<(5o)IRsH|{NL%jwwo{QPiH`bk&U_UTjF2mEe* z;9VJ{$+g|$jw2-7Z_Ttn+X|R<Nbg_O)Gf<jUT!a?UDjRgv7BIbFZ9;TcyFn9JC(Ut zpY}PvTuya=5LZ~Dd!fTFe>r{Lzvr}4Jn@E8+uQkawQHv*d9TviF=b&pY)0$D%kBG+ zEl0ZN4Z_|ClSn*$cFwIfMZ)CHAI_0@aQC^-Q|sJJ*f+D6iaw0|Owz(~Hxu2=rY`<4 z(oCX_>u#aCS!`UKInt7(^~l}Kc(eE`Kz@;E6S-SB)}Gg&sje-Fj(1LYLIy9}_C<_) znl6Q!OZO5xxOf)E4&{tZoPUujCv~{+ER;tIq@2?&lz$dT@QB(IkIZ~F-BT&Mgh?&X zaSc?oG4&*xP&c!^jo9JB577-tnpbXSu$!@XMVZl!BwFz977sR4Rf|4E|47nAcDEqk zOpOAZCK4_5LX5}W-ewM>oeiWgeytBuH8&u>VU`V#mG_<7%T_|^U8@oNBVS7i#-Mb< z+AXDGzv3aQK2JwL_;RByz(y<s8ZX&2Z>hoYQ1F<&v`Kh=EMJA$@o3JNeJ4QT`6_LX zCp*U8Nt^cOC-POe9FMM#z3T)>GGC?7@gy2IrIhDYJ+zv?R-m;x568{EA^_*bjv6<0 zpkrT6z8oqXu~FIty->lsl+f5uCn{LqpW(oGV;RlQ-e|G0v!^Op&)IMoyi0UWcHO2H z(4FK9NBQcFP7dRy7D50r&evdda#}rgfbJY#ILTM<aB?_4br1rOX}$)JlhZT46)soL zBiDUG9tAyR+78QY3D?j>`ob#VC3dHr+U2k)@MzUOA+Ls>J#DAuu9<6h;*-LvpMY6i zixeIMo`e9V0bq7nZU+KSvKIajUS@ah0L)nM<ckABUNgY#w%pHh#Ykc=Z2!5;?lKOT z@!(0<gE(GWy?3-dmiuk4Pq^&$difmm1~YpsPe)xtlX(i)-mS2E?bm(_PXeEg9mMf_ z=pAJCTArV}b|(uI?!m9Jd%@Lx3r_)`6C4r>_ycC2<@qDG&}3oY$yIi5?7Cm!Y2b5B z!2Af9{g&rkZcn(v^$w5+EPn(Y#tDG*4on9u&lLbQO7EZ*P^+Fl?7n(}={d|Z(m*Q2 z|M_u59OS6O7jytkVttaP-LvEI>$}I)OaAo7gD<OFG#)^5wiQB(Dfd06NS`cH*04Uw z(EdmsVY7X|?2#~q{!F5#iu)VYt#;!wWbkm3j)uFf@mBj+fQ*pn>bSpk-0EK{qXmPL zbPU{W-*5F(m(zkrNpy|e-$o_k>};DL)bc!?pRyz03H#{kY|vLjnLbVY=y<!W(is`4 zp6B`gR7C2|{ZLP5qg}w7A%1kZ-FNCNj?~EW9Bw*-d^hZ)ud@MGt#JA*F#*y}AD4?b zQWMW}?CFTq-LTO2&Sp<*U#HIz6W-tHa{;Vo9uA7>RPw#B&>&|k1>Pe|M>dKhR)XE4 zQ)O2$Y!`v!BJPI0r|L;WX+iH1Wc%HRq2!Iu>cVtn-dX<4!Uber6w+a2%vJ$#jH5m> zmP?VB+%>>>?=25oIv48Ic^=JQ<f_{k)VUyU3~Ot!O#gI)(2V3d7wgrB9<6)ksoNOU zxzKJbX=@fvce+7L0IPHipIA_-0>{*m$6BjGdBu^(&agt+)QQK=0$>2Vt%x*r=5chZ zh+F}{5Aa-g?1BO2!s7@6JXapaIN(lK9=kMvx$!vW03HA(0CVSYtgaYbap!Susu(o& z;BoB$JP#hn0f2e(xQ+v!Cy(d+2{dFU*Gu(a_XS<?V{m+(9cgD(`d3t;ym#9gW-qZ; z$v(TtqP!(Wu)asFMC+Fll`68PizW4u2BGS{pGg3AB92gBmjZ>oSJn31QFSZ+W|Cg9 zyGQ%>8hcGE{#KG+nY-86_MT(S3jQ{UewDk&+V)x*Kz2y<>)gE{+j~duZ&EIKNL^%M zmzy_8Ns)gZOKO7Ou%`uYo)1<#I7iSKXvJ(WKbn=_n4elQhe^L=)lEWvip<rAsO)R5 zTU*16W#IMnTPHlM33~FIhjk_utEv;CEaNP0!vXyvP9OEkj1SZJ(qpU%>ny;l#uH+N z<D728zW^&tuiWu4rw*`4>MTwwpQ)QW$)7mysn^!Bcqc!aGOBmJa;Vv!_}P(tV*1pp zic;w*P!e$+13y7zaZU`GPa9-r3;o@&SP1#N)dVgG;+(KI+H!vj2^K;(Z*`?|=f(u{ z_a8A<V*4)dW_G1H(_L%xZBD5tb6=1^ZBD-u4ftCNknGqbA#`%*qB%P9{sL~|%|MO! z<}H}vMU8e>bNrsGj&yu9?CXhve9ZoM6zpK2|I^n~79d1_NGL#vN5L)z`h$1QZ*uGS zHP$b~L$w~<L~01fWn@K#c)p%bP&O?k4fGk|pjz0Y;NUxp+SfDxw-o{hJzMu0vNg~z z{aem|OY<+QxlX}<mrT?^A06(`I--GO6nDvPt>5d2zFCL7I`T2<{Y{+5qqN*b^0o%a ztBw3Wd_B|Pp$LG1xrswOO3Pa$@9@WHf`^LS8A1lhr;Ysda8N3g%}9zOdA~bCRU{wW z$S(;8&A4-J3E-qP^6O581M>%A+)TrDGyiNOf4{G%A3W3_Fn|@2+^p!gF?X|~-$o>` zXb*#ATwhOYgk#AEH><cM*rT+f2FX;uo=SJlEy2Dah5W_6yFs2N@|$d)hRJg{P?_XW z)6-`DLE2*iz&Z``{03NFhRJJp)&lKu?44CQ+suDJd#q_^n2h)jcx#x9_ZR#_q^3QF ztm8oM0n;AeWjqY>47gj&N5DF}%Xn-3Ud*k9F1N|%{d-2+zXSE}q_^--(ZMjea9cb8 z9@>R;9D9G0jcC-AyQmlVfv+|40~_iWJX8kxm;iH=jrfnT*T_Hk$I!$YHRUhr1%9T$ z2FgR(EG7Fxm{2!MDT;bQjr@#v&Tn$<02{qt?}E9flhVx0n__jclYdp{!H;YTuqYh` zmnv0tAkt}OumQfLbUN#$xah!$+2^aAzyQdN_BuV{S{pUX6R7fWFVD;tB^p3DId5+v z!bSu@bm~d)hx5n~9%?BZAMp#*hi)3t>r5o4^2}$S=`dhPpvhw}2AXtd^57Gy{(f)2 z^ecbytDvw;9FhxK?lXCp!{pUffxUk3ru3_3@hjBuKZeI)^6noaBk(ek>`WfCDnOrh zMHO@zN%4nd0EFsHK5kV&^3M59t{s}QULfmWzjr|T)kpEG*sx1Bk_%JrvtA(U+N!`o zzxS{7t1j^?g77~Ekah2mkr#MbN_N%@Bw|dvVhXw}rT9bg077-v3nY@hbAA)R5w*Eg z(J$PQI*JOr3dg;8JQ+`h&p;&Ym$>-y{cFjLNQZ~EOp;F6Wt@p9wbE%1GnIW!CAsmr zqN#X-;u7SLr>PYq2T^}CgSID2f5kXTea1kdiFTHXx(3&V914~%8r!U@3Gkv8Ppb|G zt2LbQ#(p$&_+-!1(P8_yKk*$ARq}sIDT?9}jJ1kOzDxhIQQ5yS69rcO0bDW#0<S2F z-;Iiuf#UnGk{^{QN-!?DnUX)5<O4q%Q54V}p%X=k!zB+?@=v*QZVBL2<C1r+N(0FR zGjC>2qCnukS;Z+X`Rv`~WTGe@|0+?@zf{OT5sIWhkPOCpPXF@L9TA~_*$0r%6bQ0+ z&Tk@eGY9Y$Hen5(DcJ0pY3&nvr7~1?LTvuBxVe&HLX|G*k^0x_;BWUAa%|Pj;rfW? zHKI&lx~ZmB`i%^A@U|H+VB=JYatE+ds#?ZE8%yUBC+-RAK277Qq4#MrP_c8e7xdrr zU)ZD(LSt-eWDA$)xaa$P%$yhTMUCsHCN!>HoyEvd5i(gLs-xPE8EQsUWn`4u)C7|G zZ4wreVoHq9Kw6-Pq2P}hBY;Iknaxfh`K0~Mii{Wn-C3%D)gfV_DW;SQSkVzfIUh5k zjj75QD6<^_t5d>4S4^q%&KdzMrW-52OJd#icS<2KC28P}h?{xUe$R^sSie(R{$9<k zMe}>1zpd+(pCg7!0PFX>s=rgJiYaaUPFekXHNUO=&YOi^TTu}iKyoD`D#=d~RFYyK zTmnfDKqCH-0f2xasAR=JRCmsAa_gvyfkXhum`XA#f=W{iq;f}e#Xv^DZ2*b><J=O! z`Ai@g7ZX7xDh5LMTgHD&@-J&q0;c->w~T*JV)QR-iHcZsb*9p^69*vz@Kzjz_Ybfa z2T}h8|0+6)gG2#v5(laN1DwS{#(%*-L`P>T*J)x&waEyhAH<T;0JQuaMgVBPgMSs( zrXq~`0S|!TzrzRsV|VaRafw(mDJH@Qs68TqWV8{LW<-P$P+`0~0#q2-TfoNF1pRSt z$!`bPWSXBNjDT_jn+e!fno)lUu&p(tBaDD@8{av<$;b^+(O;=6KRPCY4!+k%WO+jz zqSRn>th%>8Qp|9~XsVCLVpEq}B4B>1x_34b#Lxo^JqXZex3QI7Gn_K^Uf<1~r!K%z zB|<zl#cZ&cUWglbAM<n<zqdYEZ|Te^1WN*)TlVs7OnrDmC)tVs&RjH;+GAHB@>KOi z4oo|NLfL&~G_O8vshey~k7g}eK^-VD5dECZS`ze~ntmWULsA<=Wi1)^om%paq<yD0 zABd)s(gxA|ac;@2BdrZ$u$HX;PTdYX0}!S^gi1ym#B43u^qqR`&iPHQou}6AY=hBE zlG-H{*6qN&(gV?X0HOLrn548zXsp|TB$jv1Z*uFDe5cL@9BJ(mChK+}W9J<Kl57CC z$!M1_|8Z_f(|1t_NaM)SWO{!^h}(`J@@OaHLyk_uvm9yXm=I+#$ExjtwazT&Y273w z?sqQ+mRwWpzcf@kV6)|fIL9FS^}G&qa3x!nS)MeRn<VPBdX)9-aZthpmx4J5_KON% z!GU1^<w>z7DN8!V#pf%WctKnfcA{GLZ{EH7%AP{^EdC%qRD`JAx@mHf#_Vl8S-Z6# zT?J~~Bu(Jk_>?=61vnknehd|;X?M<Va_cZxpq5P1pxDQ!bXxm8tw625BhM;On<i=K z?BmJ0{y4V;aONjzy1K3XXev-af6Mr9N&aOms{r|X#=j?N`sZ32mpKHgKV%M<Z-CV= z_gLnjNAez!;_KgC)`SG`9nZ$Bq;jgB?KyK?ylgPNztLAJ<i*b+uy#3DB0lxiWUi>< z&2Y|{U4<8<vtpg`)qyad><O20=#ko2xdYpR9T=<58r4v)pSf6*<O7-lhnO)-V4sL- zY({C5k-9D?B;CkT!_?kjV}9v-wHwJ-jO^<(hJIl`Mj)f|LEoFtU)Ldh-e}HSW#P7R zmKdx(2~%6L_8eD-OKBq`8S6>e#>e9)#+xQW^zs0!+#6zfY5PGT(|w1OnbCH6aN12( zzlVHZ_h7e_n&LY=yD0c6W$2+wI)<|Cw;33NVQ>u%8Og48&^Gp3I;nfx#(s~$h<@Sb z`dWRpJ9P)&zB7HT@)yT2C>>V77XR>qKsA_jdb|26&xB~Ip8uHo@~zK4Gpn<b9QR!L zj9s#z5Q={`$=M;(xl}(-#|(vmc*@w-D2oa<`<e!eXRvBpL(<g(@rFLZceYQ&_n}B3 zY0Jbr**LNK=$vi6*c!BSD{dP&bZuwrl9-8Z!-dsO;rprxn<(s1(zEwcB{alqU%?Cb z4bjq9hKD&Xoe;HY1P(tA`>Rh!c=d$E>~Mz9RM)#gDA}5p!{xnQ-CY-ZX9Q|%XcaFn z_&<uAojhhNI&3`|dOiRmc;PaEK5}^~7A>arj2d}|U1;3<Jk~i5{*?pw{m*!j<hx&l zjawY(&X=r<Tc?&3G+9YAO3yvtW6iu0dml0ONL5V+X_aZABY2H0aY=&EA==Kk#RDY) zaYo~pLwnV1MU?QXX+?zij;s=cXD%!cHtEtkR*~GlY@;fFDaA;g*cpqKl1U<S<C#$k zT2mHr#*sx$t2=lS^`!x>hp{uGrz|~zM>mOm`qQ-Cd(F|YXf&CmY0LNY6JybBtHSj& zdIR?f;#Zv~4lwqFtbOZ_(|{XDND=Ty%~&iXxm<H<mFhe7`og@%7cX-<C69PE#{w36 za-<E8CN@@O)A<vJiIepP6ntX`-#0gvj)Z72Jaw)9q~Y?^T~WHJUD>p_M0pZ@yk9<k zQvZk`ZyVv%O8BkmaAslk!hCVeo5l9r^EXQM6-n0O4^cO4SdSiWj0G4)6kXOUH{^zK zQ1xgIbEdC9InrUX;EY<y-G8il<m4vAwr|dJ*vF{PSvTXY-R){(B3ck0&TaWNRI1x8 z^h77qgM~PGEnV=7%U6gW34FDPXMufi4l_t>A=g2d6~@EQRz#<)TI}ntTru-U)y?XR z&Pg4Vdjd5K&4Iv?avAQ4>n5`-_hWiio*4knNXW3SOstgBi*ZU!#D~Q?*l-P{@7Fa9 z6;VB^PWd@1LO0?gAw;@%|A!m_dp!xe9trg&UqcT#3wN4+6ffICKgJ<89({aQu)EM4 zILCtab5RY<+q}H&en*YUSC%><I}bOibnuEoxH06At-WlX6rr*TwF>eS<NaXX;CMkP z67^1f?S<oyY0`6$cU6%qeyqR?T4Go$*Gb?Y{4~so(QCn7QAg#85aM|^HurkQKykG8 zHQ$lN8ACuQ$`9furk5ia(At_IrlMbZT?HggRB%oRrOj|T<WBYR&24kk<6hM8YI*9w z8Je^>OSLJYs}l)79C`qHAtj&4i}^6QTE%^&=3z{5uN%vfy<Mv`FMdeKa?3$e&&qlj z*n#;WzU;@9uT|!bC-HCbrG7@vd(&<!TL)pn+BE1g6vW~M!Namt=rY{zMmv@|eLv8b zU|Z<rofBG(c^Z83bv{m0XbRcG6RKqAq=pcWd2DfPJOF|yRE8NX%;}X~%4pAVf^<JX zY0TZke}-6eS)om5K?VrbE2x7Y2#6fZ9BL*Hsaexf27XQc`d&)c)wT<Id=SU*%$r(A zGp>7YiL<~u*Pm2cS)l%Y>tcYufqZmSbsShF0;25SBzpW>w>{T#Ldm~Jl;gGTT(0!Q zz)~inlc6dkmr<Kx_D9ELc{6h!!#noEuh<8)7#Z(POH1Br+)UpgsO46W%NXKlt$iJ$ z<S~Xhnroj~X}B2XF+?~TOC$1DiqPcoTB}8M#DSH9Aj-db&nEie9v9`9jYK^`U0A`c z$f4%YSKZ5Vy*;PBo=2QzXV&T}5|(Phh|2{&6YHhZa1{-4AT9l~?x}UCTUiY>bHZ_k zM9se1J#VjN4{bkaWKut~&a!;M<O_7NtK?N{IFIxP*^cgWyxD`qgUdI2WA(w!vHIfm zSu3A76qPpFRE^cmh4+_Q3Wx%YN~l&Vr9x#pB)MB_c+{LW2MS6LDBuj8B7(2?9|EKI zh&6*|#aAP8gror@Q)=VH&!b_C%1+%_r!TO5pEVebeU3}Btewl+H^z4&O2i$Gdmz~w z7#xO5#I-&Wkfn{6X2thKf8I(-Zs3LQgwj$E^A<M`3mTcvfawam<CMQ_V2n_W1(u&V zc0Oqm$ZXIpZhKF!CrZ4g@?dueYw6MS(27bsx5ugUIeUZJNY-bYdNFRqG069DxL2PO z*GO=xA9{T~&6Vofof*Q_6~=HJQVuQmc^Bk`Gr)qFq_-5S=@Jv^aKCKSPG58$j^vwL zSkbZNUT%QSyeirb?nXK386B1y6A~pKjf1|lSU1ZY``2%)gce!pNfzG`iDV8Z2-LV4 zJVPyfhU*LZlOY=xF`Q2iz^lyWjYkKb>d(m%C}-r4bqD-5TF(m11i2*ZllyqVaJv(+ z_?_r9fv06%=!eE$0q6Y7OBkyr63a$y@~`x!VYq~6F(vhxFncf|Kl|}l7nlPs6%McO zKyhY0L{4R~@ku7{r$M^hJ@~p`Ql(fGV+Bv?Jqoe+jIwEWV%a_@IH;l2TWju5FgRGT zOzN_bf2fa^lk7ss#F<{=qM~rGWiZ7{tc8F=@3FC$eamvm=bFw^>3Y46gkvd4H80*$ zXJ!Hh3EI|HiImAfJR?U;PEpNheL=1jM<$=@7d<Owu<DDNZ+zDEI%eYPs=V?2TI4M1 zE8}0C>{SuJL-M2Iq+R=%`R$`sMdD|4imOzRxAqS#bl-n}v6cPK2{Kn+pf%3E71iF; zLOYk!Va}$-xVZH7nf(!cbq;9!d_=1IE4Lbpy}OPXrMjwme19C58jItGjs=dos&@R0 zR(2KB;;iV~y=R<b#^pAOc;#cEcyX;S3v_AFSsZwJ)J;lvzyhqLhGWooJzB<;FH7|p zlD9wYh@Q3sZBujZQS$LfzSIzT{K%j~I2)e6<K}$NPi6Smb2+RW6bR0N4r+O6qbopn z1<QH7DTPV<%*?cp{RQL0vpkLE(&ombaRZ#2CTWhrS9iqvt(Yy!GWddf_*IQ?TtLqL zk-2Fq{j4Y7vq153wk)XVdwKEqoZ`Nuy@g<QV0IKo?i_CL_3Xav910<pQnLN*T@o%! z`RF`ha%kHpN!;46r5s`;NSAUfbo*XeQ3QgJd#mj&%q~2;RQWa}jJ9iM@k+&@@1<Uf zG#(XC<0eKG%Q=p23w{&aFz_7LG((eMbI;Yg{yg`yY8t6LyZ$^+;or(Ka|Axl{oiuu zc@0C}U{lhDuIH&a=KOR*euk(OzdqRWQW*x(G)ziGTs}Ehh<$_OobW;ue-`}w>Bf?8 zC!uYvtDP!*(~JGuS9Y4{VHFGo7Qj|csz~FvoTC&5NphPBK9fX#LPsmPYV+X<U8dxk z9rAdGtJ2xzD;$vP8J7^q{Q4H@-?upYzQqAKg<%DN53(r-4re7S+>(_0tM@`zH@=C_ zTD?B2Mpfb(Z<8LbCQ#xU(|`{q0JVT#p9K>Ph=N`h7NTcLteQ4GeY=_OK1YSBEBi<| z%!4WA3#Bf?ixD5&0Ec>-d!*vpSaP5quz&G_8G0L)tT%G7Oh19EkzWsx0{O7i9!Nn^ zx7h_QuO^`I+|&V5Gzqub11aVK&}Y9%;n%k}SuxrqiCrB>=D>S^SY;S?+P9|z-$XC~ zxmG6pY(YRW6yn};K{?QBpPg1>0?Ba1f`cf+*dhwAjMFri?oS~OKDZeWF^8ObB9=@z zliugV=SkU-sqv(V?rVmkWAxYmKgPW^9T_~@4!K9Y*9BNMtbU~ET<!90J>*S*12au+ z)Mf2`UN=H_A^X*_O~kFJc)1^Vjnn`tv>^UKEIaS)&YC})1tCdyWo?d}gN~)TvbNPO zK>9{>Twf6{^jy%r+k5436NdZ>SZd1}W-HjGy0W*`u0TlWJ!UUv@aqw66+;kd%My0b zX9z2^M3*vxXT&dR*_Rx0X4Eduo!<n@n!tv~G>o4?Fd?|{J#h8R-k8S+`V0(D6I<rp zA=0Jz=eWvM5T=#wB|~=zdPU54^*3UjRUX-udY2{J*9-13WY%Z?25wk&{}G-R72p4s zxzN2Vy|4XZDL(?A^lQ%+%a!N2VI+N}8KaY#H)Ln$A@Cmab&7GIo!<JDjSd}pqV!HW z-Yq+{G4Z``w+q~(zK$wh03RbaQ@P=N8)dz~`<<uIJ?h)!gA2R{L%o|t6uam_mz`1v zAtBm~>=AF()f<j<*NraymKWs;yhLk<iqFTE(M0#wPuisu+w})@=xJFV{^*<$WpO0& z7PW8rR{A9qA8mTLuq=i<xFMrTDM^pXHl_hvfBn&A@N%$h=I*qtPWHn72(CKeIyXto z^UNCiNOeeMTAkrwc8zUh3_?{}9o%5HSGJg*z+&)mhpZ{94Y)xiy^!y%;=2|iy(^{A zdWCif(lE<#Tjv*@e!Z$Srse&!7>h${1!jw)FP$6uIsIU10-K^Pp8a_X2K)*&3yP%z zz4Z$hN9t(wxJVw??3jgNW9=Reb-G}dBa_<dU!Bz5QE&GRA9xg3%nu*EDljV;b$EDi z`0|H)HvatZR}*IQg3p=w=#wFJ_X?Sn?XTaavh$SMH!Y`B%F~-VmE@Kysg_F<H|X~z zY$oNa@NFxZ?wH2oG`vvGdF!10?nF9{acOa%(==H1oY`^J>$XxMGYRynoV7!)P+$f7 z4v=`Zmi5pWZp((WD#JnglS2xdnwV@Yz2z?#2fv0$^j2k0UJmzk5*6!DYNQ4+ErE?+ z9=+VD#Lr35TeZE|ACZzZrr%-4&4_WUsZ&use%88<&q<Tq{&LSX6@Nl{*onn4%}dDs zJyETSnb$Vgh4)p%RpHfHa&p;;_I8{Al-i?VKinHKvRMrc3GhDbis>&QOc>C;vOf^% zus*Aq^4>|l!lQ6Q<cyKDTe!$=y?+|4I{S?NO{4db2RsQ6RjdCprjrf^an8G?J$P}8 zqI>P>;?xP)99l>V#f2HH<PE(fIjO>k(ThJ*5(t@U$Vi*<u3ZOqCuLrzxOqnn&|I+< z7EYR2aKTS6FL8J)v#iWRJpu(z0WV%g-Lc3SOmgxg{~@Lln(rpD+u;wfj6)e+kt9S= z#O;?fDt|?xz`N<}*yf!7gnwAC_;rJA6F)n7qWh|%+FQ%Bp#<Hgm%N@QpTpAY+mgwH zU1nsiy^JsR8UBpPJ@N1-lB{hRB+2}-97YK~rt(4E_S-hPr8OMSUAz`YEte&T=2zF6 zZK%abFTIy9t*au4)&>H48$u$Y9+5Nbqb=M1`ehYno*_aHX^^6i$IfMdu6u((Z79#2 zd;~iAzGXtYJ1C-Ue3wQMb`d|V)~p<DxYe9XJTa?}pJK{w8Qj01oI2%h+F1U9Qp9o} zmGAyjCu6xX>eK;(u5Y6uFBDj!bP*{OSR_*P+63!9`D&>hD-b`0VgF>C=!5dU@{?}k z*yjoU!tG^ewZwV_EY-li;nYW8i*|M4<M8q}FSgMU6%o-4S`O=NsGj-YO~S`4U0%Vu zdCm*23%<(pRSb?ut@ZoP=<4k3EN$l0>^qd|=Zch$EBwwC)m**A5D6?#BtgvZ1&_1Y z>s9KHyzviX&93u>-5c{uPaGkexlwlCE<z3Ctn_n0>@)R!R5l$KmJpjTMgeV2UC4Vw z`=$2`t_4;Wpp}l{ea|`<&8s>u$r-{k3o~6rZuqegzXH4t?FZEZt)DUo!uZN4v4^)u zEFJeFhgXL_Oj#sOl3konS4C07v48fss>lLuUs%dM^GvQl9<nlbG6#zxr6_%~<cXeV zd&X{ucRAFSlvy5iYAO1*bf}!rySYs>+~#?gPDDeKM4@p!7K;xdFk*AFpU|nP?t@XZ z?O+@knmETS_0*q^ZEzAx_)AsgVqF6sUimL8Zr6;CFAqj0V#Ph7c}1#;UBxr}Z0G)x z$&W`S#u6=(NXv5~H&hOY_G;X^zEJBur_M2l$`ngypI5tu%2@3$hjd5F>|@`jF$vuw zG_I_0kvVrgODJxvhcJxV)T3=5<iTC?=FakGFwA0Rqpe3~!d)z8H}cCfjP^#NZAz#4 zU4XJu_|NG3!oAQo;S>EX1T!1!ztWG|n4_(h#`v9Yeod)Yr0=s)L0fkR8J@a>L=0uG zj?-uBFX$R=1kiRT!r`F5X(d26C&K-1Y1Ut~?ff`hu;GGk6p)Sq>6Z2ZbRT&B;x}#l zi%I|)ioBtUUjVsl#tV1ZMj$wkjSundw@k90L)_-rBtNb}WuwG3`cHsrcc)UE$jA!; zY6_q_e9QC!)L2tDv{f1T9|>#pU)cEG@5%H+1>&zRPmB`}7vfL4Hx4@8_IB+dXWY+F zwq$L}LsqujE-c<@)NPJ%_%C(tBuhVT_6ARIK5m-GZ4X}Y#5*v9FXG-G+io*0rA*Eb z)6pcZDxp2<*lv#+i)75DjZu?l-b&JmD|It>THIf4%OF1nZ!f)$WN+fonkE`FOO|12 zPhD-2441%HdTUVaGXRwWf{Yp;C3m^UJ?pOM8fD_F?>6&aTskKUFP}DS9^*tUZTuu` z>!5j<8_UWQZ!mJtI*p+8JE}?N5L+~>wx!hAv*UXi9a<(L*1{@gsLQPE)8()HUUYx_ z5fiB6g|o0vO%%I<e9zs>J6&P?(ZT8CUvV`vT)#Xn0*aSbVOze$h>KcPx%dbk?8Hhm zn9@L#A{O0E-tG`c)|pZqBy|U!SoPGHa&4(eOy{RGYqQ2y_$k@6EKZ|I)<^L{)s7Ff z`ymxZ*tU|!v)EEUsH5IV)1k)5JY@ELt^?;fs&*Bs{pPI7!vjjYRFR$xd>x$A7&|ZK z40m^)U3l)5>*igRYS%N7fExt7m`SF+E~d4iXLda5DGy6&?>nh6PYa9`V#dcX;5d-> zF15OK^1MRfn!(&^b5bX|2w8@C?8Y_kkg|9B^0>qtW93;~W1$VHE$y~QSH&sZz?-A} zrQ{{jf`#&*OB33y@GomGA8%IYn+5bG&8<h%JacP$@xD{+X>vHM?1>tug_oPht9c`S zY|aVP=TTr!X)#g^?#Gr~%??Hculub`l)rRohc$kHDeZ1qg`#5`?&y8DdQGr>c}(<j z%F_TMBpL`kZ~w7}s4&=d4kyB<D31-&eHi-5umGLKILqWH`|Z=rpyl)YVnvgf=h@$@ zsN~2Um(3C=w{*vuzix`3N;R9oesN!Q43_qA8Z#u~UM6x-T<ADhBy6R#1^(oUhowzC z989iB`aoSV{k;adgDXZ9ZNUB)lWb8X!O#z4gOYKg<BJbgJ~p#;$Wd=eHf;;Dz@T=1 zQ-m|SO34+?i8FshEdSWnTvFvJhMzsUyyjzx{72))wB5%8X5<=E1>+taIKr+nweup| zD*rkirMBt(Nv{}c%0;@Skss$oK>yx%#k{A*JofKqN6$cWwV~g&r0`$mOF7co4}DdN z#%<Fbe@}fW5}qML=<{$X{JHh_u{7I|A{Kg{PX*wt=tz~!5S121#%iM{l5g)zDiM^q z>lA&;;3{s85nUi9$zyMWoMlai<$d|JK*Q~c!o`O8xX4QAGlKOVlGd3Hl%NNh8)J9% zKnTB?uryB2fwyMvb3kx}-Is?ou_fuSl0$@)Fi+IrRYeCwj+G1__2Qa*Giy85%O1H` z2!pUe1z#C$6p{BKgY2=+k4S;?5mtW_Ss3nZmr4koGR;qjEG>I{JJr%p%lmv^eC8g_ zL~fw!`iP{Emmq`DxOZh#Y_6KJk;Td$rSK-l(;;UumSs9T0SSWJNAOM;s<T%e{IU<E zlH|^ql&T~qXND4GCQ1=<iF1C|qCP_iON$Ys%5-Z*Q=r1G2}|Re=D{Y_FfLZp+b>Le z`*jh&V!otvVS?@*S&vQ55|Ls%HB`(3x0*S9D2S?;G{XD)l+0vB263>y5$K^-$Idr5 zghocCY6j`!BbDTn{v}4uAZlnpPQFj)<Os-HJc<!9%beZafJ9%J0Kv{Hve2R!YFbj5 zBbK`HOe#@g|NH?&e4@MAQ+hnr-%>MJmv1RXjSo%*UGwx|%BFiR|Bj_v@#@9PF?IDP zNAYWupDOD?-tJLU?-@^rS3-#_7%w<A;Qz;luBK+3qNmq=K@H_*#3Qy3GbxjLJ0hhj znO#2^$HyE!v9&L+mR<`^i?bdpoK!A~6o`I|)O+c%3m12p!uMc$o!}Jbn4<xGUnGJA zl-Eb~jt*G?laBjc1~SS33G~#1sbCm+Xk{6{sLOddT`-?Su%4;mkYP^}@<_)1v}&Ge z10z>VSu%>eO4t-@B2FTW$9|wM^i4nRquD90pMfHVbo)Xeq`1|{W%M&2iam%`W+&P? zbG)8T8>*S?k7><83@K_D4TTivK?lRQPSknhd_B6Qw18vJKqE~B-CVCHO*9xz=?<PE zd;TKT2%__@i}BKN5Tlp@-TR&c>6Gj4$!5c1Cs?8&qKH9UY2Gw2{V#My>PHPE8LlOU z-|v}~1!ip%>0NZh7%^rMOYtN-H_9|=kTS%4^*2u3^(>0O{vNv=VZiK4eHc~G$bBf_ znmNc6-5&B{Yr?SZB?6=6xRl)KxQ6%hU1KhD0$LC6ygG&FR<PW)qR}j<Iq8nj_xy#C zvHr#U4w{JzCxq_{qeDNZbUzPAuy1EfEj-liPrYjANpz8wD}&GR+{;rBd@CeZqRZd` zpD#dIJ<QcIowKX@eT2K;Bdjwuz}|)Si6S=7+%DJEl1hVXZ8FCrM#qu%NZI7q_p_HG z6uHIQ-Bao(vY~NKYqIVZvf3r6`md#9e7L15)@gX4-||LIZD70$Njc=>KP=7du*FU0 zMeoFaXt|uR_Ii>GE^W0lIeIy1m8{-b_u(Pa_#PkkJ)3tH6~1K?#p_!d7jIUKtT4^; zoF1$2j63tF@o|;oW$Cn7h@Iv8)de7x!M#4KN6vfL88ahL+{ZyC#4>$ZrqRR2>DAPK z7U6q|M8#H&a8N|WUZc%q^I|H@Y_sy@@~r&geVA8rU`q7t?8oED8VK>DalS|2CbqT) z=OMcS(4GLiC$b8C;b#5!z+GnT_td+re#n43&8qIHcbXO719w<u%cys7y`npXJ0#U+ zO-E$YXNi3OY_*Iugk9ph_;WcPP_4!`MRtfW^XE!~X$tcY<0qi+8a*%R(M_1%><fmO zlZmF@6UA0RY>jxryIT!U1@{?QkWf(5hYB_tUJy-?0EP<2;hgq^x6@%OlDF;VN`Tkf zMP%g5;7~H|O-`|kkDd!#`$v0QG1d#GXbVM(m-vVd(y-lhDSmJa^eH@OW^%Ao%7S=^ zhw!l6hir5e;R+Q*Lm%HUaAkqsRWGD06AkeptJ*0DyltDkSE5mGm88!$ROQcgSj#6F zrCILi(;brcW-ydPxL*nv<6y#$@^m}eeu{JUBNCIjVBd$~v{Rw#-9XNFds2_WyMA0~ z*oH69KCl&okA6-z|8t?Q2P1RFcF0HTXZ#Nr>W|20n8X_KpV&xB7ReR$-@;qL+XYZY zb5X=cP6|%=C+vNq#?&O(n3>wxS^9a!<i%3aslUT<M5w^2|AG00@Jg$}Yqo8o!uui1 z26!brnd=aGW#vV>JHy`Az<E`mud%s)`n9$5Y(^VnQwCn!%s`s!jdX<jMjIQ!TXNxF z7ao&*&}NP>iw1QYj-_Lm@?JmgqGvH+?S76FlgBEh#M$FvLr>g46v2lKS;1TUI<peb z3HVjogqtgo&*iO}RnaJ@ra`ooe0~UPIL+p<J&5>g{TCwmG*w=@{IkY%RDv2L`P9K6 zVj=F;Ni8zwAl74-A0%-Xn({oj8Th-B@&Z)L0!5>umbyhlqKvvFea0I)MO~t~Iz?@w zmO3TP#*8{&P+UkF&&AZL4N|4SRXV;Qu8db~iT9bL*up+Z@XxOX8c}}wsK7j*6=*~e z7AQdiXO3b_o-?}gi|M12;K-ar=F8XO53y`7d@y!rPs1>FW><SKwiidkFt%pf!Z0>x zD|;|D7PIbStdD+?!&sXP48vH(BVf1X!p}pi=i{p@6sTNV$0x~}Ta!V{TqM9AI`C+E zulzkgvOvLu^b4#yz1*koNy)7?2C@x;_5yObb0meTW!X;tmF;z~9H@?JXo5B?k5*He zWNLmoBV=t2OfV`yUq#`3q*=9YlbD_GiI`3HokQS)e;he`=(_=ZgE(pAA?C}>_6GL5 z7l8+2RjT9UF88)AwR2_ku{Nd_j2$uO_b@mCK!KR4=LP>CUw#1<SF>$_!nh_#a1Rz7 zg1dXL;O-vW-QC^Y-3bKO;O+!>8rR0*HDAuT_x%5R_l&UzYtLF;OKQ(qySl-sCOYX0 zzxzzEA0EZz3T=-?eJsCCvdbpomu!1jh8M^1sodzgA@CNmTFe@}e^7G!H4f>!imJ0j ziAVEG{jLR%g7DSIuC>-eiKE}d;(?>vgzAB-9ewFIU?#I>4A7fdGkRIC^*xDZNUWc= zlHu|wlYWByC#P0o10fW>wl%njQy>7@lt1;^_N<^R#*{Dh-gZ5}9NCmN{l;}dn1b#C zdng`%-0tgdWly6^12Os0S~4LAI4NS5fNm)NYgj2F7LVFpK?hiA0uG1R{+=tCZ+KrV zY76DJ7>lU-+&3H`t?OQIpLQk%Mb>eA*$OjuR7MQ$9y{H<wfX5)eE1fYOTxtvhxk9v zQ*RsJSzNbzda2Qz9)2Qe5G73Wmao-*!ns%Pewu7P9o)8N)LpIn;`B{kqfdMvH+#{? z4N!V@%-=|!<&SUK%KdtvVl&(PxlATr#NzbMq?}1h!Yk~`sl^@`m6henj9n9WNsZ3% zwy<Q~jq_1$#<vhTihU4hFaecX1eS1HvIkt^8^S?WzlycB*07E}{hbN_RSNve-sHJQ zNlUi3SmstJd9=h6suAH+(w-Mc)5DMPCZBg7ufXRN{J%Y67?W&MUwcm}fQKJYk4Oyt z+=nbJg8Er6SK|9L-Zm9WGx5|@)tq@(fXBc^1a94O+>W>IPIL#ioA#k4mN>-|JB3RX zvN<OPk|A*uA!nsVu%^e<N9#}jSKZ)s@Q}(!RMmW!?w-d}J!qHO;AA{)u1&ocwo30` zZ_c&;j)61^9S92_Z?#1|qCZ-Riea`0bs#6)6rPgY((`Buv#bK~<~0>c$*$`}oS3z% z*1=(80-8J$-9Jn64sWHO{!SiUSefQHO{H0Ul9$x24`S6;Z7^olR_+sJ)lqC9XVsQ( zfM(T}>)T_|k+~)#*+Q8Ku~i<&ocB-1r7M=4Ory6t_l3L_rut~Yk~pQuX9$QiVNM*= zqZcmwV8WC<WJU-{fpds0{t0VTlhR7rk!34CutrkCUa!Tk5GEPtyMeEpUm<idhJ=D1 zCwLK5Dk_K2=LfJt$i$BlOr@I~^-8(wTP!*_8<4|C=3N|}L`n0QzxcetFm)subxAg2 zsHYZOlb%uNuX*FPgdU{OPuwqwH`U8}#yhmy2^PJZUAgJ)f8O`4obw;7j5c(QSof~t zPny5Jwm@CVZp=`BwX?d*N)+u&<j&3%9p@$4-ZIZeV1W^K<chL93+ZNkQ<YG&u@o{u zJ@-{U{Luf55UUh-oSBjvZbsF5NX~=Dm|NiO^3>}XG>j#3`s>7?WsUwVHnlJq&o3BH zsV__DH$mCX!4X!)Hh99EE$LM3?UrmF3GM-cYAwmnofp--bu_47z1tpkzR8LW;E`_E zPjGZc6LQ~G#Q6?4YPC#~U3HQ(opoW&<zJ#xcYob?j7Y~s=ln`7z6V1B9!~BwTBhE` z#(Jl~{t)ENm`de`{>`r8f%wg)@k#}K-ExhNvTeFt^SfgKYjggt35_*s-9@|qQ(R>` zbP&6?%QZCnen*XAQ|VK5YGN?YbR5s%EdH=PM7%I(bO}fNma9MMgN%R;C`JOR^;jR^ zgAsG~7&S|AxIc8Ys%<aW14Id8ES+op=N5<(gjg!ud@wiv68Ly>z4&ep|6;gkVq5>x zAv1)-ya6OPQ|PYP(2OgMJie0EL7$)ZE$cjQ&)q#$i@Uc1M94;jZ!c{y+;6WP#73ig z9t2AZ$D6@=rnpN&kea=An&GR6T0hw#KvLQ9ZrZ55i^}rq(D~@gK|ANC#-pHyr`7hc zbS+xdW)NUnInIs3dCK<7x$xY%-CfU;My(}$HWH`_?fwz@2lVemF1R^ZM7L>AxKhOU zxfrBIz`dN*dZI01a-zvX06#(K>MzsmQDCl+MsEP~f<sh@*B@}ywb}r_m+n}i%Y2;5 zw99y$%G3w{w91rAdz{MTO9PzBqz8qx%0%)&!E5Lf{%V5(M3W|+VnpL1i-kUJg3w53 z7B{<9QAMmlEe<=scF|ePK@ApjyUZX(%ptXtT|eAez3^V_@GqqZk)*n=xlXXsP}s=b zEWUMMG7$K%-RQoIVA5bq_j1T@tA{a2uTx8tNH23k$jHwaSc0BQgQ^sA>>GKC+YCz5 zqmLafrTM0M(u<Fbq#A25Y{hmv*?dYHxJ=E#4tz*KHM?`U>Rw&e7`s1tAsSk<&(L>& zzWB2dp|h+~F8P|Z$fDG@?I;M6Kb~fa*XVv7Dp;(>;R%3D)8|KX@<%n5$be&$`a@Qm zW}loplH34AZ73U(+GTT5pH;(GAfRfb4Q_4LO%Q4JrnZBCvKZUc;=g5fE8)?j8JPa# zlgn%4=b1Wsd5+E3j0!C>zG(~pdcP)J7{x(S1}pO;$(Z$<&8V2Qn<<%?)%$Kb08MT9 z^O8(C>?+YTSl|=>>fRwCtP97luIaUp<2+3n%8f-gzj}d)O`6>u{-@}cIlgUB%cN6C z@;xTFU5I=Es5vk$dGfljcRQN=C}-mAKBPPld~eKKsGG?QL2X-Ax((3+*~77jIQGLK zc4ZE%7pE5-7eesW7cDQO+qj;<bT>4}$HZTdjjm8zYzPGGmC@W`@!U#MPiX~6-<1ZV zgv6I(KqHooG&;W#=H)i~!f$g)#xSsqFCcgMj3x^DO^38gYm@z_G`qyDC5z)HCqK<0 z-+yg^L?@sKoAu%C&a8fpl?7Tqm5iK%w6_a8`m&TMhXKu{nL{(;(8QI3eqd`=O*y_i zq9vc&;M7t`8&YA9u?+Vs_>Np7izeKmoec|pFB8^JE}L6`kpTK8q&~;@`TLpTccM{G zh;3mvIROvKV=9T5Js!^)h-g2a;W&JX++X2Qm4&H!7C6}=5=dKAfkr6ce!0&*v#`U2 zJZ`b8#JNa`oMzjbu8<`kV_98iN~cn(DTV81!aZ%*Af=BGyhnK8<c^}erg*@jt2gv= zSdsH~G$4uC?+kZvNpm=m^UwwfKN4~2=3nU6BT1$v8G!GftF1u$=F~MIf^~U#zqziQ zU7E%$0NLd{iZ%BMy*dQS2p|H$iJU7~5&rY2l*9Z58)eZ>_?Yry2T3(P#`$--+SX$a zU!^PZjDGbJr7k{%Vs1U*3m=piDMDkQ@LLqTsoC(pDg5!B6Wj-w{=wmMCwOqm3L5Uh z*^Z}c6zmA`AFgh2(gCB7iS$zskD2t74@dY66VN|7wbQSYIJHx+oj7%p5zFnNmqULA z-;(QO&HipFWDAL~UkK0*>DCia5>I`#1qKWwAMm9=y6y*rAs_Ij0&N!xBx4SE9A_Y6 z{Ah=#@nIFUev4x=n4tgsAVtCwQj0Fc3@81W!>9H}umM(zkj15Y&W{;Z5}(#4w-LMn zMhX{$P%)heDstK#K{%vp)>CB!Jts-1BPK-5XsU4?%T)f|jFZw+?-nd91TdUuyrs+V z>#dFvVl}_5(_3RP9CuwaFt_z)zHn=f>5aKP*f46Y_LcrV*>G#2)Sqj6@;QJ$o0pqQ zgL0D1C$!I;tRSV%Ru`Y^Kt4Nz{^Pw}ezRxTbZ+QqQ@WM?SZ#h!Ls)eh<`5t{+9Ehx zHcG#=jS9VLcC$L=ekKxrrYGZ9Q{Aek&&!U>Yv%(RnTe}G|DjSF{Yh7)k%E=DW+*fP zYwXq_AzPF_?YRFpYf_=#LwQTn95u#+Mn2aktO=){-W|#-0wW@pvKoUWQx9I-2Q66Y z5^{I&H83uKrc9pP;zK%9PW6?jD4))b#W&B^-bM6#M=u8I^UEV0@o%4G74FfiuUJJp za|cq;?+PixMvq$c1bNAo;F*g8DfP4GrpU(QKg9=fDhS1W75)Jizc1cH21h`O5jb>} z7l=f|HIh#fTH}Xq)Mp>%|3j@f4&~z*GeWw)x|kpn?VtoDj0twOo`g5*6ygXyf_>TM z{f|;;Q_NSGa&Y(t1=?<JNaYH!E0}T>@aK<8(6+JF97Kg&KO8xLA_SmPvtJ?zd|G?? z2y332^^lgd^N3=WPp75eA1~onx?D(Vd<rHD4;?;rxGL@HUzQGaZy%c-bUpb22w`5O z+jwn<AvY%K8thp&Cmnz7k-9)+m-!w@4nDo=*zgZ@f<Ha1WYn?4WP5vGH@ZEj*|674 z7DQT^yIi;GSTCLvMV!AqUDQ9{;t8)*`_zaNir_=uSv0J5T8-N>Wc1~HR_yBjEY&p? z8SI_+m9Ybi8Q0x!06QG2G3<BhaNzYx<wjR>7gjp`3OLf96Kv}MquHDF;KDEH)0cQl zz@Q0N)ECu1J;QOr@l+j4mUn{c1w<LAe6%Hv0W<^XiFWRF)13vS^kn8U5mmNfdMxrv z<X%+q9N-V8ZPGt)rgrxa^J&HB(@ot97WinOqfhzC502mF`8IqRd_58QH1{<xK)|2D zH?k4$Ey%7)a9ycod4^A&uv_YGA572P+YxL(+VaIVwPTsZ#m}^;$(y60#RS1(Fu>oU zs9cAGHlfU19+xK>u(WH2&$oJBMy2qHXI@4mO<1lhVN<kIUmRV2p<D6zH8U_RC|if3 zC&IG;$3joVzht?Cs;o>*gbGrwX)sqx3`Yh-Sf(ZBuq@$Bv0&Bwj$EKvRa)_!S?Fx{ z38BY83<&l7A&wimOQ?1!j{l<^cY)(HrOUx%J!_p0Z)jS>5F=cAgX1iGde;R9RM;PD zwW!YC#u_1HL6Ty~iV5vhy{XfRG00f6CI{|}GLorvurr6~Bw}oeU)qx*s79)vOwhXw zvnhoRDZHURnV@wh@Fmtj1aG^{qlv=36yjw-odlmZAs1Fu|3NMO)cM9I>u;$vqb#`^ z{hShb<Mp7?_q_ICffA4s$$jgT`26ySiC!TY-0{RE{fgv`7(QS8Y#g}FczNI^1q<zd z*rA8qfpwC1=g)JalN+**cr)c8Na)TmC4Bzw1OqvD|2io_w==@$L7)#1{|k<Q;Kh_j z-oIe$U-<5Y`<M3$<mLVgdqME*f4%kp3k!+d8LE*xOk0i-$VQn}Db*$ISbsNbB=WXc z2i5&a<ZiJRt@|^Vsb$(dN1AA(2uZ$C3=_Hh#o~%pe@rE9wgy~}Z8XzYCeyRw2)L^` zFEGqr4sO^qobD%s-Jrbx!Lt94WilsZ1_xDOhsT;{JH_*jNz;&({Wb9M%Jiflyo%1| zm8r3VwJ{6l4`y&vQQm1*-s$QTaDA$YsqrN)E52X@<<u-ACwXw8xp;wD@wj)cmE~tA z^Uv%Ijg1Tq)#3&I4~C|_QSQ8_bUTMwy;V5+CSsIha78#<6OmupNmnyashNem6|k0} z1@$T65QGK4V<Y(Yen&wM_Rsx_4i%L5nexLwuJAGc&Bgr<Cs`rF72~2E)6tca<c5=E zQRh*nwmog<Q8(w&r;}u5=h4Dln%M&-V_;@E%UIdBzW-uI|C(8l8UMdcBgpK4&}7-S z>;Gb&GRw!Z6_bKFmCaNCi%C;VN^>Y@@{m<FnJgPQ;Z#oJEun7sTkre)<-gAT$+Ger zPUR%tlJXA@<s)DJi(&d}SW3#J|BJB%8IF?jF_7W;FNUwAy#7EbNnchOXaD~;>ibH{ z`<dk<*^0`bdZ|J68iVRR`CBh&zB2Hy^TDBfZ&d2B@@S6IP{(PWjmn`$b0b}2Qo0IJ z@pxwLabnKh`iGaz5A8IKx36SBwk<1)ev+#vm}*&_nhpSi>b%S?eM~L+*_*o9n`$CY zeNqROcRAHy{jJ8vQ$w8e$G{>Xx+%dUxxoyP^j0CUF?{tUZ+pKhpclvIe@#LUDl4Rv zCKuJGrb1AZlu!K@-mCPFYlxmo;lKimjyZwFYr=Wi*~Cl}`%iLklS^=ugYb%n@XE-P zv(Y!c_Ls*F?XIpGB1Ipc2G2Lwp&yRdcPsmLb#E@mi!r}PcYfKN!hE$J@sWZ$K<aA| zw%x~`!0##h>_sh|gV59Rg2-fv%u?d}b=LaLAl8IzCi3V$;_mc1{OE;ji2#<(v}Ye* zP4tIKUAi*<lD@CN^gbo71>jWo^Xi9?46oj_h?pFK%S$wBK5wDlgL0+!_wX1*{CV3u z6iS}Yf#ESZ-!Cr{Ku!gav;6)(4CJia-Z?0{AHwB*Rkz9Z@utmg&KRUs{&CtM9>q04 z;BRL-kV=Z}z$^xRC{OIJWD<EIzXf3=>-%}%2)F?=5-F61O2E-o-E#OFeTo2*<-m9U z!*@}0B|BW@53yE1?3Py;$tJj@UVP>sI4MV2wh=9^JDW=DZLH}akx*Qq`m-<$WCg~m zP?EGG!l&}<h139Vh@i)U(zK-Z1jiI0U?Pyh8Y86pg4z53zf^*7Z*4w`0;%R;qB*VH z!A4t;A<Zexrv@*N_fJ;Wk9GIAz+c{zGi4tsGu||N&eUqTkt`?t$2n`m=PC_YD>!OT z-18BwqVwyLO)wEoZJF_{gOP|H0*n^1{Ylq*LLI=j@x>}_326MHF(S<>thfeo2^I8y z73ly7-Jw#Ge;nS~Kh<$Qn_PN4T-L33(zDgX9Q!n&pLCB@hqYdu*|u||+eGh-%eNye z)b!p~d~ZL|D1)_?h1~vPs=}ES$_%|7NoaNzvY0(B2JSu>Fu|JZK-j2YreV%f<@#My zd7hnG@;fVGZK6;|KqAb7f>G9wrmhr*HYXs}gGK7eOgZ#XbYN>i?mpRErhhp{6}3V| zxc>-!+Ml}p&zR<hCZe-2Yymwcn<#PoBuz1BU)Kr3*#|H8DRrQaRkt3MDYL7V0N8S7 z0;@(+I5Vv6o1uC#*VlG!u4-=@?VVn<)~H8jBnn9r&_`Kt%3FRda8C3BRb;IyB-%9K z)XIX|eG{y;Botqjr^(NxL%4+pg`H`42L-)9><;pKpX?0sdXMc4a(h>zMLPI1%6{#n z8eseV3nt3E1-9TA3>Y_R&+!PcJAuSxDzNVy8$MNNz*2Vd8HoDZQSI?lP~Fg<Dl75g z8a)#U7nm=F`vJ2l1b9N}0TK>yWxbB&0$J2>@ER2LM1`HWU>uZ2A7MFUy?6;zk(G#E zfv2|@^1!D@<ClxeCRTj=Rv2c&N^9`;9q@CtZcbzlQ*auMzVO9b1Mn!=nibRo4icN6 zfH_CJU1<o;z7T@ruyJ6WxW7AvKvu-}1BkhA`4;3eKR@Muf^Fg+p!`@l1P=^Y&=yXH zTU79~N~wvl>8f{pv`p95_G0a7VC!mN$<fT1q#LKnxEZ1DsArk1Hkmj*7yzogFh_*i z_~L+lWp?g(Cf-|p1B>Kl9>DKO&0wS!h(VYxU@~07?pTn6N9o5$3|VNS^EcR9n;%{2 zd!t=vf751YI@TTS)8A@Wj$zBSl(mL#GweCzsO3atJLslXXb7LL-0rTo@TG6$3?I-) zmjwO~nIZoVG8_Jz%qsto*|0pX<n-!cQU7K8^zP|icb%u&$LINE9{6~`j@;$Vkj(H# z`__KY=&Ak2`#si)MeEJ9*>gDl9vHWAZ%mZ;dvJ2k!g;6f1*~Nzr}=nq&^@E7+vO<% zX-9GA#qi~^R&wgGqG!Bs)V)Q<26*d(B{%x=X1Um<n~Z$ym{<US8#v$Nb6&>ISPVJM zw^oS8H3==ie6vjHf>#F1e5-D@F-ZXS4ThkS8FG}dk7Iv78fOkptk?$xd?O&SQ8O2= z1zcJ@yz&o2&YIpm6J|55WCdr`fE#XnNg995mGyBkYOC={=<^&Fst@H<A0dXlWnxle zRu7MeH6^0T@lwbhupu&V(AmJ`3<6NX=e!87k>V*hYS$Bs%~LQ0mI`g4?2zs)OGZ}f zvNfnLF?K;wdF<C!qu!0Cf6%U}gqOb^4u(@6vk>Aj;%S4MzWwd~ir}#=AK64isI++3 zpN?*<TNyTeI}nVby=!6MS;)g3CJ!8OXOnu`laH-8ZFQ8+@dixOdAS!!mD~UlWVL51 z#E-al8>C`9fq?i)La(dk5=FkYn-S9->xYv$hMW$r{RZL5XN?>cm+@e1{SC{ZIHw6j zs``8OU5+p}U_9wb?s%aJaEd{4g#NLr%hRQhO8l4L3_95gX$v~3W~2?mRs8kI7l~iG z_HipCbO|={;hm4}>(yAdGc@p?Z|$E1@5V5}9UE&z4#|1ALpMD(odysdb!3Lh7S)kS z@R81NlzE;r-qdS+7-Zl2NC>0PYeR<*Dh7NBWqIpDL$2i-qeBd(+t&saHQFy}PcE^s z)3e1zSa@SX9o-29r*C*j@&OM;r0LldZP0H0B?qc=%O74~L=$fC5+`PDv{;n81g9-| zEyBN8u7RiTZqEWsY0?`&0rWuunm_@RcuDfz9zg*L{}ligRc4Zu<UI)&Z%nS4J0a@y z&GQUsFk#J~M<FtM@El?D@;VegCRbeA`vY%pZ^0od8liaCO`!Np!fkxzr?{8P2>k5J zm|C7wB7O2zACY}TUs76KXixLe6bK6TQUw_$^b2#(;Jr~uN!*;c2O&SXoz^DL;m_Z8 ziW$D1%xYjJ_n3-MyG@4bt!E3CCGwIgENd*reVZ!=6|g;vrftJZnh%hyY0d_<FS4k4 z%#{xqu4!hAGSvs%F2GQx7y5$?eR}zg`*BdQS?{+6&6@UZl7izZQ&8KWk1$iFmmj)Y zXp6H*KHM%8U((XHuDgqg%qHmA@CM`q!m67WoIps|#tK)?l(%(VV=z$syL-n^B*d6} z&^$#sSF*iDO$P1H*oD(U<%nw8Kmf=Xb%F_Cl~*_JNr8LkmH)=_@5z)i^zOKYP*EVg zFdwUF)&ceZA)f`as(Aqmv6jr*SAl933>xj1pHz_zWa77VM47U=4tw7(Eo9~q^uO5z z0F6ahMtHv*|KyL>W2MiSk1|Z?xPglor<gI=0d_HH=X8W-siYYeb&jPd>W!wG#tAq$ zS{+xwiqO(@x~(>6s3Pfibj-d{Fm$DQ>_Ow>XwO*r&X`LvoUqvf8bwoF7+8vClXZ7H zuKaU_bEP`4YM(=;818jGUl-7~o_G||@n2m<bkTKAMIImiS!S&-^vqSAs_r2Vf@+Ok zC~hb$+*F<Yla-J2Mh+OSLDD6y`0-KF{d%<Dic9JnvbKA~LWG<mFKyLis1jEWY7Yxv zfC9intZ=5Onl!0e<{zq2v{HKhv+PKG@5@dPwfN7nLs;WZ_Rd6fef-WM2|e2R5yW8t z^ai5LbYK$gt&W?Ys2CQA8)m&Tqiv?&S(K-P)>@;@;;*DyWp>on92xH-LyIXoB0XS4 zK~(9kItHOG#}$_B33tcorf3jtZ|toIFbPGcgZ>m}Ur3BFOzX4?e3dAuP{jf<cJ^2W zYseGaw^~j6ovzOs$`K4u0h~Dl&j=^bm4#xPv#GkS9W%)cI3nh>8aBL1Kh<DzP|J3C zN&VeCV2TugkrKurW>L#$I3r$#%E>u)-2PL~y8A!%*!-<${SQlaP|>0$Uana@!h$B= zFSGKQ<0`E5e0Umln~p1ph{)>ZY}DyM&_^b7&C2tStDFd?-$|D-&`^8mevE@EBj?_6 z`ysrT0z}V65c2N$Y0i^%3!*0h8lfPF<Xp5o;h=dkyjyXJx;7n-etNNDSmpG3ZhuNZ zCiVdWOuMud)Ccr^P&uY99E<~B6i5t+YLZdiC5&C`?nQLEOrbMs&YibP?7ki_rqb4Z zn~`B>n3?)5RsPIhn&rMPCajQ|X)p{^i?;Ss=uD>CwqBL!OxD_hknXX2FQA;`<&Puy z$FUq=tL|P&8cygHfndcHet3^Oy3FqU*;>`k+`28aI#X#5zX!!SQ#B5!t%N!!-mOCA z%xJ4tUzlLIp=`!2$33~>Z2c|AAi0r++rU|6JB=m)L?=-<g~@U0J=|zcdKKhO0j;Nf zQyC5447Kc}4wn#9WS=-PgD-|LgwOK@gr@x0ZgG?v7L`P#aKlhK!nhB2;f*SpWgTFc z^XTt)l^ru`@&-dQ8g4l~R5{Cr+oozasrNX^d|$l9#A3p7^rsECovc8AWZw6##DV8M zSW`8=DDuV6nQ;#+`wSwb7NaF~hd%;~8K9Qpr9R;fc`{X0OPTpzQ_;0>Yzdk2)j6qB zYH^B!P3jig2JfM1+E?}Bq{*4T`UipbJ*J3i4YNlf-*MemkaJee{^i|i_(~ECa^gl* z8-biNqW7aXN8RD5>h?0i1e%Q0*H~;UtSXUX`4xEdy!p5f4>cPMwW52$yWIDPuJT(w zKBzuL&81MNUU(bZxER8rGun<jeb7zSY^X(ThY+DO9im0yOlwJZf)~g0Sha_Y9>eap z&`j=Q*}65IGnl+43>r1omqB0|T|EAv5#OXjMxPX@E*-BTx}1Uh3UZO-dDS_(A){d# zwDQ{{3tPS-axA&fg^HCI;xT@C_v;k-f8xeh?w=QLE>_eu?j@)@DhHW$Jm#Yx%%*m= z2-WL&`Hht@`oskpbhQ5dSgw>11zK3l@Y^FAz3J4k4W~S{8tZ8_M$qbX##X5|SN4}u ze|$v%UvqcDYcIXnv_S`ry10p^M~xVWB%bBtF*_d5TV3Qsh$f!ZYqBIB&udpdpkH*o zp1-~Nyio}E@~?~!y8m;sY2nI7<$Htny}nfin>n(o`Ce_)G`cw0tlOgD+0^+ky7aoR z<ZWW9i@lOE0CX7uIv75A7(R_Gy@s&*jKQ0YcWYW8tZO)2ETjiEFVMFCEZ(YOMYgF5 zbF~=nPh&+h-LIQU4`a6YGBE<hrqNNU3;OEXmGacM+TlqHd^=in|LNhbVFMqTaqHte zDjf0q38-&p*6Hf`#__7(E@wYwlN=Mn=@H1LZc}5yARpp$djY&^a%!}?w772dxWn?g z&-kplCQ9@=f3<fvX)LX!4Z8m_q~bD-Y*TYiG`d(T5*_CgkBh#K{ZJC!=&I{|(lm;U ztipkP+V2D_&!^-PyDQ1An+%PzCRk3f%tCjYd?LxZ$atH0BFXZPnfNN>Al%<}Efq4J zy)C?S%7X4;x2m3tJe#%WRxjH(0=B?CdS{f&R$;j7Q7^Ar`LgH1r1);y(3CO&e&2p2 zDA&BaehVB&U<h`aRNpQ#>r&q-GCFV3ir5ou7?F}`KX6~m4qfQ?pkK;Ci%WN%#CUQb zQAmh2H)`hok|#UF;t(iDG7qnRJ?jhjy=CghH|CXmFdYAp22$;jb|V3Gr7}A1eArvN z4w!O2?D&t7HM1&)rQVX&=>R^_pz<I(n@+J!uQzOBtDM&IIAY@WHNJo{l9`<0jQ44C zGJcd3vG~MsnhB+Q_h^Jm#RTuv3-sp?;yQ!&LAY5#e7!2a);Sp-$?e#bdsz3VOHmmd zx?7L1iul>(dET+qr1mt5yd2!Y!uvfe)@n)i=_M((Tc?&LpeZbR2@z;Ik2KnM=l_z{ zw1GCA-hbLHc4ez7E8PbIP&S>x*G@HZ#c?DF-zh8^mXi7=Azpy~FAuHy##1`A{Orx@ z1f&}t3~cdU8FkT(Tw>lsY?d4qO-n>Lj{@XhYO(NH5P|zMY{PckwX><vgI}$>DDqju zR{XLCXgPx8Lf+SLb9@ng+#fQ{qww!4ny|T|J_IQdA$6e~Nv1CXVZPo4eaco^HuuT> zlnu3v_x72b$GndHRq)%dYrPV*d{#TtE`2#D^G`f^(ZoBl59^A@0{&;$f`??>v5n&Q zMxT!Q#~djH0Ud5k#5vMJS>0jhj-@_J+-To20Eg(@>@M0yU9m?z?032vT}|xv)@NP0 z>+iXUXSatiZj$dqR)|VPRwFq)f3}aJZ2?fKhL!gB1-aLW8&|3LT$y;HK3)jS5N;(% zmZI_CWDgX(er|~wOR#k+{)(JECFbUc8oQlko8{k?_lkM+#&|1P|D-y<;cv)iQ@uj) zm~|@|my4WT^MX<-F-9>(@PJY(F(y9!kKM$Yp_@qcXN%jAzH=q}j_2~|y-~&2G#Y~3 zeDE;?;?`&_@jx_6RfS8@L9r7H)%pEVL;xQRP8l{LcK<O+<E_%jO1(*KFsFB_B+=|y zI^QgZ9E@Zp+0huRBDbX{7ty#akx<WN)fi)_bbfPA?W0^W@?hL|8?@c}>Br0xM^kF& zME;07l1P6=7X7(`Cz|^@DSZ2fs5FqfM6?rj9`()k2{I`(ujQgS=aC0B8wo_931!H2 zo0Ft-o|Gu}VY?yNIES@Tb^`H7(1Qq+mfgv5#UD$6e|Uc^;}#TGCp#SH(v()k1&Uhw zn~$-|5lVw3-ER-&&K?DD8*kI)I-vNr2UA0;<y_lD)}Y72*ogf~qMSp~J4>vQKs7dQ zIK;7UKCE-;m#`)I-Dy`Ufz%764+x6Bgxs5<MGCYlGOesbw+qKo{%6q<rSrgJ^fsF_ zV472e(t(%5hFtl|Y1AtF-HT`I;;R6;P*Y_AU+h_^áZ~dn#A>Q|^2VobEp$kUT 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
--- a/gfx/layers/apz/src/AsyncPanZoomController.cpp +++ b/gfx/layers/apz/src/AsyncPanZoomController.cpp @@ -285,21 +285,29 @@ using mozilla::gfx::PointTyped; * \li\b apz.smooth_scroll_repaint_interval * Maximum amount of time doing a smooth scroll before sending a viewport * change. This will asynchronously repaint the page.\n * Units: milliseconds * * \li\b apz.test.logging_enabled * Enable logging of APZ test data (see bug 961289). * + * \li\b apz.touch_move_tolerance + * See the description for apz.touch_start_tolerance below. This is a similar + * threshold, except it is used to suppress touchmove events from being delivered + * to content for NON-scrollable frames (or more precisely, for APZCs where + * ArePointerEventsConsumable returns false).\n + * Units: (real-world, i.e. screen) inches + * * \li\b apz.touch_start_tolerance * Constant describing the tolerance in distance we use, multiplied by the * device DPI, before we start panning the screen. This is to prevent us from * accidentally processing taps as touch moves, and from very short/accidental - * touches moving the screen.\n + * touches moving the screen. touchmove events are also not delivered to content + * within this distance on scrollable frames.\n * Units: (real-world, i.e. screen) inches * * \li\b apz.use_paint_duration * Whether or not to use the estimated paint duration as a factor when projecting * the displayport in the direction of scrolling. If this value is set to false, * a constant 50ms paint time is used; the projection can be scaled as desired * using the \b apz.velocity_bias pref below. *
--- a/gfx/layers/apz/src/InputBlockState.cpp +++ b/gfx/layers/apz/src/InputBlockState.cpp @@ -826,33 +826,36 @@ TouchBlockState::TouchActionAllowsPannin return true; } TouchBehaviorFlags flags = mAllowedTouchBehaviors[0]; return (flags & AllowedTouchBehavior::HORIZONTAL_PAN) && (flags & AllowedTouchBehavior::VERTICAL_PAN); } bool -TouchBlockState::UpdateSlopState(const MultiTouchInput& aInput) +TouchBlockState::UpdateSlopState(const MultiTouchInput& aInput, + bool aApzcCanConsumeEvents) { if (aInput.mType == MultiTouchInput::MULTITOUCH_START) { // this is by definition the first event in this block. If it's the first // touch, then we enter a slop state. mInSlop = (aInput.mTouches.Length() == 1); if (mInSlop) { mSlopOrigin = aInput.mTouches[0].mScreenPoint; TBS_LOG("%p entering slop with origin %s\n", this, Stringify(mSlopOrigin).c_str()); } return false; } if (mInSlop) { + ScreenCoord threshold = aApzcCanConsumeEvents + ? AsyncPanZoomController::GetTouchStartTolerance() + : ScreenCoord(gfxPrefs::APZTouchMoveTolerance() * APZCTreeManager::GetDPI()); bool stayInSlop = (aInput.mType == MultiTouchInput::MULTITOUCH_MOVE) && (aInput.mTouches.Length() == 1) && - ((aInput.mTouches[0].mScreenPoint - mSlopOrigin).Length() < - AsyncPanZoomController::GetTouchStartTolerance()); + ((aInput.mTouches[0].mScreenPoint - mSlopOrigin).Length() < threshold); if (!stayInSlop) { // we're out of the slop zone, and will stay out for the remainder of // this block TBS_LOG("%p exiting slop\n", this); mInSlop = false; } }