merge backout
authorMark Hammond <mhammond@skippinet.com.au>
Mon, 27 Aug 2012 16:18:11 +1000
changeset 105571 14f5c776d20ff71ceb6f00390f5a7b69294e0f0c
parent 105569 7ca10f967b059335645909eea2dbb32ca3adbd5e (current diff)
parent 105570 e53008d2ca14a30908bc681fb68c94b8c4bdf44b (diff)
child 105572 caffdfa95b07527ab8c091ba7a533aac81e96964
push id55
push usershu@rfrn.org
push dateThu, 30 Aug 2012 01:33:09 +0000
milestone17.0a1
merge backout
browser/base/content/browser-social.js
browser/base/content/test/social_share_image.png
browser/base/content/test/social_worker.js
--- a/browser/base/content/browser-social.js
+++ b/browser/base/content/browser-social.js
@@ -288,22 +288,16 @@ let SocialFlyout = {
 
     sizeSocialPanelToContent(iframe);
     let anchor = document.getElementById("social-sidebar-browser");
     panel.openPopup(anchor, "start_before", 0, yOffset, false, false);
   }
 }
 
 let SocialShareButton = {
-  // promptImages and promptMessages being null means we are yet to get the
-  // message back from the provider with the images and icons (or that we got
-  // the response but determined it was invalid.)
-  promptImages: null,
-  promptMessages: null,
-
   // Called once, after window load, when the Social.provider object is initialized
   init: function SSB_init() {
     this.updateButtonHiddenState();
     this.updateProfileInfo();
   },
 
   updateProfileInfo: function SSB_updateProfileInfo() {
     let profileRow = document.getElementById("editSharePopupHeader");
@@ -312,86 +306,33 @@ let SocialShareButton = {
       profileRow.hidden = false;
       let portrait = document.getElementById("socialUserPortrait");
       portrait.setAttribute("src", profile.portrait || "chrome://browser/skin/social/social.png");
       let displayName = document.getElementById("socialUserDisplayName");
       displayName.setAttribute("label", profile.displayName);
     } else {
       profileRow.hidden = true;
     }
-    // XXX - this shouldn't be done as part of updateProfileInfo, but instead
-    // whenever we notice the provider has changed - but the concept of
-    // "provider changed" will only exist once bug 774520 lands. 
-    this.promptImages = null;
-    this.promptMessages = null;
-    // get the recommend-prompt info.
-    let port = Social.provider._getWorkerPort();
-    port.onmessage = function(evt) {
-      if (evt.data.topic == "social.user-recommend-prompt-response") {
-        port.close();
-        this.acceptRecommendInfo(evt.data.data);
-        this.updateButtonHiddenState();
-        this.updateShareState();
-      }
-    }.bind(this);
-    port.postMessage({topic: "social.user-recommend-prompt"});
-  },
-
-  acceptRecommendInfo: function SSB_acceptRecommendInfo(data) {
-    // Accept *and validate* the user-recommend-prompt-response message.
-    let promptImages = {};
-    let promptMessages = {};
-    function reportError(reason) {
-      Cu.reportError("Invalid recommend data from provider: " + reason + ": sharing is disabled for this provider");
-      return false;
-    }
-    if (!data ||
-        !data.images || typeof data.images != "object" ||
-        !data.messages || typeof data.messages != "object") {
-      return reportError("data is missing valid 'images' or 'messages' elements");
-    }
-    for (let sub of ["share", "unshare"]) {
-      let url = data.images[sub];
-      if (!url || typeof url != "string" || url.length == 0) {
-        return reportError('images["' + sub + '"] is missing or not a non-empty string');
-      }
-      // resolve potentially relative URLs then check the scheme is acceptable.
-      url = Services.io.newURI(Social.provider.origin, null, null).resolve(url);
-      let uri = Services.io.newURI(url, null, null);
-      if (!uri.schemeIs("http") && !uri.schemeIs("https") && !uri.schemeIs("data")) {
-        return reportError('images["' + sub + '"] does not have a valid scheme');
-      }
-      promptImages[sub] = url;
-    }
-    for (let sub of ["shareTooltip", "unshareTooltip", "sharedLabel", "unsharedLabel"]) {
-      if (typeof data.messages[sub] != "string" || data.messages[sub].length == 0) {
-        return reportError('messages["' + sub + '"] is not a valid string');
-      }
-      promptMessages[sub] = data.messages[sub];
-    }
-    this.promptImages = promptImages;
-    this.promptMessages = promptMessages;
-    return true;
   },
 
   get shareButton() {
     return document.getElementById("share-button");
   },
   get sharePopup() {
     return document.getElementById("editSharePopup");
   },
 
   dismissSharePopup: function SSB_dismissSharePopup() {
     this.sharePopup.hidePopup();
   },
 
   updateButtonHiddenState: function SSB_updateButtonHiddenState() {
     let shareButton = this.shareButton;
     if (shareButton)
-      shareButton.hidden = !Social.uiVisible || this.promptImages == null;
+      shareButton.hidden = !Social.uiVisible;
   },
 
   onClick: function SSB_onClick(aEvent) {
     if (aEvent.button != 0)
       return;
 
     // Don't bubble to the textbox, to avoid unwanted selection of the address.
     aEvent.stopPropagation();
@@ -424,43 +365,33 @@ let SocialShareButton = {
   },
 
   updateShareState: function SSB_updateShareState() {
     let currentPageShared = Social.isPageShared(gBrowser.currentURI);
 
     // Provide a11y-friendly notification of share.
     let status = document.getElementById("share-button-status");
     if (status) {
-      // XXX - this should also be capable of reflecting that the page was
-      // unshared (ie, it needs to manage three-states: (1) nothing done, (2)
-      // shared, (3) shared then unshared)
-      // Note that we *do* have an appropriate string from the provider for
-      // this (promptMessages['unsharedLabel'] but currently lack a way of
-      // tracking this state)
       let statusString = currentPageShared ?
-                           this.promptMessages['sharedLabel'] : "";
+                           gNavigatorBundle.getString("social.pageShared.label") : "";
       status.setAttribute("value", statusString);
     }
 
     // Update the share button, if present
     let shareButton = this.shareButton;
-    if (!shareButton || shareButton.hidden)
+    if (!shareButton)
       return;
 
-    let imageURL;
     if (currentPageShared) {
       shareButton.setAttribute("shared", "true");
-      shareButton.setAttribute("tooltiptext", this.promptMessages['unshareTooltip']);
-      imageURL = this.promptImages["unshare"]
+      shareButton.setAttribute("tooltiptext", gNavigatorBundle.getString("social.shareButton.sharedtooltip"));
     } else {
       shareButton.removeAttribute("shared");
-      shareButton.setAttribute("tooltiptext", this.promptMessages['shareTooltip']);
-      imageURL = this.promptImages["share"]
+      shareButton.setAttribute("tooltiptext", gNavigatorBundle.getString("social.shareButton.tooltip"));
     }
-    shareButton.style.backgroundImage = 'url("' + encodeURI(imageURL) + '")';
   }
 };
 
 var SocialToolbar = {
   // Called once, after window load, when the Social.provider object is initialized
   init: function SocialToolbar_init() {
     document.getElementById("social-provider-image").setAttribute("image", Social.provider.iconURL);
 
--- a/browser/base/content/test/Makefile.in
+++ b/browser/base/content/test/Makefile.in
@@ -263,17 +263,16 @@ endif
                  browser_social_toolbar.js \
                  browser_social_shareButton.js \
                  browser_social_sidebar.js \
                  browser_social_flyout.js \
                  browser_social_mozSocial_API.js \
                  browser_social_isVisible.js \
                  browser_social_chatwindow.js \
                  social_panel.html \
-                 social_share_image.png \
                  social_sidebar.html \
                  social_chat.html \
                  social_flyout.html \
                  social_window.html \
                  social_worker.js \
                  $(NULL)
 
 ifneq (cocoa,$(MOZ_WIDGET_TOOLKIT))
--- a/browser/base/content/test/browser_social_shareButton.js
+++ b/browser/base/content/test/browser_social_shareButton.js
@@ -43,48 +43,37 @@ function testInitial(finishcb) {
   ok(Social.provider.port, "Social provider has a port to its FrameWorker");
 
   let {shareButton, sharePopup} = SocialShareButton;
   ok(shareButton, "share button exists");
   ok(sharePopup, "share popup exists");
 
   let okButton = document.getElementById("editSharePopupOkButton");
   let undoButton = document.getElementById("editSharePopupUndoButton");
-  let shareStatusLabel = document.getElementById("share-button-status");
 
   // ensure the worker initialization and handshakes are all done and we
-  // have a profile and the worker has responsed to the recommend-prompt msg.
-  waitForCondition(function() Social.provider.profile && SocialShareButton.promptImages != null, function() {
-    is(shareButton.hasAttribute("shared"), false, "Share button should not have 'shared' attribute before share button is clicked");
+  // have a profile.
+  waitForCondition(function() Social.provider.profile, function() {
+    is(shareButton.hidden, false, "share button should be visible");
     // check dom values
     let profile = Social.provider.profile;
     let portrait = document.getElementById("socialUserPortrait").getAttribute("src");
     is(profile.portrait, portrait, "portrait is set");
     let displayName = document.getElementById("socialUserDisplayName");
     is(displayName.label, profile.displayName, "display name is set");
     ok(!document.getElementById("editSharePopupHeader").hidden, "user profile is visible");
   
-    // Check the strings from our worker actually ended up on the button.
-    is(shareButton.getAttribute("tooltiptext"), "Share this page", "check tooltip text is correct");
-    is(shareStatusLabel.getAttribute("value"), "", "check status label text is blank");
-    // Check the relative URL was resolved correctly (note this image has offsets of zero...)
-    is(shareButton.style.backgroundImage, 'url("https://example.com/browser/browser/base/content/test/social_share_image.png")', "check image url is correct");
-
     // Test clicking the share button
     shareButton.addEventListener("click", function listener() {
       shareButton.removeEventListener("click", listener);
       is(shareButton.hasAttribute("shared"), true, "Share button should have 'shared' attribute after share button is clicked");
-      is(shareButton.getAttribute("tooltiptext"), "Unshare this page", "check tooltip text is correct");
-      is(shareStatusLabel.getAttribute("value"), "This page has been shared", "check status label text is correct");
-      // Check the URL and offsets were applied correctly
-      is(shareButton.style.backgroundImage, 'url("https://example.com/browser/browser/base/content/test/social_share_image.png")', "check image url is correct");
       executeSoon(testSecondClick.bind(window, testPopupOKButton));
     });
     EventUtils.synthesizeMouseAtCenter(shareButton, {});
-  }, "provider didn't provide user-recommend-prompt response");
+  }, "provider didn't provide a profile");
 }
 
 function testSecondClick(nextTest) {
   let {shareButton, sharePopup} = SocialShareButton;
   sharePopup.addEventListener("popupshown", function listener() {
     sharePopup.removeEventListener("popupshown", listener);
     ok(true, "popup was shown after second click");
     executeSoon(nextTest);
--- a/browser/base/content/test/head.js
+++ b/browser/base/content/test/head.js
@@ -129,25 +129,16 @@ function runSocialTestWithProvider(manif
     info("runSocialTestWithProvider: provider added");
     oldProvider = Social.provider;
     Social.provider = provider;
 
     // Now that we've set the UI's provider, enable the social functionality
     Services.prefs.setBoolPref("social.enabled", true);
 
     registerCleanupFunction(function () {
-      // if one test happens to fail, it is likely finishSocialTest will not
-      // be called, causing most future social tests to also fail as they
-      // attempt to add a provider which already exists - so work
-      // around that by also attempting to remove the test provider.
-      try {
-        SocialService.removeProvider(provider.origin, finish);
-      } catch (ex) {
-        ;
-      }
       Social.provider = oldProvider;
       Services.prefs.clearUserPref("social.enabled");
     });
 
     function finishSocialTest() {
       SocialService.removeProvider(provider.origin, finish);
     }
     callback(finishSocialTest);
deleted file mode 100644
index fa1f8fb0e23b9689e51f667a5745898f929c0960..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/base/content/test/social_worker.js
+++ b/browser/base/content/test/social_worker.js
@@ -86,30 +86,11 @@ onconnect = function(e) {
         port.postMessage({topic: "social.ambient-notification", data: icon});
         break;
       case "test-isVisible":
         sidebarPort.postMessage({topic: "test-isVisible"});
         break;
       case "test-isVisible-response":
         testPort.postMessage({topic: "got-isVisible-response", result: event.data.result});
         break;
-      case "social.user-recommend-prompt":
-        port.postMessage({
-          topic: "social.user-recommend-prompt-response",
-          data: {
-            images: {
-              // this one is relative to test we handle relative ones.
-              share: "browser/browser/base/content/test/social_share_image.png",
-              // absolute to check we handle them too.
-              unshare: "https://example.com/browser/browser/base/content/test/social_share_image.png"
-            },
-            messages: {
-              shareTooltip: "Share this page",
-              unshareTooltip: "Unshare this page",
-              sharedLabel: "This page has been shared",
-              unsharedLabel: "This page is no longer shared",
-            }
-          }
-        });
-        break;
     }
   }
 }
--- a/browser/locales/en-US/chrome/browser/browser.properties
+++ b/browser/locales/en-US/chrome/browser/browser.properties
@@ -367,16 +367,20 @@ webapps.uninstall.label = Uninstall App
 # brandFullName, and %2$S by the value of the toolkit.telemetry.server_owner preference.
 telemetryOptOutPrompt = %1$S sends information about performance, hardware, usage and customizations back to %2$S to help improve %3$S.
 
 # LOCALIZATION NOTE (fullscreen.entered): displayed when we enter HTML5 fullscreen mode, %S is the domain name of the focused website (e.g. mozilla.com).
 fullscreen.entered=%S is now fullscreen.
 # LOCALIZATION NOTE (fullscreen.rememberDecision): displayed when we enter HTML5 fullscreen mode, %S is the domain name of the focused website (e.g. mozilla.com).
 fullscreen.rememberDecision=Remember decision for %S
 
+social.shareButton.tooltip=Share this
+social.shareButton.sharedtooltip=You shared this
+social.pageShared.label=Page shared
+
 # LOCALIZATION NOTE (social.toggle.label): %1$S is the name of the social provider, %2$S is brandShortName (e.g. Firefox)
 social.toggle.label=%1$S for %2$S
 social.toggle.accesskey=f
 
 # LOCALIZATION NOTE (social.activated.description): %1$S is the name of the social provider, %2$S is brandShortName (e.g. Firefox)
 social.activated.description=You've turned on %1$S for %2$S.
 
 # LOCALIZATION NOTE (social.error.message): %1$S is brandShortName (e.g. Firefox), %2$S is the name of the social provider
--- a/browser/themes/gnomestripe/browser.css
+++ b/browser/themes/gnomestripe/browser.css
@@ -1368,18 +1368,25 @@ richlistitem[type~="action"][actiontype=
 /* Popup blocker button */
 #page-report-button {
   list-style-image: url("chrome://browser/skin/Info.png");
 }
 
 /* social recommending panel */
 
 #share-button {
-  width: 16px;
-  height: 16px;
+  list-style-image: url(chrome://browser/skin/share-button.png);
+}
+
+#share-button:not([shared]):not([disabled]):hover {
+  list-style-image: url(chrome://browser/skin/share-button-active.png);
+}
+
+#share-button[shared] {
+  list-style-image: url(chrome://browser/skin/share-button-shared.png);
 }
 
 #socialUserPortrait {
   width: 48px;
   height: 48px;
 }
 
 #socialUserDisplayName,
--- a/browser/themes/gnomestripe/jar.mn
+++ b/browser/themes/gnomestripe/jar.mn
@@ -34,16 +34,19 @@ browser.jar:
   skin/classic/browser/pageInfo.png
   skin/classic/browser/page-livemarks.png
   skin/classic/browser/Privacy-16.png
   skin/classic/browser/Privacy-48.png
   skin/classic/browser/searchbar.css                  (searchbar.css)
   skin/classic/browser/Secure.png
   skin/classic/browser/Security-broken.png
   skin/classic/browser/setDesktopBackground.css
+  skin/classic/browser/share-button.png
+  skin/classic/browser/share-button-active.png
+  skin/classic/browser/share-button-shared.png
   skin/classic/browser/Toolbar.png
   skin/classic/browser/Toolbar-small.png
   skin/classic/browser/urlbar-arrow.png
   skin/classic/browser/downloads/buttons.png          (downloads/buttons.png)
   skin/classic/browser/downloads/download-glow.png    (downloads/download-glow.png)
   skin/classic/browser/downloads/download-notification.png (downloads/download-notification.png)
   skin/classic/browser/downloads/downloads.css        (downloads/downloads.css)
   skin/classic/browser/feeds/feedIcon.png             (feeds/feedIcon.png)
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a87501e89b3112b507b9385d43d021e7700fb150
GIT binary patch
literal 1249
zc%17D@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3m8Da#=fE;F*!T6L?J0P
zJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRzL%CQ%e#R
zDspr3imfVamB8j&0ofp7eI*63l9Fs&C5WRUd;=7m^NUgyO!W+OlMT!a6wD0u42@09
z&CPWbj0_A7^bL&k4UKdS&8>`$tPBhkpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$
zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`<jAm(=3qqRfJl%=|nB5I->~zqG_w
zNeSkK+yc0<dBxCR0tT3VMPh-zp`L+0l0si!{7Q3k;i`*Ef>P7)t1b?yEJ)Q4N-fSW
zElLJPT$(aSbAgp}QEFmIeo;t%ehw@Y12XbU@{2R_3lyA#O%;3-lQZ)`e6V_7Un|eN
z;*!L?<Wx@=TP2`~US?*Bm9e3@o2iqFsjIP*rJ<p#fs>hqvxOOuWd@Wma&d#{b;(aI
z%}vcKf$2>_=rzNs7nBqrx>JiX%TiO^it=+6z+Se>#O)Si+-`yBO~LIJ6P$YWfsWBf
zi)fe-F!g|#@MH_*z!QFI9x$~R0h9HY+tH~E42+?kE{-7;w~~JR|8LK{G9vZAx|zZ}
z&Lm^Q2^=BcYbPcD`2OEOV0q&Yoh2DzH$NZb^jPa4rhJR_l=c0o|Nj5Z7Z<qCl9Z;9
zrf`bY>vr5{hLx@kG8{*iH~df*;6C`|qtt>OKbKlfxW#cq;TNBPKEtET6IlgP3pV_l
zDL)~K>xhE*9=1moD-wAscqhbvo+0UB%2a3?^1@o+H$$POK=&h4hq9y0iWwTaom&4f
z6|xANW-R0|n|_FQLS)f(36HhST5XM93U+))%nK?-a~i%hMF%=)33uo-eB@hkc0tP~
z&JN2)3+|5Mh8t{m8QcPjT-bw(*Eb(}XmDkNa=`S)m}1_J=ma)f?`tVXW=&`is&C{}
z<?di^1iJk*^G6c}F{V>DnKIcG?3ymK8Yme44bq>)y=~u#E1w<1o6R+ub62t_l`7P+
tA9;C0RPe;EMZ)J-F&B#HRW>j%Gt6|q@oRF+pXs1N$J5o%Wt~$(697@%rp*8V
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..cb8a11e81d899117cc02c924525c99182b7b8166
GIT binary patch
literal 1460
zc%17D@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3m8Da#=fE;F*!T6L?J0P
zJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRzL%CQ%e#R
zDspr3imfVamB8j&0ofp7eI*63l9Fs&C5WRUd;=7m^NUgyO!W+OlMT!a6wD0u42@09
z&CPWbj0_A7^bL&k4UKdS&8>`$tPBhkpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$
zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`<jAm(=3qqRfJl%=|nB5I->~zqG_w
zNeSkK+yc0<dBxCR0tT3VMPh-zp`L+0l0si!{7Q3k;i`*Ef>P7)t1b?yEJ)Q4N-fSW
zElLJPT$(aSbAgp}QEFmIeo;t%ehw@Y12XbU@{2R_3lyA#O%;3-lQZ)`e6V_7Un|eN
z;*!L?<Wx@=TP2`~US?*Bm8pr7p`o#xv#YU_rJ<p#fs>hqvxOOuWoBsZX5``q)9aF-
zT$-DjR|3<Ug3#-NQ!gkfKy;@TWtOF;xE1B+DuBIgm5JLej=0?d(VK$XElxP~>H{64
zj~3A|Az<nOG2zJ;$bl#P)I4BnF9Ig(_8`;E3=B*fo-U3d6}P5LKA3&QLF8Dv+Q~Cz
zt9M+mjWAHQ75VtUQ~T)bu8tL=Ap$A=T@?ZRO()6(Uxvl*`N3Zi!gVc7C(gwsWE;Ef
z%d^cIlS|g_b}GM^GdX9{N8cMci*>fK$xWVFx!?SLP36JXrA)UDH1Br2a^u&fl(p;E
zR@eOh*8RjjG56=+PaVO<ahYvperqT49x&ussK0kB|00Jl<Jrd5C9(bAPg*7LZ;R_%
z&1NcgL*caWfkg^k!e2{OCO=y~bxyMNcXl&gnd_2En6DRFYeewAJFxG{f7bfy;M<zc
zCft+UAD*+l@%LrenZq?)MM{_WLpHsAeyyb>b!t#@$YF+dhV6`bYY%oZ&Cz>sEj;sa
z>|?fzC$@69ivFM8uOt;4zPzF@+_3*+5z}(pj)%XJZ0|>Yln*$@$5OX^)7ur5-l|dD
zN`7YQKT4RQ{9RAl96a60lw!ZRy!ni~iMOxm^iAbmECpI`Cs!zWNjwzV<A0p%$Q%o8
z=SoK5Ka48-4@j{Udjy{0KI#AIcKw0kMKdJNOgW^`^L$mqljT30CDMh2_sY+^SaJ7;
zE3cKN9QP6b<E~3)h`PRL{A@JA!}S*POe42VHj^WchbJsOB{6%;^W3WzLLqXedY_h=
z*qeQCi>nAW-0|D^Vcpy8vk~Qv@1FkP-m>@oEwSADA0{SRTY9j1YI?K>38%VmO5OkV
zI+OW_g$vJ@Jk*f=8x>i0JR_rKg{ob*cfyUZxCh<!v8Lz#>K<TVTJfhVjODO5s2ufl
L^>bP0l+XkK)?pmz
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..86bd5ec70add448cfa5647e9448d9bb2ea5349a9
GIT binary patch
literal 1245
zc%17D@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3m8Da#=fE;F*!T6L?J0P
zJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRzL%CQ%e#R
zDspr3imfVamB8j&0ofp7eI*63l9Fs&C5WRUd;=7m^NUgyO!W+OlMT!a6wD0u42@09
z&CPWbj0_A7^bL&k4UKdS&8>`$tPBhkpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$
zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`<jAm(=3qqRfJl%=|nB5I->~zqG_w
zNeSkK+yc0<dBxCR0tT3VMPh-zp`L+0l0si!{7Q3k;i`*Ef>P7)t1b?yEJ)Q4N-fSW
zElLJPT$(aSbAgp}QEFmIeo;t%ehw@Y12XbU@{2R_3lyA#O%;3-lQZ)`e6V_7Un|eN
z;*!L?<Wx@=TP2`~US?*Bm9e3@o2iqFp{uczrJ<p#fs>hqvxOOuWd@Wma&d#{b;(aI
z%}vcKf$2>_=rzKr7nBqrx>JiX%TiO^it=+6z+Se>#OW4iH{5Q4=uN@x76Y7m^?{Dj
zM~i5f5HR(CnDAr^<iHbtY927P7Xg#C@buT085kG?JzX3_DsD}=Z0~(IK&1WQl`aJi
zr-NIw?HX1$apbvbSa`6rvbS>Oxn6N}5p>c08ZX>D<(gE;ktFS=9cBs^mYq%a9R#c_
zRX^^X<k5ELf=q?Q+r8%P@sq*|W5YYW&7*5AMCVsenXz>C_sn(K$#FIBdy6-gU6ffK
z%X)p6U%<Niq8)!)_*Gp0tP_&CF2%g1IOSs#U(mn0Ck=~Vt@X-w`r;qrI^%)l%ZBDt
zXI0L&czkG;%%34-xuB$M?vmVuv(djC*;sj8`81@aYrfa?ukbcoHt|?U#HIg?)w?Wx
zvMbvEMjbT1m%9Decd7ENRp(0Q3dJQlH1~@An%K^&>Jf6Ne*VE*mMc4-UpS_$qd(K*
zbDM5YNAc<I&7BwIg`~GVwx~?Gcu?V#$3}B6`DRt$2iLzPrrJ+<kXV|jC;W>i<!J3X
r=cDFgD(#E@@0#uE?CQ7ezxDwJ`%cC;j^?6EKn0GctDnm{r-UW|0obvI
--- a/browser/themes/pinstripe/browser.css
+++ b/browser/themes/pinstripe/browser.css
@@ -1240,18 +1240,25 @@ window[tabsontop="false"] richlistitem[t
 #page-report-button:hover:active,
 #page-report-button[open="true"] {
   -moz-image-region: rect(0, 32px, 16px, 16px);
 }
 
 /* social recommending panel */
 
 #share-button {
-  width: 16px;
-  height: 16px;
+  list-style-image: url(chrome://browser/skin/share-button.png);
+}
+
+#share-button:not([shared]):not([disabled]):hover {
+  list-style-image: url(chrome://browser/skin/share-button-active.png);
+}
+
+#share-button[shared] {
+  list-style-image: url(chrome://browser/skin/share-button-shared.png);
 }
 
 #socialUserPortrait {
   width: 48px;
   height: 48px;
 }
 
 #socialUserDisplayName,
--- a/browser/themes/pinstripe/jar.mn
+++ b/browser/themes/pinstripe/jar.mn
@@ -59,16 +59,19 @@ browser.jar:
   skin/classic/browser/feeds/videoFeedIcon.png              (feeds/feedIcon.png)
   skin/classic/browser/feeds/videoFeedIcon16.png            (feeds/feedIcon16.png)
   skin/classic/browser/feeds/audioFeedIcon.png              (feeds/feedIcon.png)
   skin/classic/browser/feeds/audioFeedIcon16.png            (feeds/feedIcon16.png)
   skin/classic/browser/newtab/newTab.css                    (newtab/newTab.css)
   skin/classic/browser/newtab/controls.png                  (newtab/controls.png)
   skin/classic/browser/newtab/noise.png                     (newtab/noise.png)
   skin/classic/browser/setDesktopBackground.css
+  skin/classic/browser/share-button.png
+  skin/classic/browser/share-button-active.png
+  skin/classic/browser/share-button-shared.png
   skin/classic/browser/monitor.png
   skin/classic/browser/monitor_16-10.png
   skin/classic/browser/places/allBookmarks.png              (places/allBookmarks.png)
 * skin/classic/browser/places/places.css                    (places/places.css)
 * skin/classic/browser/places/organizer.css                 (places/organizer.css)
   skin/classic/browser/places/query.png                     (places/query.png)
   skin/classic/browser/places/bookmarksMenu.png             (places/bookmarksMenu.png)
   skin/classic/browser/places/bookmarksToolbar.png          (places/bookmarksToolbar.png)
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a87501e89b3112b507b9385d43d021e7700fb150
GIT binary patch
literal 1249
zc%17D@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3m8Da#=fE;F*!T6L?J0P
zJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRzL%CQ%e#R
zDspr3imfVamB8j&0ofp7eI*63l9Fs&C5WRUd;=7m^NUgyO!W+OlMT!a6wD0u42@09
z&CPWbj0_A7^bL&k4UKdS&8>`$tPBhkpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$
zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`<jAm(=3qqRfJl%=|nB5I->~zqG_w
zNeSkK+yc0<dBxCR0tT3VMPh-zp`L+0l0si!{7Q3k;i`*Ef>P7)t1b?yEJ)Q4N-fSW
zElLJPT$(aSbAgp}QEFmIeo;t%ehw@Y12XbU@{2R_3lyA#O%;3-lQZ)`e6V_7Un|eN
z;*!L?<Wx@=TP2`~US?*Bm9e3@o2iqFsjIP*rJ<p#fs>hqvxOOuWd@Wma&d#{b;(aI
z%}vcKf$2>_=rzNs7nBqrx>JiX%TiO^it=+6z+Se>#O)Si+-`yBO~LIJ6P$YWfsWBf
zi)fe-F!g|#@MH_*z!QFI9x$~R0h9HY+tH~E42+?kE{-7;w~~JR|8LK{G9vZAx|zZ}
z&Lm^Q2^=BcYbPcD`2OEOV0q&Yoh2DzH$NZb^jPa4rhJR_l=c0o|Nj5Z7Z<qCl9Z;9
zrf`bY>vr5{hLx@kG8{*iH~df*;6C`|qtt>OKbKlfxW#cq;TNBPKEtET6IlgP3pV_l
zDL)~K>xhE*9=1moD-wAscqhbvo+0UB%2a3?^1@o+H$$POK=&h4hq9y0iWwTaom&4f
z6|xANW-R0|n|_FQLS)f(36HhST5XM93U+))%nK?-a~i%hMF%=)33uo-eB@hkc0tP~
z&JN2)3+|5Mh8t{m8QcPjT-bw(*Eb(}XmDkNa=`S)m}1_J=ma)f?`tVXW=&`is&C{}
z<?di^1iJk*^G6c}F{V>DnKIcG?3ymK8Yme44bq>)y=~u#E1w<1o6R+ub62t_l`7P+
tA9;C0RPe;EMZ)J-F&B#HRW>j%Gt6|q@oRF+pXs1N$J5o%Wt~$(697@%rp*8V
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..cb8a11e81d899117cc02c924525c99182b7b8166
GIT binary patch
literal 1460
zc%17D@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3m8Da#=fE;F*!T6L?J0P
zJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRzL%CQ%e#R
zDspr3imfVamB8j&0ofp7eI*63l9Fs&C5WRUd;=7m^NUgyO!W+OlMT!a6wD0u42@09
z&CPWbj0_A7^bL&k4UKdS&8>`$tPBhkpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$
zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`<jAm(=3qqRfJl%=|nB5I->~zqG_w
zNeSkK+yc0<dBxCR0tT3VMPh-zp`L+0l0si!{7Q3k;i`*Ef>P7)t1b?yEJ)Q4N-fSW
zElLJPT$(aSbAgp}QEFmIeo;t%ehw@Y12XbU@{2R_3lyA#O%;3-lQZ)`e6V_7Un|eN
z;*!L?<Wx@=TP2`~US?*Bm8pr7p`o#xv#YU_rJ<p#fs>hqvxOOuWoBsZX5``q)9aF-
zT$-DjR|3<Ug3#-NQ!gkfKy;@TWtOF;xE1B+DuBIgm5JLej=0?d(VK$XElxP~>H{64
zj~3A|Az<nOG2zJ;$bl#P)I4BnF9Ig(_8`;E3=B*fo-U3d6}P5LKA3&QLF8Dv+Q~Cz
zt9M+mjWAHQ75VtUQ~T)bu8tL=Ap$A=T@?ZRO()6(Uxvl*`N3Zi!gVc7C(gwsWE;Ef
z%d^cIlS|g_b}GM^GdX9{N8cMci*>fK$xWVFx!?SLP36JXrA)UDH1Br2a^u&fl(p;E
zR@eOh*8RjjG56=+PaVO<ahYvperqT49x&ussK0kB|00Jl<Jrd5C9(bAPg*7LZ;R_%
z&1NcgL*caWfkg^k!e2{OCO=y~bxyMNcXl&gnd_2En6DRFYeewAJFxG{f7bfy;M<zc
zCft+UAD*+l@%LrenZq?)MM{_WLpHsAeyyb>b!t#@$YF+dhV6`bYY%oZ&Cz>sEj;sa
z>|?fzC$@69ivFM8uOt;4zPzF@+_3*+5z}(pj)%XJZ0|>Yln*$@$5OX^)7ur5-l|dD
zN`7YQKT4RQ{9RAl96a60lw!ZRy!ni~iMOxm^iAbmECpI`Cs!zWNjwzV<A0p%$Q%o8
z=SoK5Ka48-4@j{Udjy{0KI#AIcKw0kMKdJNOgW^`^L$mqljT30CDMh2_sY+^SaJ7;
zE3cKN9QP6b<E~3)h`PRL{A@JA!}S*POe42VHj^WchbJsOB{6%;^W3WzLLqXedY_h=
z*qeQCi>nAW-0|D^Vcpy8vk~Qv@1FkP-m>@oEwSADA0{SRTY9j1YI?K>38%VmO5OkV
zI+OW_g$vJ@Jk*f=8x>i0JR_rKg{ob*cfyUZxCh<!v8Lz#>K<TVTJfhVjODO5s2ufl
L^>bP0l+XkK)?pmz
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..86bd5ec70add448cfa5647e9448d9bb2ea5349a9
GIT binary patch
literal 1245
zc%17D@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3m8Da#=fE;F*!T6L?J0P
zJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRzL%CQ%e#R
zDspr3imfVamB8j&0ofp7eI*63l9Fs&C5WRUd;=7m^NUgyO!W+OlMT!a6wD0u42@09
z&CPWbj0_A7^bL&k4UKdS&8>`$tPBhkpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$
zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`<jAm(=3qqRfJl%=|nB5I->~zqG_w
zNeSkK+yc0<dBxCR0tT3VMPh-zp`L+0l0si!{7Q3k;i`*Ef>P7)t1b?yEJ)Q4N-fSW
zElLJPT$(aSbAgp}QEFmIeo;t%ehw@Y12XbU@{2R_3lyA#O%;3-lQZ)`e6V_7Un|eN
z;*!L?<Wx@=TP2`~US?*Bm9e3@o2iqFp{uczrJ<p#fs>hqvxOOuWd@Wma&d#{b;(aI
z%}vcKf$2>_=rzKr7nBqrx>JiX%TiO^it=+6z+Se>#OW4iH{5Q4=uN@x76Y7m^?{Dj
zM~i5f5HR(CnDAr^<iHbtY927P7Xg#C@buT085kG?JzX3_DsD}=Z0~(IK&1WQl`aJi
zr-NIw?HX1$apbvbSa`6rvbS>Oxn6N}5p>c08ZX>D<(gE;ktFS=9cBs^mYq%a9R#c_
zRX^^X<k5ELf=q?Q+r8%P@sq*|W5YYW&7*5AMCVsenXz>C_sn(K$#FIBdy6-gU6ffK
z%X)p6U%<Niq8)!)_*Gp0tP_&CF2%g1IOSs#U(mn0Ck=~Vt@X-w`r;qrI^%)l%ZBDt
zXI0L&czkG;%%34-xuB$M?vmVuv(djC*;sj8`81@aYrfa?ukbcoHt|?U#HIg?)w?Wx
zvMbvEMjbT1m%9Decd7ENRp(0Q3dJQlH1~@An%K^&>Jf6Ne*VE*mMc4-UpS_$qd(K*
zbDM5YNAc<I&7BwIg`~GVwx~?Gcu?V#$3}B6`DRt$2iLzPrrJ+<kXV|jC;W>i<!J3X
r=cDFgD(#E@@0#uE?CQ7ezxDwJ`%cC;j^?6EKn0GctDnm{r-UW|0obvI
--- a/browser/themes/winstripe/browser.css
+++ b/browser/themes/winstripe/browser.css
@@ -1631,18 +1631,25 @@ richlistitem[type~="action"][actiontype=
 #page-report-button:hover:active,
 #page-report-button[open="true"] {
   -moz-image-region: rect(0, 48px, 16px, 32px);
 }
 
 /* social recommending panel */
 
 #share-button {
-  width: 16px;
-  height: 16px;
+  list-style-image: url(chrome://browser/skin/share-button.png);
+}
+
+#share-button:not([shared]):not([disabled]):hover {
+  list-style-image: url(chrome://browser/skin/share-button-active.png);
+}
+
+#share-button[shared] {
+  list-style-image: url(chrome://browser/skin/share-button-shared.png);
 }
 
 #socialUserPortrait {
   width: 48px;
   height: 48px;
 }
 
 #socialUserDisplayName,
--- a/browser/themes/winstripe/jar.mn
+++ b/browser/themes/winstripe/jar.mn
@@ -45,16 +45,19 @@ browser.jar:
         skin/classic/browser/Secure24.png                            (Secure24.png)
         skin/classic/browser/Toolbar.png                             (Toolbar.png)
         skin/classic/browser/Toolbar-inverted.png
         skin/classic/browser/toolbarbutton-dropdown-arrow.png
         skin/classic/browser/toolbarbutton-dropdown-arrow-inverted.png
         skin/classic/browser/searchbar.css                           (searchbar.css)
         skin/classic/browser/searchbar-dropdown-arrow.png
         skin/classic/browser/setDesktopBackground.css
+        skin/classic/browser/share-button.png
+        skin/classic/browser/share-button-active.png
+        skin/classic/browser/share-button-shared.png
         skin/classic/browser/menu-back.png                           (menu-back.png)
         skin/classic/browser/menu-forward.png                        (menu-forward.png)
         skin/classic/browser/monitor.png
         skin/classic/browser/monitor_16-10.png
         skin/classic/browser/urlbar-arrow.png
         skin/classic/browser/urlbar-popup-blocked.png
         skin/classic/browser/urlbar-history-dropmarker.png
         skin/classic/browser/downloads/buttons.png                   (downloads/buttons.png)
@@ -246,16 +249,19 @@ browser.jar:
         skin/classic/aero/browser/Secure24.png                       (Secure24-aero.png)
         skin/classic/aero/browser/Toolbar.png
         skin/classic/aero/browser/Toolbar-inverted.png
         skin/classic/aero/browser/toolbarbutton-dropdown-arrow.png
         skin/classic/aero/browser/toolbarbutton-dropdown-arrow-inverted.png
         skin/classic/aero/browser/searchbar.css                      (searchbar.css)
         skin/classic/aero/browser/searchbar-dropdown-arrow.png       (searchbar-dropdown-arrow-aero.png)
         skin/classic/aero/browser/setDesktopBackground.css
+        skin/classic/aero/browser/share-button.png
+        skin/classic/aero/browser/share-button-active.png
+        skin/classic/aero/browser/share-button-shared.png
         skin/classic/aero/browser/menu-back.png                      (menu-back-aero.png)
         skin/classic/aero/browser/menu-forward.png                   (menu-forward-aero.png)
         skin/classic/aero/browser/monitor.png
         skin/classic/aero/browser/monitor_16-10.png
         skin/classic/aero/browser/urlbar-arrow.png
         skin/classic/aero/browser/urlbar-popup-blocked.png
         skin/classic/aero/browser/urlbar-history-dropmarker.png
         skin/classic/aero/browser/downloads/buttons.png              (downloads/buttons-aero.png)
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a87501e89b3112b507b9385d43d021e7700fb150
GIT binary patch
literal 1249
zc%17D@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3m8Da#=fE;F*!T6L?J0P
zJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRzL%CQ%e#R
zDspr3imfVamB8j&0ofp7eI*63l9Fs&C5WRUd;=7m^NUgyO!W+OlMT!a6wD0u42@09
z&CPWbj0_A7^bL&k4UKdS&8>`$tPBhkpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$
zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`<jAm(=3qqRfJl%=|nB5I->~zqG_w
zNeSkK+yc0<dBxCR0tT3VMPh-zp`L+0l0si!{7Q3k;i`*Ef>P7)t1b?yEJ)Q4N-fSW
zElLJPT$(aSbAgp}QEFmIeo;t%ehw@Y12XbU@{2R_3lyA#O%;3-lQZ)`e6V_7Un|eN
z;*!L?<Wx@=TP2`~US?*Bm9e3@o2iqFsjIP*rJ<p#fs>hqvxOOuWd@Wma&d#{b;(aI
z%}vcKf$2>_=rzNs7nBqrx>JiX%TiO^it=+6z+Se>#O)Si+-`yBO~LIJ6P$YWfsWBf
zi)fe-F!g|#@MH_*z!QFI9x$~R0h9HY+tH~E42+?kE{-7;w~~JR|8LK{G9vZAx|zZ}
z&Lm^Q2^=BcYbPcD`2OEOV0q&Yoh2DzH$NZb^jPa4rhJR_l=c0o|Nj5Z7Z<qCl9Z;9
zrf`bY>vr5{hLx@kG8{*iH~df*;6C`|qtt>OKbKlfxW#cq;TNBPKEtET6IlgP3pV_l
zDL)~K>xhE*9=1moD-wAscqhbvo+0UB%2a3?^1@o+H$$POK=&h4hq9y0iWwTaom&4f
z6|xANW-R0|n|_FQLS)f(36HhST5XM93U+))%nK?-a~i%hMF%=)33uo-eB@hkc0tP~
z&JN2)3+|5Mh8t{m8QcPjT-bw(*Eb(}XmDkNa=`S)m}1_J=ma)f?`tVXW=&`is&C{}
z<?di^1iJk*^G6c}F{V>DnKIcG?3ymK8Yme44bq>)y=~u#E1w<1o6R+ub62t_l`7P+
tA9;C0RPe;EMZ)J-F&B#HRW>j%Gt6|q@oRF+pXs1N$J5o%Wt~$(697@%rp*8V
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..cb8a11e81d899117cc02c924525c99182b7b8166
GIT binary patch
literal 1460
zc%17D@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3m8Da#=fE;F*!T6L?J0P
zJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRzL%CQ%e#R
zDspr3imfVamB8j&0ofp7eI*63l9Fs&C5WRUd;=7m^NUgyO!W+OlMT!a6wD0u42@09
z&CPWbj0_A7^bL&k4UKdS&8>`$tPBhkpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$
zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`<jAm(=3qqRfJl%=|nB5I->~zqG_w
zNeSkK+yc0<dBxCR0tT3VMPh-zp`L+0l0si!{7Q3k;i`*Ef>P7)t1b?yEJ)Q4N-fSW
zElLJPT$(aSbAgp}QEFmIeo;t%ehw@Y12XbU@{2R_3lyA#O%;3-lQZ)`e6V_7Un|eN
z;*!L?<Wx@=TP2`~US?*Bm8pr7p`o#xv#YU_rJ<p#fs>hqvxOOuWoBsZX5``q)9aF-
zT$-DjR|3<Ug3#-NQ!gkfKy;@TWtOF;xE1B+DuBIgm5JLej=0?d(VK$XElxP~>H{64
zj~3A|Az<nOG2zJ;$bl#P)I4BnF9Ig(_8`;E3=B*fo-U3d6}P5LKA3&QLF8Dv+Q~Cz
zt9M+mjWAHQ75VtUQ~T)bu8tL=Ap$A=T@?ZRO()6(Uxvl*`N3Zi!gVc7C(gwsWE;Ef
z%d^cIlS|g_b}GM^GdX9{N8cMci*>fK$xWVFx!?SLP36JXrA)UDH1Br2a^u&fl(p;E
zR@eOh*8RjjG56=+PaVO<ahYvperqT49x&ussK0kB|00Jl<Jrd5C9(bAPg*7LZ;R_%
z&1NcgL*caWfkg^k!e2{OCO=y~bxyMNcXl&gnd_2En6DRFYeewAJFxG{f7bfy;M<zc
zCft+UAD*+l@%LrenZq?)MM{_WLpHsAeyyb>b!t#@$YF+dhV6`bYY%oZ&Cz>sEj;sa
z>|?fzC$@69ivFM8uOt;4zPzF@+_3*+5z}(pj)%XJZ0|>Yln*$@$5OX^)7ur5-l|dD
zN`7YQKT4RQ{9RAl96a60lw!ZRy!ni~iMOxm^iAbmECpI`Cs!zWNjwzV<A0p%$Q%o8
z=SoK5Ka48-4@j{Udjy{0KI#AIcKw0kMKdJNOgW^`^L$mqljT30CDMh2_sY+^SaJ7;
zE3cKN9QP6b<E~3)h`PRL{A@JA!}S*POe42VHj^WchbJsOB{6%;^W3WzLLqXedY_h=
z*qeQCi>nAW-0|D^Vcpy8vk~Qv@1FkP-m>@oEwSADA0{SRTY9j1YI?K>38%VmO5OkV
zI+OW_g$vJ@Jk*f=8x>i0JR_rKg{ob*cfyUZxCh<!v8Lz#>K<TVTJfhVjODO5s2ufl
L^>bP0l+XkK)?pmz
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..86bd5ec70add448cfa5647e9448d9bb2ea5349a9
GIT binary patch
literal 1245
zc%17D@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3m8Da#=fE;F*!T6L?J0P
zJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRzL%CQ%e#R
zDspr3imfVamB8j&0ofp7eI*63l9Fs&C5WRUd;=7m^NUgyO!W+OlMT!a6wD0u42@09
z&CPWbj0_A7^bL&k4UKdS&8>`$tPBhkpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$
zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`<jAm(=3qqRfJl%=|nB5I->~zqG_w
zNeSkK+yc0<dBxCR0tT3VMPh-zp`L+0l0si!{7Q3k;i`*Ef>P7)t1b?yEJ)Q4N-fSW
zElLJPT$(aSbAgp}QEFmIeo;t%ehw@Y12XbU@{2R_3lyA#O%;3-lQZ)`e6V_7Un|eN
z;*!L?<Wx@=TP2`~US?*Bm9e3@o2iqFp{uczrJ<p#fs>hqvxOOuWd@Wma&d#{b;(aI
z%}vcKf$2>_=rzKr7nBqrx>JiX%TiO^it=+6z+Se>#OW4iH{5Q4=uN@x76Y7m^?{Dj
zM~i5f5HR(CnDAr^<iHbtY927P7Xg#C@buT085kG?JzX3_DsD}=Z0~(IK&1WQl`aJi
zr-NIw?HX1$apbvbSa`6rvbS>Oxn6N}5p>c08ZX>D<(gE;ktFS=9cBs^mYq%a9R#c_
zRX^^X<k5ELf=q?Q+r8%P@sq*|W5YYW&7*5AMCVsenXz>C_sn(K$#FIBdy6-gU6ffK
z%X)p6U%<Niq8)!)_*Gp0tP_&CF2%g1IOSs#U(mn0Ck=~Vt@X-w`r;qrI^%)l%ZBDt
zXI0L&czkG;%%34-xuB$M?vmVuv(djC*;sj8`81@aYrfa?ukbcoHt|?U#HIg?)w?Wx
zvMbvEMjbT1m%9Decd7ENRp(0Q3dJQlH1~@An%K^&>Jf6Ne*VE*mMc4-UpS_$qd(K*
zbDM5YNAc<I&7BwIg`~GVwx~?Gcu?V#$3}B6`DRt$2iLzPrrJ+<kXV|jC;W>i<!J3X
r=cDFgD(#E@@0#uE?CQ7ezxDwJ`%cC;j^?6EKn0GctDnm{r-UW|0obvI