From 910a1d704e35d5789e4a8c34efa89ed8d7f3bf9d Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Tue, 6 Nov 2018 17:11:22 +0200
Subject: SL-10001 Fixed position parameters trembling at the top of the page
 when moving

---
 indra/newview/llmanip.cpp | 71 ++++++++++++++++++++++++++---------------------
 1 file changed, 40 insertions(+), 31 deletions(-)

diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp
index 8567180dd6..1dc03123eb 100644
--- a/indra/newview/llmanip.cpp
+++ b/indra/newview/llmanip.cpp
@@ -431,7 +431,6 @@ void LLManip::renderXYZ(const LLVector3 &vec)
 {
 	const S32 PAD = 10;
 	std::string feedback_string;
-	LLVector3 camera_pos = LLViewerCamera::getInstance()->getOrigin() + LLViewerCamera::getInstance()->getAtAxis();
 	S32 window_center_x = gViewerWindow->getWorldViewRectScaled().getWidth() / 2;
 	S32 window_center_y = gViewerWindow->getWorldViewRectScaled().getHeight() / 2;
 	S32 vertical_offset = window_center_y - VERTICAL_OFFSET;
@@ -451,37 +450,47 @@ void LLManip::renderXYZ(const LLVector3 &vec)
 			235,
 			PAD * 2 + 10, 
 			LLColor4(0.f, 0.f, 0.f, 0.7f) );
-	}
-	gGL.popMatrix();
-
-	gViewerWindow->setup3DRender();
 
-	{
-		LLFontGL* font = LLFontGL::getFontSansSerif();
-		LLLocale locale(LLLocale::USER_LOCALE);
-		LLGLDepthTest gls_depth(GL_FALSE);
-		// render drop shadowed text
-		feedback_string = llformat("X: %.3f", vec.mV[VX]);
-		hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -102.f + 1.f, (F32)vertical_offset - 1.f, LLColor4::black, FALSE);
-
-		feedback_string = llformat("Y: %.3f", vec.mV[VY]);
-		hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -27.f + 1.f, (F32)vertical_offset - 1.f, LLColor4::black, FALSE);
-		
-		feedback_string = llformat("Z: %.3f", vec.mV[VZ]);
-		hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, 48.f + 1.f, (F32)vertical_offset - 1.f, LLColor4::black, FALSE);
-
-		// render text on top
-		feedback_string = llformat("X: %.3f", vec.mV[VX]);
-		hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -102.f, (F32)vertical_offset, LLColor4(1.f, 0.5f, 0.5f, 1.f), FALSE);
-
-		gGL.diffuseColor3f(0.5f, 1.f, 0.5f);
-		feedback_string = llformat("Y: %.3f", vec.mV[VY]);
-		hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -27.f, (F32)vertical_offset, LLColor4(0.5f, 1.f, 0.5f, 1.f), FALSE);
-		
-		gGL.diffuseColor3f(0.5f, 0.5f, 1.f);
-		feedback_string = llformat("Z: %.3f", vec.mV[VZ]);
-		hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, 48.f, (F32)vertical_offset, LLColor4(0.5f, 0.5f, 1.f, 1.f), FALSE);
-	}
+        LLFontGL* font = LLFontGL::getFontSansSerif();
+        LLLocale locale(LLLocale::USER_LOCALE);
+        LLGLDepthTest gls_depth(GL_FALSE);
+
+        // render drop shadowed text (manually because of bigger 'distance')
+        F32 right_x;
+        feedback_string = llformat("X: %.3f", vec.mV[VX]);
+        font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 102.f + 1.f, window_center_y + vertical_offset - 2.f, LLColor4::black,
+            LLFontGL::LEFT, LLFontGL::BASELINE,
+            LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x);
+
+        feedback_string = llformat("Y: %.3f", vec.mV[VY]);
+        font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 27.f + 1.f, window_center_y + vertical_offset - 2.f, LLColor4::black,
+            LLFontGL::LEFT, LLFontGL::BASELINE,
+            LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x);
+
+        feedback_string = llformat("Z: %.3f", vec.mV[VZ]);
+        font->render(utf8str_to_wstring(feedback_string), 0, window_center_x + 48.f + 1.f, window_center_y + vertical_offset - 2.f, LLColor4::black,
+            LLFontGL::LEFT, LLFontGL::BASELINE,
+            LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x);
+
+        // render text on top
+        feedback_string = llformat("X: %.3f", vec.mV[VX]);
+        font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 102.f, window_center_y + vertical_offset, LLColor4(1.f, 0.5f, 0.5f, 1.f),
+            LLFontGL::LEFT, LLFontGL::BASELINE,
+            LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x);
+
+        feedback_string = llformat("Y: %.3f", vec.mV[VY]);
+        font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 27.f, window_center_y + vertical_offset, LLColor4(0.5f, 1.f, 0.5f, 1.f),
+            LLFontGL::LEFT, LLFontGL::BASELINE,
+            LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x);
+
+        feedback_string = llformat("Z: %.3f", vec.mV[VZ]);
+        font->render(utf8str_to_wstring(feedback_string), 0, window_center_x + 48.f, window_center_y + vertical_offset, LLColor4(0.5f, 0.5f, 1.f, 1.f),
+            LLFontGL::LEFT, LLFontGL::BASELINE,
+            LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x);
+    }
+    gGL.popMatrix();
+
+    gViewerWindow->setup3DRender();
 }
 
 void LLManip::renderTickText(const LLVector3& pos, const std::string& text, const LLColor4 &color)
-- 
cgit v1.2.3


From 88956491c819525fa07c1d347056f6a6900b4881 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Wed, 7 Nov 2018 18:21:16 +0200
Subject: SL-9414 Inconsistent hover vs click action when viewed through
 transparent prims

---
 indra/newview/lltoolpie.cpp | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 5082e16685..d8f63b9332 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -112,8 +112,22 @@ BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
 	mMouseDownX = x;
 	mMouseDownY = y;
 
-	//left mouse down always picks transparent (but see handleMouseUp)
-	mPick = gViewerWindow->pickImmediate(x, y, TRUE, FALSE);
+
+	mPick = gViewerWindow->pickImmediate(x, y, FALSE, FALSE);
+	LLViewerObject *object = mPick.getObject();
+	LLViewerObject *parent = object ? object->getRootEdit() : NULL;
+	if (!object
+		|| object->isAttachment()
+		|| object->getClickAction() == CLICK_ACTION_DISABLED
+		|| (!useClickAction(mask, object, parent) && !object->flagHandleTouch() && !(parent && parent->flagHandleTouch())))
+	{
+		// Unless we are hovering over actionable visible object
+		// left mouse down always picks transparent (but see handleMouseUp).
+		// Also see LLToolPie::handleHover() - priorities are a bit different there.
+		// Todo: we need a more consistent set of rules to work with
+		mPick = gViewerWindow->pickImmediate(x, y, TRUE /*transparent*/, FALSE);
+	}
+
 	mPick.mKeyMask = mask;
 
 	mMouseButtonDown = true;
-- 
cgit v1.2.3


From 592d455cef5ea8be31aef66195c2fc64fc7bbb1f Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Fri, 9 Nov 2018 16:44:06 +0200
Subject: SL-10018 FIXED Viewer crashes when clicking on a link of a folder in
 Inventory

---
 indra/newview/llinventorypanel.cpp | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 45dbb446eb..3992b506e9 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -1163,6 +1163,11 @@ void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& it
 			LLFolderViewModelItemInventory* fve_listener = static_cast<LLFolderViewModelItemInventory*>(folder_item->getViewModelItem());
 			if (fve_listener && (fve_listener->getInventoryType() == LLInventoryType::IT_CATEGORY))
 			{
+				if (fve_listener->getInventoryObject() && fve_listener->getInventoryObject()->getIsLinkType())
+				{
+					return;
+				}
+
 				if(prev_folder_item)
 				{
 					LLFolderBridge* prev_bridge = (LLFolderBridge*)prev_folder_item->getViewModelItem();
-- 
cgit v1.2.3


From 2d222309500a667cd8880172daa8f3d2088596b6 Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Mon, 12 Nov 2018 15:31:19 +0200
Subject: SL-9935 Include full win10 build number in Help > About Second Life
 and logs

---
 indra/llcommon/llsys.cpp | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 1ef6c538ba..1f8d558fbe 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -268,10 +268,32 @@ LLOSInfo::LLOSInfo() :
 		}
 	}
 
+	S32 ubr = 0; // Windows 10 Update Build Revision, can be retrieved from a registry
+	if (mMajorVer == 10)
+	{
+		DWORD cbData(sizeof(DWORD));
+		DWORD data(0);
+		HKEY key;
+		BOOL ret_code = RegOpenKeyExW(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), 0, KEY_READ, &key);
+		if (ERROR_SUCCESS == ret_code)
+		{
+			ret_code = RegQueryValueExW(key, L"UBR", 0, NULL, reinterpret_cast<LPBYTE>(&data), &cbData);
+			if (ERROR_SUCCESS == ret_code)
+			{
+				ubr = data;
+			}
+		}
+	}
+
 	mOSString = mOSStringSimple;
 	if (mBuild > 0)
 	{
-		mOSString += llformat("(Build %d)", mBuild);
+		mOSString += llformat("(Build %d", mBuild);
+		if (ubr > 0)
+		{
+			mOSString += llformat(".%d", ubr);
+		}
+		mOSString += ")";
 	}
 
 	LLStringUtil::trim(mOSStringSimple);
-- 
cgit v1.2.3


From 5356e8b81a4c79bd9725ba4e6409b1b76083f463 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Mon, 12 Nov 2018 17:24:03 +0200
Subject: SL-10043 FIXED Viewer crashes when double-clicking 'For sale' parcel
 icon on World map in some cases

---
 indra/newview/llworldmapview.cpp | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 707fe76cef..b88631a71b 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -1751,9 +1751,12 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask )
 		case MAP_ITEM_LAND_FOR_SALE_ADULT:
 			{
 				LLVector3d pos_global = viewPosToGlobal(x, y);
-				LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global);
-				LLFloaterReg::hideInstance("world_map");
-				LLFloaterReg::showInstance("search", LLSD().with("category", "land").with("query", info->getName()));
+				std::string sim_name;
+				if (LLWorldMap::getInstance()->simNameFromPosGlobal(pos_global, sim_name))
+				{
+					LLFloaterReg::hideInstance("world_map");
+					LLFloaterReg::showInstance("search", LLSD().with("category", "land").with("query", sim_name));
+				}
 				break;
 			}
 		case MAP_ITEM_CLASSIFIED:
-- 
cgit v1.2.3


From 31be136d4056e02cbf5c377f3544235debb7376b Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Tue, 13 Nov 2018 20:00:47 +0200
Subject: SL-10042 Fixed hang in inventory floater

---
 indra/newview/llfloateravatarpicker.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp
index c5561fe011..33099db1b9 100644
--- a/indra/newview/llfloateravatarpicker.cpp
+++ b/indra/newview/llfloateravatarpicker.cpp
@@ -812,7 +812,7 @@ bool LLFloaterAvatarPicker::isSelectBtnEnabled()
 {
 	bool ret_val = visibleItemsSelected();
 
-	if ( ret_val )
+	if ( ret_val && !isMinimized())
 	{
 		std::string acvtive_panel_name;
 		LLScrollListCtrl* list =  NULL;
-- 
cgit v1.2.3


From e867e619dbb62b4c9ebc1d358c6fea048f87190c Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Thu, 15 Nov 2018 00:27:26 +0200
Subject: build fix

---
 indra/newview/lltoolpie.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 5cfb2026e0..1b76d249cb 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -111,7 +111,7 @@ BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
     mMouseOutsideSlop = FALSE;
 	mMouseDownX = x;
 	mMouseDownY = y;
-	LLTimer pick_timer;.
+	LLTimer pick_timer;
 	BOOL pick_rigged = false; //gSavedSettings.getBOOL("AnimatedObjectsAllowLeftClick");
 	mPick = gViewerWindow->pickImmediate(x, y, FALSE, pick_rigged);
 	LLViewerObject *object = mPick.getObject();
-- 
cgit v1.2.3


From ab0d3f09d7a356eae758de03d533fabb3a380da1 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Wed, 14 Nov 2018 17:15:11 +0200
Subject: SL-9975 All offline inventory offers from scripted objects are lost

---
 indra/newview/llimprocessing.cpp | 32 +++++++++++++++++++++++++-------
 1 file changed, 25 insertions(+), 7 deletions(-)

diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index e76b3d118e..d59c301210 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -854,15 +854,33 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
             }
             else // IM_TASK_INVENTORY_OFFERED
             {
-                if (sizeof(S8) != binary_bucket_size)
+                if (offline == IM_OFFLINE && session_id.isNull() && aux_id.notNull() && binary_bucket_size > sizeof(S8)* 5)
                 {
-                    LL_WARNS("Messaging") << "Malformed inventory offer from object" << LL_ENDL;
-                    delete info;
-                    break;
+                    // cap received offline message
+                    std::string str_bucket = ll_safe_string((char*)binary_bucket, binary_bucket_size);
+                    typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
+                    boost::char_separator<char> sep("|", "", boost::keep_empty_tokens);
+                    tokenizer tokens(str_bucket, sep);
+                    tokenizer::iterator iter = tokens.begin();
+
+                    info->mType = (LLAssetType::EType)(atoi((*(iter++)).c_str()));
+                    // Note There is more elements in 'tokens' ...
+
+                    info->mObjectID = LLUUID::null;
+                    info->mFromObject = TRUE;
+                }
+                else
+                {
+                    if (sizeof(S8) != binary_bucket_size)
+                    {
+                        LL_WARNS("Messaging") << "Malformed inventory offer from object" << LL_ENDL;
+                        delete info;
+                        break;
+                    }
+                    info->mType = (LLAssetType::EType) binary_bucket[0];
+                    info->mObjectID = LLUUID::null;
+                    info->mFromObject = TRUE;
                 }
-                info->mType = (LLAssetType::EType) binary_bucket[0];
-                info->mObjectID = LLUUID::null;
-                info->mFromObject = TRUE;
             }
 
             info->mIM = dialog;
-- 
cgit v1.2.3


From 6e934b1dba3928559e8eea619910cb61df3d2472 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Thu, 15 Nov 2018 15:14:00 +0200
Subject: SL-9782 Fixed The Stand button doesn't lay anymore on the lower bar

---
 indra/newview/llmoveview.cpp | 16 ----------------
 indra/newview/llmoveview.h   |  2 --
 2 files changed, 18 deletions(-)

diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index 301487b994..19f238d99a 100644
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -702,11 +702,9 @@ void LLPanelStandStopFlying::updatePosition()
 {
 	if (mAttached) return;
 
-	S32 y_pos = 0;
 	S32 bottom_tb_center = 0;
 	if (LLToolBar* toolbar_bottom = gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_BOTTOM))
 	{
-		y_pos = toolbar_bottom->getRect().getHeight();
 		bottom_tb_center = toolbar_bottom->getRect().getCenterX();
 	}
 
@@ -716,20 +714,6 @@ void LLPanelStandStopFlying::updatePosition()
 		left_tb_width = toolbar_left->getRect().getWidth();
 	}
 
-	if (!mStateManagementButtons.get()) // Obsolete?!!
-	{
-		LLPanel* panel_ssf_container = gToolBarView->getChild<LLPanel>("state_management_buttons_container");
-		if (panel_ssf_container)
-		{
-			mStateManagementButtons = panel_ssf_container->getHandle();
-		}
-	}
-
-	if(LLPanel* panel_ssf_container = mStateManagementButtons.get())
-	{
-		panel_ssf_container->setOrigin(0, y_pos);
-	}
-
 	if (gToolBarView != NULL && gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_LEFT)->hasButtons())
 	{
 		S32 x_pos = bottom_tb_center - getRect().getWidth() / 2 - left_tb_width;
diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h
index 4a31f2a814..e8b9a6fdb2 100644
--- a/indra/newview/llmoveview.h
+++ b/indra/newview/llmoveview.h
@@ -172,8 +172,6 @@ private:
 	 */
 	LLHandle<LLPanel> mOriginalParent;
 
-	LLHandle<LLPanel> mStateManagementButtons;
-
 	/**
 	 * True if the panel is currently attached to the movement controls floater.
 	 * 
-- 
cgit v1.2.3


From cd3608e661c3e2cab0fab25e11647ae8ee8285bd Mon Sep 17 00:00:00 2001
From: Mnikolenko ProductEngine <mnikolenko@productengine.com>
Date: Fri, 16 Nov 2018 15:53:52 +0200
Subject: SL-10023 FIXED Dragging mouse on World map sometimes causes cursor
 jump to the center of the screen

---
 indra/llwindow/llopenglview-objc.mm | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm
index c8c086d705..8923ea6458 100644
--- a/indra/llwindow/llopenglview-objc.mm
+++ b/indra/llwindow/llopenglview-objc.mm
@@ -322,6 +322,10 @@ attributedStringInfo getSegments(NSAttributedString *str)
 
 - (void) mouseDown:(NSEvent *)theEvent
 {
+    NSPoint mPoint = [theEvent locationInWindow];
+    mMousePos[0] = mPoint.x;
+    mMousePos[1] = mPoint.y;
+
     // Apparently people still use this?
     if ([theEvent modifierFlags] & NSCommandKeyMask &&
         !([theEvent modifierFlags] & NSControlKeyMask) &&
-- 
cgit v1.2.3


From e0072664237b6ac0cae45577b436e5a25800e2f1 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Mon, 19 Nov 2018 17:24:06 +0200
Subject: SL-5366 FIXED Chinese characters are not displaying correctly in TOS
 loading text

---
 indra/newview/skins/default/xui/zh/floater_tos.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/zh/floater_tos.xml b/indra/newview/skins/default/xui/zh/floater_tos.xml
index 4cac07cd21..2f02316fc0 100644
--- a/indra/newview/skins/default/xui/zh/floater_tos.xml
+++ b/indra/newview/skins/default/xui/zh/floater_tos.xml
@@ -4,7 +4,7 @@
 		http://secondlife.com/app/tos/
 	</floater.string>
 	<floater.string name="loading_url">
-		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E 正在載入 %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+		data:text/html;charset=utf-8,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E 正在載入 %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
 	</floater.string>
 	<text name="tos_heading">
 		請閱讀並遵守Second Life使用條款、隱私政策、服務條款,包括同意在發生爭議時接受仲裁並放棄採取集體或群體求訴的規定。 繼續登入[SECOND_LIFE]前,你必須同意這些條款。
-- 
cgit v1.2.3


From a72a4cb394fcce65b10126d631b270acf6009eb4 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Fri, 16 Nov 2018 17:42:31 +0200
Subject: SL-4730 Reduce bias trashing

---
 indra/newview/llviewertexture.cpp | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index d5aa249883..d2157f33cf 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -474,6 +474,7 @@ void LLViewerTexture::initClass()
 // tuning params
 const F32 discard_bias_delta = .25f;
 const F32 discard_delta_time = 0.5f;
+const F32 GPU_MEMORY_CHECK_WAIT_TIME = 1.0f;
 // non-const (used externally
 F32 texmem_lower_bound_scale = 0.85f;
 F32 texmem_middle_bound_scale = 0.925f;
@@ -483,12 +484,12 @@ static LLTrace::BlockTimerStatHandle FTM_TEXTURE_MEMORY_CHECK("Memory Check");
 //static 
 bool LLViewerTexture::isMemoryForTextureLow()
 {
-	const F32 WAIT_TIME = 1.0f; //second
 	static LLFrameTimer timer;
+	static bool low_mem = false;
 
-	if(timer.getElapsedTimeF32() < WAIT_TIME) //call this once per second.
+	if(timer.getElapsedTimeF32() < GPU_MEMORY_CHECK_WAIT_TIME) //call this once per second.
 	{
-		return false;
+		return low_mem;
 	}
 	timer.reset();
 
@@ -497,7 +498,7 @@ bool LLViewerTexture::isMemoryForTextureLow()
 	const S32Megabytes MIN_FREE_TEXTURE_MEMORY(20); //MB Changed to 20 MB per MAINT-6882
 	const S32Megabytes MIN_FREE_MAIN_MEMORY(100); //MB	
 
-	bool low_mem = false;
+	low_mem = false;
 	if (gGLManager.mHasATIMemInfo)
 	{
 		S32 meminfo[4];
@@ -572,10 +573,14 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity
 			sEvaluationTimer.reset();
 		}
 	}
-	else if(sEvaluationTimer.getElapsedTimeF32() > discard_delta_time && isMemoryForTextureLow())
+	else if(isMemoryForTextureLow())
 	{
-		sDesiredDiscardBias += discard_bias_delta;
-		sEvaluationTimer.reset();
+		// Note: isMemoryForTextureLow() uses 1s delay, make sure we waited enough for it to restore
+		if (sEvaluationTimer.getElapsedTimeF32() > GPU_MEMORY_CHECK_WAIT_TIME)
+		{
+			sDesiredDiscardBias += discard_bias_delta;
+			sEvaluationTimer.reset();
+		}
 	}
 	else if (sDesiredDiscardBias > 0.0f &&
 			 sBoundTextureMemory < sMaxBoundTextureMemory * texmem_lower_bound_scale &&
-- 
cgit v1.2.3


From ca9d39c6c7f0acd2cf6f8a6e894d09dcf8e6a353 Mon Sep 17 00:00:00 2001
From: Cinder <cinder@sdf.org>
Date: Thu, 25 Aug 2016 13:42:37 -0500
Subject: SL-3404 Don't send ParcelPropertiesRequest on every cursor position
 change

---
 doc/contributions.txt       |  1 +
 indra/newview/lltoolpie.cpp | 10 ++++------
 2 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/doc/contributions.txt b/doc/contributions.txt
index a09b6aff43..88b2a77393 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -371,6 +371,7 @@ Cinder Roxley
     STORM-2116
     STORM-2127
     STORM-2144
+    SL-3404
 Clara Young
 Coaldust Numbers
     VWR-1095
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 1b76d249cb..697db01d11 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -870,13 +870,11 @@ static bool needs_tooltip(LLSelectNode* nodep)
 
 BOOL LLToolPie::handleTooltipLand(std::string line, std::string tooltip_msg)
 {
-	LLViewerParcelMgr::getInstance()->setHoverParcel( mHoverPick.mPosGlobal );
-	// 
-	//  Do not show hover for land unless prefs are set to allow it.
-	// 
-	
+	//  Do not show hover for land unless prefs are set to allow it. 
 	if (!gSavedSettings.getBOOL("ShowLandHoverTip")) return TRUE; 
-	
+
+	LLViewerParcelMgr::getInstance()->setHoverParcel( mHoverPick.mPosGlobal );
+
 	// Didn't hit an object, but since we have a land point we
 	// must be hovering over land.
 	
-- 
cgit v1.2.3


From 4f6037a823b3d53a9051aec172cf432c63775b39 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Mon, 19 Nov 2018 19:20:57 +0200
Subject: SL-3404 Named log output for easier debugging and testing

---
 indra/newview/llviewerparcelmgr.cpp | 28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index f4d14a39fe..5477d2d444 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -957,7 +957,7 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id)
 		return;
 	}
 
-	LL_INFOS() << "Claiming " << mWestSouth << " to " << mEastNorth << LL_ENDL;
+	LL_INFOS("ParcelMgr") << "Claiming " << mWestSouth << " to " << mEastNorth << LL_ENDL;
 
 	// BUG: Only works for the region containing mWestSouthBottom
 	LLVector3d east_north_region_check( mEastNorth );
@@ -980,7 +980,7 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id)
 		return;
 	}
 
-	LL_INFOS() << "Region " << region->getOriginGlobal() << LL_ENDL;
+	LL_INFOS("ParcelMgr") << "Region " << region->getOriginGlobal() << LL_ENDL;
 
 	LLSD payload;
 	payload["owner_id"] = owner_id;
@@ -1120,8 +1120,8 @@ LLViewerParcelMgr::ParcelBuyInfo* LLViewerParcelMgr::setupParcelBuy(
 	
 	if (is_claim)
 	{
-		LL_INFOS() << "Claiming " << mWestSouth << " to " << mEastNorth << LL_ENDL;
-		LL_INFOS() << "Region " << region->getOriginGlobal() << LL_ENDL;
+		LL_INFOS("ParcelMgr") << "Claiming " << mWestSouth << " to " << mEastNorth << LL_ENDL;
+		LL_INFOS("ParcelMgr") << "Region " << region->getOriginGlobal() << LL_ENDL;
 
 		// BUG: Only works for the region containing mWestSouthBottom
 		LLVector3d east_north_region_check( mEastNorth );
@@ -1294,8 +1294,6 @@ void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel, bool use_ag
 	if (!region) 
         return;
 
-	//LL_INFOS() << "found region: " << region->getName() << LL_ENDL;
-
 	LLSD body;
 	std::string url = region->getCapability("ParcelPropertiesUpdate");
 	if (!url.empty())
@@ -1304,7 +1302,7 @@ void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel, bool use_ag
 		U32 message_flags = 0x01;
 		body["flags"] = ll_sd_from_U32(message_flags);
 		parcel->packMessage(body);
-		LL_INFOS() << "Sending parcel properties update via capability to: "
+		LL_INFOS("ParcelMgr") << "Sending parcel properties update via capability to: "
 			<< url << LL_ENDL;
 
         LLCoreHttpUtil::HttpCoroutineAdapter::messageHttpPost(url, body,
@@ -1356,6 +1354,8 @@ void LLViewerParcelMgr::setHoverParcel(const LLVector3d& pos)
 		return;
 	}
 
+	LL_DEBUGS("ParcelMgr") << "Requesting parcel properties on hover, for " << pos << LL_ENDL;
+
 
 	// Send a rectangle around the point.
 	// This means the parcel sent back is at least a rectangle around the point,
@@ -1472,7 +1472,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
     if (request_result == PARCEL_RESULT_NO_DATA)
     {
         // no valid parcel data
-        LL_INFOS() << "no valid parcel data" << LL_ENDL;
+        LL_INFOS("ParcelMgr") << "no valid parcel data" << LL_ENDL;
         return;
     }
 
@@ -1504,7 +1504,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
     }
     else
     {
-        LL_INFOS() << "out of order agent parcel sequence id " << sequence_id
+        LL_INFOS("ParcelMgr") << "out of order agent parcel sequence id " << sequence_id
             << " last good " << parcel_mgr.mAgentParcelSequenceID
             << LL_ENDL;
         return;
@@ -1552,6 +1552,8 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
 
 	msg->getS32("ParcelData", "OtherCleanTime", other_clean_time );
 
+	LL_DEBUGS("ParcelMgr") << "Processing parcel " << local_id << " update, target(sequence): " << sequence_id << LL_ENDL;
+
 	// Actually extract the data.
 	if (parcel)
 	{
@@ -1790,7 +1792,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
                         }
                         else
                         {
-                            LL_INFOS() << "Stopping parcel music (invalid audio stream URL)" << LL_ENDL;
+                            LL_INFOS("ParcelMgr") << "Stopping parcel music (invalid audio stream URL)" << LL_ENDL;
                             // clears the URL
                             // null value causes fade out
                             LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);
@@ -1798,7 +1800,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
                     }
                     else if (!gAudiop->getInternetStreamURL().empty())
                     {
-                        LL_INFOS() << "Stopping parcel music (parcel stream URL is empty)" << LL_ENDL;
+                        LL_INFOS("ParcelMgr") << "Stopping parcel music (parcel stream URL is empty)" << LL_ENDL;
                         // null value causes fade out
                         LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);
                     }
@@ -1827,7 +1829,7 @@ void LLViewerParcelMgr::optionally_start_music(const std::string& music_url)
 		     gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) &&
 			 gSavedSettings.getBOOL("MediaTentativeAutoPlay")))
 		{
-			LL_INFOS() << "Starting parcel music " << music_url << LL_ENDL;
+			LL_INFOS("ParcelMgr") << "Starting parcel music " << music_url << LL_ENDL;
 			LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(music_url);
 		}
 		else
@@ -1855,7 +1857,7 @@ void LLViewerParcelMgr::processParcelAccessListReply(LLMessageSystem *msg, void
 
 	if (parcel_id != parcel->getLocalID())
 	{
-		LL_WARNS_ONCE("") << "processParcelAccessListReply for parcel " << parcel_id
+		LL_WARNS_ONCE("ParcelMgr") << "processParcelAccessListReply for parcel " << parcel_id
 			<< " which isn't the selected parcel " << parcel->getLocalID()<< LL_ENDL;
 		return;
 	}
-- 
cgit v1.2.3


From baeca41027d586871fd38fb2c9d8684f747231c7 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Mon, 19 Nov 2018 20:20:34 +0200
Subject: SL-10089 Logs to see which gSavedSettings.get calls should be cached

---
 doc/contributions.txt     |  1 +
 indra/llxml/llcontrol.cpp | 94 ++++++++++++++++++++++++++++++++++++++++++++++-
 indra/llxml/llcontrol.h   |  3 ++
 3 files changed, 97 insertions(+), 1 deletion(-)

diff --git a/doc/contributions.txt b/doc/contributions.txt
index 88b2a77393..97c7ff1098 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -777,6 +777,7 @@ Jonathan Yap
 	STORM-2100
 	STORM-2104
 	STORM-2142
+	SL-10089
 Kadah Coba
 	STORM-1060
     STORM-1843
diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp
index 20ab1a7ad3..ccf4f3ddf5 100644
--- a/indra/llxml/llcontrol.cpp
+++ b/indra/llxml/llcontrol.cpp
@@ -43,6 +43,9 @@
 #include "llrect.h"
 #include "llxmltree.h"
 #include "llsdserialize.h"
+#include "llfile.h"
+#include "lltimer.h"
+#include "lldir.h"
 
 #if LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG
 #define CONTROL_ERRS LL_ERRS("ControlErrors")
@@ -92,6 +95,17 @@ template <> LLSD convert_from_llsd<LLSD>(const LLSD& sd, eControlType type, cons
 //this defines the current version of the settings file
 const S32 CURRENT_VERSION = 101;
 
+// If you define the environment variable LL_SETTINGS_PROFILE to any value this will activate
+// the gSavedSettings profiling code.  This code tracks the calls to get a saved (debug) setting.
+// When the viewer exits the results are written to the log directory to the file specified
+// by SETTINGS_PROFILE below.  Only settings with an average access rate >= 2/second are output.
+typedef std::pair<std::string, U32> settings_pair_t;
+typedef std::vector<settings_pair_t> settings_vec_t;
+LLSD getCount;
+settings_vec_t getCount_v;
+F64 start_time = 0;
+std::string SETTINGS_PROFILE = "settings_profile.log";
+
 bool LLControlVariable::llsd_compare(const LLSD& a, const LLSD & b)
 {
 	bool result = false;
@@ -327,6 +341,11 @@ LLSD LLControlVariable::getSaveValue() const
 
 LLPointer<LLControlVariable> LLControlGroup::getControl(const std::string& name)
 {
+	if (mSettingsProfile)
+	{
+		incrCount(name);
+	}
+
 	ctrl_name_table_t::iterator iter = mNameTable.find(name);
 	return iter == mNameTable.end() ? LLPointer<LLControlVariable>() : iter->second;
 }
@@ -349,8 +368,14 @@ const std::string LLControlGroup::mTypeString[TYPE_COUNT] = { "U32"
                                                              };
 
 LLControlGroup::LLControlGroup(const std::string& name)
-:	LLInstanceTracker<LLControlGroup, std::string>(name)
+:	LLInstanceTracker<LLControlGroup, std::string>(name),
+	mSettingsProfile(false)
 {
+
+	if (NULL != getenv("LL_SETTINGS_PROFILE"))
+	{
+		mSettingsProfile = true;
+	}
 }
 
 LLControlGroup::~LLControlGroup()
@@ -358,8 +383,66 @@ LLControlGroup::~LLControlGroup()
 	cleanup();
 }
 
+static bool compareRoutine(settings_pair_t lhs, settings_pair_t rhs)
+{
+	return lhs.second > rhs.second;
+};
+
 void LLControlGroup::cleanup()
 {
+	if(mSettingsProfile && getCount.size() != 0)
+	{
+		std::string file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, SETTINGS_PROFILE);
+		LLFILE* out = LLFile::fopen(file, "w"); /* Flawfinder: ignore */
+		if(!out)
+		{
+			LL_WARNS("SettingsProfile") << "Error opening " << SETTINGS_PROFILE << LL_ENDL;
+		}
+		else
+		{
+			F64 end_time = LLTimer::getTotalSeconds();
+			U32 total_seconds = (U32)(end_time - start_time);
+
+			std::string msg = llformat("Runtime (seconds): %d\n\n No. accesses   Avg. accesses/sec  Name\n", total_seconds);
+			std::ostringstream data_msg;
+
+			data_msg << msg;
+			size_t data_size = data_msg.str().size();
+			if (fwrite(data_msg.str().c_str(), 1, data_size, out) != data_size)
+			{
+				LL_WARNS("SettingsProfile") << "Failed to write settings profile header" << LL_ENDL;
+			}
+
+			for (LLSD::map_const_iterator iter = getCount.beginMap(); iter != getCount.endMap(); ++iter)
+			{
+				getCount_v.push_back(settings_pair_t(iter->first, iter->second.asInteger()));
+			}
+			sort(getCount_v.begin(), getCount_v.end(), compareRoutine);
+
+			for (settings_vec_t::iterator iter = getCount_v.begin(); iter != getCount_v.end(); ++iter)
+			{
+				U32 access_rate = 0;
+				if (total_seconds != 0)
+				{
+					access_rate = iter->second / total_seconds;
+				}
+				if (access_rate >= 2)
+				{
+					std::ostringstream data_msg;
+					msg = llformat("%13d        %7d       %s", iter->second, access_rate, iter->first.c_str());
+					data_msg << msg << "\n";
+					size_t data_size = data_msg.str().size();
+					if (fwrite(data_msg.str().c_str(), 1, data_size, out) != data_size)
+					{
+						LL_WARNS("SettingsProfile") << "Failed to write settings profile" << LL_ENDL;
+					}
+				}
+			}
+			getCount = LLSD::emptyMap();
+			fclose(out);
+		}
+	}
+
 	mNameTable.clear();
 }
 
@@ -460,6 +543,15 @@ LLControlVariable* LLControlGroup::declareLLSD(const std::string& name, const LL
 	return declareControl(name, TYPE_LLSD, initial_val, comment, persist);
 }
 
+void LLControlGroup::incrCount(const std::string& name)
+{
+	if (0.0 == start_time)
+	{
+		start_time = LLTimer::getTotalSeconds();
+	}
+	getCount[name] = getCount[name].asInteger() + 1;
+}
+
 BOOL LLControlGroup::getBOOL(const std::string& name)
 {
 	return (BOOL)get<bool>(name);
diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h
index 8136a3e88a..de0d366492 100644
--- a/indra/llxml/llcontrol.h
+++ b/indra/llxml/llcontrol.h
@@ -301,6 +301,9 @@ public:
  	U32 saveToFile(const std::string& filename, BOOL nondefault_only);
  	U32	loadFromFile(const std::string& filename, bool default_values = false, bool save_values = true);
 	void	resetToDefaults();
+	void	incrCount(const std::string& name);
+
+	bool	mSettingsProfile;
 };
 
 
-- 
cgit v1.2.3


From faf79976c0ad3ea9406f3c13348c6ee27837ef2c Mon Sep 17 00:00:00 2001
From: Mnikolenko ProductEngine <mnikolenko@productengine.com>
Date: Tue, 20 Nov 2018 15:53:43 +0200
Subject: SL-10094 FIXED Mute sound should ONLY mute the viewer's sounds, not
 the whole computer's (Mac) sound.

---
 indra/newview/llappviewermacosx.cpp | 62 -------------------------------------
 indra/newview/llappviewermacosx.h   |  4 ---
 2 files changed, 66 deletions(-)

diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index d472f8926b..1db48119aa 100644
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -337,68 +337,6 @@ std::string LLAppViewerMacOSX::generateSerialNumber()
 	return serial_md5;
 }
 
-static AudioDeviceID get_default_audio_output_device(void)
-{
-	AudioDeviceID device = 0;
-	UInt32 size = sizeof(device);
-	AudioObjectPropertyAddress device_address = { kAudioHardwarePropertyDefaultOutputDevice,
-												  kAudioObjectPropertyScopeGlobal,
-												  kAudioObjectPropertyElementMaster };
-
-	OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &device_address, 0, NULL, &size, &device);
-	if(err != noErr)
-	{
-		LL_DEBUGS("SystemMute") << "Couldn't get default audio output device (0x" << std::hex << err << ")" << LL_ENDL;
-	}
-
-	return device;
-}
-
-//virtual
-void LLAppViewerMacOSX::setMasterSystemAudioMute(bool new_mute)
-{
-	AudioDeviceID device = get_default_audio_output_device();
-
-	if(device != 0)
-	{
-		UInt32 mute = new_mute;
-		AudioObjectPropertyAddress device_address = { kAudioDevicePropertyMute,
-													  kAudioDevicePropertyScopeOutput,
-													  kAudioObjectPropertyElementMaster };
-
-		OSStatus err = AudioObjectSetPropertyData(device, &device_address, 0, NULL, sizeof(mute), &mute);
-		if(err != noErr)
-		{
-			LL_INFOS("SystemMute") << "Couldn't set audio mute property (0x" << std::hex << err << ")" << LL_ENDL;
-		}
-	}
-}
-
-//virtual
-bool LLAppViewerMacOSX::getMasterSystemAudioMute()
-{
-	// Assume the system isn't muted 
-	UInt32 mute = 0;
-
-	AudioDeviceID device = get_default_audio_output_device();
-
-	if(device != 0)
-	{
-		UInt32 size = sizeof(mute);
-		AudioObjectPropertyAddress device_address = { kAudioDevicePropertyMute,
-													  kAudioDevicePropertyScopeOutput,
-													  kAudioObjectPropertyElementMaster };
-
-		OSStatus err = AudioObjectGetPropertyData(device, &device_address, 0, NULL, &size, &mute);
-		if(err != noErr)
-		{
-			LL_DEBUGS("SystemMute") << "Couldn't get audio mute property (0x" << std::hex << err << ")" << LL_ENDL;
-		}
-	}
-	
-	return (mute != 0);
-}
-
 void handleUrl(const char* url_utf8)
 {
     if (url_utf8 && gViewerAppPtr)
diff --git a/indra/newview/llappviewermacosx.h b/indra/newview/llappviewermacosx.h
index ebb41a495c..d5a80864be 100644
--- a/indra/newview/llappviewermacosx.h
+++ b/indra/newview/llappviewermacosx.h
@@ -42,10 +42,6 @@ public:
 	//
 	virtual bool init();			// Override to do application initialization
 
-	// mute/unmute the system's master audio
-	virtual void setMasterSystemAudioMute(bool mute);
-	virtual bool getMasterSystemAudioMute();
-
 protected:
 	virtual bool restoreErrorTrap();
 	virtual void initCrashReporting(bool reportFreeze);
-- 
cgit v1.2.3


From c99a66a482d8893055be6e130bae22d3d67d123e Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Wed, 21 Nov 2018 17:41:15 +0200
Subject: SL-10113 FIXED [Win] File pickers are not threaded in XUI preview
 floater

---
 indra/newview/llfloateruipreview.cpp | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index 76ad2146f1..4e0b27a4f8 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -60,6 +60,7 @@
 #include "llfloaterreg.h"
 #include "llscrollcontainer.h"	// scroll container for overlapping elements
 #include "lllivefile.h"					// live file poll/stat/reload
+#include "llviewermenufile.h" // LLFilePickerReplyThread
 
 // Boost (for linux/unix command-line execv)
 #include <boost/tokenizer.hpp>
@@ -206,7 +207,9 @@ private:
 	void onClickSaveAll(S32 id);
 	void onClickEditFloater();
 	void onClickBrowseForEditor();
+	void getExecutablePath(const std::vector<std::string>& filenames);
 	void onClickBrowseForDiffs();
+	void getDiffsFilePath(const std::vector<std::string>& filenames);
 	void onClickToggleDiffHighlighting();
 	void onClickToggleOverlapping();
 	void onClickCloseDisplayedFloater(S32 id);
@@ -1019,15 +1022,14 @@ void LLFloaterUIPreview::onClickEditFloater()
 // Respond to button click to browse for an executable with which to edit XML files
 void LLFloaterUIPreview::onClickBrowseForEditor()
 {
-	// Let the user choose an executable through the file picker dialog box
-	LLFilePicker& picker = LLFilePicker::instance();
-    if (!picker.getOpenFile(LLFilePicker::FFLOAD_EXE))
-	{
-		return; // user cancelled -- do nothing
-	}
+    // Let the user choose an executable through the file picker dialog box
+    (new LLFilePickerReplyThread(boost::bind(&LLFloaterUIPreview::getExecutablePath, this, _1), LLFilePicker::FFLOAD_EXE, false))->getFile();
+}
 
+void LLFloaterUIPreview::getExecutablePath(const std::vector<std::string>& filenames)
+{
 	// put the selected path into text field
-	const std::string chosen_path = picker.getFirstFile();
+	const std::string chosen_path = filenames[0];
 	std::string executable_path = chosen_path;
 #if LL_DARWIN
 	// on Mac, if it's an application bundle, figure out the actual path from the Info.plist file
@@ -1075,15 +1077,13 @@ void LLFloaterUIPreview::onClickBrowseForEditor()
 void LLFloaterUIPreview::onClickBrowseForDiffs()
 {
 	// create load dialog box
-	LLFilePicker::ELoadFilter type = (LLFilePicker::ELoadFilter)((intptr_t)((void*)LLFilePicker::FFLOAD_XML));	// nothing for *.exe so just use all
-	LLFilePicker& picker = LLFilePicker::instance();
-	if (!picker.getOpenFile(type))	// user cancelled -- do nothing
-	{
-		return;
-	}
+    (new LLFilePickerReplyThread(boost::bind(&LLFloaterUIPreview::getDiffsFilePath, this, _1), LLFilePicker::FFLOAD_XML, false))->getFile();
+}
 
+void LLFloaterUIPreview::getDiffsFilePath(const std::vector<std::string>& filenames)
+{
 	// put the selected path into text field
-	const std::string chosen_path = picker.getFirstFile();
+	const std::string chosen_path = filenames[0];
 	mDiffPathTextBox->setText(std::string(chosen_path));	// copy the path to the executable to the textfield for display and later fetching
 	if(LLView::sHighlightingDiffs)								// if we're already highlighting, toggle off and then on so we get the data from the new file
 	{
-- 
cgit v1.2.3


From dea5450d789cb876856db8fc0159e1df34009c19 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Tue, 20 Nov 2018 19:47:00 +0200
Subject: SL-4730 Prevent viewer from getting more texture details when low on
 memory

---
 indra/newview/llviewertexture.cpp | 129 +++++++++++++++++++++-----------------
 indra/newview/llviewertexture.h   |   7 ++-
 2 files changed, 78 insertions(+), 58 deletions(-)

diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index d2157f33cf..db3adcec2b 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -100,7 +100,7 @@ const S32 MAX_CACHED_RAW_TERRAIN_IMAGE_AREA = 128 * 128;
 const S32 DEFAULT_ICON_DIMENTIONS = 32;
 S32 LLViewerTexture::sMinLargeImageSize = 65536; //256 * 256.
 S32 LLViewerTexture::sMaxSmallImageSize = MAX_CACHED_RAW_IMAGE_AREA;
-BOOL LLViewerTexture::sFreezeImageScalingDown = FALSE;
+bool LLViewerTexture::sFreezeImageUpdates = false;
 F32 LLViewerTexture::sCurrentTime = 0.0f;
 F32  LLViewerTexture::sTexelPixelRatio = 1.0f;
 
@@ -484,53 +484,68 @@ static LLTrace::BlockTimerStatHandle FTM_TEXTURE_MEMORY_CHECK("Memory Check");
 //static 
 bool LLViewerTexture::isMemoryForTextureLow()
 {
-	static LLFrameTimer timer;
-	static bool low_mem = false;
+    // Note: we need to figure out a better source for 'min' values,
+    // what is free for low end at minimal settings is 'nothing left'
+    // for higher end gpus at high settings.
+    const S32Megabytes MIN_FREE_TEXTURE_MEMORY(20);
+    const S32Megabytes MIN_FREE_MAIN_MEMORY(100);
 
-	if(timer.getElapsedTimeF32() < GPU_MEMORY_CHECK_WAIT_TIME) //call this once per second.
-	{
-		return low_mem;
-	}
-	timer.reset();
+    S32Megabytes gpu;
+    S32Megabytes physical;
+    getGPUMemoryForTextures(gpu, physical);
 
-	LL_RECORD_BLOCK_TIME(FTM_TEXTURE_MEMORY_CHECK);
+    return (gpu < MIN_FREE_TEXTURE_MEMORY) || (physical < MIN_FREE_MAIN_MEMORY);
+}
 
-	const S32Megabytes MIN_FREE_TEXTURE_MEMORY(20); //MB Changed to 20 MB per MAINT-6882
-	const S32Megabytes MIN_FREE_MAIN_MEMORY(100); //MB	
+//static
+bool LLViewerTexture::isMemoryForTextureSuficientlyFree()
+{
+    const S32Megabytes DESIRED_FREE_TEXTURE_MEMORY(50);
+    const S32Megabytes DESIRED_FREE_MAIN_MEMORY(200);
 
-	low_mem = false;
-	if (gGLManager.mHasATIMemInfo)
-	{
-		S32 meminfo[4];
-		glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo);
+    S32Megabytes gpu;
+    S32Megabytes physical;
+    getGPUMemoryForTextures(gpu, physical);
 
-		if((S32Megabytes)meminfo[0] < MIN_FREE_TEXTURE_MEMORY)
-		{
-			low_mem = true;
-		}
+    return (gpu > DESIRED_FREE_TEXTURE_MEMORY) && (physical > DESIRED_FREE_MAIN_MEMORY);
+}
 
-		if(!low_mem) //check main memory, only works for windows.
-		{
-			LLMemory::updateMemoryInfo();
-			if(LLMemory::getAvailableMemKB() < MIN_FREE_TEXTURE_MEMORY)
-			{
-				low_mem = true;
-			}
-		}
-	}
-	//Enabled this branch per MAINT-6882
-	else if (gGLManager.mHasNVXMemInfo)
-	{
-		S32 free_memory;
-		glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &free_memory);
-		
-		if ((S32Megabytes)(free_memory / 1024) < MIN_FREE_TEXTURE_MEMORY)
-		{
-			low_mem = true;
-		}
-	}
+//static
+void LLViewerTexture::getGPUMemoryForTextures(S32Megabytes &gpu, S32Megabytes &physical)
+{
+    static LLFrameTimer timer;
+    static S32Megabytes gpu_res = S32Megabytes(S32_MAX);
+    static S32Megabytes physical_res = S32Megabytes(S32_MAX);
+
+    if (timer.getElapsedTimeF32() < GPU_MEMORY_CHECK_WAIT_TIME) //call this once per second.
+    {
+        gpu = gpu_res;
+        physical = physical_res;
+        return;
+    }
+    timer.reset();
+
+    LL_RECORD_BLOCK_TIME(FTM_TEXTURE_MEMORY_CHECK);
+
+    if (gGLManager.mHasATIMemInfo)
+    {
+        S32 meminfo[4];
+        glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo);
+        gpu_res = (S32Megabytes)meminfo[0];
+
+        //check main memory, only works for windows.
+        LLMemory::updateMemoryInfo();
+        physical_res = LLMemory::getAvailableMemKB();
+    }
+    else if (gGLManager.mHasNVXMemInfo)
+    {
+        S32 free_memory;
+        glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &free_memory);
+        gpu_res = (S32Megabytes)(free_memory / 1024);
+    }
 
-	return low_mem;
+    gpu = gpu_res;
+    physical = physical_res;
 }
 
 static LLTrace::BlockTimerStatHandle FTM_TEXTURE_UPDATE_MEDIA("Media");
@@ -575,17 +590,18 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity
 	}
 	else if(isMemoryForTextureLow())
 	{
-		// Note: isMemoryForTextureLow() uses 1s delay, make sure we waited enough for it to restore
+		// Note: isMemoryForTextureLow() uses 1s delay, make sure we waited enough for it to recheck
 		if (sEvaluationTimer.getElapsedTimeF32() > GPU_MEMORY_CHECK_WAIT_TIME)
 		{
 			sDesiredDiscardBias += discard_bias_delta;
 			sEvaluationTimer.reset();
 		}
 	}
-	else if (sDesiredDiscardBias > 0.0f &&
-			 sBoundTextureMemory < sMaxBoundTextureMemory * texmem_lower_bound_scale &&
-			 sTotalTextureMemory < sMaxTotalTextureMem * texmem_lower_bound_scale)
-	{			 
+	else if (sDesiredDiscardBias > 0.0f
+			 && sBoundTextureMemory < sMaxBoundTextureMemory * texmem_lower_bound_scale
+			 && sTotalTextureMemory < sMaxTotalTextureMem * texmem_lower_bound_scale
+			 && isMemoryForTextureSuficientlyFree())
+	{
 		// If we are using less texture memory than we should,
 		// scale down the desired discard level
 		if (sEvaluationTimer.getElapsedTimeF32() > discard_delta_time)
@@ -595,14 +611,8 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity
 		}
 	}
 	sDesiredDiscardBias = llclamp(sDesiredDiscardBias, desired_discard_bias_min, desired_discard_bias_max);
-	
-	F32 camera_moving_speed = LLViewerCamera::getInstance()->getAverageSpeed();
-	F32 camera_angular_speed = LLViewerCamera::getInstance()->getAverageAngularSpeed();
-	sCameraMovingBias = llmax(0.2f * camera_moving_speed, 2.0f * camera_angular_speed - 1);
-	sCameraMovingDiscardBias = (S8)(sCameraMovingBias);
 
-	LLViewerTexture::sFreezeImageScalingDown = (sBoundTextureMemory < 0.75f * sMaxBoundTextureMemory * texmem_middle_bound_scale) &&
-				(sTotalTextureMemory < 0.75f * sMaxTotalTextureMem * texmem_middle_bound_scale);
+	LLViewerTexture::sFreezeImageUpdates = sDesiredDiscardBias > (desired_discard_bias_max - 1.0f);
 }
 
 //end of static functions
@@ -3126,9 +3136,9 @@ S8 LLViewerLODTexture::getType() const
 	return LLViewerTexture::LOD_TEXTURE;
 }
 
-BOOL LLViewerLODTexture::isUpdateFrozen()
+bool LLViewerLODTexture::isUpdateFrozen()
 {
-	return LLViewerTexture::sFreezeImageScalingDown && !getDiscardLevel();
+	return LLViewerTexture::sFreezeImageUpdates;
 }
 
 // This is gauranteed to get called periodically for every texture
@@ -3254,9 +3264,16 @@ void LLViewerLODTexture::processTextureStats()
 				(!getBoundRecently() || mDesiredDiscardLevel >= mCachedRawDiscardLevel))
 			{
 				scaleDown();
-				
 			}
 		}
+
+		if (isUpdateFrozen() // we are out of memory and nearing max allowed bias
+			&& mBoostLevel < LLGLTexture::BOOST_SCULPTED
+			&& mDesiredDiscardLevel < current_discard)
+		{
+			// stop requesting more
+			mDesiredDiscardLevel = current_discard;
+		}
 	}
 
 	if(mForceToSaveRawImage && mDesiredSavedRawDiscardLevel >= 0)
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index 5d89f9f029..7cbcc931b1 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -186,6 +186,9 @@ private:
 	virtual void switchToCachedImage();
 	
 	static bool isMemoryForTextureLow() ;
+	static bool isMemoryForTextureSuficientlyFree();
+	static void getGPUMemoryForTextures(S32Megabytes &gpu, S32Megabytes &physical);
+
 protected:
 	LLUUID mID;
 	S32 mTextureListType; // along with mID identifies where to search for this texture in TextureList
@@ -227,7 +230,7 @@ public:
 	static S32 sMaxSculptRez ;
 	static S32 sMinLargeImageSize ;
 	static S32 sMaxSmallImageSize ;
-	static BOOL sFreezeImageScalingDown ;//do not scale down image res if set.
+	static bool sFreezeImageUpdates;
 	static F32  sCurrentTime ;
 
 	enum EDebugTexels
@@ -543,7 +546,7 @@ public:
 	/*virtual*/ S8 getType() const;
 	// Process image stats to determine priority/quality requirements.
 	/*virtual*/ void processTextureStats();
-	BOOL isUpdateFrozen() ;
+	bool isUpdateFrozen() ;
 
 private:
 	void init(bool firstinit) ;
-- 
cgit v1.2.3


From 7d745679cef8fd91394ca97f0d9f1cf252d57782 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Thu, 22 Nov 2018 15:46:59 +0200
Subject: line endings fix

---
 indra/newview/llfloateruipreview.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index 4e0b27a4f8..db5a192287 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -1023,7 +1023,7 @@ void LLFloaterUIPreview::onClickEditFloater()
 void LLFloaterUIPreview::onClickBrowseForEditor()
 {
     // Let the user choose an executable through the file picker dialog box
-    (new LLFilePickerReplyThread(boost::bind(&LLFloaterUIPreview::getExecutablePath, this, _1), LLFilePicker::FFLOAD_EXE, false))->getFile();
+    (new LLFilePickerReplyThread(boost::bind(&LLFloaterUIPreview::getExecutablePath, this, _1), LLFilePicker::FFLOAD_EXE, false))->getFile();
 }
 
 void LLFloaterUIPreview::getExecutablePath(const std::vector<std::string>& filenames)
@@ -1077,7 +1077,7 @@ void LLFloaterUIPreview::getExecutablePath(const std::vector<std::string>& filen
 void LLFloaterUIPreview::onClickBrowseForDiffs()
 {
 	// create load dialog box
-    (new LLFilePickerReplyThread(boost::bind(&LLFloaterUIPreview::getDiffsFilePath, this, _1), LLFilePicker::FFLOAD_XML, false))->getFile();
+    (new LLFilePickerReplyThread(boost::bind(&LLFloaterUIPreview::getDiffsFilePath, this, _1), LLFilePicker::FFLOAD_XML, false))->getFile();
 }
 
 void LLFloaterUIPreview::getDiffsFilePath(const std::vector<std::string>& filenames)
-- 
cgit v1.2.3


From e1c7688b2c69c3a79b673011abe6d59ce97acdff Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Mon, 26 Nov 2018 18:50:40 +0200
Subject: SL-10101 Remade most frequent setting calls to cached variants

---
 indra/newview/llappviewer.cpp       |  6 ++++--
 indra/newview/llmeshrepository.cpp  | 25 ++++++++++++++-----------
 indra/newview/lltool.cpp            |  4 +++-
 indra/newview/llviewermedia.cpp     | 10 ++++++----
 indra/newview/llviewershadermgr.cpp |  3 ++-
 indra/newview/llvovolume.cpp        | 29 ++++++++++++++++++++---------
 indra/newview/llvowlsky.cpp         |  3 ++-
 7 files changed, 51 insertions(+), 29 deletions(-)

diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 4374caacdf..f1af872fb4 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -5439,7 +5439,8 @@ void LLAppViewer::resumeMainloopTimeout(const std::string& state, F32 secs)
 	{
 		if(secs < 0.0f)
 		{
-			secs = gSavedSettings.getF32("MainloopTimeoutDefault");
+			static LLCachedControl<F32> mainloop_timeout(gSavedSettings, "MainloopTimeoutDefault", 60);
+			secs = mainloop_timeout;
 		}
 
 		mMainloopTimeout->setTimeout(secs);
@@ -5466,7 +5467,8 @@ void LLAppViewer::pingMainloopTimeout(const std::string& state, F32 secs)
 	{
 		if(secs < 0.0f)
 		{
-			secs = gSavedSettings.getF32("MainloopTimeoutDefault");
+			static LLCachedControl<F32> mainloop_timeout(gSavedSettings, "MainloopTimeoutDefault", 60);
+			secs = mainloop_timeout;
 		}
 
 		mMainloopTimeout->setTimeout(secs);
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index e38bd8846d..a689a0da0b 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -4302,10 +4302,13 @@ F32 LLMeshRepository::getStreamingCostLegacy(LLSD& header, F32 radius, S32* byte
 	F32 dlow = llmin(radius/0.06f, max_distance);
 	F32 dmid = llmin(radius/0.24f, max_distance);
 	
-	F32 METADATA_DISCOUNT = (F32) gSavedSettings.getU32("MeshMetaDataDiscount");  //discount 128 bytes to cover the cost of LLSD tags and compression domain overhead
-	F32 MINIMUM_SIZE = (F32) gSavedSettings.getU32("MeshMinimumByteSize"); //make sure nothing is "free"
+	static LLCachedControl<U32> metadata_discount_ch(gSavedSettings, "MeshMetaDataDiscount", 384);  //discount 128 bytes to cover the cost of LLSD tags and compression domain overhead
+	static LLCachedControl<U32> minimum_size_ch(gSavedSettings, "MeshMinimumByteSize", 16); //make sure nothing is "free"
+	static LLCachedControl<U32> bytes_per_triangle_ch(gSavedSettings, "MeshBytesPerTriangle", 16);
 
-	F32 bytes_per_triangle = (F32) gSavedSettings.getU32("MeshBytesPerTriangle");
+	F32 metadata_discount = (F32)metadata_discount_ch;
+	F32 minimum_size = (F32)minimum_size_ch;
+	F32 bytes_per_triangle = (F32)bytes_per_triangle_ch;
 
 	S32 bytes_lowest = header["lowest_lod"]["size"].asInteger();
 	S32 bytes_low = header["low_lod"]["size"].asInteger();
@@ -4332,10 +4335,10 @@ F32 LLMeshRepository::getStreamingCostLegacy(LLSD& header, F32 radius, S32* byte
 		bytes_lowest = bytes_low;
 	}
 
-	F32 triangles_lowest = llmax((F32) bytes_lowest-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;
-	F32 triangles_low = llmax((F32) bytes_low-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;
-	F32 triangles_mid = llmax((F32) bytes_mid-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;
-	F32 triangles_high = llmax((F32) bytes_high-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;
+	F32 triangles_lowest = llmax((F32) bytes_lowest-metadata_discount, minimum_size)/bytes_per_triangle;
+	F32 triangles_low = llmax((F32) bytes_low-metadata_discount, minimum_size)/bytes_per_triangle;
+	F32 triangles_mid = llmax((F32) bytes_mid-metadata_discount, minimum_size)/bytes_per_triangle;
+	F32 triangles_high = llmax((F32) bytes_high-metadata_discount, minimum_size)/bytes_per_triangle;
 
 	if (bytes)
 	{
@@ -4429,13 +4432,13 @@ bool LLMeshCostData::init(const LLSD& header)
     mSizeByLOD[2] = bytes_med;
     mSizeByLOD[3] = bytes_high;
 
-    F32 METADATA_DISCOUNT = (F32) gSavedSettings.getU32("MeshMetaDataDiscount");  //discount 128 bytes to cover the cost of LLSD tags and compression domain overhead
-    F32 MINIMUM_SIZE = (F32) gSavedSettings.getU32("MeshMinimumByteSize"); //make sure nothing is "free"
-    F32 bytes_per_triangle = (F32) gSavedSettings.getU32("MeshBytesPerTriangle");
+    static LLCachedControl<U32> metadata_discount(gSavedSettings, "MeshMetaDataDiscount", 384);  //discount 128 bytes to cover the cost of LLSD tags and compression domain overhead
+    static LLCachedControl<U32> minimum_size(gSavedSettings, "MeshMinimumByteSize", 16); //make sure nothing is "free"
+    static LLCachedControl<U32> bytes_per_triangle(gSavedSettings, "MeshBytesPerTriangle", 16);
 
     for (S32 i=0; i<4; i++)
     {
-        mEstTrisByLOD[i] = llmax((F32) mSizeByLOD[i]-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle; 
+        mEstTrisByLOD[i] = llmax((F32)mSizeByLOD[i] - (F32)metadata_discount, (F32)minimum_size) / (F32)bytes_per_triangle;
     }
 
     return true;
diff --git a/indra/newview/lltool.cpp b/indra/newview/lltool.cpp
index 4aad650b68..b5d78f3654 100644
--- a/indra/newview/lltool.cpp
+++ b/indra/newview/lltool.cpp
@@ -191,7 +191,9 @@ LLTool* LLTool::getOverrideTool(MASK mask)
 	{
 		return NULL;
 	}
-	if (gSavedSettings.getBOOL("EnableAltZoom"))
+
+	static LLCachedControl<bool> alt_zoom(gSavedSettings, "EnableAltZoom", true);
+	if (alt_zoom)
 	{
 		if (mask & MASK_ALT)
 		{
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 22a21c9ca3..f4e1524371 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -682,8 +682,8 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
 
 	std::vector<LLViewerMediaImpl*> proximity_order;
 
-	bool inworld_media_enabled = gSavedSettings.getBOOL("AudioStreamingMedia");
-	bool inworld_audio_enabled = gSavedSettings.getBOOL("AudioStreamingMusic");
+	static LLCachedControl<bool> inworld_media_enabled(gSavedSettings, "AudioStreamingMedia", true);
+	static LLCachedControl<bool> inworld_audio_enabled(gSavedSettings, "AudioStreamingMusic", true);
 	U32 max_instances = gSavedSettings.getU32("PluginInstancesTotal");
 	U32 max_normal = gSavedSettings.getU32("PluginInstancesNormal");
 	U32 max_low = gSavedSettings.getU32("PluginInstancesLow");
@@ -941,7 +941,8 @@ void LLViewerMedia::setAllMediaEnabled(bool val)
 			LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel());
 		}
 
-		if (gSavedSettings.getBOOL("AudioStreamingMusic") &&
+		static LLCachedControl<bool> audio_streaming_music(gSavedSettings, "AudioStreamingMusic", true);
+		if (audio_streaming_music &&
 			!LLViewerMedia::isParcelAudioPlaying() &&
 			gAudiop &&
 			LLViewerMedia::hasParcelAudio())
@@ -1012,7 +1013,8 @@ void LLViewerMedia::setAllMediaPaused(bool val)
             LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel());
         }
 
-        if (gSavedSettings.getBOOL("AudioStreamingMusic") &&
+        static LLCachedControl<bool> audio_streaming_music(gSavedSettings, "AudioStreamingMusic", true);
+        if (audio_streaming_music &&
             !LLViewerMedia::isParcelAudioPlaying() &&
             gAudiop &&
             LLViewerMedia::hasParcelAudio())
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index ff7647a7e4..f610335b07 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -399,7 +399,8 @@ void LLViewerShaderMgr::setShaders()
 		return;
 	}
 
-	LLGLSLShader::sIndexedTextureChannels = llmax(llmin(gGLManager.mNumTextureImageUnits, (S32) gSavedSettings.getU32("RenderMaxTextureIndex")), 1);
+	static LLCachedControl<U32> max_texture_index(gSavedSettings, "RenderMaxTextureIndex", 16);
+	LLGLSLShader::sIndexedTextureChannels = llmax(llmin(gGLManager.mNumTextureImageUnits, (S32) max_texture_index), 1);
 
 	//NEVER use more than 16 texture channels (work around for prevalent driver bug)
 	LLGLSLShader::sIndexedTextureChannels = llmin(LLGLSLShader::sIndexedTextureChannels, 16);
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 24726e61e8..3c487a112e 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -1380,7 +1380,8 @@ BOOL LLVOVolume::calcLOD()
     mLODDistance = distance;
     mLODRadius = radius;
 
-    if (gSavedSettings.getBOOL("DebugObjectLODs"))
+    static LLCachedControl<bool> debug_lods(gSavedSettings, "DebugObjectLODs", false);
+    if (debug_lods)
     {
         if (getAvatar() && isRootEdit())
         {
@@ -4276,10 +4277,16 @@ F32 LLVOVolume::getBinRadius()
 	
 	F32 scale = 1.f;
 
-	S32 size_factor = llmax(gSavedSettings.getS32("OctreeStaticObjectSizeFactor"), 1);
-	S32 attachment_size_factor = llmax(gSavedSettings.getS32("OctreeAttachmentSizeFactor"), 1);
-	LLVector3 distance_factor = gSavedSettings.getVector3("OctreeDistanceFactor");
-	LLVector3 alpha_distance_factor = gSavedSettings.getVector3("OctreeAlphaDistanceFactor");
+	static LLCachedControl<S32> octree_size_factor(gSavedSettings, "OctreeStaticObjectSizeFactor", 3);
+	static LLCachedControl<S32> octree_attachment_size_factor(gSavedSettings, "OctreeAttachmentSizeFactor", 4);
+	static LLCachedControl<LLVector3> octree_distance_factor(gSavedSettings, "OctreeDistanceFactor", LLVector3(0.01f, 0.f, 0.f));
+	static LLCachedControl<LLVector3> octree_alpha_distance_factor(gSavedSettings, "OctreeAlphaDistanceFactor", LLVector3(0.1f, 0.f, 0.f));
+
+	S32 size_factor = llmax((S32)octree_size_factor, 1);
+	S32 attachment_size_factor = llmax((S32)octree_attachment_size_factor, 1);
+	LLVector3 distance_factor = octree_distance_factor;
+	LLVector3 alpha_distance_factor = octree_alpha_distance_factor;
+
 	const LLVector4a* ext = mDrawable->getSpatialExtents();
 	
 	BOOL shrink_wrap = mDrawable->isAnimating();
@@ -5352,8 +5359,10 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
 
 	U32 useage = group->getSpatialPartition()->mBufferUsage;
 
-	U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask);
-	U32 max_total = (gSavedSettings.getS32("RenderMaxNodeSize")*1024)/LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask);
+	LLCachedControl<S32> max_vbo_size(gSavedSettings, "RenderMaxVBOSize", 512);
+	LLCachedControl<S32> max_node_size(gSavedSettings, "RenderMaxNodeSize", 65536);
+	U32 max_vertices = (max_vbo_size * 1024)/LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask);
+	U32 max_total = (max_node_size * 1024) / LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask);
 	max_vertices = llmin(max_vertices, (U32) 65535);
 
 	U32 cur_total = 0;
@@ -6106,7 +6115,8 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
 #endif
 	
 	//calculate maximum number of vertices to store in a single buffer
-	U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask);
+	LLCachedControl<S32> max_vbo_size(gSavedSettings, "RenderMaxVBOSize", 512);
+	U32 max_vertices = (max_vbo_size * 1024)/LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask);
 	max_vertices = llmin(max_vertices, (U32) 65535);
 
 	{
@@ -6149,7 +6159,8 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
 		texture_index_channels = gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels;
 	}
 
-	texture_index_channels = llmin(texture_index_channels, (S32) gSavedSettings.getU32("RenderMaxTextureIndex"));
+	static LLCachedControl<U32> max_texture_index(gSavedSettings, "RenderMaxTextureIndex", 16);
+	texture_index_channels = llmin(texture_index_channels, (S32) max_texture_index);
 	
 	//NEVER use more than 16 texture index channels (workaround for prevalent driver bug)
 	texture_index_channels = llmin(texture_index_channels, 16);
diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp
index 3b9b96e9f1..2cb5fc81b0 100644
--- a/indra/newview/llvowlsky.cpp
+++ b/indra/newview/llvowlsky.cpp
@@ -335,7 +335,8 @@ BOOL LLVOWLSky::updateGeometry(LLDrawable * drawable)
 	}
 
 	{
-		const U32 max_buffer_bytes = gSavedSettings.getS32("RenderMaxVBOSize")*1024;
+		LLCachedControl<S32> max_vbo_size(gSavedSettings, "RenderMaxVBOSize", 512);
+		const U32 max_buffer_bytes = max_vbo_size * 1024;
 		const U32 data_mask = LLDrawPoolWLSky::SKY_VERTEX_DATA_MASK;
 		const U32 max_verts = max_buffer_bytes / LLVertexBuffer::calcVertexSize(data_mask);
 
-- 
cgit v1.2.3


From c7a7503b2ccebda39a48a1164bf07e4541fd8d2b Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Tue, 27 Nov 2018 18:51:53 +0200
Subject: SL-10096 ParcelPropertiesRequest is sent too often when terraforming
 or hover tooltips are On

---
 indra/newview/llviewerparcelmgr.cpp     | 121 +++++++++++++++++++++++---------
 indra/newview/llviewerparceloverlay.cpp |  17 +++++
 indra/newview/llviewerparceloverlay.h   |   2 +
 3 files changed, 107 insertions(+), 33 deletions(-)

diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 5477d2d444..416d5d8e2e 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -1331,22 +1331,18 @@ void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel, bool use_ag
 void LLViewerParcelMgr::setHoverParcel(const LLVector3d& pos)
 {
 	static U32 last_west, last_south;
-
+	static LLUUID last_region;
 
 	// only request parcel info if position has changed outside of the
 	// last parcel grid step
-	U32 west_parcel_step = (U32) floor( pos.mdV[VX] / PARCEL_GRID_STEP_METERS );
-	U32 south_parcel_step = (U32) floor( pos.mdV[VY] / PARCEL_GRID_STEP_METERS );
-	
+	const U32 west_parcel_step = (U32) floor( pos.mdV[VX] / PARCEL_GRID_STEP_METERS );
+	const U32 south_parcel_step = (U32) floor( pos.mdV[VY] / PARCEL_GRID_STEP_METERS );
+
 	if ((west_parcel_step == last_west) && (south_parcel_step == last_south))
 	{
+		// We are staying in same segment
 		return;
 	}
-	else 
-	{
-		last_west = west_parcel_step;
-		last_south = south_parcel_step;
-	}
 
 	LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal( pos );
 	if (!region)
@@ -1354,36 +1350,95 @@ void LLViewerParcelMgr::setHoverParcel(const LLVector3d& pos)
 		return;
 	}
 
-	LL_DEBUGS("ParcelMgr") << "Requesting parcel properties on hover, for " << pos << LL_ENDL;
+	LLUUID region_id = region->getRegionID();
+	LLVector3 pos_in_region = region->getPosRegionFromGlobal(pos);
+
+	bool request_properties = false;
+	if (region_id != last_region)
+	{
+		request_properties = true;
+	}
+	else
+	{
+		// Check if new position is in same parcel.
+		// This check is not ideal, since it checks by way of straight lines.
+		// So sometimes (small parcel in the middle of large one) it can
+		// decide that parcel actually changed, but it still allows to 
+		// reduce amount of requests significantly
+
+		S32 west_parcel_local = (S32)(pos_in_region.mV[VX] / PARCEL_GRID_STEP_METERS);
+		S32 south_parcel_local = (S32)(pos_in_region.mV[VY] / PARCEL_GRID_STEP_METERS);
+
+		LLViewerParcelOverlay* overlay = region->getParcelOverlay();
+		if (!overlay)
+		{
+			 request_properties = true;
+		}
+		while (!request_properties && west_parcel_step < last_west)
+		{
+			S32 segment_shift = last_west - west_parcel_step;
+			request_properties = overlay->parcelLineFlags(south_parcel_local, west_parcel_local + segment_shift) & PARCEL_WEST_LINE;
+			last_west--;
+		}
+		while (!request_properties && south_parcel_step < last_south)
+		{
+			S32 segment_shift = last_south - south_parcel_step;
+			request_properties = overlay->parcelLineFlags(south_parcel_local + segment_shift, west_parcel_local) & PARCEL_SOUTH_LINE;
+			last_south--;
+		}
+		// Note: could have just swapped values, reused first two 'while' and set last_south, last_west separately,
+		// but this looks to be easier to understand/straightforward/less bulky
+		while (!request_properties && west_parcel_step > last_west)
+		{
+			S32 segment_shift = west_parcel_step - last_west;
+			request_properties = overlay->parcelLineFlags(south_parcel_local, west_parcel_local - segment_shift + 1) & PARCEL_WEST_LINE;
+			last_west++;
+		}
+		while (!request_properties && south_parcel_step > last_south)
+		{
+			S32 segment_shift = south_parcel_step - last_south;
+			request_properties = overlay->parcelLineFlags(south_parcel_local - segment_shift + 1, west_parcel_local) & PARCEL_SOUTH_LINE;
+			last_south++;
+		}
+
+		// if (!request_properties) last_south and last_west will be equal to new values
+	}
+
+	if (request_properties)
+	{
+		last_west = west_parcel_step;
+		last_south = south_parcel_step;
+		last_region = region_id;
 
+		LL_DEBUGS("ParcelMgr") << "Requesting parcel properties on hover, for " << pos << LL_ENDL;
 
-	// Send a rectangle around the point.
-	// This means the parcel sent back is at least a rectangle around the point,
-	// which is more efficient for public land.  Fewer requests are sent.  JC
-	LLVector3 wsb_region = region->getPosRegionFromGlobal( pos );
 
-	F32 west  = PARCEL_GRID_STEP_METERS * floor( wsb_region.mV[VX] / PARCEL_GRID_STEP_METERS );
-	F32 south = PARCEL_GRID_STEP_METERS * floor( wsb_region.mV[VY] / PARCEL_GRID_STEP_METERS );
+		// Send a rectangle around the point.
+		// This means the parcel sent back is at least a rectangle around the point,
+		// which is more efficient for public land.  Fewer requests are sent.  JC
+		F32 west = PARCEL_GRID_STEP_METERS * floor(pos_in_region.mV[VX] / PARCEL_GRID_STEP_METERS);
+		F32 south = PARCEL_GRID_STEP_METERS * floor(pos_in_region.mV[VY] / PARCEL_GRID_STEP_METERS);
 
-	F32 east  = west  + PARCEL_GRID_STEP_METERS;
-	F32 north = south + PARCEL_GRID_STEP_METERS;
+		F32 east = west + PARCEL_GRID_STEP_METERS;
+		F32 north = south + PARCEL_GRID_STEP_METERS;
 
-	// Send request message
-	LLMessageSystem *msg = gMessageSystem;
-	msg->newMessageFast(_PREHASH_ParcelPropertiesRequest);
-	msg->nextBlockFast(_PREHASH_AgentData);
-	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
-	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
-	msg->nextBlockFast(_PREHASH_ParcelData);
-	msg->addS32Fast(_PREHASH_SequenceID,	HOVERED_PARCEL_SEQ_ID );
-	msg->addF32Fast(_PREHASH_West,			west );
-	msg->addF32Fast(_PREHASH_South,			south );
-	msg->addF32Fast(_PREHASH_East,			east );
-	msg->addF32Fast(_PREHASH_North,			north );
-	msg->addBOOL("SnapSelection",			FALSE );
-	msg->sendReliable( region->getHost() );
+		// Send request message
+		LLMessageSystem *msg = gMessageSystem;
+		msg->newMessageFast(_PREHASH_ParcelPropertiesRequest);
+		msg->nextBlockFast(_PREHASH_AgentData);
+		msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+		msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+		msg->nextBlockFast(_PREHASH_ParcelData);
+		msg->addS32Fast(_PREHASH_SequenceID, HOVERED_PARCEL_SEQ_ID);
+		msg->addF32Fast(_PREHASH_West, west);
+		msg->addF32Fast(_PREHASH_South, south);
+		msg->addF32Fast(_PREHASH_East, east);
+		msg->addF32Fast(_PREHASH_North, north);
+		msg->addBOOL("SnapSelection", FALSE);
+		msg->sendReliable(region->getHost());
 
-	mHoverRequestResult = PARCEL_RESULT_NO_DATA;
+		mHoverRequestResult = PARCEL_RESULT_NO_DATA;
+	}
 }
 
 
diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp
index 4fd423b6f4..7c3dd00e1a 100644
--- a/indra/newview/llviewerparceloverlay.cpp
+++ b/indra/newview/llviewerparceloverlay.cpp
@@ -274,6 +274,23 @@ U8 LLViewerParcelOverlay::ownership( const LLVector3& pos) const
 	return ownership(row, column);
 }
 
+U8 LLViewerParcelOverlay::parcelLineFlags(const LLVector3& pos) const
+{
+    S32 row = S32(pos.mV[VY] / PARCEL_GRID_STEP_METERS);
+    S32 column = S32(pos.mV[VX] / PARCEL_GRID_STEP_METERS);
+    return parcelLineFlags(row, column);
+}
+U8 LLViewerParcelOverlay::parcelLineFlags(S32 row, S32 col) const
+{
+    U8 flags = PARCEL_WEST_LINE | PARCEL_SOUTH_LINE;
+    if (row > mParcelGridsPerEdge || col > mParcelGridsPerEdge)
+    {
+        LL_WARNS() << "Attempted to get ownership out of region's overlay, row: " << row << " col: " << col << LL_ENDL;
+        return flags;
+    }
+    return mOwnership[row * mParcelGridsPerEdge + col] & flags;
+}
+
 F32 LLViewerParcelOverlay::getOwnedRatio() const
 {
 	S32	size = mParcelGridsPerEdge * mParcelGridsPerEdge;
diff --git a/indra/newview/llviewerparceloverlay.h b/indra/newview/llviewerparceloverlay.h
index 14a2af5354..e30dbf17b3 100644
--- a/indra/newview/llviewerparceloverlay.h
+++ b/indra/newview/llviewerparceloverlay.h
@@ -71,6 +71,8 @@ public:
 	S32				renderPropertyLines();
 
 	U8				ownership( const LLVector3& pos) const;
+	U8				parcelLineFlags( const LLVector3& pos) const;
+	U8				parcelLineFlags(S32 row, S32 col) const;
 
 	// MANIPULATE
 	void	uncompressLandOverlay(S32 chunk, U8 *compressed_overlay);
-- 
cgit v1.2.3


From e2442851c61ad645020d78be8ae0c7c851024758 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Tue, 27 Nov 2018 20:07:41 +0200
Subject: SL-10080 Limit LOD factor to 4

---
 indra/newview/llappviewer.cpp     | 6 +++---
 indra/newview/llviewercontrol.cpp | 6 +++---
 indra/newview/llvovolume.h        | 2 ++
 3 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index f1af872fb4..bd45f68a5c 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -568,12 +568,12 @@ static void settings_to_globals()
 	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO");
 	LLImageGL::sGlobalUseAnisotropic	= gSavedSettings.getBOOL("RenderAnisotropic");
 	LLImageGL::sCompressTextures		= gSavedSettings.getBOOL("RenderCompressTextures");
-	LLVOVolume::sLODFactor				= gSavedSettings.getF32("RenderVolumeLODFactor");
+	LLVOVolume::sLODFactor				= llmin(gSavedSettings.getF32("RenderVolumeLODFactor"), MAX_LOD_FACTOR);
 	LLVOVolume::sDistanceFactor			= 1.f-LLVOVolume::sLODFactor * 0.1f;
 	LLVolumeImplFlexible::sUpdateFactor = gSavedSettings.getF32("RenderFlexTimeFactor");
 	LLVOTree::sTreeFactor				= gSavedSettings.getF32("RenderTreeLODFactor");
-	LLVOAvatar::sLODFactor				= gSavedSettings.getF32("RenderAvatarLODFactor");
-	LLVOAvatar::sPhysicsLODFactor		= gSavedSettings.getF32("RenderAvatarPhysicsLODFactor");
+	LLVOAvatar::sLODFactor				= llmin(gSavedSettings.getF32("RenderAvatarLODFactor"), MAX_LOD_FACTOR);
+	LLVOAvatar::sPhysicsLODFactor		= llmin(gSavedSettings.getF32("RenderAvatarPhysicsLODFactor"), MAX_LOD_FACTOR);
 	LLVOAvatar::updateImpostorRendering(gSavedSettings.getU32("RenderAvatarMaxNonImpostors"));
 	LLVOAvatar::sVisibleInFirstPerson	= gSavedSettings.getBOOL("FirstPersonAvatarVisible");
 	// clamp auto-open time to some minimum usable value
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 88984d518a..e62d6eb951 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -219,20 +219,20 @@ static bool handleAnisotropicChanged(const LLSD& newvalue)
 
 static bool handleVolumeLODChanged(const LLSD& newvalue)
 {
-	LLVOVolume::sLODFactor = (F32) newvalue.asReal();
+	LLVOVolume::sLODFactor = llmin((F32) newvalue.asReal(), MAX_LOD_FACTOR);
 	LLVOVolume::sDistanceFactor = 1.f-LLVOVolume::sLODFactor * 0.1f;
 	return true;
 }
 
 static bool handleAvatarLODChanged(const LLSD& newvalue)
 {
-	LLVOAvatar::sLODFactor = (F32) newvalue.asReal();
+	LLVOAvatar::sLODFactor = llmin((F32) newvalue.asReal(), MAX_LOD_FACTOR);
 	return true;
 }
 
 static bool handleAvatarPhysicsLODChanged(const LLSD& newvalue)
 {
-	LLVOAvatar::sPhysicsLODFactor = (F32) newvalue.asReal();
+	LLVOAvatar::sPhysicsLODFactor = llmin((F32) newvalue.asReal(), MAX_LOD_FACTOR);
 	return true;
 }
 
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 0882fc095d..13db9c39b7 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -54,6 +54,8 @@ enum LLVolumeInterfaceType
 	INTERFACE_FLEXIBLE = 1,
 };
 
+const F32 MAX_LOD_FACTOR = 4.0f;
+
 
 class LLRiggedVolume : public LLVolume
 {
-- 
cgit v1.2.3


From f3b2ac0858e1dff226892e25cd1cebbe98a225a3 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Thu, 29 Nov 2018 18:38:47 +0200
Subject: SL-10135 Change group notices to show as SLT

---
 indra/newview/llnotificationlistitem.cpp                 | 11 ++++++-----
 indra/newview/lltoastgroupnotifypanel.cpp                | 16 ++++++++--------
 indra/newview/skins/default/xui/en/language_settings.xml |  1 +
 3 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/indra/newview/llnotificationlistitem.cpp b/indra/newview/llnotificationlistitem.cpp
index a5bc75e6bd..b405d3dca2 100644
--- a/indra/newview/llnotificationlistitem.cpp
+++ b/indra/newview/llnotificationlistitem.cpp
@@ -135,7 +135,8 @@ std::string LLNotificationListItem::buildNotificationDate(const LLDate& time_sta
 			   	+LLTrans::getString("TimeDay")+"]/["
 				+LLTrans::getString("TimeYear")+"] ["
 				+LLTrans::getString("TimeHour")+"]:["
-				+LLTrans::getString("TimeMin")+"]";
+				+LLTrans::getString("TimeMin")+"] ["
+				+LLTrans::getString("TimeTimezone")+"]";
 			break;
 	}
     LLSD substitution;
@@ -376,13 +377,13 @@ BOOL LLGroupNoticeNotificationListItem::postBuild()
     mTitleBoxExp->setValue(mParams.subject);
     mNoticeTextExp->setValue(mParams.message);
 
-    mTimeBox->setValue(buildNotificationDate(mParams.time_stamp, UTC));
-    mTimeBoxExp->setValue(buildNotificationDate(mParams.time_stamp, UTC));
+    mTimeBox->setValue(buildNotificationDate(mParams.time_stamp));
+    mTimeBoxExp->setValue(buildNotificationDate(mParams.time_stamp));
     //Workaround: in case server timestamp is 0 - we use the time when notification was actually received
     if (mParams.time_stamp.isNull())
     {
-        mTimeBox->setValue(buildNotificationDate(mParams.received_time, UTC));
-        mTimeBoxExp->setValue(buildNotificationDate(mParams.received_time, UTC));
+        mTimeBox->setValue(buildNotificationDate(mParams.received_time));
+        mTimeBoxExp->setValue(buildNotificationDate(mParams.received_time));
     }
     setSender(mParams.sender);
 
diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp
index f7dc32d0d7..817d1dd7b4 100644
--- a/indra/newview/lltoastgroupnotifypanel.cpp
+++ b/indra/newview/lltoastgroupnotifypanel.cpp
@@ -84,14 +84,14 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(const LLNotificationPtr& notifi
 	//message body
 	const std::string& message = payload["message"].asString();
 
-	std::string timeStr = "["+LLTrans::getString("UTCTimeWeek")+"],["
-							+LLTrans::getString("UTCTimeDay")+"] ["
-							+LLTrans::getString("UTCTimeMth")+"] ["
-							+LLTrans::getString("UTCTimeYr")+"] ["
-							+LLTrans::getString("UTCTimeHr")+"]:["
-							+LLTrans::getString("UTCTimeMin")+"]:["
-							+LLTrans::getString("UTCTimeSec")+"] ["
-							+LLTrans::getString("UTCTimeTimezone")+"]";
+	std::string timeStr = "[" + LLTrans::getString("TimeWeek") + "], ["
+							  + LLTrans::getString("TimeMonth") + "]/["
+							  + LLTrans::getString("TimeDay") + "]/["
+							  + LLTrans::getString("TimeYear") + "] ["
+							  + LLTrans::getString("TimeHour") + "]:["
+							  + LLTrans::getString("TimeMin") + "] ["
+							  + LLTrans::getString("TimeTimezone") + "]";
+
 	const LLDate timeStamp = notification->getDate();
 	LLDate notice_date = timeStamp.notNull() ? timeStamp : payload["received_time"].asDate();
 	LLSD substitution;
diff --git a/indra/newview/skins/default/xui/en/language_settings.xml b/indra/newview/skins/default/xui/en/language_settings.xml
index 51779e4bfd..d418fc38e3 100644
--- a/indra/newview/skins/default/xui/en/language_settings.xml
+++ b/indra/newview/skins/default/xui/en/language_settings.xml
@@ -42,6 +42,7 @@
 	<string name="TimeWeek">wkday,datetime,slt</string>
 	<string name="TimeAMPM">ampm,datetime,slt</string>
 	<string name="TimeHour12">hour12,datetime,slt</string>	
+	<string name="TimeTimezone">timezone,datetime,slt</string>
 
 	<string name="LTimeMthNum">mthnum,datetime,local</string>
 	<string name="LTimeWeek">wkday,datetime,local</string>
-- 
cgit v1.2.3


From 13f8cfd1c27a5ca0d9b66a38cbe11fc96a123a8c Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Thu, 29 Nov 2018 19:25:00 +0200
Subject: SL-9954 Mac Viewer crashes if logcontrol-dev.xml is modified

---
 indra/llcommon/llerror.cpp | 48 +++++++++++++++++++++++++++++-----------------
 1 file changed, 30 insertions(+), 18 deletions(-)

diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index 40eb7d9bac..17d8164289 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -382,15 +382,22 @@ namespace
 
 		{
 			llifstream file(filename().c_str());
-			if (file.is_open())
+			if (!file.is_open())
 			{
-				LLSDSerialize::fromXML(configuration, file);
+				LL_WARNS() << filename() << " failed to open file; not changing configuration" << LL_ENDL;
+				return false;
+			}
+
+			if (LLSDSerialize::fromXML(configuration, file) == LLSDParser::PARSE_FAILURE)
+			{
+				LL_WARNS() << filename() << " parcing error; not changing configuration" << LL_ENDL;
+				return false;
 			}
 
-			if (configuration.isUndefined())
+			if (configuration.isUndefined() || !configuration.isMap() || configuration.emptyMap())
 			{
-				LL_WARNS() << filename() << " missing, ill-formed,"
-							" or simply undefined; not changing configuration"
+				LL_WARNS() << filename() << " missing, ill-formed, or simply undefined"
+							" content; not changing configuration"
 						<< LL_ENDL;
 				return false;
 			}
@@ -856,19 +863,24 @@ namespace LLError
             setEnabledLogTypesMask(config["enabled-log-types-mask"].asInteger());
         }
         
-		LLSD sets = config["settings"];
-		LLSD::array_const_iterator a, end;
-		for (a = sets.beginArray(), end = sets.endArray(); a != end; ++a)
-		{
-			const LLSD& entry = *a;
-			
-			ELevel level = decodeLevel(entry["level"]);
-			
-			setLevels(s->mFunctionLevelMap,	entry["functions"],	level);
-			setLevels(s->mClassLevelMap,	entry["classes"],	level);
-			setLevels(s->mFileLevelMap,		entry["files"],		level);
-			setLevels(s->mTagLevelMap,		entry["tags"],		level);
-		}
+        if (config.has("settings") && config["settings"].isArray())
+        {
+            LLSD sets = config["settings"];
+            LLSD::array_const_iterator a, end;
+            for (a = sets.beginArray(), end = sets.endArray(); a != end; ++a)
+            {
+                const LLSD& entry = *a;
+                if (entry.isMap() && !entry.emptyMap())
+                {
+                    ELevel level = decodeLevel(entry["level"]);
+
+                    setLevels(s->mFunctionLevelMap, entry["functions"], level);
+                    setLevels(s->mClassLevelMap, entry["classes"], level);
+                    setLevels(s->mFileLevelMap, entry["files"], level);
+                    setLevels(s->mTagLevelMap, entry["tags"], level);
+                }
+            }
+        }
 	}
 }
 
-- 
cgit v1.2.3


From d9fdb948d9b7d7b873ec83c43332f97018573194 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Thu, 29 Nov 2018 21:04:35 +0200
Subject: SL-9747 [Mesh Uploader] Remove confusing model_metric from upload

---
 indra/llprimitive/llmodel.h                        |  3 ---
 indra/newview/llfloatermodelpreview.cpp            |  3 ---
 indra/newview/llmeshrepository.cpp                 | 14 +----------
 .../skins/default/xui/en/floater_model_preview.xml | 29 ----------------------
 4 files changed, 1 insertion(+), 48 deletions(-)

diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h
index cf3288489a..51fa2f8079 100644
--- a/indra/llprimitive/llmodel.h
+++ b/indra/llprimitive/llmodel.h
@@ -154,7 +154,6 @@ public:
 	void ClearFacesAndMaterials() { mVolumeFaces.clear(); mMaterialList.clear(); }
 
 	std::string getName() const;
-	std::string getMetric() const {return mMetric;}
 	EModelStatus getStatus() const {return mStatus;}
 	static std::string getStatusString(U32 status) ;
 
@@ -260,8 +259,6 @@ public:
 	std::string mRequestedLabel; // name requested in UI, if any.
 	std::string mLabel; // name computed from dae.
 
-	std::string mMetric; // user-supplied metric data for upload
-
 	LLVector3 mNormalizedScale;
 	LLVector3 mNormalizedTranslation;
 
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 268c646719..818d364c3e 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -1418,8 +1418,6 @@ void LLModelPreview::rebuildUploadData()
 
 	std::string requested_name = mFMP->getChild<LLUICtrl>("description_form")->getValue().asString();
 
-	std::string metric = mFMP->getChild<LLUICtrl>("model_category_combo")->getValue().asString();
-
 	LLSpinCtrl* scale_spinner = mFMP->getChild<LLSpinCtrl>("import_scale");
 
 	F32 scale = scale_spinner->getValue().asReal();
@@ -1460,7 +1458,6 @@ void LLModelPreview::rebuildUploadData()
 			if (base_model && !requested_name.empty())
 			{
 				base_model->mRequestedLabel = requested_name;
-				base_model->mMetric = metric;
 			}
 
 			for (int i = LLModel::NUM_LODS - 1; i >= LLModel::LOD_IMPOSTOR; i--)
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index a689a0da0b..f32dad7f55 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -2174,7 +2174,6 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
 
 	std::map<LLModel*,S32> mesh_index;
 	std::string model_name;
-	std::string model_metric;
 
 	S32 instance_num = 0;
 	
@@ -2204,11 +2203,6 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
 				model_name = data.mBaseModel->getName();
 			}
 
-			if (model_metric.empty())
-			{
-				model_metric = data.mBaseModel->getMetric();
-			}
-
 			std::stringstream ostr;
 			
 			LLModel::Decomposition& decomp =
@@ -2363,11 +2357,6 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
 				model_name = data.mBaseModel->getName();
 			}
 
-			if (model_metric.empty())
-			{
-				model_metric = data.mBaseModel->getMetric();
-			}
-
 			std::stringstream ostr;
 			
 			LLModel::Decomposition& decomp =
@@ -2498,8 +2487,7 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
 
 	if (model_name.empty()) model_name = "mesh model";
 	result["name"] = model_name;
-	if (model_metric.empty()) model_metric = "MUT_Unspecified";
-	res["metric"] = model_metric;
+	res["metric"] = "MUT_Unspecified";
 	result["asset_resources"] = res;
 	dump_llsd_to_file(result,make_dump_name("whole_model_",dump_num));
 
diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
index 3db431de1b..5a86eb06fb 100644
--- a/indra/newview/skins/default/xui/en/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -73,35 +73,6 @@
           prevalidate_callback="ascii"
           top_pad="5"
           width="290" />
-        <text
-          follows="left|top"
-          height="15"
-          layout="topleft"
-          left_pad="15"
-          name="model_category_label"
-          text_color="White"
-          top="0"
-          width="200">
-          This model represents...
-        </text>
-        <combo_box
-          follows="left|top"
-          height="23"
-          left_pad="10"
-          name="model_category_combo"
-          top_pad="10"
-          width="200">
-        <combo_box.drop_down_button
-          label_color="White"/>
-          <combo_item name="Choose one" label="Choose One..." value="MUT_Unspecified"/>
-          <combo_item name="Avatar shape" label="Avatar shape" value="MUT_AvatarShape"/>
-          <combo_item name="Avatar attachment" label="Avatar attachment" value="MUT_AvatarAttachment"/>
-          <combo_item name="Moving object (vehicle, animal)" label="Moving object (vehicle, animal)" value="MUT_MovingObject"/>
-          <combo_item name="Building Component" label="Building Component" value="MUT_BuildingComponent"/>
-          <combo_item name="Large, non moving etc" label="Large, non moving etc" value="MUT_LargeStationary"/>
-          <combo_item name="Smaller, non-moving etc" label="Smaller, non-moving etc" value="MUT_SmallStationary"/>
-          <combo_item name="Not really any of these" label="Not really any of these" value="MUT_Other"/>
-         </combo_box>
     </panel>
     <tab_container
       follows="top|left"
-- 
cgit v1.2.3


From d9983255569eb5c49e8a414b4b8e8f56f9d33533 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Fri, 30 Nov 2018 17:29:54 +0200
Subject: SL-10145 Right clicking on unselected link in editor near selected
 text shows wrong menu

---
 indra/llui/lltexteditor.cpp | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 134b76c720..137167db2a 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -732,14 +732,30 @@ BOOL LLTextEditor::handleRightMouseDown(S32 x, S32 y, MASK mask)
 	{
 		setFocus(TRUE);
 	}
+
+	bool show_menu = false;
+
 	// Prefer editor menu if it has selection. See EXT-6806.
-	if (hasSelection() || !LLTextBase::handleRightMouseDown(x, y, mask))
+	if (hasSelection())
 	{
-		if(getShowContextMenu())
+		S32 click_pos = getDocIndexFromLocalCoord(x, y, FALSE);
+		if (click_pos > mSelectionStart && click_pos < mSelectionEnd)
 		{
-			showContextMenu(x, y);
+			show_menu = true;
 		}
 	}
+
+	// Let segments handle the click, if nothing does, show editor menu
+	if (!show_menu && !LLTextBase::handleRightMouseDown(x, y, mask))
+	{
+		show_menu = true;
+	}
+
+	if (show_menu && getShowContextMenu())
+	{
+		showContextMenu(x, y);
+	}
+
 	return TRUE;
 }
 
-- 
cgit v1.2.3


From 095c7eb0af14b600b5d41a3f72414da399a003a3 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Mon, 3 Dec 2018 16:14:22 +0200
Subject: SL-10150 'Preset in use' shows last used preset name after deleting
 it

---
 indra/newview/llfloaterpreference.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index d63ee1b367..92c9d1ae59 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -2600,6 +2600,10 @@ void LLPanelPreferenceGraphics::onPresetsListChange()
 	{
 		instance->saveSettings(); //make cancel work correctly after changing the preset
 	}
+	else
+	{
+		instance->saveGraphicsPreset(std::string());
+	}
 }
 
 void LLPanelPreferenceGraphics::setPresetText()
-- 
cgit v1.2.3


From c94e981f40652920a7fb5234a65369bf58d41865 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Mon, 3 Dec 2018 17:30:35 +0200
Subject: SL-10080 clamp instead of llmax

---
 indra/newview/llappviewer.cpp     | 6 +++---
 indra/newview/llviewercontrol.cpp | 6 +++---
 indra/newview/llvoavatar.h        | 2 ++
 3 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index bd45f68a5c..7c79cc7ddf 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -568,12 +568,12 @@ static void settings_to_globals()
 	LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO");
 	LLImageGL::sGlobalUseAnisotropic	= gSavedSettings.getBOOL("RenderAnisotropic");
 	LLImageGL::sCompressTextures		= gSavedSettings.getBOOL("RenderCompressTextures");
-	LLVOVolume::sLODFactor				= llmin(gSavedSettings.getF32("RenderVolumeLODFactor"), MAX_LOD_FACTOR);
+	LLVOVolume::sLODFactor				= llclamp(gSavedSettings.getF32("RenderVolumeLODFactor"), 0.01f, MAX_LOD_FACTOR);
 	LLVOVolume::sDistanceFactor			= 1.f-LLVOVolume::sLODFactor * 0.1f;
 	LLVolumeImplFlexible::sUpdateFactor = gSavedSettings.getF32("RenderFlexTimeFactor");
 	LLVOTree::sTreeFactor				= gSavedSettings.getF32("RenderTreeLODFactor");
-	LLVOAvatar::sLODFactor				= llmin(gSavedSettings.getF32("RenderAvatarLODFactor"), MAX_LOD_FACTOR);
-	LLVOAvatar::sPhysicsLODFactor		= llmin(gSavedSettings.getF32("RenderAvatarPhysicsLODFactor"), MAX_LOD_FACTOR);
+	LLVOAvatar::sLODFactor				= llclamp(gSavedSettings.getF32("RenderAvatarLODFactor"), 0.f, MAX_AVATAR_LOD_FACTOR);
+	LLVOAvatar::sPhysicsLODFactor		= llclamp(gSavedSettings.getF32("RenderAvatarPhysicsLODFactor"), 0.f, MAX_AVATAR_LOD_FACTOR);
 	LLVOAvatar::updateImpostorRendering(gSavedSettings.getU32("RenderAvatarMaxNonImpostors"));
 	LLVOAvatar::sVisibleInFirstPerson	= gSavedSettings.getBOOL("FirstPersonAvatarVisible");
 	// clamp auto-open time to some minimum usable value
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index e62d6eb951..a699491e1b 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -219,20 +219,20 @@ static bool handleAnisotropicChanged(const LLSD& newvalue)
 
 static bool handleVolumeLODChanged(const LLSD& newvalue)
 {
-	LLVOVolume::sLODFactor = llmin((F32) newvalue.asReal(), MAX_LOD_FACTOR);
+	LLVOVolume::sLODFactor = llclamp((F32) newvalue.asReal(), 0.01f, MAX_LOD_FACTOR);
 	LLVOVolume::sDistanceFactor = 1.f-LLVOVolume::sLODFactor * 0.1f;
 	return true;
 }
 
 static bool handleAvatarLODChanged(const LLSD& newvalue)
 {
-	LLVOAvatar::sLODFactor = llmin((F32) newvalue.asReal(), MAX_LOD_FACTOR);
+	LLVOAvatar::sLODFactor = llclamp((F32) newvalue.asReal(), 0.f, MAX_AVATAR_LOD_FACTOR);
 	return true;
 }
 
 static bool handleAvatarPhysicsLODChanged(const LLSD& newvalue)
 {
-	LLVOAvatar::sPhysicsLODFactor = llmin((F32) newvalue.asReal(), MAX_LOD_FACTOR);
+	LLVOAvatar::sPhysicsLODFactor = llclamp((F32) newvalue.asReal(), 0.f, MAX_AVATAR_LOD_FACTOR);
 	return true;
 }
 
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index deb22617a4..a4f8e95c65 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -75,6 +75,8 @@ class LLTexGlobalColor;
 struct LLAppearanceMessageContents;
 class LLViewerJointMesh;
 
+const F32 MAX_AVATAR_LOD_FACTOR = 1.0f;
+
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // LLVOAvatar
-- 
cgit v1.2.3


From a39d330cc22c603d5c06fabe86104e8948573e20 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Mon, 3 Dec 2018 20:27:44 +0200
Subject: SL-10152 Uninstaller's offers to delete remaining files is
 problematic

---
 .../newview/installers/windows/installer_template.nsi |   4 +---
 indra/newview/installers/windows/lang_en-us.nsi       | Bin 8734 -> 8814 bytes
 2 files changed, 1 insertion(+), 3 deletions(-)

diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index 14c8dba39f..d6e4b005df 100644
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -651,9 +651,7 @@ RMDir "$INSTDIR"
 IfFileExists "$INSTDIR" FOLDERFOUND NOFOLDER
 
 FOLDERFOUND:
-# Silent uninstall always removes all files (/SD IDYES)
-  MessageBox MB_YESNO $(DeleteProgramFilesMB) /SD IDYES IDNO NOFOLDER
-  RMDir /r "$INSTDIR"
+  MessageBox MB_OK $(DeleteProgramFilesMB) /SD IDOK IDOK NOFOLDER
 
 NOFOLDER:
 
diff --git a/indra/newview/installers/windows/lang_en-us.nsi b/indra/newview/installers/windows/lang_en-us.nsi
index 00aa47de69..f854f5db06 100644
Binary files a/indra/newview/installers/windows/lang_en-us.nsi and b/indra/newview/installers/windows/lang_en-us.nsi differ
-- 
cgit v1.2.3


From 320b7bacc2ef34b1434178cce8eb2818493fec21 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Tue, 4 Dec 2018 18:51:44 +0200
Subject: SL-10149 FIXED 'Mute when minimized' checkbox is displayed without
 focus on it after pressing on label in the "Preferences" floater

---
 indra/llui/llcheckboxctrl.h           | 2 ++
 indra/newview/llfloaterpreference.cpp | 6 ++++++
 2 files changed, 8 insertions(+)

diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h
index 5ce45b2135..71bdc32e66 100644
--- a/indra/llui/llcheckboxctrl.h
+++ b/indra/llui/llcheckboxctrl.h
@@ -92,6 +92,8 @@ public:
 	// LLCheckBoxCtrl interface
 	virtual BOOL		toggle()				{ return mButton->toggleState(); }		// returns new state
 
+	void				setBtnFocus() { mButton->setFocus(TRUE); }
+
 	void				setEnabledColor( const LLColor4 &color ) { mTextEnabledColor = color; }
 	void				setDisabledColor( const LLColor4 &color ) { mTextDisabledColor = color; }
 
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 92c9d1ae59..c66247b4b7 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -2329,6 +2329,7 @@ BOOL LLPanelPreference::postBuild()
 	if (hasChild("mute_chb_label", TRUE))
 	{
 		getChild<LLTextBox>("mute_chb_label")->setShowCursorHand(false);
+		getChild<LLTextBox>("mute_chb_label")->setSoundFlags(LLView::MOUSE_UP);
 		getChild<LLTextBox>("mute_chb_label")->setClickedCallback(boost::bind(&toggleMuteWhenMinimized));
 	}
 
@@ -2452,6 +2453,11 @@ void LLPanelPreference::toggleMuteWhenMinimized()
 {
 	std::string mute("MuteWhenMinimized");
 	gSavedSettings.setBOOL(mute, !gSavedSettings.getBOOL(mute));
+	LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
+	if (instance)
+	{
+		instance->getChild<LLCheckBoxCtrl>("mute_when_minimized")->setBtnFocus();
+	}
 }
 
 void LLPanelPreference::cancel()
-- 
cgit v1.2.3


From 6e87cc5a7570884e81c671bd6e94e3a2b68099ad Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Tue, 4 Dec 2018 20:45:49 +0200
Subject: mac build fix

---
 indra/newview/llfloaterpreference.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index c66247b4b7..ac751a785d 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -2608,7 +2608,8 @@ void LLPanelPreferenceGraphics::onPresetsListChange()
 	}
 	else
 	{
-		instance->saveGraphicsPreset(std::string());
+		std::string dummy;
+		instance->saveGraphicsPreset(dummy);
 	}
 }
 
-- 
cgit v1.2.3


From 4c92c7b2d025b7cd85bf176287b86a3990959841 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Tue, 4 Dec 2018 17:52:46 +0200
Subject: SL-1481 Don't predict region crossings over a second

---
 indra/newview/app_settings/settings.xml | 11 +++++++
 indra/newview/llviewerobject.cpp        | 58 ++++++++++++++++++++++++---------
 indra/newview/llviewerobject.h          |  4 ++-
 indra/newview/llviewerobjectlist.cpp    |  2 ++
 4 files changed, 59 insertions(+), 16 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 3ad8b6cded..0eef5120eb 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -14068,6 +14068,17 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
+    <key>RegionCrossingInterpolationTime</key>
+    <map>
+      <key>Comment</key>
+      <string>How long to extrapolate object motion after crossing regions</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>F32</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
     <key>VerboseLogs</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 1e46a1cf9e..079a9f0372 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -127,6 +127,7 @@ BOOL		LLViewerObject::sUseSharedDrawables(FALSE); // TRUE
 // sMaxUpdateInterpolationTime must be greater than sPhaseOutUpdateInterpolationTime
 F64Seconds	LLViewerObject::sMaxUpdateInterpolationTime(3.0);		// For motion interpolation: after X seconds with no updates, don't predict object motion
 F64Seconds	LLViewerObject::sPhaseOutUpdateInterpolationTime(2.0);	// For motion interpolation: after Y seconds with no updates, taper off motion prediction
+F64Seconds	LLViewerObject::sMaxRegionCrossingInterpolationTime(1.0);// For motion interpolation: don't interpolate over this time on region crossing
 
 std::map<std::string, U32> LLViewerObject::sObjectDataMap;
 
@@ -2487,7 +2488,7 @@ void LLViewerObject::loadFlags(U32 flags)
 	return;
 }
 
-void LLViewerObject::idleUpdate(LLAgent &agent, const F64 &time)
+void LLViewerObject::idleUpdate(LLAgent &agent, const F64 &frame_time)
 {
 	//static LLTrace::BlockTimerStatHandle ftm("Viewer Object");
 	//LL_RECORD_BLOCK_TIME(ftm);
@@ -2498,19 +2499,19 @@ void LLViewerObject::idleUpdate(LLAgent &agent, const F64 &time)
 		{
 			// calculate dt from last update
 			F32 time_dilation = mRegionp ? mRegionp->getTimeDilation() : 1.0f;
-			F32 dt_raw = ((F64Seconds)time - mLastInterpUpdateSecs).value();
+			F32 dt_raw = ((F64Seconds)frame_time - mLastInterpUpdateSecs).value();
 			F32 dt = time_dilation * dt_raw;
 
 			applyAngularVelocity(dt);
 
 			if (isAttachment())
 			{
-				mLastInterpUpdateSecs = (F64Seconds)time;
+				mLastInterpUpdateSecs = (F64Seconds)frame_time;
 				return;
 			}
 			else
 			{	// Move object based on it's velocity and rotation
-				interpolateLinearMotion(time, dt);
+				interpolateLinearMotion(frame_time, dt);
 			}
 		}
 
@@ -2520,7 +2521,7 @@ void LLViewerObject::idleUpdate(LLAgent &agent, const F64 &time)
 
 
 // Move an object due to idle-time viewer side updates by interpolating motion
-void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, const F32SecondsImplicit& dt_seconds)
+void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& frame_time, const F32SecondsImplicit& dt_seconds)
 {
 	// linear motion
 	// PHYSICS_TIMESTEP is used below to correct for the fact that the velocity in object
@@ -2532,7 +2533,7 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, con
 	// zeroing it out	
 
 	F32 dt = dt_seconds;
-	F64Seconds time_since_last_update = time - mLastMessageUpdateSecs;
+	F64Seconds time_since_last_update = frame_time - mLastMessageUpdateSecs;
 	if (time_since_last_update <= (F64Seconds)0.0 || dt <= 0.f)
 	{
 		return;
@@ -2580,7 +2581,7 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, con
 						 (time_since_last_packet > sPhaseOutUpdateInterpolationTime))
 					{
 						// Start to reduce motion interpolation since we haven't seen a server update in a while
-						F64Seconds time_since_last_interpolation = time - mLastInterpUpdateSecs;
+						F64Seconds time_since_last_interpolation = frame_time - mLastInterpUpdateSecs;
 						F64 phase_out = 1.0;
 						if (time_since_last_update > sMaxUpdateInterpolationTime)
 						{	// Past the time limit, so stop the object
@@ -2636,6 +2637,7 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, con
 
 		// Check to see if it's going off the region
 		LLVector3 temp(new_pos);
+		static F64SecondsImplicit region_cross_expire = 0; // frame time we detected region crossing in + wait time
 		if (temp.clamp(0.f, mRegionp->getWidth()))
 		{	// Going off this region, so see if we might end up on another region
 			LLVector3d old_pos_global = mRegionp->getPosGlobalFromRegion(getPositionRegion());
@@ -2644,21 +2646,47 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, con
 			// Clip the positions to known regions
 			LLVector3d clip_pos_global = LLWorld::getInstance()->clipToVisibleRegions(old_pos_global, new_pos_global);
 			if (clip_pos_global != new_pos_global)
-			{	// Was clipped, so this means we hit a edge where there is no region to enter
-				
-				//LL_INFOS() << "Hit empty region edge, clipped predicted position to " << mRegionp->getPosRegionFromGlobal(clip_pos_global)
-				//	<< " from " << new_pos << LL_ENDL;
-				new_pos = mRegionp->getPosRegionFromGlobal(clip_pos_global);
+			{
+				// Was clipped, so this means we hit a edge where there is no region to enter
+				LLVector3 clip_pos = mRegionp->getPosRegionFromGlobal(clip_pos_global);
+				LL_DEBUGS("Interpolate") << "Hit empty region edge, clipped predicted position to "
+										 << clip_pos
+										 << " from " << new_pos << LL_ENDL;
+				new_pos = clip_pos;
 				
 				// Stop motion and get server update for bouncing on the edge
 				new_v.clear();
 				setAcceleration(LLVector3::zero);
 			}
 			else
-			{	// Let predicted movement cross into another region
-				//LL_INFOS() << "Predicting region crossing to " << new_pos << LL_ENDL;
+			{
+				// Check for how long we are crossing.
+				// Note: theoretically we can find time from velocity, acceleration and
+				// distance from border to new position, but it is not going to work
+				// if 'phase_out' activates
+				if (region_cross_expire == 0)
+				{
+					// Workaround: we can't accurately figure out time when we cross border
+					// so just write down time 'after the fact', it is far from optimal in
+					// case of lags, but for lags sMaxUpdateInterpolationTime will kick in first
+					LL_DEBUGS("Interpolate") << "Predicted region crossing, new position " << new_pos << LL_ENDL;
+					region_cross_expire = frame_time + sMaxRegionCrossingInterpolationTime;
+				}
+				else if (frame_time > region_cross_expire)
+				{
+					// Predicting crossing over 1s, stop motion
+					// Stop motion
+					LL_DEBUGS("Interpolate") << "Predicting region crossing for too long, stopping at " << new_pos << LL_ENDL;
+					new_v.clear();
+					setAcceleration(LLVector3::zero);
+					region_cross_expire = 0;
+				}
 			}
 		}
+		else
+		{
+			region_cross_expire = 0;
+		}
 
 		// Set new position and velocity
 		setPositionRegion(new_pos);
@@ -2669,7 +2697,7 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, con
 	}		
 
 	// Update the last time we did anything
-	mLastInterpUpdateSecs = time;
+	mLastInterpUpdateSecs = frame_time;
 }
 
 
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index d6c8b76147..990c392531 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -615,7 +615,7 @@ private:
     U32 checkMediaURL(const std::string &media_url);
 	
 	// Motion prediction between updates
-	void interpolateLinearMotion(const F64SecondsImplicit & time, const F32SecondsImplicit & dt);
+	void interpolateLinearMotion(const F64SecondsImplicit & frame_time, const F32SecondsImplicit & dt);
 
 	static void initObjectDataMap();
 
@@ -851,6 +851,7 @@ protected:
 
 	static void setPhaseOutUpdateInterpolationTime(F32 value)	{ sPhaseOutUpdateInterpolationTime = (F64Seconds) value;	}
 	static void setMaxUpdateInterpolationTime(F32 value)		{ sMaxUpdateInterpolationTime = (F64Seconds) value;	}
+	static void setMaxRegionCrossingInterpolationTime(F32 value)		{ sMaxRegionCrossingInterpolationTime = (F64Seconds) value; }
 
 	static void	setVelocityInterpolate(BOOL value)		{ sVelocityInterpolate = value;	}
 	static void	setPingInterpolate(BOOL value)			{ sPingInterpolate = value;	}
@@ -860,6 +861,7 @@ private:
 
 	static F64Seconds sPhaseOutUpdateInterpolationTime;	// For motion interpolation
 	static F64Seconds sMaxUpdateInterpolationTime;			// For motion interpolation
+	static F64Seconds sMaxRegionCrossingInterpolationTime;			// For motion interpolation
 
 	static BOOL sVelocityInterpolate;
 	static BOOL sPingInterpolate;
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 2aff71367e..932759c86d 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -854,6 +854,7 @@ void LLViewerObjectList::update(LLAgent &agent)
 	
 	F32 interp_time = gSavedSettings.getF32("InterpolationTime");
 	F32 phase_out_time = gSavedSettings.getF32("InterpolationPhaseOut");
+	F32 region_interp_time = llclamp(gSavedSettings.getF32("RegionCrossingInterpolationTime"), 0.5f, 5.f);
 	if (interp_time < 0.0 || 
 		phase_out_time < 0.0 ||
 		phase_out_time > interp_time)
@@ -864,6 +865,7 @@ void LLViewerObjectList::update(LLAgent &agent)
 	}
 	LLViewerObject::setPhaseOutUpdateInterpolationTime( interp_time );
 	LLViewerObject::setMaxUpdateInterpolationTime( phase_out_time );
+	LLViewerObject::setMaxRegionCrossingInterpolationTime(region_interp_time);
 
 	gAnimateTextures = gSavedSettings.getBOOL("AnimateTextures");
 
-- 
cgit v1.2.3


From b39cfe229ba127b9ac3e47edd1255b95fe32c5ea Mon Sep 17 00:00:00 2001
From: Mnikolenko ProductEngine <mnikolenko@productengine.com>
Date: Fri, 7 Dec 2018 13:31:54 +0200
Subject: SL-10175 Update copyright year in application info

---
 indra/newview/CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index ce8b662231..33886acb71 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -2074,7 +2074,7 @@ if (DARWIN)
   set(MACOSX_BUNDLE_BUNDLE_NAME "SecondLife")
   set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${VIEWER_SHORT_VERSION}")
   set(MACOSX_BUNDLE_BUNDLE_VERSION "${VIEWER_SHORT_VERSION}${VIEWER_MACOSX_PHASE}${VIEWER_REVISION}")
-  set(MACOSX_BUNDLE_COPYRIGHT "Copyright © Linden Research, Inc. 2007")
+  set(MACOSX_BUNDLE_COPYRIGHT "Copyright © Linden Research, Inc. 2018")
   set(MACOSX_BUNDLE_NSMAIN_NIB_FILE "SecondLife.nib")
   set(MACOSX_BUNDLE_NSPRINCIPAL_CLASS "NSApplication")
   
-- 
cgit v1.2.3


From a48ff6c2fadb5697ab204a34ac696f1ce920e02d Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Thu, 6 Dec 2018 19:50:33 +0200
Subject: SL-10172 Add a KB link to the TLS failure dialog

---
 indra/newview/llxmlrpctransaction.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp
index 143c97fca4..f5c169996f 100644
--- a/indra/newview/llxmlrpctransaction.cpp
+++ b/indra/newview/llxmlrpctransaction.cpp
@@ -507,6 +507,8 @@ void LLXMLRPCTransaction::Impl::setHttpStatus(const LLCore::HttpStatus &status)
 
 	case CURLE_SSL_CACERT:
 	case CURLE_SSL_CONNECT_ERROR:
+		{
+		std::string uri_base = "https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3";
 		message =
 			"Often this means that your computer\'s clock is set incorrectly.\n"
 			"Please go to Control Panels and make sure the time and date\n"
@@ -514,8 +516,9 @@ void LLXMLRPCTransaction::Impl::setHttpStatus(const LLCore::HttpStatus &status)
 			"Also check that your network and firewall are set up correctly.\n"
 			"If you continue to receive this error, please go\n"
 			"to the Support section of the SecondLife.com web site\n"
-			"and report the problem.";
+			"and report the problem.\n\n[" + uri_base + " Knowledge Base]";
 		break;
+		}
 
 	default:
 		break;
-- 
cgit v1.2.3


From 221201de4eaba585ae713b279a0e9ba1c8fd61cf Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Sun, 9 Dec 2018 20:57:36 +0200
Subject: SL-10001 Fixed scale

---
 indra/newview/llmanip.cpp | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp
index 1dc03123eb..6589aa477f 100644
--- a/indra/newview/llmanip.cpp
+++ b/indra/newview/llmanip.cpp
@@ -441,14 +441,13 @@ void LLManip::renderXYZ(const LLVector3 &vec)
 		LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Square");
 		gViewerWindow->setup2DRender();
 		const LLVector2& display_scale = gViewerWindow->getDisplayScale();
-		gGL.scalef(display_scale.mV[VX], display_scale.mV[VY], 1.f);
 		gGL.color4f(0.f, 0.f, 0.f, 0.7f);
 
 		imagep->draw(
-			window_center_x - 115, 
-			window_center_y + vertical_offset - PAD, 
-			235,
-			PAD * 2 + 10, 
+			(window_center_x - 115) * display_scale.mV[VX],
+			(window_center_y + vertical_offset - PAD) * display_scale.mV[VY],
+			235 * display_scale.mV[VX],
+			(PAD * 2 + 10) * display_scale.mV[VY],
 			LLColor4(0.f, 0.f, 0.f, 0.7f) );
 
         LLFontGL* font = LLFontGL::getFontSansSerif();
-- 
cgit v1.2.3


From 1e5ad657abcff4f3bd8d4b6f870e15b75215799d Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Mon, 10 Dec 2018 18:28:45 +0200
Subject: SL-10092 Autoreplace Keyword was not working with non-English
 characters

---
 indra/newview/llautoreplace.cpp | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llautoreplace.cpp b/indra/newview/llautoreplace.cpp
index dd9354fe3a..0516520c56 100644
--- a/indra/newview/llautoreplace.cpp
+++ b/indra/newview/llautoreplace.cpp
@@ -68,8 +68,8 @@ void LLAutoReplace::autoreplaceCallback(S32& replacement_start, S32& replacement
 					word_start--; // walk word_start back to the beginning of the word
 				}
 				LL_DEBUGS("AutoReplace") << "word_start: " << word_start << " word_end: " << word_end << LL_ENDL;
-				std::string str_text  = std::string(input_text.begin(), input_text.end());
-				std::string last_word = str_text.substr(word_start, word_end - word_start + 1);
+				LLWString old_string = input_text.substr(word_start, word_end - word_start + 1);
+				std::string last_word = wstring_to_utf8str(old_string);
 				std::string replacement_word(mSettings.replaceWord(last_word));
 
 				if (replacement_word != last_word)
@@ -79,9 +79,8 @@ void LLAutoReplace::autoreplaceCallback(S32& replacement_start, S32& replacement
 					{
 						// return the replacement string
 						replacement_start = word_start;
-						replacement_length = last_word.length();
+						replacement_length = word_end - word_start + 1;
 						replacement_string = utf8str_to_wstring(replacement_word);
-						LLWString old_string = utf8str_to_wstring(last_word);
 						S32 size_change = replacement_string.size() - old_string.size();
 						cursor_pos += size_change;
 					}
-- 
cgit v1.2.3


From c658e891345fd98dcededa5c21efc17993805522 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Wed, 12 Dec 2018 15:24:26 +0200
Subject: SL-9512 Move constant to common place

---
 indra/newview/lltoastnotifypanel.cpp   | 8 +++-----
 indra/newview/lltoastpanel.cpp         | 3 +++
 indra/newview/lltoastpanel.h           | 1 +
 indra/newview/lltoastscripttextbox.cpp | 4 +---
 4 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index e3a856be5c..a2116817a2 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -46,8 +46,6 @@
 const S32 BOTTOM_PAD = VPAD * 3;
 const S32 IGNORE_BTN_TOP_DELTA = 3*VPAD;//additional ignore_btn padding
 S32 BUTTON_WIDTH = 90;
-// *TODO: magic numbers - copied from llnotify.cpp(250)
-const S32 MAX_LENGTH = 512 + 20 + DB_FIRST_NAME_BUF_SIZE + DB_LAST_NAME_BUF_SIZE + DB_INV_ITEM_NAME_BUF_SIZE; 
 
 
 //static
@@ -319,7 +317,7 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )
         mTextBox = getChild<LLTextEditor>("text_editor_box"); 
     }
 
-    mTextBox->setMaxTextLength(MAX_LENGTH);
+    mTextBox->setMaxTextLength(LLToastPanel::MAX_TEXT_LENGTH);
     mTextBox->setVisible(TRUE);
     mTextBox->setPlainText(!show_images);
     mTextBox->setContentTrusted(is_content_trusted);
@@ -411,7 +409,7 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )
 	//.xml file intially makes info panel only follow left/right/top. This is so that when control buttons are added the info panel 
 	//can shift upward making room for the buttons inside mControlPanel. After the buttons are added, the info panel can then be set to follow 'all'.
 	mInfoPanel->setFollowsAll();
-    snapToMessageHeight(mTextBox, MAX_LENGTH);
+	snapToMessageHeight(mTextBox, LLToastPanel::MAX_TEXT_LENGTH);
 
 	// reshape the panel to its previous size
 	if (current_rect.notEmpty())
@@ -472,7 +470,7 @@ void LLIMToastNotifyPanel::snapToMessageHeight()
 	//Add message height if it is visible
 	if (mTextBox->getVisible())
 	{
-		S32 new_panel_height = computeSnappedToMessageHeight(mTextBox, MAX_LENGTH);
+		S32 new_panel_height = computeSnappedToMessageHeight(mTextBox, LLToastPanel::MAX_TEXT_LENGTH);
 
 		//reshape the panel with new height
 		if (new_panel_height != getRect().getHeight())
diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp
index e1b764a943..7c624d5b50 100644
--- a/indra/newview/lltoastpanel.cpp
+++ b/indra/newview/lltoastpanel.cpp
@@ -26,6 +26,7 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "lldbstrings.h"
 #include "llpanelgenerictip.h"
 #include "llpanelonlinestatus.h"
 #include "llnotifications.h"
@@ -35,6 +36,8 @@
 
 //static
 const S32 LLToastPanel::MIN_PANEL_HEIGHT = 40; // VPAD(4)*2 + ICON_HEIGHT(32)
+// 'magic numbers', consider initializing (512+20) part from xml/notifications
+const S32 LLToastPanel::MAX_TEXT_LENGTH = 512 + 20 + DB_FIRST_NAME_BUF_SIZE + DB_LAST_NAME_BUF_SIZE + DB_INV_ITEM_NAME_BUF_SIZE;
 
 LLToastPanel::LLToastPanel(const LLNotificationPtr& notification)
 {
diff --git a/indra/newview/lltoastpanel.h b/indra/newview/lltoastpanel.h
index 51630381f2..6a9b72a5ae 100644
--- a/indra/newview/lltoastpanel.h
+++ b/indra/newview/lltoastpanel.h
@@ -49,6 +49,7 @@ public:
 	virtual const LLUUID& getID();
 
 	static const S32 MIN_PANEL_HEIGHT;
+	static const S32 MAX_TEXT_LENGTH;
 
 	/**
 	 * Builder method for constructing notification specific panels.
diff --git a/indra/newview/lltoastscripttextbox.cpp b/indra/newview/lltoastscripttextbox.cpp
index 518c6c0ee4..eb86a44055 100644
--- a/indra/newview/lltoastscripttextbox.cpp
+++ b/indra/newview/lltoastscripttextbox.cpp
@@ -36,8 +36,6 @@
 #include "llviewertexteditor.h"
 
 const S32 LLToastScriptTextbox::DEFAULT_MESSAGE_MAX_LINE_COUNT= 14;
-// *TODO: magic numbers - copied from lltoastnotifypanel.cpp(50) which was copied from llnotify.cpp(250)
-const S32 MAX_LENGTH = 512 + 20 + DB_FIRST_NAME_BUF_SIZE + DB_LAST_NAME_BUF_SIZE + DB_INV_ITEM_NAME_BUF_SIZE;
 
 LLToastScriptTextbox::LLToastScriptTextbox(const LLNotificationPtr& notification)
 :	LLToastPanel(notification)
@@ -45,7 +43,7 @@ LLToastScriptTextbox::LLToastScriptTextbox(const LLNotificationPtr& notification
 	buildFromFile( "panel_notify_textbox.xml");
 
 	mInfoText = getChild<LLTextEditor>("text_editor_box");
-	mInfoText->setMaxTextLength(MAX_LENGTH);
+	mInfoText->setMaxTextLength(LLToastPanel::MAX_TEXT_LENGTH);
 	mInfoText->setValue(notification->getMessage());
 
 	getChild<LLButton>("ignore_btn")->setClickedCallback(boost::bind(&LLToastScriptTextbox::onClickIgnore, this));
-- 
cgit v1.2.3


From 21d4ce26d3b3db5458321271ea5b7c7069289c94 Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Wed, 12 Dec 2018 00:11:16 +0200
Subject: INTL-324 added support for TLS failure dialog localization

---
 indra/newview/llxmlrpctransaction.cpp          | 31 ++++++--------------------
 indra/newview/skins/default/xui/en/strings.xml | 25 +++++++++++++++++++++
 2 files changed, 32 insertions(+), 24 deletions(-)

diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp
index f5c169996f..cc223c1f48 100644
--- a/indra/newview/llxmlrpctransaction.cpp
+++ b/indra/newview/llxmlrpctransaction.cpp
@@ -483,42 +483,25 @@ void LLXMLRPCTransaction::Impl::setHttpStatus(const LLCore::HttpStatus &status)
 {
 	CURLcode code = static_cast<CURLcode>(status.toULong());
 	std::string message;
-	std::string uri = "http://secondlife.com/community/support.php";
+	std::string uri = "http://support.secondlife.com";
 	LLURI failuri(mURI);
-
+	LLStringUtil::format_map_t args;
 
 	switch (code)
 	{
 	case CURLE_COULDNT_RESOLVE_HOST:
-		message =
-			std::string("DNS could not resolve the host name(") + failuri.hostName() + ").\n"
-			"Please verify that you can connect to the www.secondlife.com\n"
-			"web site.  If you can, but continue to receive this error,\n"
-			"please go to the support section and report this problem.";
+		args["[HOSTNAME]"] = failuri.hostName();
+		message = LLTrans::getString("couldnt_resolve_host", args);
 		break;
 
 	case CURLE_SSL_PEER_CERTIFICATE:
-		message =
-			"The login server couldn't verify itself via SSL.\n"
-			"If you continue to receive this error, please go\n"
-			"to the Support section of the SecondLife.com web site\n"
-			"and report the problem.";
+		message = LLTrans::getString("ssl_peer_certificate");
 		break;
 
 	case CURLE_SSL_CACERT:
-	case CURLE_SSL_CONNECT_ERROR:
-		{
-		std::string uri_base = "https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3";
-		message =
-			"Often this means that your computer\'s clock is set incorrectly.\n"
-			"Please go to Control Panels and make sure the time and date\n"
-			"are set correctly.\n"
-			"Also check that your network and firewall are set up correctly.\n"
-			"If you continue to receive this error, please go\n"
-			"to the Support section of the SecondLife.com web site\n"
-			"and report the problem.\n\n[" + uri_base + " Knowledge Base]";
+	case CURLE_SSL_CONNECT_ERROR:		
+		message = LLTrans::getString("ssl_connect_error");
 		break;
-		}
 
 	default:
 		break;
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index f5f4b4acab..e8fdb2d5b1 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -4233,4 +4233,29 @@ Try enclosing path to the editor with double quotes.
       The physics shape does not have correct version. Set the correct version for the physics model.
   </string>
 
+  <!-- CURL error messages -->
+  <string name="couldnt_resolve_host">
+DNS could not resolve the host name([HOSTNAME]).
+Please verify that you can connect to the www.secondlife.com
+web site.  If you can, but continue to receive this error,
+please go to the support section and report this problem.
+  </string>
+  <string name="ssl_peer_certificate">
+The login server couldn't verify itself via SSL.
+If you continue to receive this error, please go
+to the Support section of the SecondLife.com web site
+and report the problem.
+  </string>
+  <string name="ssl_connect_error">
+Often this means that your computer's clock is set incorrectly.
+Please go to Control Panels and make sure the time and date
+are set correctly.
+Also check that your network and firewall are set up correctly.
+If you continue to receive this error, please go
+to the Support section of the SecondLife.com web site
+and report the problem.
+
+[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Knowledge Base]
+  </string>
+
 </strings>
-- 
cgit v1.2.3


From 701ae96ff685847c8ddb46a4460fd70940733255 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Thu, 13 Dec 2018 12:37:18 +0200
Subject: SL-10228 FIXED HTTP/HTTPS URL in the object name is represented as a
 hyperlink in message floater

---
 .../newview/skins/default/xui/en/notifications.xml | 28 +++++++++++-----------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index cc57e1375a..23a8d21f8a 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -1845,7 +1845,7 @@ You are not allowed to terraform parcel [PARCEL].
    name="CannotCopyWarning"
    type="alertmodal">
 You do not have permission to copy the following items:
-[ITEMS]
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
 and will lose it from your inventory if you give it away. Do you really want to offer these items?
     <tag>confirm</tag>
     <usetemplate
@@ -9479,7 +9479,7 @@ You Can't create trees and grass on land you don't own.
    name="NoCopyPermsNoObject"
    type="notify">
    <tag>fail</tag>
-Copy failed because you lack permission to copy the object '[OBJ_NAME]'.
+Copy failed because you lack permission to copy the object &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt;.
   </notification>
 
   <notification
@@ -9487,7 +9487,7 @@ Copy failed because you lack permission to copy the object '[OBJ_NAME]'.
    name="NoTransPermsNoObject"
    type="notify">
    <tag>fail</tag>
-Copy failed because the object '[OBJ_NAME]' cannot be transferred to you.
+Copy failed because the object &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; cannot be transferred to you.
   </notification>
 
   <notification
@@ -9495,7 +9495,7 @@ Copy failed because the object '[OBJ_NAME]' cannot be transferred to you.
    name="AddToNavMeshNoCopy"
    type="notify">
    <tag>fail</tag>
-Copy failed because the object '[OBJ_NAME]' contributes to navmesh.
+Copy failed because the object &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; contributes to navmesh.
   </notification>
 
   <notification
@@ -9619,7 +9619,7 @@ Save Back To Inventory has been disabled.
    name="NoExistNoSaveToContents"
    type="notify">
    <tag>fail</tag>
-Cannot save '[OBJ_NAME]' to object contents because the object it was rezzed from no longer exists.
+Cannot save &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; to object contents because the object it was rezzed from no longer exists.
   </notification>
 
   <notification
@@ -9627,7 +9627,7 @@ Cannot save '[OBJ_NAME]' to object contents because the object it was rezzed fro
    name="NoModNoSaveToContents"
    type="notify">
    <tag>fail</tag>
-Cannot save '[OBJ_NAME]' to object contents because you do not have permission to modify the object '[DEST_NAME]'.
+Cannot save &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; to object contents because you do not have permission to modify the object &lt;nolink&gt;'[DEST_NAME]'&lt;/nolink&gt;.
   </notification>
 
   <notification
@@ -9635,7 +9635,7 @@ Cannot save '[OBJ_NAME]' to object contents because you do not have permission t
    name="NoSaveBackToInvDisabled"
    type="notify">
    <tag>fail</tag>
-Cannot save '[OBJ_NAME]' back to inventory -- this operation has been disabled.
+Cannot save &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; back to inventory -- this operation has been disabled.
   </notification>
 
   <notification
@@ -9643,7 +9643,7 @@ Cannot save '[OBJ_NAME]' back to inventory -- this operation has been disabled.
    name="NoCopyNoSelCopy"
    type="notify">
    <tag>fail</tag>
-You cannot copy your selection because you do not have permission to copy the object '[OBJ_NAME]'.
+You cannot copy your selection because you do not have permission to copy the object &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt;.
   </notification>
 
   <notification
@@ -9651,7 +9651,7 @@ You cannot copy your selection because you do not have permission to copy the ob
    name="NoTransNoSelCopy"
    type="notify">
    <tag>fail</tag>
-You cannot copy your selection because the object '[OBJ_NAME]' is not transferrable.
+You cannot copy your selection because the object &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; is not transferrable.
   </notification>
 
   <notification
@@ -9659,7 +9659,7 @@ You cannot copy your selection because the object '[OBJ_NAME]' is not transferra
    name="NoTransNoCopy"
    type="notify">
    <tag>fail</tag>
-You cannot copy your selection because the object '[OBJ_NAME]' is not transferrable.
+You cannot copy your selection because the object &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; is not transferrable.
   </notification>
 
   <notification
@@ -9667,7 +9667,7 @@ You cannot copy your selection because the object '[OBJ_NAME]' is not transferra
    name="NoPermsNoRemoval"
    type="notify">
    <tag>fail</tag>
-Removal of the object '[OBJ_NAME]' from the simulator is disallowed by the permissions system.
+Removal of the object &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; from the simulator is disallowed by the permissions system.
   </notification>
 
   <notification
@@ -9675,7 +9675,7 @@ Removal of the object '[OBJ_NAME]' from the simulator is disallowed by the permi
    name="NoModNoSaveSelection"
    type="notify">
    <tag>fail</tag>
-Cannot save your selection because you do not have permission to modify the object '[OBJ_NAME]'.
+Cannot save your selection because you do not have permission to modify the object &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt;.
   </notification>
 
   <notification
@@ -9683,7 +9683,7 @@ Cannot save your selection because you do not have permission to modify the obje
    name="NoCopyNoSaveSelection"
    type="notify">
    <tag>fail</tag>
-Cannot save your selection because the object '[OBJ_NAME]' is not copyable.
+Cannot save your selection because the object &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; is not copyable.
   </notification>
 
   <notification
@@ -9691,7 +9691,7 @@ Cannot save your selection because the object '[OBJ_NAME]' is not copyable.
    name="NoModNoTaking"
    type="notify">
    <tag>fail</tag>
-You cannot take your selection because you do not have permission to modify the object '[OBJ_NAME]'.
+You cannot take your selection because you do not have permission to modify the object &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt;.
   </notification>
 
   <notification
-- 
cgit v1.2.3


From aa90985d677dfea573216b1a3a58acaa3b866656 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Wed, 12 Dec 2018 20:21:21 +0200
Subject: SL-10231 Bug in texture cache size computation

---
 indra/newview/lltexturecache.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 633e025478..eb4b914e18 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -1038,11 +1038,11 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL texture_cache
 {
 	llassert_always(getPending() == 0) ; //should not start accessing the texture cache before initialized.
 
-	S64 header_size = (max_size / 100) * 36; //0.36 * max_size
-	S64 max_entries = header_size / (TEXTURE_CACHE_ENTRY_SIZE + TEXTURE_FAST_CACHE_ENTRY_SIZE);
+	S64 entries_size = (max_size * 36) / 100; //0.36 * max_size
+	S64 max_entries = entries_size / (TEXTURE_CACHE_ENTRY_SIZE + TEXTURE_FAST_CACHE_ENTRY_SIZE);
 	sCacheMaxEntries = (S32)(llmin((S64)sCacheMaxEntries, max_entries));
-	header_size = sCacheMaxEntries * TEXTURE_CACHE_ENTRY_SIZE;
-	max_size -= header_size;
+	entries_size = sCacheMaxEntries * (TEXTURE_CACHE_ENTRY_SIZE + TEXTURE_FAST_CACHE_ENTRY_SIZE);
+	max_size -= entries_size;
 	if (sCacheMaxTexturesSize > 0)
 		sCacheMaxTexturesSize = llmin(sCacheMaxTexturesSize, max_size);
 	else
-- 
cgit v1.2.3


From 80054757ed0eee816c253a7707576252b7e89d9e Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Thu, 13 Dec 2018 00:10:52 +0200
Subject: SL-1481 Time limit should be per object

---
 indra/newview/llviewerobject.cpp | 14 +++++++-------
 indra/newview/llviewerobject.h   |  1 +
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 079a9f0372..007adf2a72 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -261,6 +261,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
 	mLastInterpUpdateSecs(0.f),
 	mLastMessageUpdateSecs(0.f),
 	mLatestRecvPacketID(0),
+	mRegionCrossExpire(0),
 	mData(NULL),
 	mAudioSourcep(NULL),
 	mAudioGain(1.f),
@@ -2636,8 +2637,7 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& frame_tim
 		new_pos.mV[VZ] = llmax(min_height, new_pos.mV[VZ]);
 
 		// Check to see if it's going off the region
-		LLVector3 temp(new_pos);
-		static F64SecondsImplicit region_cross_expire = 0; // frame time we detected region crossing in + wait time
+		LLVector3 temp(new_pos.mV[VX], new_pos.mV[VY], 0.f);
 		if (temp.clamp(0.f, mRegionp->getWidth()))
 		{	// Going off this region, so see if we might end up on another region
 			LLVector3d old_pos_global = mRegionp->getPosGlobalFromRegion(getPositionRegion());
@@ -2664,28 +2664,28 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& frame_tim
 				// Note: theoretically we can find time from velocity, acceleration and
 				// distance from border to new position, but it is not going to work
 				// if 'phase_out' activates
-				if (region_cross_expire == 0)
+				if (mRegionCrossExpire == 0)
 				{
 					// Workaround: we can't accurately figure out time when we cross border
 					// so just write down time 'after the fact', it is far from optimal in
 					// case of lags, but for lags sMaxUpdateInterpolationTime will kick in first
 					LL_DEBUGS("Interpolate") << "Predicted region crossing, new position " << new_pos << LL_ENDL;
-					region_cross_expire = frame_time + sMaxRegionCrossingInterpolationTime;
+					mRegionCrossExpire = frame_time + sMaxRegionCrossingInterpolationTime;
 				}
-				else if (frame_time > region_cross_expire)
+				else if (frame_time > mRegionCrossExpire)
 				{
 					// Predicting crossing over 1s, stop motion
 					// Stop motion
 					LL_DEBUGS("Interpolate") << "Predicting region crossing for too long, stopping at " << new_pos << LL_ENDL;
 					new_v.clear();
 					setAcceleration(LLVector3::zero);
-					region_cross_expire = 0;
+					mRegionCrossExpire = 0;
 				}
 			}
 		}
 		else
 		{
-			region_cross_expire = 0;
+			mRegionCrossExpire = 0;
 		}
 
 		// Set new position and velocity
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 990c392531..8b1535851e 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -772,6 +772,7 @@ protected:
 	F64Seconds		mLastInterpUpdateSecs;			// Last update for purposes of interpolation
 	F64Seconds		mLastMessageUpdateSecs;			// Last update from a message from the simulator
 	TPACKETID		mLatestRecvPacketID;			// Latest time stamp on message from simulator
+	F64SecondsImplicit mRegionCrossExpire;		// frame time we detected region crossing in + wait time
 
 	// extra data sent from the sim...currently only used for tree species info
 	U8* mData;
-- 
cgit v1.2.3


From 5111e0c921d17b83b41aef02b6334a8361ce1181 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Thu, 13 Dec 2018 18:21:11 +0200
Subject: SL-10229 FIXED Group icon doesn't display by default in the People
 and Profile floaters after creating new group

---
 indra/newview/llpanelgroupgeneral.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index f85a2ffbc1..b53cd222e7 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -461,11 +461,12 @@ bool LLPanelGroupGeneral::createGroupCallback(const LLSD& notification, const LL
 			// Yay!  We are making a new group!
 			U32 enrollment_fee = (mCtrlEnrollmentFee->get() ? 
 									(U32) mSpinEnrollmentFee->get() : 0);
-		
+			LLUUID insignia_id = mInsignia->getImageItemID().isNull() ? LLUUID::null : mInsignia->getImageAssetID();
+
 			LLGroupMgr::getInstance()->sendCreateGroupRequest(mGroupNameEditor->getText(),
 												mEditCharter->getText(),
 												mCtrlShowInGroupList->get(),
-												mInsignia->getImageAssetID(),
+												insignia_id,
 												enrollment_fee,
 												mCtrlOpenEnrollment->get(),
 												false,
-- 
cgit v1.2.3


From bf2efcf43e5efaf91220a0c77f3db792636edeb1 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Fri, 14 Dec 2018 16:48:54 +0200
Subject: SL-10233 FIXED 'Default' button doesn't work in 'Pick:Texture'
 floater for multiple selections with different textures

---
 indra/newview/lltexturectrl.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index a5a2eec246..1a2a10f721 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -131,7 +131,7 @@ LLFloaterTexturePicker::~LLFloaterTexturePicker()
 
 void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selection /*=true*/)
 {
-	if( mImageAssetID != image_id && mActive)
+	if( ((mImageAssetID != image_id) || mTentative) && mActive)
 	{
 		mNoCopyTextureSelected = FALSE;
 		mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here?
-- 
cgit v1.2.3


From 514e4f661bbf4355ead4e60288c0075cc945b597 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Thu, 13 Dec 2018 20:01:01 +0200
Subject: SL-10236 The "Attach To", "Attach To HUD", and "Wear" options aren't
 greyed out

---
 indra/newview/llinventorybridge.cpp |  5 ++++-
 indra/newview/lloutfitslist.cpp     | 21 +++++++++++++++++++--
 indra/newview/llviewermenu.cpp      | 18 ++++++------------
 3 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 1987e15850..e7367d5ced 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -7344,7 +7344,10 @@ void LLFolderViewGroupedItemBridge::groupFilterContextMenu(folder_view_item_dequ
     {
 		if (!LLAppearanceMgr::instance().canAddWearables(ids) && canWearSelected(ids))
         {
-			disabled_items.push_back(std::string("Wearable Add"));
+            disabled_items.push_back(std::string("Wearable And Object Wear"));
+            disabled_items.push_back(std::string("Wearable Add"));
+            disabled_items.push_back(std::string("Attach To"));
+            disabled_items.push_back(std::string("Attach To HUD"));
         }
     }
 	disable_context_entries_if_present(menu, disabled_items);
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index 892fa385d7..f2a284a561 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -621,8 +621,14 @@ void LLOutfitsList::applyFilterToTab(
 
 bool LLOutfitsList::canWearSelected()
 {
+	if (!isAgentAvatarValid())
+	{
+		return false;
+	}
+
 	uuid_vec_t selected_items;
 	getSelectedItemsUUIDs(selected_items);
+	S32 nonreplacable_objects = 0;
 
 	for (uuid_vec_t::const_iterator it = selected_items.begin(); it != selected_items.end(); ++it)
 	{
@@ -633,10 +639,21 @@ bool LLOutfitsList::canWearSelected()
 		{
 			return false;
 		}
+
+		const LLViewerInventoryItem* item = gInventory.getItem(id);
+		if (!item)
+		{
+			return false;
+		}
+
+		if (item->getType() == LLAssetType::AT_OBJECT)
+		{
+			nonreplacable_objects++;
+		}
 	}
 
-	// All selected items can be worn.
-	return true;
+	// All selected items can be worn. But do we have enough space for them?
+	return nonreplacable_objects == 0 || gAgentAvatarp->canAttachMoreObjects(nonreplacable_objects);
 }
 
 void LLOutfitsList::wearSelectedItems()
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 6c52f118ad..ba68ce4cf4 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -7068,25 +7068,19 @@ BOOL object_selected_and_point_valid()
 
 BOOL object_is_wearable()
 {
-	if (!object_selected_and_point_valid())
+	if (!isAgentAvatarValid())
 	{
 		return FALSE;
 	}
-	if (sitting_on_selection())
+	if (!object_selected_and_point_valid())
 	{
 		return FALSE;
 	}
-	LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
-	for (LLObjectSelection::valid_root_iterator iter = LLSelectMgr::getInstance()->getSelection()->valid_root_begin();
-		 iter != LLSelectMgr::getInstance()->getSelection()->valid_root_end(); iter++)
+	if (sitting_on_selection())
 	{
-		LLSelectNode* node = *iter;		
-		if (node->mPermissions->getOwner() == gAgent.getID())
-		{
-			return TRUE;
-		}
+		return FALSE;
 	}
-	return FALSE;
+	return gAgentAvatarp->canAttachMoreObjects();
 }
 
 
@@ -9207,7 +9201,7 @@ void initialize_menus()
 	enable.add("Object.EnableOpen", boost::bind(&enable_object_open));
 	enable.add("Object.EnableTouch", boost::bind(&enable_object_touch, _1));
 	enable.add("Object.EnableDelete", boost::bind(&enable_object_delete));
-	enable.add("Object.EnableWear", boost::bind(&object_selected_and_point_valid));
+	enable.add("Object.EnableWear", boost::bind(&object_is_wearable));
 
 	enable.add("Object.EnableStandUp", boost::bind(&enable_object_stand_up));
 	enable.add("Object.EnableSit", boost::bind(&enable_object_sit, _1));
-- 
cgit v1.2.3


From 2b2b6d40847d9d1bcd070a16003834389d954f32 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Tue, 18 Dec 2018 11:41:32 +0200
Subject: SL-10251 show correct fee for 'save to disk' option on Japanese
 localization

---
 indra/newview/skins/default/xui/ja/panel_snapshot_options.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml
index ebaab7c122..04dfc0176d 100644
--- a/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="panel_snapshot_options">
 	<button label="ディスクに保存" name="save_to_computer_btn"/>
-	<button label="持ち物に保存(L$[Amount])" name="save_to_inventory_btn"/>
+	<button label="持ち物に保存(L$[AMOUNT])" name="save_to_inventory_btn"/>
 	<button label="プロフィールフィードで共有する" name="save_to_profile_btn"/>
 	<button label="Facebook で共有する" name="send_to_facebook_btn"/>
 	<button label="Twitter で共有する" name="send_to_twitter_btn"/>
-- 
cgit v1.2.3


From 224c65716377b61c8f7918ca88434ffaa8356bc1 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Tue, 18 Dec 2018 17:23:55 +0200
Subject: SL-10235 FIXED Texture tab is opened with Bumpiness or Shininess
 instead of Texture as default value

---
 indra/newview/llpanelface.cpp | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 8d7865c8ba..2232589ec4 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -1384,6 +1384,11 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 			mColorSwatch->setFallbackImage(LLUI::getUIImage("locked_image.j2c") );
 			mColorSwatch->setValid(FALSE);
 		}
+		LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
+		if (radio_mat_type)
+		{
+			radio_mat_type->setSelectedIndex(0);
+		}
 		getChildView("color trans")->setEnabled(FALSE);
 		getChildView("rptctrl")->setEnabled(FALSE);
 		getChildView("tex gen")->setEnabled(FALSE);
-- 
cgit v1.2.3


From b08065dafd0d745516bb522a586af2cc09ea42bc Mon Sep 17 00:00:00 2001
From: Mnikolenko ProductEngine <mnikolenko@productengine.com>
Date: Wed, 19 Dec 2018 18:39:59 +0200
Subject: SL-10155 FIXED [MAC] Mesh upload tries to upload folder instead of
 opening it

---
 indra/newview/llfilepicker.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index 0f22b6200f..b6fd70452e 100644
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -101,6 +101,8 @@ LLFilePicker::LLFilePicker()
 	mOFN.lpfnHook = NULL;
 	mOFN.lpTemplateName = NULL;
 	mFilesW[0] = '\0';
+#elif LL_DARWIN
+	mPickOptions = 0;
 #endif
 
 }
-- 
cgit v1.2.3


From 0acab8ba2d22e9b0ce0dec1a41813242419e057f Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Mon, 24 Dec 2018 15:57:04 +0200
Subject: SL-10283 Allow changing "Repeats per meter" on face 6 of hollowed
 cube

---
 indra/llprimitive/llprimitive.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp
index c69c059880..27d1bee9bd 100644
--- a/indra/llprimitive/llprimitive.cpp
+++ b/indra/llprimitive/llprimitive.cpp
@@ -1580,7 +1580,7 @@ bool LLPrimitive::getTESTAxes(const U8 face, U32* s_axis, U32* t_axis)
 		*s_axis = VY; *t_axis = VZ;
 		return true;
 	}
-	else if (face == 5)
+	else if (face >= 5)
 	{
 		*s_axis = VX; *t_axis = VY;
 		return true;
-- 
cgit v1.2.3


From efa5f24d1b00472485a3764d550882484fe5bdd5 Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Thu, 3 Jan 2019 00:35:38 +0200
Subject: SL-10288 Mesh uploader changes from Firestorm

---
 doc/contributions.txt                              |   2 +
 indra/newview/app_settings/settings.xml            | 199 +++++++-
 .../shaders/class1/objects/previewV.glsl           |   8 +-
 indra/newview/lldynamictexture.cpp                 |  30 +-
 indra/newview/llfloatermodelpreview.cpp            | 527 ++++++++++++++-------
 indra/newview/llfloatermodelpreview.h              |   2 +
 indra/newview/pipeline.cpp                         |   6 +-
 .../skins/default/xui/en/floater_model_preview.xml | 369 ++++++++++-----
 8 files changed, 844 insertions(+), 299 deletions(-)

diff --git a/doc/contributions.txt b/doc/contributions.txt
index 97c7ff1098..bb910aa838 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -256,6 +256,8 @@ Benja Kepler
 	VWR-746
 Benjamin Bigdipper
 Beth Walcher
+Beq Janus
+	SL-10288
 Bezilon Kasei
 Biancaluce Robbiani
 	CT-225
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 0eef5120eb..1abddc80cb 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -6628,8 +6628,189 @@
     <key>Value</key>
     <integer>600</integer>
   </map>
-  <key>MigrateCacheDirectory</key>
-    <map>
+  <key>MeshPreviewCanvasColor</key>
+  <map>
+    <key>Comment</key>
+    <string>Canvas colour for the Mesh uploader</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Color4</string>
+    <key>Value</key>
+    <array>
+      <real>0.169</real>
+      <real>0.169</real>
+      <real>0.169</real>
+      <real>1.0</real>
+    </array>
+  </map>
+  <key>MeshPreviewEdgeColor</key>
+  <map>
+    <key>Comment</key>
+    <string>Edge colour for the Mesh uploader preview</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Color4</string>
+    <key>Value</key>
+    <array>
+      <real>0.4</real>
+      <real>0.4</real>
+      <real>0.4</real>
+      <real>1.0</real>
+    </array>
+  </map>
+  <key>MeshPreviewBaseColor</key>
+  <map>
+    <key>Comment</key>
+    <string>base diffuse colour for the Mesh uploader</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Color4</string>
+    <key>Value</key>
+    <array>
+      <real>1.0</real>
+      <real>1.0</real>
+      <real>1.0</real>
+      <real>1.0</real>
+    </array>
+  </map>
+  <key>MeshPreviewBrightnessColor</key>
+  <map>
+    <key>Comment</key>
+    <string>Brightness modifier</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Color3</string>
+    <key>Value</key>
+    <array>
+      <real>0.9</real>
+      <real>0.9</real>
+      <real>0.9</real>
+    </array>
+  </map>
+  <key>MeshPreviewEdgeWidth</key>
+  <map>
+    <key>Comment</key>
+    <string>line thickness used when display edges is selected in mesh preview</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>F32</string>
+    <key>Value</key>
+      <real>1.0</real>
+  </map>
+  <key>MeshPreviewPhysicsEdgeColor</key>
+  <map>
+    <key>Comment</key>
+    <string>Edge colour for the Mesh uploader physics preview</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Color4</string>
+    <key>Value</key>
+    <array>
+      <real>0.0</real>
+      <real>0.25</real>
+      <real>0.5</real>
+      <real>0.25</real>
+    </array>
+  </map>
+  <key>MeshPreviewPhysicsFillColor</key>
+  <map>
+    <key>Comment</key>
+    <string>Fill colour for the Mesh uploader physics preview</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Color4</string>
+    <key>Value</key>
+    <array>
+      <real>0.0</real>
+      <real>0.5</real>
+      <real>1.0</real>
+      <real>0.5</real>
+    </array>
+  </map>
+  <key>MeshPreviewPhysicsEdgeWidth</key>
+  <map>
+    <key>Comment</key>
+    <string>line thickness used when display physics is selected in mesh preview</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>F32</string>
+    <key>Value</key>
+    <real>1.0</real>
+  </map>
+  <key>MeshPreviewDegenerateEdgeColor</key>
+  <map>
+    <key>Comment</key>
+    <string>Edge colour for the Mesh uploader Degenerate preview</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Color4</string>
+    <key>Value</key>
+    <array>
+      <real>1.0</real>
+      <real>0.0</real>
+      <real>0.0</real>
+      <real>1.0</real>
+    </array>
+  </map>
+  <key>MeshPreviewDegenerateFillColor</key>
+  <map>
+    <key>Comment</key>
+    <string>Fill colour for the Mesh uploader Degenerate preview</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Color4</string>
+    <key>Value</key>
+    <array>
+      <real>1.0</real>
+      <real>0.0</real>
+      <real>0.0</real>
+      <real>0.5</real>
+    </array>
+  </map>
+  <key>MeshPreviewDegenerateEdgeWidth</key>
+  <map>
+    <key>Comment</key>
+    <string>line thickness used when display Degenerate is selected in mesh preview</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>F32</string>
+    <key>Value</key>
+    <real>3.0</real>
+  </map>
+  <key>MeshPreviewDegeneratePointSize</key>
+  <map>
+    <key>Comment</key>
+    <string>Large point size used to highlight degenerate triangle vertices in Mesh preview</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>F32</string>
+    <key>Value</key>
+    <real>8.0</real>
+  </map>
+  <key>MeshPreviewZoomLimit</key>
+  <map>
+    <key>Comment</key>
+    <string>Maximum Zoom level in preview</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>F32</string>
+    <key>Value</key>
+    <real>10.0</real>
+  </map>
+  <map>
       <key>Comment</key>
       <string>Check for old version of disk cache to migrate to current location</string>
       <key>Persist</key>
@@ -7868,7 +8049,17 @@
       <key>Value</key>
 	  <integer>13</integer>
     </map>
-
+  <key>PreviewRenderSize</key>  
+  <map>
+    <key>Comment</key>
+    <string>Resolution of the image rendered for the mesh upload preview</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>S32</string>
+    <key>Value</key>
+    <integer>1024</integer>
+  </map>
   <key>PreviewAmbientColor</key>
   <map>
     <key>Comment</key>
@@ -7885,8 +8076,6 @@
       <real>1.0</real>
     </array>
   </map>
-
-
   <key>PreviewDiffuse0</key>
   <map>
     <key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
index 7f3f84398b..3424613e94 100644
--- a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
@@ -91,8 +91,10 @@ void main()
 
 	// Collect normal lights (need to be divided by two, as we later multiply by 2)
 	col.rgb += light_diffuse[1].rgb * calcDirectionalLight(norm, light_position[1].xyz);
-	col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].z);
-	col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].z);
-		
+//	col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].z);
+	col.rgb += light_diffuse[2].rgb * calcDirectionalLight(norm, light_position[2].xyz);
+//	col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].z);
+	col.rgb += light_diffuse[3].rgb * calcDirectionalLight(norm, light_position[3].xyz);
+	col /= 2.0;
 	vertex_color = col*color;
 }
diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp
index fa9a0712fa..af6977d3cd 100644
--- a/indra/newview/lldynamictexture.cpp
+++ b/indra/newview/lldynamictexture.cpp
@@ -125,11 +125,17 @@ BOOL LLViewerDynamicTexture::render()
 //-----------------------------------------------------------------------------
 void LLViewerDynamicTexture::preRender(BOOL clear_depth)
 {
-	//only images up to 512x512 are supported
-	llassert(mFullHeight <= 512);
-	llassert(mFullWidth <= 512);
+	// <FS:Beq> changes to support higher resolution rendering in the preview
+	////only images up to 512x512 are supported
+	//llassert(mFullHeight <= 512);
+	//llassert(mFullWidth <= 512);
+	gPipeline.allocatePhysicsBuffer();
+	llassert(mFullWidth <= static_cast<S32>(gPipeline.mPhysicsDisplay.getWidth()));
+	llassert(mFullHeight <= static_cast<S32>(gPipeline.mPhysicsDisplay.getHeight()));
 
-	if (gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete() && !gGLManager.mIsATI)
+//	if (gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete() && !gGLManager.mIsATI)
+	if (gGLManager.mHasFramebufferObject && gPipeline.mPhysicsDisplay.isComplete() && !gGLManager.mIsATI)
+// </FS:Beq>
 	{ //using offscreen render target, just use the bottom left corner
 		mOrigin.set(0, 0);
 	}
@@ -215,14 +221,15 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
 	{
 		return TRUE;
 	}
-
-	bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete() && !gGLManager.mIsATI;
-
+	// <FS:Beq> changes to support higher resolution rendering in the preview
+	//	bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete() && !gGLManager.mIsATI;
+	bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mPhysicsDisplay.isComplete() && !gGLManager.mIsATI;
 	if (use_fbo)
 	{
-		gPipeline.mWaterDis.bindTarget();
+//		gPipeline.mWaterDis.bindTarget();
+		gPipeline.mPhysicsDisplay.bindTarget();
 	}
-
+	// </FS:Beq>
 	LLGLSLShader::bindNoShader();
 	LLVertexBuffer::unbind();
 	
@@ -258,7 +265,10 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
 
 	if (use_fbo)
 	{
-		gPipeline.mWaterDis.flush();
+		// <FS:Beq> changes to support higher resolution rendering in the preview
+		// gPipeline.mWaterDis.flush();
+		gPipeline.mPhysicsDisplay.flush();
+		// </FS:Beq>
 	}
 
 	return ret;
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 818d364c3e..01f0a5197d 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -427,8 +427,11 @@ void LLFloaterModelPreview::initModelPreview()
 	{
 		delete mModelPreview;
 	}
-
-	mModelPreview = new LLModelPreview(512, 512, this );
+	// <FS:Beq> mesh uploader changes to allow higher resolution render
+	//	mModelPreview = new LLModelPreview(512, 512, this);
+	auto size = gSavedSettings.getS32("PreviewRenderSize");
+	mModelPreview = new LLModelPreview(size, size, this );
+	// </FS:Beq>
 	mModelPreview->setPreviewTarget(16.f);
 	mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelPreview::setDetails, this, _1, _2, _3, _4, _5));
 	mModelPreview->setModelUpdatedCallback(boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this, _1));
@@ -438,8 +441,16 @@ void LLFloaterModelPreview::onViewOptionChecked(LLUICtrl* ctrl)
 {
 	if (mModelPreview)
 	{
-		mModelPreview->mViewOption[ctrl->getName()] = !mModelPreview->mViewOption[ctrl->getName()];
-		
+		// <FS:Beq> only show explode when phsyics is on
+		//		mModelPreview->mViewOption[ctrl->getName()] = !mModelPreview->mViewOption[ctrl->getName()];
+		auto name = ctrl->getName();
+		mModelPreview->mViewOption[name] = !mModelPreview->mViewOption[name];
+		if (name == "show_physics")
+		{
+			auto enabled = mModelPreview->mViewOption[name];
+			childSetEnabled("physics_explode", enabled);
+			childSetVisible("physics_explode", enabled);
+		}
 		mModelPreview->refresh();
 	}
 }
@@ -653,6 +664,43 @@ void LLFloaterModelPreview::onLODParamCommit(S32 lod, bool enforce_tri_limit)
 	}
 }
 
+// <FS:Beq> extracted method to simplify changes in layout
+void LLFloaterModelPreview::draw3dPreview()
+{
+	gGL.color3f(1.f, 1.f, 1.f);
+
+	gGL.getTexUnit(0)->bind(mModelPreview);
+
+
+	LLView* preview_panel = getChild<LLView>("preview_panel");
+
+	if (!preview_panel)
+	{
+		LL_WARNS() << "preview_panel not found in floater definition" << LL_ENDL;
+	}
+	LLRect rect = preview_panel->getRect();
+
+	if (rect != mPreviewRect)
+	{
+		mModelPreview->refresh();
+		mPreviewRect = preview_panel->getRect();
+	}
+
+	gGL.begin( LLRender::QUADS );
+	{
+		gGL.texCoord2f(0.f, 1.f);
+		gGL.vertex2i(mPreviewRect.mLeft, mPreviewRect.mTop-1);
+		gGL.texCoord2f(0.f, 0.f);
+		gGL.vertex2i(mPreviewRect.mLeft, mPreviewRect.mBottom);
+		gGL.texCoord2f(1.f, 0.f);
+		gGL.vertex2i(mPreviewRect.mRight-1, mPreviewRect.mBottom);
+		gGL.texCoord2f(1.f, 1.f);
+		gGL.vertex2i(mPreviewRect.mRight-1, mPreviewRect.mTop-1);
+	}
+	gGL.end();
+
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+}
 
 //-----------------------------------------------------------------------------
 // draw()
@@ -1218,6 +1266,7 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
 , mResetJoints( false )
 , mModelNoErrors( true )
 , mLastJointUpdate( false )
+, mHasDegenerate( false ) // <FS:Beq>
 {
 	mNeedsUpdate = TRUE;
 	mCameraDistance = 0.f;
@@ -2707,8 +2756,20 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
 
 void LLModelPreview::updateStatusMessages()
 {
+// <FS:Beq> bit mask values for physics errors. used to prevent overwrite of single line status
+// TODO: use this to provied multiline status
+	enum PhysicsError
+	{
+		NONE=0,
+		NOHAVOK=1,
+		DEGENERATE=2,
+		TOOMANYHULLS=4,
+		TOOMANYVERTSINHULL=8
+	};
+// </FS:Beq>
 	assert_main_thread();
 
+	U32 has_physics_error{ PhysicsError::NONE }; // <FS:Beq> physics error bitmap
 	//triangle/vertex/submesh count for each mesh asset for each lod
 	std::vector<S32> tris[LLModel::NUM_LODS];
 	std::vector<S32> verts[LLModel::NUM_LODS];
@@ -2797,44 +2858,72 @@ void LLModelPreview::updateStatusMessages()
 	{
 		mMaxTriangleLimit = total_tris[LLModel::LOD_HIGH];
 	}
-
-	bool has_degenerate = false;
-
+	// <FS:Beq> make has_degenerate a member so that we can use it in the render method
+	// has_degenerate = false
+	mHasDegenerate = false;
 	{//check for degenerate triangles in physics mesh
 		U32 lod = LLModel::LOD_PHYSICS;
 		const LLVector4a scale(0.5f);
-		for (U32 i = 0; i < mModel[lod].size() && !has_degenerate; ++i)
+		for (U32 i = 0; i < mModel[lod].size() && !mHasDegenerate; ++i)// <FS:Beq> make has_degenerate a member 
 		{ //for each model in the lod
 			if (mModel[lod][i] && mModel[lod][i]->mPhysics.mHull.empty())
 			{ //no decomp exists
 				S32 cur_submeshes = mModel[lod][i]->getNumVolumeFaces();
-				for (S32 j = 0; j < cur_submeshes && !has_degenerate; ++j)
+				for (S32 j = 0; j < cur_submeshes && !mHasDegenerate; ++j)// <FS:Beq> make has_degenerate a member 
 				{ //for each submesh (face), add triangles and vertices to current total
 					LLVolumeFace& face = mModel[lod][i]->getVolumeFace(j);
-					for (S32 k = 0; (k < face.mNumIndices) && !has_degenerate; )
+					for (S32 k = 0; (k < face.mNumIndices) && !mHasDegenerate; )// <FS:Beq> make has_degenerate a member 
 					{
-						U16 index_a = face.mIndices[k+0];
-						U16 index_b = face.mIndices[k+1];
-						U16 index_c = face.mIndices[k+2];
-
-						LLVector4a v1; v1.setMul(face.mPositions[index_a], scale);
-						LLVector4a v2; v2.setMul(face.mPositions[index_b], scale);
-						LLVector4a v3; v3.setMul(face.mPositions[index_c], scale);
-
-						if (ll_is_degenerate(v1,v2,v3))
+						U16 index_a = face.mIndices[k + 0];
+						U16 index_b = face.mIndices[k + 1];
+						U16 index_c = face.mIndices[k + 2];
+						// <FS:Beq> FIRE-23367/23387 - Allow forced empty triangle placeholders created by the LOD processing.
+						//	LLVector4a v1; v1.setMul(face.mPositions[index_a], scale);
+						//	LLVector4a v2; v2.setMul(face.mPositions[index_b], scale);
+						//	LLVector4a v3; v3.setMul(face.mPositions[index_c], scale);
+
+						//	if (ll_is_degenerate(v1, v2, v3))
+						//	{
+						//		mHasDegenerate = true;// <FS:Beq> make has_degenerate a member 
+						//	}
+						//	else
+						//	{
+						//		k += 3;
+						//	}
+						if (index_c == 0 && index_b == 0 && index_a == 0) // test in reverse as 3rd index is less likely to be 0 in a normal case
 						{
-							has_degenerate = true;
+							LL_DEBUGS("MeshValidation") << "Empty placeholder triangle (3 identical index 0 verts) ignored" << LL_ENDL;
 						}
 						else
 						{
-							k += 3;
+							LLVector4a v1; v1.setMul(face.mPositions[index_a], scale);
+							LLVector4a v2; v2.setMul(face.mPositions[index_b], scale);
+							LLVector4a v3; v3.setMul(face.mPositions[index_c], scale);
+							if (ll_is_degenerate(v1, v2, v3))
+							{
+								mHasDegenerate = true;// <FS:Beq> make has_degenerate a member 
+							}
 						}
+						k += 3;
 					}
 				}
 			}
 		}
 	}
 
+	// <FS:Beq> flag degenerates here rather than deferring to a MAV error later
+	mFMP->childSetVisible("physics_status_message_text", mHasDegenerate); //display or clear
+	auto degenerateIcon = mFMP->getChild<LLIconCtrl>("physics_status_message_icon");
+	degenerateIcon->setVisible(mHasDegenerate);
+	if (mHasDegenerate)
+	{
+		has_physics_error |= PhysicsError::DEGENERATE;
+		mFMP->childSetValue("physics_status_message_text", mFMP->getString("phys_status_degenerate_triangles"));
+		LLUIImagePtr img = LLUI::getUIImage("ModelImport_Status_Error");
+		degenerateIcon->setImage(img);
+	}
+	// </FS:Beq>
+
 	mFMP->childSetTextArg("submeshes_info", "[SUBMESHES]", llformat("%d", total_submeshes[LLModel::LOD_HIGH]));
 
 	std::string mesh_status_na = mFMP->getString("mesh_status_na");
@@ -2959,14 +3048,22 @@ void LLModelPreview::updateStatusMessages()
 			}
 		}
 	}
-	mFMP->childSetVisible("physics_status_message_text", physExceededVertexLimit);
-	LLIconCtrl* physStatusIcon = mFMP->getChild<LLIconCtrl>("physics_status_message_icon");
-	physStatusIcon->setVisible(physExceededVertexLimit);
+
 	if (physExceededVertexLimit)
 	{
-		mFMP->childSetValue("physics_status_message_text", mFMP->getString("phys_status_vertex_limit_exceeded"));
-		LLUIImagePtr img = LLUI::getUIImage("ModelImport_Status_Warning");
-		physStatusIcon->setImage(img);
+		has_physics_error |= PhysicsError::TOOMANYVERTSINHULL;
+	}
+
+	if (!(has_physics_error & PhysicsError::DEGENERATE)){ // only update this field (incluides clearing it) if it is not already in use.
+		mFMP->childSetVisible("physics_status_message_text", physExceededVertexLimit);
+		LLIconCtrl* physStatusIcon = mFMP->getChild<LLIconCtrl>("physics_status_message_icon");
+		physStatusIcon->setVisible(physExceededVertexLimit);
+		if (physExceededVertexLimit)
+		{
+			mFMP->childSetValue("physics_status_message_text", mFMP->getString("phys_status_vertex_limit_exceeded"));
+			LLUIImagePtr img = LLUI::getUIImage("ModelImport_Status_Warning");
+			physStatusIcon->setImage(img);
+		}
 	}
 
 	if (getLoadState() >= LLModelLoader::ERROR_PARSING)
@@ -2995,12 +3092,21 @@ void LLModelPreview::updateStatusMessages()
 			mModelNoErrors = false;
 		}
 	}
-
-	// Todo: investigate use of has_degenerate and include into mModelNoErrors upload blocking mechanics
-	// current use of has_degenerate won't block upload permanently - later checks will restore the button
-	if (!mModelNoErrors || has_degenerate)
+	// <FS:Beq> Improve the error checking the TO DO here is no longer applicable but not an FS comment so edited to stop it being picked up
+	//// To do investigate use of has_degenerate and include into mModelNoErrors upload blocking mechanics
+	//// current use of has_degenerate won't block upload permanently - later checks will restore the button
+	//if (!mModelNoErrors || mHasDegenerate)
+	//{
+	//	mFMP->childDisable("ok_btn");
+	if (!mModelNoErrors || mHasDegenerate)
 	{
 		mFMP->childDisable("ok_btn");
+		mFMP->childDisable("calculate_btn");
+	}
+	else
+	{
+		mFMP->childEnable("ok_btn");
+		mFMP->childEnable("calculate_btn");
 	}
 	
 	//add up physics triangles etc
@@ -3616,11 +3722,30 @@ BOOL LLModelPreview::render()
 	bool textures = mViewOption["show_textures"];
 	bool physics = mViewOption["show_physics"];
 
+	// <FS:Beq> Extra configurability, to be exposed later as controls?
+	static LLCachedControl<LLColor4> canvas_col(gSavedSettings, "MeshPreviewCanvasColor");
+	static LLCachedControl<LLColor4> edge_col(gSavedSettings, "MeshPreviewEdgeColor");
+	static LLCachedControl<LLColor4> base_col(gSavedSettings, "MeshPreviewBaseColor");
+	static LLCachedControl<LLColor3> brightness(gSavedSettings, "MeshPreviewBrightnessColor");
+	static LLCachedControl<F32> edge_width(gSavedSettings, "MeshPreviewEdgeWidth");
+	static LLCachedControl<LLColor4> phys_edge_col(gSavedSettings, "MeshPreviewPhysicsEdgeColor");
+	static LLCachedControl<LLColor4> phys_fill_col(gSavedSettings, "MeshPreviewPhysicsFillColor");
+	static LLCachedControl<F32> phys_edge_width(gSavedSettings, "MeshPreviewPhysicsEdgeWidth");
+	static LLCachedControl<LLColor4> deg_edge_col(gSavedSettings, "MeshPreviewDegenerateEdgeColor");
+	static LLCachedControl<LLColor4> deg_fill_col(gSavedSettings, "MeshPreviewDegenerateFillColor");	
+	static LLCachedControl<F32> deg_edge_width(gSavedSettings, "MeshPreviewDegenerateEdgeWidth");
+	static LLCachedControl<F32> deg_point_size(gSavedSettings, "MeshPreviewDegeneratePointSize");
+	// </FS:Beq>
 	S32 width = getWidth();
 	S32 height = getHeight();
 
 	LLGLSUIDefault def;
 	LLGLDisable no_blend(GL_BLEND);
+// <FS:Beq> Clean up render of mesh preview
+//	LLGLEnable blend(GL_BLEND);
+//	gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
+// </FS:Beq> 
+
 	LLGLEnable cull(GL_CULL_FACE);
 	LLGLDepthTest depth(GL_TRUE);
 	LLGLDisable fog(GL_FOG);
@@ -3639,9 +3764,9 @@ BOOL LLModelPreview::render()
 		gGL.matrixMode(LLRender::MM_MODELVIEW);
 		gGL.pushMatrix();
 		gGL.loadIdentity();
-
-		gGL.color4f(0.169f, 0.169f, 0.169f, 1.f);
-
+		// <FS:Beq> uploader improvements
+		//gGL.color4f(0.169f, 0.169f, 0.169f, 1.f);
+		gGL.color4fv(static_cast<LLColor4>(canvas_col).mV);
 		gl_rect_2d_simple( width, height );
 
 		gGL.matrixMode(LLRender::MM_PROJECTION);
@@ -3789,8 +3914,11 @@ BOOL LLModelPreview::render()
 	stop_glerror();
 
 	gGL.pushMatrix();
-	const F32 BRIGHTNESS = 0.9f;
-	gGL.color3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);
+	// <FS:Beq> mesh uploader improvements configurable brightness
+	//const F32 BRIGHTNESS = 0.9f;
+	//gGL.color3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);
+	gGL.color4fv(edge_col().mV);
+	// </FS:Beq>
 
 	const U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
 
@@ -3875,16 +4003,22 @@ BOOL LLModelPreview::render()
 						}
 						else
 						{
-							gGL.diffuseColor4f(1,1,1,1);
+						// <FS:Beq> improved mesh uploader
+						//	gGL.diffuseColor4f(1,1,1,1);
+							gGL.diffuseColor4fv(static_cast<LLColor4>(base_col).mV);
+						// </FS:Beq>
+
 						}
 
 						buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
 						gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-						gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
-
+						// <FS:Beq> improved mesh uploader
+						//gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
+						gGL.diffuseColor4fv(static_cast<LLColor4>(edge_col).mV);
+						// </FS:Beq> 
 						if (edges)
 						{
-							glLineWidth(3.f);
+							glLineWidth(edge_width);
 							glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
 							buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
 							glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
@@ -3896,11 +4030,25 @@ BOOL LLModelPreview::render()
 
 			if (physics)
 			{
+				// <FS:Beq> model upload improvements - use the settings
+				////Vector4a physicsFillColour(0.4, 0.4, 0.4, 0.4);
+				//const LLColor4 physicsFillColour(0.0, 0.5, 1.0, 0.5);
+				////LLVector4a physicsEdgeColour(1.0, 1.0, 0.0, 1.0);
+				//const LLColor4 physicsEdgeColour=physicsFillColour*0.5;
+				//const LLColor4 degenerateFill(1.0, 0.0, 0.0, 0.5);
+				//const LLColor4 degenerateEdge(1.0,0.0,0.0,1.0);
+				// </FS:Beq> 
+
 				glClear(GL_DEPTH_BUFFER_BIT);
-				
-				for (U32 i = 0; i < 2; i++)
+				//<FS:Beq> refactor to remove silly variable names
+				//				for (U32 i = 0; i < 2; i++)
+				for (U32 pass = 0; pass < 2; pass++)
+				//</FS:Beq>
 				{
-					if (i == 0)
+					//<FS:Beq> refactor to remove silly variable names
+					//if (i == 0)
+					if (pass == 0)
+					//</FS:Beq>
 					{ //depth only pass
 						gGL.setColorMask(false, false);
 					}
@@ -3910,8 +4058,11 @@ BOOL LLModelPreview::render()
 					}
 
 					//enable alpha blending on second pass but not first pass
-					LLGLState blend(GL_BLEND, i); 
-					
+					//<FS:Beq> refactor to remove silly variable names
+					//LLGLState blend(GL_BLEND, i);
+					LLGLState blend(GL_BLEND, pass);
+					//</FS:Beq>
+
 					gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
 
 					for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
@@ -3920,175 +4071,196 @@ BOOL LLModelPreview::render()
 
 						LLModel* model = instance.mLOD[LLModel::LOD_PHYSICS];
 
-							if (!model)
-							{
-								continue;
-							}
+						if (!model)
+						{
+							continue;
+						}
 
-							gGL.pushMatrix();
-							LLMatrix4 mat = instance.mTransform;
+						gGL.pushMatrix();
+						LLMatrix4 mat = instance.mTransform;
 
-						gGL.multMatrix((GLfloat*) mat.mMatrix);
+						gGL.multMatrix((GLfloat*)mat.mMatrix);
 
 
-							bool render_mesh = true;
+						bool render_mesh = true;
+						LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread;
+						if (decomp)
+						{
+							LLMutexLock(decomp->mMutex);
+
+							LLModel::Decomposition& physics = model->mPhysics;
 
-							LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread;
-							if (decomp)
+							if (!physics.mHull.empty())
 							{
-								LLMutexLock(decomp->mMutex);
-
-								LLModel::Decomposition& physics = model->mPhysics;
+								render_mesh = false;
 
-								if (!physics.mHull.empty())
-								{
-									render_mesh = false;
+								if (physics.mMesh.empty())
+								{ //build vertex buffer for physics mesh
+									gMeshRepo.buildPhysicsMesh(physics);
+								}
 
-									if (physics.mMesh.empty())
-									{ //build vertex buffer for physics mesh
-										gMeshRepo.buildPhysicsMesh(physics);
-									}
-						
-									if (!physics.mMesh.empty())
-									{ //render hull instead of mesh
-										for (U32 i = 0; i < physics.mMesh.size(); ++i)
+								if (!physics.mMesh.empty())
+								{ //render hull instead of mesh
+									for (U32 i = 0; i < physics.mMesh.size(); ++i)
+									{
+										if (explode > 0.f)
 										{
-											if (explode > 0.f)
-											{
-												gGL.pushMatrix();
+											gGL.pushMatrix();
 
-												LLVector3 offset = model->mHullCenter[i]-model->mCenterOfHullCenters;
-												offset *= explode;
+											LLVector3 offset = model->mHullCenter[i] - model->mCenterOfHullCenters;
+											offset *= explode;
 
-												gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]);
-											}
+											gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]);
+										}
 
-											static std::vector<LLColor4U> hull_colors;
+										static std::vector<LLColor4U> hull_colors;
 
-											if (i+1 >= hull_colors.size())
-											{
-												hull_colors.push_back(LLColor4U(rand()%128+127, rand()%128+127, rand()%128+127, 128));
-											}
+										if (i + 1 >= hull_colors.size())
+										{
+											hull_colors.push_back(LLColor4U(rand() % 128 + 127, rand() % 128 + 127, rand() % 128 + 127, 128));
+										}
 
-											gGL.diffuseColor4ubv(hull_colors[i].mV);
-											LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals);
+										gGL.diffuseColor4ubv(hull_colors[i].mV);
+										LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals);
 
-											if (explode > 0.f)
-											{
-												gGL.popMatrix();
-											}
+										if (explode > 0.f)
+										{
+											gGL.popMatrix();
 										}
 									}
 								}
 							}
-						
-							if (render_mesh)
+						}
+
+						if (render_mesh)
+						{
+							if (mVertexBuffer[LLModel::LOD_PHYSICS].empty())
 							{
-								if (mVertexBuffer[LLModel::LOD_PHYSICS].empty())
-								{
-									genBuffers(LLModel::LOD_PHYSICS, false);
-								}
+								genBuffers(LLModel::LOD_PHYSICS, false);
+							}
 
-								U32 num_models = mVertexBuffer[LLModel::LOD_PHYSICS][model].size();
+							U32 num_models = mVertexBuffer[LLModel::LOD_PHYSICS][model].size();
+							if (pass > 0){
 								for (U32 i = 0; i < num_models; ++i)
 								{
 									LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i];
 
 									gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-									gGL.diffuseColor4f(0.4f, 0.4f, 0.0f, 0.4f);
+									gGL.diffuseColor4fv(phys_fill_col().mV);
 
 									buffer->setBuffer(type_mask & buffer->getTypeMask());
-									buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
-
-									gGL.diffuseColor3f(1.f, 1.f, 0.f);
+									buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts() - 1, buffer->getNumIndices(), 0);
 
-									glLineWidth(2.f);
+									gGL.diffuseColor4fv(phys_edge_col().mV);
+									glLineWidth(phys_edge_width);
 									glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
-									buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
+									buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts() - 1, buffer->getNumIndices(), 0);
 
 									glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
 									glLineWidth(1.f);
 								}
 							}
-
-							gGL.popMatrix();
 						}
 
-					glLineWidth(3.f);
-					glPointSize(8.f);
-					gPipeline.enableLightsFullbright(LLColor4::white);
-					//show degenerate triangles
-					LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS);
-					LLGLDisable cull(GL_CULL_FACE);
-					gGL.diffuseColor4f(1.f,0.f,0.f,1.f);
-					const LLVector4a scale(0.5f);
+						gGL.popMatrix();
+					}
 
-					for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
+					//<FS:Beq> refactor to remove silly variable names
+					// also only do this if mDegenerate was set in the preceding mesh checks [Check this if the ordering ever breaks]
+					//if (i > 0)
+					if (pass > 0 && mHasDegenerate)
+					//</FS:Beq>
 					{
-						LLModelInstance& instance = *iter;
-
-						LLModel* model = instance.mLOD[LLModel::LOD_PHYSICS];
-
-						if (!model)
+						glLineWidth(deg_edge_width);
+						glPointSize(deg_point_size);
+// <FS:Beq> This single line is why the degenerate triangles display has been crap forever. 
+// 						gPipeline.enableLightsFullbright(LLColor4::white);
+						//show degenerate triangles
+						LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS);
+						LLGLDisable cull(GL_CULL_FACE);
+						const LLVector4a scale(0.5f);
+
+						for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
 						{
-							continue;
-						}
+							LLModelInstance& instance = *iter;
 
-						gGL.pushMatrix();
-						LLMatrix4 mat = instance.mTransform;
+							LLModel* model = instance.mLOD[LLModel::LOD_PHYSICS];
 
-						gGL.multMatrix((GLfloat*) mat.mMatrix);
+							if (!model)
+							{
+								continue;
+							}
 
+							gGL.pushMatrix();
+							LLMatrix4 mat = instance.mTransform;
 
-						LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread;
-						if (decomp)
-						{
-							LLMutexLock(decomp->mMutex);
+							gGL.multMatrix((GLfloat*)mat.mMatrix);
 
-							LLModel::Decomposition& physics = model->mPhysics;
 
-							if (physics.mHull.empty())
+							LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread;
+							if (decomp)
 							{
-								if (mVertexBuffer[LLModel::LOD_PHYSICS].empty())
-								{
-									genBuffers(LLModel::LOD_PHYSICS, false);
-								}
-							
-								for (U32 i = 0; i < mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); ++i)
-								{
-									LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i];
+								LLMutexLock(decomp->mMutex);
 
-									buffer->setBuffer(type_mask & buffer->getTypeMask());
+								LLModel::Decomposition& physics = model->mPhysics;
 
-									LLStrider<LLVector3> pos_strider; 
-									buffer->getVertexStrider(pos_strider, 0);
-									LLVector4a* pos = (LLVector4a*) pos_strider.get();
-							
-									LLStrider<U16> idx;
-									buffer->getIndexStrider(idx, 0);
+								if (physics.mHull.empty())
+								{
+									if (mVertexBuffer[LLModel::LOD_PHYSICS].empty())
+									{
+										genBuffers(LLModel::LOD_PHYSICS, false);
+									}
 
-									for (U32 i = 0; i < buffer->getNumIndices(); i += 3)
+									auto num_degenerate = 0;
+									//<FS:Beq> More nested i variable silliness
+									//									for (U32 i = 0; i < mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); ++i)
+									auto num_models = mVertexBuffer[LLModel::LOD_PHYSICS][model].size();
+									for (U32 v = 0; v < num_models; ++v)
 									{
-										LLVector4a v1; v1.setMul(pos[*idx++], scale);
-										LLVector4a v2; v2.setMul(pos[*idx++], scale);
-										LLVector4a v3; v3.setMul(pos[*idx++], scale);
+										LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][v];
+									//</FS:Beq>
+										if(buffer->getNumVerts() < 3)continue;
+
+										buffer->setBuffer(type_mask & buffer->getTypeMask());
+
+										LLStrider<LLVector3> pos_strider;
+										buffer->getVertexStrider(pos_strider, 0);
+										LLVector4a* pos = (LLVector4a*)pos_strider.get();
+
+										LLStrider<U16> idx;
+										buffer->getIndexStrider(idx, 0);
 
-										if (ll_is_degenerate(v1,v2,v3))
+										LLVector4a v1, v2, v3;
+										//<FS:Beq> rename inner most i to avoid merge confusion
+										for (U32 indices_offset = 0; indices_offset < buffer->getNumIndices(); indices_offset += 3)
 										{
-											buffer->draw(LLRender::LINE_LOOP, 3, i);
-											buffer->draw(LLRender::POINTS, 3, i);
+											v1.setMul(pos[*idx++], scale);
+											v2.setMul(pos[*idx++], scale);
+											v3.setMul(pos[*idx++], scale);
+
+											if (ll_is_degenerate(v1, v2, v3))
+											{
+												num_degenerate++;
+												glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+												gGL.diffuseColor3fv(deg_edge_col().mV);
+												buffer->drawRange(LLRender::TRIANGLES, 0, 2, 3, indices_offset);
+												buffer->drawRange(LLRender::POINTS, 0, 2, 3, indices_offset);
+												glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+												gGL.diffuseColor3fv(deg_fill_col().mV);
+												buffer->drawRange(LLRender::TRIANGLES, 0, 2, 3, indices_offset);
+											}
 										}
 									}
 								}
 							}
-						}
 
-						gGL.popMatrix();
+							gGL.popMatrix();
+						}
+						glLineWidth(1.f);
+						glPointSize(1.f);
+						gPipeline.enableLightsPreview();
+						gGL.setSceneBlendType(LLRender::BT_ALPHA);
 					}
-					glLineWidth(1.f);
-					glPointSize(1.f);
-					gPipeline.enableLightsPreview();
-					gGL.setSceneBlendType(LLRender::BT_ALPHA);
 				}
 			}
 		}
@@ -4170,16 +4342,19 @@ BOOL LLModelPreview::render()
 							}
 						
 							buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);
-							gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
+							// <FS:Beq> configurable colour and width
+							//gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
 
 							if (edges)
 							{
-								glLineWidth(3.f);
+								gGL.diffuseColor4fv(edge_col().mV);
+								glLineWidth(edge_width);
 								glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
 								buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);
 								glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
 								glLineWidth(1.f);
 							}
+							// </FS:Beq>
 						}
 					}
 				}
@@ -4237,8 +4412,11 @@ void LLModelPreview::rotate(F32 yaw_radians, F32 pitch_radians)
 void LLModelPreview::zoom(F32 zoom_amt)
 {
 	F32 new_zoom = mCameraZoom+zoom_amt;
-
-	mCameraZoom	= llclamp(new_zoom, 1.f, 10.f);
+	// <FS:Beq> add configurable zoom TODO: stop clamping in render
+	// mCameraZoom = llclamp(new_zoom, 1.f, 10.f);
+	static LLCachedControl<F32> zoom_limit(gSavedSettings, "MeshPreviewZoomLimit");
+	mCameraZoom	= llclamp(new_zoom, 1.f, zoom_limit());
+	// </FS:Beq>
 }
 
 void LLModelPreview::pan(F32 right, F32 up)
@@ -4444,11 +4622,22 @@ void LLFloaterModelPreview::toggleCalculateButton(bool visible)
 		childSetTextArg("server_weight", "[SIM]", tbd);
 		childSetTextArg("physics_weight", "[PH]", tbd);
 		childSetTextArg("upload_fee", "[FEE]", tbd);
-		childSetTextArg("price_breakdown", "[STREAMING]", tbd);
-		childSetTextArg("price_breakdown", "[PHYSICS]", tbd);
-		childSetTextArg("price_breakdown", "[INSTANCES]", tbd);
-		childSetTextArg("price_breakdown", "[TEXTURES]", tbd);
-		childSetTextArg("price_breakdown", "[MODEL]", tbd);
+		// <FS:Beq> add extended info fields
+		//childSetTextArg("price_breakdown", "[STREAMING]", dashes);
+		//childSetTextArg("price_breakdown", "[PHYSICS]", dashes);
+		//childSetTextArg("price_breakdown", "[INSTANCES]", dashes);
+		//childSetTextArg("price_breakdown", "[TEXTURES]", dashes);
+		//childSetTextArg("price_breakdown", "[MODEL]", dashes);
+		std::string dashes = hasString("--") ? getString("--") : "--";
+		childSetTextArg("price_breakdown", "[STREAMING]", dashes);
+		childSetTextArg("price_breakdown", "[PHYSICS]", dashes);
+		childSetTextArg("price_breakdown", "[INSTANCES]", dashes);
+		childSetTextArg("price_breakdown", "[TEXTURES]", dashes);
+		childSetTextArg("price_breakdown", "[MODEL]", dashes);
+		childSetTextArg("physics_breakdown", "[PCH]", dashes);
+		childSetTextArg("physics_breakdown", "[PM]", dashes);
+		childSetTextArg("physics_breakdown", "[PHU]", dashes);
+		// </FS:Beq>
 	}
 }
 
@@ -4498,6 +4687,16 @@ void LLFloaterModelPreview::handleModelPhysicsFeeReceived()
 	childSetTextArg("price_breakdown", "[INSTANCES]", llformat("%d", result["upload_price_breakdown"]["mesh_instance"].asInteger()));
 	childSetTextArg("price_breakdown", "[TEXTURES]", llformat("%d", result["upload_price_breakdown"]["texture"].asInteger()));
 	childSetTextArg("price_breakdown", "[MODEL]", llformat("%d", result["upload_price_breakdown"]["model"].asInteger()));
+//<FS:Beq> Updates for enhanced Mesh feedback at upload
+	childSetTextArg("physics_breakdown", "[PCH]", llformat("%0.3f", result["model_physics_cost"]["hull"].asReal()));
+	childSetTextArg("physics_breakdown", "[PM]", llformat("%0.3f", result["model_physics_cost"]["mesh"].asReal()));
+	childSetTextArg("physics_breakdown", "[PHU]", llformat("%0.3f", result["model_physics_cost"]["decomposition"].asReal()));
+	childSetTextArg("streaming_breakdown", "[STR_TOTAL]", llformat("%d", result["streaming_cost"].asInteger()));
+	childSetTextArg("streaming_breakdown", "[STR_HIGH]", llformat("%d", result["streaming_params"]["high_lod"].asInteger()));
+	childSetTextArg("streaming_breakdown", "[STR_MED]", llformat("%d", result["streaming_params"]["medium_lod"].asInteger()));
+	childSetTextArg("streaming_breakdown", "[STR_LOW]", llformat("%d", result["streaming_params"]["low_lod"].asInteger()));
+	childSetTextArg("streaming_breakdown", "[STR_LOWEST]", llformat("%d", result["streaming_params"]["lowest_lod"].asInteger()));
+//</FS:Beq>
 	childSetVisible("upload_fee", true);
 	childSetVisible("price_breakdown", true);
 	mUploadBtn->setEnabled(isModelUploadAllowed());
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index 7ec6a58ac7..564f4c39de 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -152,6 +152,7 @@ protected:
 	static void		onAutoFillCommit(LLUICtrl*,void*);
 	
 	void onLODParamCommit(S32 lod, bool enforce_tri_limit);
+	void draw3dPreview();
 
 	static void		onExplodeCommit(LLUICtrl*, void*);
 	
@@ -310,6 +311,7 @@ public:
 	static bool 		sIgnoreLoadedCallback;
     std::vector<S32> mLodsQuery;
     std::vector<S32> mLodsWithParsingError;
+	bool mHasDegenerate;
 
 protected:
 
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 40d6d325ba..c7626304ed 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -6582,7 +6582,7 @@ void LLPipeline::enableLightsPreview()
 	light->enable();
 	light->setPosition(light_pos);
 	light->setDiffuse(diffuse0);
-	light->setAmbient(LLColor4::black);
+	light->setAmbient(ambient);
 	light->setSpecular(specular0);
 	light->setSpotExponent(0.f);
 	light->setSpotCutoff(180.f);
@@ -6593,7 +6593,7 @@ void LLPipeline::enableLightsPreview()
 	light->enable();
 	light->setPosition(light_pos);
 	light->setDiffuse(diffuse1);
-	light->setAmbient(LLColor4::black);
+	light->setAmbient(ambient);
 	light->setSpecular(specular1);
 	light->setSpotExponent(0.f);
 	light->setSpotCutoff(180.f);
@@ -6603,7 +6603,7 @@ void LLPipeline::enableLightsPreview()
 	light->enable();
 	light->setPosition(light_pos);
 	light->setDiffuse(diffuse2);
-	light->setAmbient(LLColor4::black);
+	light->setAmbient(ambient);
 	light->setSpecular(specular2);
 	light->setSpotExponent(0.f);
 	light->setSpotCutoff(180.f);
diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
index 5a86eb06fb..e073268b0a 100644
--- a/indra/newview/skins/default/xui/en/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -2,12 +2,12 @@
 <floater
  can_close="true"
  can_drag_on_left="false"
- can_minimize="false"
- can_resize="false"
- height="480"
- min_height="480"
- width="980"
- min_width="980"
+ can_minimize="true"
+ can_resize="true"
+ height="600"
+ min_height="600"
+ width="1024"
+ min_width="1024"
  name="Model Preview"
  title="UPLOAD MODEL"
  help_topic="upload_model" >
@@ -33,19 +33,21 @@
   <string name="mesh_status_missing_lod">Missing required level of detail.</string>
   <string name="mesh_status_invalid_material_list">LOD materials are not a subset of reference model.</string>
   <string name="phys_status_vertex_limit_exceeded">Some physical hulls exceed vertex limitations.</string>
+  <string name="phys_status_degenerate_triangles">The physics mesh too dense remove the small thin triangles (see preview)</string>
+  <string name="phys_status_no_havok">The Firestorm OpenSim build is not supported for physics upload in SL.</string>
   <string name="layer_all">All</string> <!-- Text to display in physics layer combo box for "all layers" -->
   <string name="decomposing">Analyzing...</string>
   <string name="simplifying">Simplifying...</string>
   <string name="tbd">TBD</string>
 
-<panel
-  follows="top|left"
-  height="455"
-  layout="topleft"
-  left="3"
-  name="left_panel"
-  top_pad="10"
-  width="630">
+  <panel
+    follows="top|left"
+    height="580"
+    layout="topleft"
+    left="3"
+    name="left_panel"
+    top_pad="0"
+    width="630">
     <panel
       follows="all"
       height="50"
@@ -755,8 +757,9 @@
                       name="first_step_name"
                       text_color="White"
                       top_pad="0"
-                      width="210">
-                      Step 1: Level of Detail
+                      width="210"
+                      valign="center">
+                      Step 1: Pick a physics model :
                     </text>
                     <combo_box
                       follows="left|top"
@@ -798,7 +801,7 @@
               layout="topleft"
               left="18"
               name="physics_tab_border"
-              top_pad="15"
+              top_pad="10"
               width="589"/>
                 <panel
                   bg_alpha_color="0 0 0 0"
@@ -807,7 +810,7 @@
                   follows="top|left"
                   left="18"
                   name="physics analysis"
-                  top_pad="15"
+                  top_pad="10"
                   visible="true"
                   width="589">
                     <text
@@ -819,7 +822,7 @@
                       name="method_label"
                       text_color="White"
                       top_pad="0">
-                      Step 2: Analyze
+                      Step 2: Convert to hulls (optional)
                     </text>
                     <text
                       follows="top|left"
@@ -905,7 +908,7 @@
               layout="topleft"
               left="18"
               name="physics_tab_border"
-              top_pad="15"
+              top_pad="10"
               width="589"/>
                 <panel
                   bg_alpha_color="0 0 0 0"
@@ -914,7 +917,7 @@
                   height="66"
                   left="18"
                   name="physics simplification"
-                  top_pad="15"
+                  top_pad="10"
                   width="589">
                     <text
                       text_color="White"
@@ -1013,7 +1016,7 @@
               layout="topleft"
               left="18"
               name="physics_tab_border"
-              top_pad="15"
+              top_pad="10"
               width="589"/>
                 <panel
                   bg_alpha_color="0 0 0 0"
@@ -1075,10 +1078,9 @@
                  follows="left|top"
                  height="19"
                  layout="topleft"
-                 left_pad="5"
-                 top_delta="0"
+                 top_pad="5"
                  name="physics message"
-                 width="270">
+                 width="589">
                      <icon
                       follows="left|top"
                       height="16"
@@ -1093,7 +1095,7 @@
                       layout="topleft"
                       left_pad="2"
                       name="physics_status_message_text"
-                      width="252"
+                      width="573"
                       top_delta="3"/>
                 </panel>
         </panel>
@@ -1219,13 +1221,14 @@
      </panel>
     </tab_container>
     <panel
-     follows="top|left"
-     height="80"
-     layout="top|left"
-     left="0"
+     follows="top|left|bottom"
+     layout="topleft"
+     height="184"
+     left="4"
+     border="true"
      name="weights_and_warning_panel"
      top_pad="3"
-     width="625">
+     width="629">
        <button
          follows="top|left"
          label="Calculate weights &amp; fee"
@@ -1265,10 +1268,10 @@
          label_color="White"
          layout="topleft"
          name="reset_btn"
-         right="-2"
+         right="-5"
          top="3"
          height="20"
-         width="275"/>
+         width="265"/>
        <!-- ========== WEIGHTS ==========-->
        <text
          follows="top|left"
@@ -1287,7 +1290,7 @@
          left_pad="0"
          name="prim_weight"
          top_delta="0"
-         width="120"
+         width="130"
          word_wrap="true">
          Land impact: [EQ]
        </text>
@@ -1297,7 +1300,7 @@
          left_pad="0"
          name="download_weight"
          top_delta="0"
-         width="100"
+         width="130"
          word_wrap="true">
          Download: [ST]
        </text>
@@ -1307,7 +1310,7 @@
          layout="topleft"
          left_pad="0"
          name="physics_weight"
-         width="90"
+         width="130"
          word_wrap="true">
          Physics: [PH]
        </text>
@@ -1317,17 +1320,148 @@
          layout="topleft"
          left_pad="0"
          name="server_weight"
-         width="83"
+         width="130"
          word_wrap="true">
          Server: [SIM]
        </text>
-       <!-- ========== NOTE MESSAGE ========== -->
+       <!-- =========== Cost breakdown ======== -->
+      <panel
+        border="true"
+        top_pad="5"
+        layout="topleft"
+        left="6"
+        name="price_breakdown_panel"
+        width="120"
+        height="100">
+        <text
+          layout="topleft"
+          left="3">
+          Price Breakdown
+        </text>
+        <view_border
+          bevel_style="none"
+          follows="top|left"
+          height="0"
+          layout="topleft"
+          left="3"
+          name="price_breakdown_border"
+          top_pad="5"
+          width="110"/>
+        <text
+          height="80"
+          top_pad="5"
+          layout="topleft"
+          left="3"
+          name="price_breakdown_labels"
+          width="70"
+          word_wrap="false">
+Download:
+Physics:
+Instances:
+Textures:
+Model:
+        </text>
+        <text
+          height="80"
+          top_delta="0"
+          layout="topleft"
+          halign="right"
+          left_pad="0"
+          name="price_breakdown"
+          width="40"
+          word_wrap="false">
+[STREAMING]
+[PHYSICS]
+[INSTANCES]
+[TEXTURES]
+[MODEL]
+        </text>
+      </panel>
+       <!-- 
+       Streaming breakdown numbers are available but not fully understood
+       uncommenting the following sections will display the numbers for debugging purposes
+       <text
+        height="80"
+        top_delta="0"
+        layout="topleft"
+        left="130"
+        name="streaming_breakdown_labels"
+        width="65"
+        word_wrap="true">
+Streaming/Download:
+High:
+Medium:
+Low:
+Lowest:
+      </text>
        <text
+        height="80"
+        top_delta="0"
+        layout="topleft"
+        left_pad="0"
+        name="streaming_breakdown"
+        width="95"
+        word_wrap="true">
+[STR_TOTAL]
+[STR_HIGH]
+[STR_MED]
+[STR_LOW]
+[STR_LOWEST]
+      </text>-->
+      <panel
+        border="true"
+        layout="topleft"
+        left_pad="265"
+        name="price_breakdown_panel"
+        width="120"
+        height="100">
+        <text
+          layout="topleft"
+          left="3">
+          Physics Costs
+        </text>
+        <view_border
+          bevel_style="none"
+          follows="top|left"
+          height="0"
+          layout="topleft"
+          left="3"
+          name="price_breakdown_border"
+          top_pad="5"
+          width="110"/>
+        <text
+         height="80"
+         top_pad="5"
+         layout="topleft"
+         left="5"
+         name="physics_breakdown_labels"
+         width="65">
+Base Hull:
+Mesh:
+Analysed:
+        </text>
+        <text
+         height="80"
+         top_delta="0"
+         layout="topleft"
+         left_pad="0"
+         name="physics_breakdown"
+         width="40"
+         halign="right"
+         word_wrap="false"
+         visible="true">
+[PCH]
+[PM]
+[PHU]
+        </text>-->
+      </panel>
+      <!-- ========== NOTE MESSAGE ========== -->
+      <text
          font="SansSerif"
          layout="topleft"
          left="6"
          name="warning_title"
-         top_pad="10"
+         top_pad="5"
          text_color="DrYellow"
          visible="false"
          width="40">
@@ -1346,104 +1480,110 @@
          visible="false">
          You dont have rights to upload mesh models. [[VURL] Find out how] to get certified.
        </text>
-       <text text_color="Yellow" layout="topleft" top_delta="20" left="6" name="status">[STATUS]</text>
-  
+       <text text_color="Yellow" layout="topleft" top_delta="5" left="6" name="status">
+[STATUS]
+       </text>
     </panel>
-</panel>
-
-<text 
- follows="left|top"
- layout="topleft"
- left="640"
- name="lod_label"
- text_color="White"
- top="13"
- height="15"
- width="290">
- Preview:
- </text>
-<panel
- border="true"
- bevel_style="none"
- follows="top|left"
- name="preview_panel"
- top_pad="4"
- width="290"
- height="290"/>
-
-<panel
-  follows="all"
-  height="130"
-  layout="topleft"
-  name="right_panel"
-  top_pad="5"
-  width="340">
-    <combo_box
-      top_pad="3"
+  </panel>
+  <panel
+    follows="top|left|bottom|right"
+    can_resize="true"
+    name="right_panel"
+    top="0"
+    left="640"
+    background_visible="true"
+    width="375">
+    <text
       follows="left|top"
-      height="18"
       layout="topleft"
-      name="preview_lod_combo"
-      width="150"
-      tool_tip="LOD to view in preview render">
+      left="0"
+      name="lod_label"
+      text_color="White"
+      top="13"
+      height="15"
+      width="290">
+      Preview:
+    </text>
+    <panel
+      can_resize="false"
+      follows="top|left"
+      height="20"
+      name="right_upper_panel"
+      top="8"
+      left="60"
+      background_visible="true"
+      width="315">
+      <combo_box
+        top_pad="3"
+        can_resize="false"
+        follows="top|left"
+        height="18"
+        layout="topleft"
+        name="preview_lod_combo"
+        width="75"
+        tool_tip="LOD to view in preview render">
         <combo_item name="high">   High   </combo_item>
         <combo_item name="medium"> Medium </combo_item>
         <combo_item name="low">    Low    </combo_item>
         <combo_item name="lowest"> Lowest </combo_item>
-    </combo_box>
-    <text
-      follows="top|left"
-      layout="topleft"
-      text_color="White"
-      top="5"
-      left_pad="20"
-      name="label_display"
-      width="50">
-      Display...
-    </text>
-    <check_box
-      follows="top|left"
-      label="Edges"
+      </combo_box>
+    </panel>
+  </panel>
+  <panel
+     border="true"
+     bevel_style="none"
+     follows="top|left|right|bottom"
+     layout="topleft"
+     name="preview_panel"
+     top="30"
+     width="375"
+     height="525"/>
+
+   <panel
+     follows="left|right|bottom"
+     layout="topleft"
+     height="40"
+     name="lower_right_panel"
+     top_pad="5"
+     width="375">
+     <check_box
+       follows="right|bottom"
+       label="Edges"
       label_text.text_color="White"
       layout="topleft"
-      left_delta="0"
       name="show_edges"
-      top_pad="8">
-    </check_box>
+      width="70"
+      left="0"
+      top_pad="8"/>
     <check_box
-      follows="top|left"
+      follows="right|bottom"
+      left_pad="8"
       label="Physics"
       label_text.text_color="White"
-      layout="topleft"
-      name="show_physics"
-      top_pad="8">
-    </check_box>
+      name="show_physics"/>
     <check_box
-      follows="top|left"
+      follows="right|bottom"
       label="Textures"
       label_text.text_color="White"
       layout="topleft"
       name="show_textures"
-      top_pad="8">
-    </check_box>
+      left_pad="0"/>
     <check_box
-      follows="top|left"
-      label="Skin weights"
+      follows="right|bottom"
+      label="Weights"
       label_text.text_color="White"
       layout="topleft"
       name="show_skin_weight"
-      top_pad="8">
-    </check_box>
+      left_pad="0"/>
     <check_box
-      follows="top|left"
+      follows="right|bottom"
       label="Joints"
       label_text.text_color="White"
       layout="topleft"
       name="show_joint_positions"
-      top_pad="8">
-    </check_box>
+      left_pad="0"/>
     <text
-      follows="top|left"
+      follows="right|bottom"
       layout="topleft"
       left="2"
       name="physics_explode_label"
@@ -1453,12 +1593,13 @@
     </text>
     <slider
       name="physics_explode"
-      follows="top|left"
-      top="100"
-      left="0"
+      follows="right|bottom"
+      valign="center"
+      top="15"
+      left="80"
       min_val="0.0"
       max_val="3.0"
       height="20"
-      width="150"/>
-</panel>
+      width="120"/>
+  </panel>
 </floater>
-- 
cgit v1.2.3


From 9a24c728d8b6a5e42e4babcebe75116db36e9f0f Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Thu, 3 Jan 2019 01:19:41 +0200
Subject: SL-10288 settings.xml fix

---
 indra/newview/app_settings/settings.xml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 1abddc80cb..72301e7d14 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -6810,6 +6810,7 @@
     <key>Value</key>
     <real>10.0</real>
   </map>
+  <key>MigrateCacheDirectory</key>
   <map>
       <key>Comment</key>
       <string>Check for old version of disk cache to migrate to current location</string>
@@ -16480,3 +16481,4 @@
 </map>
 </llsd>
 
+
-- 
cgit v1.2.3


From 76369c2463246227e297c6fee88a4de4e6d4ed67 Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Thu, 3 Jan 2019 14:30:01 +0200
Subject: SL-10288 comments cleanup

---
 .../shaders/class1/objects/previewV.glsl           |   2 -
 indra/newview/lldynamictexture.cpp                 |  15 +--
 indra/newview/llfloatermodelpreview.cpp            | 118 ++++-----------------
 3 files changed, 21 insertions(+), 114 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
index 3424613e94..de2ea2a065 100644
--- a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
@@ -91,9 +91,7 @@ void main()
 
 	// Collect normal lights (need to be divided by two, as we later multiply by 2)
 	col.rgb += light_diffuse[1].rgb * calcDirectionalLight(norm, light_position[1].xyz);
-//	col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].z);
 	col.rgb += light_diffuse[2].rgb * calcDirectionalLight(norm, light_position[2].xyz);
-//	col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].z);
 	col.rgb += light_diffuse[3].rgb * calcDirectionalLight(norm, light_position[3].xyz);
 	col /= 2.0;
 	vertex_color = col*color;
diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp
index af6977d3cd..e180d91461 100644
--- a/indra/newview/lldynamictexture.cpp
+++ b/indra/newview/lldynamictexture.cpp
@@ -125,17 +125,11 @@ BOOL LLViewerDynamicTexture::render()
 //-----------------------------------------------------------------------------
 void LLViewerDynamicTexture::preRender(BOOL clear_depth)
 {
-	// <FS:Beq> changes to support higher resolution rendering in the preview
-	////only images up to 512x512 are supported
-	//llassert(mFullHeight <= 512);
-	//llassert(mFullWidth <= 512);
 	gPipeline.allocatePhysicsBuffer();
 	llassert(mFullWidth <= static_cast<S32>(gPipeline.mPhysicsDisplay.getWidth()));
 	llassert(mFullHeight <= static_cast<S32>(gPipeline.mPhysicsDisplay.getHeight()));
 
-//	if (gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete() && !gGLManager.mIsATI)
 	if (gGLManager.mHasFramebufferObject && gPipeline.mPhysicsDisplay.isComplete() && !gGLManager.mIsATI)
-// </FS:Beq>
 	{ //using offscreen render target, just use the bottom left corner
 		mOrigin.set(0, 0);
 	}
@@ -221,15 +215,13 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
 	{
 		return TRUE;
 	}
-	// <FS:Beq> changes to support higher resolution rendering in the preview
-	//	bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete() && !gGLManager.mIsATI;
+
 	bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mPhysicsDisplay.isComplete() && !gGLManager.mIsATI;
 	if (use_fbo)
 	{
-//		gPipeline.mWaterDis.bindTarget();
 		gPipeline.mPhysicsDisplay.bindTarget();
 	}
-	// </FS:Beq>
+
 	LLGLSLShader::bindNoShader();
 	LLVertexBuffer::unbind();
 	
@@ -265,10 +257,7 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
 
 	if (use_fbo)
 	{
-		// <FS:Beq> changes to support higher resolution rendering in the preview
-		// gPipeline.mWaterDis.flush();
 		gPipeline.mPhysicsDisplay.flush();
-		// </FS:Beq>
 	}
 
 	return ret;
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 01f0a5197d..c86eed2192 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -427,11 +427,8 @@ void LLFloaterModelPreview::initModelPreview()
 	{
 		delete mModelPreview;
 	}
-	// <FS:Beq> mesh uploader changes to allow higher resolution render
-	//	mModelPreview = new LLModelPreview(512, 512, this);
 	auto size = gSavedSettings.getS32("PreviewRenderSize");
 	mModelPreview = new LLModelPreview(size, size, this );
-	// </FS:Beq>
 	mModelPreview->setPreviewTarget(16.f);
 	mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelPreview::setDetails, this, _1, _2, _3, _4, _5));
 	mModelPreview->setModelUpdatedCallback(boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this, _1));
@@ -441,8 +438,6 @@ void LLFloaterModelPreview::onViewOptionChecked(LLUICtrl* ctrl)
 {
 	if (mModelPreview)
 	{
-		// <FS:Beq> only show explode when phsyics is on
-		//		mModelPreview->mViewOption[ctrl->getName()] = !mModelPreview->mViewOption[ctrl->getName()];
 		auto name = ctrl->getName();
 		mModelPreview->mViewOption[name] = !mModelPreview->mViewOption[name];
 		if (name == "show_physics")
@@ -664,7 +659,6 @@ void LLFloaterModelPreview::onLODParamCommit(S32 lod, bool enforce_tri_limit)
 	}
 }
 
-// <FS:Beq> extracted method to simplify changes in layout
 void LLFloaterModelPreview::draw3dPreview()
 {
 	gGL.color3f(1.f, 1.f, 1.f);
@@ -1266,7 +1260,7 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
 , mResetJoints( false )
 , mModelNoErrors( true )
 , mLastJointUpdate( false )
-, mHasDegenerate( false ) // <FS:Beq>
+, mHasDegenerate( false )
 {
 	mNeedsUpdate = TRUE;
 	mCameraDistance = 0.f;
@@ -2756,7 +2750,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
 
 void LLModelPreview::updateStatusMessages()
 {
-// <FS:Beq> bit mask values for physics errors. used to prevent overwrite of single line status
+// bit mask values for physics errors. used to prevent overwrite of single line status
 // TODO: use this to provied multiline status
 	enum PhysicsError
 	{
@@ -2766,10 +2760,10 @@ void LLModelPreview::updateStatusMessages()
 		TOOMANYHULLS=4,
 		TOOMANYVERTSINHULL=8
 	};
-// </FS:Beq>
+
 	assert_main_thread();
 
-	U32 has_physics_error{ PhysicsError::NONE }; // <FS:Beq> physics error bitmap
+	U32 has_physics_error{ PhysicsError::NONE }; // physics error bitmap
 	//triangle/vertex/submesh count for each mesh asset for each lod
 	std::vector<S32> tris[LLModel::NUM_LODS];
 	std::vector<S32> verts[LLModel::NUM_LODS];
@@ -2858,38 +2852,25 @@ void LLModelPreview::updateStatusMessages()
 	{
 		mMaxTriangleLimit = total_tris[LLModel::LOD_HIGH];
 	}
-	// <FS:Beq> make has_degenerate a member so that we can use it in the render method
-	// has_degenerate = false
+
 	mHasDegenerate = false;
 	{//check for degenerate triangles in physics mesh
 		U32 lod = LLModel::LOD_PHYSICS;
 		const LLVector4a scale(0.5f);
-		for (U32 i = 0; i < mModel[lod].size() && !mHasDegenerate; ++i)// <FS:Beq> make has_degenerate a member 
+		for (U32 i = 0; i < mModel[lod].size() && !mHasDegenerate; ++i)
 		{ //for each model in the lod
 			if (mModel[lod][i] && mModel[lod][i]->mPhysics.mHull.empty())
 			{ //no decomp exists
 				S32 cur_submeshes = mModel[lod][i]->getNumVolumeFaces();
-				for (S32 j = 0; j < cur_submeshes && !mHasDegenerate; ++j)// <FS:Beq> make has_degenerate a member 
+				for (S32 j = 0; j < cur_submeshes && !mHasDegenerate; ++j)
 				{ //for each submesh (face), add triangles and vertices to current total
 					LLVolumeFace& face = mModel[lod][i]->getVolumeFace(j);
-					for (S32 k = 0; (k < face.mNumIndices) && !mHasDegenerate; )// <FS:Beq> make has_degenerate a member 
+					for (S32 k = 0; (k < face.mNumIndices) && !mHasDegenerate; )
 					{
 						U16 index_a = face.mIndices[k + 0];
 						U16 index_b = face.mIndices[k + 1];
 						U16 index_c = face.mIndices[k + 2];
-						// <FS:Beq> FIRE-23367/23387 - Allow forced empty triangle placeholders created by the LOD processing.
-						//	LLVector4a v1; v1.setMul(face.mPositions[index_a], scale);
-						//	LLVector4a v2; v2.setMul(face.mPositions[index_b], scale);
-						//	LLVector4a v3; v3.setMul(face.mPositions[index_c], scale);
-
-						//	if (ll_is_degenerate(v1, v2, v3))
-						//	{
-						//		mHasDegenerate = true;// <FS:Beq> make has_degenerate a member 
-						//	}
-						//	else
-						//	{
-						//		k += 3;
-						//	}
+
 						if (index_c == 0 && index_b == 0 && index_a == 0) // test in reverse as 3rd index is less likely to be 0 in a normal case
 						{
 							LL_DEBUGS("MeshValidation") << "Empty placeholder triangle (3 identical index 0 verts) ignored" << LL_ENDL;
@@ -2901,7 +2882,7 @@ void LLModelPreview::updateStatusMessages()
 							LLVector4a v3; v3.setMul(face.mPositions[index_c], scale);
 							if (ll_is_degenerate(v1, v2, v3))
 							{
-								mHasDegenerate = true;// <FS:Beq> make has_degenerate a member 
+								mHasDegenerate = true;
 							}
 						}
 						k += 3;
@@ -2911,7 +2892,7 @@ void LLModelPreview::updateStatusMessages()
 		}
 	}
 
-	// <FS:Beq> flag degenerates here rather than deferring to a MAV error later
+	// flag degenerates here rather than deferring to a MAV error later
 	mFMP->childSetVisible("physics_status_message_text", mHasDegenerate); //display or clear
 	auto degenerateIcon = mFMP->getChild<LLIconCtrl>("physics_status_message_icon");
 	degenerateIcon->setVisible(mHasDegenerate);
@@ -2922,7 +2903,6 @@ void LLModelPreview::updateStatusMessages()
 		LLUIImagePtr img = LLUI::getUIImage("ModelImport_Status_Error");
 		degenerateIcon->setImage(img);
 	}
-	// </FS:Beq>
 
 	mFMP->childSetTextArg("submeshes_info", "[SUBMESHES]", llformat("%d", total_submeshes[LLModel::LOD_HIGH]));
 
@@ -3092,12 +3072,7 @@ void LLModelPreview::updateStatusMessages()
 			mModelNoErrors = false;
 		}
 	}
-	// <FS:Beq> Improve the error checking the TO DO here is no longer applicable but not an FS comment so edited to stop it being picked up
-	//// To do investigate use of has_degenerate and include into mModelNoErrors upload blocking mechanics
-	//// current use of has_degenerate won't block upload permanently - later checks will restore the button
-	//if (!mModelNoErrors || mHasDegenerate)
-	//{
-	//	mFMP->childDisable("ok_btn");
+
 	if (!mModelNoErrors || mHasDegenerate)
 	{
 		mFMP->childDisable("ok_btn");
@@ -3722,7 +3697,7 @@ BOOL LLModelPreview::render()
 	bool textures = mViewOption["show_textures"];
 	bool physics = mViewOption["show_physics"];
 
-	// <FS:Beq> Extra configurability, to be exposed later as controls?
+	// Extra configurability, to be exposed later as controls?
 	static LLCachedControl<LLColor4> canvas_col(gSavedSettings, "MeshPreviewCanvasColor");
 	static LLCachedControl<LLColor4> edge_col(gSavedSettings, "MeshPreviewEdgeColor");
 	static LLCachedControl<LLColor4> base_col(gSavedSettings, "MeshPreviewBaseColor");
@@ -3735,16 +3710,12 @@ BOOL LLModelPreview::render()
 	static LLCachedControl<LLColor4> deg_fill_col(gSavedSettings, "MeshPreviewDegenerateFillColor");	
 	static LLCachedControl<F32> deg_edge_width(gSavedSettings, "MeshPreviewDegenerateEdgeWidth");
 	static LLCachedControl<F32> deg_point_size(gSavedSettings, "MeshPreviewDegeneratePointSize");
-	// </FS:Beq>
+
 	S32 width = getWidth();
 	S32 height = getHeight();
 
 	LLGLSUIDefault def;
 	LLGLDisable no_blend(GL_BLEND);
-// <FS:Beq> Clean up render of mesh preview
-//	LLGLEnable blend(GL_BLEND);
-//	gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
-// </FS:Beq> 
 
 	LLGLEnable cull(GL_CULL_FACE);
 	LLGLDepthTest depth(GL_TRUE);
@@ -3764,8 +3735,7 @@ BOOL LLModelPreview::render()
 		gGL.matrixMode(LLRender::MM_MODELVIEW);
 		gGL.pushMatrix();
 		gGL.loadIdentity();
-		// <FS:Beq> uploader improvements
-		//gGL.color4f(0.169f, 0.169f, 0.169f, 1.f);
+
 		gGL.color4fv(static_cast<LLColor4>(canvas_col).mV);
 		gl_rect_2d_simple( width, height );
 
@@ -3914,11 +3884,7 @@ BOOL LLModelPreview::render()
 	stop_glerror();
 
 	gGL.pushMatrix();
-	// <FS:Beq> mesh uploader improvements configurable brightness
-	//const F32 BRIGHTNESS = 0.9f;
-	//gGL.color3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);
 	gGL.color4fv(edge_col().mV);
-	// </FS:Beq>
 
 	const U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
 
@@ -4003,19 +3969,12 @@ BOOL LLModelPreview::render()
 						}
 						else
 						{
-						// <FS:Beq> improved mesh uploader
-						//	gGL.diffuseColor4f(1,1,1,1);
 							gGL.diffuseColor4fv(static_cast<LLColor4>(base_col).mV);
-						// </FS:Beq>
-
 						}
 
 						buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
 						gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-						// <FS:Beq> improved mesh uploader
-						//gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
 						gGL.diffuseColor4fv(static_cast<LLColor4>(edge_col).mV);
-						// </FS:Beq> 
 						if (edges)
 						{
 							glLineWidth(edge_width);
@@ -4030,25 +3989,10 @@ BOOL LLModelPreview::render()
 
 			if (physics)
 			{
-				// <FS:Beq> model upload improvements - use the settings
-				////Vector4a physicsFillColour(0.4, 0.4, 0.4, 0.4);
-				//const LLColor4 physicsFillColour(0.0, 0.5, 1.0, 0.5);
-				////LLVector4a physicsEdgeColour(1.0, 1.0, 0.0, 1.0);
-				//const LLColor4 physicsEdgeColour=physicsFillColour*0.5;
-				//const LLColor4 degenerateFill(1.0, 0.0, 0.0, 0.5);
-				//const LLColor4 degenerateEdge(1.0,0.0,0.0,1.0);
-				// </FS:Beq> 
-
 				glClear(GL_DEPTH_BUFFER_BIT);
-				//<FS:Beq> refactor to remove silly variable names
-				//				for (U32 i = 0; i < 2; i++)
 				for (U32 pass = 0; pass < 2; pass++)
-				//</FS:Beq>
 				{
-					//<FS:Beq> refactor to remove silly variable names
-					//if (i == 0)
 					if (pass == 0)
-					//</FS:Beq>
 					{ //depth only pass
 						gGL.setColorMask(false, false);
 					}
@@ -4058,10 +4002,7 @@ BOOL LLModelPreview::render()
 					}
 
 					//enable alpha blending on second pass but not first pass
-					//<FS:Beq> refactor to remove silly variable names
-					//LLGLState blend(GL_BLEND, i);
 					LLGLState blend(GL_BLEND, pass);
-					//</FS:Beq>
 
 					gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
 
@@ -4165,16 +4106,11 @@ BOOL LLModelPreview::render()
 						gGL.popMatrix();
 					}
 
-					//<FS:Beq> refactor to remove silly variable names
-					// also only do this if mDegenerate was set in the preceding mesh checks [Check this if the ordering ever breaks]
-					//if (i > 0)
+					// only do this if mDegenerate was set in the preceding mesh checks [Check this if the ordering ever breaks]
 					if (pass > 0 && mHasDegenerate)
-					//</FS:Beq>
 					{
 						glLineWidth(deg_edge_width);
 						glPointSize(deg_point_size);
-// <FS:Beq> This single line is why the degenerate triangles display has been crap forever. 
-// 						gPipeline.enableLightsFullbright(LLColor4::white);
 						//show degenerate triangles
 						LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS);
 						LLGLDisable cull(GL_CULL_FACE);
@@ -4212,13 +4148,10 @@ BOOL LLModelPreview::render()
 									}
 
 									auto num_degenerate = 0;
-									//<FS:Beq> More nested i variable silliness
-									//									for (U32 i = 0; i < mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); ++i)
 									auto num_models = mVertexBuffer[LLModel::LOD_PHYSICS][model].size();
 									for (U32 v = 0; v < num_models; ++v)
 									{
 										LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][v];
-									//</FS:Beq>
 										if(buffer->getNumVerts() < 3)continue;
 
 										buffer->setBuffer(type_mask & buffer->getTypeMask());
@@ -4231,7 +4164,6 @@ BOOL LLModelPreview::render()
 										buffer->getIndexStrider(idx, 0);
 
 										LLVector4a v1, v2, v3;
-										//<FS:Beq> rename inner most i to avoid merge confusion
 										for (U32 indices_offset = 0; indices_offset < buffer->getNumIndices(); indices_offset += 3)
 										{
 											v1.setMul(pos[*idx++], scale);
@@ -4342,8 +4274,6 @@ BOOL LLModelPreview::render()
 							}
 						
 							buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);
-							// <FS:Beq> configurable colour and width
-							//gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
 
 							if (edges)
 							{
@@ -4354,7 +4284,6 @@ BOOL LLModelPreview::render()
 								glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
 								glLineWidth(1.f);
 							}
-							// </FS:Beq>
 						}
 					}
 				}
@@ -4412,11 +4341,9 @@ void LLModelPreview::rotate(F32 yaw_radians, F32 pitch_radians)
 void LLModelPreview::zoom(F32 zoom_amt)
 {
 	F32 new_zoom = mCameraZoom+zoom_amt;
-	// <FS:Beq> add configurable zoom TODO: stop clamping in render
-	// mCameraZoom = llclamp(new_zoom, 1.f, 10.f);
+	// TODO: stop clamping in render
 	static LLCachedControl<F32> zoom_limit(gSavedSettings, "MeshPreviewZoomLimit");
 	mCameraZoom	= llclamp(new_zoom, 1.f, zoom_limit());
-	// </FS:Beq>
 }
 
 void LLModelPreview::pan(F32 right, F32 up)
@@ -4622,12 +4549,6 @@ void LLFloaterModelPreview::toggleCalculateButton(bool visible)
 		childSetTextArg("server_weight", "[SIM]", tbd);
 		childSetTextArg("physics_weight", "[PH]", tbd);
 		childSetTextArg("upload_fee", "[FEE]", tbd);
-		// <FS:Beq> add extended info fields
-		//childSetTextArg("price_breakdown", "[STREAMING]", dashes);
-		//childSetTextArg("price_breakdown", "[PHYSICS]", dashes);
-		//childSetTextArg("price_breakdown", "[INSTANCES]", dashes);
-		//childSetTextArg("price_breakdown", "[TEXTURES]", dashes);
-		//childSetTextArg("price_breakdown", "[MODEL]", dashes);
 		std::string dashes = hasString("--") ? getString("--") : "--";
 		childSetTextArg("price_breakdown", "[STREAMING]", dashes);
 		childSetTextArg("price_breakdown", "[PHYSICS]", dashes);
@@ -4637,7 +4558,6 @@ void LLFloaterModelPreview::toggleCalculateButton(bool visible)
 		childSetTextArg("physics_breakdown", "[PCH]", dashes);
 		childSetTextArg("physics_breakdown", "[PM]", dashes);
 		childSetTextArg("physics_breakdown", "[PHU]", dashes);
-		// </FS:Beq>
 	}
 }
 
@@ -4687,7 +4607,7 @@ void LLFloaterModelPreview::handleModelPhysicsFeeReceived()
 	childSetTextArg("price_breakdown", "[INSTANCES]", llformat("%d", result["upload_price_breakdown"]["mesh_instance"].asInteger()));
 	childSetTextArg("price_breakdown", "[TEXTURES]", llformat("%d", result["upload_price_breakdown"]["texture"].asInteger()));
 	childSetTextArg("price_breakdown", "[MODEL]", llformat("%d", result["upload_price_breakdown"]["model"].asInteger()));
-//<FS:Beq> Updates for enhanced Mesh feedback at upload
+
 	childSetTextArg("physics_breakdown", "[PCH]", llformat("%0.3f", result["model_physics_cost"]["hull"].asReal()));
 	childSetTextArg("physics_breakdown", "[PM]", llformat("%0.3f", result["model_physics_cost"]["mesh"].asReal()));
 	childSetTextArg("physics_breakdown", "[PHU]", llformat("%0.3f", result["model_physics_cost"]["decomposition"].asReal()));
@@ -4696,7 +4616,7 @@ void LLFloaterModelPreview::handleModelPhysicsFeeReceived()
 	childSetTextArg("streaming_breakdown", "[STR_MED]", llformat("%d", result["streaming_params"]["medium_lod"].asInteger()));
 	childSetTextArg("streaming_breakdown", "[STR_LOW]", llformat("%d", result["streaming_params"]["low_lod"].asInteger()));
 	childSetTextArg("streaming_breakdown", "[STR_LOWEST]", llformat("%d", result["streaming_params"]["lowest_lod"].asInteger()));
-//</FS:Beq>
+
 	childSetVisible("upload_fee", true);
 	childSetVisible("price_breakdown", true);
 	mUploadBtn->setEnabled(isModelUploadAllowed());
-- 
cgit v1.2.3


From 9a0f37670874a3289b31f0ba02342e85a1784447 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Thu, 3 Jan 2019 16:45:17 +0200
Subject: SL-8963 Fixed Long name of region overlaps with next one on the World
 map

---
 indra/newview/llworldmapview.cpp | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index b88631a71b..f1c23bdb2d 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -465,7 +465,11 @@ void LLWorldMapView::draw()
 					mesg, 0,
 					llfloor(left + 3), llfloor(bottom + 2),
 					LLColor4::white,
-					LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW);
+					LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW,
+					S32_MAX, //max_chars
+					sMapScale, //max_pixels
+					NULL,
+					TRUE); //use ellipses
 			}
 		}
 	}
-- 
cgit v1.2.3


From ab428e194eaa144e8dcecc353c3c7ed83d6cee3e Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Fri, 4 Jan 2019 10:57:49 +0200
Subject: SL-1866 FIXED [OSX] Viewer crashes when the user changes avatar after
 editing texture

---
 indra/newview/lltexturectrl.cpp | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 1a2a10f721..1396a8546d 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -1096,6 +1096,10 @@ void LLTextureCtrl::setVisible( BOOL visible )
 void LLTextureCtrl::setEnabled( BOOL enabled )
 {
 	LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterHandle.get();
+	if( floaterp )
+	{
+		floaterp->setActive(enabled);
+	}
 	if( enabled )
 	{
 		std::string tooltip;
@@ -1110,11 +1114,6 @@ void LLTextureCtrl::setEnabled( BOOL enabled )
 		closeDependentFloater();
 	}
 
-	if( floaterp )
-	{
-		floaterp->setActive(enabled);
-	}
-
 	mCaption->setEnabled( enabled );
 
 	LLView::setEnabled( enabled );
@@ -1215,9 +1214,10 @@ void LLTextureCtrl::showPicker(BOOL take_focus)
 void LLTextureCtrl::closeDependentFloater()
 {
 	LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterHandle.get();
-	if( floaterp )
+	if( floaterp && floaterp->isInVisibleChain())
 	{
 		floaterp->setOwner(NULL);
+		floaterp->setVisible(FALSE);
 		floaterp->closeFloater();
 	}
 }
-- 
cgit v1.2.3


From 09b750483a2cde7ea3c80a0238f3224a2cf1cb70 Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Thu, 3 Jan 2019 22:59:49 +0200
Subject: SL-10293 Firestorm PR: preferences and menu search

---
 doc/contributions.txt                              |   1 +
 indra/llui/CMakeLists.txt                          |   1 +
 indra/llui/llbutton.cpp                            |   4 +
 indra/llui/llbutton.h                              |   7 +
 indra/llui/llcheckboxctrl.h                        |  13 ++
 indra/llui/llmenugl.cpp                            |   4 +
 indra/llui/llmenugl.h                              |   9 +-
 indra/llui/llsearchablecontrol.h                   |  71 ++++++++++
 indra/llui/llsliderctrl.h                          |  15 +-
 indra/llui/lltabcontainer.cpp                      |  50 ++++++-
 indra/llui/lltabcontainer.h                        |   2 +
 indra/llui/lltextbase.cpp                          |  11 ++
 indra/llui/lltextbase.h                            |   8 +-
 indra/llui/lluictrl.h                              |   1 +
 indra/newview/CMakeLists.txt                       |   2 +
 indra/newview/llfloaterpreference.cpp              | 121 +++++++++++++++-
 indra/newview/llfloaterpreference.h                |  15 ++
 indra/newview/llsearchableui.cpp                   | 154 +++++++++++++++++++++
 indra/newview/llsearchableui.h                     | 121 ++++++++++++++++
 indra/newview/llstatusbar.cpp                      |  92 +++++++++++-
 indra/newview/llstatusbar.h                        |  17 +++
 .../skins/default/xui/en/floater_preferences.xml   |  42 +++++-
 .../skins/default/xui/en/panel_status_bar.xml      |  40 ++++++
 23 files changed, 789 insertions(+), 12 deletions(-)
 create mode 100644 indra/llui/llsearchablecontrol.h
 create mode 100644 indra/newview/llsearchableui.cpp
 create mode 100644 indra/newview/llsearchableui.h

diff --git a/doc/contributions.txt b/doc/contributions.txt
index bb910aa838..66323a38c6 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -1070,6 +1070,7 @@ Nicky Dasmijn
     STORM-2010
 	STORM-2082
 	MAINT-6665
+	SL-10293
 Nicky Perian
 	OPEN-1
 	STORM-1087
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index 8054eb3619..e44f57fa9f 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -200,6 +200,7 @@ set(llui_HEADER_FILES
     llresizehandle.h
     llresmgr.h
     llrngwriter.h
+    llsearchablecontrol.h
     llsearcheditor.h 
     llscrollbar.h
     llscrollcontainer.h
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 510a2537b9..6b7a8a8b86 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -769,6 +769,10 @@ void LLButton::draw()
 		}
 	}
 
+	// Highlight if needed
+	if( ll::ui::SearchableControl::getHighlighted() )
+		label_color = ll::ui::SearchableControl::getHighlightColor();
+
 	// Unselected label assignments
 	LLWString label = getCurrentLabel();
 
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 7b4719866d..7629ed1fea 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -62,6 +62,7 @@ class LLUICtrlFactory;
 
 class LLButton
 : public LLUICtrl, public LLBadgeOwner
+, public ll::ui::SearchableControl
 {
 public:
 	struct Params 
@@ -380,6 +381,12 @@ protected:
 	LLFlashTimer *				mFlashingTimer;
 	bool                        mForceFlashing; // Stick flashing color even if button is pressed
 	bool						mHandleRightMouse;
+
+protected:
+	virtual std::string _getSearchText() const
+	{
+		return getLabelUnselected() + getToolTip();
+	}
 };
 
 // Build time optimization, generate once in .cpp file
diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h
index 71bdc32e66..07ae9c3b18 100644
--- a/indra/llui/llcheckboxctrl.h
+++ b/indra/llui/llcheckboxctrl.h
@@ -47,6 +47,7 @@ class LLViewBorder;
 
 class LLCheckBoxCtrl
 : public LLUICtrl
+, public ll::ui::SearchableControl
 {
 public:
 	struct Params 
@@ -108,6 +109,18 @@ public:
 	virtual BOOL		isDirty()	const;		// Returns TRUE if the user has modified this control.
 	virtual void		resetDirty();			// Clear dirty state
 
+protected:
+	virtual std::string _getSearchText() const
+	{
+		return getLabel() + getToolTip();
+	}
+
+	virtual void onSetHighlight() const // When highlight, really do highlight the label
+	{
+		if( mLabel )
+			mLabel->ll::ui::SearchableControl::setHighlighted( ll::ui::SearchableControl::getHighlighted() );
+	}
+
 protected:
 	// note: value is stored in toggle state of button
 	LLButton*		mButton;
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 0d42f726fa..92543b952e 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -504,6 +504,10 @@ void LLMenuItemGL::draw( void )
 		color = mDisabledColor.get();
 	}
 
+	// Highlight if needed
+	if( ll::ui::SearchableControl::getHighlighted() )
+		color = ll::ui::SearchableControl::getHighlightColor();
+
 	// Draw the text on top.
 	if (mBriefItem)
 	{
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index 69f7d21513..78f688642e 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -48,7 +48,7 @@ extern S32 MENU_BAR_WIDTH;
 // The LLMenuItemGL represents a single menu item in a menu. 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-class LLMenuItemGL : public LLUICtrl
+class LLMenuItemGL: public LLUICtrl, public ll::ui::SearchableControl
 {
 public:
 	struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
@@ -175,7 +175,12 @@ protected:
 	// This function appends the character string representation of
 	// the current accelerator key and mask to the provided string.
 	void appendAcceleratorString( std::string& st ) const;
-		
+
+	virtual std::string _getSearchText() const
+	{
+		return mLabel.getString();
+	}
+
 protected:
 	KEY mAcceleratorKey;
 	MASK mAcceleratorMask;
diff --git a/indra/llui/llsearchablecontrol.h b/indra/llui/llsearchablecontrol.h
new file mode 100644
index 0000000000..f7f1ffa0a5
--- /dev/null
+++ b/indra/llui/llsearchablecontrol.h
@@ -0,0 +1,71 @@
+/**
+* @file llsearchablecontrol.h
+*
+* $LicenseInfo:firstyear=2019&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2019, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+*/
+
+#ifndef LL_SEARCHABLE_CONTROL_H
+#define LL_SEARCHABLE_CONTROL_H
+
+#include "lluicolortable.h"
+#include "lluicolor.h"
+
+namespace ll
+{
+	namespace ui
+	{
+		class SearchableControl
+		{
+			mutable bool mIsHighlighed;
+		public:
+			SearchableControl()
+				: mIsHighlighed( false )
+			{ }
+			virtual ~SearchableControl()
+			{ }
+
+			LLColor4 getHighlightColor( ) const
+			{
+				static LLUIColor highlight_color = LLUIColorTable::instance().getColor("SearchableControlHighlightColor", LLColor4::red);
+				return highlight_color.get();
+			}
+
+			void setHighlighted( bool aVal ) const
+			{
+				mIsHighlighed = aVal;
+				onSetHighlight( );
+			}
+			bool getHighlighted( ) const
+			{ return mIsHighlighed; }
+
+			std::string getSearchText() const
+			{ return _getSearchText(); } 
+		protected:
+			virtual std::string _getSearchText() const = 0;
+			virtual void onSetHighlight( ) const
+			{ }
+		};
+	}
+}
+
+
+#endif
diff --git a/indra/llui/llsliderctrl.h b/indra/llui/llsliderctrl.h
index 67cca9ef04..2bb8668b90 100644
--- a/indra/llui/llsliderctrl.h
+++ b/indra/llui/llsliderctrl.h
@@ -35,7 +35,7 @@
 #include "lllineeditor.h"
 
 
-class LLSliderCtrl : public LLF32UICtrl
+class LLSliderCtrl: public LLF32UICtrl, public ll::ui::SearchableControl
 {
 public:
 	struct Params : public LLInitParam::Block<Params, LLF32UICtrl::Params>
@@ -131,6 +131,19 @@ public:
 	static void		onEditorGainFocus(LLFocusableElement* caller, void *userdata);
 	static void		onEditorChangeFocus(LLUICtrl* caller, S32 direction, void *userdata);
 
+protected:
+	virtual std::string _getSearchText() const
+	{
+		std::string strLabel;
+		if( mLabelBox )
+			strLabel = mLabelBox->getLabel();
+		return strLabel + getToolTip();
+	}
+	virtual void onSetHighlight() const  // When highlight, really do highlight the label
+	{
+		if( mLabelBox )
+			mLabelBox->ll::ui::SearchableControl::setHighlighted( ll::ui::SearchableControl::getHighlighted() );
+	}
 private:
 	void			updateText();
 	void			reportInvalidData();
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 1b2f09cff5..9c8636f936 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -76,7 +76,8 @@ public:
 		mButton(b),
 		mOldState(FALSE),
 		mPlaceholderText(placeholder),
-		mPadding(0)
+		mPadding(0),
+		mVisible(true)
 	{}
 
 	LLTabContainer*  mTabContainer;
@@ -85,6 +86,8 @@ public:
 	BOOL			 mOldState;
 	LLTextBox*		 mPlaceholderText;
 	S32				 mPadding;
+
+	mutable bool mVisible;
 };
 
 //----------------------------------------------------------------------------
@@ -398,7 +401,10 @@ void LLTabContainer::draw()
 				{
 					break;
 				}
-				target_pixel_scroll += (*iter)->mButton->getRect().getWidth();
+
+				if( (*iter)->mVisible )
+					target_pixel_scroll += (*iter)->mButton->getRect().getWidth();
+
 				cur_scroll_pos--;
 			}
 
@@ -467,6 +473,12 @@ void LLTabContainer::draw()
 		{
 			LLTabTuple* tuple = *iter;
 
+			if( !tuple->mVisible )
+			{
+				tuple->mButton->setVisible( false );
+				continue;
+			}
+
 			tuple->mButton->translate( left ? left - tuple->mButton->getRect().mLeft : 0,
 									   top ? top - tuple->mButton->getRect().mTop : 0 );
 			if (top) top -= BTN_HEIGHT + tabcntrv_pad;
@@ -1505,7 +1517,7 @@ BOOL LLTabContainer::setTab(S32 which)
 	}
 
 	BOOL is_visible = FALSE;
-	if (selected_tuple->mButton->getEnabled())
+	if( selected_tuple->mButton->getEnabled() && selected_tuple->mVisible )
 	{
 		setCurrentPanelIndex(which);
 
@@ -2121,3 +2133,35 @@ S32 LLTabContainer::getTotalTabWidth() const
 {
     return mTotalTabWidth;
 }
+
+void LLTabContainer::setTabVisibility( LLPanel const *aPanel, bool aVisible )
+{
+	for( tuple_list_t::const_iterator itr = mTabList.begin(); itr != mTabList.end(); ++itr )
+	{
+		LLTabTuple const *pTT = *itr;
+		if( pTT->mTabPanel == aPanel )
+		{
+			pTT->mVisible = aVisible;
+			break;
+		}
+	}
+
+	bool foundTab( false );
+	for( tuple_list_t::const_iterator itr = mTabList.begin(); itr != mTabList.end(); ++itr )
+	{
+		LLTabTuple const *pTT = *itr;
+		if( pTT->mVisible )
+		{
+			this->selectTab( itr - mTabList.begin() );
+			foundTab = true;
+			break;
+		}
+	}
+
+	if( foundTab )
+		this->setVisible( TRUE );
+	else
+		this->setVisible( FALSE );
+
+	updateMaxScrollPos();
+}
diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h
index 4a5f08f5d3..6bf963313c 100644
--- a/indra/llui/lltabcontainer.h
+++ b/indra/llui/lltabcontainer.h
@@ -216,6 +216,8 @@ public:
 	S32			getMinTabWidth() const { return mMinTabWidth; }
 	S32			getMaxTabWidth() const { return mMaxTabWidth; }
 
+	void setTabVisibility( LLPanel const *aPanel, bool );
+
 	void		startDragAndDropDelayTimer() { mDragAndDropDelayTimer.start(); }
 	
 	void onTabBtn( const LLSD& data, LLPanel* panel );
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index c570285856..a23741b6dd 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1222,6 +1222,17 @@ void LLTextBase::draw()
 		gl_rect_2d(text_rect, bg_color % alpha, TRUE);
 	}
 
+	// Draw highlighted if needed
+	if( ll::ui::SearchableControl::getHighlighted() )
+	{
+		LLColor4 bg_color = ll::ui::SearchableControl::getHighlightColor();
+		LLRect bg_rect = mVisibleTextRect;
+		if( mScroller )
+			bg_rect.intersectWith( text_rect );
+
+		gl_rect_2d( text_rect, bg_color, TRUE );
+	}
+	
 	bool should_clip = mClip || mScroller != NULL;
 	{ LLLocalClipRect clip(text_rect, should_clip);
  
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 5fdde445ef..9831c35858 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -275,7 +275,8 @@ typedef LLPointer<LLTextSegment> LLTextSegmentPtr;
 class LLTextBase 
 :	public LLUICtrl,
 	protected LLEditMenuHandler,
-	public LLSpellCheckMenuHandler
+	public LLSpellCheckMenuHandler,
+	public ll::ui::SearchableControl
 {
 public:
 	friend class LLTextSegment;
@@ -617,6 +618,11 @@ protected:
 	void							appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, bool underline_on_hover_only = false);
 	S32 normalizeUri(std::string& uri);
 	
+protected:
+	virtual std::string _getSearchText() const
+	{
+		return mLabel.getString() + getToolTip();
+	}
 
 protected:
 	// text segmentation and flow
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index 550bee5c70..63baed6793 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -37,6 +37,7 @@
 #include "llinitparam.h"
 #include "llview.h"
 #include "llviewmodel.h"		// *TODO move dependency to .cpp file
+#include "llsearchablecontrol.h"
 
 const BOOL TAKE_FOCUS_YES = TRUE;
 const BOOL TAKE_FOCUS_NO  = FALSE;
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 33886acb71..a8019ee168 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -532,6 +532,7 @@ set(viewer_SOURCE_FILES
     llscrollingpanelparam.cpp
     llscrollingpanelparambase.cpp
     llsculptidsize.cpp
+    llsearchableui.cpp
     llsearchcombobox.cpp
     llsearchhistory.cpp
     llsecapi.cpp
@@ -1148,6 +1149,7 @@ set(viewer_HEADER_FILES
     llscrollingpanelparam.h
     llscrollingpanelparambase.h
     llsculptidsize.h
+    llsearchableui.h
     llsearchcombobox.h
     llsearchhistory.h
     llsecapi.h
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index ac751a785d..c3dea73c05 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -117,6 +117,8 @@
 #include "llfeaturemanager.h"
 #include "llviewertexturelist.h"
 
+#include "llsearchableui.h"
+
 const F32 BANDWIDTH_UPDATER_TIMEOUT = 0.5f;
 char const* const VISIBILITY_DEFAULT = "default";
 char const* const VISIBILITY_HIDDEN = "hidden";
@@ -393,6 +395,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
 
 	mCommitCallbackRegistrar.add("Pref.ClearLog",				boost::bind(&LLConversationLog::onClearLog, &LLConversationLog::instance()));
 	mCommitCallbackRegistrar.add("Pref.DeleteTranscripts",      boost::bind(&LLFloaterPreference::onDeleteTranscripts, this));
+	mCommitCallbackRegistrar.add("UpdateFilter", boost::bind(&LLFloaterPreference::onUpdateFilterTerm, this, false)); // <FS:ND/> Hook up for filtering
 }
 
 void LLFloaterPreference::processProperties( void* pData, EAvatarProcessorType type )
@@ -506,7 +509,10 @@ BOOL LLFloaterPreference::postBuild()
 	LLSliderCtrl* fov_slider = getChild<LLSliderCtrl>("camera_fov");
 	fov_slider->setMinValue(LLViewerCamera::getInstance()->getMinView());
 	fov_slider->setMaxValue(LLViewerCamera::getInstance()->getMaxView());
-
+	
+	// Hook up and init for filtering
+	mFilterEdit = getChild<LLSearchEditor>("search_prefs_edit");
+	mFilterEdit->setKeystrokeCallback(boost::bind(&LLFloaterPreference::onUpdateFilterTerm, this, false));
 
 	return TRUE;
 }
@@ -786,6 +792,13 @@ void LLFloaterPreference::onOpen(const LLSD& key)
 	save_btn->setEnabled(started);
 	delete_btn->setEnabled(started);
 	exceptions_btn->setEnabled(started);
+
+	collectSearchableItems();
+	if (!mFilterEdit->getText().empty())
+	{
+		mFilterEdit->setText(LLStringExplicit(""));
+		onUpdateFilterTerm(true);
+	}
 }
 
 void LLFloaterPreference::onVertexShaderEnable()
@@ -2985,3 +2998,109 @@ void LLFloaterPreferenceProxy::onChangeSocksSettings()
 
 }
 
+void LLFloaterPreference::onUpdateFilterTerm(bool force)
+{
+	LLWString seachValue = utf8str_to_wstring( mFilterEdit->getValue() );
+	LLWStringUtil::toLower( seachValue );
+
+	if( !mSearchData || (mSearchData->mLastFilter == seachValue && !force))
+		return;
+
+	mSearchData->mLastFilter = seachValue;
+
+	if( !mSearchData->mRootTab )
+		return;
+
+	mSearchData->mRootTab->hightlightAndHide( seachValue );
+	LLTabContainer *pRoot = getChild< LLTabContainer >( "pref core" );
+	if( pRoot )
+		pRoot->selectFirstTab();
+}
+
+void collectChildren( LLView const *aView, ll::prefs::PanelDataPtr aParentPanel, ll::prefs::TabContainerDataPtr aParentTabContainer )
+{
+	if( !aView )
+		return;
+
+	llassert_always( aParentPanel || aParentTabContainer );
+
+	LLView::child_list_const_iter_t itr = aView->beginChild();
+	LLView::child_list_const_iter_t itrEnd = aView->endChild();
+
+	while( itr != itrEnd )
+	{
+		LLView *pView = *itr;
+		ll::prefs::PanelDataPtr pCurPanelData = aParentPanel;
+		ll::prefs::TabContainerDataPtr pCurTabContainer = aParentTabContainer;
+		if( !pView )
+			continue;
+		LLPanel const *pPanel = dynamic_cast< LLPanel const *>( pView );
+		LLTabContainer const *pTabContainer = dynamic_cast< LLTabContainer const *>( pView );
+		ll::ui::SearchableControl const *pSCtrl = dynamic_cast< ll::ui::SearchableControl const *>( pView );
+
+		if( pTabContainer )
+		{
+			pCurPanelData.reset();
+
+			pCurTabContainer = ll::prefs::TabContainerDataPtr( new ll::prefs::TabContainerData );
+			pCurTabContainer->mTabContainer = const_cast< LLTabContainer *>( pTabContainer );
+			pCurTabContainer->mLabel = pTabContainer->getLabel();
+			pCurTabContainer->mPanel = 0;
+
+			if( aParentPanel )
+				aParentPanel->mChildPanel.push_back( pCurTabContainer );
+			if( aParentTabContainer )
+				aParentTabContainer->mChildPanel.push_back( pCurTabContainer );
+		}
+		else if( pPanel )
+		{
+			pCurTabContainer.reset();
+
+			pCurPanelData = ll::prefs::PanelDataPtr( new ll::prefs::PanelData );
+			pCurPanelData->mPanel = pPanel;
+			pCurPanelData->mLabel = pPanel->getLabel();
+
+			llassert_always( aParentPanel || aParentTabContainer );
+
+			if( aParentTabContainer )
+				aParentTabContainer->mChildPanel.push_back( pCurPanelData );
+			else if( aParentPanel )
+				aParentPanel->mChildPanel.push_back( pCurPanelData );
+		}
+		else if( pSCtrl && pSCtrl->getSearchText().size() )
+		{
+			ll::prefs::SearchableItemPtr item = ll::prefs::SearchableItemPtr( new ll::prefs::SearchableItem() );
+			item->mView = pView;
+			item->mCtrl = pSCtrl;
+
+			item->mLabel = utf8str_to_wstring( pSCtrl->getSearchText() );
+			LLWStringUtil::toLower( item->mLabel );
+
+			llassert_always( aParentPanel || aParentTabContainer );
+
+			if( aParentPanel )
+				aParentPanel->mChildren.push_back( item );
+			if( aParentTabContainer )
+				aParentTabContainer->mChildren.push_back( item );
+		}
+		collectChildren( pView, pCurPanelData, pCurTabContainer );
+		++itr;
+	}
+}
+
+void LLFloaterPreference::collectSearchableItems()
+{
+	mSearchData.reset( nullptr );
+	LLTabContainer *pRoot = getChild< LLTabContainer >( "pref core" );
+	if( mFilterEdit && pRoot )
+	{
+		mSearchData.reset(new ll::prefs::SearchData() );
+
+		ll::prefs::TabContainerDataPtr pRootTabcontainer = ll::prefs::TabContainerDataPtr( new ll::prefs::TabContainerData );
+		pRootTabcontainer->mTabContainer = pRoot;
+		pRootTabcontainer->mLabel = pRoot->getLabel();
+		mSearchData->mRootTab = pRootTabcontainer;
+
+		collectChildren( this, ll::prefs::PanelDataPtr(), pRootTabcontainer );
+	}
+}
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 4e51137df5..d609c42ebe 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -36,6 +36,7 @@
 #include "llfloater.h"
 #include "llavatarpropertiesprocessor.h"
 #include "llconversationlog.h"
+#include "llsearcheditor.h"
 
 class LLConversationLogObserver;
 class LLPanelPreference;
@@ -47,6 +48,14 @@ class LLSliderCtrl;
 class LLSD;
 class LLTextBox;
 
+namespace ll
+{
+	namespace prefs
+	{
+		struct SearchData;
+	}
+}
+
 typedef std::map<std::string, std::string> notifications_map;
 
 typedef enum
@@ -205,6 +214,12 @@ private:
 	LLAvatarData mAvatarProperties;
 	std::string mSavedGraphicsPreset;
 	LOG_CLASS(LLFloaterPreference);
+
+	LLSearchEditor *mFilterEdit;
+	std::unique_ptr< ll::prefs::SearchData > mSearchData;
+
+	void onUpdateFilterTerm( bool force = false );
+	void collectSearchableItems();
 };
 
 class LLPanelPreference : public LLPanel
diff --git a/indra/newview/llsearchableui.cpp b/indra/newview/llsearchableui.cpp
new file mode 100644
index 0000000000..6058079ae4
--- /dev/null
+++ b/indra/newview/llsearchableui.cpp
@@ -0,0 +1,154 @@
+/**
+* @file llsearchableui.cpp
+*
+* $LicenseInfo:firstyear=2019&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2019, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+#include "llsearchableui.h"
+
+#include "llview.h"
+#include "lltabcontainer.h"
+#include "llmenugl.h"
+
+ll::prefs::SearchableItem::~SearchableItem()
+{}
+
+void ll::prefs::SearchableItem::setNotHighlighted()
+{
+	mCtrl->setHighlighted( false );
+}
+
+bool ll::prefs::SearchableItem::hightlightAndHide( LLWString const &aFilter )
+{
+	if( mCtrl->getHighlighted() )
+		return true;
+
+	LLView const *pView = dynamic_cast< LLView const* >( mCtrl );
+	if( pView && !pView->getVisible() )
+		return false;
+
+	if( aFilter.empty() )
+	{
+		mCtrl->setHighlighted( false );
+		return true;
+	}
+
+	if( mLabel.find( aFilter ) != LLWString::npos )
+	{
+		mCtrl->setHighlighted( true );
+		return true;
+	}
+
+	return false;
+}
+
+ll::prefs::PanelData::~PanelData()
+{}
+
+bool ll::prefs::PanelData::hightlightAndHide( LLWString const &aFilter )
+{
+	for( tSearchableItemList::iterator itr = mChildren.begin(); itr  != mChildren.end(); ++itr )
+		(*itr)->setNotHighlighted( );
+
+	bool bVisible(false);
+	for( tSearchableItemList::iterator itr = mChildren.begin(); itr  != mChildren.end(); ++itr )
+		bVisible |= (*itr)->hightlightAndHide( aFilter );
+
+	for( tPanelDataList::iterator itr = mChildPanel.begin(); itr  != mChildPanel.end(); ++itr )
+		bVisible |= (*itr)->hightlightAndHide( aFilter );
+
+	return bVisible;
+}
+
+bool ll::prefs::TabContainerData::hightlightAndHide( LLWString const &aFilter )
+{
+	for( tSearchableItemList::iterator itr = mChildren.begin(); itr  != mChildren.end(); ++itr )
+		(*itr)->setNotHighlighted( );
+
+	bool bVisible(false);
+	for( tSearchableItemList::iterator itr = mChildren.begin(); itr  != mChildren.end(); ++itr )
+		bVisible |= (*itr)->hightlightAndHide( aFilter );
+
+	for( tPanelDataList::iterator itr = mChildPanel.begin(); itr  != mChildPanel.end(); ++itr )
+	{
+		bool bPanelVisible = (*itr)->hightlightAndHide( aFilter );
+		if( (*itr)->mPanel )
+			mTabContainer->setTabVisibility( (*itr)->mPanel, bPanelVisible );
+		bVisible |= bPanelVisible;
+	}
+
+	return bVisible;
+}
+
+ll::statusbar::SearchableItem::SearchableItem()
+	: mMenu(0)
+	, mCtrl(0)
+	, mWasHiddenBySearch( false )
+{ }
+
+void ll::statusbar::SearchableItem::setNotHighlighted( )
+{
+	for( tSearchableItemList::iterator itr = mChildren.begin(); itr  != mChildren.end(); ++itr )
+		(*itr)->setNotHighlighted( );
+
+	if( mCtrl )
+	{
+		mCtrl->setHighlighted( false );
+
+		if( mWasHiddenBySearch )
+			mMenu->setVisible( TRUE );
+	}
+}
+
+bool ll::statusbar::SearchableItem::hightlightAndHide( LLWString const &aFilter )
+{
+	if( mMenu && !mMenu->getVisible() && !mWasHiddenBySearch )
+		return false;
+
+	setNotHighlighted( );
+
+	bool bVisible(false);
+	for( tSearchableItemList::iterator itr = mChildren.begin(); itr  != mChildren.end(); ++itr )
+		bVisible |= (*itr)->hightlightAndHide( aFilter );
+
+	if( aFilter.empty() )
+	{
+		if( mCtrl )
+			mCtrl->setHighlighted( false );
+		return true;
+	}
+
+	if( mLabel.find( aFilter ) != LLWString::npos )
+	{
+		if( mCtrl )
+			mCtrl->setHighlighted( true );
+		return true;
+	}
+
+	if( mCtrl && !bVisible )
+	{
+		mWasHiddenBySearch = true;
+		mMenu->setVisible(FALSE);
+	}
+	return bVisible;
+}
diff --git a/indra/newview/llsearchableui.h b/indra/newview/llsearchableui.h
new file mode 100644
index 0000000000..42b2866fb6
--- /dev/null
+++ b/indra/newview/llsearchableui.h
@@ -0,0 +1,121 @@
+/**
+* @file llsearchableui.h
+*
+* $LicenseInfo:firstyear=2019&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2019, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+*/
+
+#ifndef LL_SEARCHABLE_UI_H
+#define LL_SEARCHABLE_UI_H
+
+class LLMenuItemGL;
+class LLView;
+class LLPanel;
+class LLTabContainer;
+
+#include "llsearchablecontrol.h"
+
+namespace ll
+{
+	namespace prefs
+	{
+		struct SearchableItem;
+		struct PanelData;
+		struct TabContainerData;
+
+		typedef boost::shared_ptr< SearchableItem > SearchableItemPtr;
+		typedef boost::shared_ptr< PanelData > PanelDataPtr;
+		typedef boost::shared_ptr< TabContainerData > TabContainerDataPtr;
+
+		typedef std::vector< TabContainerData > tTabContainerDataList;
+		typedef std::vector< SearchableItemPtr > tSearchableItemList;
+		typedef std::vector< PanelDataPtr > tPanelDataList;
+
+		struct SearchableItem
+		{
+			LLWString mLabel;
+			LLView const *mView;
+			ll::ui::SearchableControl const *mCtrl;
+
+			std::vector< boost::shared_ptr< SearchableItem >  > mChildren;
+
+			virtual ~SearchableItem();
+
+			void setNotHighlighted();
+			virtual bool hightlightAndHide( LLWString const &aFilter );
+		};
+
+		struct PanelData
+		{
+			LLPanel const *mPanel;
+			std::string mLabel;
+
+			std::vector< boost::shared_ptr< SearchableItem > > mChildren;
+			std::vector< boost::shared_ptr< PanelData > > mChildPanel;
+
+			virtual ~PanelData();
+
+			virtual bool hightlightAndHide( LLWString const &aFilter );
+		};
+
+		struct TabContainerData: public PanelData
+		{
+			LLTabContainer *mTabContainer;
+			virtual bool hightlightAndHide( LLWString const &aFilter );
+		};
+
+		struct SearchData
+		{
+			TabContainerDataPtr mRootTab;
+			LLWString mLastFilter;
+		};
+	}
+	namespace statusbar
+	{
+		struct SearchableItem;
+
+		typedef boost::shared_ptr< SearchableItem > SearchableItemPtr;
+
+		typedef std::vector< SearchableItemPtr > tSearchableItemList;
+
+		struct SearchableItem
+		{
+			LLWString mLabel;
+			LLMenuItemGL *mMenu;
+			tSearchableItemList mChildren;
+			ll::ui::SearchableControl const *mCtrl;
+			bool mWasHiddenBySearch;
+
+			SearchableItem();
+
+			void setNotHighlighted( );
+			bool hightlightAndHide( LLWString const &aFilter );
+		};
+
+		struct SearchData
+		{
+			SearchableItemPtr mRootMenu;
+			LLWString mLastFilter;
+		};
+	}
+}
+
+#endif
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 43c0fbd53a..b893e4a058 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -81,6 +81,8 @@
 #include "llparcel.h"
 #include "llstring.h"
 #include "message.h"
+#include "llsearchableui.h"
+#include "llsearcheditor.h"
 
 // system includes
 #include <iomanip>
@@ -113,7 +115,9 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
 	mBalance(0),
 	mHealth(100),
 	mSquareMetersCredit(0),
-	mSquareMetersCommitted(0)
+	mSquareMetersCommitted(0),
+	mFilterEdit(NULL),			// Edit for filtering
+	mSearchPanel(NULL)			// Panel for filtering
 {
 	setRect(rect);
 	
@@ -239,6 +243,16 @@ BOOL LLStatusBar::postBuild()
 	mPanelNearByMedia->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT);
 	mPanelNearByMedia->setVisible(FALSE);
 
+	// Hook up and init for filtering
+	mFilterEdit = getChild<LLSearchEditor>( "search_menu_edit" );
+	mSearchPanel = getChild<LLPanel>( "menu_search_panel" );
+
+	//mSearchPanel->setVisible(gSavedSettings.getBOOL("MenuSearch"));
+	mFilterEdit->setKeystrokeCallback(boost::bind(&LLStatusBar::onUpdateFilterTerm, this));
+	mFilterEdit->setCommitCallback(boost::bind(&LLStatusBar::onUpdateFilterTerm, this));
+	collectSearchableItems();
+	//gSavedSettings.getControl("MenuSearch")->getCommitSignal()->connect(boost::bind(&LLStatusBar::updateMenuSearchVisibility, this, _2));
+
 	return TRUE;
 }
 
@@ -318,6 +332,7 @@ void LLStatusBar::setVisibleForMouselook(bool visible)
 	mMediaToggle->setVisible(visible);
 	mSGBandwidth->setVisible(visible);
 	mSGPacketLoss->setVisible(visible);
+	mSearchPanel->setVisible(visible && gSavedSettings.getBOOL("MenuSearch"));
 	setBackgroundVisible(visible);
 	mIconPresets->setVisible(visible);
 }
@@ -358,6 +373,12 @@ void LLStatusBar::setBalance(S32 balance)
 		balance_bg_view->setShape(balance_bg_rect);
 	}
 
+	// If the search panel is shown, move this according to the new balance width. Parcel text will reshape itself in setParcelInfoText
+	if (mSearchPanel && mSearchPanel->getVisible())
+	{
+		updateMenuSearchPosition();
+	}
+
 	if (mBalance && (fabs((F32)(mBalance - balance)) > gSavedSettings.getF32("UISndMoneyChangeThreshold")))
 	{
 		if (mBalance > balance)
@@ -570,6 +591,75 @@ void LLStatusBar::onVolumeChanged(const LLSD& newvalue)
 	refresh();
 }
 
+void LLStatusBar::onUpdateFilterTerm()
+{
+	LLWString searchValue = utf8str_to_wstring( mFilterEdit->getValue() );
+	LLWStringUtil::toLower( searchValue );
+
+	if( !mSearchData || mSearchData->mLastFilter == searchValue )
+		return;
+
+	mSearchData->mLastFilter = searchValue;
+
+	mSearchData->mRootMenu->hightlightAndHide( searchValue );
+	gMenuBarView->needsArrange();
+}
+
+void collectChildren( LLMenuGL *aMenu, ll::statusbar::SearchableItemPtr aParentMenu )
+{
+	for( U32 i = 0; i < aMenu->getItemCount(); ++i )
+	{
+		LLMenuItemGL *pMenu = aMenu->getItem( i );
+
+		ll::statusbar::SearchableItemPtr pItem( new ll::statusbar::SearchableItem );
+		pItem->mCtrl = pMenu;
+		pItem->mMenu = pMenu;
+		pItem->mLabel = utf8str_to_wstring( pMenu->ll::ui::SearchableControl::getSearchText() );
+		LLWStringUtil::toLower( pItem->mLabel );
+		aParentMenu->mChildren.push_back( pItem );
+
+		LLMenuItemBranchGL *pBranch = dynamic_cast< LLMenuItemBranchGL* >( pMenu );
+		if( pBranch )
+			collectChildren( pBranch->getBranch(), pItem );
+	}
+
+}
+
+void LLStatusBar::collectSearchableItems()
+{
+	mSearchData.reset( new ll::statusbar::SearchData );
+	ll::statusbar::SearchableItemPtr pItem( new ll::statusbar::SearchableItem );
+	mSearchData->mRootMenu = pItem;
+	collectChildren( gMenuBarView, pItem );
+}
+
+void LLStatusBar::updateMenuSearchVisibility(const LLSD& data)
+{
+	bool visible = data.asBoolean();
+	mSearchPanel->setVisible(visible);
+	if (!visible)
+	{
+		mFilterEdit->setText(LLStringUtil::null);
+		onUpdateFilterTerm();
+	}
+	else
+	{
+		updateMenuSearchPosition();
+	}
+}
+
+void LLStatusBar::updateMenuSearchPosition()
+{
+	const S32 HPAD = 12;
+	LLRect balanceRect = getChildView("balance_bg")->getRect();
+	LLRect searchRect = mSearchPanel->getRect();
+	S32 w = searchRect.getWidth();
+	searchRect.mLeft = balanceRect.mLeft - w - HPAD;
+	searchRect.mRight = searchRect.mLeft + w;
+	mSearchPanel->setShape( searchRect );
+}
+
+
 // Implements secondlife:///app/balance/request to request a L$ balance
 // update via UDP message system. JC
 class LLBalanceHandler : public LLCommandHandler
diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h
index a3326e752a..403d590aca 100644
--- a/indra/newview/llstatusbar.h
+++ b/indra/newview/llstatusbar.h
@@ -45,7 +45,15 @@ class LLPanelPresetsPulldown;
 class LLPanelVolumePulldown;
 class LLPanelNearByMedia;
 class LLIconCtrl;
+class LLSearchEditor;
 
+namespace ll
+{
+	namespace statusbar
+	{
+		struct SearchData;
+	}
+}
 class LLStatusBar
 :	public LLPanel
 {
@@ -99,6 +107,15 @@ private:
 	static void onClickMediaToggle(void* data);
 	static void onClickBalance(void* data);
 
+	LLSearchEditor *mFilterEdit;
+	LLPanel *mSearchPanel;
+	void onUpdateFilterTerm();
+
+	std::unique_ptr< ll::statusbar::SearchData > mSearchData;
+	void collectSearchableItems();
+	void updateMenuSearchVisibility( const LLSD& data );
+	void updateMenuSearchPosition();
+
 private:
 	LLTextBox	*mTextTime;
 
diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index 845c1efe4d..0e62d50072 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences.xml
@@ -3,7 +3,7 @@
  legacy_header_height="18"
  positioning="centered"
  default_tab_group="1"
- height="512"
+ height="530"
  layout="topleft"
  name="Preferences"
  help_topic="preferences"
@@ -25,7 +25,7 @@ https://accounts.secondlife.com/change_email/
      layout="topleft"
      right="-105"
      name="OK"
-     top="473"
+     top="492"
      width="90">
         <button.commit_callback
          function="Pref.OK" />
@@ -43,6 +43,42 @@ https://accounts.secondlife.com/change_email/
         <button.commit_callback
          function="Pref.Cancel" />
     </button>
+
+    <panel
+     name="search_panel"
+     layout="topleft"
+     follows="left|top|right"
+     left="4"
+     right="-4"
+     top="21"
+     height="18"
+     tab_group="2">
+        <search_editor
+         clear_button_visible="true"
+         follows="left|top|right"
+         height="18"
+         label="Search Settings"
+         layout="topleft"
+         left="0"
+         max_length_bytes="255"
+         name="search_prefs_edit"
+         right="-1"
+         text_pad_left="6"
+         tool_tip="Type the search term you are interested in here. Results will be displayed for partial fulltext matches within the setting's name or comment."
+         top="0">
+         <search_editor.commit_callback
+          function="UpdateFilter" />
+         <search_editor.clear_button
+          rect.height="18"
+          rect.width="18"
+          rect.bottom="-1" />
+         <search_editor.search_button
+          rect.height="12"
+          rect.width="12"
+          rect.bottom="-1" />
+        </search_editor>
+    </panel>
+
     <tab_container
      follows="all"
      halign="left"
@@ -54,7 +90,7 @@ https://accounts.secondlife.com/change_email/
      tab_position="left"
      tab_width="140"
      tab_padding_right="0"
-     top="21"
+     top="40"
      width="658">
         <panel
 	 class="panel_preference"
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 998f1ce599..52bcce01f7 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -33,6 +33,46 @@
      name="buycurrencylabel">
         L$ [AMT]
     </panel.string>
+  <panel
+	 height="18"
+	 left="-458"
+	 top="0"
+	 width="120"
+	 follows="right|top"
+	 name="menu_search_panel"
+	 background_opaque="true"
+	 background_visible="true"
+	 bg_opaque_color="MouseGray">
+		<search_editor
+		 clear_button_visible="true"
+		 follows="left|top"
+		 height="18"
+		 label="Search Menus"
+		 layout="topleft"
+		 left="0"
+		 max_length_bytes="255"
+		 name="search_menu_edit"
+		 right="-1"
+		 text_pad_left="6"
+		 tool_tip="Type the search term you are interested in here. Results will be displayed for partial fulltext matches within the menu."
+		 top="0">
+			<search_button 
+			 top_pad="4"
+			 left_pad="4" 
+			 width="12"
+			 height="12" 
+			 image_unselected="Search"
+			 image_selected="Search"/>
+			<clear_button
+			 bottom="2"
+			 height="12"
+			 image_unselected="Icon_Close_Foreground"
+			 image_selected="Icon_Close_Press"
+			 pad_right="4"
+			 pad_left="4"
+			 width="12"/>
+		</search_editor>
+  </panel>
   <panel
     height="18"
     left="-416"
-- 
cgit v1.2.3


From 2461a7fe396fe95a043ed1cfc3b0c251d242a2c3 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Tue, 8 Jan 2019 14:15:44 +0200
Subject: SL-10320 FIXED Crash in LLVOAvatar::updateAttachmentOverrides()

---
 indra/newview/llvoavatar.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 321f774210..2682c5b698 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -5992,7 +5992,7 @@ void LLVOAvatar::rebuildAttachmentOverrides()
                 LLViewerObject *vo = *at_it;
                 // Attached animated objects affect joints in their control
                 // avs, not the avs to which they are attached.
-                if (!vo->isAnimatedObject())
+                if (vo && !vo->isAnimatedObject())
                 {
                     addAttachmentOverridesForObject(vo);
                 }
@@ -6043,7 +6043,7 @@ void LLVOAvatar::updateAttachmentOverrides()
                 LLViewerObject *vo = *at_it;
                 // Attached animated objects affect joints in their control
                 // avs, not the avs to which they are attached.
-                if (!vo->isAnimatedObject())
+                if (vo && !vo->isAnimatedObject())
                 {
                     addAttachmentOverridesForObject(vo, &meshes_seen);
                 }
-- 
cgit v1.2.3


From 4316f1d322bc8e0439780d68442d76b17927247c Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Tue, 8 Jan 2019 21:28:47 +0000
Subject: SL-10285 - removed one possible route for the isImpostor() crash.
 Intermittent issue.

---
 indra/newview/llcontrolavatar.cpp | 2 ++
 indra/newview/llviewerobject.cpp  | 1 +
 2 files changed, 3 insertions(+)

diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp
index d3fd5813a0..0f02c23cb0 100644
--- a/indra/newview/llcontrolavatar.cpp
+++ b/indra/newview/llcontrolavatar.cpp
@@ -60,6 +60,8 @@ LLControlAvatar::LLControlAvatar(const LLUUID& id, const LLPCode pcode, LLViewer
 // virtual
 LLControlAvatar::~LLControlAvatar()
 {
+	// Should already have been unlinked before destruction
+	llassert(!mRootVolp);
 }
 
 // virtual
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 007adf2a72..ec1095813b 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -3100,6 +3100,7 @@ void LLViewerObject::unlinkControlAvatar()
         if (mControlAvatar)
         {
             mControlAvatar->markForDeath();
+			mControlAvatar->mRootVolp = NULL;
             mControlAvatar = NULL;
         }
     }
-- 
cgit v1.2.3


From cd859cd9e8a032d2d708788893654e5ceaadac09 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Wed, 9 Jan 2019 10:57:15 +0200
Subject: SL-10321 FIXED 'Uploads' tab is not displayed after any search in
 Preferences

---
 indra/newview/llsearchableui.cpp | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/indra/newview/llsearchableui.cpp b/indra/newview/llsearchableui.cpp
index 6058079ae4..de90896548 100644
--- a/indra/newview/llsearchableui.cpp
+++ b/indra/newview/llsearchableui.cpp
@@ -70,6 +70,11 @@ bool ll::prefs::PanelData::hightlightAndHide( LLWString const &aFilter )
 	for( tSearchableItemList::iterator itr = mChildren.begin(); itr  != mChildren.end(); ++itr )
 		(*itr)->setNotHighlighted( );
 
+	if (aFilter.empty())
+	{
+		return true;
+	}
+
 	bool bVisible(false);
 	for( tSearchableItemList::iterator itr = mChildren.begin(); itr  != mChildren.end(); ++itr )
 		bVisible |= (*itr)->hightlightAndHide( aFilter );
-- 
cgit v1.2.3


From 1349eacc5cddb8d8522b4250cd3e7e54de55de2d Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Wed, 9 Jan 2019 17:21:13 +0200
Subject: SL-10325 FIXED Preferences tabs are displayed incorrectly if hovering
 it while searching any keyword

---
 indra/llui/lltabcontainer.cpp | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 9c8636f936..6521b883f8 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -736,11 +736,11 @@ BOOL LLTabContainer::handleToolTip( S32 x, S32 y, MASK mask)
 		{
 			for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)
 			{
-				LLTabTuple* tuple = *iter;
-				tuple->mButton->setVisible( TRUE );
-				S32 local_x = x - tuple->mButton->getRect().mLeft;
-				S32 local_y = y - tuple->mButton->getRect().mBottom;
-				handled = tuple->mButton->handleToolTip( local_x, local_y, mask);
+				LLButton* tab_button = (*iter)->mButton;
+				if (!tab_button->getVisible()) continue;
+				S32 local_x = x - tab_button->getRect().mLeft;
+				S32 local_y = y - tab_button->getRect().mBottom;
+				handled = tab_button->handleToolTip(local_x, local_y, mask);
 				if( handled )
 				{
 					break;
-- 
cgit v1.2.3


From fdf39d3cf4ece8e587dcc865b1c6d5ab12e66948 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Thu, 10 Jan 2019 15:41:48 +0200
Subject: SL-10329 Increase panel height to avoid message overlapping

---
 indra/newview/skins/default/xui/en/floater_model_preview.xml | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
index e073268b0a..a07fe99aef 100644
--- a/indra/newview/skins/default/xui/en/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -34,7 +34,6 @@
   <string name="mesh_status_invalid_material_list">LOD materials are not a subset of reference model.</string>
   <string name="phys_status_vertex_limit_exceeded">Some physical hulls exceed vertex limitations.</string>
   <string name="phys_status_degenerate_triangles">The physics mesh too dense remove the small thin triangles (see preview)</string>
-  <string name="phys_status_no_havok">The Firestorm OpenSim build is not supported for physics upload in SL.</string>
   <string name="layer_all">All</string> <!-- Text to display in physics layer combo box for "all layers" -->
   <string name="decomposing">Analyzing...</string>
   <string name="simplifying">Simplifying...</string>
@@ -1223,7 +1222,7 @@
     <panel
      follows="top|left|bottom"
      layout="topleft"
-     height="184"
+     height="197"
      left="4"
      border="true"
      name="weights_and_warning_panel"
@@ -1412,7 +1411,7 @@ Lowest:
         border="true"
         layout="topleft"
         left_pad="265"
-        name="price_breakdown_panel"
+        name="physics_costs_panel"
         width="120"
         height="100">
         <text
@@ -1480,7 +1479,7 @@ Analysed:
          visible="false">
          You dont have rights to upload mesh models. [[VURL] Find out how] to get certified.
        </text>
-       <text text_color="Yellow" layout="topleft" top_delta="5" left="6" name="status">
+       <text text_color="Yellow" layout="topleft" top_pad="-1" left="6" name="status">
 [STATUS]
        </text>
     </panel>
-- 
cgit v1.2.3


From 02aa64e195c25087e9cf7c7f32a851d8b84d2798 Mon Sep 17 00:00:00 2001
From: eli <eli@lindenlab.com>
Date: Thu, 10 Jan 2019 16:46:49 -0800
Subject: FIX INTL-324 Viewer Set55 translation (viewer-neko)

---
 .../newview/skins/default/xui/de/notifications.xml | 36 ++++++++++++----------
 indra/newview/skins/default/xui/de/strings.xml     | 21 +++++++++++++
 .../newview/skins/default/xui/es/notifications.xml | 35 ++++++++++++---------
 indra/newview/skins/default/xui/es/strings.xml     | 21 +++++++++++++
 .../newview/skins/default/xui/fr/notifications.xml | 36 ++++++++++++----------
 indra/newview/skins/default/xui/fr/strings.xml     | 21 +++++++++++++
 .../newview/skins/default/xui/it/notifications.xml | 34 +++++++++++---------
 indra/newview/skins/default/xui/it/strings.xml     | 21 +++++++++++++
 .../newview/skins/default/xui/ja/notifications.xml | 34 +++++++++++---------
 indra/newview/skins/default/xui/ja/strings.xml     | 21 +++++++++++++
 .../newview/skins/default/xui/pt/notifications.xml | 36 ++++++++++++----------
 indra/newview/skins/default/xui/pt/strings.xml     | 21 +++++++++++++
 .../newview/skins/default/xui/ru/notifications.xml | 36 ++++++++++++----------
 indra/newview/skins/default/xui/ru/strings.xml     | 21 +++++++++++++
 .../newview/skins/default/xui/tr/notifications.xml | 36 ++++++++++++----------
 indra/newview/skins/default/xui/tr/strings.xml     | 21 +++++++++++++
 .../newview/skins/default/xui/zh/notifications.xml | 32 ++++++++++---------
 indra/newview/skins/default/xui/zh/strings.xml     | 21 +++++++++++++
 18 files changed, 366 insertions(+), 138 deletions(-)

diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index 43af1d8655..57dbaa0ea6 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -244,6 +244,10 @@ Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
 		Hinweis: Bei Aktivierung dieser Option sehen alle Personen, die diesen Computer benutzen, Ihre Lieblingsorte.
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
+	<notification name="AllowMultipleViewers">
+		Das Starten mehrerer Second Life Viewer wird nicht unterstützt. Dies kann zu Kollisionen des Textur-Caches, Fehlern sowie verschlechterter Grafik und Leistung führen.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
 	<notification name="GrantModifyRights">
 		Wenn Sie einem anderen Einwohner Änderungsrechte gewähren, dann kann dieser JEDES Objekt, das Sie inworld besitzen, ändern, löschen oder an sich nehmen. Seien Sie daher beim Gewähren dieser Rechte sehr vorsichtig!
 Möchten Sie [NAME] Änderungsrechte gewähren?
@@ -725,9 +729,9 @@ Sie können die Grafikqualität unter Einstellungen &gt; Grafik wieder erhöhen.
 		Sie sind nicht zum Terraformen der Parzelle „[PARCEL]“ berechtigt.
 	</notification>
 	<notification name="CannotCopyWarning">
-		Sie sind nicht berechtigt, die folgenden Objekte zu kopieren:
-[ITEMS]
-Wenn Sie diese weitergeben, werden sie aus Ihrem Inventar entfernt. Möchten Sie diese Objekte wirklich weggeben?
+		Sie sind nicht berechtigt, die folgenden Objekte zu kopieren: 
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+und die Objekte werden aus Ihrem Inventar gelöscht, wenn Sie diese weggeben. Möchten Sie diese Objekte wirklich weggeben?
 		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
 	</notification>
 	<notification name="CannotGiveItem">
@@ -3730,13 +3734,13 @@ es sich nicht in der gleichen Region befindet wie Sie.
 		Auf Land, das Sie nicht besitzen, können Sie keine Bäume und Gräser erstellen.
 	</notification>
 	<notification name="NoCopyPermsNoObject">
-		Kopieren fehlgeschlagen, da Sie keine Berechtigung zum Kopieren des Objekts „OBJ_NAME]“ besitzen.
+		Kopieren fehlgeschlagen, da Sie nicht über die Berechtigung zum Kopieren des Objekts &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; verfügen.
 	</notification>
 	<notification name="NoTransPermsNoObject">
-		Kopieren fehlgeschlagen, weil Objekt „[OBJ_NAME]“ nicht an Sie übertragen werden kann.
+		Kopieren fehlgeschlagen, da das Objekt &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; nicht an Sie übertragen werden kann.
 	</notification>
 	<notification name="AddToNavMeshNoCopy">
-		Kopieren fehlgeschlagen, weil Objekt „[OBJ_NAME]“ zum Navmesh beiträgt.
+		Kopieren fehlgeschlagen, da das Objekt &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; zum Navmesh beiträgt.
 	</notification>
 	<notification name="DupeWithNoRootsSelected">
 		Ohne ausgewählte Hauptobjekte duplizieren.
@@ -3781,34 +3785,34 @@ Warten Sie kurz und versuchen Sie es noch einmal.
 		Erneutes Speichern im Inventar ist deaktiviert.
 	</notification>
 	<notification name="NoExistNoSaveToContents">
-		„[OBJ_NAME]“ kann nicht im Objektinhalt gespeichert werden, da das Objekt, aus dem es gerezzt wurde, nicht mehr existiert.
+		&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; kann nicht im Objektinhalt gespeichert werden, da das Objekt, aus dem es gerezzt wurde, nicht mehr existiert.
 	</notification>
 	<notification name="NoModNoSaveToContents">
-		„[OBJ_NAME]“ kann nicht in Objektinhalt gespeichert werden, da Sie nicht die Berechtigung zum Modifizieren des Objekts „[DEST_NAME]“ besitzen.
+		&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; kann nicht in Objektinhalt gespeichert werden, da Sie nicht über die Berechtigung zum Modifizieren des Objekts &lt;nolink&gt;&apos;[DEST_NAME]&apos;&lt;/nolink&gt; verfügen.
 	</notification>
 	<notification name="NoSaveBackToInvDisabled">
-		„[OBJ_NAME]“ kann nicht erneut im Inventar gespeichert werden – dieser Vorgang wurde deaktiviert.
+		&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; kann nicht erneut im Inventar gespeichert werden – dieser Vorgang wurde deaktiviert.
 	</notification>
 	<notification name="NoCopyNoSelCopy">
-		Sie können Ihre Auswahl nicht kopieren, da Sie nicht die Berechtigung zum Kopieren des Objekts „[OBJ_NAME]“ haben.
+		Sie können Ihre Auswahl nicht kopieren, da Sie nicht über die Berechtigung zum Kopieren des Objekts &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; verfügen.
 	</notification>
 	<notification name="NoTransNoSelCopy">
-		Sie können Ihre Auswahl nicht kopieren, da das Objekt „[OBJ_NAME]“ nicht übertragbar ist.
+		Sie können Ihre Auswahl nicht kopieren, da das Objekt &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; nicht übertragbar ist.
 	</notification>
 	<notification name="NoTransNoCopy">
-		Sie können Ihre Auswahl nicht kopieren, da das Objekt „[OBJ_NAME]“ nicht übertragbar ist.
+		Sie können Ihre Auswahl nicht kopieren, da das Objekt &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; nicht übertragbar ist.
 	</notification>
 	<notification name="NoPermsNoRemoval">
-		Entfernen des Objekts „[OBJ_NAME]“ aus dem Simulator wird vom Berechtigungssystem nicht gestattet.
+		Entfernen des Objekts &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; aus dem Simulator wird vom Berechtigungssystem nicht gestattet.
 	</notification>
 	<notification name="NoModNoSaveSelection">
-		Sie können Ihre Auswahl nicht speichern, da Sie keine Berechtigung zum Modifizieren des Objekts „[OBJ_NAME]“ besitzen.
+		Sie können Ihre Auswahl nicht speichern, da Sie nicht über die Berechtigung zum Modifizieren des Objekts &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; verfügen.
 	</notification>
 	<notification name="NoCopyNoSaveSelection">
-		Ihre Auswahl kann nicht gespeichert werden, da das Objekt „[OBJ_NAME]“ nicht kopiert werden kann.
+		Ihre Auswahl kann nicht gespeichert werden, da das Objekt &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; nicht kopiert werden kann.
 	</notification>
 	<notification name="NoModNoTaking">
-		Sie können Ihre Auswahl nicht in Empfang nehmen, da Sie nicht die Berechtigung zum Modifizieren des Objekts „[OBJ_NAME]“ haben.
+		Sie können Ihre Auswahl nicht in Empfang nehmen, da Sie nicht über die Berechtigung zum Modifizieren des Objekts &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; verfügen.
 	</notification>
 	<notification name="RezDestInternalError">
 		Interner Fehler: Unbekannter Zielttyp.
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index cde04d8d69..78d445f362 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -5740,4 +5740,25 @@ Setzen Sie den Editorpfad in Anführungszeichen
 	<string name="Mav_Details_MAV_UNKNOWN_VERSION">
 		Die Physikform hat keine korrekte Version. Legen Sie die korrekte Version für das Physikmodell fest.
 	</string>
+	<string name="couldnt_resolve_host">
+		Der DNS konnte den Hostnamen ([HOSTNAME]) nicht auflösen Prüfen 
+Sie bitte, ob Sie die Website www.secondlife.com aufrufen können. Wenn Sie die 
+Website aufrufen können, jedoch weiterhin diese Fehlermeldung erhalten, 
+besuchen Sie bitte den Support-Bereich und melden Sie das Problem.
+	</string>
+	<string name="ssl_peer_certificate">
+		Der Anmeldeserver konnte sich nicht per SSL verifizieren. 
+Wenn Sie diese Fehlermeldung weiterhin erhalten, besuchen 
+Sie bitte den Support-Bereich der Website Secondlife.com 
+und melden Sie das Problem.
+	</string>
+	<string name="ssl_connect_error">
+		Die Ursache hierfür ist häufig eine falsch eingestellte Uhrzeit auf Ihrem Computer. 
+Bitte vergewissern Sie sich, dass Datum und Uhrzeit in der Systemsteuerung korrekt 
+eingestellt sind. Überprüfen Sie außerdem, ob Ihre Netzwerk- und Firewall-Einstellungen 
+korrekt sind. Wenn Sie diese Fehlermeldung weiterhin erhalten, besuchen Sie bitte den 
+Support-Bereich der Website Secondlife.com und melden Sie das Problem. 
+
+[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Knowledge-Base]
+	</string>
 </strings>
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index 70825eadbe..7b1185c4c3 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -243,6 +243,10 @@ La inicialización del mercado ha fallado por un error del sistema o de la red.
 		Nota: Al activar esta opción, cualquiera que utilice este ordenador podrá ver tu lista de lugares favoritos.
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
+	<notification name="AllowMultipleViewers">
+		No es posible ejecutar varios visores Second Life ya que esta funcionalidad no es compatible. Puede provocar problemas de caché en la textura, imágenes degradadas o alteradas y un bajo rendimiento.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
 	<notification name="GrantModifyRights">
 		Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar, borrar o tomar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso.
 ¿Quieres conceder permisos de modificación a [NAME]?
@@ -713,8 +717,9 @@ La calidad gráfica puede ajustarse en Preferencias &gt; Gráficos.
 		No tienes permiso para modificar el terreno de la parcela [PARCEL].
 	</notification>
 	<notification name="CannotCopyWarning">
-		No tienes permiso para copiar los elementos siguientes:
-[ITEMS] y, si los das, los perderás del inventario. ¿Seguro que quieres ofrecerlos?
+		No tienes permiso para copiar los elementos siguientes: 
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+y, si los das, los perderás del inventario. ¿Seguro que quieres ofrecerlos?
 		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
 	</notification>
 	<notification name="CannotGiveItem">
@@ -3712,13 +3717,13 @@ no está en la misma región que tú.
 		No puedes crear árboles y hierba en un terreno que no es tuyo.
 	</notification>
 	<notification name="NoCopyPermsNoObject">
-		Error al copiar: careces de permiso para copiar el objeto &apos;[OBJ_NAME]&apos;.
+		Error al copiar porque no tienes permiso para copiar el objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoTransPermsNoObject">
-		Error al copiar: no se te puede transferir el objeto &apos;[OBJ_NAME]&apos;.
+		Error al copiar porque no puedes recibir una transferencia del objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="AddToNavMeshNoCopy">
-		Error al copiar porque el objeto &apos;[OBJ_NAME]&apos; contribuye al navmesh.
+		Error al copiar porque el objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; contribuye a navmesh.
 	</notification>
 	<notification name="DupeWithNoRootsSelected">
 		Duplicación sin objetos raíz seleccionados.
@@ -3763,34 +3768,34 @@ Prueba otra vez dentro de un minuto.
 		Se ha deshabilitado Devolver el objeto a mi inventario.
 	</notification>
 	<notification name="NoExistNoSaveToContents">
-		No se puede guardar &apos;[OBJ_NAME]&apos; en el contenido del objeto porque el objeto desde el cual ha sido colocado ya no existe.
+		No se puede guardar &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; en los contenidos del objeto porque el objeto a partir del cual fue creado ya no existe.
 	</notification>
 	<notification name="NoModNoSaveToContents">
-		No se puede guardar &apos;[OBJ_NAME]&apos; en el contenido del objeto porque no tienes permiso para modificar el objeto &apos;[DEST_NAME]&apos;.
+		No se puede guardar &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; en los contenidos del objeto porque no tienes permiso para modificar el objeto &lt;nolink&gt;&apos;[DEST_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoSaveBackToInvDisabled">
-		No se puede guardar &apos;[OBJ_NAME]&apos; de nuevo en el inventario; esta operación está desactivada.
+		No se puede volver a guardar &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; en el inventario. Esta operación fue desactivada.
 	</notification>
 	<notification name="NoCopyNoSelCopy">
-		No se puede copiar tu selección porque no tienes permiso para copiar el objeto &apos;[OBJ_NAME]&apos;.
+		No puedes copiar el elemento seleccionado porque no tienes permiso para copiar el objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoTransNoSelCopy">
-		No se puede copiar tu selección porque el objeto &apos;[OBJ_NAME]&apos; es intransferible.
+		No puedes copiar el elemento seleccionado porque el objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; no es transferible.
 	</notification>
 	<notification name="NoTransNoCopy">
-		No se puede copiar tu selección porque el objeto &apos;[OBJ_NAME]&apos; es intransferible.
+		No puedes copiar el elemento seleccionado porque el objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; no es transferible.
 	</notification>
 	<notification name="NoPermsNoRemoval">
-		El sistema de permisos no admite la eliminación del objeto &apos;[OBJ_NAME]&apos; del simulador.
+		El sistema de permisos no autoriza quitar el objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; del simulador.
 	</notification>
 	<notification name="NoModNoSaveSelection">
-		No se puede guardar tu selección porque no tienes permiso para modificar el objeto &apos;[OBJ_NAME]&apos;.
+		No puedes guardar el elemento seleccionado porque no tienes permiso para modificar el objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoCopyNoSaveSelection">
-		No se puede guardar tu selección porque el objeto &apos;[OBJ_NAME]&apos; no se puede copiar.
+		No puedes guardar el elemento seleccionado porque el objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; no puede ser copiado.
 	</notification>
 	<notification name="NoModNoTaking">
-		No se puede aceptar tu selección porque no tienes permiso para modificar el objeto &apos;[OBJ_NAME]&apos;.
+		No puedes tomar el elemento seleccionado porque no tienes permiso para modificar el objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="RezDestInternalError">
 		Error interno: tipo de destino desconocido.
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 36a2711a5c..15e3c0622d 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -5651,4 +5651,25 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas
 	<string name="Mav_Details_MAV_UNKNOWN_VERSION">
 		La versión de la forma física no es correcta. Configura la versión correcta del modelo físico.
 	</string>
+	<string name="couldnt_resolve_host">
+		Error de DNS al resolver el nombre del host([HOSTNAME]). 
+Por favor verifica si puedes conectarte al sitio web www.secondlife.com. 
+Si puedes conectarte, pero aún recibes este error, por favor accede a 
+la sección Soporte y genera un informe del problema.
+	</string>
+	<string name="ssl_peer_certificate">
+		El servidor de inicio de sesión no pudo verificarse vía SSL. 
+Si aún recibes este error, por favor accede a 
+la sección Soporte del sitio web Secondlife.com 
+y genera un informe del problema.
+	</string>
+	<string name="ssl_connect_error">
+		En general esto significa que el horario de tu computadora no está bien configurado. 
+Por favor accede al Panel de control y asegúrate de que la hora y la fecha estén 
+bien configurados. Verifica también que tu red y tu cortafuegos estén bien 
+configurados. Si aún recibes este error, por favor accede a la sección Soporte 
+del sitio web Secondlife.com y genera un informe del problema. 
+
+[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de conocimientos]
+	</string>
 </strings>
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index 74abecf760..9066f1e70c 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -244,6 +244,10 @@ Veuillez ne sélectionner qu&apos;un seul objet.
 		Remarque : si vous activez cette option, toutes les personnes utilisant cet ordinateur pourront voir votre liste d&apos;endroits favoris.
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
+	<notification name="AllowMultipleViewers">
+		L&apos;exécution de plusieurs visualiseurs Second Life n&apos;est pas prise en charge. Cela peut entraîner des collisions de cache de texture, une corruption et une dégradation des visuels et des performances.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
 	<notification name="GrantModifyRights">
 		Lorsque vous accordez des droits de modification à un autre résident, vous lui permettez de changer, supprimer ou prendre n&apos;importe lequel de vos objets dans Second Life. Réfléchissez bien avant d&apos;accorder ces droits.
 Voulez-vous vraiment accorder des droits de modification à [NAME] ?
@@ -717,9 +721,9 @@ La qualité des graphiques peut être augmentée à la section Préférences &gt
 		Vous n&apos;êtes pas autorisé(e) à terraformer la parcelle [PARCEL].
 	</notification>
 	<notification name="CannotCopyWarning">
-		Vous n&apos;êtes pas autorisé à copier les articles suivants :
-[ITEMS].
-Ceux-ci disparaîtront donc de votre inventaire si vous les donnez. Voulez-vous vraiment offrir ces articles ?
+		Vous n&apos;êtes pas autorisé à copier les objets suivants : 
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+et il disparaîtra de votre inventaire si vous le donnez. Voulez-vous vraiment offrir ces articles ?
 		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
 	</notification>
 	<notification name="CannotGiveItem">
@@ -3715,13 +3719,13 @@ il ne se trouve pas dans la même région que vous.
 		Vous ne pouvez pas créer d&apos;arbres ni d&apos;herbe sur un terrain qui ne vous appartient pas.
 	</notification>
 	<notification name="NoCopyPermsNoObject">
-		Échec de la copie car vous ne disposez pas des droits requis pour copier l&apos;objet [OBJ_NAME].
+		La copie a échoué car vous ne disposez pas de l&apos;autorisation nécessaire pour copier l&apos;objet &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoTransPermsNoObject">
-		Échec de la copie car l&apos;objet [OBJ_NAME] ne peut pas vous être transféré.
+		La copie a échoué car l&apos;objet &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; ne peut pas vous être transféré.
 	</notification>
 	<notification name="AddToNavMeshNoCopy">
-		Échec de la copie car l&apos;objet [OBJ_NAME] contribue au maillage de navigation.
+		La copie a échoué car l&apos;objet &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; contribue à navmesh.
 	</notification>
 	<notification name="DupeWithNoRootsSelected">
 		Dupliquer sans objet racine sélectionné
@@ -3766,34 +3770,34 @@ Veuillez réessayer dans une minute.
 		Le réenregistrement dans l&apos;inventaire a été désactivé.
 	</notification>
 	<notification name="NoExistNoSaveToContents">
-		Impossible d&apos;enregistrer [OBJ_NAME] dans le contenu des objets car l&apos;objet à partir duquel il a été rezzé n&apos;existe plus.
+		Impossible de sauvegarder &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;  dans le contenu de l&apos;objet car l&apos;objet à partir duquel il a été rezzé n&apos;existe plus.
 	</notification>
 	<notification name="NoModNoSaveToContents">
-		Impossible d&apos;enregistrer [OBJ_NAME] dans le contenu des objets car vous ne disposez pas des droits requis pour modifier l&apos;objet [DEST_NAME].
+		Impossible de sauvegarder&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; dans le contenu de l&apos;objet car vous n&apos;êtes pas autorisé à modifier l&apos;objet &lt;nolink&gt;&apos;[DEST_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoSaveBackToInvDisabled">
-		Impossible de réenregistrer [OBJ_NAME] dans l&apos;inventaire -- cette opération a été désactivée.
+		Impossible de sauvegarder &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; dans l&apos;inventaire - cette opération a été désactivée.
 	</notification>
 	<notification name="NoCopyNoSelCopy">
-		Vous ne pouvez pas copier votre sélection car vous n&apos;avez pas le droit de copier l&apos;objet [OBJ_NAME].
+		Vous ne pouvez pas copier votre sélection parce que vous n&apos;êtes pas autorisé à copier l&apos;objet &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoTransNoSelCopy">
-		Vous ne pouvez pas copier votre sélection car l&apos;objet [OBJ_NAME] n&apos;est pas transférable.
+		Vous ne pouvez pas copier votre sélection parce que l&apos;objet  &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; n&apos;est pas transférable.
 	</notification>
 	<notification name="NoTransNoCopy">
-		Vous ne pouvez pas copier votre sélection car l&apos;objet [OBJ_NAME] n&apos;est pas transférable.
+		Vous ne pouvez pas copier votre sélection parce que l&apos;objet  &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; n&apos;est pas transférable.
 	</notification>
 	<notification name="NoPermsNoRemoval">
-		La suppression de l&apos;objet [OBJ_NAME] du simulateur n&apos;est pas autorisée par le système de droits.
+		La suppression de l&apos;objet &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; du simulateur n&apos;est pas autorisée par le système d&apos;autorisations.
 	</notification>
 	<notification name="NoModNoSaveSelection">
-		Vous ne pouvez pas enregistrer votre sélection car vous n&apos;avez pas le droit de modifier l&apos;objet [OBJ_NAME].
+		Impossible de sauvegarder votre sélection parce que vous n&apos;êtes pas autorisé à modifier l&apos;objet &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoCopyNoSaveSelection">
-		Vous ne pouvez pas enregistrer votre sélection car l&apos;objet [OBJ_NAME] ne peut pas être copié.
+		Impossible d&apos;enregistrer votre sélection car l&apos;objet &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; n&apos;est pas copiable.
 	</notification>
 	<notification name="NoModNoTaking">
-		Vous ne pouvez pas prendre votre sélection car vous n&apos;avez pas le droit de modifier l&apos;objet [OBJ_NAME].
+		Vous ne pouvez pas sauvegarder votre sélection parce que vous n&apos;êtes pas autorisé à modifier l&apos;objet &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="RezDestInternalError">
 		Erreur interne : type de destination inconnue.
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 7f5851b51d..13dd2b3640 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -5741,4 +5741,25 @@ Essayez avec le chemin d&apos;accès à l&apos;éditeur entre guillemets doubles
 	<string name="Mav_Details_MAV_UNKNOWN_VERSION">
 		La forme physique n’a pas la version correcte. Configurez la version correcte pour le modèle physique.
 	</string>
+	<string name="couldnt_resolve_host">
+		DNS n&apos;a pas pu résoudre le nom d&apos;hôte([HOSTNAME]). 
+Veuillez vérifier que vous parvenez à vous connecter au site www.secondlife.com. 
+Si c&apos;est le cas, et que vous continuez à recevoir ce message d&apos;erreur, veuillez vous 
+rendre à la section Support et signaler ce problème
+	</string>
+	<string name="ssl_peer_certificate">
+		Le serveur d&apos;identification a rencontré une erreur de connexion SSL. 
+Si vous continuez à recevoir ce message d&apos;erreur, 
+veuillez vous rendre à la section Support du site web 
+SecondLife.com et signaler ce problème
+	</string>
+	<string name="ssl_connect_error">
+		Ceci est souvent dû à un mauvais réglage de l&apos;horloge de votre ordinateur. 
+Veuillez aller à Tableaux de bord et assurez-vous que l&apos;heure et la date sont réglés 
+correctement. Vérifiez également que votre réseau et votre pare-feu sont configurés 
+correctement. Si vous continuez à recevoir ce message d&apos;erreur, veuillez vous rendre 
+à la section Support du site web SecondLife.com et signaler ce problème. 
+
+[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de connaissances]
+	</string>
 </strings>
diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml
index d1a47535d8..8a057914ac 100644
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -244,6 +244,10 @@ Scegli solo un oggetto e riprova.
 		Nota: Se attivi questa opzione, chiunque usa questo computer può vedere l&apos;elenco di luoghi preferiti.
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
+	<notification name="AllowMultipleViewers">
+		Non è possibile utilizzare più di un viewer Second Life contemporaneamente. L’utilizzo simultaneo potrebbe portare a collisioni o corruzione della cache texture, e ad un peggioramento nelle immagini e nella performance.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
 	<notification name="GrantModifyRights">
 		Quando concedi i diritti di modifica ad un altro residente, gli permetti di modificare, eliminare o prendere QUALSIASI oggetto che possiedi in Second Life. Pertanto ti consigliamo di essere ben sicuro quando concedi questo diritto.
 Vuoi concedere i diritti di modifica a [NAME]?
@@ -716,8 +720,8 @@ La qualità grafica può essere aumentata in Preferenze &gt; Grafica.
 	</notification>
 	<notification name="CannotCopyWarning">
 		Non hai l&apos;autorizzazione a copiare i seguenti oggetti:
-[ITEMS]
-e se li dai via, verranno eliminati dal tuo inventario. Sicuro di volere offrire questi oggetti?
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+e se li dai via, verranno eliminati dal tuo inventario. Sicuro di voler offrire questi oggetti?
 		<usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
 	</notification>
 	<notification name="CannotGiveItem">
@@ -3719,13 +3723,13 @@ non è nella stessa regione in cui ti trovi.
 		Non puoi creare alberi ed erba su terreni che non sono di tua proprietà.
 	</notification>
 	<notification name="NoCopyPermsNoObject">
-		Copia non riuscita perché non hai l&apos;autorizzazione necessaria per copiare l&apos;oggetto &apos;[OBJ_NAME]&apos;.
+		Copia non riuscita perché non hai il permesso per copiare l’oggetto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoTransPermsNoObject">
-		La copia non è riuscita perché &apos;[OBJ_NAME]&apos; non può essere trasferito a te.
+		Copia non riuscita perché l’oggetto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; non può esserti trasferito.
 	</notification>
 	<notification name="AddToNavMeshNoCopy">
-		La copia non è riuscita perché &apos;[OBJ_NAME]&apos; contribuisce al navmesh.
+		Copia non riuscita perché l’oggetto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; contribuisce al navmesh.
 	</notification>
 	<notification name="DupeWithNoRootsSelected">
 		Duplicato senza oggetto principale selezionato.
@@ -3770,34 +3774,34 @@ Riprova tra un minuto.
 		Opzione Salva nell&apos;inventario disattivata
 	</notification>
 	<notification name="NoExistNoSaveToContents">
-		Impossibile salvare &apos;[OBJ_NAME]&apos; nei contenuti dell&apos;oggetto perché l&apos;oggetto da cui è stato razzato non esiste più.
+		Impossibile salvare &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; in contenuti oggetto perché l’oggetto da cui è stato rezzato non esiste più.
 	</notification>
 	<notification name="NoModNoSaveToContents">
-		Impossibile salvare &apos;[OBJ_NAME]&apos; nei contenuti dell&apos;oggetto perché non hai l&apos;autorizzazione necessaria per modificare l&apos;oggetto &apos;[DEST_NAME]&apos;.
+		Impossibile salvare &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; in contenuti oggetto perché non hai i permessi per modificare l’oggetto &lt;nolink&gt;&apos;[DEST_NAME]’&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoSaveBackToInvDisabled">
-		Impossibile riportare &apos;[OBJ_NAME]&apos; nell&apos;inventario -- questa operazione è stata disattivata.
+		Impossibile salvare &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; nell’inventario: questa operazione è stata disabilitata.
 	</notification>
 	<notification name="NoCopyNoSelCopy">
-		Non puoi copiare l&apos;elemento selezionato perché non hai l&apos;autorizzazione necessaria per copiare l&apos;oggetto &apos;[OBJ_NAME]&apos;.
+		Non puoi copiare la selezione perché non hai il permesso di copiare l’oggetto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoTransNoSelCopy">
-		Non puoi copiare la selezione perché l&apos;oggetto &apos;[OBJ_NAME]&apos; non può essere trasferito.
+		Non puoi copiare la selezione perché l’oggetto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; non è trasferibile.
 	</notification>
 	<notification name="NoTransNoCopy">
-		Non puoi copiare la selezione perché l&apos;oggetto &apos;[OBJ_NAME]&apos; non può essere trasferito.
+		Non puoi copiare la selezione perché l’oggetto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; non è trasferibile.
 	</notification>
 	<notification name="NoPermsNoRemoval">
-		La rimozione dell&apos;oggetto &apos;[OBJ_NAME]&apos; dal simulatore non è consentita dal sistema delle autorizzazioni.
+		La rimozione dell’oggetto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; dal simulatore è disattivata dal sistema dei permessi.
 	</notification>
 	<notification name="NoModNoSaveSelection">
-		Non puoi salvare l&apos;elemento selezionato perché non hai l&apos;autorizzazione necessaria per modificare l&apos;oggetto &apos;[OBJ_NAME]&apos;.
+		Non puoi copiare la selezione perché non hai il permesso di modificare l’oggetto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoCopyNoSaveSelection">
-		Non puoi salvare la selezione perché l&apos;oggetto &apos;[OBJ_NAME]&apos; non può essere copiato.
+		Non puoi copiare la selezione perché l’oggetto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; non è copiabile.
 	</notification>
 	<notification name="NoModNoTaking">
-		Non puoi prendere l&apos;elemento selezionato perché non hai l&apos;autorizzazione necessaria per modificare l&apos;oggetto &apos;[OBJ_NAME]&apos;.
+		Non puoi prendere ciò che hai selezionato perché non hai il permesso di modificare l’oggetto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="RezDestInternalError">
 		Errore interno: Tipo di destinazione sconosciuto.
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index 918e655ab6..be3acc14b3 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -5656,4 +5656,25 @@ Prova a racchiudere il percorso dell&apos;editor in doppie virgolette.
 	<string name="Mav_Details_MAV_UNKNOWN_VERSION">
 		La versione della forma fisica non è corretta. Imposta la versione corretta per il modello della fisica.
 	</string>
+	<string name="couldnt_resolve_host">
+		Il DNS non ha potuto risolvere il nome dell’host([HOSTNAME]). 
+Verifica di riuscire a connetterti al sito web www.secondlife.com. 
+Se riesci ma continui a ricevere questo errore, visita la sezione 
+Assistenza e segnala il problema.
+	</string>
+	<string name="ssl_peer_certificate">
+		Il server per il login non ha potuto effettuare la verifica tramite SSL. 
+Se continui a ricevere questo errore, visita 
+la sezione Assistenza nel sito SecondLife.com 
+e segnala il problema.
+	</string>
+	<string name="ssl_connect_error">
+		Spesso l’errore è dovuto all’orologio del computer, impostato incorrettamente. 
+Vai al Pannello di Controllo e assicurati che data e ora siano 
+esatte. Controlla anche che il network e il firewall siano impostati 
+correttamente. Se continui a ricevere questo errore, visita la sezione 
+Assistenza nel sito SecondLife.com e segnala il problema. 
+
+[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base conoscenze]
+	</string>
 </strings>
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index 99ba5b2655..fc6c951a55 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -244,6 +244,10 @@
 		注意:このオプションを有効にすると、このパソコンを使うユーザーは誰でも、あなたのお気に入りの場所を見ることができるようになります。
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
+	<notification name="AllowMultipleViewers">
+		複数の Second Life ビューワを実行することはサポートされていません。テクスチャキャッシュのコリジョンや破損、およびビジュアルとパフォーマンスの低下につながる恐れがあります。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
 	<notification name="GrantModifyRights">
 		他人に修正権限を与えると、権限を与えられた人はあなたが所有するインワールドのオブジェクトを変更、削除、持ち帰ることができます。この権限を与える際には十分に注意してください。
 [NAME] に修正権限を与えますか?
@@ -735,7 +739,9 @@ L$ が不足しているのでこのグループに参加することができ
 		あなたには [PARCEL] 区画を地形編集する許可がありません。
 	</notification>
 	<notification name="CannotCopyWarning">
-		あなたには[ITEMS]というアイテムをコピーする許可がありません。他の住人に提供すると、そのアイテムはあなたのインベントリから削除されます。本当にこれらのアイテムを譲りますか?
+		あなたには次アイテムをコピーする権限がありません: 
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt; 
+他の住人に譲ると、そのアイテムはあなたの持ち物から削除されます。本当にこれらのアイテムを譲りますか?
 		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
 	</notification>
 	<notification name="CannotGiveItem">
@@ -3756,13 +3762,13 @@ M キーを押して変更します。
 		所有していない土地に木や草を植えることはできません。
 	</notification>
 	<notification name="NoCopyPermsNoObject">
-		オブジェクト &apos;[OBJ_NAME]&apos; をコピーする権限がないため、コピーに失敗しました。
+		あなたにはオブジェクト &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; をコピーする権限がないため、コピーに失敗しました。
 	</notification>
 	<notification name="NoTransPermsNoObject">
-		オブジェクト &apos;[OBJ_NAME]&apos; をあなたに転送できないため、コピーに失敗しました。
+		オブジェクト &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; はあなたに譲渡できないため、コピーに失敗しました。
 	</notification>
 	<notification name="AddToNavMeshNoCopy">
-		オブジェクト &apos;[OBJ_NAME]&apos; がナビメッシュに貢献しているため、コピーに失敗しました。
+		オブジェクト &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; は navmesh に関連があるため、コピーに失敗しました。
 	</notification>
 	<notification name="DupeWithNoRootsSelected">
 		ルートオブジェクトを選択せずに複製します。
@@ -3807,34 +3813,34 @@ M キーを押して変更します。
 		「「持ち物」に保存」が無効になっています。
 	</notification>
 	<notification name="NoExistNoSaveToContents">
-		&apos;[OBJ_NAME]&apos; の Rez 元であるオブジェクトが存在しないため、このオブジェクトをオブジェクトコンテンツに保存できません。
+		「存在しません」から rez されたため、&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; をオブジェクトの中身に保存できませんでした。
 	</notification>
 	<notification name="NoModNoSaveToContents">
-		オブジェクト &apos;[DEST_NAME]&apos; を修正する権限がないため、オブジェクトのコンテンツに &apos;[OBJ_NAME]&apos; を保存できません。
+		あなたにはオブジェクト &lt;nolink&gt;&apos;[DEST_NAME]&apos;&lt;/nolink&gt; を修正する権限がないため、&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;をオブジェクトの中身に保存できませんでした。
 	</notification>
 	<notification name="NoSaveBackToInvDisabled">
-		インベントリに &apos;[OBJ_NAME]&apos; を保存することはできません - この操作が無効になっています。
+		&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; をインベントリに保存できません。この操作は無効になりました。
 	</notification>
 	<notification name="NoCopyNoSelCopy">
-		オブジェクト &apos;[OBJ_NAME]&apos; を変更する権限を持っていないため、選択したものをコピーできません。
+		あなたにはオブジェクト &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; をコピーする権限がないため、選択内容をコピーできません。
 	</notification>
 	<notification name="NoTransNoSelCopy">
-		オブジェクト &apos;[OBJ_NAME]&apos; を転送できないため、選択したものをコピーできません。
+		オブジェクト &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; を譲渡できないため、選択内容をコピーできません。
 	</notification>
 	<notification name="NoTransNoCopy">
-		オブジェクト &apos;[OBJ_NAME]&apos; を転送できないため、選択したものをコピーできません。
+		オブジェクト &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; を譲渡できないため、選択内容をコピーできません。
 	</notification>
 	<notification name="NoPermsNoRemoval">
-		シミュレータからのオブジェクト &apos;[OBJ_NAME]&apos; の削除は、権限システムによって無効にされています。
+		オブジェクト &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; をシミュレーターから削除することは、権限のシステムにより許可されていません。
 	</notification>
 	<notification name="NoModNoSaveSelection">
-		オブジェクト &apos;[OBJ_NAME]&apos; を変更する権限を持っていないため、選択したものを保存できません。
+		あなたにはオブジェクト &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; を修正する権限がないため、選択内容を保存できません。
 	</notification>
 	<notification name="NoCopyNoSaveSelection">
-		オブジェクト &apos;[OBJ_NAME]&apos; をコピーできないため、選択したものを保存できません。
+		オブジェクト &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; はコピー不可なため、選択内容を保存できません。
 	</notification>
 	<notification name="NoModNoTaking">
-		オブジェクト &apos;[OBJ_NAME]&apos; を変更する権限を持っていないため、選択したものを取得できません。
+		あなたにはオブジェクト &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; を修正する権限がないため、選択内容を選ぶことはできません。
 	</notification>
 	<notification name="RezDestInternalError">
 		内部エラー: 不明な宛先タイプ。
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index bcf4698bb0..9116bba8bb 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -5739,4 +5739,25 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
 	<string name="Mav_Details_MAV_UNKNOWN_VERSION">
 		物理形状のバージョンが正しくありません。物理モデルに正しいバージョンを設定してください。
 	</string>
+	<string name="couldnt_resolve_host">
+		DNS がホスト名 ([HOSTNAME]) を解決できませんでした。
+www.secondlife.com のウェブサイトに接続できるかご確認ください。
+接続できても、このエラーが継続的に起こる場合は、
+サポートセクションから問題を報告してください。
+	</string>
+	<string name="ssl_peer_certificate">
+		ログインサーバーが SSL 経由で確認できませんでした。
+このエラーが継続的に起こる場合は、
+Secondlife.com のサポートセクションから
+問題を報告してください。
+	</string>
+	<string name="ssl_connect_error">
+		この問題の多くは、お使いのコンピュータの時計が正しく設定されていないために起こります。
+コントロールパネルから時刻と日付が正しく設定されているかご確認ください。
+お使いのネットワークとファイアウォールも正しく設定されているかお確かめください。
+このエラーが継続的に起こる場合は、Secondlife.com のサポートセクションから
+問題を報告してください。
+
+[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 ナレッジベース]
+	</string>
 </strings>
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index 5c848034d8..b4cf0a1b20 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -243,6 +243,10 @@ Por favor, selecione apenas um objeto e tente novamente.
 		Nota: Ao ativar esta opção, qualquer pessoa que utilizar este computador poderá ver a sua lista de lugares preferidos.
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
+	<notification name="AllowMultipleViewers">
+		Não é possível executar múltiplos visualizadores Second Life. Pode levar a uma falha, um corrompimento, visuais alterados e falha no desempenho no cache de textura.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
 	<notification name="GrantModifyRights">
 		Conceder direitos de modificação a outros residentes vai autorizá-los a mudar, apagar ou pegar TODOS os seus objetos. Seja MUITO cuidadoso ao conceder esta autorização.
 Deseja dar direitos de modificação a [NAME]?
@@ -711,9 +715,9 @@ Para aumentar a qualidade do vídeo, vá para Preferências &gt; Vídeo.
 		Você não está autorizado a terraplanar o terreno [PARCEL].
 	</notification>
 	<notification name="CannotCopyWarning">
-		Você não tem autorização para copiar os itens abaixo:
-[ITEMS]
-ao dá-los, você ficará sem eles no seu inventário. Deseja realmente dar estes itens?
+		Não existe autorização para copiar os itens abaixo: 
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt; 
+e eles sairão do inverntário se sair. Deseja realmente dar estes itens?
 		<usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
 	</notification>
 	<notification name="CannotGiveItem">
@@ -3702,13 +3706,13 @@ ele não está na mesma região que você.
 		Você não pode criar árvores e grama em terrenos que não são sua propriedade.
 	</notification>
 	<notification name="NoCopyPermsNoObject">
-		A cópia falhou porque você não está autorizado a copiar o objeto &apos;[OBJ_NAME]&apos;.
+		Falha na cópia por falta de permissão para copiar o objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoTransPermsNoObject">
-		A cópia falhou porque o objeto &apos;[OBJ_NAME]&apos; não pode ser transferido para você.
+		Falha na cópia, porque o objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; não pode ser transferido para você.
 	</notification>
 	<notification name="AddToNavMeshNoCopy">
-		A cópia falhou porque o objeto &apos;[OBJ_NAME]&apos; contribui para o navmesh.
+		Falha na cópia, porque o objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; contribui para o Navmesh.
 	</notification>
 	<notification name="DupeWithNoRootsSelected">
 		Duplicar sem objetos raiz selecionados.
@@ -3753,34 +3757,34 @@ Tente novamente em instantes.
 		Salvar no inventário foi desativado.
 	</notification>
 	<notification name="NoExistNoSaveToContents">
-		Não é possível salvar &apos;[OBJ_NAME]&apos; no conteúdo do objeto porque o objeto do qual ele foi renderizado não existe mais.
+		Não foi possível salvar &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; para os conteúdos do objeto, porque o objeto foi utilizado e não existe mais.
 	</notification>
 	<notification name="NoModNoSaveToContents">
-		Não é possível salvar &apos;[OBJ_NAME]&apos; no conteúdo do objeto porque você não tem permissão para modificar o objeto &apos;[DEST_NAME]&apos;.
+		Não foi possível salvar &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; para os conteúdos do objeto, porque você não tem permissão para modificar o objeto &lt;nolink&gt;&apos;[DEST_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoSaveBackToInvDisabled">
-		Não é possível salvar &apos;[OBJ_NAME]&apos; no inventário -- essa operação foi desativada.
+		Não é possível salvar &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; no inventário outra vez -- esta operação foi desabilitada.
 	</notification>
 	<notification name="NoCopyNoSelCopy">
-		Você não pode copiar sua seleção porque não está autorizado a copiar o objeto &apos;[OBJ_NAME]&apos;.
+		Não é possível copiar a seleção porque você não tem permissão para copiar o objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoTransNoSelCopy">
-		Você não pode copiar a seleção porque o objeto &apos;[OBJ_NAME]&apos; não é transferível.
+		Não é possível copiar a seleção porque o objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; não é transferível.
 	</notification>
 	<notification name="NoTransNoCopy">
-		Você não pode copiar a seleção porque o objeto &apos;[OBJ_NAME]&apos; não é transferível.
+		Não é possível copiar a seleção porque o objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; não é transferível.
 	</notification>
 	<notification name="NoPermsNoRemoval">
-		A remoção do objeto &apos;[OBJ_NAME]&apos; do simulador é proibida pelo sistema de permissões.
+		A remoção do objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; do simulador não é permitida pelo sistema de permissão.
 	</notification>
 	<notification name="NoModNoSaveSelection">
-		Você não pode salvar sua seleção porque não está autorizado a modificar o objeto &apos;[OBJ_NAME]&apos;.
+		Não é possível salvar a seleção porque você não tem permissão para modificar o objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoCopyNoSaveSelection">
-		Não é possível salvar sua seleção porque o objeto &apos;[OBJ_NAME]&apos; não é copiável.
+		Não é possível salvar a seleção porque o objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; não é copiável.
 	</notification>
 	<notification name="NoModNoTaking">
-		Você não pode levar sua seleção porque não está autorizado a modificar o objeto &apos;[OBJ_NAME]&apos;.
+		Não é possível realizar a seleção porque você não tem permissão para modificar o objeto &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="RezDestInternalError">
 		Erro interno: tipo de destino desconhecido.
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index ecf90ef787..4151ef36ac 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -5615,4 +5615,25 @@ Tente colocar o caminho do editor entre aspas.
 	<string name="Mav_Details_MAV_UNKNOWN_VERSION">
 		A forma física não tem a versão correta. Defina a versão correta para o modelo físico.
 	</string>
+	<string name="couldnt_resolve_host">
+		O DNS não pode resolver o nome do host([HOSTNAME]). 
+Verifique se você pode conectar ao site www.secondlife.com . Se você 
+puder, mas se continuar recebendo esta mensagem de erro, vá à sessão 
+Suporte no site Secondlife.com e informe o problema.
+	</string>
+	<string name="ssl_peer_certificate">
+		O servidor de acesso não pôde verificá-lo pelo SSL. 
+Se você continuar recebendo esta mensagem de erro, 
+vá à sessão Suporte no site Secondlife.com 
+e informe o problema.
+	</string>
+	<string name="ssl_connect_error">
+		Geralmente, esse erro significa que o relógio do seu computador não está com o horário correto. 
+Vá em Painel de Controles e certifique-se de que a hora e data estejam corretos. 
+Além disso, verifique se a sua rede e firewall estejam corretos. Se você continuar 
+recebendo esta mensagem de erro, vá à sessão Suporte no site Secondlife.com 
+e informe o problema. 
+
+[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de conhecimento]
+	</string>
 </strings>
diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml
index d752bf254e..d6866b6489 100644
--- a/indra/newview/skins/default/xui/ru/notifications.xml
+++ b/indra/newview/skins/default/xui/ru/notifications.xml
@@ -244,6 +244,10 @@
 		Примечание. После включения этой опции все пользователи данного компьютера смогут увидеть список ваших избранных мест.
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
+	<notification name="AllowMultipleViewers">
+		Запуск нескольких приложений Second Life Viewer не поддерживается. Это может привести к конфликтам кэша текстур, повреждению и снижению производительности и визуального отображения.
+		<usetemplate name="okbutton" yestext="ОК"/>
+	</notification>
 	<notification name="GrantModifyRights">
 		Предоставление другому жителю прав на изменение позволит ему изменять, удалять или брать ЛЮБЫЕ ваши объекты. Будьте ОЧЕНЬ осторожны с предоставлением такого разрешения.
 Дать пользователю [NAME] права на изменение?
@@ -717,9 +721,9 @@
 		Вам не разрешено терраформировать участок [PARCEL].
 	</notification>
 	<notification name="CannotCopyWarning">
-		У вас нет разрешения на копирование следующих предметов:
-[ITEMS]
-Если вы отдадите эти вещи, их больше не будет в вашем инвентаре. Вы действительно хотите предложить эти предметы?
+		У вас нет разрешения на копирование следующих предметов: 
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt; 
+и они пропадут из вашего инвентаря, если вы их отдадите. Вы действительно хотите предложить эти предметы?
 		<usetemplate name="okcancelbuttons" notext="Нет" yestext="Да"/>
 	</notification>
 	<notification name="CannotGiveItem">
@@ -3715,13 +3719,13 @@
 		Вы не можете создавать деревья и траву на чужой земле.
 	</notification>
 	<notification name="NoCopyPermsNoObject">
-		Не удалось скопировать: вам не разрешено копировать объект «[OBJ_NAME]».
+		Не удалось скопировать, потому что у вас нет разрешения на копирование этого предмета &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoTransPermsNoObject">
-		Не удалось скопировать: объект «[OBJ_NAME]» нельзя перенести к вам.
+		Не удалось скопировать, потому что предмет &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; не может быть перемещён к вам.
 	</notification>
 	<notification name="AddToNavMeshNoCopy">
-		Не удалось скопировать: объект «[OBJ_NAME]» относится к навигационной сетке.
+		Не удалось скопировать, потому что предмет &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; относится к навигационной сетке.
 	</notification>
 	<notification name="DupeWithNoRootsSelected">
 		Выбран дубликат без корневых объектов.
@@ -3766,34 +3770,34 @@
 		Сохранение в инвентаре отключено.
 	</notification>
 	<notification name="NoExistNoSaveToContents">
-		Нельзя сохранить «[OBJ_NAME]» в содержимом объекта: объект, из которого оно было выложено, уже не существует.
+		Не удалось сохранить &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; в содержимом предмета, потому что место, в котором был создан предмет, больше не существует.
 	</notification>
 	<notification name="NoModNoSaveToContents">
-		Нельзя сохранить «[OBJ_NAME]» в содержимом объекта: вам не разрешено изменять объект «[DEST_NAME]».
+		Не удалось сохранить &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; в содержимом предмета, потому что у вас нет разрешения на модификацию предмета &lt;nolink&gt;&apos;[DEST_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoSaveBackToInvDisabled">
-		Невозможно сохранить «[OBJ_NAME]» в инвентаре: эта операция запрещена.
+		Не удалось сохранить &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; обратно в инвентаре – эта операция заблокирована.
 	</notification>
 	<notification name="NoCopyNoSelCopy">
-		Нельзя скопировать выбранное: вам не разрешено копировать объект «[OBJ_NAME]».
+		Вы не можете скопировать выбор, потому что у вас нет разрешения на копирование этого предмета &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoTransNoSelCopy">
-		Невозможно скопировать выбранный предмет: объект «[OBJ_NAME]» не переносится.
+		Вы не можете скопировать свой выбор, потому что предмет &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; не может быть перемещён.
 	</notification>
 	<notification name="NoTransNoCopy">
-		Невозможно скопировать выбранный предмет: объект «[OBJ_NAME]» не переносится.
+		Вы не можете скопировать свой выбор, потому что предмет &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; не может быть перемещён.
 	</notification>
 	<notification name="NoPermsNoRemoval">
-		Удаление объекта «[OBJ_NAME]» из симулятора запрещено системой разрешений.
+		Удаление предмета &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; из симулятора не допущено системой прав доступа.
 	</notification>
 	<notification name="NoModNoSaveSelection">
-		Нельзя сохранить выбранное: вам не разрешено изменять объект «[OBJ_NAME]».
+		Копирование выбора невозможно, потому что у вас нет разрешения на модифицирование этого предмета &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="NoCopyNoSaveSelection">
-		Невозможно сохранить выбранный предмет: объект «[OBJ_NAME]» не копируется.
+		Вы не можете сохранить свой выбор, потому что предмет &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; не поддаётся копированию.
 	</notification>
 	<notification name="NoModNoTaking">
-		Нельзя забрать выбранное: вам не разрешено изменять объект «[OBJ_NAME]».
+		Вы не можете скопировать свой выбор, потому что у вас нет разрешения на модифицирование этого предмета &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;.
 	</notification>
 	<notification name="RezDestInternalError">
 		Внутренняя ошибка: неизвестный тип места назначения.
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
index 267c717189..dcc503f18c 100644
--- a/indra/newview/skins/default/xui/ru/strings.xml
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -5747,4 +5747,25 @@ support@secondlife.com.
 	<string name="Mav_Details_MAV_UNKNOWN_VERSION">
 		У физической формы нет правильной версии. Задайте правильную версию для физической модели.
 	</string>
+	<string name="couldnt_resolve_host">
+		DNS не удалось разрешить имя узла([HOSTNAME]). 
+Проверьте возможность подключения к веб-сайту www.secondlife.com. 
+Если вы продолжаете получать эту ошибку, перейдите в раздел 
+поддержки и сообщите о проблеме.
+	</string>
+	<string name="ssl_peer_certificate">
+		Серверу входа в систему не удалось пройти аутентификацию с помощью 
+протокола SSL. Если вы продолжаете получать эту ошибку, 
+перейдите в раздел поддержки на веб-сайте SecondLife.com 
+и сообщите о проблеме.
+	</string>
+	<string name="ssl_connect_error">
+		Часто это означает, что часы компьютера установлены неправильно. 
+Перейдите, пожалуйста, на Панели управления и убедитесь в правильной 
+установке времени и даты. Также проверьте правильность настройки сети 
+и брандмауэра. Если вы продолжаете получать эту ошибку, перейдите в 
+раздел поддержки на веб-сайте SecondLife.com и сообщите о проблеме. 
+
+[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 База знаний]
+	</string>
 </strings>
diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml
index d72d89f1f5..fce5bbfcab 100644
--- a/indra/newview/skins/default/xui/tr/notifications.xml
+++ b/indra/newview/skins/default/xui/tr/notifications.xml
@@ -244,6 +244,10 @@ Lütfen sadece bir nesne seçin ve tekrar deneyin.
 		Not: Bu seçeneği etkinleştirdiğinizde, bu bilgisayarı kullanan herkes en sevdiğiniz konumlar listenizi görebilecek.
 		<usetemplate name="okbutton" yestext="Tamam"/>
 	</notification>
+	<notification name="AllowMultipleViewers">
+		Birden çok Second Life görüntüleyiciyi çalıştırma özelliği desteklenmiyor. Bu durum doku önbelleği çakışmalarına, görsellerin bozulmasına ve performansın düşmesine yol açabilir.
+		<usetemplate name="okbutton" yestext="Tamam"/>
+	</notification>
 	<notification name="GrantModifyRights">
 		Başka bir Sakine değişiklik yapma hakkı verdiğinizde, SL dünyasında sahip olduğunuz HERHANGİ BİR nesneyi değiştirebilme, silebilme veya alabilmelerine izin vermiş olursunuz. Bu izni verirken ÇOK dikkatli olun.
 [NAME] adlı kişiye değişiklik yapma hakkı vermek istiyor musunuz?
@@ -718,9 +722,9 @@ Grafik Kalitesi, Tercihler &gt; Grafikler sekmesinden yükseltilebilir.
 		[PARCEL] parseli üzerinde yer şekillendirmesi yapma izniniz bulunmuyor.
 	</notification>
 	<notification name="CannotCopyWarning">
-		Aşağıdaki öğeleri kopyalamak için gerekli izne sahip değilsiniz:
-[ITEMS]
-Bu öğeleri verdiğiniz takdirde envanterinizden çıkacaklar. Bu öğeleri teklif etmeyi gerçekten istiyor musunuz?
+		Aşağıdaki öğeleri kopyalama izniniz yok: 
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt; 
+ve bunları elden çıkardığınız takdirde envanterinizden kaybolacaktır. Bu öğeleri sunmayı gerçekten istiyor musunuz?
 		<usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
 	</notification>
 	<notification name="CannotGiveItem">
@@ -3714,13 +3718,13 @@ Girişim iptal edildi.
 		Sahibi olmadığınız arazide ağaçlar ve çimen oluşturamazsınız.
 	</notification>
 	<notification name="NoCopyPermsNoObject">
-		&apos;[OBJ_NAME]&apos; nesnesini kopyalama izniniz olmadığı için kopyalama başarılamadı.
+		&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; nesnesini kopyalama izniniz olmadığından kopyalama başarısız oldu.
 	</notification>
 	<notification name="NoTransPermsNoObject">
-		&apos;[OBJ_NAME]&apos; nesnesi size aktarılamadığı için kopyalama başarılamadı.
+		&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; nesnesi size devredilemediğinden kopyalama başarısız oldu.
 	</notification>
 	<notification name="AddToNavMeshNoCopy">
-		&apos;[OBJ_NAME]&apos; nesnesi navmesh&apos;e katkıda bulunduğu için kopyalama başarılamadı.
+		&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; nesnesi navigasyon örgüsüne katkıda bulunduğundan kopyalama başarısız oldu.
 	</notification>
 	<notification name="DupeWithNoRootsSelected">
 		Kök nesne seçili olmayan kopya.
@@ -3765,34 +3769,34 @@ Lütfen bir dakika sonra tekrar deneyin.
 		Envantere Geri Kaydet devre dışı bırakıldı.
 	</notification>
 	<notification name="NoExistNoSaveToContents">
-		&apos;[OBJ_NAME]&apos; nesne içeriğine kaydedilemedi, çünkü oluşturulurken temel alınan nesne artık mevcut değil.
+		Yeniden canlandırıldığı nesne artık mevcut olmadığından &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; nesne içeriklerine kaydedilemiyor.
 	</notification>
 	<notification name="NoModNoSaveToContents">
-		&apos;[DEST_NAME]&apos; nesnesini değiştirme izniniz olmadığı için &apos;[OBJ_NAME]&apos; nesne içeriğine kaydedilemedi.
+		&lt;nolink&gt;&apos;[DEST_NAME]&apos;&lt;/nolink&gt; nesnesini değiştirme izniniz olmadığından &lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; nesne içeriklerine kaydedilemiyor.
 	</notification>
 	<notification name="NoSaveBackToInvDisabled">
-		&apos;[OBJ_NAME]&apos; envantere geri kaydedilemez -- bu işlem devre dışı bırakıldı.
+		&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; envantere tekrar kaydedilemiyor -- bu işlem devre dışı bırakılmış.
 	</notification>
 	<notification name="NoCopyNoSelCopy">
-		&apos;[OBJ_NAME]&apos; nesnesini kopyalama izniniz olmadığı için seçiminizi kopyalamayazsınız.
+		&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; nesnesini kopyalama izniniz olmadığından seçiminizi kopyalayamazsınız.
 	</notification>
 	<notification name="NoTransNoSelCopy">
-		&apos;[OBJ_NAME]&apos; nesnesi aktarılamaz olduğu için seçiminizi kopyalayamazsınız.
+		&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; nesnesi devredilebilir olmadığından seçiminizi kopyalayamazsınız.
 	</notification>
 	<notification name="NoTransNoCopy">
-		&apos;[OBJ_NAME]&apos; nesnesi aktarılamaz olduğu için seçiminizi kopyalayamazsınız.
+		&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; nesnesi devredilebilir olmadığından seçiminizi kopyalayamazsınız.
 	</notification>
 	<notification name="NoPermsNoRemoval">
-		Benzeticiden &apos;[OBJ_NAME]&apos; nesnesinin kaldırılmasına izinler sistemi izin vermiyor.
+		&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; nesnesinin simülatörden kaldırılmasına izin sistemi tarafından izin verilmiyor.
 	</notification>
 	<notification name="NoModNoSaveSelection">
-		&apos;[OBJ_NAME]&apos; nesnesini değiştirme izniniz olmadığı için seçiminizi kaydedemezsiniz.
+		&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; nesnesini değiştirme izniniz olmadığından seçiminiz kaydedilemiyor.
 	</notification>
 	<notification name="NoCopyNoSaveSelection">
-		&apos;[OBJ_NAME]&apos; nesnesi kopyalanamaz olduğu için seçiminizi kaydedemezsiniz.
+		&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; nesnesi kopyalanabilir olmadığından seçiminiz kaydedilemiyor.
 	</notification>
 	<notification name="NoModNoTaking">
-		&apos;[OBJ_NAME]&apos; nesnesini değiştirme izniniz olmadığı için seçiminizi alamazsınız.
+		&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt; nesnesini değiştirme izniniz olmadığından seçiminizi alamazsınız.
 	</notification>
 	<notification name="RezDestInternalError">
 		Dahili Hata: Bilinmeyen hedef türü.
diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
index b574420793..ea6f2115e4 100644
--- a/indra/newview/skins/default/xui/tr/strings.xml
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -5748,4 +5748,25 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin.
 	<string name="Mav_Details_MAV_UNKNOWN_VERSION">
 		Fiziksel şekil doğru sürüme sahip değil. Fiziksel model için doğru sürümü ayarlayın.
 	</string>
+	<string name="couldnt_resolve_host">
+		DNS sunucusu ana bilgisayar adını çözümleyemedi ([HOSTNAME]). 
+Lütfen www.secondlife.com web sitesine bağlanabildiğinizi doğrulayın. 
+Bağlanabiliyor, ancak bu hatayı almaya devam ediyorsanız, lütfen 
+destek bölümüne gidin ve bu sorunu bildirin.
+	</string>
+	<string name="ssl_peer_certificate">
+		Oturum açma sunucusu SSL aracılığıyla kendini doğrulayamadı. 
+Bu hatayı almaya devam ederseniz, lütfen 
+SecondLife.com web sitesinin Destek 
+bölümüne gidin ve sorunu bildirin.
+	</string>
+	<string name="ssl_connect_error">
+		Çoğunlukla, bu durum, bilgisayarınızın saatinin yanlış ayarlandığı anlamına gelir. 
+Lütfen Denetim Masası&apos;na gidin ve tarih ve saat ayarlarının doğru yapıldığından emin olun. 
+Ayrıca, ağınızın ve güvenlik duvarınızın doğru şekilde ayarlanıp ayarlanmadığını kontrol edin. 
+Bu hatayı almaya devam ederseniz, lütfen SecondLife.com web sitesinin Destek bölümüne 
+gidin ve sorunu bildirin. 
+
+[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Bilgi Bankası]
+	</string>
 </strings>
diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml
index 9fe7b5acae..120ed1e7d2 100644
--- a/indra/newview/skins/default/xui/zh/notifications.xml
+++ b/indra/newview/skins/default/xui/zh/notifications.xml
@@ -244,6 +244,10 @@
 		注意:你一旦同意這選項,任何使用這部電腦的人都可看到你有哪些「最愛」地點。
 		<usetemplate name="okbutton" yestext="確定"/>
 	</notification>
+	<notification name="AllowMultipleViewers">
+		不支援同時執行多個Second Life瀏覽器。 這麼做可能導致材質快取相互碰撞、毀損,並降低視覺效果及性能。
+		<usetemplate name="okbutton" yestext="確定"/>
+	</notification>
 	<notification name="GrantModifyRights">
 		賦予另一居民「修改」權,將允許他更改、刪除或拿取你在虛擬世界裡擁有的任何物件。 賦予這項權限時,敬請慎重考慮。
 你仍要賦予 [NAME] 修改權嗎?
@@ -719,7 +723,7 @@
 	</notification>
 	<notification name="CannotCopyWarning">
 		你沒有權限複製以下項目:
-[ITEMS]
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
 如果你將它送人,它將無法續留在收納區。 你確定要送出這些東西嗎?
 		<usetemplate name="okcancelbuttons" notext="否" yestext="是"/>
 	</notification>
@@ -3714,13 +3718,13 @@ SHA1 指紋:[MD5_DIGEST]
 		你無法在別人的土地上建立樹和草。
 	</notification>
 	<notification name="NoCopyPermsNoObject">
-		複製失敗,你無權複製物件 &apos;[OBJ_NAME]&apos;。
+		複製失敗,你無權複製物件&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;。
 	</notification>
 	<notification name="NoTransPermsNoObject">
-		複製失敗,因為物件 &apos;[OBJ_NAME]&apos; 無法轉移給你。
+		複製失敗,因為物件&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;無法轉移給你。
 	</notification>
 	<notification name="AddToNavMeshNoCopy">
-		複製失敗,因為物件 &apos;[OBJ_NAME]&apos; 對導航網面有貢獻。
+		複製失敗,因為物件&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;對導航網面有貢獻。
 	</notification>
 	<notification name="DupeWithNoRootsSelected">
 		選取了沒有根的重覆物件。
@@ -3765,34 +3769,34 @@ SHA1 指紋:[MD5_DIGEST]
 		「儲存回收納區」功能已被停用。
 	</notification>
 	<notification name="NoExistNoSaveToContents">
-		無法將 &apos;[OBJ_NAME]&apos; 儲存到物件內容,因為產生它的來源物件已不存在。
+		無法將&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;儲存到物件內容,因為產生它的來源物件已不存在。
 	</notification>
 	<notification name="NoModNoSaveToContents">
-		無法儲存 [OBJ_NAME] 到物件內容,你無權修改 &apos;[DEST_NAME]&apos; 物件。
+		無法儲存&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;到物件內容,因爲你無權修改&lt;nolink&gt;&apos;[DEST_NAME]&apos;&lt;/nolink&gt;物件。
 	</notification>
 	<notification name="NoSaveBackToInvDisabled">
-		無法將 &apos;[OBJ_NAME]&apos; 儲存回收納區,此動作已被停用。
+		無法將&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;儲存回收納區,此動作已被停用。
 	</notification>
 	<notification name="NoCopyNoSelCopy">
-		無法複製你所選的,因為你無權複製物件 &apos;[OBJ_NAME]&apos;。
+		無法複製你所選的,因為你無權複製物件&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;。
 	</notification>
 	<notification name="NoTransNoSelCopy">
-		無法選取複製,因為物件 &apos;[OBJ_NAME]&apos; 不可轉移。
+		無法選取複製,因為物件&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;不可轉移。
 	</notification>
 	<notification name="NoTransNoCopy">
-		無法選取複製,因為物件 &apos;[OBJ_NAME]&apos; 不可轉移。
+		無法選取複製,因為物件&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;不可轉移。
 	</notification>
 	<notification name="NoPermsNoRemoval">
-		權限系統不允許從模擬器移除物件 &apos;[OBJ_NAME]&apos;。
+		權限系統不允許從模擬器移除物件&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;。
 	</notification>
 	<notification name="NoModNoSaveSelection">
-		無法儲存你所選的,因為你無權修改 &apos;[OBJ_NAME]&apos; 物件。
+		無法儲存你所選的,因為你無權修改&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;物件。
 	</notification>
 	<notification name="NoCopyNoSaveSelection">
-		無法儲存你所選的,因為物件 &apos;[OBJ_NAME]&apos; 不可複製。
+		無法儲存你所選的,因為物件&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;不可複製。
 	</notification>
 	<notification name="NoModNoTaking">
-		無法拿取你所選的,因為你無權修改 &apos;[OBJ_NAME]&apos; 物件。
+		無法取用你所選的,因為你無權修改物件&lt;nolink&gt;&apos;[OBJ_NAME]&apos;&lt;/nolink&gt;。
 	</notification>
 	<notification name="RezDestInternalError">
 		內部錯誤:未知的目的地類型。
diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml
index 24d8dc60cb..f8fd727145 100644
--- a/indra/newview/skins/default/xui/zh/strings.xml
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -5746,4 +5746,25 @@ http://secondlife.com/support 求助解決問題。
 	<string name="Mav_Details_MAV_UNKNOWN_VERSION">
 		物理形狀的版本不正確。 請設成正確的物理模型版本。
 	</string>
+	<string name="couldnt_resolve_host">
+		DNS無法解決主機名稱([HOSTNAME])。
+請確認你能夠連通 www.secondlife.com
+網站。  如能連通,但繼續看到這個錯誤,
+請到「支援」部分通報問題。
+	</string>
+	<string name="ssl_peer_certificate">
+		登入伺服器無法透過SSL自我確認。
+如果你繼續看到這個錯誤,請前往
+SecondLife.com網站的「支援」部分
+提報問題。
+	</string>
+	<string name="ssl_connect_error">
+		這通常意味你電腦的時鐘設定不正確。
+請到控制台確定時間和日期設定正確。
+並檢查確定你的網路和防火牆設定正確。
+如果你繼續看到這個錯誤,請前往SecondLife.com
+網站的「支援」部分提報問題。
+
+[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 知識庫]
+	</string>
 </strings>
-- 
cgit v1.2.3


From aa1d4c0dc9e1923d3233256b03c414cf1e9205fb Mon Sep 17 00:00:00 2001
From: eli <eli@lindenlab.com>
Date: Thu, 10 Jan 2019 16:53:31 -0800
Subject: FIX INTL-327 German misspellings

---
 .../newview/skins/default/xui/de/floater_pathfinding_console.xml  | 2 +-
 .../newview/skins/default/xui/de/floater_pathfinding_linksets.xml | 8 ++++----
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml
index 27c6b73967..2422e414e0 100644
--- a/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml
+++ b/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml
@@ -96,7 +96,7 @@
 			</combo_box>
 			<check_box label="Begehbare Objekte" name="show_walkables"/>
 			<check_box label="Materialvolumen" name="show_material_volumes"/>
-			<check_box label="Statische Hinternisse" name="show_static_obstacles"/>
+			<check_box label="Statische Hindernisse" name="show_static_obstacles"/>
 			<check_box label="Ausschlussvolumen" name="show_exclusion_volumes"/>
 			<check_box label="Wasserebene" name="show_water_plane"/>
 			<check_box label="Mit Röntgenblick" name="show_xray"/>
diff --git a/indra/newview/skins/default/xui/de/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/de/floater_pathfinding_linksets.xml
index a423f3efea..6729e242ac 100644
--- a/indra/newview/skins/default/xui/de/floater_pathfinding_linksets.xml
+++ b/indra/newview/skins/default/xui/de/floater_pathfinding_linksets.xml
@@ -61,10 +61,10 @@
 		Begehbar
 	</floater.string>
 	<floater.string name="linkset_use_static_obstacle">
-		Statisches Hinternis
+		Statisches Hindernis
 	</floater.string>
 	<floater.string name="linkset_use_dynamic_obstacle">
-		Bewegliches Hinternis
+		Bewegliches Hindernis
 	</floater.string>
 	<floater.string name="linkset_use_material_volume">
 		Materialvolumen
@@ -103,8 +103,8 @@
 		<combo_box name="filter_by_linkset_use">
 			<combo_box.item label="Nach Linkset-Nutzung filtern..." name="filter_by_linkset_use_none"/>
 			<combo_box.item label="Begehbar" name="filter_by_linkset_use_walkable"/>
-			<combo_box.item label="Statisches Hinternis" name="filter_by_linkset_use_static_obstacle"/>
-			<combo_box.item label="Bewegliches Hinternis" name="filter_by_linkset_use_dynamic_obstacle"/>
+			<combo_box.item label="Statisches Hindernis" name="filter_by_linkset_use_static_obstacle"/>
+			<combo_box.item label="Bewegliches Hindernis" name="filter_by_linkset_use_dynamic_obstacle"/>
 			<combo_box.item label="Materialvolumen" name="filter_by_linkset_use_material_volume"/>
 			<combo_box.item label="Ausschlussvolumen" name="filter_by_linkset_use_exclusion_volume"/>
 			<combo_box.item label="Bewegliches Phantom" name="filter_by_linkset_use_dynamic_phantom"/>
-- 
cgit v1.2.3


From 9c8584a3a7562810c83dd5e2d02e42e6d6870d96 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Fri, 11 Jan 2019 17:39:26 +0200
Subject: SL-10327 FIXED Scalable preview of mesh model is shown with black bar
 on top in the Upload Model menu

---
 indra/newview/app_settings/settings.xml               |  2 +-
 indra/newview/llfloatermodelpreview.cpp               | 19 +++++++++++++++++--
 .../skins/default/xui/en/floater_model_preview.xml    |  8 +++-----
 3 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 72301e7d14..82087fbe5d 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -8053,7 +8053,7 @@
   <key>PreviewRenderSize</key>  
   <map>
     <key>Comment</key>
-    <string>Resolution of the image rendered for the mesh upload preview</string>
+    <string>Resolution of the image rendered for the mesh upload preview (must be a power of 2)</string>
     <key>Persist</key>
     <integer>1</integer>
     <key>Type</key>
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index c86eed2192..2cc42460a5 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -427,8 +427,23 @@ void LLFloaterModelPreview::initModelPreview()
 	{
 		delete mModelPreview;
 	}
-	auto size = gSavedSettings.getS32("PreviewRenderSize");
-	mModelPreview = new LLModelPreview(size, size, this );
+
+	S32 tex_width = 512;
+	S32 tex_height = 512;
+
+	S32 max_width = llmin(gSavedSettings.getS32("PreviewRenderSize"), (S32)gPipeline.mScreenWidth);
+	S32 max_height = llmin(gSavedSettings.getS32("PreviewRenderSize"), (S32)gPipeline.mScreenHeight);
+	
+	while ((tex_width << 1) <= max_width)
+	{
+		tex_width <<= 1;
+	}
+	while ((tex_height << 1) <= max_height)
+	{
+		tex_height <<= 1;
+	}
+
+	mModelPreview = new LLModelPreview(tex_width, tex_height, this);
 	mModelPreview->setPreviewTarget(16.f);
 	mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelPreview::setDetails, this, _1, _2, _3, _4, _5));
 	mModelPreview->setModelUpdatedCallback(boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this, _1));
diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
index a07fe99aef..274e6e6c7a 100644
--- a/indra/newview/skins/default/xui/en/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -1490,7 +1490,6 @@ Analysed:
     name="right_panel"
     top="0"
     left="640"
-    background_visible="true"
     width="375">
     <text
       follows="left|top"
@@ -1510,7 +1509,6 @@ Analysed:
       name="right_upper_panel"
       top="8"
       left="60"
-      background_visible="true"
       width="315">
       <combo_box
         top_pad="3"
@@ -1586,7 +1584,7 @@ Analysed:
       layout="topleft"
       left="2"
       name="physics_explode_label"
-      top="85"
+      bottom_pad="2"
       width="150">
       Preview Spread:
     </text>
@@ -1594,8 +1592,8 @@ Analysed:
       name="physics_explode"
       follows="right|bottom"
       valign="center"
-      top="15"
-      left="80"
+      left="105"
+      top_delta="-3"
       min_val="0.0"
       max_val="3.0"
       height="20"
-- 
cgit v1.2.3


From 127ed9c67809b5ad169fbc971e800c7744363c57 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Mon, 14 Jan 2019 13:50:28 +0200
Subject: SL-10352 FIXED 'Search menus' disappears after entering and exiting
 mouselook view

---
 indra/newview/app_settings/settings.xml | 11 +++++++++++
 indra/newview/llstatusbar.cpp           |  4 ++--
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 82087fbe5d..8f7c4601e8 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -11530,6 +11530,17 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>MenuSearch</key>
+    <map>
+      <key>Comment</key>
+      <string>Show/hide 'Search menus' field</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+  </map>
     <key>GroupListShowIcons</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index b893e4a058..f3c270a97b 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -247,11 +247,11 @@ BOOL LLStatusBar::postBuild()
 	mFilterEdit = getChild<LLSearchEditor>( "search_menu_edit" );
 	mSearchPanel = getChild<LLPanel>( "menu_search_panel" );
 
-	//mSearchPanel->setVisible(gSavedSettings.getBOOL("MenuSearch"));
+	mSearchPanel->setVisible(gSavedSettings.getBOOL("MenuSearch"));
 	mFilterEdit->setKeystrokeCallback(boost::bind(&LLStatusBar::onUpdateFilterTerm, this));
 	mFilterEdit->setCommitCallback(boost::bind(&LLStatusBar::onUpdateFilterTerm, this));
 	collectSearchableItems();
-	//gSavedSettings.getControl("MenuSearch")->getCommitSignal()->connect(boost::bind(&LLStatusBar::updateMenuSearchVisibility, this, _2));
+	gSavedSettings.getControl("MenuSearch")->getCommitSignal()->connect(boost::bind(&LLStatusBar::updateMenuSearchVisibility, this, _2));
 
 	return TRUE;
 }
-- 
cgit v1.2.3


From 26fae750ba753f32f58bd56d297f2d98c5759e50 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Mon, 14 Jan 2019 22:04:44 +0200
Subject: SL-10291 Replace apr_mutex with standard C++11 functionality

---
 doc/contributions.txt                          |   1 +
 indra/llcommon/llapr.cpp                       |  79 +------------
 indra/llcommon/llapr.h                         |  57 ++--------
 indra/llcommon/llerror.cpp                     | 148 ++++---------------------
 indra/llcommon/llfixedbuffer.cpp               |   2 +-
 indra/llcommon/llmutex.cpp                     | 130 +++++++++++++---------
 indra/llcommon/llmutex.h                       |  85 +++++++++-----
 indra/llcommon/llthread.cpp                    |   6 +-
 indra/llcommon/lluuid.cpp                      |   2 +-
 indra/llcommon/llworkerthread.cpp              |   4 +-
 indra/llcorehttp/httpcommon.cpp                |   4 +-
 indra/llimage/llimage.cpp                      |   2 +-
 indra/llimage/llimageworker.cpp                |   2 +-
 indra/llmath/llvolumemgr.cpp                   |   4 +-
 indra/llmessage/llbuffer.cpp                   |   2 +-
 indra/llmessage/llproxy.cpp                    |   2 +-
 indra/llplugin/llpluginmessagepipe.cpp         |   4 +-
 indra/llplugin/llpluginprocessparent.cpp       |   4 +-
 indra/llvfs/llvfs.cpp                          |   2 +-
 indra/newview/llappviewer.cpp                  |   2 +-
 indra/newview/lldirpicker.cpp                  |   2 +-
 indra/newview/llfloaterconversationpreview.cpp |   2 +-
 indra/newview/llfloatermodelpreview.cpp        |   4 +-
 indra/newview/lllogchat.cpp                    |   6 +-
 indra/newview/llmeshrepository.cpp             |  14 +--
 indra/newview/lltexturecache.cpp               |   8 +-
 indra/newview/lltexturefetch.cpp               |   6 +-
 indra/newview/llviewermenufile.cpp             |   2 +-
 indra/newview/llwatchdog.cpp                   |   4 +-
 29 files changed, 221 insertions(+), 369 deletions(-)

diff --git a/doc/contributions.txt b/doc/contributions.txt
index 66323a38c6..6146689fb0 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -1070,6 +1070,7 @@ Nicky Dasmijn
     STORM-2010
 	STORM-2082
 	MAINT-6665
+	SL-10291
 	SL-10293
 Nicky Perian
 	OPEN-1
diff --git a/indra/llcommon/llapr.cpp b/indra/llcommon/llapr.cpp
index d353d06de2..29f0c7da9a 100644
--- a/indra/llcommon/llapr.cpp
+++ b/indra/llcommon/llapr.cpp
@@ -28,13 +28,12 @@
 
 #include "linden_common.h"
 #include "llapr.h"
+#include "llmutex.h"
 #include "apr_dso.h"
 #include "llthreadlocalstorage.h"
 
 apr_pool_t *gAPRPoolp = NULL; // Global APR memory pool
 LLVolatileAPRPool *LLAPRFile::sAPRFilePoolp = NULL ; //global volatile APR memory pool.
-apr_thread_mutex_t *gLogMutexp = NULL;
-apr_thread_mutex_t *gCallStacksLogMutexp = NULL;
 
 const S32 FULL_VOLATILE_APR_POOL = 1024 ; //number of references to LLVolatileAPRPool
 
@@ -48,10 +47,6 @@ void ll_init_apr()
 	if (!gAPRPoolp)
 	{
 		apr_pool_create(&gAPRPoolp, NULL);
-		
-		// Initialize the logging mutex
-		apr_thread_mutex_create(&gLogMutexp, APR_THREAD_MUTEX_UNNESTED, gAPRPoolp);
-		apr_thread_mutex_create(&gCallStacksLogMutexp, APR_THREAD_MUTEX_UNNESTED, gAPRPoolp);
 	}
 
 	if(!LLAPRFile::sAPRFilePoolp)
@@ -75,23 +70,6 @@ void ll_cleanup_apr()
 
 	LL_INFOS("APR") << "Cleaning up APR" << LL_ENDL;
 
-	if (gLogMutexp)
-	{
-		// Clean up the logging mutex
-
-		// All other threads NEED to be done before we clean up APR, so this is okay.
-		apr_thread_mutex_destroy(gLogMutexp);
-		gLogMutexp = NULL;
-	}
-	if (gCallStacksLogMutexp)
-	{
-		// Clean up the logging mutex
-
-		// All other threads NEED to be done before we clean up APR, so this is okay.
-		apr_thread_mutex_destroy(gCallStacksLogMutexp);
-		gCallStacksLogMutexp = NULL;
-	}
-
 	LLThreadLocalPointerBase::destroyAllThreadLocalStorage();
 
 	if (gAPRPoolp)
@@ -168,26 +146,19 @@ apr_pool_t* LLAPRPool::getAPRPool()
 LLVolatileAPRPool::LLVolatileAPRPool(BOOL is_local, apr_pool_t *parent, apr_size_t size, BOOL releasePoolFlag) 
 				  : LLAPRPool(parent, size, releasePoolFlag),
 				  mNumActiveRef(0),
-				  mNumTotalRef(0),
-				  mMutexPool(NULL),
-				  mMutexp(NULL)
+				  mNumTotalRef(0)
 {
 	//create mutex
 	if(!is_local) //not a local apr_pool, that is: shared by multiple threads.
 	{
-		apr_pool_create(&mMutexPool, NULL); // Create a pool for mutex
-		apr_thread_mutex_create(&mMutexp, APR_THREAD_MUTEX_UNNESTED, mMutexPool);
+		mMutexp.reset(new std::mutex());
 	}
 }
 
 LLVolatileAPRPool::~LLVolatileAPRPool()
 {
 	//delete mutex
-	if(mMutexp)
-	{
-		apr_thread_mutex_destroy(mMutexp);
-		apr_pool_destroy(mMutexPool);
-	}
+    mMutexp.reset();
 }
 
 //
@@ -201,7 +172,7 @@ apr_pool_t* LLVolatileAPRPool::getAPRPool()
 
 apr_pool_t* LLVolatileAPRPool::getVolatileAPRPool() 
 {	
-	LLScopedLock lock(mMutexp) ;
+	LLScopedLock lock(mMutexp.get()) ;
 
 	mNumTotalRef++ ;
 	mNumActiveRef++ ;
@@ -216,7 +187,7 @@ apr_pool_t* LLVolatileAPRPool::getVolatileAPRPool()
 
 void LLVolatileAPRPool::clearVolatileAPRPool() 
 {
-	LLScopedLock lock(mMutexp) ;
+    LLScopedLock lock(mMutexp.get());
 
 	if(mNumActiveRef > 0)
 	{
@@ -250,44 +221,6 @@ BOOL LLVolatileAPRPool::isFull()
 {
 	return mNumTotalRef > FULL_VOLATILE_APR_POOL ;
 }
-//---------------------------------------------------------------------
-//
-// LLScopedLock
-//
-LLScopedLock::LLScopedLock(apr_thread_mutex_t* mutex) : mMutex(mutex)
-{
-	if(mutex)
-	{
-		if(ll_apr_warn_status(apr_thread_mutex_lock(mMutex)))
-		{
-			mLocked = false;
-		}
-		else
-		{
-			mLocked = true;
-		}
-	}
-	else
-	{
-		mLocked = false;
-	}
-}
-
-LLScopedLock::~LLScopedLock()
-{
-	unlock();
-}
-
-void LLScopedLock::unlock()
-{
-	if(mLocked)
-	{
-		if(!ll_apr_warn_status(apr_thread_mutex_unlock(mMutex)))
-		{
-			mLocked = false;
-		}
-	}
-}
 
 //---------------------------------------------------------------------
 
diff --git a/indra/llcommon/llapr.h b/indra/llcommon/llapr.h
index 1ac5c4e9b2..73d1d180ef 100644
--- a/indra/llcommon/llapr.h
+++ b/indra/llcommon/llapr.h
@@ -36,15 +36,23 @@
 #include <boost/noncopyable.hpp>
 #include "llwin32headerslean.h"
 #include "apr_thread_proc.h"
-#include "apr_thread_mutex.h"
 #include "apr_getopt.h"
 #include "apr_signal.h"
 #include "apr_atomic.h"
 
 #include "llstring.h"
 
-extern LL_COMMON_API apr_thread_mutex_t* gLogMutexp;
-extern apr_thread_mutex_t* gCallStacksLogMutexp;
+#if LL_WINDOWS
+#pragma warning (push)
+#pragma warning (disable:4265)
+#endif
+// warning C4265: 'std::_Pad' : class has virtual functions, but destructor is not virtual
+
+#include <mutex>
+
+#if LL_WINDOWS
+#pragma warning (pop)
+#endif
 
 struct apr_dso_handle_t;
 /**
@@ -120,50 +128,9 @@ private:
 	S32 mNumActiveRef ; //number of active pointers pointing to the apr_pool.
 	S32 mNumTotalRef ;  //number of total pointers pointing to the apr_pool since last creating.  
 
-	apr_thread_mutex_t *mMutexp;
-	apr_pool_t         *mMutexPool;
+	std::unique_ptr<std::mutex> mMutexp;
 } ;
 
-/** 
- * @class LLScopedLock
- * @brief Small class to help lock and unlock mutexes.
- *
- * This class is used to have a stack level lock once you already have
- * an apr mutex handy. The constructor handles the lock, and the
- * destructor handles the unlock. Instances of this class are
- * <b>not</b> thread safe.
- */
-class LL_COMMON_API LLScopedLock : private boost::noncopyable
-{
-public:
-	/**
-	 * @brief Constructor which accepts a mutex, and locks it.
-	 *
-	 * @param mutex An allocated APR mutex. If you pass in NULL,
-	 * this wrapper will not lock.
-	 */
-	LLScopedLock(apr_thread_mutex_t* mutex);
-
-	/**
-	 * @brief Destructor which unlocks the mutex if still locked.
-	 */
-	~LLScopedLock();
-
-	/** 
-	 * @brief Check lock.
-	 */
-	bool isLocked() const { return mLocked; }
-
-	/** 
-	 * @brief This method unlocks the mutex.
-	 */
-	void unlock();
-
-protected:
-	bool mLocked;
-	apr_thread_mutex_t* mMutex;
-};
-
 template <typename Type> class LLAtomic32
 {
 public:
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index 17d8164289..3db6705985 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -1096,6 +1096,9 @@ namespace
 }
 
 namespace {
+	LLMutex gLogMutex;
+	LLMutex gCallStacksLogMutex;
+
 	bool checkLevelMap(const LevelMap& map, const std::string& key,
 						LLError::ELevel& level)
 	{
@@ -1135,56 +1138,6 @@ namespace {
 		}
 		return found_level;
 	}
-	
-	class LogLock
-	{
-	public:
-		LogLock();
-		~LogLock();
-		bool ok() const { return mOK; }
-	private:
-		bool mLocked;
-		bool mOK;
-	};
-	
-	LogLock::LogLock()
-		: mLocked(false), mOK(false)
-	{
-		if (!gLogMutexp)
-		{
-			mOK = true;
-			return;
-		}
-		
-		const int MAX_RETRIES = 5;
-		for (int attempts = 0; attempts < MAX_RETRIES; ++attempts)
-		{
-			apr_status_t s = apr_thread_mutex_trylock(gLogMutexp);
-			if (!APR_STATUS_IS_EBUSY(s))
-			{
-				mLocked = true;
-				mOK = true;
-				return;
-			}
-
-			ms_sleep(1);
-			//apr_thread_yield();
-				// Just yielding won't necessarily work, I had problems with
-				// this on Linux - doug 12/02/04
-		}
-
-		// We're hosed, we can't get the mutex.  Blah.
-		std::cerr << "LogLock::LogLock: failed to get mutex for log"
-					<< std::endl;
-	}
-	
-	LogLock::~LogLock()
-	{
-		if (mLocked)
-		{
-			apr_thread_mutex_unlock(gLogMutexp);
-		}
-	}
 }
 
 namespace LLError
@@ -1192,8 +1145,8 @@ namespace LLError
 
 	bool Log::shouldLog(CallSite& site)
 	{
-		LogLock lock;
-		if (!lock.ok())
+		LLMutexTrylock lock(&gLogMutex, 5);
+		if (!lock.isLocked())
 		{
 			return false;
 		}
@@ -1243,11 +1196,11 @@ namespace LLError
 
 	std::ostringstream* Log::out()
 	{
-		LogLock lock;
+		LLMutexTrylock lock(&gLogMutex,5);
 		// If we hit a logging request very late during shutdown processing,
 		// when either of the relevant LLSingletons has already been deleted,
 		// DO NOT resurrect them.
-		if (lock.ok() && ! (Settings::wasDeleted() || Globals::wasDeleted()))
+		if (lock.isLocked() && ! (Settings::wasDeleted() || Globals::wasDeleted()))
 		{
 			Globals* g = Globals::getInstance();
 
@@ -1263,8 +1216,8 @@ namespace LLError
 
 	void Log::flush(std::ostringstream* out, char* message)
 	{
-		LogLock lock;
-		if (!lock.ok())
+		LLMutexTrylock lock(&gLogMutex,5);
+		if (!lock.isLocked())
 		{
 			return;
 		}
@@ -1303,8 +1256,8 @@ namespace LLError
 
 	void Log::flush(std::ostringstream* out, const CallSite& site)
 	{
-		LogLock lock;
-		if (!lock.ok())
+		LLMutexTrylock lock(&gLogMutex,5);
+		if (!lock.isLocked())
 		{
 			return;
 		}
@@ -1469,69 +1422,6 @@ namespace LLError
 	char** LLCallStacks::sBuffer = NULL ;
 	S32    LLCallStacks::sIndex  = 0 ;
 
-#define SINGLE_THREADED 1
-
-	class CallStacksLogLock
-	{
-	public:
-		CallStacksLogLock();
-		~CallStacksLogLock();
-
-#if SINGLE_THREADED
-		bool ok() const { return true; }
-#else
-		bool ok() const { return mOK; }
-	private:
-		bool mLocked;
-		bool mOK;
-#endif
-	};
-	
-#if SINGLE_THREADED
-	CallStacksLogLock::CallStacksLogLock()
-	{
-	}
-	CallStacksLogLock::~CallStacksLogLock()
-	{
-	}
-#else
-	CallStacksLogLock::CallStacksLogLock()
-		: mLocked(false), mOK(false)
-	{
-		if (!gCallStacksLogMutexp)
-		{
-			mOK = true;
-			return;
-		}
-		
-		const int MAX_RETRIES = 5;
-		for (int attempts = 0; attempts < MAX_RETRIES; ++attempts)
-		{
-			apr_status_t s = apr_thread_mutex_trylock(gCallStacksLogMutexp);
-			if (!APR_STATUS_IS_EBUSY(s))
-			{
-				mLocked = true;
-				mOK = true;
-				return;
-			}
-
-			ms_sleep(1);
-		}
-
-		// We're hosed, we can't get the mutex.  Blah.
-		std::cerr << "CallStacksLogLock::CallStacksLogLock: failed to get mutex for log"
-					<< std::endl;
-	}
-	
-	CallStacksLogLock::~CallStacksLogLock()
-	{
-		if (mLocked)
-		{
-			apr_thread_mutex_unlock(gCallStacksLogMutexp);
-		}
-	}
-#endif
-
 	//static
    void LLCallStacks::allocateStackBuffer()
    {
@@ -1560,8 +1450,8 @@ namespace LLError
    //static
    void LLCallStacks::push(const char* function, const int line)
    {
-	   CallStacksLogLock lock;
-       if (!lock.ok())
+       LLMutexTrylock lock(&gCallStacksLogMutex, 5);
+       if (!lock.isLocked())
        {
            return;
        }
@@ -1595,8 +1485,8 @@ namespace LLError
    //static
    void LLCallStacks::end(std::ostringstream* _out)
    {
-	   CallStacksLogLock lock;
-       if (!lock.ok())
+       LLMutexTrylock lock(&gCallStacksLogMutex, 5);
+       if (!lock.isLocked())
        {
            return;
        }
@@ -1617,8 +1507,8 @@ namespace LLError
    //static
    void LLCallStacks::print()
    {
-	   CallStacksLogLock lock;
-       if (!lock.ok())
+       LLMutexTrylock lock(&gCallStacksLogMutex, 5);
+       if (!lock.isLocked())
        {
            return;
        }
@@ -1655,8 +1545,8 @@ namespace LLError
 
 bool debugLoggingEnabled(const std::string& tag)
 {
-    LogLock lock;
-    if (!lock.ok())
+    LLMutexTrylock lock(&gLogMutex, 5);
+    if (!lock.isLocked())
     {
         return false;
     }
diff --git a/indra/llcommon/llfixedbuffer.cpp b/indra/llcommon/llfixedbuffer.cpp
index d394f179fb..bd4db8be84 100644
--- a/indra/llcommon/llfixedbuffer.cpp
+++ b/indra/llcommon/llfixedbuffer.cpp
@@ -31,7 +31,7 @@
 LLFixedBuffer::LLFixedBuffer(const U32 max_lines)
 	: LLLineBuffer(),
 	  mMaxLines(max_lines),
-	  mMutex(NULL)
+	  mMutex()
 {
 	mTimer.reset();
 }
diff --git a/indra/llcommon/llmutex.cpp b/indra/llcommon/llmutex.cpp
index 9c13ef9e30..cf84e50953 100644
--- a/indra/llcommon/llmutex.cpp
+++ b/indra/llcommon/llmutex.cpp
@@ -30,41 +30,19 @@
 
 #include "llmutex.h"
 #include "llthread.h"
+#include "lltimer.h"
 
 //============================================================================
 
-LLMutex::LLMutex(apr_pool_t *poolp) :
-	mAPRMutexp(NULL), mCount(0), mLockingThread(NO_THREAD)
+LLMutex::LLMutex() :
+ mCount(0),
+ mLockingThread(NO_THREAD)
 {
-	//if (poolp)
-	//{
-	//	mIsLocalPool = FALSE;
-	//	mAPRPoolp = poolp;
-	//}
-	//else
-	{
-		mIsLocalPool = TRUE;
-		apr_pool_create(&mAPRPoolp, NULL); // Create a subpool for this thread
-	}
-	apr_thread_mutex_create(&mAPRMutexp, APR_THREAD_MUTEX_UNNESTED, mAPRPoolp);
 }
 
 
 LLMutex::~LLMutex()
 {
-#if MUTEX_DEBUG
-	//bad assertion, the subclass LLSignal might be "locked", and that's OK
-	//llassert_always(!isLocked()); // better not be locked!
-#endif
-	if (ll_apr_is_initialized())
-	{
-		apr_thread_mutex_destroy(mAPRMutexp);
-		if (mIsLocalPool)
-		{
-			apr_pool_destroy(mAPRPoolp);
-		}
-	}
-	mAPRMutexp = NULL;
 }
 
 
@@ -76,7 +54,7 @@ void LLMutex::lock()
 		return;
 	}
 	
-	apr_thread_mutex_lock(mAPRMutexp);
+	mMutex.lock();
 	
 #if MUTEX_DEBUG
 	// Have to have the lock before we can access the debug info
@@ -106,19 +84,18 @@ void LLMutex::unlock()
 #endif
 
 	mLockingThread = NO_THREAD;
-	apr_thread_mutex_unlock(mAPRMutexp);
+	mMutex.unlock();
 }
 
 bool LLMutex::isLocked()
 {
-	apr_status_t status = apr_thread_mutex_trylock(mAPRMutexp);
-	if (APR_STATUS_IS_EBUSY(status))
+	if (!mMutex.try_lock())
 	{
 		return true;
 	}
 	else
 	{
-		apr_thread_mutex_unlock(mAPRMutexp);
+		mMutex.unlock();
 		return false;
 	}
 }
@@ -141,8 +118,7 @@ bool LLMutex::trylock()
 		return true;
 	}
 	
-	apr_status_t status(apr_thread_mutex_trylock(mAPRMutexp));
-	if (APR_STATUS_IS_EBUSY(status))
+	if (!mMutex.try_lock())
 	{
 		return false;
 	}
@@ -161,45 +137,95 @@ bool LLMutex::trylock()
 
 //============================================================================
 
-LLCondition::LLCondition(apr_pool_t *poolp) :
-	LLMutex(poolp)
+LLCondition::LLCondition() :
+	LLMutex()
 {
-	// base class (LLMutex) has already ensured that mAPRPoolp is set up.
-
-	apr_thread_cond_create(&mAPRCondp, mAPRPoolp);
 }
 
 
 LLCondition::~LLCondition()
 {
-	apr_thread_cond_destroy(mAPRCondp);
-	mAPRCondp = NULL;
 }
 
 
 void LLCondition::wait()
 {
-	if (!isLocked())
-	{ //mAPRMutexp MUST be locked before calling apr_thread_cond_wait
-		apr_thread_mutex_lock(mAPRMutexp);
-#if MUTEX_DEBUG
-		// avoid asserts on destruction in non-release builds
-		U32 id = LLThread::currentID();
-		mIsLocked[id] = TRUE;
-#endif
-	}
-	apr_thread_cond_wait(mAPRCondp, mAPRMutexp);
+	std::unique_lock< std::mutex > lock(mMutex);
+	mCond.wait(lock);
 }
 
 void LLCondition::signal()
 {
-	apr_thread_cond_signal(mAPRCondp);
+	mCond.notify_one();
 }
 
 void LLCondition::broadcast()
 {
-	apr_thread_cond_broadcast(mAPRCondp);
+	mCond.notify_all();
 }
 
 
+
+LLMutexTrylock::LLMutexTrylock(LLMutex* mutex)
+    : mMutex(mutex),
+    mLocked(false)
+{
+    if (mMutex)
+        mLocked = mMutex->trylock();
+}
+
+LLMutexTrylock::LLMutexTrylock(LLMutex* mutex, U32 aTries, U32 delay_ms)
+    : mMutex(mutex),
+    mLocked(false)
+{
+    if (!mMutex)
+        return;
+
+    for (U32 i = 0; i < aTries; ++i)
+    {
+        mLocked = mMutex->trylock();
+        if (mLocked)
+            break;
+        ms_sleep(delay_ms);
+    }
+}
+
+LLMutexTrylock::~LLMutexTrylock()
+{
+    if (mMutex && mLocked)
+        mMutex->unlock();
+}
+
+
+//---------------------------------------------------------------------
+//
+// LLScopedLock
+//
+LLScopedLock::LLScopedLock(std::mutex* mutex) : mMutex(mutex)
+{
+	if(mutex)
+	{
+		mutex->lock();
+		mLocked = true;
+	}
+	else
+	{
+		mLocked = false;
+	}
+}
+
+LLScopedLock::~LLScopedLock()
+{
+	unlock();
+}
+
+void LLScopedLock::unlock()
+{
+	if(mLocked)
+	{
+		mMutex->unlock();
+		mLocked = false;
+	}
+}
+
 //============================================================================
diff --git a/indra/llcommon/llmutex.h b/indra/llcommon/llmutex.h
index ea535cee86..f841d7f950 100644
--- a/indra/llcommon/llmutex.h
+++ b/indra/llcommon/llmutex.h
@@ -28,6 +28,19 @@
 #define LL_LLMUTEX_H
 
 #include "stdtypes.h"
+#include <boost/noncopyable.hpp>
+
+#if LL_WINDOWS
+#pragma warning (push)
+#pragma warning (disable:4265)
+#endif
+// 'std::_Pad' : class has virtual functions, but destructor is not virtual
+#include <mutex>
+#include <condition_variable>
+
+#if LL_WINDOWS
+#pragma warning (pop)
+#endif
 
 //============================================================================
 
@@ -37,10 +50,6 @@
 #include <map>
 #endif
 
-struct apr_thread_mutex_t;
-struct apr_pool_t;
-struct apr_thread_cond_t;
-
 class LL_COMMON_API LLMutex
 {
 public:
@@ -49,7 +58,7 @@ public:
 		NO_THREAD = 0xFFFFFFFF
 	} e_locking_thread;
 
-	LLMutex(apr_pool_t *apr_poolp = NULL); // NULL pool constructs a new pool for the mutex
+	LLMutex();
 	virtual ~LLMutex();
 	
 	void lock();		// blocks
@@ -60,13 +69,10 @@ public:
 	U32 lockingThread() const; //get ID of locking thread
 	
 protected:
-	apr_thread_mutex_t *mAPRMutexp;
+	std::mutex			mMutex;
 	mutable U32			mCount;
 	mutable U32			mLockingThread;
 	
-	apr_pool_t			*mAPRPoolp;
-	BOOL				mIsLocalPool;
-	
 #if MUTEX_DEBUG
 	std::map<U32, BOOL> mIsLocked;
 #endif
@@ -76,7 +82,7 @@ protected:
 class LL_COMMON_API LLCondition : public LLMutex
 {
 public:
-	LLCondition(apr_pool_t* apr_poolp); // Defaults to global pool, could use the thread pool as well.
+	LLCondition();
 	~LLCondition();
 	
 	void wait();		// blocks
@@ -84,7 +90,7 @@ public:
 	void broadcast();
 	
 protected:
-	apr_thread_cond_t* mAPRCondp;
+	std::condition_variable mCond;
 };
 
 class LLMutexLock
@@ -119,19 +125,9 @@ private:
 class LLMutexTrylock
 {
 public:
-	LLMutexTrylock(LLMutex* mutex)
-		: mMutex(mutex),
-		  mLocked(false)
-	{
-		if (mMutex)
-			mLocked = mMutex->trylock();
-	}
-
-	~LLMutexTrylock()
-	{
-		if (mMutex && mLocked)
-			mMutex->unlock();
-	}
+	LLMutexTrylock(LLMutex* mutex);
+	LLMutexTrylock(LLMutex* mutex, U32 aTries, U32 delay_ms = 10);
+	~LLMutexTrylock();
 
 	bool isLocked() const
 	{
@@ -142,4 +138,43 @@ private:
 	LLMutex*	mMutex;
 	bool		mLocked;
 };
-#endif // LL_LLTHREAD_H
+
+/**
+* @class LLScopedLock
+* @brief Small class to help lock and unlock mutexes.
+*
+* The constructor handles the lock, and the destructor handles
+* the unlock. Instances of this class are <b>not</b> thread safe.
+*/
+class LL_COMMON_API LLScopedLock : private boost::noncopyable
+{
+public:
+    /**
+    * @brief Constructor which accepts a mutex, and locks it.
+    *
+    * @param mutex An allocated mutex. If you pass in NULL,
+    * this wrapper will not lock.
+    */
+    LLScopedLock(std::mutex* mutex);
+
+    /**
+    * @brief Destructor which unlocks the mutex if still locked.
+    */
+    ~LLScopedLock();
+
+    /**
+    * @brief Check lock.
+    */
+    bool isLocked() const { return mLocked; }
+
+    /**
+    * @brief This method unlocks the mutex.
+    */
+    void unlock();
+
+protected:
+    bool mLocked;
+    std::mutex* mMutex;
+};
+
+#endif // LL_LLMUTEX_H
diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp
index f066e9a4cd..860415bb22 100644
--- a/indra/llcommon/llthread.cpp
+++ b/indra/llcommon/llthread.cpp
@@ -186,8 +186,8 @@ LLThread::LLThread(const std::string& name, apr_pool_t *poolp) :
         mIsLocalPool = TRUE;
         apr_pool_create(&mAPRPoolp, NULL); // Create a subpool for this thread
     }
-    mRunCondition = new LLCondition(mAPRPoolp);
-    mDataLock = new LLMutex(mAPRPoolp);
+    mRunCondition = new LLCondition();
+    mDataLock = new LLMutex();
     mLocalAPRFilePoolp = NULL ;
 }
 
@@ -413,7 +413,7 @@ void LLThreadSafeRefCount::initThreadSafeRefCount()
 {
     if (!sMutex)
     {
-        sMutex = new LLMutex(0);
+        sMutex = new LLMutex();
     }
 }
 
diff --git a/indra/llcommon/lluuid.cpp b/indra/llcommon/lluuid.cpp
index d4af2c6b01..8f33d789eb 100644
--- a/indra/llcommon/lluuid.cpp
+++ b/indra/llcommon/lluuid.cpp
@@ -738,7 +738,7 @@ void LLUUID::getCurrentTime(uuid_time_t *timestamp)
       getSystemTime(&time_last);
       uuids_this_tick = uuids_per_tick;
       init = TRUE;
-	  mMutex = new LLMutex(NULL);
+	  mMutex = new LLMutex();
    }
 
    uuid_time_t time_now = {0,0};
diff --git a/indra/llcommon/llworkerthread.cpp b/indra/llcommon/llworkerthread.cpp
index 4c197dc1d6..4b91b2caca 100644
--- a/indra/llcommon/llworkerthread.cpp
+++ b/indra/llcommon/llworkerthread.cpp
@@ -37,7 +37,7 @@
 LLWorkerThread::LLWorkerThread(const std::string& name, bool threaded, bool should_pause) :
 	LLQueuedThread(name, threaded, should_pause)
 {
-	mDeleteMutex = new LLMutex(NULL);
+	mDeleteMutex = new LLMutex();
 
 	if(!mLocalAPRFilePoolp)
 	{
@@ -204,7 +204,7 @@ LLWorkerClass::LLWorkerClass(LLWorkerThread* workerthread, const std::string& na
 	  mWorkerClassName(name),
 	  mRequestHandle(LLWorkerThread::nullHandle()),
 	  mRequestPriority(LLWorkerThread::PRIORITY_NORMAL),
-	  mMutex(NULL),
+	  mMutex(),
 	  mWorkFlags(0)
 {
 	if (!mWorkerThread)
diff --git a/indra/llcorehttp/httpcommon.cpp b/indra/llcorehttp/httpcommon.cpp
index 1829062af6..7c93c54cdf 100644
--- a/indra/llcorehttp/httpcommon.cpp
+++ b/indra/llcorehttp/httpcommon.cpp
@@ -333,7 +333,7 @@ LLMutex *getCurlMutex()
 
     if (!sHandleMutexp)
     {
-        sHandleMutexp = new LLMutex(NULL);
+        sHandleMutexp = new LLMutex();
     }
 
     return sHandleMutexp;
@@ -389,7 +389,7 @@ void initialize()
     S32 mutex_count = CRYPTO_num_locks();
     for (S32 i = 0; i < mutex_count; i++)
     {
-        sSSLMutex.push_back(LLMutex_ptr(new LLMutex(NULL)));
+        sSSLMutex.push_back(LLMutex_ptr(new LLMutex()));
     }
     CRYPTO_set_id_callback(&ssl_thread_id);
     CRYPTO_set_locking_callback(&ssl_locking_callback);
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index 1a4dd2ca99..680fbf548f 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -594,7 +594,7 @@ void LLImage::initClass(bool use_new_byte_range, S32 minimal_reverse_byte_range_
 {
 	sUseNewByteRange = use_new_byte_range;
     sMinimalReverseByteRangePercent = minimal_reverse_byte_range_percent;
-	sMutex = new LLMutex(NULL);
+	sMutex = new LLMutex();
 }
 
 //static
diff --git a/indra/llimage/llimageworker.cpp b/indra/llimage/llimageworker.cpp
index 4875fe7001..5f42fba866 100644
--- a/indra/llimage/llimageworker.cpp
+++ b/indra/llimage/llimageworker.cpp
@@ -35,7 +35,7 @@
 LLImageDecodeThread::LLImageDecodeThread(bool threaded)
 	: LLQueuedThread("imagedecode", threaded)
 {
-	mCreationMutex = new LLMutex(getAPRPool());
+	mCreationMutex = new LLMutex();
 }
 
 //virtual 
diff --git a/indra/llmath/llvolumemgr.cpp b/indra/llmath/llvolumemgr.cpp
index 3b8f08e0c6..89cdb1c6b9 100644
--- a/indra/llmath/llvolumemgr.cpp
+++ b/indra/llmath/llvolumemgr.cpp
@@ -48,7 +48,7 @@ LLVolumeMgr::LLVolumeMgr()
 {
 	// the LLMutex magic interferes with easy unit testing,
 	// so you now must manually call useMutex() to use it
-	//mDataMutex = new LLMutex(gAPRPoolp);
+	//mDataMutex = new LLMutex();
 }
 
 LLVolumeMgr::~LLVolumeMgr()
@@ -214,7 +214,7 @@ void LLVolumeMgr::useMutex()
 { 
 	if (!mDataMutex)
 	{
-		mDataMutex = new LLMutex(gAPRPoolp);
+		mDataMutex = new LLMutex();
 	}
 }
 
diff --git a/indra/llmessage/llbuffer.cpp b/indra/llmessage/llbuffer.cpp
index d07d9980c3..1a0eceba0f 100644
--- a/indra/llmessage/llbuffer.cpp
+++ b/indra/llmessage/llbuffer.cpp
@@ -265,7 +265,7 @@ void LLBufferArray::setThreaded(bool threaded)
 	{
 		if(!mMutexp)
 		{
-			mMutexp = new LLMutex(NULL);
+			mMutexp = new LLMutex();
 		}
 	}
 	else
diff --git a/indra/llmessage/llproxy.cpp b/indra/llmessage/llproxy.cpp
index 537efa69d8..5730a36267 100644
--- a/indra/llmessage/llproxy.cpp
+++ b/indra/llmessage/llproxy.cpp
@@ -48,7 +48,7 @@ static void tcp_close_channel(LLSocket::ptr_t* handle_ptr); // Close an open TCP
 
 LLProxy::LLProxy():
 		mHTTPProxyEnabled(false),
-		mProxyMutex(NULL),
+		mProxyMutex(),
 		mUDPProxy(),
 		mTCPProxy(),
 		mHTTPProxy(),
diff --git a/indra/llplugin/llpluginmessagepipe.cpp b/indra/llplugin/llpluginmessagepipe.cpp
index 9468696507..9766e1bfed 100644
--- a/indra/llplugin/llpluginmessagepipe.cpp
+++ b/indra/llplugin/llpluginmessagepipe.cpp
@@ -92,8 +92,8 @@ void LLPluginMessagePipeOwner::killMessagePipe(void)
 }
 
 LLPluginMessagePipe::LLPluginMessagePipe(LLPluginMessagePipeOwner *owner, LLSocket::ptr_t socket):
-	mInputMutex(gAPRPoolp),
-	mOutputMutex(gAPRPoolp),
+	mInputMutex(),
+	mOutputMutex(),
 	mOutputStartIndex(0),
 	mOwner(owner),
 	mSocket(socket)
diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index 0a8e58ac90..eb6cb1b503 100644
--- a/indra/llplugin/llpluginprocessparent.cpp
+++ b/indra/llplugin/llpluginprocessparent.cpp
@@ -80,11 +80,11 @@ protected:
 };
 
 LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner):
-	mIncomingQueueMutex(gAPRPoolp)
+	mIncomingQueueMutex()
 {
 	if(!sInstancesMutex)
 	{
-		sInstancesMutex = new LLMutex(gAPRPoolp);
+		sInstancesMutex = new LLMutex();
 	}
 	
 	mOwner = owner;
diff --git a/indra/llvfs/llvfs.cpp b/indra/llvfs/llvfs.cpp
index d5bd1834c2..617056d94d 100644
--- a/indra/llvfs/llvfs.cpp
+++ b/indra/llvfs/llvfs.cpp
@@ -234,7 +234,7 @@ LLVFS::LLVFS(const std::string& index_filename, const std::string& data_filename
 	mDataFP(NULL),
 	mIndexFP(NULL)
 {
-	mDataMutex = new LLMutex(0);
+	mDataMutex = new LLMutex();
 
 	S32 i;
 	for (i = 0; i < VFSLOCK_COUNT; i++)
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 7c79cc7ddf..f8fa06b527 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -2148,7 +2148,7 @@ bool LLAppViewer::initThreads()
 
 	if (LLTrace::BlockTimer::sLog || LLTrace::BlockTimer::sMetricLog)
 	{
-		LLTrace::BlockTimer::setLogLock(new LLMutex(NULL));
+		LLTrace::BlockTimer::setLogLock(new LLMutex());
 		mFastTimerLogThread = new LLFastTimerLogThread(LLTrace::BlockTimer::sLogName);
 		mFastTimerLogThread->start();
 	}
diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp
index 5443afe60c..b8e6e81ee6 100644
--- a/indra/newview/lldirpicker.cpp
+++ b/indra/newview/lldirpicker.cpp
@@ -315,7 +315,7 @@ void LLDirPickerThread::run()
 //static
 void LLDirPickerThread::initClass()
 {
-	sMutex = new LLMutex(NULL);
+	sMutex = new LLMutex();
 }
 
 //static
diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp
index b48ecc8f31..66198b3bf6 100644
--- a/indra/newview/llfloaterconversationpreview.cpp
+++ b/indra/newview/llfloaterconversationpreview.cpp
@@ -46,7 +46,7 @@ LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_i
 	mPageSize(gSavedSettings.getS32("ConversationHistoryPageSize")),
 	mAccountName(session_id[LL_FCP_ACCOUNT_NAME]),
 	mCompleteName(session_id[LL_FCP_COMPLETE_NAME]),
-	mMutex(NULL),
+	mMutex(),
 	mShowHistory(false),
 	mMessages(NULL),
 	mHistoryThreadsBusy(false),
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 2cc42460a5..616bee84fd 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -266,7 +266,7 @@ mCalculateBtn(NULL)
 	sInstance = this;
 	mLastMouseX = 0;
 	mLastMouseY = 0;
-	mStatusLock = new LLMutex(NULL);
+	mStatusLock = new LLMutex();
 	mModelPreview = NULL;
 
 	mLODMode[LLModel::LOD_HIGH] = 0;
@@ -1265,7 +1265,7 @@ void LLFloaterModelPreview::onMouseCaptureLostModelPreview(LLMouseHandler* handl
 //-----------------------------------------------------------------------------
 
 LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
-: LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE), LLMutex(NULL)
+: LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE), LLMutex()
 , mLodsQuery()
 , mLodsWithParsingError()
 , mPelvisZOffset( 0.0f )
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index c535fc1cdf..c9889667b4 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -516,7 +516,7 @@ LLMutex* LLLogChat::historyThreadsMutex()
 {
 	if (sHistoryThreadsMutex == NULL)
 	{
-		sHistoryThreadsMutex = new LLMutex(NULL);
+		sHistoryThreadsMutex = new LLMutex();
 	}
 	return sHistoryThreadsMutex;
 }
@@ -1012,8 +1012,8 @@ void LLDeleteHistoryThread::run()
 
 LLActionThread::LLActionThread(const std::string& name)
 	: LLThread(name),
-	mMutex(NULL),
-	mRunCondition(NULL),
+	mMutex(),
+	mRunCondition(),
 	mFinished(false)
 {
 }
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index f32dad7f55..a6002bd57f 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -830,9 +830,9 @@ LLMeshRepoThread::LLMeshRepoThread()
 {
 	LLAppCoreHttp & app_core_http(LLAppViewer::instance()->getAppCoreHttp());
 
-	mMutex = new LLMutex(NULL);
-	mHeaderMutex = new LLMutex(NULL);
-	mSignal = new LLCondition(NULL);
+	mMutex = new LLMutex();
+	mHeaderMutex = new LLMutex();
+	mSignal = new LLCondition();
 	mHttpRequest = new LLCore::HttpRequest;
 	mHttpOptions = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions);
 	mHttpOptions->setTransferTimeout(SMALL_MESH_XFER_TIMEOUT);
@@ -2039,7 +2039,7 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data,
 	mUploadSkin = upload_skin;
 	mUploadJoints = upload_joints;
     mLockScaleIfJointPosition = lock_scale_if_joint_position;
-	mMutex = new LLMutex(NULL);
+	mMutex = new LLMutex();
 	mPendingUploads = 0;
 	mFinished = false;
 	mOrigin = gAgent.getPositionAgent();
@@ -3446,7 +3446,7 @@ LLMeshRepository::LLMeshRepository()
 
 void LLMeshRepository::init()
 {
-	mMeshMutex = new LLMutex(NULL);
+	mMeshMutex = new LLMutex();
 	
 	LLConvexDecomposition::getInstance()->initSystem();
 
@@ -4588,8 +4588,8 @@ LLPhysicsDecomp::LLPhysicsDecomp()
 	mQuitting = false;
 	mDone = false;
 
-	mSignal = new LLCondition(NULL);
-	mMutex = new LLMutex(NULL);
+	mSignal = new LLCondition();
+	mMutex = new LLMutex();
 }
 
 LLPhysicsDecomp::~LLPhysicsDecomp()
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index eb4b914e18..e5af47ab6c 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -825,10 +825,10 @@ void LLTextureCacheWorker::endWork(S32 param, bool aborted)
 
 LLTextureCache::LLTextureCache(bool threaded)
 	: LLWorkerThread("TextureCache", threaded),
-	  mWorkersMutex(NULL),
-	  mHeaderMutex(NULL),
-	  mListMutex(NULL),
-	  mFastCacheMutex(NULL),
+	  mWorkersMutex(),
+	  mHeaderMutex(),
+	  mListMutex(),
+	  mFastCacheMutex(),
 	  mHeaderAPRFile(NULL),
 	  mReadOnly(TRUE), //do not allow to change the texture cache until setReadOnly() is called.
 	  mTexturesSizeTotal(0),
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 1f69939c46..ca401f5c17 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -925,7 +925,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
 	  mCanUseHTTP(true),
 	  mRetryAttempt(0),
 	  mActiveCount(0),
-	  mWorkMutex(NULL),
+	  mWorkMutex(),
 	  mFirstPacket(0),
 	  mLastPacket(-1),
 	  mTotalPackets(0),
@@ -2543,8 +2543,8 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image
 	  mDebugPause(FALSE),
 	  mPacketCount(0),
 	  mBadPacketCount(0),
-	  mQueueMutex(getAPRPool()),
-	  mNetworkQueueMutex(getAPRPool()),
+	  mQueueMutex(),
+	  mNetworkQueueMutex(),
 	  mTextureCache(cache),
 	  mImageDecodeThread(imagedecodethread),
 	  mTextureBandwidth(0),
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index d2a5578568..a9a91b158b 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -175,7 +175,7 @@ void LLFilePickerThread::run()
 //static
 void LLFilePickerThread::initClass()
 {
-	sMutex = new LLMutex(NULL);
+	sMutex = new LLMutex();
 }
 
 //static
diff --git a/indra/newview/llwatchdog.cpp b/indra/newview/llwatchdog.cpp
index 2782cd9545..dd6c77ca7d 100644
--- a/indra/newview/llwatchdog.cpp
+++ b/indra/newview/llwatchdog.cpp
@@ -155,7 +155,7 @@ void LLWatchdogTimeout::ping(const std::string& state)
 
 // LLWatchdog
 LLWatchdog::LLWatchdog() :
-	mSuspectsAccessMutex(NULL),
+	mSuspectsAccessMutex(),
 	mTimer(NULL),
 	mLastClockCount(0),
 	mKillerCallback(&default_killer_callback)
@@ -185,7 +185,7 @@ void LLWatchdog::init(killer_event_callback func)
 	mKillerCallback = func;
 	if(!mSuspectsAccessMutex && !mTimer)
 	{
-		mSuspectsAccessMutex = new LLMutex(NULL);
+		mSuspectsAccessMutex = new LLMutex();
 		mTimer = new LLWatchdogTimerThread();
 		mTimer->setSleepTime(WATCHDOG_SLEEP_TIME_USEC / 1000);
 		mLastClockCount = LLTimer::getTotalTime();
-- 
cgit v1.2.3


From 346fc435f1b12e47b8bf51d15c70ceca4615de41 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Thu, 17 Jan 2019 01:53:27 +0200
Subject: SL-10291 cleanup-mutex

---
 indra/llcommon/llrefcount.cpp  | 109 -----------------------------------------
 indra/llcommon/llrefcount.h    |  18 +------
 indra/llmessage/llpumpio.cpp   |  54 --------------------
 indra/llmessage/llpumpio.h     |  11 -----
 indra/llvfs/lllfsthread.h      |   1 -
 indra/llvfs/llvfsthread.h      |   2 -
 indra/newview/lltexturefetch.h |   1 -
 7 files changed, 1 insertion(+), 195 deletions(-)

diff --git a/indra/llcommon/llrefcount.cpp b/indra/llcommon/llrefcount.cpp
index a638df2c7c..29a5ca6f24 100644
--- a/indra/llcommon/llrefcount.cpp
+++ b/indra/llcommon/llrefcount.cpp
@@ -29,25 +29,9 @@
 
 #include "llerror.h"
 
-#if LL_REF_COUNT_DEBUG
-#include "llthread.h"
-#include "llapr.h"
-#endif
-
 LLRefCount::LLRefCount(const LLRefCount& other)
 :	mRef(0)
 {
-#if LL_REF_COUNT_DEBUG
-	if(gAPRPoolp)
-	{
-		mMutexp = new LLMutex(gAPRPoolp) ;
-	}
-	else
-	{
-		mMutexp = NULL ;
-	}
-	mCrashAtUnlock = FALSE ;
-#endif
 }
 
 LLRefCount& LLRefCount::operator=(const LLRefCount&)
@@ -59,17 +43,6 @@ LLRefCount& LLRefCount::operator=(const LLRefCount&)
 LLRefCount::LLRefCount() :
 	mRef(0)
 {
-#if LL_REF_COUNT_DEBUG
-	if(gAPRPoolp)
-	{
-		mMutexp = new LLMutex(gAPRPoolp) ;
-	}
-	else
-	{
-		mMutexp = NULL ;
-	}
-	mCrashAtUnlock = FALSE ;
-#endif
 }
 
 LLRefCount::~LLRefCount()
@@ -78,87 +51,5 @@ LLRefCount::~LLRefCount()
 	{
 		LL_ERRS() << "deleting non-zero reference" << LL_ENDL;
 	}
-
-#if LL_REF_COUNT_DEBUG
-	if(gAPRPoolp)
-	{
-		delete mMutexp ;
-	}
-#endif
 }
 
-#if LL_REF_COUNT_DEBUG
-void LLRefCount::ref() const
-{ 
-	if(mMutexp)
-	{
-		if(mMutexp->isLocked()) 
-		{
-			mCrashAtUnlock = TRUE ;
-			LL_ERRS() << "the mutex is locked by the thread: " << mLockedThreadID 
-				<< " Current thread: " << LLThread::currentID() << LL_ENDL ;
-		}
-
-		mMutexp->lock() ;
-		mLockedThreadID = LLThread::currentID() ;
-
-		mRef++; 
-
-		if(mCrashAtUnlock)
-		{
-			while(1); //crash here.
-		}
-		mMutexp->unlock() ;
-	}
-	else
-	{
-		mRef++; 
-	}
-} 
-
-S32 LLRefCount::unref() const
-{
-	if(mMutexp)
-	{
-		if(mMutexp->isLocked()) 
-		{
-			mCrashAtUnlock = TRUE ;
-			LL_ERRS() << "the mutex is locked by the thread: " << mLockedThreadID 
-				<< " Current thread: " << LLThread::currentID() << LL_ENDL ;
-		}
-
-		mMutexp->lock() ;
-		mLockedThreadID = LLThread::currentID() ;
-		
-		llassert(mRef >= 1);
-		if (0 == --mRef) 
-		{
-			if(mCrashAtUnlock)
-			{
-				while(1); //crash here.
-			}
-			mMutexp->unlock() ;
-
-			delete this; 
-			return 0;
-		}
-
-		if(mCrashAtUnlock)
-		{
-			while(1); //crash here.
-		}
-		mMutexp->unlock() ;
-		return mRef;
-	}
-	else
-	{
-		llassert(mRef >= 1);
-		if (0 == --mRef) 
-		{
-			delete this; 
-			return 0;
-		}
-		return mRef;
-	}
-}	
-#endif
diff --git a/indra/llcommon/llrefcount.h b/indra/llcommon/llrefcount.h
index 1107973569..cdc60fa54f 100644
--- a/indra/llcommon/llrefcount.h
+++ b/indra/llcommon/llrefcount.h
@@ -31,11 +31,6 @@
 #include "llmutex.h"
 #include "llapr.h"
 
-#define LL_REF_COUNT_DEBUG 0
-#if LL_REF_COUNT_DEBUG
-class LLMutex ;
-#endif
-
 //----------------------------------------------------------------------------
 // RefCount objects should generally only be accessed by way of LLPointer<>'s
 // see llthread.h for LLThreadSafeRefCount
@@ -51,10 +46,6 @@ protected:
 public:
 	LLRefCount();
 
-#if LL_REF_COUNT_DEBUG
-	void ref() const ;
-	S32 unref() const ;
-#else
 	inline void ref() const
 	{ 
 		mRef++; 
@@ -69,8 +60,7 @@ public:
 			return 0;
 		}
 		return mRef;
-	}	
-#endif
+	}
 
 	//NOTE: when passing around a const LLRefCount object, this can return different results
 	// at different types, since mRef is mutable
@@ -81,12 +71,6 @@ public:
 
 private: 
 	mutable S32	mRef; 
-
-#if LL_REF_COUNT_DEBUG
-	LLMutex*  mMutexp ;
-	mutable U32  mLockedThreadID ;
-	mutable BOOL mCrashAtUnlock ; 
-#endif
 };
 
 
diff --git a/indra/llmessage/llpumpio.cpp b/indra/llmessage/llpumpio.cpp
index 506ccc98a4..a2524e9804 100644
--- a/indra/llmessage/llpumpio.cpp
+++ b/indra/llmessage/llpumpio.cpp
@@ -54,11 +54,7 @@
 
 // constants for poll timeout. if we are threading, we want to have a
 // longer poll timeout.
-#if LL_THREADS_APR
-static const S32 DEFAULT_POLL_TIMEOUT = 1000;
-#else
 static const S32 DEFAULT_POLL_TIMEOUT = 0;
-#endif
 
 // The default (and fallback) expiration time for chains
 const F32 DEFAULT_CHAIN_EXPIRY_SECS = 30.0f;
@@ -169,8 +165,6 @@ LLPumpIO::LLPumpIO(apr_pool_t* pool) :
 	mPool(NULL),
 	mCurrentPool(NULL),
 	mCurrentPoolReallocCount(0),
-	mChainsMutex(NULL),
-	mCallbackMutex(NULL),
 	mCurrentChain(mRunningChains.end())
 {
 	mCurrentChain = mRunningChains.end();
@@ -194,9 +188,6 @@ bool LLPumpIO::addChain(const chain_t& chain, F32 timeout, bool has_curl_request
 {
 	if(chain.empty()) return false;
 
-#if LL_THREADS_APR
-	LLScopedLock lock(mChainsMutex);
-#endif
 	LLChainInfo info;
 	info.mHasCurlRequest = has_curl_request;
 	info.setTimeoutSeconds(timeout);
@@ -234,9 +225,6 @@ bool LLPumpIO::addChain(
 	if(!data) return false;
 	if(links.empty()) return false;
 
-#if LL_THREADS_APR
-	LLScopedLock lock(mChainsMutex);
-#endif
 #if LL_DEBUG_PIPE_TYPE_IN_PUMP
 	LL_DEBUGS() << "LLPumpIO::addChain() " << links[0].mPipe << " '"
 		<< typeid(*(links[0].mPipe)).name() << "'" << LL_ENDL;
@@ -391,9 +379,6 @@ void LLPumpIO::clearLock(S32 key)
 	// therefore won't be treading into deleted memory. I think we can
 	// also clear the lock on the chain safely since the pump only
 	// reads that value.
-#if LL_THREADS_APR
-	LLScopedLock lock(mChainsMutex);
-#endif
 	mClearLocks.insert(key);
 }
 
@@ -457,9 +442,6 @@ void LLPumpIO::pump(const S32& poll_timeout)
 	PUMP_DEBUG;
 	if(true)
 	{
-#if LL_THREADS_APR
-		LLScopedLock lock(mChainsMutex);
-#endif
 		// bail if this pump is paused.
 		if(PAUSING == mState)
 		{
@@ -724,25 +706,10 @@ void LLPumpIO::pump(const S32& poll_timeout)
 	END_PUMP_DEBUG;
 }
 
-//bool LLPumpIO::respond(const chain_t& pipes)
-//{
-//#if LL_THREADS_APR
-//	LLScopedLock lock(mCallbackMutex);
-//#endif
-//	LLChainInfo info;
-//	links_t links;
-//	
-//	mPendingCallbacks.push_back(info);
-//	return true;
-//}
-
 bool LLPumpIO::respond(LLIOPipe* pipe)
 {
 	if(NULL == pipe) return false;
 
-#if LL_THREADS_APR
-	LLScopedLock lock(mCallbackMutex);
-#endif
 	LLChainInfo info;
 	LLLinkInfo link;
 	link.mPipe = pipe;
@@ -761,10 +728,6 @@ bool LLPumpIO::respond(
 	if(!data) return false;
 	if(links.empty()) return false;
 
-#if LL_THREADS_APR
-	LLScopedLock lock(mCallbackMutex);
-#endif
-
 	// Add the callback response
 	LLChainInfo info;
 	info.mChainLinks = links;
@@ -781,9 +744,6 @@ void LLPumpIO::callback()
 	//LL_INFOS() << "LLPumpIO::callback()" << LL_ENDL;
 	if(true)
 	{
-#if LL_THREADS_APR
-		LLScopedLock lock(mCallbackMutex);
-#endif
 		std::copy(
 			mPendingCallbacks.begin(),
 			mPendingCallbacks.end(),
@@ -809,9 +769,6 @@ void LLPumpIO::callback()
 
 void LLPumpIO::control(LLPumpIO::EControl op)
 {
-#if LL_THREADS_APR
-	LLScopedLock lock(mChainsMutex);
-#endif
 	switch(op)
 	{
 	case PAUSE:
@@ -829,22 +786,11 @@ void LLPumpIO::control(LLPumpIO::EControl op)
 void LLPumpIO::initialize(apr_pool_t* pool)
 {
 	if(!pool) return;
-#if LL_THREADS_APR
-	// SJB: Windows defaults to NESTED and OSX defaults to UNNESTED, so use UNNESTED explicitly.
-	apr_thread_mutex_create(&mChainsMutex, APR_THREAD_MUTEX_UNNESTED, pool);
-	apr_thread_mutex_create(&mCallbackMutex, APR_THREAD_MUTEX_UNNESTED, pool);
-#endif
 	mPool = pool;
 }
 
 void LLPumpIO::cleanup()
 {
-#if LL_THREADS_APR
-	if(mChainsMutex) apr_thread_mutex_destroy(mChainsMutex);
-	if(mCallbackMutex) apr_thread_mutex_destroy(mCallbackMutex);
-#endif
-	mChainsMutex = NULL;
-	mCallbackMutex = NULL;
 	if(mPollset)
 	{
 //		LL_DEBUGS() << "cleaning up pollset" << LL_ENDL;
diff --git a/indra/llmessage/llpumpio.h b/indra/llmessage/llpumpio.h
index d2c5d37571..b9eabee710 100644
--- a/indra/llmessage/llpumpio.h
+++ b/indra/llmessage/llpumpio.h
@@ -40,9 +40,6 @@
 #include "lliopipe.h"
 #include "llrun.h"
 
-// Define this to enable use with the APR thread library.
-//#define LL_THREADS_APR 1
-
 // some simple constants to help with timeouts
 extern const F32 DEFAULT_CHAIN_EXPIRY_SECS;
 extern const F32 SHORT_CHAIN_EXPIRY_SECS;
@@ -393,14 +390,6 @@ protected:
 	apr_pool_t* mCurrentPool;
 	S32 mCurrentPoolReallocCount;
 
-#if LL_THREADS_APR
-	apr_thread_mutex_t* mChainsMutex;
-	apr_thread_mutex_t* mCallbackMutex;
-#else
-	int* mChainsMutex;
-	int* mCallbackMutex;
-#endif
-
 protected:
 	void initialize(apr_pool_t* pool);
 	void cleanup();
diff --git a/indra/llvfs/lllfsthread.h b/indra/llvfs/lllfsthread.h
index cdb5c75946..58f658f7ba 100644
--- a/indra/llvfs/lllfsthread.h
+++ b/indra/llvfs/lllfsthread.h
@@ -32,7 +32,6 @@
 #include <map>
 #include <set>
 
-#include "llapr.h"
 #include "llpointer.h"
 #include "llqueuedthread.h"
 
diff --git a/indra/llvfs/llvfsthread.h b/indra/llvfs/llvfsthread.h
index 95f3c857c6..7814de4a2d 100644
--- a/indra/llvfs/llvfsthread.h
+++ b/indra/llvfs/llvfsthread.h
@@ -32,8 +32,6 @@
 #include <map>
 #include <set>
 
-#include "llapr.h"
-
 #include "llqueuedthread.h"
 
 #include "llvfs.h"
diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h
index cfa312ccd9..19369137b7 100644
--- a/indra/newview/lltexturefetch.h
+++ b/indra/newview/lltexturefetch.h
@@ -35,7 +35,6 @@
 #include "lluuid.h"
 #include "llworkerthread.h"
 #include "lltextureinfo.h"
-#include "llapr.h"
 #include "llimageworker.h"
 #include "httprequest.h"
 #include "httpoptions.h"
-- 
cgit v1.2.3


From fa15830e02ed249186625e845e2ac19749d10193 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Tue, 15 Jan 2019 18:31:17 +0200
Subject: SL-10291 Replace apr_atomic with standard C++11 functionality

---
 indra/llcommon/CMakeLists.txt        |  2 ++
 indra/llcommon/llapp.h               |  3 +-
 indra/llcommon/llapr.h               | 28 ---------------
 indra/llcommon/llatomic.cpp          | 28 +++++++++++++++
 indra/llcommon/llatomic.h            | 69 ++++++++++++++++++++++++++++++++++++
 indra/llcommon/llinstancetracker.cpp |  7 ++--
 indra/llcommon/llinstancetracker.h   |  9 +++--
 indra/llcommon/llmutex.cpp           |  3 --
 indra/llcommon/llqueuedthread.h      |  6 ++--
 indra/llcommon/llrefcount.h          |  8 ++---
 indra/llcommon/llworkerthread.h      |  2 +-
 indra/llcorehttp/_httpservice.h      |  2 +-
 indra/llcorehttp/_refcounted.h       |  2 +-
 indra/llcorehttp/_thread.h           |  1 +
 indra/llcrashlogger/llcrashlock.cpp  |  1 +
 indra/llmessage/llproxy.h            |  2 +-
 indra/llvfs/llpidlock.cpp            |  1 +
 indra/newview/llappviewer.h          |  1 +
 indra/newview/llmeshrepository.cpp   |  3 +-
 indra/newview/lltexturecache.h       |  2 +-
 20 files changed, 128 insertions(+), 52 deletions(-)
 create mode 100644 indra/llcommon/llatomic.cpp
 create mode 100644 indra/llcommon/llatomic.h

diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index d9eb13d65a..ac19e6d025 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -35,6 +35,7 @@ set(llcommon_SOURCE_FILES
     llapp.cpp
     llapr.cpp
     llassettype.cpp
+    llatomic.cpp
     llbase32.cpp
     llbase64.cpp
     llbitpack.cpp
@@ -135,6 +136,7 @@ set(llcommon_HEADER_FILES
     llapp.h
     llapr.h
     llassettype.h
+    llatomic.h
     llbase32.h
     llbase64.h
     llbitpack.h
diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h
index acd829d864..245c73e3a2 100644
--- a/indra/llcommon/llapp.h
+++ b/indra/llcommon/llapp.h
@@ -30,9 +30,8 @@
 #include <map>
 #include "llrun.h"
 #include "llsd.h"
+#include <atomic>
 // Forward declarations
-template <typename Type> class LLAtomic32;
-typedef LLAtomic32<U32> LLAtomicU32;
 class LLErrorThread;
 class LLLiveFile;
 #if LL_LINUX
diff --git a/indra/llcommon/llapr.h b/indra/llcommon/llapr.h
index 73d1d180ef..da50dda103 100644
--- a/indra/llcommon/llapr.h
+++ b/indra/llcommon/llapr.h
@@ -38,7 +38,6 @@
 #include "apr_thread_proc.h"
 #include "apr_getopt.h"
 #include "apr_signal.h"
-#include "apr_atomic.h"
 
 #include "llstring.h"
 
@@ -131,33 +130,6 @@ private:
 	std::unique_ptr<std::mutex> mMutexp;
 } ;
 
-template <typename Type> class LLAtomic32
-{
-public:
-	LLAtomic32<Type>() {};
-	LLAtomic32<Type>(Type x) {apr_atomic_set32(&mData, apr_uint32_t(x)); };
-	~LLAtomic32<Type>() {};
-
-	operator const Type() { apr_uint32_t data = apr_atomic_read32(&mData); return Type(data); }
-	
-	Type	CurrentValue() const { apr_uint32_t data = apr_atomic_read32(const_cast< volatile apr_uint32_t* >(&mData)); return Type(data); }
-
-	Type operator =(const Type& x) { apr_atomic_set32(&mData, apr_uint32_t(x)); return Type(mData); }
-	void operator -=(Type x) { apr_atomic_sub32(&mData, apr_uint32_t(x)); }
-	void operator +=(Type x) { apr_atomic_add32(&mData, apr_uint32_t(x)); }
-	Type operator ++(int) { return apr_atomic_inc32(&mData); } // Type++
-	Type operator --(int) { return apr_atomic_dec32(&mData); } // approximately --Type (0 if final is 0, non-zero otherwise)
-
-	Type operator ++() { return apr_atomic_inc32(&mData); } // Type++
-	Type operator --() { return apr_atomic_dec32(&mData); } // approximately --Type (0 if final is 0, non-zero otherwise)
-	
-private:
-	volatile apr_uint32_t mData;
-};
-
-typedef LLAtomic32<U32> LLAtomicU32;
-typedef LLAtomic32<S32> LLAtomicS32;
-
 // File IO convenience functions.
 // Returns NULL if the file fails to open, sets *sizep to file size if not NULL
 // abbreviated flags
diff --git a/indra/llcommon/llatomic.cpp b/indra/llcommon/llatomic.cpp
new file mode 100644
index 0000000000..93aba1f460
--- /dev/null
+++ b/indra/llcommon/llatomic.cpp
@@ -0,0 +1,28 @@
+/** 
+ * @file llatomic.cpp
+ *
+ * $LicenseInfo:firstyear=2018&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2018, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#include "llatomic.h"
+
+//============================================================================
diff --git a/indra/llcommon/llatomic.h b/indra/llcommon/llatomic.h
new file mode 100644
index 0000000000..8de773846c
--- /dev/null
+++ b/indra/llcommon/llatomic.h
@@ -0,0 +1,69 @@
+/** 
+ * @file llatomic.h
+ * @brief Base classes for atomic.
+ *
+ * $LicenseInfo:firstyear=2018&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2018, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLATOMIC_H
+#define LL_LLATOMIC_H
+
+#include "stdtypes.h"
+
+#include <atomic>
+
+template <typename Type, typename AtomicType = std::atomic< Type > > class LLAtomicBase
+{
+public:
+    LLAtomicBase() {};
+    LLAtomicBase(Type x) { mData.store(x); }
+    ~LLAtomicBase() {};
+
+    operator const Type() { return mData; }
+
+    Type	CurrentValue() const { return mData; }
+
+    Type operator =(const Type& x) { mData.store(x); return mData; }
+    void operator -=(Type x) { mData -= x; }
+    void operator +=(Type x) { mData += x; }
+    Type operator ++(int) { return mData++; }
+    Type operator --(int) { return mData--; }
+
+    Type operator ++() { return ++mData; }
+    Type operator --() { return --mData; }
+
+private:
+    AtomicType mData;
+};
+
+// Typedefs for specialized versions. Using std::atomic_(u)int32_t to get the optimzed implementation.
+#ifdef LL_WINDOWS
+typedef LLAtomicBase<U32, std::atomic_uint32_t> LLAtomicU32;
+typedef LLAtomicBase<S32, std::atomic_int32_t> LLAtomicS32;
+#else
+typedef LLAtomicBase<U32, std::atomic_uint> LLAtomicU32;
+typedef LLAtomicBase<S32, std::atomic_int> LLAtomicS32;
+#endif
+
+typedef LLAtomicBase<bool, std::atomic_bool> LLAtomicBool;
+
+#endif // LL_LLATOMIC_H
diff --git a/indra/llcommon/llinstancetracker.cpp b/indra/llcommon/llinstancetracker.cpp
index 11fc53f8c8..3f990f4869 100644
--- a/indra/llcommon/llinstancetracker.cpp
+++ b/indra/llcommon/llinstancetracker.cpp
@@ -36,17 +36,16 @@
 
 void LLInstanceTrackerBase::StaticBase::incrementDepth()
 {
-	apr_atomic_inc32(&sIterationNestDepth);
+	++sIterationNestDepth;
 }
 
 void LLInstanceTrackerBase::StaticBase::decrementDepth()
 {
 	llassert(sIterationNestDepth);
-	apr_atomic_dec32(&sIterationNestDepth);
+	--sIterationNestDepth;
 }
 
 U32 LLInstanceTrackerBase::StaticBase::getDepth()
 {
-	apr_uint32_t data = apr_atomic_read32(&sIterationNestDepth);
-	return data;
+	return sIterationNestDepth;
 }
diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h
index 910c8dbd99..363d0bcbd5 100644
--- a/indra/llcommon/llinstancetracker.h
+++ b/indra/llcommon/llinstancetracker.h
@@ -28,6 +28,7 @@
 #ifndef LL_LLINSTANCETRACKER_H
 #define LL_LLINSTANCETRACKER_H
 
+#include <atomic>
 #include <map>
 #include <typeinfo>
 
@@ -81,8 +82,12 @@ protected:
 		void decrementDepth();
 		U32 getDepth();
 	private:
-		U32 sIterationNestDepth;
-    };
+#ifdef LL_WINDOWS
+		std::atomic_uint32_t sIterationNestDepth;
+#else
+		std::atomic_uint sIterationNestDepth;
+#endif
+	};
 };
 
 LL_COMMON_API void assert_main_thread();
diff --git a/indra/llcommon/llmutex.cpp b/indra/llcommon/llmutex.cpp
index cf84e50953..75f43a4704 100644
--- a/indra/llcommon/llmutex.cpp
+++ b/indra/llcommon/llmutex.cpp
@@ -24,9 +24,6 @@
  */
 
 #include "linden_common.h"
-#include "llapr.h"
-
-#include "apr_portable.h"
 
 #include "llmutex.h"
 #include "llthread.h"
diff --git a/indra/llcommon/llqueuedthread.h b/indra/llcommon/llqueuedthread.h
index d3704b0fe2..5d3f873646 100644
--- a/indra/llcommon/llqueuedthread.h
+++ b/indra/llcommon/llqueuedthread.h
@@ -32,7 +32,7 @@
 #include <map>
 #include <set>
 
-#include "llapr.h"
+#include "llatomic.h"
 
 #include "llthread.h"
 #include "llsimplehash.h"
@@ -128,7 +128,7 @@ public:
 		};
 		
 	protected:
-		LLAtomic32<status_t> mStatus;
+		LLAtomicBase<status_t> mStatus;
 		U32 mPriority;
 		U32 mFlags;
 	};
@@ -198,7 +198,7 @@ public:
 protected:
 	BOOL mThreaded;  // if false, run on main thread and do updates during update()
 	BOOL mStarted;  // required when mThreaded is false to call startThread() from update()
-	LLAtomic32<BOOL> mIdleThread; // request queue is empty (or we are quitting) and the thread is idle
+	LLAtomicBool mIdleThread; // request queue is empty (or we are quitting) and the thread is idle
 	
 	typedef std::set<QueuedRequest*, queued_request_less> request_queue_t;
 	request_queue_t mRequestQueue;
diff --git a/indra/llcommon/llrefcount.h b/indra/llcommon/llrefcount.h
index cdc60fa54f..fb0411d27b 100644
--- a/indra/llcommon/llrefcount.h
+++ b/indra/llcommon/llrefcount.h
@@ -29,7 +29,7 @@
 #include <boost/noncopyable.hpp>
 #include <boost/intrusive_ptr.hpp>
 #include "llmutex.h"
-#include "llapr.h"
+#include "llatomic.h"
 
 //----------------------------------------------------------------------------
 // RefCount objects should generally only be accessed by way of LLPointer<>'s
@@ -107,8 +107,8 @@ public:
 	void unref()
 	{
 		llassert(mRef >= 1);
-		if ((--mRef) == 0)		// See note in llapr.h on atomic decrement operator return value.  
-		{	
+		if ((--mRef) == 0)
+		{
 			// If we hit zero, the caller should be the only smart pointer owning the object and we can delete it.
 			// It is technically possible for a vanilla pointer to mess this up, or another thread to
 			// jump in, find this object, create another smart pointer and end up dangling, but if
@@ -124,7 +124,7 @@ public:
 	}
 
 private: 
-	LLAtomic32< S32	> mRef; 
+	LLAtomicS32 mRef; 
 };
 
 /**
diff --git a/indra/llcommon/llworkerthread.h b/indra/llcommon/llworkerthread.h
index 09776816a8..b1a6f61360 100644
--- a/indra/llcommon/llworkerthread.h
+++ b/indra/llcommon/llworkerthread.h
@@ -33,7 +33,7 @@
 #include <string>
 
 #include "llqueuedthread.h"
-#include "llapr.h"
+#include "llatomic.h"
 
 #define USE_FRAME_CALLBACK_MANAGER 0
 
diff --git a/indra/llcorehttp/_httpservice.h b/indra/llcorehttp/_httpservice.h
index ac518a5de7..d0c37ac195 100644
--- a/indra/llcorehttp/_httpservice.h
+++ b/indra/llcorehttp/_httpservice.h
@@ -31,7 +31,7 @@
 #include <vector>
 
 #include "linden_common.h"
-#include "llapr.h"
+#include "llatomic.h"
 #include "httpcommon.h"
 #include "httprequest.h"
 #include "_httppolicyglobal.h"
diff --git a/indra/llcorehttp/_refcounted.h b/indra/llcorehttp/_refcounted.h
index 7f713f2298..5cc8914395 100644
--- a/indra/llcorehttp/_refcounted.h
+++ b/indra/llcorehttp/_refcounted.h
@@ -34,7 +34,7 @@
 #include <boost/thread.hpp>
 #include <boost/intrusive_ptr.hpp>
 
-#include "llapr.h"
+#include "llatomic.h"
 
 
 namespace LLCoreInt
diff --git a/indra/llcorehttp/_thread.h b/indra/llcorehttp/_thread.h
index e058d660e5..22b7750bad 100644
--- a/indra/llcorehttp/_thread.h
+++ b/indra/llcorehttp/_thread.h
@@ -33,6 +33,7 @@
 #include <boost/function.hpp>
 #include <boost/date_time/posix_time/posix_time_types.hpp>
 
+#include "apr.h" // thread-related functions
 #include "_refcounted.h"
 
 namespace LLCoreInt
diff --git a/indra/llcrashlogger/llcrashlock.cpp b/indra/llcrashlogger/llcrashlock.cpp
index 77abfbcf0f..18d164abde 100644
--- a/indra/llcrashlogger/llcrashlock.cpp
+++ b/indra/llcrashlogger/llcrashlock.cpp
@@ -27,6 +27,7 @@
 
 #include "linden_common.h"
 
+#include "llapr.h" // thread-related functions
 #include "llcrashlock.h"
 #include "lldir.h"
 #include "llsd.h"
diff --git a/indra/llmessage/llproxy.h b/indra/llmessage/llproxy.h
index 688dff7c83..87891901ad 100644
--- a/indra/llmessage/llproxy.h
+++ b/indra/llmessage/llproxy.h
@@ -298,7 +298,7 @@ private:
 private:
 	// Is the HTTP proxy enabled? Safe to read in any thread, but do not write directly.
 	// Instead use enableHTTPProxy() and disableHTTPProxy() instead.
-	mutable LLAtomic32<bool> mHTTPProxyEnabled;
+	mutable LLAtomicBool mHTTPProxyEnabled;
 
 	// Mutex to protect shared members in non-main thread calls to applyProxySettings().
 	mutable LLMutex mProxyMutex;
diff --git a/indra/llvfs/llpidlock.cpp b/indra/llvfs/llpidlock.cpp
index 6572edead3..f770e93d45 100644
--- a/indra/llvfs/llpidlock.cpp
+++ b/indra/llvfs/llpidlock.cpp
@@ -27,6 +27,7 @@
 
 #include "linden_common.h"
 
+#include "llapr.h" // thread-related functions
 #include "llpidlock.h"
 #include "lldir.h"
 #include "llsd.h"
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index e607b4a994..788fe6a19b 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -43,6 +43,7 @@
 #define LL_LLAPPVIEWER_H
 
 #include "llallocator.h"
+#include "llapr.h"
 #include "llcontrol.h"
 #include "llsys.h"			// for LLOSInfo
 #include "lltimer.h"
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index a6002bd57f..2e7141bcfc 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -26,10 +26,11 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "llapr.h"
+#include "apr_portable.h"
 #include "apr_pools.h"
 #include "apr_dso.h"
 #include "llhttpconstants.h"
-#include "llapr.h"
 #include "llmeshrepository.h"
 
 #include "llagent.h"
diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h
index 987b9375c0..81ea7aeee2 100644
--- a/indra/newview/lltexturecache.h
+++ b/indra/newview/lltexturecache.h
@@ -221,7 +221,7 @@ private:
 	typedef std::map<LLUUID,S32> size_map_t;
 	size_map_t mTexturesSizeMap;
 	S64 mTexturesSizeTotal;
-	LLAtomic32<BOOL> mDoPurge;
+	LLAtomicBool mDoPurge;
 
 	typedef std::map<S32, Entry> idx_entry_map_t;
 	idx_entry_map_t mUpdatedEntryMap;
-- 
cgit v1.2.3


From 3527e9c0423f8a3c10c9d6e93805540315b285b6 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Fri, 18 Jan 2019 16:12:49 +0200
Subject: SL-3488 Remove "Disable Selected" and "Disable All" Buttons

---
 indra/newview/llfloatertopobjects.cpp              | 41 +++-------------------
 indra/newview/llfloatertopobjects.h                | 11 +-----
 .../skins/default/xui/en/floater_top_objects.xml   | 26 +-------------
 3 files changed, 6 insertions(+), 72 deletions(-)

diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp
index 3e6fc3dc0d..9b5b3a0fc9 100644
--- a/indra/newview/llfloatertopobjects.cpp
+++ b/indra/newview/llfloatertopobjects.cpp
@@ -78,8 +78,6 @@ LLFloaterTopObjects::LLFloaterTopObjects(const LLSD& key)
 	mCommitCallbackRegistrar.add("TopObjects.ShowBeacon",		boost::bind(&LLFloaterTopObjects::onClickShowBeacon, this));
 	mCommitCallbackRegistrar.add("TopObjects.ReturnSelected",	boost::bind(&LLFloaterTopObjects::onReturnSelected, this));
 	mCommitCallbackRegistrar.add("TopObjects.ReturnAll",		boost::bind(&LLFloaterTopObjects::onReturnAll, this));
-	mCommitCallbackRegistrar.add("TopObjects.DisableSelected",	boost::bind(&LLFloaterTopObjects::onDisableSelected, this));
-	mCommitCallbackRegistrar.add("TopObjects.DisableAll",		boost::bind(&LLFloaterTopObjects::onDisableAll, this));
 	mCommitCallbackRegistrar.add("TopObjects.Refresh",			boost::bind(&LLFloaterTopObjects::onRefresh, this));
 	mCommitCallbackRegistrar.add("TopObjects.GetByObjectName",	boost::bind(&LLFloaterTopObjects::onGetByObjectName, this));
 	mCommitCallbackRegistrar.add("TopObjects.GetByOwnerName",	boost::bind(&LLFloaterTopObjects::onGetByOwnerName, this));
@@ -332,7 +330,7 @@ void LLFloaterTopObjects::onClickShowBeacon()
 	showBeacon();
 }
 
-void LLFloaterTopObjects::doToObjects(int action, bool all)
+void LLFloaterTopObjects::returnObjects(bool all)
 {
 	LLMessageSystem *msg = gMessageSystem;
 
@@ -356,14 +354,7 @@ void LLFloaterTopObjects::doToObjects(int action, bool all)
 		}
 		if (start_message)
 		{
-			if (action == ACTION_RETURN)
-			{
-				msg->newMessageFast(_PREHASH_ParcelReturnObjects);
-			}
-			else
-			{
-				msg->newMessageFast(_PREHASH_ParcelDisableObjects);
-			}
+			msg->newMessageFast(_PREHASH_ParcelReturnObjects);
 			msg->nextBlockFast(_PREHASH_AgentData);
 			msg->addUUIDFast(_PREHASH_AgentID,	gAgent.getID());
 			msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
@@ -397,7 +388,7 @@ bool LLFloaterTopObjects::callbackReturnAll(const LLSD& notification, const LLSD
 	if(!instance) return false;
 	if (option == 0)
 	{
-		instance->doToObjects(ACTION_RETURN, true);
+		instance->returnObjects(true);
 	}
 	return false;
 }
@@ -410,31 +401,7 @@ void LLFloaterTopObjects::onReturnAll()
 
 void LLFloaterTopObjects::onReturnSelected()
 {
-	doToObjects(ACTION_RETURN, false);
-}
-
-
-//static
-bool LLFloaterTopObjects::callbackDisableAll(const LLSD& notification, const LLSD& response)
-{
-	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-	LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects");
-	if(!instance) return false;
-	if (option == 0)
-	{
-		instance->doToObjects(ACTION_DISABLE, true);
-	}
-	return false;
-}
-
-void LLFloaterTopObjects::onDisableAll()
-{
-	LLNotificationsUtil::add("DisableAllTopObjects", LLSD(), LLSD(), callbackDisableAll);
-}
-
-void LLFloaterTopObjects::onDisableSelected()
-{
-	doToObjects(ACTION_DISABLE, false);
+	returnObjects(false);
 }
 
 
diff --git a/indra/newview/llfloatertopobjects.h b/indra/newview/llfloatertopobjects.h
index dbbe9ac521..3138249c7a 100644
--- a/indra/newview/llfloatertopobjects.h
+++ b/indra/newview/llfloatertopobjects.h
@@ -78,15 +78,12 @@ private:
 	static void onDoubleClickObjectsList(void* data);
 	void onClickShowBeacon();
 
-	void doToObjects(int action, bool all);
+	void returnObjects(bool all);
 
 	void onReturnAll();
 	void onReturnSelected();
-	void onDisableAll();
-	void onDisableSelected();
 
 	static bool callbackReturnAll(const LLSD& notification, const LLSD& response);
-	static bool callbackDisableAll(const LLSD& notification, const LLSD& response);
 
 	void onGetByOwnerName();
 	void onGetByObjectName();
@@ -108,12 +105,6 @@ private:
 
 	F32 mtotalScore;
 
-	enum
-	{
-		ACTION_RETURN = 0,
-		ACTION_DISABLE
-	};
-
 	static LLFloaterTopObjects* sInstance;
 };
 
diff --git a/indra/newview/skins/default/xui/en/floater_top_objects.xml b/indra/newview/skins/default/xui/en/floater_top_objects.xml
index 36ceddd305..ceef541290 100644
--- a/indra/newview/skins/default/xui/en/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/en/floater_top_objects.xml
@@ -2,7 +2,7 @@
 <floater
  legacy_header_height="18"
  can_resize="true"
- height="372"
+ height="350"
  layout="topleft"
  min_height="300"
  min_width="450"
@@ -273,28 +273,4 @@
       <button.commit_callback
           function="TopObjects.ReturnAll" />
     </button>
-    <button
-     follows="bottom|left"
-     height="23"
-     label="Disable Selected"
-     layout="topleft"
-
-     left="112"
-     name="disable_selected_btn"
-     width="130">
-      <button.commit_callback
-          function="TopObjects.DisableSelected" />
-    </button>
-    <button
-     follows="bottom|left"
-     height="23"
-     label="Disable All"
-     layout="topleft"
-     left_pad="10"
-     name="disable_all_btn"
-     top_delta="0"
-     width="130">
-      <button.commit_callback
-          function="TopObjects.DisableAll" />
-    </button>
 </floater>
-- 
cgit v1.2.3


From af0e498293c86dc7bb1ae7911bf932b7b287e115 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Mon, 21 Jan 2019 17:45:26 +0200
Subject: =?UTF-8?q?SL-10338=20FIXED=20The=20=E2=80=9Cadd=20friend=E2=80=9D?=
 =?UTF-8?q?=20button=20is=20available=20when=20user=20is=20already=20at=20?=
 =?UTF-8?q?your=20friends=20list?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 indra/newview/llchatitemscontainerctrl.cpp | 2 ++
 indra/newview/llfloaterland.cpp            | 2 ++
 2 files changed, 4 insertions(+)

diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index eddc87efcd..4f42868f1a 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -29,6 +29,7 @@
 #include "llchatitemscontainerctrl.h"
 #include "lltextbox.h"
 
+#include "llavataractions.h"
 #include "llavatariconctrl.h"
 #include "llcommandhandler.h"
 #include "llfloaterreg.h"
@@ -204,6 +205,7 @@ void LLFloaterIMNearbyChatToastPanel::init(LLSD& notification)
 	
 	mMsgText = getChild<LLChatMsgBox>("msg_text", false);
 	mMsgText->setContentTrusted(false);
+	mMsgText->setIsFriendCallback(LLAvatarActions::isFriend);
 
 	mMsgText->setText(std::string(""));
 
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 88b3fb7b96..a462f391ca 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -415,6 +415,7 @@ BOOL LLPanelLandGeneral::postBuild()
 	mTextSalePending = getChild<LLTextBox>("SalePending");
 	mTextOwnerLabel = getChild<LLTextBox>("Owner:");
 	mTextOwner = getChild<LLTextBox>("OwnerText");
+	mTextOwner->setIsFriendCallback(LLAvatarActions::isFriend);
 	
 	mContentRating = getChild<LLTextBox>("ContentRatingText");
 	mLandType = getChild<LLTextBox>("LandTypeText");
@@ -1191,6 +1192,7 @@ BOOL LLPanelLandObjects::postBuild()
 	mIconGroup = LLUIImageList::getInstance()->getUIImage("icon_group.tga", 0);
 
 	mOwnerList = getChild<LLNameListCtrl>("owner list");
+	mOwnerList->setIsFriendCallback(LLAvatarActions::isFriend);
 	mOwnerList->sortByColumnIndex(3, FALSE);
 	childSetCommitCallback("owner list", onCommitList, this);
 	mOwnerList->setDoubleClickCallback(onDoubleClickOwner, this);
-- 
cgit v1.2.3


From 8a92a771ba547d9d6a8bd1234e2e0b144a8bfcf5 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Tue, 15 Jan 2019 22:27:28 +0200
Subject: SL-10291 Replace apr thread with standard C++11 functionality

---
 indra/llcommon/llthread.cpp          |  77 +++++++-------------
 indra/llcommon/llthread.h            |  12 ++--
 indra/llcommon/llthreadsafequeue.cpp |  81 ---------------------
 indra/llcommon/llthreadsafequeue.h   | 135 +++++++++++++++++++----------------
 indra/newview/llmainlooprepeater.cpp |   2 +-
 5 files changed, 104 insertions(+), 203 deletions(-)

diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp
index 860415bb22..a4171729db 100644
--- a/indra/llcommon/llthread.cpp
+++ b/indra/llcommon/llthread.cpp
@@ -116,29 +116,27 @@ void LLThread::registerThreadID()
 //
 // Handed to the APR thread creation function
 //
-void *APR_THREAD_FUNC LLThread::staticRun(apr_thread_t *apr_threadp, void *datap)
+void LLThread::threadRun()
 {
-    LLThread *threadp = (LLThread *)datap;
-
 #ifdef LL_WINDOWS
-    set_thread_name(-1, threadp->mName.c_str());
+    set_thread_name(-1, mName.c_str());
 #endif
 
     // for now, hard code all LLThreads to report to single master thread recorder, which is known to be running on main thread
-    threadp->mRecorder = new LLTrace::ThreadRecorder(*LLTrace::get_master_thread_recorder());
+    mRecorder = new LLTrace::ThreadRecorder(*LLTrace::get_master_thread_recorder());
 
-    sThreadID = threadp->mID;
+    sThreadID = mID;
 
     // Run the user supplied function
     do 
     {
         try
         {
-            threadp->run();
+            run();
         }
         catch (const LLContinueError &e)
         {
-            LL_WARNS("THREAD") << "ContinueException on thread '" << threadp->mName <<
+            LL_WARNS("THREAD") << "ContinueException on thread '" << mName <<
                 "' reentering run(). Error what is: '" << e.what() << "'" << LL_ENDL;
             //output possible call stacks to log file.
             LLError::LLCallStacks::print();
@@ -153,39 +151,25 @@ void *APR_THREAD_FUNC LLThread::staticRun(apr_thread_t *apr_threadp, void *datap
     //LL_INFOS() << "LLThread::staticRun() Exiting: " << threadp->mName << LL_ENDL;
 
 
-    delete threadp->mRecorder;
-    threadp->mRecorder = NULL;
+    delete mRecorder;
+    mRecorder = NULL;
 
     // We're done with the run function, this thread is done executing now.
     //NB: we are using this flag to sync across threads...we really need memory barriers here
     // Todo: add LLMutex per thread instead of flag?
     // We are using "while (mStatus != STOPPED) {ms_sleep();}" everywhere.
-    threadp->mStatus = STOPPED;
-
-    return NULL;
+    mStatus = STOPPED;
 }
 
 LLThread::LLThread(const std::string& name, apr_pool_t *poolp) :
     mPaused(FALSE),
     mName(name),
-    mAPRThreadp(NULL),
+    mThreadp(NULL),
     mStatus(STOPPED),
     mRecorder(NULL)
 {
 
     mID = ++sIDIter;
-
-    // Thread creation probably CAN be paranoid about APR being initialized, if necessary
-    if (poolp)
-    {
-        mIsLocalPool = FALSE;
-        mAPRPoolp = poolp;
-    }
-    else
-    {
-        mIsLocalPool = TRUE;
-        apr_pool_create(&mAPRPoolp, NULL); // Create a subpool for this thread
-    }
     mRunCondition = new LLCondition();
     mDataLock = new LLMutex();
     mLocalAPRFilePoolp = NULL ;
@@ -217,7 +201,7 @@ void LLThread::shutdown()
 
     // Warning!  If you somehow call the thread destructor from itself,
     // the thread will die in an unclean fashion!
-    if (mAPRThreadp)
+    if (mThreadp)
     {
         if (!isStopped())
         {
@@ -248,14 +232,19 @@ void LLThread::shutdown()
         {
             // This thread just wouldn't stop, even though we gave it time
             //LL_WARNS() << "LLThread::~LLThread() exiting thread before clean exit!" << LL_ENDL;
-            // Put a stake in its heart.
-            apr_thread_exit(mAPRThreadp, -1);
+            // Put a stake in its heart. (A very hostile method to force a thread to quit)
+#if		LL_WINDOWS
+            TerminateThread(mNativeHandle, 0);
+#else
+            pthread_cancel(mNativeHandle);
+#endif
+
             delete mRecorder;
             mRecorder = NULL;
             mStatus = STOPPED;
             return;
         }
-        mAPRThreadp = NULL;
+        mThreadp = NULL;
     }
 
     delete mRunCondition;
@@ -263,12 +252,6 @@ void LLThread::shutdown()
 
     delete mDataLock;
     mDataLock = NULL;
-    
-    if (mIsLocalPool && mAPRPoolp)
-    {
-        apr_pool_destroy(mAPRPoolp);
-        mAPRPoolp = 0;
-    }
 
     if (mRecorder)
     {
@@ -287,19 +270,15 @@ void LLThread::start()
     // Set thread state to running
     mStatus = RUNNING;
 
-    apr_status_t status =
-        apr_thread_create(&mAPRThreadp, NULL, staticRun, (void *)this, mAPRPoolp);
-    
-    if(status == APR_SUCCESS)
-    {   
-        // We won't bother joining
-        apr_thread_detach(mAPRThreadp);
+    try
+    {
+        mThreadp = new std::thread(std::bind(&LLThread::threadRun, this));
+        mNativeHandle = mThreadp->native_handle();
     }
-    else
+    catch (std::system_error& ex)
     {
         mStatus = STOPPED;
-        LL_WARNS() << "failed to start thread " << mName << LL_ENDL;
-        ll_apr_warn_status(status);
+        LL_WARNS() << "failed to start thread " << mName << " " << ex.what() << LL_ENDL;
     }
 
 }
@@ -376,11 +355,7 @@ U32 LLThread::currentID()
 // static
 void LLThread::yield()
 {
-#if LL_LINUX || LL_SOLARIS
-    sched_yield(); // annoyingly, apr_thread_yield  is a noop on linux...
-#else
-    apr_thread_yield();
-#endif
+    std::this_thread::yield();
 }
 
 void LLThread::wake()
diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h
index dda7fa8ffb..863c9051f3 100644
--- a/indra/llcommon/llthread.h
+++ b/indra/llcommon/llthread.h
@@ -29,10 +29,10 @@
 
 #include "llapp.h"
 #include "llapr.h"
-#include "apr_thread_cond.h"
 #include "boost/intrusive_ptr.hpp"
 #include "llmutex.h"
 #include "llrefcount.h"
+#include <thread>
 
 LL_COMMON_API void assert_main_thread();
 
@@ -86,7 +86,6 @@ public:
     // this kicks off the apr thread
     void start(void);
 
-    apr_pool_t *getAPRPool() { return mAPRPoolp; }
     LLVolatileAPRPool* getLocalAPRFilePool() { return mLocalAPRFilePoolp ; }
 
     U32 getID() const { return mID; }
@@ -97,19 +96,18 @@ public:
     static void registerThreadID();
     
 private:
-    BOOL                mPaused;
+    bool                mPaused;
+    std::thread::native_handle_type mNativeHandle; // for termination in case of issues
     
     // static function passed to APR thread creation routine
-    static void *APR_THREAD_FUNC staticRun(struct apr_thread_t *apr_threadp, void *datap);
+    void threadRun();
 
 protected:
     std::string         mName;
     class LLCondition*  mRunCondition;
     LLMutex*            mDataLock;
 
-    apr_thread_t        *mAPRThreadp;
-    apr_pool_t          *mAPRPoolp;
-    BOOL                mIsLocalPool;
+    std::thread        *mThreadp;
     EThreadStatus       mStatus;
     U32                 mID;
     LLTrace::ThreadRecorder* mRecorder;
diff --git a/indra/llcommon/llthreadsafequeue.cpp b/indra/llcommon/llthreadsafequeue.cpp
index 491f920c0f..bde36999ba 100644
--- a/indra/llcommon/llthreadsafequeue.cpp
+++ b/indra/llcommon/llthreadsafequeue.cpp
@@ -24,87 +24,6 @@
  */
 
 #include "linden_common.h"
-#include <apr_pools.h>
-#include <apr_queue.h>
 #include "llthreadsafequeue.h"
-#include "llexception.h"
 
 
-
-// LLThreadSafeQueueImplementation
-//-----------------------------------------------------------------------------
-
-
-LLThreadSafeQueueImplementation::LLThreadSafeQueueImplementation(apr_pool_t * pool, unsigned int capacity):
-	mOwnsPool(pool == 0),
-	mPool(pool),
-	mQueue(0)
-{
-	if(mOwnsPool) {
-		apr_status_t status = apr_pool_create(&mPool, 0);
-		if(status != APR_SUCCESS) LLTHROW(LLThreadSafeQueueError("failed to allocate pool"));
-	} else {
-		; // No op.
-	}
-	
-	apr_status_t status = apr_queue_create(&mQueue, capacity, mPool);
-	if(status != APR_SUCCESS) LLTHROW(LLThreadSafeQueueError("failed to allocate queue"));
-}
-
-
-LLThreadSafeQueueImplementation::~LLThreadSafeQueueImplementation()
-{
-	if(mQueue != 0) {
-		if(apr_queue_size(mQueue) != 0) LL_WARNS() << 
-			"terminating queue which still contains " << apr_queue_size(mQueue) <<
-			" elements;" << "memory will be leaked" << LL_ENDL;
-		apr_queue_term(mQueue);
-	}
-	if(mOwnsPool && (mPool != 0)) apr_pool_destroy(mPool);
-}
-
-
-void LLThreadSafeQueueImplementation::pushFront(void * element)
-{
-	apr_status_t status = apr_queue_push(mQueue, element);
-	
-	if(status == APR_EINTR) {
-		LLTHROW(LLThreadSafeQueueInterrupt());
-	} else if(status != APR_SUCCESS) {
-		LLTHROW(LLThreadSafeQueueError("push failed"));
-	} else {
-		; // Success.
-	}
-}
-
-
-bool LLThreadSafeQueueImplementation::tryPushFront(void * element){
-	return apr_queue_trypush(mQueue, element) == APR_SUCCESS;
-}
-
-
-void * LLThreadSafeQueueImplementation::popBack(void)
-{
-	void * element;
-	apr_status_t status = apr_queue_pop(mQueue, &element);
-
-	if(status == APR_EINTR) {
-		LLTHROW(LLThreadSafeQueueInterrupt());
-	} else if(status != APR_SUCCESS) {
-		LLTHROW(LLThreadSafeQueueError("pop failed"));
-	} else {
-		return element;
-	}
-}
-
-
-bool LLThreadSafeQueueImplementation::tryPopBack(void *& element)
-{
-	return apr_queue_trypop(mQueue, &element) == APR_SUCCESS;
-}
-
-
-size_t LLThreadSafeQueueImplementation::size()
-{
-	return apr_queue_size(mQueue);
-}
diff --git a/indra/llcommon/llthreadsafequeue.h b/indra/llcommon/llthreadsafequeue.h
index 45289ef0b4..b0bddac8e5 100644
--- a/indra/llcommon/llthreadsafequeue.h
+++ b/indra/llcommon/llthreadsafequeue.h
@@ -28,12 +28,20 @@
 #define LL_LLTHREADSAFEQUEUE_H
 
 #include "llexception.h"
+#include <deque>
 #include <string>
 
+#if LL_WINDOWS
+#pragma warning (push)
+#pragma warning (disable:4265)
+#endif
+// 'std::_Pad' : class has virtual functions, but destructor is not virtual
+#include <mutex>
+#include <condition_variable>
 
-struct apr_pool_t; // From apr_pools.h
-class LLThreadSafeQueueImplementation; // See below.
-
+#if LL_WINDOWS
+#pragma warning (pop)
+#endif
 
 //
 // A general queue exception.
@@ -64,31 +72,6 @@ public:
 	}
 };
 
-
-struct apr_queue_t; // From apr_queue.h
-
-
-//
-// Implementation details. 
-//
-class LL_COMMON_API LLThreadSafeQueueImplementation
-{
-public:
-	LLThreadSafeQueueImplementation(apr_pool_t * pool, unsigned int capacity);
-	~LLThreadSafeQueueImplementation();
-	void pushFront(void * element);
-	bool tryPushFront(void * element);
-	void * popBack(void);
-	bool tryPopBack(void *& element);
-	size_t size();
-	
-private:
-	bool mOwnsPool;
-	apr_pool_t * mPool;
-	apr_queue_t * mQueue;
-};
-
-
 //
 // Implements a thread safe FIFO.
 //
@@ -100,7 +83,7 @@ public:
 	
 	// If the pool is set to NULL one will be allocated and managed by this
 	// queue.
-	LLThreadSafeQueue(apr_pool_t * pool = 0, unsigned int capacity = 1024);
+	LLThreadSafeQueue(U32 capacity = 1024);
 	
 	// Add an element to the front of queue (will block if the queue has
 	// reached capacity).
@@ -128,77 +111,103 @@ public:
 	size_t size();
 
 private:
-	LLThreadSafeQueueImplementation mImplementation;
-};
-
+	std::deque< ElementT > mStorage;
+	U32 mCapacity;
 
+	std::mutex mLock;
+	std::condition_variable mCapacityCond;
+	std::condition_variable mEmptyCond;
+};
 
 // LLThreadSafeQueue
 //-----------------------------------------------------------------------------
 
-
 template<typename ElementT>
-LLThreadSafeQueue<ElementT>::LLThreadSafeQueue(apr_pool_t * pool, unsigned int capacity):
-	mImplementation(pool, capacity)
+LLThreadSafeQueue<ElementT>::LLThreadSafeQueue(U32 capacity) :
+mCapacity(capacity)
 {
-	; // No op.
 }
 
 
 template<typename ElementT>
 void LLThreadSafeQueue<ElementT>::pushFront(ElementT const & element)
 {
-	ElementT * elementCopy = new ElementT(element);
-	try {
-		mImplementation.pushFront(elementCopy);
-	} catch (LLThreadSafeQueueInterrupt) {
-		delete elementCopy;
-		throw;
-	}
+    while (true)
+    {
+        std::unique_lock<std::mutex> lock1(mLock);
+
+        if (mStorage.size() < mCapacity)
+        {
+            mStorage.push_front(element);
+            mEmptyCond.notify_one();
+            return;
+        }
+
+        // Storage Full. Wait for signal.
+        mCapacityCond.wait(lock1);
+    }
 }
 
 
 template<typename ElementT>
 bool LLThreadSafeQueue<ElementT>::tryPushFront(ElementT const & element)
 {
-	ElementT * elementCopy = new ElementT(element);
-	bool result = mImplementation.tryPushFront(elementCopy);
-	if(!result) delete elementCopy;
-	return result;
+    std::unique_lock<std::mutex> lock1(mLock, std::defer_lock);
+    if (!lock1.try_lock())
+        return false;
+
+    if (mStorage.size() >= mCapacity)
+        return false;
+
+    mStorage.push_front(element);
+    mEmptyCond.notify_one();
+    return true;
 }
 
 
 template<typename ElementT>
 ElementT LLThreadSafeQueue<ElementT>::popBack(void)
 {
-	ElementT * element = reinterpret_cast<ElementT *> (mImplementation.popBack());
-	ElementT result(*element);
-	delete element;
-	return result;
+    while (true)
+    {
+        std::unique_lock<std::mutex> lock1(mLock);
+
+        if (!mStorage.empty())
+        {
+            ElementT value = mStorage.back();
+            mStorage.pop_back();
+            mCapacityCond.notify_one();
+            return value;
+        }
+
+        // Storage empty. Wait for signal.
+        mEmptyCond.wait(lock1);
+    }
 }
 
 
 template<typename ElementT>
 bool LLThreadSafeQueue<ElementT>::tryPopBack(ElementT & element)
 {
-	void * storedElement;
-	bool result = mImplementation.tryPopBack(storedElement);
-	if(result) {
-		ElementT * elementPtr = reinterpret_cast<ElementT *>(storedElement); 
-		element = *elementPtr;
-		delete elementPtr;
-	} else {
-		; // No op.
-	}
-	return result;
+    std::unique_lock<std::mutex> lock1(mLock, std::defer_lock);
+    if (!lock1.try_lock())
+        return false;
+
+    if (mStorage.empty())
+        return false;
+
+    element = mStorage.back();
+    mStorage.pop_back();
+    mCapacityCond.notify_one();
+    return true;
 }
 
 
 template<typename ElementT>
 size_t LLThreadSafeQueue<ElementT>::size(void)
 {
-	return mImplementation.size();
+    std::lock_guard<std::mutex> lock(mLock);
+    return mStorage.size();
 }
 
-
 #endif
diff --git a/indra/newview/llmainlooprepeater.cpp b/indra/newview/llmainlooprepeater.cpp
index db8d2e4ede..6736e9a950 100644
--- a/indra/newview/llmainlooprepeater.cpp
+++ b/indra/newview/llmainlooprepeater.cpp
@@ -46,7 +46,7 @@ void LLMainLoopRepeater::start(void)
 {
 	if(mQueue != 0) return;
 
-	mQueue = new LLThreadSafeQueue<LLSD>(gAPRPoolp, 1024);
+	mQueue = new LLThreadSafeQueue<LLSD>(1024);
 	mMainLoopConnection = LLEventPumps::instance().
 		obtain("mainloop").listen(LLEventPump::inventName(), boost::bind(&LLMainLoopRepeater::onMainLoop, this, _1));
 	mRepeaterConnection = LLEventPumps::instance().
-- 
cgit v1.2.3


From d785c87d620cb17681ea6d3011461154d96ab9d5 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Tue, 29 Jan 2019 21:33:31 +0200
Subject: SL-2364 Fixed Viewer Caches Login Host DNS Entries Indefinetely

---
 indra/llcorehttp/_httpoprequest.cpp   | 5 +++++
 indra/newview/lllogininstance.cpp     | 7 ++++++-
 indra/newview/llxmlrpctransaction.cpp | 4 ++++
 3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp
index cc49a2af80..0f76ff23ea 100644
--- a/indra/llcorehttp/_httpoprequest.cpp
+++ b/indra/llcorehttp/_httpoprequest.cpp
@@ -555,6 +555,11 @@ HttpStatus HttpOpRequest::prepareRequest(HttpService * service)
 	// about 700 or so requests and starts issuing TCP RSTs to
 	// new connections.  Reuse the DNS lookups for even a few
 	// seconds and no RSTs.
+	//
+	// -1 stores forever
+	// 0  never stores
+	// any other positive number specifies seconds
+	// supposedly curl 7.62.0 can use TTL by default, otherwise default is 60 seconds
 	check_curl_easy_setopt(mCurlHandle, CURLOPT_DNS_CACHE_TIMEOUT, dnsCacheTimeout);
 
 	if (gpolicy.mUseLLProxy)
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index bc93fa2c20..bf4fc029ee 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -63,6 +63,9 @@
 #include <sstream>
 
 const S32 LOGIN_MAX_RETRIES = 3;
+const F32 LOGIN_SRV_TIMEOUT_MIN = 10;
+const F32 LOGIN_SRV_TIMEOUT_MAX = 120;
+const F32 LOGIN_DNS_TIMEOUT_FACTOR = 0.9; // make DNS wait shorter then retry time
 
 class LLLoginInstance::Disposable {
 public:
@@ -232,8 +235,10 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
 
 	// Specify desired timeout/retry options
 	LLSD http_params;
-	http_params["timeout"] = gSavedSettings.getF32("LoginSRVTimeout");
+	F32 srv_timeout = llclamp(gSavedSettings.getF32("LoginSRVTimeout"), LOGIN_SRV_TIMEOUT_MIN, LOGIN_SRV_TIMEOUT_MAX);
+	http_params["timeout"] = srv_timeout;
 	http_params["retries"] = LOGIN_MAX_RETRIES;
+	http_params["DNSCacheTimeout"] = srv_timeout * LOGIN_DNS_TIMEOUT_FACTOR; //Default: indefinite
 
 	mRequestData.clear();
 	mRequestData["method"] = "login_to_simulator";
diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp
index cc223c1f48..8e2539606b 100644
--- a/indra/newview/llxmlrpctransaction.cpp
+++ b/indra/newview/llxmlrpctransaction.cpp
@@ -362,6 +362,10 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip, const
 	{
 		httpOpts->setRetries(httpParams["retries"].asInteger());
 	}
+	if (httpParams.has("DNSCacheTimeout"))
+	{
+		httpOpts->setDNSCacheTimeout(httpParams["DNSCacheTimeout"].asInteger());
+	}
 
 	bool vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert");
 	mCertStore = gSavedSettings.getString("CertStore");
-- 
cgit v1.2.3


From d903f8c1a1509c87af9bf5c173cab685be7dee03 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Tue, 5 Feb 2019 16:14:27 +0200
Subject: SL-10470 Fixed freeze due to extensive logging

---
 indra/newview/llinventorybridge.cpp |  2 +-
 indra/newview/llinventorymodel.cpp  | 16 +++++++++++++---
 indra/newview/llinventorypanel.cpp  |  3 ++-
 3 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index e7367d5ced..00b7732ee9 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -1415,7 +1415,7 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
 			break;
 
 		default:
-			LL_INFOS() << "Unhandled asset type (llassetstorage.h): "
+			LL_INFOS_ONCE() << "Unhandled asset type (llassetstorage.h): "
 					<< (S32)asset_type << " (" << LLAssetType::lookup(asset_type) << ")" << LL_ENDL;
 			break;
 	}
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index a520e0171e..b140c7c38e 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -1820,9 +1820,19 @@ void LLInventoryModel::addItem(LLViewerInventoryItem* item)
 
 		if (LLAssetType::lookup(item->getType()) == LLAssetType::badLookup())
 		{
-			LL_WARNS(LOG_INV) << "Got unknown asset type for item [ name: " << item->getName()
-				<< " type: " << item->getType()
-				<< " inv-type: " << item->getInventoryType() << " ]." << LL_ENDL;
+			if (item->getType() >= LLAssetType::AT_COUNT)
+			{
+				// Not yet supported.
+				LL_DEBUGS(LOG_INV) << "Got unknown asset type for item [ name: " << item->getName()
+					<< " type: " << item->getType()
+					<< " inv-type: " << item->getInventoryType() << " ]." << LL_ENDL;
+			}
+			else
+			{
+				LL_WARNS(LOG_INV) << "Got unknown asset type for item [ name: " << item->getName()
+					<< " type: " << item->getType()
+					<< " inv-type: " << item->getInventoryType() << " ]." << LL_ENDL;
+			}
 		}
 
 		// This condition means that we tried to add a link without the baseobj being in memory.
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 3992b506e9..d4993a1091 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -871,7 +871,8 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
 			
 			if (objectp->getType() >= LLAssetType::AT_COUNT)
   			{
-  				LL_WARNS() << "LLInventoryPanel::buildNewViews called with unknown objectp->mType : "
+				// Example: Happens when we add assets of new, not yet supported type to library
+				LL_DEBUGS() << "LLInventoryPanel::buildNewViews called with unknown objectp->mType : "
 				<< ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID()
 				<< LL_ENDL;
 
-- 
cgit v1.2.3


From c0abc508f9bdedf05748186472ea433cd8ddd9c6 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Tue, 5 Feb 2019 17:30:24 +0200
Subject: SL-10466 Viewer throwing misleading notification

---
 indra/newview/llviewermessage.cpp                  | 29 ++++++----------------
 .../newview/skins/default/xui/en/notifications.xml | 22 ----------------
 2 files changed, 7 insertions(+), 44 deletions(-)

diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 981d226824..e50c8ee9f0 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -5531,17 +5531,6 @@ void notify_cautioned_script_question(const LLSD& notification, const LLSD& resp
 
 void script_question_mute(const LLUUID& item_id, const std::string& object_name);
 
-bool unknown_script_question_cb(const LLSD& notification, const LLSD& response)
-{
-	// Only care if they muted the object here.
-	if ( response["Mute"] ) // mute
-	{
-		LLUUID task_id = notification["payload"]["task_id"].asUUID();
-		script_question_mute(task_id,notification["payload"]["object_name"].asString());
-	}
-	return false;
-}
-
 void experiencePermissionBlock(LLUUID experience, LLSD result)
 {
     LLSD permission;
@@ -5647,8 +5636,7 @@ void script_question_mute(const LLUUID& task_id, const std::string& object_name)
       	bool matches(const LLNotificationPtr notification) const
         {
             if (notification->getName() == "ScriptQuestionCaution"
-                || notification->getName() == "ScriptQuestion"
-				|| notification->getName() == "UnknownScriptQuestion")
+                || notification->getName() == "ScriptQuestion")
             {
                 return (notification->getPayload()["task_id"].asUUID() == blocked_id);
             }
@@ -5665,7 +5653,6 @@ void script_question_mute(const LLUUID& task_id, const std::string& object_name)
 static LLNotificationFunctorRegistration script_question_cb_reg_1("ScriptQuestion", script_question_cb);
 static LLNotificationFunctorRegistration script_question_cb_reg_2("ScriptQuestionCaution", script_question_cb);
 static LLNotificationFunctorRegistration script_question_cb_reg_3("ScriptQuestionExperience", script_question_cb);
-static LLNotificationFunctorRegistration unknown_script_question_cb_reg("UnknownScriptQuestion", unknown_script_question_cb);
 
 void process_script_experience_details(const LLSD& experience_details, LLSD args, LLSD payload)
 {
@@ -5778,14 +5765,12 @@ void process_script_question(LLMessageSystem *msg, void **user_data)
 		args["QUESTIONS"] = script_question;
 
 		if (known_questions != questions)
-		{	// This is in addition to the normal dialog.
-			LLSD payload;
-			payload["task_id"] = taskid;
-			payload["item_id"] = itemid;
-			payload["object_name"] = object_name;
-			
-			args["DOWNLOADURL"] = LLTrans::getString("ViewerDownloadURL");
-			LLNotificationsUtil::add("UnknownScriptQuestion",args,payload);
+		{
+			// This is in addition to the normal dialog.
+			// Viewer got a request for not supported/implemented permission 
+			LL_WARNS("Messaging") << "Object \"" << object_name << "\" requested " << script_question
+								<< " permission. Permission is unknown and can't be granted. Item id: " << itemid
+								<< " taskid:" << taskid << LL_ENDL;
 		}
 		
 		if (known_questions)
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 23a8d21f8a..efc5a30b63 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -7766,28 +7766,6 @@ Do not allow access if you do not fully understand why it wants access to your a
     </footer>
   </notification>
 
-  <notification
-   icon="notify.tga"
-	 name="UnknownScriptQuestion"
-	 persist="false"
-	 type="notify">
-The runtime script permission requested by &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, an object owned by &apos;[NAME]&apos;, isn&apos;t recognized by the viewer and can&apos;t be granted.
-
-To grant this permission please update your viewer to the latest version from [DOWNLOADURL].
-		<tag>confirm</tag>
-		<form name="form">
-			<button
-			 default="true"
-			 index="1"
-			 name="Deny"
-			 text="Ok"/>
-			<button
-			 index="2"
-			 name="Mute"
-			 text="Block"/>
-		</form>
-	</notification>
-
 	<notification
    icon="notify.tga"
    name="ScriptDialog"
-- 
cgit v1.2.3


From 59e47021a0a39324bd318ffb974730f253f753e9 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Thu, 7 Feb 2019 18:38:42 +0200
Subject: SL-10349 Tooltips consistency

---
 indra/newview/skins/default/xui/en/floater_bulk_perms.xml  | 6 +++++-
 indra/newview/skins/default/xui/en/floater_tools.xml       | 6 +++++-
 indra/newview/skins/default/xui/en/sidepanel_item_info.xml | 5 ++++-
 indra/newview/skins/default/xui/en/sidepanel_task_info.xml | 4 ++++
 4 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml
index e7ab3cacdc..9fa93b640f 100644
--- a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml
@@ -213,6 +213,7 @@
      layout="topleft"
      top_pad="0"
      name="share_with_group"
+     tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
      width="92" />
         <text
      type="string"
@@ -234,6 +235,7 @@
      layout="topleft"
      top_pad="0"
      name="everyone_copy"
+     tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive"
      width="92" />
     <text
      type="string"
@@ -254,6 +256,7 @@
      label="Modify"
      layout="topleft"
      name="next_owner_modify"
+     tool_tip="Next owner can edit properties like item name or scale of this object."
      top_pad="0"
      width="92" />
     <check_box
@@ -263,6 +266,7 @@
      layout="topleft"
      top_pad="0"
      name="next_owner_copy"
+     tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied."
      width="92">
       <check_box.commit_callback
        function="BulkPermission.CommitCopy"/>
@@ -276,7 +280,7 @@
      label="Transfer"
      layout="topleft"
      name="next_owner_transfer"
-     tool_tip="Next owner can give away or resell this object"
+     tool_tip="Next owner can give away or resell this object."
      width="92" />
     <scroll_list
      enabled="false"
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index d9a15fed9e..ae0820c3ac 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -1219,6 +1219,7 @@ even though the user gets a free copy.
              label="Move"
              layout="topleft"
              name="checkbox allow everyone move"
+             tool_tip="Anyone can move the object."
              left="10"
              width="85" />
             <check_box
@@ -1227,6 +1228,7 @@ even though the user gets a free copy.
              layout="topleft"
              left_pad="0"
              name="checkbox allow everyone copy"
+             tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive."
              width="90" />
             <text
                type="string"
@@ -1244,6 +1246,7 @@ even though the user gets a free copy.
              left="10"
              height="10"
              name="checkbox next owner can modify"
+             tool_tip="Next owner can edit properties like item name or scale of this object."
              width="85" />
             <check_box
              follows="left|top|right"
@@ -1252,6 +1255,7 @@ even though the user gets a free copy.
              layout="topleft"
              left_pad="0"
              name="checkbox next owner can copy"
+             tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied."
              width="80" />
             <check_box
              follows="left|top|right"
@@ -1261,7 +1265,7 @@ even though the user gets a free copy.
              name="checkbox next owner can transfer"
              left_pad="0"
              top_delta="0"
-             tool_tip="Next owner can give away or resell this object"
+             tool_tip="Next owner can give away or resell this object."
              width="100" />
 <!-- *NOTE: These "B/O/G/E/N/F fields may overlap "perm_modify" above, 
      but that's OK, this is used only for debugging. -->
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index fd14b13ed6..ca1dc87134 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -351,6 +351,7 @@
           layout="topleft"
           left_pad="0"
           name="CheckEveryoneCopy"
+          tool_tip="Anyone can take a copy of the object . Object and all of its contents must be copy and transfer permissive."
           top_delta="-2"
           width="150" />
         <text
@@ -394,6 +395,7 @@
           left="20"
           top_pad="0"
           name="CheckNextOwnerModify"
+          tool_tip="Next owner can edit properties like item name or scale of this object."
           width="90" />
         <check_box
           height="18"
@@ -401,6 +403,7 @@
           layout="topleft"
           left_pad="0"
           name="CheckNextOwnerCopy"
+          tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied."
           width="90" />
         <check_box
           height="18"
@@ -408,7 +411,7 @@
           layout="topleft"
           left_pad="0"
           name="CheckNextOwnerTransfer"
-          tool_tip="Next owner can give away or resell this object"
+          tool_tip="Next owner can give away or resell this object."
           width="106" />
       </panel>
       <check_box
diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
index efedb9559e..713d5f94bb 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
@@ -344,6 +344,7 @@
 			 layout="topleft"
 			 left_pad="0"
              name="checkbox allow everyone copy"
+             tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive."
 			 top_delta="-2"
 			 width="90" />
 	    <check_box
@@ -351,6 +352,7 @@
              label="Move"
              layout="topleft"
              name="checkbox allow everyone move"
+             tool_tip="Anyone can move the object."
 			 left_pad="0"
              width="150" />
 	       	<text
@@ -394,6 +396,7 @@
 			 left="20"
 			 top_pad="0"
              name="checkbox next owner can modify"
+             tool_tip="Next owner can edit properties like item name or scale of this object."
 			 width="90" />
 	    <check_box
 			 height="18"
@@ -401,6 +404,7 @@
 			 layout="topleft"
 			 left_pad="0"
              name="checkbox next owner can copy"
+             tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied."
 			 width="90" />
 	    <check_box
 			 height="18"
-- 
cgit v1.2.3


From eb1c3c5cbbbe687235dc7db2d527e04578ea1d54 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Fri, 8 Feb 2019 22:22:06 +0200
Subject: Fix for teamcity W64 build freeze.

---
 indra/llcorehttp/tests/test_httprequest.hpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/indra/llcorehttp/tests/test_httprequest.hpp b/indra/llcorehttp/tests/test_httprequest.hpp
index b450f3502e..4ac3f6f991 100644
--- a/indra/llcorehttp/tests/test_httprequest.hpp
+++ b/indra/llcorehttp/tests/test_httprequest.hpp
@@ -2903,6 +2903,9 @@ void HttpRequestTestObjectType::test<22>()
 	
 	set_test_name("BUG-2295");
 
+#if LL_WINDOWS && ADDRESS_SIZE == 64
+	skip("BUG-2295 - partial load on W64 causes freeze");
+#endif
 	// Handler can be stack-allocated *if* there are no dangling
 	// references to it after completion of this method.
 	// Create before memory record as the string copy will bump numbers.
@@ -2921,6 +2924,7 @@ void HttpRequestTestObjectType::test<22>()
         // options set
         options = HttpOptions::ptr_t(new HttpOptions());
 		options->setRetries(1);			// Partial_File is retryable and can timeout in here
+		options->setDNSCacheTimeout(30);
 
 		// Get singletons created
 		HttpRequest::createService();
-- 
cgit v1.2.3


From b31cd0a7e927920fae820582fcff78078e6f3bfc Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Mon, 11 Feb 2019 17:40:41 +0200
Subject: SL-10347 Fixed Users can't exchange text messages after moderator
 click on "Mute everyone"

---
 indra/newview/llconversationmodel.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp
index ebbbf23dee..bea1f78284 100644
--- a/indra/newview/llconversationmodel.cpp
+++ b/indra/newview/llconversationmodel.cpp
@@ -605,16 +605,16 @@ void LLConversationItemParticipant::muteVoice(bool mute_voice)
 	LLAvatarName av_name;
 	LLAvatarNameCache::get(mUUID, &av_name);
 	LLMuteList * mute_listp = LLMuteList::getInstance();
-	bool voice_already_muted = mute_listp->isMuted(mUUID, av_name.getUserName());
+	bool voice_already_muted = mute_listp->isMuted(mUUID, av_name.getUserName(), LLMute::flagVoiceChat);
 
 	LLMute mute(mUUID, av_name.getUserName(), LLMute::AGENT);
 	if (voice_already_muted && !mute_voice)
 	{
-		mute_listp->remove(mute);
+		mute_listp->remove(mute, LLMute::flagVoiceChat);
 	}
 	else if (!voice_already_muted && mute_voice)
 	{
-		mute_listp->add(mute);
+		mute_listp->add(mute, LLMute::flagVoiceChat);
 	}
 }
 
-- 
cgit v1.2.3


From 3a8053eb9fc0db52b9fb5ae02f1807acbb4e072d Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Mon, 11 Feb 2019 19:01:28 +0200
Subject: SL-10351 Fixed Avatars muted by Group moderator become Blocked
 forever

---
 indra/newview/llconversationmodel.cpp |  6 ++++--
 indra/newview/llconversationmodel.h   |  3 +++
 indra/newview/llconversationview.cpp  | 14 ++++++++++++++
 indra/newview/llconversationview.h    |  1 +
 indra/newview/lloutputmonitorctrl.cpp |  5 +++--
 indra/newview/lloutputmonitorctrl.h   |  6 +++++-
 6 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp
index bea1f78284..c715815208 100644
--- a/indra/newview/llconversationmodel.cpp
+++ b/indra/newview/llconversationmodel.cpp
@@ -351,7 +351,7 @@ void LLConversationItemSession::setParticipantIsMuted(const LLUUID& participant_
 	LLConversationItemParticipant* participant = findParticipant(participant_id);
 	if (participant)
 	{
-		participant->muteVoice(is_muted);
+		participant->moderateVoice(is_muted);
 	}
 }
 
@@ -498,6 +498,7 @@ void LLConversationItemSession::onAvatarNameCache(const LLAvatarName& av_name)
 
 LLConversationItemParticipant::LLConversationItemParticipant(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) :
 	LLConversationItem(display_name,uuid,root_view_model),
+	mIsModeratorMuted(false),
 	mIsModerator(false),
 	mDisplayModeratorLabel(false),
 	mDistToAgent(-1.0)
@@ -508,6 +509,7 @@ LLConversationItemParticipant::LLConversationItemParticipant(std::string display
 
 LLConversationItemParticipant::LLConversationItemParticipant(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) :
 	LLConversationItem(uuid,root_view_model),
+	mIsModeratorMuted(false),
 	mIsModerator(false),
 	mDisplayModeratorLabel(false),
 	mDistToAgent(-1.0)
@@ -597,7 +599,7 @@ void LLConversationItemParticipant::setDisplayModeratorRole(bool displayRole)
 
 bool LLConversationItemParticipant::isVoiceMuted()
 {
-	return LLMuteList::getInstance()->isMuted(mUUID, LLMute::flagVoiceChat);
+	return mIsModeratorMuted || LLMuteList::getInstance()->isMuted(mUUID, LLMute::flagVoiceChat);
 }
 
 void LLConversationItemParticipant::muteVoice(bool mute_voice)
diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h
index 3868bafae4..2da9f03c6c 100644
--- a/indra/newview/llconversationmodel.h
+++ b/indra/newview/llconversationmodel.h
@@ -194,8 +194,10 @@ public:
 	virtual const std::string& getDisplayName() const { return mDisplayName; }
 
 	bool isVoiceMuted();
+	bool isModeratorMuted() { return mIsModeratorMuted; }
 	bool isModerator() const { return mIsModerator; }
 	void muteVoice(bool mute_voice);
+	void moderateVoice(bool mute_voice) { mIsModeratorMuted = mute_voice; }
 	void setIsModerator(bool is_moderator) { mIsModerator = is_moderator; mNeedsRefresh = true; }
 	void setTimeNow() { mLastActiveTime = LLFrameTimer::getElapsedSeconds(); mNeedsRefresh = true; }
 	void setDistance(F64 dist) { mDistToAgent = dist; mNeedsRefresh = true; }
@@ -216,6 +218,7 @@ private:
 	void onAvatarNameCache(const LLAvatarName& av_name);	// callback used by fetchAvatarName
 	void updateName(const LLAvatarName& av_name);
 
+	bool mIsModeratorMuted;	         // default is false
 	bool mIsModerator;	         // default is false
 	bool mDisplayModeratorLabel; // default is false
 	std::string mDisplayName;
diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp
index 15a8aacd37..dee0a52ce8 100644
--- a/indra/newview/llconversationview.cpp
+++ b/indra/newview/llconversationview.cpp
@@ -605,6 +605,20 @@ S32 LLConversationViewParticipant::arrange(S32* width, S32* height)
     return arranged;
 }
 
+// virtual
+void LLConversationViewParticipant::refresh()
+{
+	// Refresh the participant view from its model data
+	LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(getViewModelItem());
+	participant_model->resetRefresh();
+	
+	// *TODO: We should also do something with vmi->isModerator() to echo that state in the UI somewhat
+	mSpeakingIndicator->setIsModeratorMuted(participant_model->isModeratorMuted());
+	
+	// Do the regular upstream refresh
+	LLFolderViewItem::refresh();
+}
+
 void LLConversationViewParticipant::addToFolder(LLFolderViewFolder* folder)
 {
     // Add the item to the folder (conversation)
diff --git a/indra/newview/llconversationview.h b/indra/newview/llconversationview.h
index 5a74974302..06ffb517bb 100644
--- a/indra/newview/llconversationview.h
+++ b/indra/newview/llconversationview.h
@@ -136,6 +136,7 @@ public:
     virtual ~LLConversationViewParticipant( void );
 
     bool hasSameValue(const LLUUID& uuid) { return (uuid == mUUID); }
+    /*virtual*/ void refresh();
     void addToFolder(LLFolderViewFolder* folder);
 	void addToSession(const LLUUID& session_id);
 
diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp
index 6c26073d5b..c5e4593b79 100644
--- a/indra/newview/lloutputmonitorctrl.cpp
+++ b/indra/newview/lloutputmonitorctrl.cpp
@@ -72,6 +72,7 @@ LLOutputMonitorCtrl::LLOutputMonitorCtrl(const LLOutputMonitorCtrl::Params& p)
 	mImageLevel3(p.image_level_3),
 	mAutoUpdate(p.auto_update),
 	mSpeakerId(p.speaker_id),
+	mIsModeratorMuted(false),
 	mIsAgentControl(false),
 	mIndicatorToggled(false),
 	mShowParticipantsSpeaking(false)
@@ -124,7 +125,7 @@ void LLOutputMonitorCtrl::draw()
 	const F32 LEVEL_1 = LLVoiceClient::OVERDRIVEN_POWER_LEVEL * 2.f / 3.f;
 	const F32 LEVEL_2 = LLVoiceClient::OVERDRIVEN_POWER_LEVEL;
 
-	if (getVisible() && mAutoUpdate && !mIsMuted && mSpeakerId.notNull())
+	if (getVisible() && mAutoUpdate && !getIsMuted() && mSpeakerId.notNull())
 	{
 		setPower(LLVoiceClient::getInstance()->getCurrentPower(mSpeakerId));
 		if(mIsAgentControl)
@@ -156,7 +157,7 @@ void LLOutputMonitorCtrl::draw()
 	}
 
 	LLPointer<LLUIImage> icon;
-	if (mIsMuted)
+	if (getIsMuted())
 	{
 		icon = mImageMute;
 	}
diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h
index 0682af1278..af52a81b04 100644
--- a/indra/newview/lloutputmonitorctrl.h
+++ b/indra/newview/lloutputmonitorctrl.h
@@ -72,7 +72,10 @@ public:
 
 	void			setPower(F32 val);
 	F32				getPower(F32 val) const { return mPower; }
-	
+
+	bool			getIsMuted() const { return (mIsMuted || mIsModeratorMuted); }
+	void			setIsModeratorMuted(bool val) { mIsModeratorMuted = val; }
+
 	// For the current user, need to know the PTT state to show
 	// correct button image.
 	void			setIsAgentControl(bool val) { mIsAgentControl = val; }
@@ -131,6 +134,7 @@ private:
 
 	F32				mPower;
 	bool			mIsAgentControl;
+	bool			mIsModeratorMuted;
 	bool			mIsMuted;
 	bool			mIsTalking;
 	bool			mShowParticipantsSpeaking;
-- 
cgit v1.2.3


From 6f1e08f22d6cf9330899fd355cb7433897b93b48 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Tue, 12 Feb 2019 11:24:37 +0200
Subject: SL-10505 FIXED Right clicking on any name in Friends list accesses
 every chat .txt file stored

---
 indra/newview/lllogchat.cpp | 139 +++++++++++++++++---------------------------
 indra/newview/lllogchat.h   |   1 +
 2 files changed, 53 insertions(+), 87 deletions(-)

diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index c9889667b4..1bdeddbcfe 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -573,40 +573,10 @@ void LLLogChat::findTranscriptFiles(std::string pattern, std::vector<std::string
 	while (iter.next(filename))
 	{
 		std::string fullname = gDirUtilp->add(dirname, filename);
-
-		LLFILE * filep = LLFile::fopen(fullname, "rb");
-		if (NULL != filep)
+		if (isTranscriptFileFound(fullname))
 		{
-			if(makeLogFileName("chat")== fullname)
-			{
-				//Add Nearby chat history to the list of transcriptions
-				list_of_transcriptions.push_back(gDirUtilp->add(dirname, filename));
-				LLFile::close(filep);
-				continue;
-			}
-			char buffer[LOG_RECALL_SIZE];
-
-			fseek(filep, 0, SEEK_END);			// seek to end of file
-			S32 bytes_to_read = ftell(filep);	// get current file pointer
-			fseek(filep, 0, SEEK_SET);			// seek back to beginning of file
-
-			// limit the number characters to read from file
-			if (bytes_to_read >= LOG_RECALL_SIZE)
-			{
-				bytes_to_read = LOG_RECALL_SIZE - 1;
-			}
-
-			if (bytes_to_read > 0 && NULL != fgets(buffer, bytes_to_read, filep))
-			{
-				//matching a timestamp
-				boost::match_results<std::string::const_iterator> matches;
-				if (boost::regex_match(std::string(buffer), matches, TIMESTAMP))
-				{
-					list_of_transcriptions.push_back(gDirUtilp->add(dirname, filename));
-				}
-			}
-			LLFile::close(filep);
-		}
+			list_of_transcriptions.push_back(fullname);
+		}		
 	}
 }
 
@@ -756,75 +726,70 @@ void LLLogChat::deleteTranscripts()
 // static
 bool LLLogChat::isTranscriptExist(const LLUUID& avatar_id, bool is_group)
 {
-	std::vector<std::string> list_of_transcriptions;
-	LLLogChat::getListOfTranscriptFiles(list_of_transcriptions);
-
-	if (list_of_transcriptions.size() > 0)
+	LLAvatarName avatar_name;
+	LLAvatarNameCache::get(avatar_id, &avatar_name);
+	std::string avatar_user_name = avatar_name.getAccountName();
+	if(!is_group)
 	{
-		LLAvatarName avatar_name;
-		LLAvatarNameCache::get(avatar_id, &avatar_name);
-		std::string avatar_user_name = avatar_name.getAccountName();
-		if(!is_group)
-		{
-			std::replace(avatar_user_name.begin(), avatar_user_name.end(), '.', '_');
-			BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions)
-			{
-				if (std::string::npos != transcript_file_name.find(avatar_user_name))
-				{
-					return true;
-				}
-			}
-		}
-		else
-		{
-			std::string file_name;
-			gCacheName->getGroupName(avatar_id, file_name);
-			file_name = makeLogFileName(file_name);
-			BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions)
-			{
-				if (transcript_file_name == file_name)
-				{
-					return true;
-				}
-			}
-		}
-
+		std::replace(avatar_user_name.begin(), avatar_user_name.end(), '.', '_');
+		return isTranscriptFileFound(makeLogFileName(avatar_user_name));
+	}
+	else
+	{
+		std::string file_name;
+		gCacheName->getGroupName(avatar_id, file_name);
+		file_name = makeLogFileName(file_name);
+		return isTranscriptFileFound(makeLogFileName(file_name));
 	}
-
 	return false;
 }
 
 bool LLLogChat::isNearbyTranscriptExist()
 {
-	std::vector<std::string> list_of_transcriptions;
-	LLLogChat::getListOfTranscriptFiles(list_of_transcriptions);
-
-	std::string file_name;
-	file_name = makeLogFileName("chat");
-	BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions)
-	{
-	   	if (transcript_file_name == file_name)
-	   	{
-			return true;
-		 }
-	}
-	return false;
+	return isTranscriptFileFound(makeLogFileName("chat"));;
 }
 
 bool LLLogChat::isAdHocTranscriptExist(std::string file_name)
 {
-	std::vector<std::string> list_of_transcriptions;
-	LLLogChat::getListOfTranscriptFiles(list_of_transcriptions);
+	return isTranscriptFileFound(makeLogFileName(file_name));;
+}
 
-	file_name = makeLogFileName(file_name);
-	BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions)
+// static
+bool LLLogChat::isTranscriptFileFound(std::string fullname)
+{
+	bool result = false;
+	LLFILE * filep = LLFile::fopen(fullname, "rb");
+	if (NULL != filep)
 	{
-	   	if (transcript_file_name == file_name)
-	   	{
-	   		return true;
+		if (makeLogFileName("chat") == fullname)
+		{
+			LLFile::close(filep);
+			return true;
+		}
+		char buffer[LOG_RECALL_SIZE];
+
+		fseek(filep, 0, SEEK_END);			// seek to end of file
+		S32 bytes_to_read = ftell(filep);	// get current file pointer
+		fseek(filep, 0, SEEK_SET);			// seek back to beginning of file
+
+		// limit the number characters to read from file
+		if (bytes_to_read >= LOG_RECALL_SIZE)
+		{
+			bytes_to_read = LOG_RECALL_SIZE - 1;
 		}
+
+		if (bytes_to_read > 0 && NULL != fgets(buffer, bytes_to_read, filep))
+		{
+			//matching a timestamp
+			boost::match_results<std::string::const_iterator> matches;
+			if (boost::regex_match(std::string(buffer), matches, TIMESTAMP))
+			{
+				result = true;
+			}
+		}
+		LLFile::close(filep);
 	}
-	return false;
+	return result;
 }
 
 //*TODO mark object's names in a special way so that they will be distinguishable form avatar name 
diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h
index 6022e539a9..fcbd38a044 100644
--- a/indra/newview/lllogchat.h
+++ b/indra/newview/lllogchat.h
@@ -121,6 +121,7 @@ public:
 	static bool isTranscriptExist(const LLUUID& avatar_id, bool is_group=false);
 	static bool isNearbyTranscriptExist();
 	static bool isAdHocTranscriptExist(std::string file_name);
+	static bool isTranscriptFileFound(std::string fullname);
 
 	static bool historyThreadsFinished(LLUUID session_id);
 	static LLLoadHistoryThread* getLoadHistoryThread(LLUUID session_id);
-- 
cgit v1.2.3


From 00a6c069f21a7dcde52247e8bdf902e50369cc00 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Wed, 13 Feb 2019 16:55:22 +0200
Subject: SL-10328 FIXED Some parameters are not reset in the Upload Model menu
 when pressing button 'Clear settings & reset form'

---
 indra/newview/llfloatermodelpreview.cpp | 62 ++++++++++++++++++++++++++-------
 indra/newview/llfloatermodelpreview.h   |  5 ++-
 2 files changed, 53 insertions(+), 14 deletions(-)

diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 616bee84fd..e39e210939 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -304,10 +304,10 @@ BOOL LLFloaterModelPreview::postBuild()
 		getChild<LLSpinCtrl>("lod_triangle_limit_" + lod_name[lod])->setCommitCallback(boost::bind(&LLFloaterModelPreview::onLODParamCommit, this, lod, true));
 	}
 
-	childSetCommitCallback("upload_skin", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);
-	childSetCommitCallback("upload_joints", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);
-	childSetCommitCallback("lock_scale_if_joint_position", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);
-	childSetCommitCallback("upload_textures", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);
+	childSetCommitCallback("upload_skin", boost::bind(&LLFloaterModelPreview::onUploadOptionChecked, this, _1), NULL);
+	childSetCommitCallback("upload_joints", boost::bind(&LLFloaterModelPreview::onUploadOptionChecked, this, _1), NULL);
+	childSetCommitCallback("lock_scale_if_joint_position", boost::bind(&LLFloaterModelPreview::onUploadOptionChecked, this, _1), NULL);
+	childSetCommitCallback("upload_textures", boost::bind(&LLFloaterModelPreview::onUploadOptionChecked, this, _1), NULL);
 
 	childSetTextArg("status", "[STATUS]", getString("status_idle"));
 
@@ -449,6 +449,16 @@ void LLFloaterModelPreview::initModelPreview()
 	mModelPreview->setModelUpdatedCallback(boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this, _1));
 }
 
+void LLFloaterModelPreview::onUploadOptionChecked(LLUICtrl* ctrl)
+{
+	if (mModelPreview)
+	{
+		auto name = ctrl->getName();
+		mModelPreview->mViewOption[name] = !mModelPreview->mViewOption[name];
+	}
+	toggleCalculateButton(true);
+}
+
 void LLFloaterModelPreview::onViewOptionChecked(LLUICtrl* ctrl)
 {
 	if (mModelPreview)
@@ -631,6 +641,7 @@ void LLFloaterModelPreview::onGenerateNormalsCommit(LLUICtrl* ctrl, void* userda
 void LLFloaterModelPreview::toggleGenarateNormals()
 {
 	bool enabled = childGetValue("gen_normals").asBoolean();
+	mModelPreview->mViewOption["gen_normals"] = enabled;
 	childSetEnabled("crease_angle", enabled);
 	if(enabled) {
 		mModelPreview->generateNormals();
@@ -1156,10 +1167,8 @@ void LLFloaterModelPreview::initDecompControls()
 							std::string label = llformat("%.1f", value);
 							combo_box->add(label, value, ADD_BOTTOM, true);
 						}
-						combo_box->setValue(param[i].mDefault.mFloat);
-
 					}
-
+					combo_box->setValue(param[i].mDefault.mFloat);
 					combo_box->setCommitCallback(onPhysicsParamCommit, (void*) &param[i]);
 				}
 			}
@@ -1231,7 +1240,7 @@ void LLFloaterModelPreview::initDecompControls()
 			//LL_INFOS() << "-----------------------------" << LL_ENDL;
 		}
 	}
-
+	mDefaultDecompParams = mDecompParams;
 	childSetCommitCallback("physics_explode", LLFloaterModelPreview::onExplodeCommit, this);
 }
 
@@ -4420,6 +4429,7 @@ void LLFloaterModelPreview::onReset(void* user_data)
 	std::string filename = mp->mLODFile[LLModel::LOD_HIGH]; 
 
 	fmp->resetDisplayOptions();
+	fmp->resetUploadOptions();
 	//reset model preview
 	fmp->initModelPreview();
 
@@ -4533,11 +4543,6 @@ void LLFloaterModelPreview::setStatusMessage(const std::string& msg)
 	mStatusMessage = msg;
 }
 
-void LLFloaterModelPreview::toggleCalculateButton()
-{
-	toggleCalculateButton(true);
-}
-
 void LLFloaterModelPreview::toggleCalculateButton(bool visible)
 {
 	mCalculateBtn->setVisible(visible);
@@ -4599,6 +4604,37 @@ void LLFloaterModelPreview::resetDisplayOptions()
 	}
 }
 
+void LLFloaterModelPreview::resetUploadOptions()
+{
+	childSetValue("import_scale", 1);
+	childSetValue("pelvis_offset", 0);
+	childSetValue("physics_explode", 0);
+	childSetValue("physics_file", "");
+	childSetVisible("Retain%", false);
+	childSetVisible("Retain%_label", false);
+	childSetVisible("Detail Scale", true);
+	childSetVisible("Detail Scale label", true);
+
+	getChild<LLComboBox>("lod_source_" + lod_name[NUM_LOD - 1])->setCurrentByIndex(LLModelPreview::LOD_FROM_FILE);
+	for (S32 lod = 0; lod < NUM_LOD - 1; ++lod)
+	{
+		getChild<LLComboBox>("lod_source_" + lod_name[lod])->setCurrentByIndex(LLModelPreview::GENERATE);
+		childSetValue("lod_file_" + lod_name[lod], "");
+	}
+
+	getChild<LLComboBox>("physics_lod_combo")->setCurrentByIndex(0);
+
+	for(auto& p : mDefaultDecompParams)
+	{
+		std::string ctrl_name(p.first);
+		LLUICtrl* ctrl = getChild<LLUICtrl>(ctrl_name);
+		if (ctrl)
+		{
+			ctrl->setValue(p.second);
+		}
+	}
+}
+
 void LLFloaterModelPreview::onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url)
 {
 	mModelPhysicsFee = result;
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index 564f4c39de..41208daa64 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -109,6 +109,7 @@ public:
 	void 			loadModel(S32 lod, const std::string& file_name, bool force_disable_slm = false);
 	
 	void onViewOptionChecked(LLUICtrl* ctrl);
+	void onUploadOptionChecked(LLUICtrl* ctrl);
 	bool isViewOptionChecked(const LLSD& userdata);
 	bool isViewOptionEnabled(const LLSD& userdata);
 	void setViewOptionEnabled(const std::string& option, bool enabled);
@@ -179,6 +180,7 @@ protected:
 	LLModelPreview*	mModelPreview;
 	
 	LLPhysicsDecomp::decomp_params mDecompParams;
+	LLPhysicsDecomp::decomp_params mDefaultDecompParams;
 	
 	S32				mLastMouseX;
 	S32				mLastMouseY;
@@ -203,7 +205,6 @@ protected:
 
 private:
 	void onClickCalculateBtn();
-	void toggleCalculateButton();
 
 	void onLoDSourceCommit(S32 lod);
 
@@ -213,6 +214,8 @@ private:
 	// resets display options of model preview to their defaults.
 	void resetDisplayOptions();
 
+	void resetUploadOptions();
+
 	void createSmoothComboBox(LLComboBox* combo_box, float min, float max);
 
 	LLButton* mUploadBtn;
-- 
cgit v1.2.3


From ffc64187940c5df230d9dcead5c8716c10f109a9 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Thu, 14 Feb 2019 16:37:11 +0200
Subject: SL-10545 Provide summary memory information in Top Scripts

---
 indra/newview/llfloatertopobjects.cpp                      | 6 +++++-
 indra/newview/skins/default/xui/en/floater_top_objects.xml | 2 +-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp
index 9b5b3a0fc9..bd49405f34 100644
--- a/indra/newview/llfloatertopobjects.cpp
+++ b/indra/newview/llfloatertopobjects.cpp
@@ -143,6 +143,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
 {
     U32 request_flags;
 	U32 total_count;
+	U64 total_memory = 0;
 
 	msg->getU32Fast(_PREHASH_RequestData, _PREHASH_RequestFlags, request_flags);
 	msg->getU32Fast(_PREHASH_RequestData, _PREHASH_TotalObjectCount, total_count);
@@ -190,6 +191,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
 			{
 				parcel_buf = parcel_name;
 				script_memory = script_size;
+				total_memory += script_size;
 			}
 		}
 
@@ -263,8 +265,10 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
 	{
 		setTitle(getString("top_scripts_title"));
 		list->setColumnLabel("score", getString("scripts_score_label"));
-		
+
 		LLUIString format = getString("top_scripts_text");
+		total_memory /= 1024;
+		format.setArg("[MEMORY]", llformat("%ld", total_memory));
 		format.setArg("[COUNT]", llformat("%d", total_count));
 		format.setArg("[TIME]", llformat("%0.3f", mtotalScore));
 		getChild<LLUICtrl>("title_text")->setValue(LLSD(format));
diff --git a/indra/newview/skins/default/xui/en/floater_top_objects.xml b/indra/newview/skins/default/xui/en/floater_top_objects.xml
index ceef541290..b82fe43e74 100644
--- a/indra/newview/skins/default/xui/en/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/en/floater_top_objects.xml
@@ -16,7 +16,7 @@
     </floater.string>
     <floater.string
      name="top_scripts_text">
-        [COUNT] scripts taking a total of [TIME] ms
+        [COUNT] scripts taking a total of [TIME] ms and using [MEMORY] KB
     </floater.string>
     <floater.string
      name="scripts_score_label">
-- 
cgit v1.2.3


From fb085b8e61832bfc5222636f96fb802cec5ca9a2 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Thu, 14 Feb 2019 20:36:34 +0200
Subject: SL-1005 Changed media event is not firing when the URL is amended by
 a '#' since Alex-Ivy

---
 indra/newview/llviewermedia.cpp | 35 +++++++++++++++++++++++++++++++++--
 1 file changed, 33 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index f4e1524371..d8745b1eca 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -3320,8 +3320,39 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
 			}
 			else
 			{
-				// Don't track redirects.
-				setNavState(MEDIANAVSTATE_NONE);
+				bool internal_nav = false;
+				if (url != mCurrentMediaURL)
+				{
+					// Check if it is internal navigation
+					// Note: Not sure if we should detect internal navigations as 'address change',
+					// but they are not redirects and do not cause NAVIGATE_BEGIN (also see SL-1005)
+					size_t pos = url.find("#");
+					if (pos != std::string::npos)
+					{
+						// assume that new link always have '#', so this is either
+						// transfer from 'link#1' to 'link#2' or from link to 'link#2'
+						// filter out cases like 'redirect?link'
+						std::string base_url = url.substr(0, pos);
+						pos = mCurrentMediaURL.find(base_url);
+						if (pos == 0)
+						{
+							// base link hasn't changed
+							internal_nav = true;
+						}
+					}
+				}
+
+				if (internal_nav)
+				{
+					// Internal navigation by '#'
+					mCurrentMediaURL = url;
+					setNavState(MEDIANAVSTATE_FIRST_LOCATION_CHANGED);
+				}
+				else
+				{
+					// Don't track redirects.
+					setNavState(MEDIANAVSTATE_NONE);
+				}
 			}
 		}
 		break;
-- 
cgit v1.2.3


From d6a4504cd86de0ffa86c7b0341f729e913b1a15e Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Fri, 15 Feb 2019 14:55:56 +0200
Subject: SL-10549 FIXED The 'Save' button remains disabled after changing the
 classified image

---
 indra/newview/llpanelclassified.cpp | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index b9b97f4cce..6d0c30fbf3 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -628,12 +628,9 @@ BOOL LLPanelClassifiedEdit::postBuild()
 {
 	LLPanelClassifiedInfo::postBuild();
 
-	LLTextureCtrl* snapshot = getChild<LLTextureCtrl>("classified_snapshot");
-	snapshot->setOnSelectCallback(boost::bind(&LLPanelClassifiedEdit::onChange, this));
-
 	LLUICtrl* edit_icon = getChild<LLUICtrl>("edit_icon");
-	snapshot->setMouseEnterCallback(boost::bind(&LLPanelClassifiedEdit::onTexturePickerMouseEnter, this, edit_icon));
-	snapshot->setMouseLeaveCallback(boost::bind(&LLPanelClassifiedEdit::onTexturePickerMouseLeave, this, edit_icon));
+	mSnapshotCtrl->setMouseEnterCallback(boost::bind(&LLPanelClassifiedEdit::onTexturePickerMouseEnter, this, edit_icon));
+	mSnapshotCtrl->setMouseLeaveCallback(boost::bind(&LLPanelClassifiedEdit::onTexturePickerMouseLeave, this, edit_icon));
 	edit_icon->setVisible(false);
 
 	LLLineEditor* line_edit = getChild<LLLineEditor>("classified_name");
@@ -1130,6 +1127,7 @@ void LLPanelClassifiedEdit::onTexturePickerMouseLeave(LLUICtrl* ctrl)
 void LLPanelClassifiedEdit::onTextureSelected()
 {
 	setSnapshotId(mSnapshotCtrl->getValue().asUUID());
+	onChange();
 }
 
 //////////////////////////////////////////////////////////////////////////
-- 
cgit v1.2.3


From a8afd345a0ad36eda4b9edb0664004dbdd0b2082 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Fri, 15 Feb 2019 15:03:27 +0200
Subject: SL-10351 Cleanup

---
 indra/newview/llconversationmodel.cpp | 18 ------------------
 indra/newview/llconversationmodel.h   |  1 -
 2 files changed, 19 deletions(-)

diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp
index c715815208..c258136889 100644
--- a/indra/newview/llconversationmodel.cpp
+++ b/indra/newview/llconversationmodel.cpp
@@ -602,24 +602,6 @@ bool LLConversationItemParticipant::isVoiceMuted()
 	return mIsModeratorMuted || LLMuteList::getInstance()->isMuted(mUUID, LLMute::flagVoiceChat);
 }
 
-void LLConversationItemParticipant::muteVoice(bool mute_voice)
-{
-	LLAvatarName av_name;
-	LLAvatarNameCache::get(mUUID, &av_name);
-	LLMuteList * mute_listp = LLMuteList::getInstance();
-	bool voice_already_muted = mute_listp->isMuted(mUUID, av_name.getUserName(), LLMute::flagVoiceChat);
-
-	LLMute mute(mUUID, av_name.getUserName(), LLMute::AGENT);
-	if (voice_already_muted && !mute_voice)
-	{
-		mute_listp->remove(mute, LLMute::flagVoiceChat);
-	}
-	else if (!voice_already_muted && mute_voice)
-	{
-		mute_listp->add(mute, LLMute::flagVoiceChat);
-	}
-}
-
 //
 // LLConversationSort
 // 
diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h
index 2da9f03c6c..80385fad5f 100644
--- a/indra/newview/llconversationmodel.h
+++ b/indra/newview/llconversationmodel.h
@@ -196,7 +196,6 @@ public:
 	bool isVoiceMuted();
 	bool isModeratorMuted() { return mIsModeratorMuted; }
 	bool isModerator() const { return mIsModerator; }
-	void muteVoice(bool mute_voice);
 	void moderateVoice(bool mute_voice) { mIsModeratorMuted = mute_voice; }
 	void setIsModerator(bool is_moderator) { mIsModerator = is_moderator; mNeedsRefresh = true; }
 	void setTimeNow() { mLastActiveTime = LLFrameTimer::getElapsedSeconds(); mNeedsRefresh = true; }
-- 
cgit v1.2.3


From fddfe50ac125c1b25592ce30dbbb34363047cea1 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Fri, 15 Feb 2019 16:12:43 +0200
Subject: SL-10550 Update attachment location strings

---
 indra/newview/skins/default/xui/en/strings.xml | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index e8fdb2d5b1..d91f3ac095 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2675,14 +2675,14 @@ If you continue to receive this message, please contact Second Life support for
 
 	<string name="SITTING_ON">Sitting On</string>
 	<string name="ATTACH_CHEST">Chest</string>
-	<string name="ATTACH_HEAD">Head</string>
+	<string name="ATTACH_HEAD">Skull</string>
 	<string name="ATTACH_LSHOULDER">Left Shoulder</string>
 	<string name="ATTACH_RSHOULDER">Right Shoulder</string>
 	<string name="ATTACH_LHAND">Left Hand</string>
 	<string name="ATTACH_RHAND">Right Hand</string>
 	<string name="ATTACH_LFOOT">Left Foot</string>
 	<string name="ATTACH_RFOOT">Right Foot</string>
-	<string name="ATTACH_BACK">Back</string>
+	<string name="ATTACH_BACK">Spine</string>
 	<string name="ATTACH_PELVIS">Pelvis</string>
 	<string name="ATTACH_MOUTH">Mouth</string>
 	<string name="ATTACH_CHIN">Chin</string>
@@ -2692,16 +2692,16 @@ If you continue to receive this message, please contact Second Life support for
 	<string name="ATTACH_REYE">Right Eye</string>
 	<string name="ATTACH_NOSE">Nose</string>
 	<string name="ATTACH_RUARM">Right Upper Arm</string>
-	<string name="ATTACH_RLARM">Right Lower Arm</string>
+	<string name="ATTACH_RLARM">Right Forearm</string>
 	<string name="ATTACH_LUARM">Left Upper Arm</string>
-	<string name="ATTACH_LLARM">Left Lower Arm</string>
+	<string name="ATTACH_LLARM">Left Forearm</string>
 	<string name="ATTACH_RHIP">Right Hip</string>
 	<string name="ATTACH_RULEG">Right Upper Leg</string>
 	<string name="ATTACH_RLLEG">Right Lower Leg</string>
 	<string name="ATTACH_LHIP">Left Hip</string>
 	<string name="ATTACH_LULEG">Left Upper Leg</string>
 	<string name="ATTACH_LLLEG">Left Lower Leg</string>
-	<string name="ATTACH_BELLY">Belly</string>
+	<string name="ATTACH_BELLY">Stomach</string>
 	<string name="ATTACH_LEFT_PEC">Left Pec</string>
 	<string name="ATTACH_RIGHT_PEC">Right Pec</string>
 	<string name="ATTACH_HUD_CENTER_2">HUD Center 2</string>
-- 
cgit v1.2.3


From 0c8d51b8c8bdca567e349755393c57cd113a81f0 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Fri, 15 Feb 2019 20:41:03 +0200
Subject: SL-10234 Fixed The viewer shows installation language as system
 default

---
 indra/llui/llcombobox.cpp                          | 36 ++++++++--
 indra/newview/CMakeLists.txt                       |  1 +
 indra/newview/llfloaterpreference.cpp              | 81 ++++++++++++++++++++++
 indra/newview/llfloaterpreference.h                |  1 +
 indra/newview/skins/default/default_languages.xml  | 39 +++++++++++
 .../default/xui/da/panel_preferences_general.xml   |  1 -
 .../default/xui/de/panel_preferences_general.xml   |  1 -
 .../default/xui/en/panel_preferences_general.xml   |  5 --
 .../default/xui/es/panel_preferences_general.xml   |  1 -
 .../default/xui/fr/panel_preferences_general.xml   |  1 -
 .../default/xui/it/panel_preferences_general.xml   |  1 -
 .../default/xui/ja/panel_preferences_general.xml   |  1 -
 .../default/xui/pl/panel_preferences_general.xml   |  1 -
 .../default/xui/pt/panel_preferences_general.xml   |  1 -
 .../default/xui/ru/panel_preferences_general.xml   |  1 -
 .../default/xui/tr/panel_preferences_general.xml   |  1 -
 .../default/xui/zh/panel_preferences_general.xml   |  1 -
 17 files changed, 154 insertions(+), 20 deletions(-)
 create mode 100644 indra/newview/skins/default/default_languages.xml

diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp
index 00a933a0bb..b2ad38bddf 100644
--- a/indra/llui/llcombobox.cpp
+++ b/indra/llui/llcombobox.cpp
@@ -243,7 +243,14 @@ LLScrollListItem* LLComboBox::add(const std::string& name, EAddPosition pos, BOO
 	item->setEnabled(enabled);
 	if (!mAllowTextEntry && mLabel.empty())
 	{
-		selectFirstItem();
+		if (mControlVariable)
+		{
+			setValue(mControlVariable->getValue()); // selects the appropriate item
+		}
+		else
+		{
+			selectFirstItem();
+		}
 	}
 	return item;
 }
@@ -255,7 +262,14 @@ LLScrollListItem* LLComboBox::add(const std::string& name, const LLUUID& id, EAd
 	item->setEnabled(enabled);
 	if (!mAllowTextEntry && mLabel.empty())
 	{
-		selectFirstItem();
+		if (mControlVariable)
+		{
+			setValue(mControlVariable->getValue()); // selects the appropriate item
+		}
+		else
+		{
+			selectFirstItem();
+		}
 	}
 	return item;
 }
@@ -268,7 +282,14 @@ LLScrollListItem* LLComboBox::add(const std::string& name, void* userdata, EAddP
 	item->setUserdata( userdata );
 	if (!mAllowTextEntry && mLabel.empty())
 	{
-		selectFirstItem();
+		if (mControlVariable)
+		{
+			setValue(mControlVariable->getValue()); // selects the appropriate item
+		}
+		else
+		{
+			selectFirstItem();
+		}
 	}
 	return item;
 }
@@ -280,7 +301,14 @@ LLScrollListItem* LLComboBox::add(const std::string& name, LLSD value, EAddPosit
 	item->setEnabled(enabled);
 	if (!mAllowTextEntry && mLabel.empty())
 	{
-		selectFirstItem();
+		if (mControlVariable)
+		{
+			setValue(mControlVariable->getValue()); // selects the appropriate item
+		}
+		else
+		{
+			selectFirstItem();
+		}
 	}
 	return item;
 }
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index a8019ee168..60c27665bf 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1587,6 +1587,7 @@ endif (WINDOWS)
 # from within the IDE.
 set(viewer_XUI_FILES
     skins/default/colors.xml
+    skins/default/default_languages.xml
     skins/default/textures/textures.xml
     )
 file(GLOB DEFAULT_XUI_FILE_GLOB_LIST
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index c3dea73c05..a3821ef21a 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -138,6 +138,25 @@ static const F32 MIN_ARC_LOG = log(MIN_ARC_LIMIT);
 static const F32 MAX_ARC_LOG = log(MAX_ARC_LIMIT);
 static const F32 ARC_LIMIT_MAP_SCALE = (MAX_ARC_LOG - MIN_ARC_LOG) / (MAX_INDIRECT_ARC_LIMIT - MIN_INDIRECT_ARC_LIMIT);
 
+struct LabelDef : public LLInitParam::Block<LabelDef>
+{
+    Mandatory<std::string> name;
+    Mandatory<std::string> value;
+
+    LabelDef()
+        : name("name"),
+        value("value")
+    {}
+};
+
+struct LabelTable : public LLInitParam::Block<LabelTable>
+{
+    Multiple<LabelDef> labels;
+    LabelTable()
+        : labels("label")
+    {}
+};
+
 class LLVoiceSetKeyDialog : public LLModalDialog
 {
 public:
@@ -514,6 +533,29 @@ BOOL LLFloaterPreference::postBuild()
 	mFilterEdit = getChild<LLSearchEditor>("search_prefs_edit");
 	mFilterEdit->setKeystrokeCallback(boost::bind(&LLFloaterPreference::onUpdateFilterTerm, this, false));
 
+	// Load and assign label for 'default language'
+	std::string user_filename = gDirUtilp->getExpandedFilename(LL_PATH_DEFAULT_SKIN, "default_languages.xml");
+	std::map<std::string, std::string> labels;
+	if (loadFromFilename(user_filename, labels))
+	{
+		std::string system_lang = gSavedSettings.getString("SystemLanguage");
+		std::map<std::string, std::string>::iterator iter = labels.find(system_lang);
+		if (iter != labels.end())
+		{
+			getChild<LLComboBox>("language_combobox")->add(iter->second, LLSD("default"), ADD_TOP, true);
+		}
+		else
+		{
+			LL_WARNS() << "Language \"" << system_lang << "\" is not in default_languages.xml" << LL_ENDL;
+			getChild<LLComboBox>("language_combobox")->add("System default", LLSD("default"), ADD_TOP, true);
+		}
+	}
+	else
+	{
+		LL_WARNS() << "Failed to load labels from " << user_filename << ". Using default." << LL_ENDL;
+		getChild<LLComboBox>("language_combobox")->add("System default", LLSD("default"), ADD_TOP, true);
+	}
+
 	return TRUE;
 }
 
@@ -1979,6 +2021,45 @@ void LLFloaterPreference::updateMaxComplexity()
         getChild<LLTextBox>("IndirectMaxComplexityText"));
 }
 
+bool LLFloaterPreference::loadFromFilename(const std::string& filename, std::map<std::string, std::string> &label_map)
+{
+    LLXMLNodePtr root;
+
+    if (!LLXMLNode::parseFile(filename, root, NULL))
+    {
+        LL_WARNS() << "Unable to parse file " << filename << LL_ENDL;
+        return false;
+    }
+
+    if (!root->hasName("labels"))
+    {
+        LL_WARNS() << filename << " is not a valid definition file" << LL_ENDL;
+        return false;
+    }
+
+    LabelTable params;
+    LLXUIParser parser;
+    parser.readXUI(root, params, filename);
+
+    if (params.validateBlock())
+    {
+        for (LLInitParam::ParamIterator<LabelDef>::const_iterator it = params.labels.begin();
+            it != params.labels.end();
+            ++it)
+        {
+            LabelDef label_entry = *it;
+            label_map[label_entry.name] = label_entry.value;
+        }
+    }
+    else
+    {
+        LL_WARNS() << filename << " failed to load" << LL_ENDL;
+        return false;
+    }
+
+    return true;
+}
+
 void LLFloaterPreferenceGraphicsAdvanced::updateMaxComplexity()
 {
 	// Called when the IndirectMaxComplexity control changes
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index d609c42ebe..1b8229ada6 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -198,6 +198,7 @@ private:
 	void onDeleteTranscriptsResponse(const LLSD& notification, const LLSD& response);
 	void updateDeleteTranscriptsButton();
 	void updateMaxComplexity();
+	static bool loadFromFilename(const std::string& filename, std::map<std::string, std::string> &label_map);
 
 	static std::string sSkin;
 	notifications_map mNotificationOptions;
diff --git a/indra/newview/skins/default/default_languages.xml b/indra/newview/skins/default/default_languages.xml
new file mode 100644
index 0000000000..357930e1c5
--- /dev/null
+++ b/indra/newview/skins/default/default_languages.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<labels>
+	<label
+	 name="en"
+	 value="System default" />
+	<label
+	 name="it"
+	 value="Default di sistema" />
+	<label
+	 name="ja"
+	 value="システムデフォルト" />
+	<label
+	 name="pl"
+	 value="Domyślny" />
+	<label
+	 name="pt"
+	 value="Padrão" />
+	<label
+	 name="ru"
+	 value="Язык системы" />
+	<label
+	 name="tr"
+	 value="Sistem varsayılanı" />
+	<label
+	 name="zh"
+	 value="系統預設" />
+	<label
+	 name="da"
+	 value="System standard" />
+	<label
+	 name="de"
+	 value="Systemvorgabe" />
+	<label
+	 name="es"
+	 value="Predeterminado del sistema" />
+	<label
+	 name="fr"
+	 value="Choix par défaut" />
+</labels>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_general.xml b/indra/newview/skins/default/xui/da/panel_preferences_general.xml
index 5702d48e97..624c6634cc 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_general.xml
@@ -4,7 +4,6 @@
 		Sprog:
 	</text>
 	<combo_box name="language_combobox">
-		<combo_box.item label="System standard" name="System Default Language"/>
 		<combo_box.item label="English (Engelsk)" name="English"/>
 		<combo_box.item label="Dansk - Beta" name="Danish"/>
 		<combo_box.item label="Deutsch (Tysk) - Beta" name="Deutsch(German)"/>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_general.xml b/indra/newview/skins/default/xui/de/panel_preferences_general.xml
index 201998f220..c4705d7283 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_general.xml
@@ -4,7 +4,6 @@
 		Sprache:
 	</text>
 	<combo_box name="language_combobox">
-		<combo_box.item label="Systemvorgabe" name="System Default Language"/>
 		<combo_box.item label="English (Englisch)" name="English"/>
 		<combo_box.item label="Dansk (Dänisch) - Beta" name="Danish"/>
 		<combo_box.item label="Deutsch - Beta" name="Deutsch(German)"/>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
index 9da044ab64..335d7caa51 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -30,11 +30,6 @@
      max_chars="135"
      name="language_combobox"
      width="200">
-        <combo_box.item
-         enabled="true"
-         label="System default"
-         name="System Default Language"
-         value="default" />
         <combo_box.item
          enabled="true"
          label="English"
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_general.xml b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
index 7d3c33a781..d2246630d8 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
@@ -4,7 +4,6 @@
 		Idioma:
 	</text>
 	<combo_box name="language_combobox">
-		<combo_box.item label="Predeterminado del sistema" name="System Default Language"/>
 		<combo_box.item label="English (Inglés)" name="English"/>
 		<combo_box.item label="Dansk (danés) - Beta" name="Danish"/>
 		<combo_box.item label="Deutsch (Alemán) - Beta" name="Deutsch(German)"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
index 11b1bd9b87..b75567a40f 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
@@ -4,7 +4,6 @@
 		Langue :
 	</text>
 	<combo_box name="language_combobox">
-		<combo_box.item label="Choix par défaut" name="System Default Language"/>
 		<combo_box.item label="English (Anglais)" name="English"/>
 		<combo_box.item label="Dansk (Danois) - Bêta" name="Danish"/>
 		<combo_box.item label="Deutsch (Allemand) - Bêta" name="Deutsch(German)"/>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_general.xml b/indra/newview/skins/default/xui/it/panel_preferences_general.xml
index ef999d03c0..49edc0aa12 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_general.xml
@@ -4,7 +4,6 @@
 		Lingua:
 	</text>
 	<combo_box name="language_combobox">
-		<combo_box.item label="Default di sistema" name="System Default Language"/>
 		<combo_box.item label="English" name="English"/>
 		<combo_box.item label="Dansk (Danese) - Beta" name="Danish"/>
 		<combo_box.item label="Deutsch (Tedesco) - Beta" name="Deutsch(German)"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
index e2b74354fa..378cf8652e 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
@@ -4,7 +4,6 @@
 		言語:
 	</text>
 	<combo_box name="language_combobox">
-		<combo_box.item label="システムデフォルト" name="System Default Language"/>
 		<combo_box.item label="English (英語)" name="English"/>
 		<combo_box.item label="Dansk (デンマーク語) - ベータ" name="Danish"/>
 		<combo_box.item label="Deutsch (ドイツ語) – ベータ" name="Deutsch(German)"/>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml
index 082dc0687e..55df13e7ac 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml
@@ -4,7 +4,6 @@
 		Język:
 	</text>
 	<combo_box name="language_combobox">
-		<combo_box.item label="Domyślny" name="System Default Language" />
 		<combo_box.item label="English (Angielski)" name="English" />
 		<combo_box.item label="Dansk (Duński) - Beta" name="Danish" />
 		<combo_box.item label="Deutsch (Niemiecki) - Beta" name="Deutsch(German)" />
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml
index 68fbd049b1..915d695605 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml
@@ -4,7 +4,6 @@
 		Idioma:
 	</text>
 	<combo_box name="language_combobox">
-		<combo_box.item label="Padrão" name="System Default Language"/>
 		<combo_box.item label="English (Inglês)" name="English"/>
 		<combo_box.item label="Dansk (Dinamarquês) - Beta" name="Danish"/>
 		<combo_box.item label="Deutsch (Alemão) - Beta" name="Deutsch(German)"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_general.xml b/indra/newview/skins/default/xui/ru/panel_preferences_general.xml
index b15d0e3abf..918b042dd7 100644
--- a/indra/newview/skins/default/xui/ru/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_general.xml
@@ -4,7 +4,6 @@
 		Язык:
 	</text>
 	<combo_box name="language_combobox">
-		<combo_box.item label="Язык системы" name="System Default Language"/>
 		<combo_box.item label="English - Английский" name="English"/>
 		<combo_box.item label="Dansk – датский (бета-версия)" name="Danish"/>
 		<combo_box.item label="Deutsch – немецкий (бета-версия)" name="Deutsch(German)"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_general.xml b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml
index 2c05e8a47a..cec7a67f2f 100644
--- a/indra/newview/skins/default/xui/tr/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml
@@ -4,7 +4,6 @@
 		Dil:
 	</text>
 	<combo_box name="language_combobox">
-		<combo_box.item label="Sistem varsayılanı" name="System Default Language"/>
 		<combo_box.item label="English (İngilizce)" name="English"/>
 		<combo_box.item label="Dansk (Danca) - Beta" name="Danish"/>
 		<combo_box.item label="Deutsch (Almanca) - Beta" name="Deutsch(German)"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml
index 20335d82ae..87c38e4346 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml
@@ -4,7 +4,6 @@
 		語言:
 	</text>
 	<combo_box name="language_combobox">
-		<combo_box.item label="系統預設" name="System Default Language"/>
 		<combo_box.item label="英語" name="English"/>
 		<combo_box.item label="Dansk(丹麥語)- 試用版" name="Danish"/>
 		<combo_box.item label="Deutsch(德語)- 試用版" name="Deutsch(German)"/>
-- 
cgit v1.2.3


From 344a3a040fb1c664108830ac784c6e4593a57553 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Fri, 15 Feb 2019 22:05:44 +0200
Subject: Teamcity W64 build freeze.

---
 indra/llcorehttp/tests/test_httprequest.hpp | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/indra/llcorehttp/tests/test_httprequest.hpp b/indra/llcorehttp/tests/test_httprequest.hpp
index 4ac3f6f991..e65588e48f 100644
--- a/indra/llcorehttp/tests/test_httprequest.hpp
+++ b/indra/llcorehttp/tests/test_httprequest.hpp
@@ -2904,7 +2904,11 @@ void HttpRequestTestObjectType::test<22>()
 	set_test_name("BUG-2295");
 
 #if LL_WINDOWS && ADDRESS_SIZE == 64
-	skip("BUG-2295 - partial load on W64 causes freeze");
+	// teamcity win64 builds freeze on this test, if you figure out the cause, please fix it
+	if (getenv("TEAMCITY_PROJECT_NAME"))
+	{
+		skip("BUG-2295 - partial load on W64 causes freeze");
+	}
 #endif
 	// Handler can be stack-allocated *if* there are no dangling
 	// references to it after completion of this method.
@@ -3095,7 +3099,11 @@ void HttpRequestTestObjectType::test<23>()
 	set_test_name("HttpRequest GET 503s with 'Retry-After'");
 
 #if LL_WINDOWS && ADDRESS_SIZE == 64
-	skip("llcorehttp 503-with-retry test hangs on Windows 64");
+	// teamcity win64 builds freeze on this test, if you figure out the cause, please fix it
+	if (getenv("TEAMCITY_PROJECT_NAME"))
+	{
+		skip("llcorehttp 503-with-retry test hangs on Windows 64");
+	}
 #endif
 
 	// This tests mainly that the code doesn't fall over if
-- 
cgit v1.2.3


From 54818e189404e0d8444a7731c0082e03a5f12ef7 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Tue, 19 Feb 2019 18:24:06 +0200
Subject: SL-10412 Move My Avatar/Scripts to Me drop down menu

---
 indra/newview/CMakeLists.txt                       |   2 +
 indra/newview/llfloatermyscripts.cpp               | 294 ++++++++++++++++++++
 indra/newview/llfloatermyscripts.h                 |  60 +++++
 indra/newview/llfloaterscriptlimits.cpp            | 299 +--------------------
 indra/newview/llfloaterscriptlimits.h              |  47 ----
 indra/newview/llviewerfloaterreg.cpp               |   2 +
 .../skins/default/xui/en/floater_my_scripts.xml    |  22 ++
 indra/newview/skins/default/xui/en/menu_viewer.xml |   7 +
 8 files changed, 389 insertions(+), 344 deletions(-)
 create mode 100644 indra/newview/llfloatermyscripts.cpp
 create mode 100644 indra/newview/llfloatermyscripts.h
 create mode 100644 indra/newview/skins/default/xui/en/floater_my_scripts.xml

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 60c27665bf..c389de1232 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -265,6 +265,7 @@ set(viewer_SOURCE_FILES
     llfloatermemleak.cpp
     llfloatermodelpreview.cpp
     llfloatermodeluploadbase.cpp
+    llfloatermyscripts.cpp
     llfloaternamedesc.cpp
     llfloaternotificationsconsole.cpp
     llfloaternotificationstabbed.cpp
@@ -893,6 +894,7 @@ set(viewer_HEADER_FILES
     llfloatermemleak.h
     llfloatermodelpreview.h
     llfloatermodeluploadbase.h
+    llfloatermyscripts.h
     llfloaternamedesc.h
     llfloaternotificationsconsole.h
     llfloaternotificationstabbed.h
diff --git a/indra/newview/llfloatermyscripts.cpp b/indra/newview/llfloatermyscripts.cpp
new file mode 100644
index 0000000000..fa2de21a8f
--- /dev/null
+++ b/indra/newview/llfloatermyscripts.cpp
@@ -0,0 +1,294 @@
+/** 
+ * @file llfloatermyscripts.cpp
+ * @brief LLFloaterMyScripts class implementation.
+ *
+ * $LicenseInfo:firstyear=2004&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2019, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llfloatermyscripts.h"
+
+#include "llagent.h"
+#include "llcorehttputil.h"
+#include "llcoros.h"
+#include "lleventcoro.h"
+#include "llfloaterreg.h"
+#include "llscrolllistctrl.h"
+#include "lltrans.h"
+#include "llviewerregion.h"
+
+const S32 SIZE_OF_ONE_KB = 1024;
+
+LLFloaterMyScripts::LLFloaterMyScripts(const LLSD& seed)
+	: LLFloater(seed), 
+	mGotAttachmentMemoryUsed(false),
+	mAttachmentMemoryMax(0),
+	mAttachmentMemoryUsed(0),
+	mGotAttachmentURLsUsed(false),
+	mAttachmentURLsMax(0),
+	mAttachmentURLsUsed(0)
+{
+}
+
+BOOL LLFloaterMyScripts::postBuild()
+{
+	childSetAction("refresh_list_btn", onClickRefresh, this);
+
+	std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestWaiting");
+	getChild<LLUICtrl>("loading_text")->setValue(LLSD(msg_waiting));
+	return requestAttachmentDetails();
+}
+
+BOOL LLFloaterMyScripts::requestAttachmentDetails()
+{
+	if (!gAgent.getRegion()) return FALSE;
+
+	LLSD body;
+	std::string url = gAgent.getRegion()->getCapability("AttachmentResources");
+	if (!url.empty())
+	{
+		LLCoros::instance().launch("LLFloaterMyScripts::getAttachmentLimitsCoro",
+			boost::bind(&LLFloaterMyScripts::getAttachmentLimitsCoro, this, url));
+		return TRUE;
+	}
+	else
+	{
+		return FALSE;
+	}
+}
+
+void LLFloaterMyScripts::getAttachmentLimitsCoro(std::string url)
+{
+    LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
+    LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
+        httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getAttachmentLimitsCoro", httpPolicy));
+    LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
+
+    LLSD result = httpAdapter->getAndSuspend(httpRequest, url);
+
+    LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
+    LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+
+    if (!status)
+    {
+        LL_WARNS() << "Unable to retrieve attachment limits." << LL_ENDL;
+        return;
+    }
+
+    LLFloaterMyScripts* instance = LLFloaterReg::getTypedInstance<LLFloaterMyScripts>("my_scripts");
+
+    if (!instance)
+    {
+        LL_WARNS() << "Failed to get LLFloaterMyScripts instance" << LL_ENDL;
+        return;
+    }
+
+	instance->getChild<LLUICtrl>("loading_text")->setValue(LLSD(std::string("")));
+
+	LLButton* btn = instance->getChild<LLButton>("refresh_list_btn");
+    if (btn)
+    {
+        btn->setEnabled(true);
+    }
+
+    result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS);
+	instance->setAttachmentDetails(result);
+}
+
+
+void LLFloaterMyScripts::setAttachmentDetails(LLSD content)
+{
+	LLScrollListCtrl *list = getChild<LLScrollListCtrl>("scripts_list");
+	
+	if(!list)
+	{
+		return;
+	}
+	
+	S32 number_attachments = content["attachments"].size();
+
+	for(int i = 0; i < number_attachments; i++)
+	{
+		std::string humanReadableLocation = "";
+		if(content["attachments"][i].has("location"))
+		{
+			std::string actualLocation = content["attachments"][i]["location"];
+			humanReadableLocation = LLTrans::getString(actualLocation.c_str());
+		}
+		
+		S32 number_objects = content["attachments"][i]["objects"].size();
+		for(int j = 0; j < number_objects; j++)
+		{
+			LLUUID task_id = content["attachments"][i]["objects"][j]["id"].asUUID();
+			S32 size = 0;
+			if(content["attachments"][i]["objects"][j]["resources"].has("memory"))
+			{
+				size = content["attachments"][i]["objects"][j]["resources"]["memory"].asInteger() / SIZE_OF_ONE_KB;
+			}
+			S32 urls = 0;
+			if(content["attachments"][i]["objects"][j]["resources"].has("urls"))
+			{
+				urls = content["attachments"][i]["objects"][j]["resources"]["urls"].asInteger();
+			}
+			std::string name = content["attachments"][i]["objects"][j]["name"].asString();
+			
+			LLSD element;
+
+			element["id"] = task_id;
+			element["columns"][0]["column"] = "size";
+			element["columns"][0]["value"] = llformat("%d", size);
+			element["columns"][0]["font"] = "SANSSERIF";
+			element["columns"][0]["halign"] = LLFontGL::RIGHT;
+
+			element["columns"][1]["column"] = "urls";
+			element["columns"][1]["value"] = llformat("%d", urls);
+			element["columns"][1]["font"] = "SANSSERIF";
+			element["columns"][1]["halign"] = LLFontGL::RIGHT;
+			
+			element["columns"][2]["column"] = "name";
+			element["columns"][2]["value"] = name;
+			element["columns"][2]["font"] = "SANSSERIF";
+			
+			element["columns"][3]["column"] = "location";
+			element["columns"][3]["value"] = humanReadableLocation;
+			element["columns"][3]["font"] = "SANSSERIF";
+
+			list->addElement(element);
+		}
+	}
+	
+	setAttachmentSummary(content);
+
+	getChild<LLUICtrl>("loading_text")->setValue(LLSD(std::string("")));
+
+	LLButton* btn = getChild<LLButton>("refresh_list_btn");
+	if(btn)
+	{
+		btn->setEnabled(true);
+	}
+}
+
+void LLFloaterMyScripts::clearList()
+{
+	LLCtrlListInterface *list = childGetListInterface("scripts_list");
+
+	if (list)
+	{
+		list->operateOnAll(LLCtrlListInterface::OP_DELETE);
+	}
+
+	std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestWaiting");
+	getChild<LLUICtrl>("loading_text")->setValue(LLSD(msg_waiting));
+}
+
+void LLFloaterMyScripts::setAttachmentSummary(LLSD content)
+{
+	if(content["summary"]["used"][0]["type"].asString() == std::string("memory"))
+	{
+		mAttachmentMemoryUsed = content["summary"]["used"][0]["amount"].asInteger() / SIZE_OF_ONE_KB;
+		mAttachmentMemoryMax = content["summary"]["available"][0]["amount"].asInteger() / SIZE_OF_ONE_KB;
+		mGotAttachmentMemoryUsed = true;
+	}
+	else if(content["summary"]["used"][1]["type"].asString() == std::string("memory"))
+	{
+		mAttachmentMemoryUsed = content["summary"]["used"][1]["amount"].asInteger() / SIZE_OF_ONE_KB;
+		mAttachmentMemoryMax = content["summary"]["available"][1]["amount"].asInteger() / SIZE_OF_ONE_KB;
+		mGotAttachmentMemoryUsed = true;
+	}
+	else
+	{
+		LL_WARNS() << "attachment details don't contain memory summary info" << LL_ENDL;
+		return;
+	}
+	
+	if(content["summary"]["used"][0]["type"].asString() == std::string("urls"))
+	{
+		mAttachmentURLsUsed = content["summary"]["used"][0]["amount"].asInteger();
+		mAttachmentURLsMax = content["summary"]["available"][0]["amount"].asInteger();
+		mGotAttachmentURLsUsed = true;
+	}
+	else if(content["summary"]["used"][1]["type"].asString() == std::string("urls"))
+	{
+		mAttachmentURLsUsed = content["summary"]["used"][1]["amount"].asInteger();
+		mAttachmentURLsMax = content["summary"]["available"][1]["amount"].asInteger();
+		mGotAttachmentURLsUsed = true;
+	}
+	else
+	{
+		LL_WARNS() << "attachment details don't contain urls summary info" << LL_ENDL;
+		return;
+	}
+
+	if((mAttachmentMemoryUsed >= 0) && (mAttachmentMemoryMax >= 0))
+	{
+		LLStringUtil::format_map_t args_attachment_memory;
+		args_attachment_memory["[COUNT]"] = llformat ("%d", mAttachmentMemoryUsed);
+		std::string translate_message = "ScriptLimitsMemoryUsedSimple";
+
+		if (0 < mAttachmentMemoryMax)
+		{
+			S32 attachment_memory_available = mAttachmentMemoryMax - mAttachmentMemoryUsed;
+
+			args_attachment_memory["[MAX]"] = llformat ("%d", mAttachmentMemoryMax);
+			args_attachment_memory["[AVAILABLE]"] = llformat ("%d", attachment_memory_available);
+			translate_message = "ScriptLimitsMemoryUsed";
+		}
+
+		getChild<LLUICtrl>("memory_used")->setValue(LLTrans::getString(translate_message, args_attachment_memory));
+	}
+
+	if((mAttachmentURLsUsed >= 0) && (mAttachmentURLsMax >= 0))
+	{
+		S32 attachment_urls_available = mAttachmentURLsMax - mAttachmentURLsUsed;
+
+		LLStringUtil::format_map_t args_attachment_urls;
+		args_attachment_urls["[COUNT]"] = llformat ("%d", mAttachmentURLsUsed);
+		args_attachment_urls["[MAX]"] = llformat ("%d", mAttachmentURLsMax);
+		args_attachment_urls["[AVAILABLE]"] = llformat ("%d", attachment_urls_available);
+		std::string msg_attachment_urls = LLTrans::getString("ScriptLimitsURLsUsed", args_attachment_urls);
+		getChild<LLUICtrl>("urls_used")->setValue(LLSD(msg_attachment_urls));
+	}
+}
+
+// static
+void LLFloaterMyScripts::onClickRefresh(void* userdata)
+{
+	LLFloaterMyScripts* instance = LLFloaterReg::getTypedInstance<LLFloaterMyScripts>("my_scripts");
+	if(instance)
+	{
+		LLButton* btn = instance->getChild<LLButton>("refresh_list_btn");
+		
+		//To stop people from hammering the refesh button and accidentally dosing themselves - enough requests can crash the viewer!
+		//turn the button off, then turn it on when we get a response
+		if(btn)
+		{
+			btn->setEnabled(false);
+		}
+		instance->clearList();
+		instance->requestAttachmentDetails();
+	}
+	else
+	{
+		LL_WARNS() << "could not find LLFloaterMyScripts instance after refresh button clicked" << LL_ENDL;
+	}
+}
+
diff --git a/indra/newview/llfloatermyscripts.h b/indra/newview/llfloatermyscripts.h
new file mode 100644
index 0000000000..fe33ab90ae
--- /dev/null
+++ b/indra/newview/llfloatermyscripts.h
@@ -0,0 +1,60 @@
+/** 
+ * @file llfloatermyscripts.h
+ * @brief LLFloaterMyScripts class definition.
+ *
+ * $LicenseInfo:firstyear=2004&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2019, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERMYSCRIPTS_H
+#define LL_LLFLOATERMYSCRIPTS_H
+
+#include "llfloater.h"
+#include "llpanel.h"
+
+class LLFloaterMyScripts : public LLFloater
+{
+public:
+	LLFloaterMyScripts(const LLSD& seed);
+
+	BOOL postBuild();
+	void setAttachmentDetails(LLSD content);
+	void setAttachmentSummary(LLSD content);
+	BOOL requestAttachmentDetails();
+	void clearList();
+
+private:
+	void getAttachmentLimitsCoro(std::string url);
+
+	bool mGotAttachmentMemoryUsed;
+	S32 mAttachmentMemoryMax;
+	S32 mAttachmentMemoryUsed;
+
+	bool mGotAttachmentURLsUsed;
+	S32 mAttachmentURLsMax;
+	S32 mAttachmentURLsUsed;
+
+protected:
+	
+	static void onClickRefresh(void* userdata);
+};
+
+#endif
diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp
index 21df769d0c..3746b9b6c2 100644
--- a/indra/newview/llfloaterscriptlimits.cpp
+++ b/indra/newview/llfloaterscriptlimits.cpp
@@ -90,19 +90,6 @@ LLFloaterScriptLimits::LLFloaterScriptLimits(const LLSD& seed)
 
 BOOL LLFloaterScriptLimits::postBuild()
 {
-	// a little cheap and cheerful - if there's an about land panel open default to showing parcel info,
-	// otherwise default to showing attachments (avatar appearance)
-	bool selectParcelPanel = false;
-	
-	LLFloaterLand* instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land");
-	if(instance)
-	{
-		if(instance->isShown())
-		{
-			selectParcelPanel = true;
-		}
-	}
-
 	mTab = getChild<LLTabContainer>("scriptlimits_panels");
 	
 	if(!mTab)
@@ -111,28 +98,12 @@ BOOL LLFloaterScriptLimits::postBuild()
 		return FALSE;
 	}
 
-	// contruct the panels
+	// contruct the panel
 	LLPanelScriptLimitsRegionMemory* panel_memory = new LLPanelScriptLimitsRegionMemory;
 	mInfoPanels.push_back(panel_memory);
 	panel_memory->buildFromFile( "panel_script_limits_region_memory.xml");
 	mTab->addTabPanel(panel_memory);
-
-	LLPanelScriptLimitsAttachment* panel_attachments = new LLPanelScriptLimitsAttachment;
-	mInfoPanels.push_back(panel_attachments);
-	panel_attachments->buildFromFile("panel_script_limits_my_avatar.xml");
-	mTab->addTabPanel(panel_attachments);
-
-	
-	if(mInfoPanels.size() > 0)
-	{
-		mTab->selectTab(0);
-	}
-
-	if(!selectParcelPanel && (mInfoPanels.size() > 1))
-	{
-		mTab->selectTab(1);
-	}
-
+	mTab->selectTab(0);
 	return TRUE;
 }
 
@@ -969,269 +940,3 @@ void LLPanelScriptLimitsRegionMemory::onClickReturn(void* userdata)
 	}
 }
 
-///----------------------------------------------------------------------------
-// Attachment Panel
-///----------------------------------------------------------------------------
-
-BOOL LLPanelScriptLimitsAttachment::requestAttachmentDetails()
-{
-	if (!gAgent.getRegion()) return FALSE;
-
-	LLSD body;
-	std::string url = gAgent.getRegion()->getCapability("AttachmentResources");
-	if (!url.empty())
-	{
-        LLCoros::instance().launch("LLPanelScriptLimitsAttachment::getAttachmentLimitsCoro",
-            boost::bind(&LLPanelScriptLimitsAttachment::getAttachmentLimitsCoro, this, url));
-		return TRUE;
-	}
-	else
-	{
-		return FALSE;
-	}
-}
-
-void LLPanelScriptLimitsAttachment::getAttachmentLimitsCoro(std::string url)
-{
-    LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
-    LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
-        httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getAttachmentLimitsCoro", httpPolicy));
-    LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
-
-    LLSD result = httpAdapter->getAndSuspend(httpRequest, url);
-
-    LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
-    LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
-
-    if (!status)
-    {
-        LL_WARNS() << "Unable to retrieve attachment limits." << LL_ENDL;
-        return;
-    }
-
-    LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits");
-
-    if (!instance)
-    {
-        LL_WARNS() << "Failed to get llfloaterscriptlimits instance" << LL_ENDL;
-        return;
-    }
-
-    LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels");
-    if (!tab)
-    {
-        LL_WARNS() << "Failed to get scriptlimits_panels" << LL_ENDL;
-        return;
-    }
-
-    LLPanelScriptLimitsAttachment* panel = (LLPanelScriptLimitsAttachment*)tab->getChild<LLPanel>("script_limits_my_avatar_panel");
-    if (!panel)
-    {
-        LL_WARNS() << "Failed to get script_limits_my_avatar_panel" << LL_ENDL;
-        return;
-    }
-
-    panel->getChild<LLUICtrl>("loading_text")->setValue(LLSD(std::string("")));
-
-    LLButton* btn = panel->getChild<LLButton>("refresh_list_btn");
-    if (btn)
-    {
-        btn->setEnabled(true);
-    }
-
-    result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS);
-    panel->setAttachmentDetails(result);
-}
-
-
-void LLPanelScriptLimitsAttachment::setAttachmentDetails(LLSD content)
-{
-	LLScrollListCtrl *list = getChild<LLScrollListCtrl>("scripts_list");
-	
-	if(!list)
-	{
-		return;
-	}
-	
-	S32 number_attachments = content["attachments"].size();
-
-	for(int i = 0; i < number_attachments; i++)
-	{
-		std::string humanReadableLocation = "";
-		if(content["attachments"][i].has("location"))
-		{
-			std::string actualLocation = content["attachments"][i]["location"];
-			humanReadableLocation = LLTrans::getString(actualLocation.c_str());
-		}
-		
-		S32 number_objects = content["attachments"][i]["objects"].size();
-		for(int j = 0; j < number_objects; j++)
-		{
-			LLUUID task_id = content["attachments"][i]["objects"][j]["id"].asUUID();
-			S32 size = 0;
-			if(content["attachments"][i]["objects"][j]["resources"].has("memory"))
-			{
-				size = content["attachments"][i]["objects"][j]["resources"]["memory"].asInteger() / SIZE_OF_ONE_KB;
-			}
-			S32 urls = 0;
-			if(content["attachments"][i]["objects"][j]["resources"].has("urls"))
-			{
-				urls = content["attachments"][i]["objects"][j]["resources"]["urls"].asInteger();
-			}
-			std::string name = content["attachments"][i]["objects"][j]["name"].asString();
-			
-			LLSD element;
-
-			element["id"] = task_id;
-			element["columns"][0]["column"] = "size";
-			element["columns"][0]["value"] = llformat("%d", size);
-			element["columns"][0]["font"] = "SANSSERIF";
-			element["columns"][0]["halign"] = LLFontGL::RIGHT;
-
-			element["columns"][1]["column"] = "urls";
-			element["columns"][1]["value"] = llformat("%d", urls);
-			element["columns"][1]["font"] = "SANSSERIF";
-			element["columns"][1]["halign"] = LLFontGL::RIGHT;
-			
-			element["columns"][2]["column"] = "name";
-			element["columns"][2]["value"] = name;
-			element["columns"][2]["font"] = "SANSSERIF";
-			
-			element["columns"][3]["column"] = "location";
-			element["columns"][3]["value"] = humanReadableLocation;
-			element["columns"][3]["font"] = "SANSSERIF";
-
-			list->addElement(element);
-		}
-	}
-	
-	setAttachmentSummary(content);
-
-	getChild<LLUICtrl>("loading_text")->setValue(LLSD(std::string("")));
-
-	LLButton* btn = getChild<LLButton>("refresh_list_btn");
-	if(btn)
-	{
-		btn->setEnabled(true);
-	}
-}
-
-BOOL LLPanelScriptLimitsAttachment::postBuild()
-{
-	childSetAction("refresh_list_btn", onClickRefresh, this);
-		
-	std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestWaiting");
-	getChild<LLUICtrl>("loading_text")->setValue(LLSD(msg_waiting));
-	return requestAttachmentDetails();
-}
-
-void LLPanelScriptLimitsAttachment::clearList()
-{
-	LLCtrlListInterface *list = childGetListInterface("scripts_list");
-
-	if (list)
-	{
-		list->operateOnAll(LLCtrlListInterface::OP_DELETE);
-	}
-
-	std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestWaiting");
-	getChild<LLUICtrl>("loading_text")->setValue(LLSD(msg_waiting));
-}
-
-void LLPanelScriptLimitsAttachment::setAttachmentSummary(LLSD content)
-{
-	if(content["summary"]["used"][0]["type"].asString() == std::string("memory"))
-	{
-		mAttachmentMemoryUsed = content["summary"]["used"][0]["amount"].asInteger() / SIZE_OF_ONE_KB;
-		mAttachmentMemoryMax = content["summary"]["available"][0]["amount"].asInteger() / SIZE_OF_ONE_KB;
-		mGotAttachmentMemoryUsed = true;
-	}
-	else if(content["summary"]["used"][1]["type"].asString() == std::string("memory"))
-	{
-		mAttachmentMemoryUsed = content["summary"]["used"][1]["amount"].asInteger() / SIZE_OF_ONE_KB;
-		mAttachmentMemoryMax = content["summary"]["available"][1]["amount"].asInteger() / SIZE_OF_ONE_KB;
-		mGotAttachmentMemoryUsed = true;
-	}
-	else
-	{
-		LL_WARNS() << "attachment details don't contain memory summary info" << LL_ENDL;
-		return;
-	}
-	
-	if(content["summary"]["used"][0]["type"].asString() == std::string("urls"))
-	{
-		mAttachmentURLsUsed = content["summary"]["used"][0]["amount"].asInteger();
-		mAttachmentURLsMax = content["summary"]["available"][0]["amount"].asInteger();
-		mGotAttachmentURLsUsed = true;
-	}
-	else if(content["summary"]["used"][1]["type"].asString() == std::string("urls"))
-	{
-		mAttachmentURLsUsed = content["summary"]["used"][1]["amount"].asInteger();
-		mAttachmentURLsMax = content["summary"]["available"][1]["amount"].asInteger();
-		mGotAttachmentURLsUsed = true;
-	}
-	else
-	{
-		LL_WARNS() << "attachment details don't contain urls summary info" << LL_ENDL;
-		return;
-	}
-
-	if((mAttachmentMemoryUsed >= 0) && (mAttachmentMemoryMax >= 0))
-	{
-		LLStringUtil::format_map_t args_attachment_memory;
-		args_attachment_memory["[COUNT]"] = llformat ("%d", mAttachmentMemoryUsed);
-		std::string translate_message = "ScriptLimitsMemoryUsedSimple";
-
-		if (0 < mAttachmentMemoryMax)
-		{
-			S32 attachment_memory_available = mAttachmentMemoryMax - mAttachmentMemoryUsed;
-
-			args_attachment_memory["[MAX]"] = llformat ("%d", mAttachmentMemoryMax);
-			args_attachment_memory["[AVAILABLE]"] = llformat ("%d", attachment_memory_available);
-			translate_message = "ScriptLimitsMemoryUsed";
-		}
-
-		getChild<LLUICtrl>("memory_used")->setValue(LLTrans::getString(translate_message, args_attachment_memory));
-	}
-
-	if((mAttachmentURLsUsed >= 0) && (mAttachmentURLsMax >= 0))
-	{
-		S32 attachment_urls_available = mAttachmentURLsMax - mAttachmentURLsUsed;
-
-		LLStringUtil::format_map_t args_attachment_urls;
-		args_attachment_urls["[COUNT]"] = llformat ("%d", mAttachmentURLsUsed);
-		args_attachment_urls["[MAX]"] = llformat ("%d", mAttachmentURLsMax);
-		args_attachment_urls["[AVAILABLE]"] = llformat ("%d", attachment_urls_available);
-		std::string msg_attachment_urls = LLTrans::getString("ScriptLimitsURLsUsed", args_attachment_urls);
-		getChild<LLUICtrl>("urls_used")->setValue(LLSD(msg_attachment_urls));
-	}
-}
-
-// static
-void LLPanelScriptLimitsAttachment::onClickRefresh(void* userdata)
-{
-	LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits");
-	if(instance)
-	{
-		LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels");
-		LLPanelScriptLimitsAttachment* panel_attachments = (LLPanelScriptLimitsAttachment*)tab->getChild<LLPanel>("script_limits_my_avatar_panel");
-		LLButton* btn = panel_attachments->getChild<LLButton>("refresh_list_btn");
-		
-		//To stop people from hammering the refesh button and accidentally dosing themselves - enough requests can crash the viewer!
-		//turn the button off, then turn it on when we get a response
-		if(btn)
-		{
-			btn->setEnabled(false);
-		}
-		panel_attachments->clearList();
-		panel_attachments->requestAttachmentDetails();
-		
-		return;
-	}
-	else
-	{
-		LL_WARNS() << "could not find LLPanelScriptLimitsRegionMemory instance after refresh button clicked" << LL_ENDL;
-		return;
-	}
-}
-
diff --git a/indra/newview/llfloaterscriptlimits.h b/indra/newview/llfloaterscriptlimits.h
index 16450c6527..d2192f9d01 100644
--- a/indra/newview/llfloaterscriptlimits.h
+++ b/indra/newview/llfloaterscriptlimits.h
@@ -152,51 +152,4 @@ protected:
 	static void onClickReturn(void* userdata);
 };
 
-/////////////////////////////////////////////////////////////////////////////
-// Attachment panel
-/////////////////////////////////////////////////////////////////////////////
-
-class LLPanelScriptLimitsAttachment : public LLPanelScriptLimitsInfo
-{
-	
-public:
-	LLPanelScriptLimitsAttachment()
-		:	LLPanelScriptLimitsInfo(),
-		mGotAttachmentMemoryUsed(false),
-		mAttachmentMemoryMax(0),
-		mAttachmentMemoryUsed(0),
-		mGotAttachmentURLsUsed(false),
-		mAttachmentURLsMax(0),
-		mAttachmentURLsUsed(0)
-		{};
-
-	~LLPanelScriptLimitsAttachment()
-	{
-	};
-	
-	// LLPanel
-	virtual BOOL postBuild();
-
-	void setAttachmentDetails(LLSD content);
-
-	void setAttachmentSummary(LLSD content);
-	BOOL requestAttachmentDetails();
-	void clearList();
-
-private:
-    void getAttachmentLimitsCoro(std::string url);
-
-	bool mGotAttachmentMemoryUsed;
-	S32 mAttachmentMemoryMax;
-	S32 mAttachmentMemoryUsed;
-
-	bool mGotAttachmentURLsUsed;
-	S32 mAttachmentURLsMax;
-	S32 mAttachmentURLsUsed;
-
-protected:
-	
-	static void onClickRefresh(void* userdata);
-};
-
 #endif
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 0ebacddd9b..a7b2fafddf 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -90,6 +90,7 @@
 #include "llfloatermediasettings.h"
 #include "llfloatermemleak.h"
 #include "llfloatermodelpreview.h"
+#include "llfloatermyscripts.h"
 #include "llfloaternamedesc.h"
 #include "llfloaternotificationsconsole.h"
 #include "llfloaternotificationstabbed.h"
@@ -335,6 +336,7 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("script_debug_output", "floater_script_debug_panel.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebugOutput>);
 	LLFloaterReg::add("script_floater", "floater_script.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLScriptFloater>);
 	LLFloaterReg::add("script_limits", "floater_script_limits.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptLimits>);
+	LLFloaterReg::add("my_scripts", "floater_my_scripts.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMyScripts>);
 	LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater);
 	LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>);
 	LLFloaterReg::add("sound_devices", "floater_sound_devices.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundDevices>);
diff --git a/indra/newview/skins/default/xui/en/floater_my_scripts.xml b/indra/newview/skins/default/xui/en/floater_my_scripts.xml
new file mode 100644
index 0000000000..3b0b6723c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_my_scripts.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_resize="true"
+ height="570"
+ help_topic="scriptlimits"
+ layout="topleft"
+ name="myscripts"
+ save_rect="true"
+ title="My Scripts"
+ min_width="620"
+ width="620">
+  <panel
+   filename="panel_script_limits_my_avatar.xml"
+   follows="all"
+   bottom="555"
+   layout="topleft"
+   left="3"
+   right="-2"
+   name="script_limits_my_avatar_panel"
+   top="20"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 42744b561f..cac84cfccf 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -73,6 +73,13 @@
           function="Floater.ToggleOrBringToFront"
           parameter="experiences"/>
       </menu_item_call>
+      <menu_item_call
+        label="My Scripts..."
+        name="MyScripts">
+        <menu_item_call.on_click
+          function="Floater.ToggleOrBringToFront"
+          parameter="my_scripts"/>
+      </menu_item_call>
       <menu_item_separator/>
       <menu_item_call
        label="Camera Controls..."
-- 
cgit v1.2.3


From 58adb333680042bedefcd41674d5c91c52862575 Mon Sep 17 00:00:00 2001
From: Mnikolenko ProductEngine <mnikolenko@productengine.com>
Date: Thu, 21 Feb 2019 14:23:36 +0200
Subject: SL-5366 Add Simplified Chinese fonts for Mac and Win10

---
 indra/newview/skins/default/xui/en/fonts.xml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml
index 82027d9e7c..8b1d50e58f 100644
--- a/indra/newview/skins/default/xui/en/fonts.xml
+++ b/indra/newview/skins/default/xui/en/fonts.xml
@@ -9,6 +9,7 @@
       <file>gulim.ttc</file>
       <file>simhei.ttf</file>
       <file>ArialUni.ttf</file>
+      <file>msyh.ttc</file>
     </os>
     <os name="Mac">
       <file>ヒラギノ角ゴシック W3.ttc</file>  
@@ -19,6 +20,7 @@
       <file>AppleGothic.ttf</file>
       <file>AppleSDGothicNeo-Regular.otf</file>
       <file>华文细黑.ttf</file>
+      <file>PingFang.ttc</file>
     </os>
   </font>
 
-- 
cgit v1.2.3


From 86d28366b1f53f56c444e5a5ccc025cd6b136b36 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Wed, 20 Feb 2019 20:30:43 +0200
Subject: SL-1811 Slight chat optimization

---
 indra/llui/lllayoutstack.cpp           |   8 ++-
 indra/newview/llconversationview.cpp   |  13 +++--
 indra/newview/llfloaterimcontainer.cpp | 104 ++++++++++++++++++++-------------
 indra/newview/llfloaterimcontainer.h   |   4 ++
 4 files changed, 83 insertions(+), 46 deletions(-)

diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 69246a2f57..b1ba725c2f 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -251,8 +251,14 @@ void LLLayoutStack::draw()
 
 	// always clip to stack itself
 	LLLocalClipRect clip(getLocalRect());
-	BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
+	for (LLLayoutPanel* panelp : mPanels)
 	{
+		if ((!panelp->getVisible() || panelp->mCollapsed)
+			&& (panelp->mVisibleAmt < 0.001f || !mAnimate))
+		{
+			// essentially invisible
+			continue;
+		}
 		// clip to layout rectangle, not bounding rectangle
 		LLRect clip_rect = panelp->getRect();
 		// scale clipping rectangle by visible amount
diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp
index dee0a52ce8..59bb9af744 100644
--- a/indra/newview/llconversationview.cpp
+++ b/indra/newview/llconversationview.cpp
@@ -234,6 +234,8 @@ void LLConversationViewSession::draw()
 	// Draw children if root folder, or any other folder that is open. Do not draw children when animating to closed state or you get rendering overlap.
 	bool draw_children = getRoot() == static_cast<LLFolderViewFolder*>(this) || isOpen();
 
+	// Todo/fix this: arrange hides children 'out of bonds', session 'slowly' adjusts container size, unhides children
+	// this process repeats until children fit
 	for (folders_t::iterator iter = mFolders.begin();
 		iter != mFolders.end();)
 	{
@@ -254,9 +256,6 @@ void LLConversationViewSession::draw()
 		updateLabelRotation();
 		drawOpenFolderArrow(default_params, sFgColor);
 	}
-
-	refresh();        
-
 	LLView::draw();
 }
 
@@ -568,6 +567,7 @@ void LLConversationViewParticipant::draw()
     F32 text_left = (F32)getLabelXPos();
 	
 	LLColor4 color;
+
 	LLLocalSpeakerMgr *speakerMgr = LLLocalSpeakerMgr::getInstance();
 
 	if (speakerMgr && speakerMgr->isSpeakerToBeRemoved(mUUID))
@@ -579,9 +579,14 @@ void LLConversationViewParticipant::draw()
 		color = mIsSelected ? sHighlightFgColor : sFgColor;
 	}
 
+	LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(getViewModelItem());
+	if (participant_model)
+	{
+		mSpeakingIndicator->setIsModeratorMuted(participant_model->isModeratorMuted());
+	}
+
     drawHighlight(show_context, mIsSelected, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor);
     drawLabel(font, text_left, y, color, right_x);
-	refresh();
 
     LLView::draw();
 }
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index 3cfa1133df..30d05ae287 100644
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -269,6 +269,9 @@ BOOL LLFloaterIMContainer::postBuild()
 	// When display name option change, we need to reload all participant names
 	LLAvatarNameCache::addUseDisplayNamesCallback(boost::bind(&LLFloaterIMContainer::processParticipantsStyleUpdate, this));
 
+    mParticipantRefreshTimer.setTimerExpirySec(0);
+    mParticipantRefreshTimer.start();
+
 	return TRUE;
 }
 
@@ -420,14 +423,66 @@ void LLFloaterIMContainer::processParticipantsStyleUpdate()
 void LLFloaterIMContainer::idle(void* user_data)
 {
 	LLFloaterIMContainer* self = static_cast<LLFloaterIMContainer*>(user_data);
-	
-	// Update the distance to agent in the nearby chat session if required
-	// Note: it makes no sense of course to update the distance in other session
-	if (self->mConversationViewModel.getSorter().getSortOrderParticipants() == LLConversationFilter::SO_DISTANCE)
-	{
-		self->setNearbyDistances();
-	}
-	self->mConversationsRoot->update();
+
+    if (!self->getVisible() || self->isMinimized())
+    {
+        return;
+    }
+    self->idleUpdate();
+}
+
+void LLFloaterIMContainer::idleUpdate()
+{
+    if (mTabContainer->getTabCount() == 0)
+    {
+        // Do not close the container when every conversation is torn off because the user
+        // still needs the conversation list. Simply collapse the message pane in that case.
+        collapseMessagesPane(true);
+    }
+
+    U32 sort_order = mConversationViewModel.getSorter().getSortOrderParticipants();
+
+    if (mParticipantRefreshTimer.hasExpired())
+    {
+        const LLConversationItem *current_session = getCurSelectedViewModelItem();
+        if (current_session)
+        {
+            // Update moderator options visibility
+            LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = current_session->getChildrenBegin();
+            LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = current_session->getChildrenEnd();
+            bool is_moderator = isGroupModerator();
+            bool can_ban = haveAbilityToBan();
+            while (current_participant_model != end_participant_model)
+            {
+                LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model);
+                participant_model->setModeratorOptionsVisible(is_moderator && participant_model->getUUID() != gAgentID);
+                participant_model->setGroupBanVisible(can_ban && participant_model->getUUID() != gAgentID);
+
+                current_participant_model++;
+            }
+            // Update floater's title as required by the currently selected session or use the default title
+            LLFloaterIMSession * conversation_floaterp = LLFloaterIMSession::findInstance(current_session->getUUID());
+            setTitle(conversation_floaterp && conversation_floaterp->needsTitleOverwrite() ? conversation_floaterp->getTitle() : mGeneralTitle);
+        }
+
+        mParticipantRefreshTimer.setTimerExpirySec(1.0f);
+    }
+
+    // Update the distance to agent in the nearby chat session if required
+    // Note: it makes no sense of course to update the distance in other session
+    if (sort_order == LLConversationFilter::SO_DISTANCE)
+    {
+        // almost real-time updates
+        setNearbyDistances(); //calls arrange all
+    }
+    mConversationsRoot->update(); //arranges, resizes, heavy
+
+    // "Manually" resize of mConversationsPane: same as temporarity cancellation of the flag "auto_resize=false" for it
+    if (!mConversationsPane->isCollapsed() && mMessagesPane->isCollapsed())
+    {
+        LLRect stack_rect = mConversationsStack->getRect();
+        mConversationsPane->reshape(stack_rect.getWidth(), stack_rect.getHeight(), true);
+    }
 }
 
 bool LLFloaterIMContainer::onConversationModelEvent(const LLSD& event)
@@ -526,39 +581,6 @@ bool LLFloaterIMContainer::onConversationModelEvent(const LLSD& event)
 
 void LLFloaterIMContainer::draw()
 {
-	if (mTabContainer->getTabCount() == 0)
-	{
-		// Do not close the container when every conversation is torn off because the user
-		// still needs the conversation list. Simply collapse the message pane in that case.
-		collapseMessagesPane(true);
-	}
-	
-	const LLConversationItem *current_session = getCurSelectedViewModelItem();
-	if (current_session)
-	{
-		// Update moderator options visibility
-		LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = current_session->getChildrenBegin();
-		LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = current_session->getChildrenEnd();
-		while (current_participant_model != end_participant_model)
-		{
-			LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model);
-			participant_model->setModeratorOptionsVisible(isGroupModerator() && participant_model->getUUID() != gAgentID);
-			participant_model->setGroupBanVisible(haveAbilityToBan() && participant_model->getUUID() != gAgentID);
-
-			current_participant_model++;
-		}
-		// Update floater's title as required by the currently selected session or use the default title
-		LLFloaterIMSession * conversation_floaterp = LLFloaterIMSession::findInstance(current_session->getUUID());
-		setTitle(conversation_floaterp && conversation_floaterp->needsTitleOverwrite() ? conversation_floaterp->getTitle() : mGeneralTitle);
-	}
-
-    // "Manually" resize of mConversationsPane: same as temporarity cancellation of the flag "auto_resize=false" for it
-	if (!mConversationsPane->isCollapsed() && mMessagesPane->isCollapsed())
-	{
-		LLRect stack_rect = mConversationsStack->getRect();
-		mConversationsPane->reshape(stack_rect.getWidth(), stack_rect.getHeight(), true);
-	}
-
 	LLFloater::draw();
 }
 
diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h
index 90fc0c2bdd..78b3572111 100644
--- a/indra/newview/llfloaterimcontainer.h
+++ b/indra/newview/llfloaterimcontainer.h
@@ -180,6 +180,8 @@ private:
 	void openNearbyChat();
 	bool isParticipantListExpanded();
 
+	void idleUpdate(); // for convenience (self) from static idle
+
 	LLButton* mExpandCollapseBtn;
 	LLButton* mStubCollapseBtn;
     LLButton* mSpeakBtn;
@@ -226,6 +228,8 @@ private:
 	LLConversationViewModel mConversationViewModel;
 	LLFolderView* mConversationsRoot;
 	LLEventStream mConversationsEventStream; 
+
+	LLTimer mParticipantRefreshTimer;
 };
 
 #endif // LL_LLFLOATERIMCONTAINER_H
-- 
cgit v1.2.3


From ba8f261fdf83108cf5bc48442876916d7c32b666 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Fri, 22 Feb 2019 21:02:51 +0200
Subject: SL-10422 Validate loaded mesh

---
 indra/newview/llmeshrepository.cpp | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 2e7141bcfc..c4e7b17322 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -1823,7 +1823,17 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat
 			return false;
 		}
 
-		header_size += stream.tellg();
+		if (!header.isMap() || !header.has("version"))
+		{
+			LL_WARNS(LOG_MESH) << "Mesh header is invalid for ID: " << mesh_id << LL_ENDL;
+			return false;
+		}
+
+		// make sure there is at least one lod, function returns -1 and marks as 404 otherwise
+		if (LLMeshRepository::getActualMeshLOD(header, 0) >= 0)
+		{
+			header_size += stream.tellg();
+		}
 	}
 	else
 	{
@@ -2908,9 +2918,14 @@ S32 LLMeshRepository::getActualMeshLOD(LLSD& header, S32 lod)
 {
 	lod = llclamp(lod, 0, 3);
 
+	if (header.has("404"))
+	{
+		return -1;
+	}
+
 	S32 version = header["version"];
 
-	if (header.has("404") || version > MAX_MESH_VERSION)
+	if (version > MAX_MESH_VERSION)
 	{
 		return -1;
 	}
-- 
cgit v1.2.3


From 54b444c5d5e4e7ee80801e5eeed6b32227096580 Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Sat, 23 Feb 2019 20:05:15 +0200
Subject: Backed out changeset: d531bea24d6e

---
 indra/newview/llfloatermodelpreview.cpp | 62 +++++++--------------------------
 indra/newview/llfloatermodelpreview.h   |  5 +--
 2 files changed, 14 insertions(+), 53 deletions(-)

diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index e39e210939..616bee84fd 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -304,10 +304,10 @@ BOOL LLFloaterModelPreview::postBuild()
 		getChild<LLSpinCtrl>("lod_triangle_limit_" + lod_name[lod])->setCommitCallback(boost::bind(&LLFloaterModelPreview::onLODParamCommit, this, lod, true));
 	}
 
-	childSetCommitCallback("upload_skin", boost::bind(&LLFloaterModelPreview::onUploadOptionChecked, this, _1), NULL);
-	childSetCommitCallback("upload_joints", boost::bind(&LLFloaterModelPreview::onUploadOptionChecked, this, _1), NULL);
-	childSetCommitCallback("lock_scale_if_joint_position", boost::bind(&LLFloaterModelPreview::onUploadOptionChecked, this, _1), NULL);
-	childSetCommitCallback("upload_textures", boost::bind(&LLFloaterModelPreview::onUploadOptionChecked, this, _1), NULL);
+	childSetCommitCallback("upload_skin", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);
+	childSetCommitCallback("upload_joints", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);
+	childSetCommitCallback("lock_scale_if_joint_position", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);
+	childSetCommitCallback("upload_textures", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);
 
 	childSetTextArg("status", "[STATUS]", getString("status_idle"));
 
@@ -449,16 +449,6 @@ void LLFloaterModelPreview::initModelPreview()
 	mModelPreview->setModelUpdatedCallback(boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this, _1));
 }
 
-void LLFloaterModelPreview::onUploadOptionChecked(LLUICtrl* ctrl)
-{
-	if (mModelPreview)
-	{
-		auto name = ctrl->getName();
-		mModelPreview->mViewOption[name] = !mModelPreview->mViewOption[name];
-	}
-	toggleCalculateButton(true);
-}
-
 void LLFloaterModelPreview::onViewOptionChecked(LLUICtrl* ctrl)
 {
 	if (mModelPreview)
@@ -641,7 +631,6 @@ void LLFloaterModelPreview::onGenerateNormalsCommit(LLUICtrl* ctrl, void* userda
 void LLFloaterModelPreview::toggleGenarateNormals()
 {
 	bool enabled = childGetValue("gen_normals").asBoolean();
-	mModelPreview->mViewOption["gen_normals"] = enabled;
 	childSetEnabled("crease_angle", enabled);
 	if(enabled) {
 		mModelPreview->generateNormals();
@@ -1167,8 +1156,10 @@ void LLFloaterModelPreview::initDecompControls()
 							std::string label = llformat("%.1f", value);
 							combo_box->add(label, value, ADD_BOTTOM, true);
 						}
+						combo_box->setValue(param[i].mDefault.mFloat);
+
 					}
-					combo_box->setValue(param[i].mDefault.mFloat);
+
 					combo_box->setCommitCallback(onPhysicsParamCommit, (void*) &param[i]);
 				}
 			}
@@ -1240,7 +1231,7 @@ void LLFloaterModelPreview::initDecompControls()
 			//LL_INFOS() << "-----------------------------" << LL_ENDL;
 		}
 	}
-	mDefaultDecompParams = mDecompParams;
+
 	childSetCommitCallback("physics_explode", LLFloaterModelPreview::onExplodeCommit, this);
 }
 
@@ -4429,7 +4420,6 @@ void LLFloaterModelPreview::onReset(void* user_data)
 	std::string filename = mp->mLODFile[LLModel::LOD_HIGH]; 
 
 	fmp->resetDisplayOptions();
-	fmp->resetUploadOptions();
 	//reset model preview
 	fmp->initModelPreview();
 
@@ -4543,6 +4533,11 @@ void LLFloaterModelPreview::setStatusMessage(const std::string& msg)
 	mStatusMessage = msg;
 }
 
+void LLFloaterModelPreview::toggleCalculateButton()
+{
+	toggleCalculateButton(true);
+}
+
 void LLFloaterModelPreview::toggleCalculateButton(bool visible)
 {
 	mCalculateBtn->setVisible(visible);
@@ -4604,37 +4599,6 @@ void LLFloaterModelPreview::resetDisplayOptions()
 	}
 }
 
-void LLFloaterModelPreview::resetUploadOptions()
-{
-	childSetValue("import_scale", 1);
-	childSetValue("pelvis_offset", 0);
-	childSetValue("physics_explode", 0);
-	childSetValue("physics_file", "");
-	childSetVisible("Retain%", false);
-	childSetVisible("Retain%_label", false);
-	childSetVisible("Detail Scale", true);
-	childSetVisible("Detail Scale label", true);
-
-	getChild<LLComboBox>("lod_source_" + lod_name[NUM_LOD - 1])->setCurrentByIndex(LLModelPreview::LOD_FROM_FILE);
-	for (S32 lod = 0; lod < NUM_LOD - 1; ++lod)
-	{
-		getChild<LLComboBox>("lod_source_" + lod_name[lod])->setCurrentByIndex(LLModelPreview::GENERATE);
-		childSetValue("lod_file_" + lod_name[lod], "");
-	}
-
-	getChild<LLComboBox>("physics_lod_combo")->setCurrentByIndex(0);
-
-	for(auto& p : mDefaultDecompParams)
-	{
-		std::string ctrl_name(p.first);
-		LLUICtrl* ctrl = getChild<LLUICtrl>(ctrl_name);
-		if (ctrl)
-		{
-			ctrl->setValue(p.second);
-		}
-	}
-}
-
 void LLFloaterModelPreview::onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url)
 {
 	mModelPhysicsFee = result;
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index 41208daa64..564f4c39de 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -109,7 +109,6 @@ public:
 	void 			loadModel(S32 lod, const std::string& file_name, bool force_disable_slm = false);
 	
 	void onViewOptionChecked(LLUICtrl* ctrl);
-	void onUploadOptionChecked(LLUICtrl* ctrl);
 	bool isViewOptionChecked(const LLSD& userdata);
 	bool isViewOptionEnabled(const LLSD& userdata);
 	void setViewOptionEnabled(const std::string& option, bool enabled);
@@ -180,7 +179,6 @@ protected:
 	LLModelPreview*	mModelPreview;
 	
 	LLPhysicsDecomp::decomp_params mDecompParams;
-	LLPhysicsDecomp::decomp_params mDefaultDecompParams;
 	
 	S32				mLastMouseX;
 	S32				mLastMouseY;
@@ -205,6 +203,7 @@ protected:
 
 private:
 	void onClickCalculateBtn();
+	void toggleCalculateButton();
 
 	void onLoDSourceCommit(S32 lod);
 
@@ -214,8 +213,6 @@ private:
 	// resets display options of model preview to their defaults.
 	void resetDisplayOptions();
 
-	void resetUploadOptions();
-
 	void createSmoothComboBox(LLComboBox* combo_box, float min, float max);
 
 	LLButton* mUploadBtn;
-- 
cgit v1.2.3


From 3de1f3e59e54d88ee5cff9607d9eebe9eb9950b5 Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Sat, 23 Feb 2019 20:05:29 +0200
Subject: Backed out changeset: ce6ac58d801c

---
 indra/newview/app_settings/settings.xml               |  2 +-
 indra/newview/llfloatermodelpreview.cpp               | 19 ++-----------------
 .../skins/default/xui/en/floater_model_preview.xml    |  8 +++++---
 3 files changed, 8 insertions(+), 21 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 8f7c4601e8..5f6bfec842 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -8053,7 +8053,7 @@
   <key>PreviewRenderSize</key>  
   <map>
     <key>Comment</key>
-    <string>Resolution of the image rendered for the mesh upload preview (must be a power of 2)</string>
+    <string>Resolution of the image rendered for the mesh upload preview</string>
     <key>Persist</key>
     <integer>1</integer>
     <key>Type</key>
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 616bee84fd..79b9df2fa6 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -427,23 +427,8 @@ void LLFloaterModelPreview::initModelPreview()
 	{
 		delete mModelPreview;
 	}
-
-	S32 tex_width = 512;
-	S32 tex_height = 512;
-
-	S32 max_width = llmin(gSavedSettings.getS32("PreviewRenderSize"), (S32)gPipeline.mScreenWidth);
-	S32 max_height = llmin(gSavedSettings.getS32("PreviewRenderSize"), (S32)gPipeline.mScreenHeight);
-	
-	while ((tex_width << 1) <= max_width)
-	{
-		tex_width <<= 1;
-	}
-	while ((tex_height << 1) <= max_height)
-	{
-		tex_height <<= 1;
-	}
-
-	mModelPreview = new LLModelPreview(tex_width, tex_height, this);
+	auto size = gSavedSettings.getS32("PreviewRenderSize");
+	mModelPreview = new LLModelPreview(size, size, this );
 	mModelPreview->setPreviewTarget(16.f);
 	mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelPreview::setDetails, this, _1, _2, _3, _4, _5));
 	mModelPreview->setModelUpdatedCallback(boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this, _1));
diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
index 274e6e6c7a..a07fe99aef 100644
--- a/indra/newview/skins/default/xui/en/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -1490,6 +1490,7 @@ Analysed:
     name="right_panel"
     top="0"
     left="640"
+    background_visible="true"
     width="375">
     <text
       follows="left|top"
@@ -1509,6 +1510,7 @@ Analysed:
       name="right_upper_panel"
       top="8"
       left="60"
+      background_visible="true"
       width="315">
       <combo_box
         top_pad="3"
@@ -1584,7 +1586,7 @@ Analysed:
       layout="topleft"
       left="2"
       name="physics_explode_label"
-      bottom_pad="2"
+      top="85"
       width="150">
       Preview Spread:
     </text>
@@ -1592,8 +1594,8 @@ Analysed:
       name="physics_explode"
       follows="right|bottom"
       valign="center"
-      left="105"
-      top_delta="-3"
+      top="15"
+      left="80"
       min_val="0.0"
       max_val="3.0"
       height="20"
-- 
cgit v1.2.3


From d9b09b3868ccc52655c00d547f2e4b849161d966 Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Sat, 23 Feb 2019 20:06:06 +0200
Subject: Backed out changeset: c923a62e9b5f

---
 indra/newview/skins/default/xui/en/floater_model_preview.xml | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
index a07fe99aef..e073268b0a 100644
--- a/indra/newview/skins/default/xui/en/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -34,6 +34,7 @@
   <string name="mesh_status_invalid_material_list">LOD materials are not a subset of reference model.</string>
   <string name="phys_status_vertex_limit_exceeded">Some physical hulls exceed vertex limitations.</string>
   <string name="phys_status_degenerate_triangles">The physics mesh too dense remove the small thin triangles (see preview)</string>
+  <string name="phys_status_no_havok">The Firestorm OpenSim build is not supported for physics upload in SL.</string>
   <string name="layer_all">All</string> <!-- Text to display in physics layer combo box for "all layers" -->
   <string name="decomposing">Analyzing...</string>
   <string name="simplifying">Simplifying...</string>
@@ -1222,7 +1223,7 @@
     <panel
      follows="top|left|bottom"
      layout="topleft"
-     height="197"
+     height="184"
      left="4"
      border="true"
      name="weights_and_warning_panel"
@@ -1411,7 +1412,7 @@ Lowest:
         border="true"
         layout="topleft"
         left_pad="265"
-        name="physics_costs_panel"
+        name="price_breakdown_panel"
         width="120"
         height="100">
         <text
@@ -1479,7 +1480,7 @@ Analysed:
          visible="false">
          You dont have rights to upload mesh models. [[VURL] Find out how] to get certified.
        </text>
-       <text text_color="Yellow" layout="topleft" top_pad="-1" left="6" name="status">
+       <text text_color="Yellow" layout="topleft" top_delta="5" left="6" name="status">
 [STATUS]
        </text>
     </panel>
-- 
cgit v1.2.3


From 150faaf53c3b59ff65aaa40a47d6678c741c4eaf Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Sat, 23 Feb 2019 20:06:46 +0200
Subject: Backed out changeset: f1fa95a76b9a

---
 .../shaders/class1/objects/previewV.glsl           |   2 +
 indra/newview/lldynamictexture.cpp                 |  15 ++-
 indra/newview/llfloatermodelpreview.cpp            | 118 +++++++++++++++++----
 3 files changed, 114 insertions(+), 21 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
index de2ea2a065..3424613e94 100644
--- a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
@@ -91,7 +91,9 @@ void main()
 
 	// Collect normal lights (need to be divided by two, as we later multiply by 2)
 	col.rgb += light_diffuse[1].rgb * calcDirectionalLight(norm, light_position[1].xyz);
+//	col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].z);
 	col.rgb += light_diffuse[2].rgb * calcDirectionalLight(norm, light_position[2].xyz);
+//	col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].z);
 	col.rgb += light_diffuse[3].rgb * calcDirectionalLight(norm, light_position[3].xyz);
 	col /= 2.0;
 	vertex_color = col*color;
diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp
index e180d91461..af6977d3cd 100644
--- a/indra/newview/lldynamictexture.cpp
+++ b/indra/newview/lldynamictexture.cpp
@@ -125,11 +125,17 @@ BOOL LLViewerDynamicTexture::render()
 //-----------------------------------------------------------------------------
 void LLViewerDynamicTexture::preRender(BOOL clear_depth)
 {
+	// <FS:Beq> changes to support higher resolution rendering in the preview
+	////only images up to 512x512 are supported
+	//llassert(mFullHeight <= 512);
+	//llassert(mFullWidth <= 512);
 	gPipeline.allocatePhysicsBuffer();
 	llassert(mFullWidth <= static_cast<S32>(gPipeline.mPhysicsDisplay.getWidth()));
 	llassert(mFullHeight <= static_cast<S32>(gPipeline.mPhysicsDisplay.getHeight()));
 
+//	if (gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete() && !gGLManager.mIsATI)
 	if (gGLManager.mHasFramebufferObject && gPipeline.mPhysicsDisplay.isComplete() && !gGLManager.mIsATI)
+// </FS:Beq>
 	{ //using offscreen render target, just use the bottom left corner
 		mOrigin.set(0, 0);
 	}
@@ -215,13 +221,15 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
 	{
 		return TRUE;
 	}
-
+	// <FS:Beq> changes to support higher resolution rendering in the preview
+	//	bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete() && !gGLManager.mIsATI;
 	bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mPhysicsDisplay.isComplete() && !gGLManager.mIsATI;
 	if (use_fbo)
 	{
+//		gPipeline.mWaterDis.bindTarget();
 		gPipeline.mPhysicsDisplay.bindTarget();
 	}
-
+	// </FS:Beq>
 	LLGLSLShader::bindNoShader();
 	LLVertexBuffer::unbind();
 	
@@ -257,7 +265,10 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
 
 	if (use_fbo)
 	{
+		// <FS:Beq> changes to support higher resolution rendering in the preview
+		// gPipeline.mWaterDis.flush();
 		gPipeline.mPhysicsDisplay.flush();
+		// </FS:Beq>
 	}
 
 	return ret;
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 79b9df2fa6..7624245c16 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -427,8 +427,11 @@ void LLFloaterModelPreview::initModelPreview()
 	{
 		delete mModelPreview;
 	}
+	// <FS:Beq> mesh uploader changes to allow higher resolution render
+	//	mModelPreview = new LLModelPreview(512, 512, this);
 	auto size = gSavedSettings.getS32("PreviewRenderSize");
 	mModelPreview = new LLModelPreview(size, size, this );
+	// </FS:Beq>
 	mModelPreview->setPreviewTarget(16.f);
 	mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelPreview::setDetails, this, _1, _2, _3, _4, _5));
 	mModelPreview->setModelUpdatedCallback(boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this, _1));
@@ -438,6 +441,8 @@ void LLFloaterModelPreview::onViewOptionChecked(LLUICtrl* ctrl)
 {
 	if (mModelPreview)
 	{
+		// <FS:Beq> only show explode when phsyics is on
+		//		mModelPreview->mViewOption[ctrl->getName()] = !mModelPreview->mViewOption[ctrl->getName()];
 		auto name = ctrl->getName();
 		mModelPreview->mViewOption[name] = !mModelPreview->mViewOption[name];
 		if (name == "show_physics")
@@ -659,6 +664,7 @@ void LLFloaterModelPreview::onLODParamCommit(S32 lod, bool enforce_tri_limit)
 	}
 }
 
+// <FS:Beq> extracted method to simplify changes in layout
 void LLFloaterModelPreview::draw3dPreview()
 {
 	gGL.color3f(1.f, 1.f, 1.f);
@@ -1260,7 +1266,7 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
 , mResetJoints( false )
 , mModelNoErrors( true )
 , mLastJointUpdate( false )
-, mHasDegenerate( false )
+, mHasDegenerate( false ) // <FS:Beq>
 {
 	mNeedsUpdate = TRUE;
 	mCameraDistance = 0.f;
@@ -2750,7 +2756,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
 
 void LLModelPreview::updateStatusMessages()
 {
-// bit mask values for physics errors. used to prevent overwrite of single line status
+// <FS:Beq> bit mask values for physics errors. used to prevent overwrite of single line status
 // TODO: use this to provied multiline status
 	enum PhysicsError
 	{
@@ -2760,10 +2766,10 @@ void LLModelPreview::updateStatusMessages()
 		TOOMANYHULLS=4,
 		TOOMANYVERTSINHULL=8
 	};
-
+// </FS:Beq>
 	assert_main_thread();
 
-	U32 has_physics_error{ PhysicsError::NONE }; // physics error bitmap
+	U32 has_physics_error{ PhysicsError::NONE }; // <FS:Beq> physics error bitmap
 	//triangle/vertex/submesh count for each mesh asset for each lod
 	std::vector<S32> tris[LLModel::NUM_LODS];
 	std::vector<S32> verts[LLModel::NUM_LODS];
@@ -2852,25 +2858,38 @@ void LLModelPreview::updateStatusMessages()
 	{
 		mMaxTriangleLimit = total_tris[LLModel::LOD_HIGH];
 	}
-
+	// <FS:Beq> make has_degenerate a member so that we can use it in the render method
+	// has_degenerate = false
 	mHasDegenerate = false;
 	{//check for degenerate triangles in physics mesh
 		U32 lod = LLModel::LOD_PHYSICS;
 		const LLVector4a scale(0.5f);
-		for (U32 i = 0; i < mModel[lod].size() && !mHasDegenerate; ++i)
+		for (U32 i = 0; i < mModel[lod].size() && !mHasDegenerate; ++i)// <FS:Beq> make has_degenerate a member 
 		{ //for each model in the lod
 			if (mModel[lod][i] && mModel[lod][i]->mPhysics.mHull.empty())
 			{ //no decomp exists
 				S32 cur_submeshes = mModel[lod][i]->getNumVolumeFaces();
-				for (S32 j = 0; j < cur_submeshes && !mHasDegenerate; ++j)
+				for (S32 j = 0; j < cur_submeshes && !mHasDegenerate; ++j)// <FS:Beq> make has_degenerate a member 
 				{ //for each submesh (face), add triangles and vertices to current total
 					LLVolumeFace& face = mModel[lod][i]->getVolumeFace(j);
-					for (S32 k = 0; (k < face.mNumIndices) && !mHasDegenerate; )
+					for (S32 k = 0; (k < face.mNumIndices) && !mHasDegenerate; )// <FS:Beq> make has_degenerate a member 
 					{
 						U16 index_a = face.mIndices[k + 0];
 						U16 index_b = face.mIndices[k + 1];
 						U16 index_c = face.mIndices[k + 2];
-
+						// <FS:Beq> FIRE-23367/23387 - Allow forced empty triangle placeholders created by the LOD processing.
+						//	LLVector4a v1; v1.setMul(face.mPositions[index_a], scale);
+						//	LLVector4a v2; v2.setMul(face.mPositions[index_b], scale);
+						//	LLVector4a v3; v3.setMul(face.mPositions[index_c], scale);
+
+						//	if (ll_is_degenerate(v1, v2, v3))
+						//	{
+						//		mHasDegenerate = true;// <FS:Beq> make has_degenerate a member 
+						//	}
+						//	else
+						//	{
+						//		k += 3;
+						//	}
 						if (index_c == 0 && index_b == 0 && index_a == 0) // test in reverse as 3rd index is less likely to be 0 in a normal case
 						{
 							LL_DEBUGS("MeshValidation") << "Empty placeholder triangle (3 identical index 0 verts) ignored" << LL_ENDL;
@@ -2882,7 +2901,7 @@ void LLModelPreview::updateStatusMessages()
 							LLVector4a v3; v3.setMul(face.mPositions[index_c], scale);
 							if (ll_is_degenerate(v1, v2, v3))
 							{
-								mHasDegenerate = true;
+								mHasDegenerate = true;// <FS:Beq> make has_degenerate a member 
 							}
 						}
 						k += 3;
@@ -2892,7 +2911,7 @@ void LLModelPreview::updateStatusMessages()
 		}
 	}
 
-	// flag degenerates here rather than deferring to a MAV error later
+	// <FS:Beq> flag degenerates here rather than deferring to a MAV error later
 	mFMP->childSetVisible("physics_status_message_text", mHasDegenerate); //display or clear
 	auto degenerateIcon = mFMP->getChild<LLIconCtrl>("physics_status_message_icon");
 	degenerateIcon->setVisible(mHasDegenerate);
@@ -2903,6 +2922,7 @@ void LLModelPreview::updateStatusMessages()
 		LLUIImagePtr img = LLUI::getUIImage("ModelImport_Status_Error");
 		degenerateIcon->setImage(img);
 	}
+	// </FS:Beq>
 
 	mFMP->childSetTextArg("submeshes_info", "[SUBMESHES]", llformat("%d", total_submeshes[LLModel::LOD_HIGH]));
 
@@ -3072,7 +3092,12 @@ void LLModelPreview::updateStatusMessages()
 			mModelNoErrors = false;
 		}
 	}
-
+	// <FS:Beq> Improve the error checking the TO DO here is no longer applicable but not an FS comment so edited to stop it being picked up
+	//// To do investigate use of has_degenerate and include into mModelNoErrors upload blocking mechanics
+	//// current use of has_degenerate won't block upload permanently - later checks will restore the button
+	//if (!mModelNoErrors || mHasDegenerate)
+	//{
+	//	mFMP->childDisable("ok_btn");
 	if (!mModelNoErrors || mHasDegenerate)
 	{
 		mFMP->childDisable("ok_btn");
@@ -3697,7 +3722,7 @@ BOOL LLModelPreview::render()
 	bool textures = mViewOption["show_textures"];
 	bool physics = mViewOption["show_physics"];
 
-	// Extra configurability, to be exposed later as controls?
+	// <FS:Beq> Extra configurability, to be exposed later as controls?
 	static LLCachedControl<LLColor4> canvas_col(gSavedSettings, "MeshPreviewCanvasColor");
 	static LLCachedControl<LLColor4> edge_col(gSavedSettings, "MeshPreviewEdgeColor");
 	static LLCachedControl<LLColor4> base_col(gSavedSettings, "MeshPreviewBaseColor");
@@ -3710,12 +3735,16 @@ BOOL LLModelPreview::render()
 	static LLCachedControl<LLColor4> deg_fill_col(gSavedSettings, "MeshPreviewDegenerateFillColor");	
 	static LLCachedControl<F32> deg_edge_width(gSavedSettings, "MeshPreviewDegenerateEdgeWidth");
 	static LLCachedControl<F32> deg_point_size(gSavedSettings, "MeshPreviewDegeneratePointSize");
-
+	// </FS:Beq>
 	S32 width = getWidth();
 	S32 height = getHeight();
 
 	LLGLSUIDefault def;
 	LLGLDisable no_blend(GL_BLEND);
+// <FS:Beq> Clean up render of mesh preview
+//	LLGLEnable blend(GL_BLEND);
+//	gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
+// </FS:Beq> 
 
 	LLGLEnable cull(GL_CULL_FACE);
 	LLGLDepthTest depth(GL_TRUE);
@@ -3735,7 +3764,8 @@ BOOL LLModelPreview::render()
 		gGL.matrixMode(LLRender::MM_MODELVIEW);
 		gGL.pushMatrix();
 		gGL.loadIdentity();
-
+		// <FS:Beq> uploader improvements
+		//gGL.color4f(0.169f, 0.169f, 0.169f, 1.f);
 		gGL.color4fv(static_cast<LLColor4>(canvas_col).mV);
 		gl_rect_2d_simple( width, height );
 
@@ -3884,7 +3914,11 @@ BOOL LLModelPreview::render()
 	stop_glerror();
 
 	gGL.pushMatrix();
+	// <FS:Beq> mesh uploader improvements configurable brightness
+	//const F32 BRIGHTNESS = 0.9f;
+	//gGL.color3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);
 	gGL.color4fv(edge_col().mV);
+	// </FS:Beq>
 
 	const U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
 
@@ -3969,12 +4003,19 @@ BOOL LLModelPreview::render()
 						}
 						else
 						{
+						// <FS:Beq> improved mesh uploader
+						//	gGL.diffuseColor4f(1,1,1,1);
 							gGL.diffuseColor4fv(static_cast<LLColor4>(base_col).mV);
+						// </FS:Beq>
+
 						}
 
 						buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
 						gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+						// <FS:Beq> improved mesh uploader
+						//gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
 						gGL.diffuseColor4fv(static_cast<LLColor4>(edge_col).mV);
+						// </FS:Beq> 
 						if (edges)
 						{
 							glLineWidth(edge_width);
@@ -3989,10 +4030,25 @@ BOOL LLModelPreview::render()
 
 			if (physics)
 			{
+				// <FS:Beq> model upload improvements - use the settings
+				////Vector4a physicsFillColour(0.4, 0.4, 0.4, 0.4);
+				//const LLColor4 physicsFillColour(0.0, 0.5, 1.0, 0.5);
+				////LLVector4a physicsEdgeColour(1.0, 1.0, 0.0, 1.0);
+				//const LLColor4 physicsEdgeColour=physicsFillColour*0.5;
+				//const LLColor4 degenerateFill(1.0, 0.0, 0.0, 0.5);
+				//const LLColor4 degenerateEdge(1.0,0.0,0.0,1.0);
+				// </FS:Beq> 
+
 				glClear(GL_DEPTH_BUFFER_BIT);
+				//<FS:Beq> refactor to remove silly variable names
+				//				for (U32 i = 0; i < 2; i++)
 				for (U32 pass = 0; pass < 2; pass++)
+				//</FS:Beq>
 				{
+					//<FS:Beq> refactor to remove silly variable names
+					//if (i == 0)
 					if (pass == 0)
+					//</FS:Beq>
 					{ //depth only pass
 						gGL.setColorMask(false, false);
 					}
@@ -4002,7 +4058,10 @@ BOOL LLModelPreview::render()
 					}
 
 					//enable alpha blending on second pass but not first pass
+					//<FS:Beq> refactor to remove silly variable names
+					//LLGLState blend(GL_BLEND, i);
 					LLGLState blend(GL_BLEND, pass);
+					//</FS:Beq>
 
 					gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
 
@@ -4106,11 +4165,16 @@ BOOL LLModelPreview::render()
 						gGL.popMatrix();
 					}
 
-					// only do this if mDegenerate was set in the preceding mesh checks [Check this if the ordering ever breaks]
+					//<FS:Beq> refactor to remove silly variable names
+					// also only do this if mDegenerate was set in the preceding mesh checks [Check this if the ordering ever breaks]
+					//if (i > 0)
 					if (pass > 0 && mHasDegenerate)
+					//</FS:Beq>
 					{
 						glLineWidth(deg_edge_width);
 						glPointSize(deg_point_size);
+// <FS:Beq> This single line is why the degenerate triangles display has been crap forever. 
+// 						gPipeline.enableLightsFullbright(LLColor4::white);
 						//show degenerate triangles
 						LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS);
 						LLGLDisable cull(GL_CULL_FACE);
@@ -4148,10 +4212,13 @@ BOOL LLModelPreview::render()
 									}
 
 									auto num_degenerate = 0;
+									//<FS:Beq> More nested i variable silliness
+									//									for (U32 i = 0; i < mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); ++i)
 									auto num_models = mVertexBuffer[LLModel::LOD_PHYSICS][model].size();
 									for (U32 v = 0; v < num_models; ++v)
 									{
 										LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][v];
+									//</FS:Beq>
 										if(buffer->getNumVerts() < 3)continue;
 
 										buffer->setBuffer(type_mask & buffer->getTypeMask());
@@ -4164,6 +4231,7 @@ BOOL LLModelPreview::render()
 										buffer->getIndexStrider(idx, 0);
 
 										LLVector4a v1, v2, v3;
+										//<FS:Beq> rename inner most i to avoid merge confusion
 										for (U32 indices_offset = 0; indices_offset < buffer->getNumIndices(); indices_offset += 3)
 										{
 											v1.setMul(pos[*idx++], scale);
@@ -4274,6 +4342,8 @@ BOOL LLModelPreview::render()
 							}
 						
 							buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);
+							// <FS:Beq> configurable colour and width
+							//gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
 
 							if (edges)
 							{
@@ -4284,6 +4354,7 @@ BOOL LLModelPreview::render()
 								glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
 								glLineWidth(1.f);
 							}
+							// </FS:Beq>
 						}
 					}
 				}
@@ -4341,9 +4412,11 @@ void LLModelPreview::rotate(F32 yaw_radians, F32 pitch_radians)
 void LLModelPreview::zoom(F32 zoom_amt)
 {
 	F32 new_zoom = mCameraZoom+zoom_amt;
-	// TODO: stop clamping in render
+	// <FS:Beq> add configurable zoom TODO: stop clamping in render
+	// mCameraZoom = llclamp(new_zoom, 1.f, 10.f);
 	static LLCachedControl<F32> zoom_limit(gSavedSettings, "MeshPreviewZoomLimit");
 	mCameraZoom	= llclamp(new_zoom, 1.f, zoom_limit());
+	// </FS:Beq>
 }
 
 void LLModelPreview::pan(F32 right, F32 up)
@@ -4549,6 +4622,12 @@ void LLFloaterModelPreview::toggleCalculateButton(bool visible)
 		childSetTextArg("server_weight", "[SIM]", tbd);
 		childSetTextArg("physics_weight", "[PH]", tbd);
 		childSetTextArg("upload_fee", "[FEE]", tbd);
+		// <FS:Beq> add extended info fields
+		//childSetTextArg("price_breakdown", "[STREAMING]", dashes);
+		//childSetTextArg("price_breakdown", "[PHYSICS]", dashes);
+		//childSetTextArg("price_breakdown", "[INSTANCES]", dashes);
+		//childSetTextArg("price_breakdown", "[TEXTURES]", dashes);
+		//childSetTextArg("price_breakdown", "[MODEL]", dashes);
 		std::string dashes = hasString("--") ? getString("--") : "--";
 		childSetTextArg("price_breakdown", "[STREAMING]", dashes);
 		childSetTextArg("price_breakdown", "[PHYSICS]", dashes);
@@ -4558,6 +4637,7 @@ void LLFloaterModelPreview::toggleCalculateButton(bool visible)
 		childSetTextArg("physics_breakdown", "[PCH]", dashes);
 		childSetTextArg("physics_breakdown", "[PM]", dashes);
 		childSetTextArg("physics_breakdown", "[PHU]", dashes);
+		// </FS:Beq>
 	}
 }
 
@@ -4607,7 +4687,7 @@ void LLFloaterModelPreview::handleModelPhysicsFeeReceived()
 	childSetTextArg("price_breakdown", "[INSTANCES]", llformat("%d", result["upload_price_breakdown"]["mesh_instance"].asInteger()));
 	childSetTextArg("price_breakdown", "[TEXTURES]", llformat("%d", result["upload_price_breakdown"]["texture"].asInteger()));
 	childSetTextArg("price_breakdown", "[MODEL]", llformat("%d", result["upload_price_breakdown"]["model"].asInteger()));
-
+//<FS:Beq> Updates for enhanced Mesh feedback at upload
 	childSetTextArg("physics_breakdown", "[PCH]", llformat("%0.3f", result["model_physics_cost"]["hull"].asReal()));
 	childSetTextArg("physics_breakdown", "[PM]", llformat("%0.3f", result["model_physics_cost"]["mesh"].asReal()));
 	childSetTextArg("physics_breakdown", "[PHU]", llformat("%0.3f", result["model_physics_cost"]["decomposition"].asReal()));
@@ -4616,7 +4696,7 @@ void LLFloaterModelPreview::handleModelPhysicsFeeReceived()
 	childSetTextArg("streaming_breakdown", "[STR_MED]", llformat("%d", result["streaming_params"]["medium_lod"].asInteger()));
 	childSetTextArg("streaming_breakdown", "[STR_LOW]", llformat("%d", result["streaming_params"]["low_lod"].asInteger()));
 	childSetTextArg("streaming_breakdown", "[STR_LOWEST]", llformat("%d", result["streaming_params"]["lowest_lod"].asInteger()));
-
+//</FS:Beq>
 	childSetVisible("upload_fee", true);
 	childSetVisible("price_breakdown", true);
 	mUploadBtn->setEnabled(isModelUploadAllowed());
-- 
cgit v1.2.3


From 020c5c956168abc8b38a8da8d2cff4306c4acdb6 Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Sat, 23 Feb 2019 20:07:42 +0200
Subject: Backed out changeset: 3abc812c6f48

---
 indra/newview/app_settings/settings.xml | 2 --
 1 file changed, 2 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 5f6bfec842..b2f86fa301 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -6810,7 +6810,6 @@
     <key>Value</key>
     <real>10.0</real>
   </map>
-  <key>MigrateCacheDirectory</key>
   <map>
       <key>Comment</key>
       <string>Check for old version of disk cache to migrate to current location</string>
@@ -16492,4 +16491,3 @@
 </map>
 </llsd>
 
-
-- 
cgit v1.2.3


From 599e08181544f214142703928a6d242a0ae72e60 Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Sat, 23 Feb 2019 20:08:03 +0200
Subject: Backed out changeset: d5795c04fecc

---
 doc/contributions.txt                              |   2 -
 indra/newview/app_settings/settings.xml            | 199 +-------
 .../shaders/class1/objects/previewV.glsl           |   8 +-
 indra/newview/lldynamictexture.cpp                 |  30 +-
 indra/newview/llfloatermodelpreview.cpp            | 527 +++++++--------------
 indra/newview/llfloatermodelpreview.h              |   2 -
 indra/newview/pipeline.cpp                         |   6 +-
 .../skins/default/xui/en/floater_model_preview.xml | 369 +++++----------
 8 files changed, 299 insertions(+), 844 deletions(-)

diff --git a/doc/contributions.txt b/doc/contributions.txt
index 6146689fb0..365ae544b1 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -256,8 +256,6 @@ Benja Kepler
 	VWR-746
 Benjamin Bigdipper
 Beth Walcher
-Beq Janus
-	SL-10288
 Bezilon Kasei
 Biancaluce Robbiani
 	CT-225
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index b2f86fa301..8e525aceda 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -6628,189 +6628,8 @@
     <key>Value</key>
     <integer>600</integer>
   </map>
-  <key>MeshPreviewCanvasColor</key>
-  <map>
-    <key>Comment</key>
-    <string>Canvas colour for the Mesh uploader</string>
-    <key>Persist</key>
-    <integer>1</integer>
-    <key>Type</key>
-    <string>Color4</string>
-    <key>Value</key>
-    <array>
-      <real>0.169</real>
-      <real>0.169</real>
-      <real>0.169</real>
-      <real>1.0</real>
-    </array>
-  </map>
-  <key>MeshPreviewEdgeColor</key>
-  <map>
-    <key>Comment</key>
-    <string>Edge colour for the Mesh uploader preview</string>
-    <key>Persist</key>
-    <integer>1</integer>
-    <key>Type</key>
-    <string>Color4</string>
-    <key>Value</key>
-    <array>
-      <real>0.4</real>
-      <real>0.4</real>
-      <real>0.4</real>
-      <real>1.0</real>
-    </array>
-  </map>
-  <key>MeshPreviewBaseColor</key>
-  <map>
-    <key>Comment</key>
-    <string>base diffuse colour for the Mesh uploader</string>
-    <key>Persist</key>
-    <integer>1</integer>
-    <key>Type</key>
-    <string>Color4</string>
-    <key>Value</key>
-    <array>
-      <real>1.0</real>
-      <real>1.0</real>
-      <real>1.0</real>
-      <real>1.0</real>
-    </array>
-  </map>
-  <key>MeshPreviewBrightnessColor</key>
-  <map>
-    <key>Comment</key>
-    <string>Brightness modifier</string>
-    <key>Persist</key>
-    <integer>1</integer>
-    <key>Type</key>
-    <string>Color3</string>
-    <key>Value</key>
-    <array>
-      <real>0.9</real>
-      <real>0.9</real>
-      <real>0.9</real>
-    </array>
-  </map>
-  <key>MeshPreviewEdgeWidth</key>
-  <map>
-    <key>Comment</key>
-    <string>line thickness used when display edges is selected in mesh preview</string>
-    <key>Persist</key>
-    <integer>1</integer>
-    <key>Type</key>
-    <string>F32</string>
-    <key>Value</key>
-      <real>1.0</real>
-  </map>
-  <key>MeshPreviewPhysicsEdgeColor</key>
-  <map>
-    <key>Comment</key>
-    <string>Edge colour for the Mesh uploader physics preview</string>
-    <key>Persist</key>
-    <integer>1</integer>
-    <key>Type</key>
-    <string>Color4</string>
-    <key>Value</key>
-    <array>
-      <real>0.0</real>
-      <real>0.25</real>
-      <real>0.5</real>
-      <real>0.25</real>
-    </array>
-  </map>
-  <key>MeshPreviewPhysicsFillColor</key>
-  <map>
-    <key>Comment</key>
-    <string>Fill colour for the Mesh uploader physics preview</string>
-    <key>Persist</key>
-    <integer>1</integer>
-    <key>Type</key>
-    <string>Color4</string>
-    <key>Value</key>
-    <array>
-      <real>0.0</real>
-      <real>0.5</real>
-      <real>1.0</real>
-      <real>0.5</real>
-    </array>
-  </map>
-  <key>MeshPreviewPhysicsEdgeWidth</key>
-  <map>
-    <key>Comment</key>
-    <string>line thickness used when display physics is selected in mesh preview</string>
-    <key>Persist</key>
-    <integer>1</integer>
-    <key>Type</key>
-    <string>F32</string>
-    <key>Value</key>
-    <real>1.0</real>
-  </map>
-  <key>MeshPreviewDegenerateEdgeColor</key>
-  <map>
-    <key>Comment</key>
-    <string>Edge colour for the Mesh uploader Degenerate preview</string>
-    <key>Persist</key>
-    <integer>1</integer>
-    <key>Type</key>
-    <string>Color4</string>
-    <key>Value</key>
-    <array>
-      <real>1.0</real>
-      <real>0.0</real>
-      <real>0.0</real>
-      <real>1.0</real>
-    </array>
-  </map>
-  <key>MeshPreviewDegenerateFillColor</key>
-  <map>
-    <key>Comment</key>
-    <string>Fill colour for the Mesh uploader Degenerate preview</string>
-    <key>Persist</key>
-    <integer>1</integer>
-    <key>Type</key>
-    <string>Color4</string>
-    <key>Value</key>
-    <array>
-      <real>1.0</real>
-      <real>0.0</real>
-      <real>0.0</real>
-      <real>0.5</real>
-    </array>
-  </map>
-  <key>MeshPreviewDegenerateEdgeWidth</key>
-  <map>
-    <key>Comment</key>
-    <string>line thickness used when display Degenerate is selected in mesh preview</string>
-    <key>Persist</key>
-    <integer>1</integer>
-    <key>Type</key>
-    <string>F32</string>
-    <key>Value</key>
-    <real>3.0</real>
-  </map>
-  <key>MeshPreviewDegeneratePointSize</key>
-  <map>
-    <key>Comment</key>
-    <string>Large point size used to highlight degenerate triangle vertices in Mesh preview</string>
-    <key>Persist</key>
-    <integer>1</integer>
-    <key>Type</key>
-    <string>F32</string>
-    <key>Value</key>
-    <real>8.0</real>
-  </map>
-  <key>MeshPreviewZoomLimit</key>
-  <map>
-    <key>Comment</key>
-    <string>Maximum Zoom level in preview</string>
-    <key>Persist</key>
-    <integer>1</integer>
-    <key>Type</key>
-    <string>F32</string>
-    <key>Value</key>
-    <real>10.0</real>
-  </map>
-  <map>
+  <key>MigrateCacheDirectory</key>
+    <map>
       <key>Comment</key>
       <string>Check for old version of disk cache to migrate to current location</string>
       <key>Persist</key>
@@ -8049,17 +7868,7 @@
       <key>Value</key>
 	  <integer>13</integer>
     </map>
-  <key>PreviewRenderSize</key>  
-  <map>
-    <key>Comment</key>
-    <string>Resolution of the image rendered for the mesh upload preview</string>
-    <key>Persist</key>
-    <integer>1</integer>
-    <key>Type</key>
-    <string>S32</string>
-    <key>Value</key>
-    <integer>1024</integer>
-  </map>
+
   <key>PreviewAmbientColor</key>
   <map>
     <key>Comment</key>
@@ -8076,6 +7885,8 @@
       <real>1.0</real>
     </array>
   </map>
+
+
   <key>PreviewDiffuse0</key>
   <map>
     <key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
index 3424613e94..7f3f84398b 100644
--- a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
@@ -91,10 +91,8 @@ void main()
 
 	// Collect normal lights (need to be divided by two, as we later multiply by 2)
 	col.rgb += light_diffuse[1].rgb * calcDirectionalLight(norm, light_position[1].xyz);
-//	col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].z);
-	col.rgb += light_diffuse[2].rgb * calcDirectionalLight(norm, light_position[2].xyz);
-//	col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].z);
-	col.rgb += light_diffuse[3].rgb * calcDirectionalLight(norm, light_position[3].xyz);
-	col /= 2.0;
+	col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].z);
+	col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].z);
+		
 	vertex_color = col*color;
 }
diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp
index af6977d3cd..fa9a0712fa 100644
--- a/indra/newview/lldynamictexture.cpp
+++ b/indra/newview/lldynamictexture.cpp
@@ -125,17 +125,11 @@ BOOL LLViewerDynamicTexture::render()
 //-----------------------------------------------------------------------------
 void LLViewerDynamicTexture::preRender(BOOL clear_depth)
 {
-	// <FS:Beq> changes to support higher resolution rendering in the preview
-	////only images up to 512x512 are supported
-	//llassert(mFullHeight <= 512);
-	//llassert(mFullWidth <= 512);
-	gPipeline.allocatePhysicsBuffer();
-	llassert(mFullWidth <= static_cast<S32>(gPipeline.mPhysicsDisplay.getWidth()));
-	llassert(mFullHeight <= static_cast<S32>(gPipeline.mPhysicsDisplay.getHeight()));
+	//only images up to 512x512 are supported
+	llassert(mFullHeight <= 512);
+	llassert(mFullWidth <= 512);
 
-//	if (gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete() && !gGLManager.mIsATI)
-	if (gGLManager.mHasFramebufferObject && gPipeline.mPhysicsDisplay.isComplete() && !gGLManager.mIsATI)
-// </FS:Beq>
+	if (gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete() && !gGLManager.mIsATI)
 	{ //using offscreen render target, just use the bottom left corner
 		mOrigin.set(0, 0);
 	}
@@ -221,15 +215,14 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
 	{
 		return TRUE;
 	}
-	// <FS:Beq> changes to support higher resolution rendering in the preview
-	//	bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete() && !gGLManager.mIsATI;
-	bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mPhysicsDisplay.isComplete() && !gGLManager.mIsATI;
+
+	bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete() && !gGLManager.mIsATI;
+
 	if (use_fbo)
 	{
-//		gPipeline.mWaterDis.bindTarget();
-		gPipeline.mPhysicsDisplay.bindTarget();
+		gPipeline.mWaterDis.bindTarget();
 	}
-	// </FS:Beq>
+
 	LLGLSLShader::bindNoShader();
 	LLVertexBuffer::unbind();
 	
@@ -265,10 +258,7 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
 
 	if (use_fbo)
 	{
-		// <FS:Beq> changes to support higher resolution rendering in the preview
-		// gPipeline.mWaterDis.flush();
-		gPipeline.mPhysicsDisplay.flush();
-		// </FS:Beq>
+		gPipeline.mWaterDis.flush();
 	}
 
 	return ret;
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 7624245c16..4f1ea4a89e 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -427,11 +427,8 @@ void LLFloaterModelPreview::initModelPreview()
 	{
 		delete mModelPreview;
 	}
-	// <FS:Beq> mesh uploader changes to allow higher resolution render
-	//	mModelPreview = new LLModelPreview(512, 512, this);
-	auto size = gSavedSettings.getS32("PreviewRenderSize");
-	mModelPreview = new LLModelPreview(size, size, this );
-	// </FS:Beq>
+
+	mModelPreview = new LLModelPreview(512, 512, this );
 	mModelPreview->setPreviewTarget(16.f);
 	mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelPreview::setDetails, this, _1, _2, _3, _4, _5));
 	mModelPreview->setModelUpdatedCallback(boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this, _1));
@@ -441,16 +438,8 @@ void LLFloaterModelPreview::onViewOptionChecked(LLUICtrl* ctrl)
 {
 	if (mModelPreview)
 	{
-		// <FS:Beq> only show explode when phsyics is on
-		//		mModelPreview->mViewOption[ctrl->getName()] = !mModelPreview->mViewOption[ctrl->getName()];
-		auto name = ctrl->getName();
-		mModelPreview->mViewOption[name] = !mModelPreview->mViewOption[name];
-		if (name == "show_physics")
-		{
-			auto enabled = mModelPreview->mViewOption[name];
-			childSetEnabled("physics_explode", enabled);
-			childSetVisible("physics_explode", enabled);
-		}
+		mModelPreview->mViewOption[ctrl->getName()] = !mModelPreview->mViewOption[ctrl->getName()];
+		
 		mModelPreview->refresh();
 	}
 }
@@ -664,43 +653,6 @@ void LLFloaterModelPreview::onLODParamCommit(S32 lod, bool enforce_tri_limit)
 	}
 }
 
-// <FS:Beq> extracted method to simplify changes in layout
-void LLFloaterModelPreview::draw3dPreview()
-{
-	gGL.color3f(1.f, 1.f, 1.f);
-
-	gGL.getTexUnit(0)->bind(mModelPreview);
-
-
-	LLView* preview_panel = getChild<LLView>("preview_panel");
-
-	if (!preview_panel)
-	{
-		LL_WARNS() << "preview_panel not found in floater definition" << LL_ENDL;
-	}
-	LLRect rect = preview_panel->getRect();
-
-	if (rect != mPreviewRect)
-	{
-		mModelPreview->refresh();
-		mPreviewRect = preview_panel->getRect();
-	}
-
-	gGL.begin( LLRender::QUADS );
-	{
-		gGL.texCoord2f(0.f, 1.f);
-		gGL.vertex2i(mPreviewRect.mLeft, mPreviewRect.mTop-1);
-		gGL.texCoord2f(0.f, 0.f);
-		gGL.vertex2i(mPreviewRect.mLeft, mPreviewRect.mBottom);
-		gGL.texCoord2f(1.f, 0.f);
-		gGL.vertex2i(mPreviewRect.mRight-1, mPreviewRect.mBottom);
-		gGL.texCoord2f(1.f, 1.f);
-		gGL.vertex2i(mPreviewRect.mRight-1, mPreviewRect.mTop-1);
-	}
-	gGL.end();
-
-	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-}
 
 //-----------------------------------------------------------------------------
 // draw()
@@ -1266,7 +1218,6 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
 , mResetJoints( false )
 , mModelNoErrors( true )
 , mLastJointUpdate( false )
-, mHasDegenerate( false ) // <FS:Beq>
 {
 	mNeedsUpdate = TRUE;
 	mCameraDistance = 0.f;
@@ -2756,20 +2707,8 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
 
 void LLModelPreview::updateStatusMessages()
 {
-// <FS:Beq> bit mask values for physics errors. used to prevent overwrite of single line status
-// TODO: use this to provied multiline status
-	enum PhysicsError
-	{
-		NONE=0,
-		NOHAVOK=1,
-		DEGENERATE=2,
-		TOOMANYHULLS=4,
-		TOOMANYVERTSINHULL=8
-	};
-// </FS:Beq>
 	assert_main_thread();
 
-	U32 has_physics_error{ PhysicsError::NONE }; // <FS:Beq> physics error bitmap
 	//triangle/vertex/submesh count for each mesh asset for each lod
 	std::vector<S32> tris[LLModel::NUM_LODS];
 	std::vector<S32> verts[LLModel::NUM_LODS];
@@ -2858,72 +2797,44 @@ void LLModelPreview::updateStatusMessages()
 	{
 		mMaxTriangleLimit = total_tris[LLModel::LOD_HIGH];
 	}
-	// <FS:Beq> make has_degenerate a member so that we can use it in the render method
-	// has_degenerate = false
-	mHasDegenerate = false;
+
+	bool has_degenerate = false;
+
 	{//check for degenerate triangles in physics mesh
 		U32 lod = LLModel::LOD_PHYSICS;
 		const LLVector4a scale(0.5f);
-		for (U32 i = 0; i < mModel[lod].size() && !mHasDegenerate; ++i)// <FS:Beq> make has_degenerate a member 
+		for (U32 i = 0; i < mModel[lod].size() && !has_degenerate; ++i)
 		{ //for each model in the lod
 			if (mModel[lod][i] && mModel[lod][i]->mPhysics.mHull.empty())
 			{ //no decomp exists
 				S32 cur_submeshes = mModel[lod][i]->getNumVolumeFaces();
-				for (S32 j = 0; j < cur_submeshes && !mHasDegenerate; ++j)// <FS:Beq> make has_degenerate a member 
+				for (S32 j = 0; j < cur_submeshes && !has_degenerate; ++j)
 				{ //for each submesh (face), add triangles and vertices to current total
 					LLVolumeFace& face = mModel[lod][i]->getVolumeFace(j);
-					for (S32 k = 0; (k < face.mNumIndices) && !mHasDegenerate; )// <FS:Beq> make has_degenerate a member 
+					for (S32 k = 0; (k < face.mNumIndices) && !has_degenerate; )
 					{
-						U16 index_a = face.mIndices[k + 0];
-						U16 index_b = face.mIndices[k + 1];
-						U16 index_c = face.mIndices[k + 2];
-						// <FS:Beq> FIRE-23367/23387 - Allow forced empty triangle placeholders created by the LOD processing.
-						//	LLVector4a v1; v1.setMul(face.mPositions[index_a], scale);
-						//	LLVector4a v2; v2.setMul(face.mPositions[index_b], scale);
-						//	LLVector4a v3; v3.setMul(face.mPositions[index_c], scale);
-
-						//	if (ll_is_degenerate(v1, v2, v3))
-						//	{
-						//		mHasDegenerate = true;// <FS:Beq> make has_degenerate a member 
-						//	}
-						//	else
-						//	{
-						//		k += 3;
-						//	}
-						if (index_c == 0 && index_b == 0 && index_a == 0) // test in reverse as 3rd index is less likely to be 0 in a normal case
+						U16 index_a = face.mIndices[k+0];
+						U16 index_b = face.mIndices[k+1];
+						U16 index_c = face.mIndices[k+2];
+
+						LLVector4a v1; v1.setMul(face.mPositions[index_a], scale);
+						LLVector4a v2; v2.setMul(face.mPositions[index_b], scale);
+						LLVector4a v3; v3.setMul(face.mPositions[index_c], scale);
+
+						if (ll_is_degenerate(v1,v2,v3))
 						{
-							LL_DEBUGS("MeshValidation") << "Empty placeholder triangle (3 identical index 0 verts) ignored" << LL_ENDL;
+							has_degenerate = true;
 						}
 						else
 						{
-							LLVector4a v1; v1.setMul(face.mPositions[index_a], scale);
-							LLVector4a v2; v2.setMul(face.mPositions[index_b], scale);
-							LLVector4a v3; v3.setMul(face.mPositions[index_c], scale);
-							if (ll_is_degenerate(v1, v2, v3))
-							{
-								mHasDegenerate = true;// <FS:Beq> make has_degenerate a member 
-							}
+							k += 3;
 						}
-						k += 3;
 					}
 				}
 			}
 		}
 	}
 
-	// <FS:Beq> flag degenerates here rather than deferring to a MAV error later
-	mFMP->childSetVisible("physics_status_message_text", mHasDegenerate); //display or clear
-	auto degenerateIcon = mFMP->getChild<LLIconCtrl>("physics_status_message_icon");
-	degenerateIcon->setVisible(mHasDegenerate);
-	if (mHasDegenerate)
-	{
-		has_physics_error |= PhysicsError::DEGENERATE;
-		mFMP->childSetValue("physics_status_message_text", mFMP->getString("phys_status_degenerate_triangles"));
-		LLUIImagePtr img = LLUI::getUIImage("ModelImport_Status_Error");
-		degenerateIcon->setImage(img);
-	}
-	// </FS:Beq>
-
 	mFMP->childSetTextArg("submeshes_info", "[SUBMESHES]", llformat("%d", total_submeshes[LLModel::LOD_HIGH]));
 
 	std::string mesh_status_na = mFMP->getString("mesh_status_na");
@@ -3048,22 +2959,14 @@ void LLModelPreview::updateStatusMessages()
 			}
 		}
 	}
-
+	mFMP->childSetVisible("physics_status_message_text", physExceededVertexLimit);
+	LLIconCtrl* physStatusIcon = mFMP->getChild<LLIconCtrl>("physics_status_message_icon");
+	physStatusIcon->setVisible(physExceededVertexLimit);
 	if (physExceededVertexLimit)
 	{
-		has_physics_error |= PhysicsError::TOOMANYVERTSINHULL;
-	}
-
-	if (!(has_physics_error & PhysicsError::DEGENERATE)){ // only update this field (incluides clearing it) if it is not already in use.
-		mFMP->childSetVisible("physics_status_message_text", physExceededVertexLimit);
-		LLIconCtrl* physStatusIcon = mFMP->getChild<LLIconCtrl>("physics_status_message_icon");
-		physStatusIcon->setVisible(physExceededVertexLimit);
-		if (physExceededVertexLimit)
-		{
-			mFMP->childSetValue("physics_status_message_text", mFMP->getString("phys_status_vertex_limit_exceeded"));
-			LLUIImagePtr img = LLUI::getUIImage("ModelImport_Status_Warning");
-			physStatusIcon->setImage(img);
-		}
+		mFMP->childSetValue("physics_status_message_text", mFMP->getString("phys_status_vertex_limit_exceeded"));
+		LLUIImagePtr img = LLUI::getUIImage("ModelImport_Status_Warning");
+		physStatusIcon->setImage(img);
 	}
 
 	if (getLoadState() >= LLModelLoader::ERROR_PARSING)
@@ -3092,21 +2995,12 @@ void LLModelPreview::updateStatusMessages()
 			mModelNoErrors = false;
 		}
 	}
-	// <FS:Beq> Improve the error checking the TO DO here is no longer applicable but not an FS comment so edited to stop it being picked up
-	//// To do investigate use of has_degenerate and include into mModelNoErrors upload blocking mechanics
-	//// current use of has_degenerate won't block upload permanently - later checks will restore the button
-	//if (!mModelNoErrors || mHasDegenerate)
-	//{
-	//	mFMP->childDisable("ok_btn");
-	if (!mModelNoErrors || mHasDegenerate)
+
+	// Todo: investigate use of has_degenerate and include into mModelNoErrors upload blocking mechanics
+	// current use of has_degenerate won't block upload permanently - later checks will restore the button
+	if (!mModelNoErrors || has_degenerate)
 	{
 		mFMP->childDisable("ok_btn");
-		mFMP->childDisable("calculate_btn");
-	}
-	else
-	{
-		mFMP->childEnable("ok_btn");
-		mFMP->childEnable("calculate_btn");
 	}
 	
 	//add up physics triangles etc
@@ -3722,30 +3616,11 @@ BOOL LLModelPreview::render()
 	bool textures = mViewOption["show_textures"];
 	bool physics = mViewOption["show_physics"];
 
-	// <FS:Beq> Extra configurability, to be exposed later as controls?
-	static LLCachedControl<LLColor4> canvas_col(gSavedSettings, "MeshPreviewCanvasColor");
-	static LLCachedControl<LLColor4> edge_col(gSavedSettings, "MeshPreviewEdgeColor");
-	static LLCachedControl<LLColor4> base_col(gSavedSettings, "MeshPreviewBaseColor");
-	static LLCachedControl<LLColor3> brightness(gSavedSettings, "MeshPreviewBrightnessColor");
-	static LLCachedControl<F32> edge_width(gSavedSettings, "MeshPreviewEdgeWidth");
-	static LLCachedControl<LLColor4> phys_edge_col(gSavedSettings, "MeshPreviewPhysicsEdgeColor");
-	static LLCachedControl<LLColor4> phys_fill_col(gSavedSettings, "MeshPreviewPhysicsFillColor");
-	static LLCachedControl<F32> phys_edge_width(gSavedSettings, "MeshPreviewPhysicsEdgeWidth");
-	static LLCachedControl<LLColor4> deg_edge_col(gSavedSettings, "MeshPreviewDegenerateEdgeColor");
-	static LLCachedControl<LLColor4> deg_fill_col(gSavedSettings, "MeshPreviewDegenerateFillColor");	
-	static LLCachedControl<F32> deg_edge_width(gSavedSettings, "MeshPreviewDegenerateEdgeWidth");
-	static LLCachedControl<F32> deg_point_size(gSavedSettings, "MeshPreviewDegeneratePointSize");
-	// </FS:Beq>
 	S32 width = getWidth();
 	S32 height = getHeight();
 
 	LLGLSUIDefault def;
 	LLGLDisable no_blend(GL_BLEND);
-// <FS:Beq> Clean up render of mesh preview
-//	LLGLEnable blend(GL_BLEND);
-//	gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
-// </FS:Beq> 
-
 	LLGLEnable cull(GL_CULL_FACE);
 	LLGLDepthTest depth(GL_TRUE);
 	LLGLDisable fog(GL_FOG);
@@ -3764,9 +3639,9 @@ BOOL LLModelPreview::render()
 		gGL.matrixMode(LLRender::MM_MODELVIEW);
 		gGL.pushMatrix();
 		gGL.loadIdentity();
-		// <FS:Beq> uploader improvements
-		//gGL.color4f(0.169f, 0.169f, 0.169f, 1.f);
-		gGL.color4fv(static_cast<LLColor4>(canvas_col).mV);
+
+		gGL.color4f(0.169f, 0.169f, 0.169f, 1.f);
+
 		gl_rect_2d_simple( width, height );
 
 		gGL.matrixMode(LLRender::MM_PROJECTION);
@@ -3914,11 +3789,8 @@ BOOL LLModelPreview::render()
 	stop_glerror();
 
 	gGL.pushMatrix();
-	// <FS:Beq> mesh uploader improvements configurable brightness
-	//const F32 BRIGHTNESS = 0.9f;
-	//gGL.color3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);
-	gGL.color4fv(edge_col().mV);
-	// </FS:Beq>
+	const F32 BRIGHTNESS = 0.9f;
+	gGL.color3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);
 
 	const U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
 
@@ -4003,22 +3875,16 @@ BOOL LLModelPreview::render()
 						}
 						else
 						{
-						// <FS:Beq> improved mesh uploader
-						//	gGL.diffuseColor4f(1,1,1,1);
-							gGL.diffuseColor4fv(static_cast<LLColor4>(base_col).mV);
-						// </FS:Beq>
-
+							gGL.diffuseColor4f(1,1,1,1);
 						}
 
 						buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
 						gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-						// <FS:Beq> improved mesh uploader
-						//gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
-						gGL.diffuseColor4fv(static_cast<LLColor4>(edge_col).mV);
-						// </FS:Beq> 
+						gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
+
 						if (edges)
 						{
-							glLineWidth(edge_width);
+							glLineWidth(3.f);
 							glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
 							buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
 							glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
@@ -4030,25 +3896,11 @@ BOOL LLModelPreview::render()
 
 			if (physics)
 			{
-				// <FS:Beq> model upload improvements - use the settings
-				////Vector4a physicsFillColour(0.4, 0.4, 0.4, 0.4);
-				//const LLColor4 physicsFillColour(0.0, 0.5, 1.0, 0.5);
-				////LLVector4a physicsEdgeColour(1.0, 1.0, 0.0, 1.0);
-				//const LLColor4 physicsEdgeColour=physicsFillColour*0.5;
-				//const LLColor4 degenerateFill(1.0, 0.0, 0.0, 0.5);
-				//const LLColor4 degenerateEdge(1.0,0.0,0.0,1.0);
-				// </FS:Beq> 
-
 				glClear(GL_DEPTH_BUFFER_BIT);
-				//<FS:Beq> refactor to remove silly variable names
-				//				for (U32 i = 0; i < 2; i++)
-				for (U32 pass = 0; pass < 2; pass++)
-				//</FS:Beq>
+				
+				for (U32 i = 0; i < 2; i++)
 				{
-					//<FS:Beq> refactor to remove silly variable names
-					//if (i == 0)
-					if (pass == 0)
-					//</FS:Beq>
+					if (i == 0)
 					{ //depth only pass
 						gGL.setColorMask(false, false);
 					}
@@ -4058,11 +3910,8 @@ BOOL LLModelPreview::render()
 					}
 
 					//enable alpha blending on second pass but not first pass
-					//<FS:Beq> refactor to remove silly variable names
-					//LLGLState blend(GL_BLEND, i);
-					LLGLState blend(GL_BLEND, pass);
-					//</FS:Beq>
-
+					LLGLState blend(GL_BLEND, i); 
+					
 					gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
 
 					for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
@@ -4071,196 +3920,175 @@ BOOL LLModelPreview::render()
 
 						LLModel* model = instance.mLOD[LLModel::LOD_PHYSICS];
 
-						if (!model)
-						{
-							continue;
-						}
-
-						gGL.pushMatrix();
-						LLMatrix4 mat = instance.mTransform;
+							if (!model)
+							{
+								continue;
+							}
 
-						gGL.multMatrix((GLfloat*)mat.mMatrix);
+							gGL.pushMatrix();
+							LLMatrix4 mat = instance.mTransform;
 
+						gGL.multMatrix((GLfloat*) mat.mMatrix);
 
-						bool render_mesh = true;
-						LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread;
-						if (decomp)
-						{
-							LLMutexLock(decomp->mMutex);
 
-							LLModel::Decomposition& physics = model->mPhysics;
+							bool render_mesh = true;
 
-							if (!physics.mHull.empty())
+							LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread;
+							if (decomp)
 							{
-								render_mesh = false;
+								LLMutexLock(decomp->mMutex);
 
-								if (physics.mMesh.empty())
-								{ //build vertex buffer for physics mesh
-									gMeshRepo.buildPhysicsMesh(physics);
-								}
+								LLModel::Decomposition& physics = model->mPhysics;
 
-								if (!physics.mMesh.empty())
-								{ //render hull instead of mesh
-									for (U32 i = 0; i < physics.mMesh.size(); ++i)
-									{
-										if (explode > 0.f)
+								if (!physics.mHull.empty())
+								{
+									render_mesh = false;
+
+									if (physics.mMesh.empty())
+									{ //build vertex buffer for physics mesh
+										gMeshRepo.buildPhysicsMesh(physics);
+									}
+						
+									if (!physics.mMesh.empty())
+									{ //render hull instead of mesh
+										for (U32 i = 0; i < physics.mMesh.size(); ++i)
 										{
-											gGL.pushMatrix();
+											if (explode > 0.f)
+											{
+												gGL.pushMatrix();
 
-											LLVector3 offset = model->mHullCenter[i] - model->mCenterOfHullCenters;
-											offset *= explode;
+												LLVector3 offset = model->mHullCenter[i]-model->mCenterOfHullCenters;
+												offset *= explode;
 
-											gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]);
-										}
+												gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]);
+											}
 
-										static std::vector<LLColor4U> hull_colors;
+											static std::vector<LLColor4U> hull_colors;
 
-										if (i + 1 >= hull_colors.size())
-										{
-											hull_colors.push_back(LLColor4U(rand() % 128 + 127, rand() % 128 + 127, rand() % 128 + 127, 128));
-										}
+											if (i+1 >= hull_colors.size())
+											{
+												hull_colors.push_back(LLColor4U(rand()%128+127, rand()%128+127, rand()%128+127, 128));
+											}
 
-										gGL.diffuseColor4ubv(hull_colors[i].mV);
-										LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals);
+											gGL.diffuseColor4ubv(hull_colors[i].mV);
+											LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals);
 
-										if (explode > 0.f)
-										{
-											gGL.popMatrix();
+											if (explode > 0.f)
+											{
+												gGL.popMatrix();
+											}
 										}
 									}
 								}
 							}
-						}
-
-						if (render_mesh)
-						{
-							if (mVertexBuffer[LLModel::LOD_PHYSICS].empty())
+						
+							if (render_mesh)
 							{
-								genBuffers(LLModel::LOD_PHYSICS, false);
-							}
+								if (mVertexBuffer[LLModel::LOD_PHYSICS].empty())
+								{
+									genBuffers(LLModel::LOD_PHYSICS, false);
+								}
 
-							U32 num_models = mVertexBuffer[LLModel::LOD_PHYSICS][model].size();
-							if (pass > 0){
+								U32 num_models = mVertexBuffer[LLModel::LOD_PHYSICS][model].size();
 								for (U32 i = 0; i < num_models; ++i)
 								{
 									LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i];
 
 									gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-									gGL.diffuseColor4fv(phys_fill_col().mV);
+									gGL.diffuseColor4f(0.4f, 0.4f, 0.0f, 0.4f);
 
 									buffer->setBuffer(type_mask & buffer->getTypeMask());
-									buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts() - 1, buffer->getNumIndices(), 0);
+									buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
+
+									gGL.diffuseColor3f(1.f, 1.f, 0.f);
 
-									gGL.diffuseColor4fv(phys_edge_col().mV);
-									glLineWidth(phys_edge_width);
+									glLineWidth(2.f);
 									glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
-									buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts() - 1, buffer->getNumIndices(), 0);
+									buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
 
 									glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
 									glLineWidth(1.f);
 								}
 							}
+
+							gGL.popMatrix();
 						}
 
-						gGL.popMatrix();
-					}
+					glLineWidth(3.f);
+					glPointSize(8.f);
+					gPipeline.enableLightsFullbright(LLColor4::white);
+					//show degenerate triangles
+					LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS);
+					LLGLDisable cull(GL_CULL_FACE);
+					gGL.diffuseColor4f(1.f,0.f,0.f,1.f);
+					const LLVector4a scale(0.5f);
 
-					//<FS:Beq> refactor to remove silly variable names
-					// also only do this if mDegenerate was set in the preceding mesh checks [Check this if the ordering ever breaks]
-					//if (i > 0)
-					if (pass > 0 && mHasDegenerate)
-					//</FS:Beq>
+					for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
 					{
-						glLineWidth(deg_edge_width);
-						glPointSize(deg_point_size);
-// <FS:Beq> This single line is why the degenerate triangles display has been crap forever. 
-// 						gPipeline.enableLightsFullbright(LLColor4::white);
-						//show degenerate triangles
-						LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS);
-						LLGLDisable cull(GL_CULL_FACE);
-						const LLVector4a scale(0.5f);
-
-						for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
-						{
-							LLModelInstance& instance = *iter;
+						LLModelInstance& instance = *iter;
 
-							LLModel* model = instance.mLOD[LLModel::LOD_PHYSICS];
+						LLModel* model = instance.mLOD[LLModel::LOD_PHYSICS];
 
-							if (!model)
-							{
-								continue;
-							}
+						if (!model)
+						{
+							continue;
+						}
 
-							gGL.pushMatrix();
-							LLMatrix4 mat = instance.mTransform;
+						gGL.pushMatrix();
+						LLMatrix4 mat = instance.mTransform;
 
-							gGL.multMatrix((GLfloat*)mat.mMatrix);
+						gGL.multMatrix((GLfloat*) mat.mMatrix);
 
 
-							LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread;
-							if (decomp)
-							{
-								LLMutexLock(decomp->mMutex);
+						LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread;
+						if (decomp)
+						{
+							LLMutexLock(decomp->mMutex);
 
-								LLModel::Decomposition& physics = model->mPhysics;
+							LLModel::Decomposition& physics = model->mPhysics;
 
-								if (physics.mHull.empty())
+							if (physics.mHull.empty())
+							{
+								if (mVertexBuffer[LLModel::LOD_PHYSICS].empty())
 								{
-									if (mVertexBuffer[LLModel::LOD_PHYSICS].empty())
-									{
-										genBuffers(LLModel::LOD_PHYSICS, false);
-									}
-
-									auto num_degenerate = 0;
-									//<FS:Beq> More nested i variable silliness
-									//									for (U32 i = 0; i < mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); ++i)
-									auto num_models = mVertexBuffer[LLModel::LOD_PHYSICS][model].size();
-									for (U32 v = 0; v < num_models; ++v)
-									{
-										LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][v];
-									//</FS:Beq>
-										if(buffer->getNumVerts() < 3)continue;
+									genBuffers(LLModel::LOD_PHYSICS, false);
+								}
+							
+								for (U32 i = 0; i < mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); ++i)
+								{
+									LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i];
 
-										buffer->setBuffer(type_mask & buffer->getTypeMask());
+									buffer->setBuffer(type_mask & buffer->getTypeMask());
 
-										LLStrider<LLVector3> pos_strider;
-										buffer->getVertexStrider(pos_strider, 0);
-										LLVector4a* pos = (LLVector4a*)pos_strider.get();
+									LLStrider<LLVector3> pos_strider; 
+									buffer->getVertexStrider(pos_strider, 0);
+									LLVector4a* pos = (LLVector4a*) pos_strider.get();
+							
+									LLStrider<U16> idx;
+									buffer->getIndexStrider(idx, 0);
 
-										LLStrider<U16> idx;
-										buffer->getIndexStrider(idx, 0);
+									for (U32 i = 0; i < buffer->getNumIndices(); i += 3)
+									{
+										LLVector4a v1; v1.setMul(pos[*idx++], scale);
+										LLVector4a v2; v2.setMul(pos[*idx++], scale);
+										LLVector4a v3; v3.setMul(pos[*idx++], scale);
 
-										LLVector4a v1, v2, v3;
-										//<FS:Beq> rename inner most i to avoid merge confusion
-										for (U32 indices_offset = 0; indices_offset < buffer->getNumIndices(); indices_offset += 3)
+										if (ll_is_degenerate(v1,v2,v3))
 										{
-											v1.setMul(pos[*idx++], scale);
-											v2.setMul(pos[*idx++], scale);
-											v3.setMul(pos[*idx++], scale);
-
-											if (ll_is_degenerate(v1, v2, v3))
-											{
-												num_degenerate++;
-												glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
-												gGL.diffuseColor3fv(deg_edge_col().mV);
-												buffer->drawRange(LLRender::TRIANGLES, 0, 2, 3, indices_offset);
-												buffer->drawRange(LLRender::POINTS, 0, 2, 3, indices_offset);
-												glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
-												gGL.diffuseColor3fv(deg_fill_col().mV);
-												buffer->drawRange(LLRender::TRIANGLES, 0, 2, 3, indices_offset);
-											}
+											buffer->draw(LLRender::LINE_LOOP, 3, i);
+											buffer->draw(LLRender::POINTS, 3, i);
 										}
 									}
 								}
 							}
-
-							gGL.popMatrix();
 						}
-						glLineWidth(1.f);
-						glPointSize(1.f);
-						gPipeline.enableLightsPreview();
-						gGL.setSceneBlendType(LLRender::BT_ALPHA);
+
+						gGL.popMatrix();
 					}
+					glLineWidth(1.f);
+					glPointSize(1.f);
+					gPipeline.enableLightsPreview();
+					gGL.setSceneBlendType(LLRender::BT_ALPHA);
 				}
 			}
 		}
@@ -4342,19 +4170,16 @@ BOOL LLModelPreview::render()
 							}
 						
 							buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);
-							// <FS:Beq> configurable colour and width
-							//gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
+							gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
 
 							if (edges)
 							{
-								gGL.diffuseColor4fv(edge_col().mV);
-								glLineWidth(edge_width);
+								glLineWidth(3.f);
 								glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
 								buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);
 								glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
 								glLineWidth(1.f);
 							}
-							// </FS:Beq>
 						}
 					}
 				}
@@ -4412,11 +4237,8 @@ void LLModelPreview::rotate(F32 yaw_radians, F32 pitch_radians)
 void LLModelPreview::zoom(F32 zoom_amt)
 {
 	F32 new_zoom = mCameraZoom+zoom_amt;
-	// <FS:Beq> add configurable zoom TODO: stop clamping in render
-	// mCameraZoom = llclamp(new_zoom, 1.f, 10.f);
-	static LLCachedControl<F32> zoom_limit(gSavedSettings, "MeshPreviewZoomLimit");
-	mCameraZoom	= llclamp(new_zoom, 1.f, zoom_limit());
-	// </FS:Beq>
+
+	mCameraZoom	= llclamp(new_zoom, 1.f, 10.f);
 }
 
 void LLModelPreview::pan(F32 right, F32 up)
@@ -4622,22 +4444,11 @@ void LLFloaterModelPreview::toggleCalculateButton(bool visible)
 		childSetTextArg("server_weight", "[SIM]", tbd);
 		childSetTextArg("physics_weight", "[PH]", tbd);
 		childSetTextArg("upload_fee", "[FEE]", tbd);
-		// <FS:Beq> add extended info fields
-		//childSetTextArg("price_breakdown", "[STREAMING]", dashes);
-		//childSetTextArg("price_breakdown", "[PHYSICS]", dashes);
-		//childSetTextArg("price_breakdown", "[INSTANCES]", dashes);
-		//childSetTextArg("price_breakdown", "[TEXTURES]", dashes);
-		//childSetTextArg("price_breakdown", "[MODEL]", dashes);
-		std::string dashes = hasString("--") ? getString("--") : "--";
-		childSetTextArg("price_breakdown", "[STREAMING]", dashes);
-		childSetTextArg("price_breakdown", "[PHYSICS]", dashes);
-		childSetTextArg("price_breakdown", "[INSTANCES]", dashes);
-		childSetTextArg("price_breakdown", "[TEXTURES]", dashes);
-		childSetTextArg("price_breakdown", "[MODEL]", dashes);
-		childSetTextArg("physics_breakdown", "[PCH]", dashes);
-		childSetTextArg("physics_breakdown", "[PM]", dashes);
-		childSetTextArg("physics_breakdown", "[PHU]", dashes);
-		// </FS:Beq>
+		childSetTextArg("price_breakdown", "[STREAMING]", tbd);
+		childSetTextArg("price_breakdown", "[PHYSICS]", tbd);
+		childSetTextArg("price_breakdown", "[INSTANCES]", tbd);
+		childSetTextArg("price_breakdown", "[TEXTURES]", tbd);
+		childSetTextArg("price_breakdown", "[MODEL]", tbd);
 	}
 }
 
@@ -4687,16 +4498,6 @@ void LLFloaterModelPreview::handleModelPhysicsFeeReceived()
 	childSetTextArg("price_breakdown", "[INSTANCES]", llformat("%d", result["upload_price_breakdown"]["mesh_instance"].asInteger()));
 	childSetTextArg("price_breakdown", "[TEXTURES]", llformat("%d", result["upload_price_breakdown"]["texture"].asInteger()));
 	childSetTextArg("price_breakdown", "[MODEL]", llformat("%d", result["upload_price_breakdown"]["model"].asInteger()));
-//<FS:Beq> Updates for enhanced Mesh feedback at upload
-	childSetTextArg("physics_breakdown", "[PCH]", llformat("%0.3f", result["model_physics_cost"]["hull"].asReal()));
-	childSetTextArg("physics_breakdown", "[PM]", llformat("%0.3f", result["model_physics_cost"]["mesh"].asReal()));
-	childSetTextArg("physics_breakdown", "[PHU]", llformat("%0.3f", result["model_physics_cost"]["decomposition"].asReal()));
-	childSetTextArg("streaming_breakdown", "[STR_TOTAL]", llformat("%d", result["streaming_cost"].asInteger()));
-	childSetTextArg("streaming_breakdown", "[STR_HIGH]", llformat("%d", result["streaming_params"]["high_lod"].asInteger()));
-	childSetTextArg("streaming_breakdown", "[STR_MED]", llformat("%d", result["streaming_params"]["medium_lod"].asInteger()));
-	childSetTextArg("streaming_breakdown", "[STR_LOW]", llformat("%d", result["streaming_params"]["low_lod"].asInteger()));
-	childSetTextArg("streaming_breakdown", "[STR_LOWEST]", llformat("%d", result["streaming_params"]["lowest_lod"].asInteger()));
-//</FS:Beq>
 	childSetVisible("upload_fee", true);
 	childSetVisible("price_breakdown", true);
 	mUploadBtn->setEnabled(isModelUploadAllowed());
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index 564f4c39de..7ec6a58ac7 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -152,7 +152,6 @@ protected:
 	static void		onAutoFillCommit(LLUICtrl*,void*);
 	
 	void onLODParamCommit(S32 lod, bool enforce_tri_limit);
-	void draw3dPreview();
 
 	static void		onExplodeCommit(LLUICtrl*, void*);
 	
@@ -311,7 +310,6 @@ public:
 	static bool 		sIgnoreLoadedCallback;
     std::vector<S32> mLodsQuery;
     std::vector<S32> mLodsWithParsingError;
-	bool mHasDegenerate;
 
 protected:
 
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index c7626304ed..40d6d325ba 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -6582,7 +6582,7 @@ void LLPipeline::enableLightsPreview()
 	light->enable();
 	light->setPosition(light_pos);
 	light->setDiffuse(diffuse0);
-	light->setAmbient(ambient);
+	light->setAmbient(LLColor4::black);
 	light->setSpecular(specular0);
 	light->setSpotExponent(0.f);
 	light->setSpotCutoff(180.f);
@@ -6593,7 +6593,7 @@ void LLPipeline::enableLightsPreview()
 	light->enable();
 	light->setPosition(light_pos);
 	light->setDiffuse(diffuse1);
-	light->setAmbient(ambient);
+	light->setAmbient(LLColor4::black);
 	light->setSpecular(specular1);
 	light->setSpotExponent(0.f);
 	light->setSpotCutoff(180.f);
@@ -6603,7 +6603,7 @@ void LLPipeline::enableLightsPreview()
 	light->enable();
 	light->setPosition(light_pos);
 	light->setDiffuse(diffuse2);
-	light->setAmbient(ambient);
+	light->setAmbient(LLColor4::black);
 	light->setSpecular(specular2);
 	light->setSpotExponent(0.f);
 	light->setSpotCutoff(180.f);
diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
index e073268b0a..5a86eb06fb 100644
--- a/indra/newview/skins/default/xui/en/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -2,12 +2,12 @@
 <floater
  can_close="true"
  can_drag_on_left="false"
- can_minimize="true"
- can_resize="true"
- height="600"
- min_height="600"
- width="1024"
- min_width="1024"
+ can_minimize="false"
+ can_resize="false"
+ height="480"
+ min_height="480"
+ width="980"
+ min_width="980"
  name="Model Preview"
  title="UPLOAD MODEL"
  help_topic="upload_model" >
@@ -33,21 +33,19 @@
   <string name="mesh_status_missing_lod">Missing required level of detail.</string>
   <string name="mesh_status_invalid_material_list">LOD materials are not a subset of reference model.</string>
   <string name="phys_status_vertex_limit_exceeded">Some physical hulls exceed vertex limitations.</string>
-  <string name="phys_status_degenerate_triangles">The physics mesh too dense remove the small thin triangles (see preview)</string>
-  <string name="phys_status_no_havok">The Firestorm OpenSim build is not supported for physics upload in SL.</string>
   <string name="layer_all">All</string> <!-- Text to display in physics layer combo box for "all layers" -->
   <string name="decomposing">Analyzing...</string>
   <string name="simplifying">Simplifying...</string>
   <string name="tbd">TBD</string>
 
-  <panel
-    follows="top|left"
-    height="580"
-    layout="topleft"
-    left="3"
-    name="left_panel"
-    top_pad="0"
-    width="630">
+<panel
+  follows="top|left"
+  height="455"
+  layout="topleft"
+  left="3"
+  name="left_panel"
+  top_pad="10"
+  width="630">
     <panel
       follows="all"
       height="50"
@@ -757,9 +755,8 @@
                       name="first_step_name"
                       text_color="White"
                       top_pad="0"
-                      width="210"
-                      valign="center">
-                      Step 1: Pick a physics model :
+                      width="210">
+                      Step 1: Level of Detail
                     </text>
                     <combo_box
                       follows="left|top"
@@ -801,7 +798,7 @@
               layout="topleft"
               left="18"
               name="physics_tab_border"
-              top_pad="10"
+              top_pad="15"
               width="589"/>
                 <panel
                   bg_alpha_color="0 0 0 0"
@@ -810,7 +807,7 @@
                   follows="top|left"
                   left="18"
                   name="physics analysis"
-                  top_pad="10"
+                  top_pad="15"
                   visible="true"
                   width="589">
                     <text
@@ -822,7 +819,7 @@
                       name="method_label"
                       text_color="White"
                       top_pad="0">
-                      Step 2: Convert to hulls (optional)
+                      Step 2: Analyze
                     </text>
                     <text
                       follows="top|left"
@@ -908,7 +905,7 @@
               layout="topleft"
               left="18"
               name="physics_tab_border"
-              top_pad="10"
+              top_pad="15"
               width="589"/>
                 <panel
                   bg_alpha_color="0 0 0 0"
@@ -917,7 +914,7 @@
                   height="66"
                   left="18"
                   name="physics simplification"
-                  top_pad="10"
+                  top_pad="15"
                   width="589">
                     <text
                       text_color="White"
@@ -1016,7 +1013,7 @@
               layout="topleft"
               left="18"
               name="physics_tab_border"
-              top_pad="10"
+              top_pad="15"
               width="589"/>
                 <panel
                   bg_alpha_color="0 0 0 0"
@@ -1078,9 +1075,10 @@
                  follows="left|top"
                  height="19"
                  layout="topleft"
-                 top_pad="5"
+                 left_pad="5"
+                 top_delta="0"
                  name="physics message"
-                 width="589">
+                 width="270">
                      <icon
                       follows="left|top"
                       height="16"
@@ -1095,7 +1093,7 @@
                       layout="topleft"
                       left_pad="2"
                       name="physics_status_message_text"
-                      width="573"
+                      width="252"
                       top_delta="3"/>
                 </panel>
         </panel>
@@ -1221,14 +1219,13 @@
      </panel>
     </tab_container>
     <panel
-     follows="top|left|bottom"
-     layout="topleft"
-     height="184"
-     left="4"
-     border="true"
+     follows="top|left"
+     height="80"
+     layout="top|left"
+     left="0"
      name="weights_and_warning_panel"
      top_pad="3"
-     width="629">
+     width="625">
        <button
          follows="top|left"
          label="Calculate weights &amp; fee"
@@ -1268,10 +1265,10 @@
          label_color="White"
          layout="topleft"
          name="reset_btn"
-         right="-5"
+         right="-2"
          top="3"
          height="20"
-         width="265"/>
+         width="275"/>
        <!-- ========== WEIGHTS ==========-->
        <text
          follows="top|left"
@@ -1290,7 +1287,7 @@
          left_pad="0"
          name="prim_weight"
          top_delta="0"
-         width="130"
+         width="120"
          word_wrap="true">
          Land impact: [EQ]
        </text>
@@ -1300,7 +1297,7 @@
          left_pad="0"
          name="download_weight"
          top_delta="0"
-         width="130"
+         width="100"
          word_wrap="true">
          Download: [ST]
        </text>
@@ -1310,7 +1307,7 @@
          layout="topleft"
          left_pad="0"
          name="physics_weight"
-         width="130"
+         width="90"
          word_wrap="true">
          Physics: [PH]
        </text>
@@ -1320,148 +1317,17 @@
          layout="topleft"
          left_pad="0"
          name="server_weight"
-         width="130"
+         width="83"
          word_wrap="true">
          Server: [SIM]
        </text>
-       <!-- =========== Cost breakdown ======== -->
-      <panel
-        border="true"
-        top_pad="5"
-        layout="topleft"
-        left="6"
-        name="price_breakdown_panel"
-        width="120"
-        height="100">
-        <text
-          layout="topleft"
-          left="3">
-          Price Breakdown
-        </text>
-        <view_border
-          bevel_style="none"
-          follows="top|left"
-          height="0"
-          layout="topleft"
-          left="3"
-          name="price_breakdown_border"
-          top_pad="5"
-          width="110"/>
-        <text
-          height="80"
-          top_pad="5"
-          layout="topleft"
-          left="3"
-          name="price_breakdown_labels"
-          width="70"
-          word_wrap="false">
-Download:
-Physics:
-Instances:
-Textures:
-Model:
-        </text>
-        <text
-          height="80"
-          top_delta="0"
-          layout="topleft"
-          halign="right"
-          left_pad="0"
-          name="price_breakdown"
-          width="40"
-          word_wrap="false">
-[STREAMING]
-[PHYSICS]
-[INSTANCES]
-[TEXTURES]
-[MODEL]
-        </text>
-      </panel>
-       <!-- 
-       Streaming breakdown numbers are available but not fully understood
-       uncommenting the following sections will display the numbers for debugging purposes
-       <text
-        height="80"
-        top_delta="0"
-        layout="topleft"
-        left="130"
-        name="streaming_breakdown_labels"
-        width="65"
-        word_wrap="true">
-Streaming/Download:
-High:
-Medium:
-Low:
-Lowest:
-      </text>
+       <!-- ========== NOTE MESSAGE ========== -->
        <text
-        height="80"
-        top_delta="0"
-        layout="topleft"
-        left_pad="0"
-        name="streaming_breakdown"
-        width="95"
-        word_wrap="true">
-[STR_TOTAL]
-[STR_HIGH]
-[STR_MED]
-[STR_LOW]
-[STR_LOWEST]
-      </text>-->
-      <panel
-        border="true"
-        layout="topleft"
-        left_pad="265"
-        name="price_breakdown_panel"
-        width="120"
-        height="100">
-        <text
-          layout="topleft"
-          left="3">
-          Physics Costs
-        </text>
-        <view_border
-          bevel_style="none"
-          follows="top|left"
-          height="0"
-          layout="topleft"
-          left="3"
-          name="price_breakdown_border"
-          top_pad="5"
-          width="110"/>
-        <text
-         height="80"
-         top_pad="5"
-         layout="topleft"
-         left="5"
-         name="physics_breakdown_labels"
-         width="65">
-Base Hull:
-Mesh:
-Analysed:
-        </text>
-        <text
-         height="80"
-         top_delta="0"
-         layout="topleft"
-         left_pad="0"
-         name="physics_breakdown"
-         width="40"
-         halign="right"
-         word_wrap="false"
-         visible="true">
-[PCH]
-[PM]
-[PHU]
-        </text>-->
-      </panel>
-      <!-- ========== NOTE MESSAGE ========== -->
-      <text
          font="SansSerif"
          layout="topleft"
          left="6"
          name="warning_title"
-         top_pad="5"
+         top_pad="10"
          text_color="DrYellow"
          visible="false"
          width="40">
@@ -1480,110 +1346,104 @@ Analysed:
          visible="false">
          You dont have rights to upload mesh models. [[VURL] Find out how] to get certified.
        </text>
-       <text text_color="Yellow" layout="topleft" top_delta="5" left="6" name="status">
-[STATUS]
-       </text>
+       <text text_color="Yellow" layout="topleft" top_delta="20" left="6" name="status">[STATUS]</text>
+  
     </panel>
-  </panel>
-  <panel
-    follows="top|left|bottom|right"
-    can_resize="true"
-    name="right_panel"
-    top="0"
-    left="640"
-    background_visible="true"
-    width="375">
-    <text
+</panel>
+
+<text 
+ follows="left|top"
+ layout="topleft"
+ left="640"
+ name="lod_label"
+ text_color="White"
+ top="13"
+ height="15"
+ width="290">
+ Preview:
+ </text>
+<panel
+ border="true"
+ bevel_style="none"
+ follows="top|left"
+ name="preview_panel"
+ top_pad="4"
+ width="290"
+ height="290"/>
+
+<panel
+  follows="all"
+  height="130"
+  layout="topleft"
+  name="right_panel"
+  top_pad="5"
+  width="340">
+    <combo_box
+      top_pad="3"
       follows="left|top"
+      height="18"
       layout="topleft"
-      left="0"
-      name="lod_label"
-      text_color="White"
-      top="13"
-      height="15"
-      width="290">
-      Preview:
-    </text>
-    <panel
-      can_resize="false"
-      follows="top|left"
-      height="20"
-      name="right_upper_panel"
-      top="8"
-      left="60"
-      background_visible="true"
-      width="315">
-      <combo_box
-        top_pad="3"
-        can_resize="false"
-        follows="top|left"
-        height="18"
-        layout="topleft"
-        name="preview_lod_combo"
-        width="75"
-        tool_tip="LOD to view in preview render">
+      name="preview_lod_combo"
+      width="150"
+      tool_tip="LOD to view in preview render">
         <combo_item name="high">   High   </combo_item>
         <combo_item name="medium"> Medium </combo_item>
         <combo_item name="low">    Low    </combo_item>
         <combo_item name="lowest"> Lowest </combo_item>
-      </combo_box>
-    </panel>
-  </panel>
-  <panel
-     border="true"
-     bevel_style="none"
-     follows="top|left|right|bottom"
-     layout="topleft"
-     name="preview_panel"
-     top="30"
-     width="375"
-     height="525"/>
-
-   <panel
-     follows="left|right|bottom"
-     layout="topleft"
-     height="40"
-     name="lower_right_panel"
-     top_pad="5"
-     width="375">
-     <check_box
-       follows="right|bottom"
-       label="Edges"
+    </combo_box>
+    <text
+      follows="top|left"
+      layout="topleft"
+      text_color="White"
+      top="5"
+      left_pad="20"
+      name="label_display"
+      width="50">
+      Display...
+    </text>
+    <check_box
+      follows="top|left"
+      label="Edges"
       label_text.text_color="White"
       layout="topleft"
+      left_delta="0"
       name="show_edges"
-      width="70"
-      left="0"
-      top_pad="8"/>
+      top_pad="8">
+    </check_box>
     <check_box
-      follows="right|bottom"
-      left_pad="8"
+      follows="top|left"
       label="Physics"
       label_text.text_color="White"
-      name="show_physics"/>
+      layout="topleft"
+      name="show_physics"
+      top_pad="8">
+    </check_box>
     <check_box
-      follows="right|bottom"
+      follows="top|left"
       label="Textures"
       label_text.text_color="White"
       layout="topleft"
       name="show_textures"
-      left_pad="0"/>
+      top_pad="8">
+    </check_box>
     <check_box
-      follows="right|bottom"
-      label="Weights"
+      follows="top|left"
+      label="Skin weights"
       label_text.text_color="White"
       layout="topleft"
       name="show_skin_weight"
-      left_pad="0"/>
+      top_pad="8">
+    </check_box>
     <check_box
-      follows="right|bottom"
+      follows="top|left"
       label="Joints"
       label_text.text_color="White"
       layout="topleft"
       name="show_joint_positions"
-      left_pad="0"/>
+      top_pad="8">
+    </check_box>
     <text
-      follows="right|bottom"
+      follows="top|left"
       layout="topleft"
       left="2"
       name="physics_explode_label"
@@ -1593,13 +1453,12 @@ Analysed:
     </text>
     <slider
       name="physics_explode"
-      follows="right|bottom"
-      valign="center"
-      top="15"
-      left="80"
+      follows="top|left"
+      top="100"
+      left="0"
       min_val="0.0"
       max_val="3.0"
       height="20"
-      width="120"/>
-  </panel>
+      width="150"/>
+</panel>
 </floater>
-- 
cgit v1.2.3


From ba415b8ef4cab395c77d34e616322b8781116911 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Sun, 3 Mar 2019 11:43:10 +0200
Subject: SL-10422 Validate mesh

---
 indra/newview/llmeshrepository.cpp | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index c4e7b17322..38fd2d777e 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -1823,14 +1823,19 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat
 			return false;
 		}
 
-		if (!header.isMap() || !header.has("version"))
+		if (!header.isMap())
 		{
 			LL_WARNS(LOG_MESH) << "Mesh header is invalid for ID: " << mesh_id << LL_ENDL;
 			return false;
 		}
 
+		if (header.has("version") && header["version"].asInteger() > MAX_MESH_VERSION)
+		{
+			LL_INFOS(LOG_MESH) << "Wrong version in header for " << mesh_id << LL_ENDL;
+			header["404"] = 1;
+		}
 		// make sure there is at least one lod, function returns -1 and marks as 404 otherwise
-		if (LLMeshRepository::getActualMeshLOD(header, 0) >= 0)
+		else if (LLMeshRepository::getActualMeshLOD(header, 0) >= 0)
 		{
 			header_size += stream.tellg();
 		}
@@ -3172,8 +3177,7 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
 
 		if (header_bytes > 0
 			&& !header.has("404")
-			&& header.has("version")
-			&& header["version"].asInteger() <= MAX_MESH_VERSION)
+			&& (!header.has("version") || header["version"].asInteger() <= MAX_MESH_VERSION))
 		{
 			std::stringstream str;
 
-- 
cgit v1.2.3


From f76812b29a424e9d9c609b49c10a8c6a332a5b04 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Mon, 25 Feb 2019 20:37:56 +0200
Subject: SL-10349 Added more tooltips

---
 .../newview/skins/default/xui/en/floater_tools.xml | 18 ++++++----
 .../skins/default/xui/en/sidepanel_item_info.xml   | 15 +++++---
 .../skins/default/xui/en/sidepanel_task_info.xml   | 40 ++++++++++++++--------
 3 files changed, 47 insertions(+), 26 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index ae0820c3ac..0abee2ff80 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -915,7 +915,8 @@
              name="Object Name"
              select_on_focus="true"
              top_delta="0"
-             width="170" />
+             width="170"
+             tool_tip="The name is limited to 63 characters. Longer prim names are cut short. Names can only consist of printable characters found in the ASCII-7 (non-extended) character set, with the exception of the vertical bar/pipe &apos;|&apos;." />
             <text
              follows="left|top"
              height="10"
@@ -933,7 +934,8 @@
              name="Object Description"
              select_on_focus="true"
              top_delta="0"
-             width="170" />
+             width="170"
+             tool_tip="When people have &apos;Hover Tips on All Objects&apos; selected in the viewer's settings, they'll see the object description pop-up for any object under their mouse pointer. The prim description is limited to 127 bytes any string longer then that will be truncated." />
             <text
              type="string"
              left="10"
@@ -1090,7 +1092,8 @@
              layout="topleft"
              name="clickaction"
              width="130"
-             left_pad="10">
+             left_pad="10"
+             tool_tip="A click action enables you to interact with an object with a single left click. Each click action has a special cursor indicating what it does. Some click actions have requirements to function. For example Touch and Pay require scripts" >
                 <combo_box.item
                  label="Touch  (default)"
                  name="Touch/grab(default)"
@@ -1126,7 +1129,8 @@
              layout="topleft"
              name="checkbox for sale"
              left="7"
-             width="97" />
+             width="97"
+             tool_tip="Lets people buy this object, its content or it copy inworld for specified price." />
   <!-- NEW PRICE SPINNER
 Objects are allowed to be for sale for L$0 to invoke buy UI behavior
 even though the user gets a free copy.
@@ -1144,7 +1148,8 @@ even though the user gets a free copy.
       width="85"
       min_val="0"
       height="20"
-      max_val="999999999" />
+      max_val="999999999"
+      tool_tip="Object cost." />
   <!-- NEW SALE TYPE COMBO BOX -->
       <combo_box
             left_pad="8"
@@ -1157,7 +1162,8 @@ even though the user gets a free copy.
             max_chars="20"
             mouse_opaque="true"
             name="sale type"
-            width="89">
+            width="89"
+            tool_tip="Select whether purchaser will receive a copy, copy of the content or item itself." >
         <combo_box.item
            name="Copy"
            label="Copy"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index ca1dc87134..acb6f5b42a 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -130,7 +130,8 @@
         max_length_bytes="63"
         name="LabelItemName"
         top_delta="0"
-        width="210" />
+        width="210"
+        tool_tip="The name is limited to 63 characters. Longer prim names are cut short. Names can only consist of printable characters found in the ASCII-7 (non-extended) character set, with the exception of the vertical bar/pipe &apos;|&apos;." />
       <text
         type="string"
         length="1"
@@ -153,7 +154,8 @@
         max_length_bytes="127"
         name="LabelItemDesc"
         top_delta="-5"
-        width="210" />
+        width="210"
+        tool_tip="When people have &apos;Hover Tips on All Objects&apos; selected in the viewer's settings, they'll see the object description pop-up for any object under their mouse pointer. The prim description is limited to 127 bytes any string longer then that will be truncated." />
       <text
         type="string"
         length="1"
@@ -421,14 +423,16 @@
         left="20"
         name="CheckPurchase"
         top_pad="20"
-        width="100" />
+        width="100"
+        tool_tip="Lets people buy this object, its content or it copy inworld for specified price." />
       <combo_box
         height="23"
         left_pad="0"
         layout="topleft"
         follows="left|top"
         name="ComboBoxSaleType"
-        width="170">
+        width="170"
+        tool_tip="Select whether purchaser will receive a copy, copy of the content or item itself." >
         <combo_box.item
              name="Copy"
              label="Copy"
@@ -455,7 +459,8 @@
         min_val="0"
         height="23"
         max_val="999999999"
-        top_pad="10"/>
+        top_pad="10"
+        tool_tip="Object cost." />
     </panel>
 
   </scroll_container>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
index 713d5f94bb..8a3e18707f 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
@@ -130,7 +130,8 @@
 		     max_length_bytes="63"
              name="Object Name"
 	    	 top_delta="0"
-		     width="225" />
+		     width="225"
+             tool_tip="The name is limited to 63 characters. Longer prim names are cut short. Names can only consist of printable characters found in the ASCII-7 (non-extended) character set, with the exception of the vertical bar/pipe &apos;|&apos;." />
 	    <text
 	    type="string"
 	    length="1"
@@ -154,7 +155,8 @@
     		 left_delta="78"
 		     max_length_bytes="127"
 	    	 top_delta="-5"
-	    	 width="225"/>
+	    	 width="225"
+             tool_tip="When people have &apos;Hover Tips on All Objects&apos; selected in the viewer's settings, they'll see the object description pop-up for any object under their mouse pointer. The prim description is limited to 127 bytes any string longer then that will be truncated." />
 	    <text
 		     type="string"
 		     length="1"
@@ -271,23 +273,24 @@
              layout="topleft"
              name="clickaction"
              width="168"
-             left="81">
+             left="81"
+             tool_tip="A click action enables you to interact with an object with a single left click. Each click action has a special cursor indicating what it does. Some click actions have requirements to function. For example Touch and Pay require scripts" >
                 <combo_box.item
                  label="Touch  (default)"
                  name="Touch/grab(default)"
-          value="Touch" />
+                 value="Touch" />
                 <combo_box.item
                  label="Sit on object"
                  name="Sitonobject"
-          value="Sit" />
+                 value="Sit" />
                 <combo_box.item
                  label="Buy object"
                  name="Buyobject"
-          value="Buy" />
+                 value="Buy" />
                 <combo_box.item
                  label="Pay object"
                  name="Payobject"
-          value="Pay" />
+                 value="Pay" />
                 <combo_box.item
                  label="Open"
                  name="Open"
@@ -422,14 +425,16 @@
 			 left="20"
              name="checkbox for sale"
 			 top_pad="10"
-			 width="100" />
+			 width="100"
+			 tool_tip="Lets people buy this object, its content or it copy inworld for specified price." />
 		<combo_box
 			 height="23"
 			 left_pad="0"
 			 layout="topleft"
 			 follows="left|top"
-            name="sale type"
-			 width="170">
+             name="sale type"
+			 width="170"
+			 tool_tip="Select whether purchaser will receive a copy, copy of the content or item itself.">
         <combo_box.item
            name="Copy"
            label="Copy"
@@ -456,7 +461,8 @@
         width="150"
         min_val="1"
         height="20"
-        max_val="999999999" />
+        max_val="999999999"
+        tool_tip="Object cost." />
       <check_box
 	   height="20"
 	   width="110"
@@ -573,7 +579,8 @@
 		     left="5"
 		     name="open_btn"
 		     top="0"
-		     width="73" />
+		     width="73"
+		     tool_tip="Open to view the Object Contents." />
 	    <button
 		     follows="bottom|left"
 		     height="23"
@@ -582,7 +589,8 @@
 		     left_pad="5"
 		     name="pay_btn"
 		     top="0"
-		     width="73" />
+		     width="73"
+		     tool_tip="Open Pay Window. Object must have pay script for this to work." />
 	    <button
 		     follows="bottom|left"
 		     height="23"
@@ -591,7 +599,8 @@
 		     left_pad="5"
 		     name="buy_btn"
 		     top="0"
-		     width="73" />
+		     width="73"
+		     tool_tip="Open Buy Window. Requires the object to be set for sale." />
         <button
 		     follows="bottom|left"
 		     height="23"
@@ -600,7 +609,8 @@
 		     left_pad="5"
 		     name="details_btn"
 		     top="0"
-		     width="74" />
+		     width="74"
+		     tool_tip="Open Inspect Object Window." />
 
 	</panel>
 </panel>
-- 
cgit v1.2.3


From 3b3e4833ad41993785ea2fcae651b588df8e492d Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Tue, 5 Mar 2019 20:14:21 +0200
Subject: SL-10686 Refresh indicators on session change, fix visibility

---
 indra/newview/llconversationview.cpp  | 55 ++++++++++++++++++++---------------
 indra/newview/llconversationview.h    |  3 +-
 indra/newview/lloutputmonitorctrl.cpp | 14 +++++++--
 indra/newview/lloutputmonitorctrl.h   |  5 +++-
 4 files changed, 50 insertions(+), 27 deletions(-)

diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp
index 59bb9af744..0075b62100 100644
--- a/indra/newview/llconversationview.cpp
+++ b/indra/newview/llconversationview.cpp
@@ -440,28 +440,23 @@ void LLConversationViewSession::refresh()
 	LLSpeakingIndicatorManager::updateSpeakingIndicators();
 
 	// we should show indicator for specified voice session only if this is current channel. EXT-5562.
-	if (!mIsInActiveVoiceChannel)
+	if (mSpeakingIndicator)
 	{
-		if (mSpeakingIndicator)
+		mSpeakingIndicator->setIsActiveChannel(mIsInActiveVoiceChannel);
+		mSpeakingIndicator->setShowParticipantsSpeaking(mIsInActiveVoiceChannel);
+	}
+
+	LLConversationViewParticipant* participant = NULL;
+	items_t::const_iterator iter;
+	for (iter = getItemsBegin(); iter != getItemsEnd(); iter++)
+	{
+		participant = dynamic_cast<LLConversationViewParticipant*>(*iter);
+		if (participant)
 		{
-			mSpeakingIndicator->setVisible(false);
-		}
-		LLConversationViewParticipant* participant = NULL;
-		items_t::const_iterator iter;
-		for (iter = getItemsBegin(); iter != getItemsEnd(); iter++)
-		{
-			participant = dynamic_cast<LLConversationViewParticipant*>(*iter);
-			if (participant)
-			{
-				participant->hideSpeakingIndicator();
-			}
+			participant->allowSpeakingIndicator(mIsInActiveVoiceChannel);
 		}
 	}
-    
-    if (mSpeakingIndicator)
-    {
-        mSpeakingIndicator->setShowParticipantsSpeaking(mIsInActiveVoiceChannel);
-    }
+
 	requestArrange();
 	// Do the regular upstream refresh
 	LLFolderViewFolder::refresh();
@@ -473,8 +468,13 @@ void LLConversationViewSession::onCurrentVoiceSessionChanged(const LLUUID& sessi
 
 	if (vmi)
 	{
+		bool old_value = mIsInActiveVoiceChannel;
 		mIsInActiveVoiceChannel = vmi->getUUID() == session_id;
 		mCallIconLayoutPanel->setVisible(mIsInActiveVoiceChannel);
+		if (old_value != mIsInActiveVoiceChannel)
+		{
+			refresh();
+		}
 	}
 }
 
@@ -630,10 +630,19 @@ void LLConversationViewParticipant::addToFolder(LLFolderViewFolder* folder)
     LLFolderViewItem::addToFolder(folder);
 	
     // Retrieve the folder (conversation) UUID, which is also the speaker session UUID
-    LLConversationItem* vmi = getParentFolder() ? dynamic_cast<LLConversationItem*>(getParentFolder()->getViewModelItem()) : NULL;
-    if (vmi)
+    LLFolderViewFolder *prnt = getParentFolder();
+    if (prnt)
     {
-		addToSession(vmi->getUUID());
+        LLConversationItem* vmi = dynamic_cast<LLConversationItem*>(prnt->getViewModelItem());
+        if (vmi)
+        {
+            addToSession(vmi->getUUID());
+        }
+        LLConversationViewSession* session = dynamic_cast<LLConversationViewSession*>(prnt);
+        if (session)
+        {
+            allowSpeakingIndicator(session->isInActiveVoiceChannel());
+        }
     }
 }
 
@@ -763,9 +772,9 @@ LLView* LLConversationViewParticipant::getItemChildView(EAvatarListItemChildInde
     return child_view;
 }
 
-void LLConversationViewParticipant::hideSpeakingIndicator()
+void LLConversationViewParticipant::allowSpeakingIndicator(bool val)
 {
-	mSpeakingIndicator->setVisible(false);
+	mSpeakingIndicator->setIsActiveChannel(val);
 }
 
 // EOF
diff --git a/indra/newview/llconversationview.h b/indra/newview/llconversationview.h
index 06ffb517bb..420c250dfe 100644
--- a/indra/newview/llconversationview.h
+++ b/indra/newview/llconversationview.h
@@ -90,6 +90,7 @@ public:
 	void setHighlightState(bool hihglight_state);
 
 	LLFloater* getSessionFloater();
+	bool isInActiveVoiceChannel() { return mIsInActiveVoiceChannel; }
 
 private:
 
@@ -145,7 +146,7 @@ public:
 
     /*virtual*/ S32 getLabelXPos();
     /*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask );
-	void hideSpeakingIndicator();
+	void allowSpeakingIndicator(bool val);
 
 protected:
 	friend class LLUICtrlFactory;
diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp
index c5e4593b79..a873ccf98b 100644
--- a/indra/newview/lloutputmonitorctrl.cpp
+++ b/indra/newview/lloutputmonitorctrl.cpp
@@ -74,6 +74,7 @@ LLOutputMonitorCtrl::LLOutputMonitorCtrl(const LLOutputMonitorCtrl::Params& p)
 	mSpeakerId(p.speaker_id),
 	mIsModeratorMuted(false),
 	mIsAgentControl(false),
+	mIsActiveChannel(false),
 	mIndicatorToggled(false),
 	mShowParticipantsSpeaking(false)
 {
@@ -256,6 +257,16 @@ BOOL LLOutputMonitorCtrl::handleMouseUp(S32 x, S32 y, MASK mask)
 	return TRUE;
 }
 
+void LLOutputMonitorCtrl::setIsActiveChannel(bool val)
+{
+    mIsActiveChannel = val;
+    if (!val)
+    {
+        // switchIndicator will set it to TRUE when channel becomes active
+        setVisible(FALSE);
+    }
+}
+
 void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id, const LLUUID& session_id/* = LLUUID::null*/, bool show_other_participants_speaking /* = false */)
 {
 	if (speaker_id.isNull() && mSpeakerId.notNull())
@@ -305,8 +316,7 @@ void LLOutputMonitorCtrl::onChange()
 // virtual
 void LLOutputMonitorCtrl::switchIndicator(bool switch_on)
 {
-
-    if(getVisible() != (BOOL)switch_on)
+    if (mIsActiveChannel && getVisible() != (BOOL)switch_on)
     {
         setVisible(switch_on);
         
diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h
index af52a81b04..307cd30ab3 100644
--- a/indra/newview/lloutputmonitorctrl.h
+++ b/indra/newview/lloutputmonitorctrl.h
@@ -79,9 +79,11 @@ public:
 	// For the current user, need to know the PTT state to show
 	// correct button image.
 	void			setIsAgentControl(bool val) { mIsAgentControl = val; }
-
 	void			setIsTalking(bool val) { mIsTalking = val; }
 
+	// switchIndicator controls visibility, 'active channel' governs if we are allowed to show indicator
+	void			setIsActiveChannel(bool val);
+
 	void			setShowParticipantsSpeaking(bool show) { mShowParticipantsSpeaking = show; }
 
 	/**
@@ -137,6 +139,7 @@ private:
 	bool			mIsModeratorMuted;
 	bool			mIsMuted;
 	bool			mIsTalking;
+	bool			mIsActiveChannel;
 	bool			mShowParticipantsSpeaking;
 	LLPointer<LLUIImage> mImageMute;
 	LLPointer<LLUIImage> mImageOff;
-- 
cgit v1.2.3


From 478e4f39d8970a73ffe8bde0d8ec2d870eb9796b Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Mon, 4 Mar 2019 14:59:33 +0200
Subject: Fix for local studio builds

---
 indra/cmake/00-Common.cmake  |  2 ++
 indra/newview/CMakeLists.txt | 15 +++++++++++++++
 2 files changed, 17 insertions(+)

diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index 40fc706a99..a421616710 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -45,6 +45,8 @@ endif()
 # Don't bother with a MinSizeRel build.
 set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Release;Debug" CACHE STRING
     "Supported build types." FORCE)
+	
+set(UNATTENDED ON CACHE BOOL �On Windows, turn this OFF to implicitly run VSTool.exe after configure.�)
 
 
 # Platform-specific compilation flags.
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index b5fcb18cfc..37da7f2c2a 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1877,6 +1877,21 @@ if (WINDOWS)
       windows-crash-logger
     )
 
+    # sets the 'working directory' for debugging from visual studio.
+    if ((NOT UNATTENDED) AND (NOT DEFINED ENV{TEAMCITY_PROJECT_NAME}))
+        add_custom_command(
+            TARGET ${VIEWER_BINARY_NAME} POST_BUILD
+            COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
+            ARGS
+              --solution
+              ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln
+              --workingdir
+              ${VIEWER_BINARY_NAME}
+              "${CMAKE_CURRENT_SOURCE_DIR}"
+            COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging."
+            )
+    endif ((NOT UNATTENDED) AND (NOT DEFINED ENV{TEAMCITY_PROJECT_NAME}))
+
     if (PACKAGE)
       add_custom_command(
         OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2
-- 
cgit v1.2.3


From 181e66fc12f874c3297ed777ab9d197098941c34 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Wed, 6 Mar 2019 16:31:11 +0200
Subject: Get rid of vstool

---
 indra/cmake/00-Common.cmake  |  2 --
 indra/newview/CMakeLists.txt | 20 +++++++-------------
 2 files changed, 7 insertions(+), 15 deletions(-)

diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index a421616710..40fc706a99 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -45,8 +45,6 @@ endif()
 # Don't bother with a MinSizeRel build.
 set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Release;Debug" CACHE STRING
     "Supported build types." FORCE)
-	
-set(UNATTENDED ON CACHE BOOL �On Windows, turn this OFF to implicitly run VSTool.exe after configure.�)
 
 
 # Platform-specific compilation flags.
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 37da7f2c2a..a7e8db1b1c 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1878,19 +1878,13 @@ if (WINDOWS)
     )
 
     # sets the 'working directory' for debugging from visual studio.
-    if ((NOT UNATTENDED) AND (NOT DEFINED ENV{TEAMCITY_PROJECT_NAME}))
-        add_custom_command(
-            TARGET ${VIEWER_BINARY_NAME} POST_BUILD
-            COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
-            ARGS
-              --solution
-              ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln
-              --workingdir
-              ${VIEWER_BINARY_NAME}
-              "${CMAKE_CURRENT_SOURCE_DIR}"
-            COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging."
-            )
-    endif ((NOT UNATTENDED) AND (NOT DEFINED ENV{TEAMCITY_PROJECT_NAME}))
+    # Condition for version can be moved to requirements once build agents will be updated (see TOOL-3865)
+    if ((NOT UNATTENDED) AND (${CMAKE_VERSION} VERSION_GREATER "3.7.2"))
+        set_property(
+          TARGET ${VIEWER_BINARY_NAME}
+          PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+          )
+    endif ((NOT UNATTENDED) AND (${CMAKE_VERSION} VERSION_GREATER "3.7.2"))
 
     if (PACKAGE)
       add_custom_command(
-- 
cgit v1.2.3


From 4e73121719511e584ab615dc9c5f672704d0cdb7 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Mon, 4 Mar 2019 20:24:00 +0000
Subject: Don't create updater when running under debugger.

---
 indra/newview/llappviewer.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index b7e2f17c46..c308663a62 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1160,7 +1160,10 @@ bool LLAppViewer::init()
 	updater.args.add(stringize(gSavedSettings.getU32("ForceAddressSize")));
 
 	// Run the updater. An exception from launching the updater should bother us.
-	LLLeap::create(updater, true);
+	if (!beingDebugged())
+	{
+		LLLeap::create(updater, true);
+	}
 
 	// Iterate over --leap command-line options. But this is a bit tricky: if
 	// there's only one, it won't be an array at all.
-- 
cgit v1.2.3


From e4b499e64d63dbcdb97590f86d533f6877690b84 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Fri, 22 Mar 2019 17:31:26 +0200
Subject: SL-10780 FIXED Speaker icon is shown for all friends

---
 indra/newview/llavatarlistitem.cpp    |  1 +
 indra/newview/lloutputmonitorctrl.cpp | 15 ++++++++++-----
 indra/newview/lloutputmonitorctrl.h   | 11 ++++++++++-
 3 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index af3fac91bc..396b69ae3a 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -119,6 +119,7 @@ BOOL  LLAvatarListItem::postBuild()
 	mIconPermissionEditTheirs->setVisible(false);
 
 	mSpeakingIndicator = getChild<LLOutputMonitorCtrl>("speaking_indicator");
+	mSpeakingIndicator->setChannelState(LLOutputMonitorCtrl::UNDEFINED_CHANNEL);
 	mInfoBtn = getChild<LLButton>("info_btn");
 	mProfileBtn = getChild<LLButton>("profile_btn");
 
diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp
index a873ccf98b..7f6c065bb9 100644
--- a/indra/newview/lloutputmonitorctrl.cpp
+++ b/indra/newview/lloutputmonitorctrl.cpp
@@ -74,9 +74,9 @@ LLOutputMonitorCtrl::LLOutputMonitorCtrl(const LLOutputMonitorCtrl::Params& p)
 	mSpeakerId(p.speaker_id),
 	mIsModeratorMuted(false),
 	mIsAgentControl(false),
-	mIsActiveChannel(false),
 	mIndicatorToggled(false),
-	mShowParticipantsSpeaking(false)
+	mShowParticipantsSpeaking(false),
+	mChannelState(INACTIVE_CHANNEL)
 {
 	//static LLUIColor output_monitor_muted_color = LLUIColorTable::instance().getColor("OutputMonitorMutedColor", LLColor4::orange);
 	//static LLUIColor output_monitor_overdriven_color = LLUIColorTable::instance().getColor("OutputMonitorOverdrivenColor", LLColor4::red);
@@ -259,8 +259,13 @@ BOOL LLOutputMonitorCtrl::handleMouseUp(S32 x, S32 y, MASK mask)
 
 void LLOutputMonitorCtrl::setIsActiveChannel(bool val)
 {
-    mIsActiveChannel = val;
-    if (!val)
+    setChannelState(val ? ACTIVE_CHANNEL : INACTIVE_CHANNEL);
+}
+
+void LLOutputMonitorCtrl::setChannelState(EChannelState state)
+{
+    mChannelState = state;
+    if (state == INACTIVE_CHANNEL)
     {
         // switchIndicator will set it to TRUE when channel becomes active
         setVisible(FALSE);
@@ -316,7 +321,7 @@ void LLOutputMonitorCtrl::onChange()
 // virtual
 void LLOutputMonitorCtrl::switchIndicator(bool switch_on)
 {
-    if (mIsActiveChannel && getVisible() != (BOOL)switch_on)
+    if ((mChannelState != INACTIVE_CHANNEL) && (getVisible() != (BOOL)switch_on))
     {
         setVisible(switch_on);
         
diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h
index 307cd30ab3..98966d39ee 100644
--- a/indra/newview/lloutputmonitorctrl.h
+++ b/indra/newview/lloutputmonitorctrl.h
@@ -81,8 +81,16 @@ public:
 	void			setIsAgentControl(bool val) { mIsAgentControl = val; }
 	void			setIsTalking(bool val) { mIsTalking = val; }
 
+	enum EChannelState
+	{
+		ACTIVE_CHANNEL,
+		INACTIVE_CHANNEL,
+		UNDEFINED_CHANNEL
+	};
+
 	// switchIndicator controls visibility, 'active channel' governs if we are allowed to show indicator
 	void			setIsActiveChannel(bool val);
+	void			setChannelState(EChannelState state);
 
 	void			setShowParticipantsSpeaking(bool show) { mShowParticipantsSpeaking = show; }
 
@@ -139,7 +147,6 @@ private:
 	bool			mIsModeratorMuted;
 	bool			mIsMuted;
 	bool			mIsTalking;
-	bool			mIsActiveChannel;
 	bool			mShowParticipantsSpeaking;
 	LLPointer<LLUIImage> mImageMute;
 	LLPointer<LLUIImage> mImageOff;
@@ -155,6 +162,8 @@ private:
 	LLUUID			mSpeakerId;
 
     bool mIndicatorToggled;
+
+    EChannelState	mChannelState;
 };
 
 #endif
-- 
cgit v1.2.3


From b6301eba2cc8a3eaa1b9bf7c9d28459f875f9a9b Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Fri, 5 Apr 2019 21:19:20 +0300
Subject: SL-10891 Removed scaling to system UI size on Windows

---
 indra/newview/llviewerwindow.cpp | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index cc10d08f3a..339eb72b7e 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1765,7 +1765,10 @@ LLViewerWindow::LLViewerWindow(const Params& p)
 
 	// Get the real window rect the window was created with (since there are various OS-dependent reasons why
 	// the size of a window or fullscreen context may have been adjusted slightly...)
-	F32 ui_scale_factor = llclamp(gSavedSettings.getF32("UIScaleFactor"), MIN_UI_SCALE, MAX_UI_SCALE) * mWindow->getSystemUISize();
+    F32 ui_scale_factor = llclamp(gSavedSettings.getF32("UIScaleFactor"), MIN_UI_SCALE, MAX_UI_SCALE);
+#if LL_DARWIN
+    ui_scale_factor *= mWindow->getSystemUISize();
+#endif
 	
 	mDisplayScale.setVec(llmax(1.f / mWindow->getPixelAspectRatio(), 1.f), llmax(mWindow->getPixelAspectRatio(), 1.f));
 	mDisplayScale *= ui_scale_factor;
@@ -5338,7 +5341,11 @@ F32	LLViewerWindow::getWorldViewAspectRatio() const
 
 void LLViewerWindow::calcDisplayScale()
 {
-	F32 ui_scale_factor = llclamp(gSavedSettings.getF32("UIScaleFactor"), MIN_UI_SCALE, MAX_UI_SCALE) * mWindow->getSystemUISize();
+    F32 ui_scale_factor = llclamp(gSavedSettings.getF32("UIScaleFactor"), MIN_UI_SCALE, MAX_UI_SCALE);
+#if LL_DARWIN
+    ui_scale_factor *= mWindow->getSystemUISize();
+#endif
+
 	LLVector2 display_scale;
 	display_scale.setVec(llmax(1.f / mWindow->getPixelAspectRatio(), 1.f), llmax(mWindow->getPixelAspectRatio(), 1.f));
 	display_scale *= ui_scale_factor;
-- 
cgit v1.2.3


From 3c91eac8ee4f859e907dba86fd1d89fc9cd1cddc Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Sat, 6 Apr 2019 09:59:10 +0300
Subject: Backed out changeset: a2983d6277f2

---
 indra/newview/llviewerwindow.cpp | 11 ++---------
 1 file changed, 2 insertions(+), 9 deletions(-)

diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 339eb72b7e..cc10d08f3a 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1765,10 +1765,7 @@ LLViewerWindow::LLViewerWindow(const Params& p)
 
 	// Get the real window rect the window was created with (since there are various OS-dependent reasons why
 	// the size of a window or fullscreen context may have been adjusted slightly...)
-    F32 ui_scale_factor = llclamp(gSavedSettings.getF32("UIScaleFactor"), MIN_UI_SCALE, MAX_UI_SCALE);
-#if LL_DARWIN
-    ui_scale_factor *= mWindow->getSystemUISize();
-#endif
+	F32 ui_scale_factor = llclamp(gSavedSettings.getF32("UIScaleFactor"), MIN_UI_SCALE, MAX_UI_SCALE) * mWindow->getSystemUISize();
 	
 	mDisplayScale.setVec(llmax(1.f / mWindow->getPixelAspectRatio(), 1.f), llmax(mWindow->getPixelAspectRatio(), 1.f));
 	mDisplayScale *= ui_scale_factor;
@@ -5341,11 +5338,7 @@ F32	LLViewerWindow::getWorldViewAspectRatio() const
 
 void LLViewerWindow::calcDisplayScale()
 {
-    F32 ui_scale_factor = llclamp(gSavedSettings.getF32("UIScaleFactor"), MIN_UI_SCALE, MAX_UI_SCALE);
-#if LL_DARWIN
-    ui_scale_factor *= mWindow->getSystemUISize();
-#endif
-
+	F32 ui_scale_factor = llclamp(gSavedSettings.getF32("UIScaleFactor"), MIN_UI_SCALE, MAX_UI_SCALE) * mWindow->getSystemUISize();
 	LLVector2 display_scale;
 	display_scale.setVec(llmax(1.f / mWindow->getPixelAspectRatio(), 1.f), llmax(mWindow->getPixelAspectRatio(), 1.f));
 	display_scale *= ui_scale_factor;
-- 
cgit v1.2.3


From 457df9cd6724c23fff9a88fb7db44b6b04a7769c Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Sat, 6 Apr 2019 10:12:27 +0300
Subject: SL-10891 Reset UI scale factor on first run if OS's display scaling
 is not 100%

---
 doc/contributions.txt                   |  1 +
 indra/newview/app_settings/settings.xml | 13 +++++++++++++
 indra/newview/llviewerwindow.cpp        | 10 ++++++++++
 3 files changed, 24 insertions(+)

diff --git a/doc/contributions.txt b/doc/contributions.txt
index 24909e6c40..a73bd10295 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -222,6 +222,7 @@ Ansariel Hiller
 	MAINT-8085
 	MAINT-8723
 	SL-10385
+	SL-10891
 Aralara Rajal
 Arare Chantilly
 	CHUIBUG-191
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 09d7845567..916781e85b 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -16310,6 +16310,19 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>ResetUIScaleOnFirstRun</key>
+    <map>
+      <key>Comment</key>
+      <string>Resets the UI scale factor on first run due to changed display scaling behavior</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+      <key>Backup</key>
+      <integer>0</integer>        
+    </map>
 </map>
 </llsd>
 
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index cc10d08f3a..bc4a78e143 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1763,6 +1763,16 @@ LLViewerWindow::LLViewerWindow(const Params& p)
 	LLCoordScreen scr;
     mWindow->getSize(&scr);
 
+    // Reset UI scale factor on first run if OS's display scaling is not 100%
+    if (gSavedSettings.getBOOL("FSResetUIScaleOnFirstRun"))
+    {
+        if (mWindow->getSystemUISize() != 1.f)
+        {
+            gSavedSettings.setF32("UIScaleFactor", 1.f);
+        }
+        gSavedSettings.setBOOL("ResetUIScaleOnFirstRun", FALSE);
+    }
+
 	// Get the real window rect the window was created with (since there are various OS-dependent reasons why
 	// the size of a window or fullscreen context may have been adjusted slightly...)
 	F32 ui_scale_factor = llclamp(gSavedSettings.getF32("UIScaleFactor"), MIN_UI_SCALE, MAX_UI_SCALE) * mWindow->getSystemUISize();
-- 
cgit v1.2.3


From df8bd0c24fba337d0448844b2106eeff3b387ef1 Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Sat, 6 Apr 2019 11:59:18 +0300
Subject: SL-10891 residues

---
 indra/newview/app_settings/settings.xml | 4 +---
 indra/newview/llviewerwindow.cpp        | 2 +-
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 916781e85b..49601ae98f 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -16319,9 +16319,7 @@
       <key>Type</key>
       <string>Boolean</string>
       <key>Value</key>
-      <integer>1</integer>
-      <key>Backup</key>
-      <integer>0</integer>        
+      <integer>1</integer>        
     </map>
 </map>
 </llsd>
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index bc4a78e143..5b764f97fb 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1764,7 +1764,7 @@ LLViewerWindow::LLViewerWindow(const Params& p)
     mWindow->getSize(&scr);
 
     // Reset UI scale factor on first run if OS's display scaling is not 100%
-    if (gSavedSettings.getBOOL("FSResetUIScaleOnFirstRun"))
+    if (gSavedSettings.getBOOL("ResetUIScaleOnFirstRun"))
     {
         if (mWindow->getSystemUISize() != 1.f)
         {
-- 
cgit v1.2.3


From 6b2a1762e101b591cb0da619c7dfb709661212b0 Mon Sep 17 00:00:00 2001
From: eli <eli@lindenlab.com>
Date: Mon, 15 Apr 2019 12:09:30 -0700
Subject: FIX INTL-336 Viewer translation for 9 languages (Set 56) for
 viewer-bear

---
 .../skins/default/xui/de/floater_bulk_perms.xml    |  10 +-
 .../skins/default/xui/de/floater_my_scripts.xml    |   2 +
 .../skins/default/xui/de/floater_preferences.xml   |   3 +
 .../newview/skins/default/xui/de/floater_tools.xml |  20 +--
 .../skins/default/xui/de/floater_top_objects.xml   |   2 +-
 indra/newview/skins/default/xui/de/menu_viewer.xml |   1 +
 .../newview/skins/default/xui/de/notifications.xml |  27 ++--
 .../skins/default/xui/de/panel_status_bar.xml      |  27 +++-
 .../skins/default/xui/de/sidepanel_item_info.xml   |  16 ++-
 .../skins/default/xui/de/sidepanel_task_info.xml   | 150 +++++++++++++++------
 indra/newview/skins/default/xui/de/strings.xml     |   4 +-
 .../skins/default/xui/es/floater_bulk_perms.xml    |  10 +-
 .../skins/default/xui/es/floater_my_scripts.xml    |   2 +
 .../skins/default/xui/es/floater_preferences.xml   |   3 +
 .../newview/skins/default/xui/es/floater_tools.xml |  20 +--
 .../skins/default/xui/es/floater_top_objects.xml   |   2 +-
 indra/newview/skins/default/xui/es/menu_viewer.xml |   1 +
 .../newview/skins/default/xui/es/notifications.xml |  27 ++--
 .../skins/default/xui/es/panel_status_bar.xml      |  27 +++-
 .../skins/default/xui/es/sidepanel_item_info.xml   |  16 ++-
 .../skins/default/xui/es/sidepanel_task_info.xml   | 150 +++++++++++++++------
 indra/newview/skins/default/xui/es/strings.xml     |  10 +-
 .../skins/default/xui/fr/floater_bulk_perms.xml    |  10 +-
 .../skins/default/xui/fr/floater_my_scripts.xml    |   2 +
 .../skins/default/xui/fr/floater_preferences.xml   |   3 +
 .../newview/skins/default/xui/fr/floater_tools.xml |  20 +--
 .../skins/default/xui/fr/floater_top_objects.xml   |   2 +-
 indra/newview/skins/default/xui/fr/menu_viewer.xml |   1 +
 .../newview/skins/default/xui/fr/notifications.xml |  27 ++--
 .../skins/default/xui/fr/panel_status_bar.xml      |  27 +++-
 .../skins/default/xui/fr/sidepanel_item_info.xml   |  14 +-
 .../skins/default/xui/fr/sidepanel_task_info.xml   | 150 +++++++++++++++------
 indra/newview/skins/default/xui/fr/strings.xml     |   6 +-
 .../skins/default/xui/it/floater_bulk_perms.xml    |  10 +-
 .../skins/default/xui/it/floater_my_scripts.xml    |   2 +
 .../skins/default/xui/it/floater_preferences.xml   |   3 +
 .../newview/skins/default/xui/it/floater_tools.xml |  20 +--
 .../skins/default/xui/it/floater_top_objects.xml   |   2 +-
 indra/newview/skins/default/xui/it/menu_viewer.xml |   1 +
 .../newview/skins/default/xui/it/notifications.xml |  27 ++--
 .../skins/default/xui/it/panel_status_bar.xml      |  27 +++-
 .../skins/default/xui/it/sidepanel_item_info.xml   |  16 ++-
 .../skins/default/xui/it/sidepanel_task_info.xml   | 150 +++++++++++++++------
 indra/newview/skins/default/xui/it/strings.xml     |   6 +-
 .../skins/default/xui/ja/floater_bulk_perms.xml    |  10 +-
 .../skins/default/xui/ja/floater_my_scripts.xml    |   2 +
 .../skins/default/xui/ja/floater_preferences.xml   |   3 +
 .../newview/skins/default/xui/ja/floater_tools.xml |  20 +--
 .../skins/default/xui/ja/floater_top_objects.xml   |   2 +-
 indra/newview/skins/default/xui/ja/menu_viewer.xml |   1 +
 .../newview/skins/default/xui/ja/notifications.xml |  27 ++--
 .../skins/default/xui/ja/panel_status_bar.xml      |  27 +++-
 .../skins/default/xui/ja/sidepanel_item_info.xml   |  16 ++-
 .../skins/default/xui/ja/sidepanel_task_info.xml   | 150 +++++++++++++++------
 indra/newview/skins/default/xui/ja/strings.xml     |  10 +-
 .../skins/default/xui/pt/floater_bulk_perms.xml    |   8 +-
 .../skins/default/xui/pt/floater_my_scripts.xml    |   2 +
 .../skins/default/xui/pt/floater_preferences.xml   |   3 +
 .../newview/skins/default/xui/pt/floater_tools.xml |  18 +--
 .../skins/default/xui/pt/floater_top_objects.xml   |   2 +-
 indra/newview/skins/default/xui/pt/menu_viewer.xml |   1 +
 .../newview/skins/default/xui/pt/notifications.xml |  27 ++--
 .../skins/default/xui/pt/panel_status_bar.xml      |  27 +++-
 .../skins/default/xui/pt/sidepanel_item_info.xml   |  14 +-
 .../skins/default/xui/pt/sidepanel_task_info.xml   | 150 +++++++++++++++------
 indra/newview/skins/default/xui/pt/strings.xml     |   6 +-
 .../skins/default/xui/ru/floater_bulk_perms.xml    |  10 +-
 .../skins/default/xui/ru/floater_my_scripts.xml    |   2 +
 .../skins/default/xui/ru/floater_preferences.xml   |   3 +
 .../newview/skins/default/xui/ru/floater_tools.xml |  20 +--
 .../skins/default/xui/ru/floater_top_objects.xml   |   2 +-
 indra/newview/skins/default/xui/ru/menu_viewer.xml |   1 +
 .../newview/skins/default/xui/ru/notifications.xml |  27 ++--
 .../skins/default/xui/ru/panel_status_bar.xml      |  27 +++-
 .../skins/default/xui/ru/sidepanel_item_info.xml   |  16 ++-
 .../skins/default/xui/ru/sidepanel_task_info.xml   | 150 +++++++++++++++------
 indra/newview/skins/default/xui/ru/strings.xml     |   4 +-
 .../skins/default/xui/tr/floater_bulk_perms.xml    |  10 +-
 .../skins/default/xui/tr/floater_my_scripts.xml    |   2 +
 .../skins/default/xui/tr/floater_preferences.xml   |   3 +
 .../newview/skins/default/xui/tr/floater_tools.xml |  20 +--
 .../skins/default/xui/tr/floater_top_objects.xml   |   2 +-
 indra/newview/skins/default/xui/tr/menu_viewer.xml |   1 +
 .../newview/skins/default/xui/tr/notifications.xml |  27 ++--
 .../skins/default/xui/tr/panel_status_bar.xml      |  27 +++-
 .../skins/default/xui/tr/sidepanel_item_info.xml   |  16 ++-
 .../skins/default/xui/tr/sidepanel_task_info.xml   | 150 +++++++++++++++------
 indra/newview/skins/default/xui/tr/strings.xml     |  10 +-
 .../skins/default/xui/zh/floater_bulk_perms.xml    |  10 +-
 .../skins/default/xui/zh/floater_my_scripts.xml    |   2 +
 .../skins/default/xui/zh/floater_preferences.xml   |   3 +
 .../newview/skins/default/xui/zh/floater_tools.xml |  20 +--
 .../skins/default/xui/zh/floater_top_objects.xml   |   2 +-
 indra/newview/skins/default/xui/zh/menu_viewer.xml |   1 +
 .../newview/skins/default/xui/zh/notifications.xml |  25 ++--
 .../skins/default/xui/zh/panel_status_bar.xml      |  27 +++-
 .../skins/default/xui/zh/sidepanel_item_info.xml   |  16 ++-
 .../skins/default/xui/zh/sidepanel_task_info.xml   | 150 +++++++++++++++------
 indra/newview/skins/default/xui/zh/strings.xml     |   4 +-
 99 files changed, 1617 insertions(+), 755 deletions(-)
 create mode 100644 indra/newview/skins/default/xui/de/floater_my_scripts.xml
 create mode 100644 indra/newview/skins/default/xui/es/floater_my_scripts.xml
 create mode 100644 indra/newview/skins/default/xui/fr/floater_my_scripts.xml
 create mode 100644 indra/newview/skins/default/xui/it/floater_my_scripts.xml
 create mode 100644 indra/newview/skins/default/xui/ja/floater_my_scripts.xml
 create mode 100644 indra/newview/skins/default/xui/pt/floater_my_scripts.xml
 create mode 100644 indra/newview/skins/default/xui/ru/floater_my_scripts.xml
 create mode 100644 indra/newview/skins/default/xui/tr/floater_my_scripts.xml
 create mode 100644 indra/newview/skins/default/xui/zh/floater_my_scripts.xml

diff --git a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml
index 27a74c874e..9454933264 100644
--- a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml
@@ -38,17 +38,17 @@
 	<text name="GroupLabel">
 		Gruppe:
 	</text>
-	<check_box label="Teilen" name="share_with_group"/>
+	<check_box label="Teilen" name="share_with_group" tool_tip="Erlauben Sie allen Mitgliedern der zugeordneten Gruppe, Ihre Änderungsberechtigungen für dieses Objekt zu teilen. Sie müssen eine Übereignung durchführen, um Rollenbeschränkungen zu aktivieren."/>
 	<text name="AnyoneLabel">
 		Jeder:
 	</text>
-	<check_box label="Kopieren" name="everyone_copy"/>
+	<check_box label="Kopieren" name="everyone_copy" tool_tip="Jeder Benutzer kann eine Kopie des Objekts erhalten. Das Objekt sowie alle seine Inhalte müssen kopier- und übertragbar sein."/>
 	<text name="NextOwnerLabel">
 		Nächster Eigentümer:
 	</text>
-	<check_box label="Bearbeiten" name="next_owner_modify"/>
-	<check_box label="Kopieren" name="next_owner_copy"/>
-	<check_box initial_value="true" label="Transferieren" name="next_owner_transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/>
+	<check_box label="Bearbeiten" name="next_owner_modify" tool_tip="Der nächste Eigentümer kann Eigenschaften wie den Artikelnamen oder den Maßstab dieses Objekts bearbeiten."/>
+	<check_box label="Kopieren" name="next_owner_copy" tool_tip="Der nächste Eigentümer kann unbegrenzt viele Kopien dieses Objekts erstellen. Die Kopien enthalten Informationen zum Ersteller und können niemals mehr Berechtigungen enthalten als der kopierte Artikel."/>
+	<check_box initial_value="true" label="Transferieren" name="next_owner_transfer" tool_tip="Der nächste Eigentümer kann dieses Objekt weitergeben oder verkaufen."/>
 	<button label="OK" name="ok"/>
 	<button label="Anwenden" name="apply"/>
 	<button label="Abbrechen" name="close"/>
diff --git a/indra/newview/skins/default/xui/de/floater_my_scripts.xml b/indra/newview/skins/default/xui/de/floater_my_scripts.xml
new file mode 100644
index 0000000000..b4c2ba8b63
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_my_scripts.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="myscripts" title="Meine Skripte"/>
diff --git a/indra/newview/skins/default/xui/de/floater_preferences.xml b/indra/newview/skins/default/xui/de/floater_preferences.xml
index 159f65be30..623308f874 100644
--- a/indra/newview/skins/default/xui/de/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/de/floater_preferences.xml
@@ -5,6 +5,9 @@
 	</floater.string>
 	<button label="OK" label_selected="OK" name="OK"/>
 	<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
+	<panel name="search_panel">
+		<search_editor label="Sucheinstellungen" name="search_prefs_edit" tool_tip="Geben Sie hier den gewünschten Suchbegriff ein. Die Ergebnisse werden für teilweise Volltext-Treffer innerhalb des Einstellungsnamens oder Kommentars angezeigt."/>
+	</panel>
 	<tab_container name="pref core">
 		<panel label="Allgemein" name="general"/>
 		<panel label="Grafik" name="display"/>
diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml
index 563d179d4c..931c338d35 100644
--- a/indra/newview/skins/default/xui/de/floater_tools.xml
+++ b/indra/newview/skins/default/xui/de/floater_tools.xml
@@ -172,9 +172,11 @@
 			<text name="Name:">
 				Name:
 			</text>
+			<line_editor name="Object Name" tool_tip="Der Name ist auf 63 Zeichen begrenzt. Längere formelle Namen werden gekürzt. Die Namen dürfen ausschließlich aus druckbaren Zeichen des (nicht erweiterten) ASCII-7-Zeichensatzes bestehen, mit Ausnahme des Senkrechtstrichs &quot;|&quot;."/>
 			<text name="Description:">
 				Beschreibung:
 			</text>
+			<line_editor name="Object Description" tool_tip="Bei Auswahl der Option &quot;Mauszeiger-Tipps zu allen Objekten&quot; in den Viewer-Einstellungen wird für alle Objekte das Popup mit der Objektbeschreibung unter dem Mauszeiger eingeblendet. Die formelle Beschreibung ist auf 127 Byte begrenzt, und alle längeren Zeichenketten werden gekürzt."/>
 			<text name="Creator:">
 				Ersteller:
 			</text>
@@ -191,7 +193,7 @@
 			<text name="label click action">
 				Bei Linksklick:
 			</text>
-			<combo_box name="clickaction">
+			<combo_box name="clickaction" tool_tip="Eine Klickaktion ermöglicht Ihnen die Interaktion mit einem Objekt mithilfe eines einzelnen Linksklicks. Jede Klickaktion verfügt über einen speziellen Cursor, der die Aktion verdeutlicht. Für manche Klickaktionen müssen Anforderungen erfüllt sein, damit die Funktion gewährleistet ist. Für die Funktion Touch and Pay (Berühren und Bezahlen) sind Skripte erforderlich.">
 				<combo_box.item label="Berühren (Standard)" name="Touch/grab(default)"/>
 				<combo_box.item label="Auf Objekt sitzen" name="Sitonobject"/>
 				<combo_box.item label="Objekt kaufen" name="Buyobject"/>
@@ -199,9 +201,9 @@
 				<combo_box.item label="Öffnen" name="Open"/>
 				<combo_box.item label="Zoom" name="Zoom"/>
 			</combo_box>
-			<check_box label="Zum Verkauf:" name="checkbox for sale"/>
-			<spinner label="L$" name="Edit Cost"/>
-			<combo_box name="sale type">
+			<check_box label="Zum Verkauf:" name="checkbox for sale" tool_tip="Ermöglicht, dass Einwohner dieses Objekt, seine Inhalte oder eine Kopie zum angegebenen Preis inworld erwerben."/>
+			<spinner label="L$" name="Edit Cost" tool_tip="Objektkosten."/>
+			<combo_box name="sale type" tool_tip="Wählen Sie aus, ob der Käufer eine Kopie, eine Kopie der Inhalte oder den Artikel selbst erhält.">
 				<combo_box.item label="Kopie" name="Copy"/>
 				<combo_box.item label="Inhalt" name="Contents"/>
 				<combo_box.item label="Original" name="Original"/>
@@ -214,14 +216,14 @@
 				<text name="Anyone can:">
 					Jeder:
 				</text>
-				<check_box label="Bewegen" name="checkbox allow everyone move"/>
-				<check_box label="Kopieren" name="checkbox allow everyone copy"/>
+				<check_box label="Bewegen" name="checkbox allow everyone move" tool_tip="Jeder Benutzer kann das Objekt bewegen."/>
+				<check_box label="Kopieren" name="checkbox allow everyone copy" tool_tip="Jeder Benutzer kann eine Kopie des Objekts erhalten. Das Objekt sowie alle seine Inhalte müssen kopier- und übertragbar sein."/>
 				<text name="Next owner can:">
 					Nächster Eigentümer:
 				</text>
-				<check_box label="Ändern" name="checkbox next owner can modify"/>
-				<check_box label="Kopieren" name="checkbox next owner can copy"/>
-				<check_box label="Transferieren" name="checkbox next owner can transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/>
+				<check_box label="Ändern" name="checkbox next owner can modify" tool_tip="Der nächste Eigentümer kann Eigenschaften wie den Artikelnamen oder den Maßstab dieses Objekts bearbeiten."/>
+				<check_box label="Kopieren" name="checkbox next owner can copy" tool_tip="Der nächste Eigentümer kann unbegrenzt viele Kopien dieses Objekts erstellen. Die Kopien enthalten Informationen zum Ersteller und können niemals mehr Berechtigungen enthalten als der kopierte Artikel."/>
+				<check_box label="Transferieren" name="checkbox next owner can transfer" tool_tip="Der nächste Eigentümer kann dieses Objekt weitergeben oder verkaufen."/>
 				<text name="B:">
 					B:
 				</text>
diff --git a/indra/newview/skins/default/xui/de/floater_top_objects.xml b/indra/newview/skins/default/xui/de/floater_top_objects.xml
index d01b4640c2..7a8f57803a 100644
--- a/indra/newview/skins/default/xui/de/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/de/floater_top_objects.xml
@@ -4,7 +4,7 @@
 		Top-Skripts
 	</floater.string>
 	<floater.string name="top_scripts_text">
-		[COUNT] Skripts benötigen insgesamt [TIME] ms
+		[COUNT] Skripte benötigen insgesamt [TIME] ms und [MEMORY] KB
 	</floater.string>
 	<floater.string name="scripts_score_label">
 		Zeit
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index a71b9b8ef9..15e83de2d1 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -9,6 +9,7 @@
 		<menu_item_call label="Orte..." name="Places"/>
 		<menu_item_call label="Auswahlen..." name="Picks"/>
 		<menu_item_call label="Erlebnisse..." name="Experiences"/>
+		<menu_item_call label="Meine Skripte..." name="MyScripts"/>
 		<menu_item_call label="Kamerasteuerungen..." name="Camera Controls"/>
 		<menu label="Bewegung" name="Movement">
 			<menu_item_call label="Hinsetzen" name="Sit Down Here"/>
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index 3da2bb5c3c..f41fe3139b 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -1603,9 +1603,25 @@ Geben Sie das Objekt zum Verkauf frei und versuchen Sie es erneut.
 [DOWNLOAD_PATH].
 	</notification>
 	<notification name="RequiredUpdate">
-		Für die Anmeldung ist Version [VERSION] erforderlich. Diese sollte für Sie aktualisiert worden sein, was offenbar nicht geschehen ist. Bitte laden Sie die Datei unter https://secondlife.com/support/downloads/ herunter.
+		Für die Anmeldung ist Version [VERSION] erforderlich. 
+Bitte laden Sie die Datei unter https://secondlife.com/support/downloads/ herunter.
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
+	<notification name="PauseForUpdate">
+		Für die Anmeldung ist Version [VERSION] erforderlich. 
+Klicken Sie zum Herunterladen und Installieren auf OK.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="OptionalUpdateReady">
+		Version [VERSION] wurde heruntergeladen und ist bereit zur Installation. 
+Klicken Sie zur Installation auf OK.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="PromptOptionalUpdate">
+		Version [VERSION] wurde heruntergeladen und ist bereit zur Installation. 
+Fortfahren?
+		<usetemplate canceltext="Nicht jetzt" name="yesnocancelbuttons" notext="Überspringen" yestext="Installieren"/>
+	</notification>
 	<notification name="LoginFailedUnknown">
 		Die Anmeldung ist aus nicht bekannten Gründen leider fehlgeschlagen. Falls diese Meldung weiterhin angezeigt wird, besuchen Sie bitte die [SUPPORT_SITE].
 		<usetemplate name="okbutton" yestext="Beenden"/>
@@ -3067,15 +3083,6 @@ Gewähren Sie dem Objekt nur dann Zugriff, wenn Sie genau verstehen, wieso ein s
 			<button name="Deny" text="Verweigern"/>
 		</form>
 	</notification>
-	<notification name="UnknownScriptQuestion">
-		Die Runtime-Skript-Berechtigung, die von „&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;“ (Besitzer: „[NAME]“) angefordert wurde, wird vom Viewer nicht erkannt und kann nicht gewährt werden.
-
-Um diese Berechtigung zu gewähren, laden Sie die neueste Version des Viewers von [DOWNLOADURL] herunter.
-		<form name="form">
-			<button name="Deny" text="OK"/>
-			<button name="Mute" text="Blockieren"/>
-		</form>
-	</notification>
 	<notification name="ScriptDialog">
 		„&lt;nolink&gt;[TITLE]&lt;/nolink&gt;“ von [NAME]
 [MESSAGE]
diff --git a/indra/newview/skins/default/xui/de/panel_status_bar.xml b/indra/newview/skins/default/xui/de/panel_status_bar.xml
index b0cb1e0592..0829814220 100644
--- a/indra/newview/skins/default/xui/de/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/de/panel_status_bar.xml
@@ -1,16 +1,31 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="status">
-	<panel.string name="packet_loss_tooltip">Paketverlust</panel.string>
-	<panel.string name="bandwidth_tooltip">Bandbreite</panel.string>
-	<panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>
-	<panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>
-	<panel.string name="buycurrencylabel">[AMT] L$</panel.string>
+	<panel.string name="packet_loss_tooltip">
+		Paketverlust
+	</panel.string>
+	<panel.string name="bandwidth_tooltip">
+		Bandbreite
+	</panel.string>
+	<panel.string name="time">
+		[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+	</panel.string>
+	<panel.string name="timeTooltip">
+		[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+	</panel.string>
+	<panel.string name="buycurrencylabel">
+		[AMT] L$
+	</panel.string>
+	<panel name="menu_search_panel">
+		<search_editor label="Suchmenüs" name="search_menu_edit" tool_tip="Geben Sie hier den gewünschten Suchbegriff ein. Die Ergebnisse werden für teilweise Volltext-Treffer innerhalb des Menüs angezeigt."/>
+	</panel>
 	<panel left="-436" name="balance_bg" width="205">
 		<text name="balance" tool_tip="Klicken, um L$-Guthaben zu aktualisieren" value="L$ ??"/>
 		<button label="L$ kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/>
 		<button label="Einkaufen" name="goShop" tool_tip="Second Life-Marktplatz öffnen" width="85"/>
 	</panel>
-	<text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)">24:00 H PST</text>
+	<text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)">
+		24:00 H PST
+	</text>
 	<button name="media_toggle_btn" tool_tip="Alle Medien starten/stoppen (Musik, Video, Webseiten)"/>
 	<button name="volume_btn" tool_tip="Steuerung der Gesamtlautstärke"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml
index f7dc265cf4..168bb14248 100644
--- a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml
@@ -34,9 +34,11 @@
 			<text name="LabelItemNameTitle">
 				Name:
 			</text>
+			<line_editor name="LabelItemName" tool_tip="Der Name ist auf 63 Zeichen begrenzt. Längere formelle Namen werden gekürzt. Die Namen dürfen ausschließlich aus druckbaren Zeichen des (nicht erweiterten) ASCII-7-Zeichensatzes bestehen, mit Ausnahme des Senkrechtstrichs &quot;|&quot;."/>
 			<text name="LabelItemDescTitle">
 				Beschreibung:
 			</text>
+			<line_editor name="LabelItemDesc" tool_tip="Bei Auswahl der Option &quot;Mauszeiger-Tipps zu allen Objekten&quot; in den Viewer-Einstellungen wird für alle Objekte das Popup mit der Objektbeschreibung unter dem Mauszeiger eingeblendet. Die formelle Beschreibung ist auf 127 Byte begrenzt, und alle längeren Zeichenketten werden gekürzt."/>
 			<text name="LabelCreatorTitle">
 				Ersteller:
 			</text>
@@ -59,7 +61,7 @@
 				<text name="AnyoneLabel">
 					Jeder:
 				</text>
-				<check_box label="Kopieren" name="CheckEveryoneCopy"/>
+				<check_box label="Kopieren" name="CheckEveryoneCopy" tool_tip="Jeder Benutzer kann eine Kopie des Objekts erhalten. Das Objekt sowie alle seine Inhalte müssen kopier- und übertragbar sein."/>
 				<text name="GroupLabel">
 					Gruppe:
 				</text>
@@ -67,17 +69,17 @@
 				<text name="NextOwnerLabel">
 					Nächster Eigentümer:
 				</text>
-				<check_box label="Bearbeiten" name="CheckNextOwnerModify"/>
-				<check_box label="Kopieren" name="CheckNextOwnerCopy"/>
-				<check_box label="Übertragen" name="CheckNextOwnerTransfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/>
+				<check_box label="Bearbeiten" name="CheckNextOwnerModify" tool_tip="Der nächste Eigentümer kann Eigenschaften wie den Artikelnamen oder den Maßstab dieses Objekts bearbeiten."/>
+				<check_box label="Kopieren" name="CheckNextOwnerCopy" tool_tip="Der nächste Eigentümer kann unbegrenzt viele Kopien dieses Objekts erstellen. Die Kopien enthalten Informationen zum Ersteller und können niemals mehr Berechtigungen enthalten als der kopierte Artikel."/>
+				<check_box label="Übertragen" name="CheckNextOwnerTransfer" tool_tip="Der nächste Eigentümer kann dieses Objekt weitergeben oder verkaufen."/>
 			</panel>
-			<check_box label="Zum Verkauf" name="CheckPurchase"/>
-			<combo_box name="ComboBoxSaleType">
+			<check_box label="Zum Verkauf" name="CheckPurchase" tool_tip="Ermöglicht, dass Einwohner dieses Objekt, seine Inhalte oder eine Kopie zum angegebenen Preis inworld erwerben."/>
+			<combo_box name="ComboBoxSaleType" tool_tip="Wählen Sie aus, ob der Käufer eine Kopie, eine Kopie der Inhalte oder den Artikel selbst erhält.">
 				<combo_box.item label="Kopie" name="Copy"/>
 				<combo_box.item label="Inhalt" name="Contents"/>
 				<combo_box.item label="Original" name="Original"/>
 			</combo_box>
-			<spinner label="Preis: L$" name="Edit Cost"/>
+			<spinner label="Preis: L$" name="Edit Cost" tool_tip="Objektkosten."/>
 		</panel>
 	</scroll_container>
 	<panel name="button_panel">
diff --git a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml
index c30611c66c..1a3cd083f5 100644
--- a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml
@@ -1,32 +1,74 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="object properties" title="Objektprofil">
-	<panel.string name="text deed continued">Übertragung</panel.string>
-	<panel.string name="text deed">Übertragung</panel.string>
-	<panel.string name="text modify info 1">Sie können dieses Objekt bearbeiten.</panel.string>
-	<panel.string name="text modify info 2">Sie können diese Objekte bearbeiten.</panel.string>
-	<panel.string name="text modify info 3">Sie können dieses Objekt nicht bearbeiten.</panel.string>
-	<panel.string name="text modify info 4">Sie können diese Objekte nicht bearbeiten.</panel.string>
-	<panel.string name="text modify info 5">Dieses Objekt kann nicht über eine Regionsgrenze hinweg geändert werden</panel.string>
-	<panel.string name="text modify info 6">Diese Objekte können nicht über eine Regionsgrenze hinweg geändert werden</panel.string>
-	<panel.string name="text modify warning">Diese Objekt verfügt über verknüpfte Teile</panel.string>
-	<panel.string name="Cost Default">Preis: L$</panel.string>
-	<panel.string name="Cost Total">Summenpreis: L$</panel.string>
-	<panel.string name="Cost Per Unit">Stückpreis: L$</panel.string>
-	<panel.string name="Cost Mixed">Mischpreis</panel.string>
-	<panel.string name="Sale Mixed">Mischverkauf</panel.string>
+	<panel.string name="text deed continued">
+		Übertragung
+	</panel.string>
+	<panel.string name="text deed">
+		Übertragung
+	</panel.string>
+	<panel.string name="text modify info 1">
+		Sie können dieses Objekt bearbeiten.
+	</panel.string>
+	<panel.string name="text modify info 2">
+		Sie können diese Objekte bearbeiten.
+	</panel.string>
+	<panel.string name="text modify info 3">
+		Sie können dieses Objekt nicht bearbeiten.
+	</panel.string>
+	<panel.string name="text modify info 4">
+		Sie können diese Objekte nicht bearbeiten.
+	</panel.string>
+	<panel.string name="text modify info 5">
+		Dieses Objekt kann nicht über eine Regionsgrenze hinweg geändert werden
+	</panel.string>
+	<panel.string name="text modify info 6">
+		Diese Objekte können nicht über eine Regionsgrenze hinweg geändert werden
+	</panel.string>
+	<panel.string name="text modify warning">
+		Diese Objekt verfügt über verknüpfte Teile
+	</panel.string>
+	<panel.string name="Cost Default">
+		Preis: L$
+	</panel.string>
+	<panel.string name="Cost Total">
+		Summenpreis: L$
+	</panel.string>
+	<panel.string name="Cost Per Unit">
+		Stückpreis: L$
+	</panel.string>
+	<panel.string name="Cost Mixed">
+		Mischpreis
+	</panel.string>
+	<panel.string name="Sale Mixed">
+		Mischverkauf
+	</panel.string>
 	<text name="title" value="Objektprofil"/>
 	<text name="where" value="(Inworld)"/>
 	<panel label="" name="properties_panel">
-		<text name="Name:">Name:</text>
-		<text name="Description:">Beschreibung:</text>
-		<text name="CreatorNameLabel">Ersteller:</text>
-		<text name="Owner:">Eigentümer:</text>
-		<text name="Group_label">Gruppe:</text>
+		<text name="Name:">
+			Name:
+		</text>
+		<line_editor name="Object Name" tool_tip="Der Name ist auf 63 Zeichen begrenzt. Längere formelle Namen werden gekürzt. Die Namen dürfen ausschließlich aus druckbaren Zeichen des (nicht erweiterten) ASCII-7-Zeichensatzes bestehen, mit Ausnahme des Senkrechtstrichs &quot;|&quot;."/>
+		<text name="Description:">
+			Beschreibung:
+		</text>
+		<line_editor name="Object Description" tool_tip="Bei Auswahl der Option &quot;Mauszeiger-Tipps zu allen Objekten&quot; in den Viewer-Einstellungen wird für alle Objekte das Popup mit der Objektbeschreibung unter dem Mauszeiger eingeblendet. Die formelle Beschreibung ist auf 127 Byte begrenzt, und alle längeren Zeichenketten werden gekürzt."/>
+		<text name="CreatorNameLabel">
+			Ersteller:
+		</text>
+		<text name="Owner:">
+			Eigentümer:
+		</text>
+		<text name="Group_label">
+			Gruppe:
+		</text>
 		<button name="button set group" tool_tip="Eine Gruppe auswählen, um die Berechtigungen des Objekts zu teilen."/>
 		<name_box initial_value="Wird geladen..." name="Group Name Proxy"/>
 		<button label="Übertragung" label_selected="Übertragung" name="button deed" tool_tip="Eine Übertragung bedeutet, dass das Objekt mit den Berechtigungen „Nächster Eigentümer“ weitergegeben wird. Mit der Gruppe geteilte Objekte können von einem Gruppen-Officer übertragen werden."/>
-		<text name="label click action">Bei Linksklick:</text>
-		<combo_box name="clickaction">
+		<text name="label click action">
+			Bei Linksklick:
+		</text>
+		<combo_box name="clickaction" tool_tip="Eine Klickaktion ermöglicht Ihnen die Interaktion mit einem Objekt mithilfe eines einzelnen Linksklicks. Jede Klickaktion verfügt über einen speziellen Cursor, der die Aktion verdeutlicht. Für manche Klickaktionen müssen Anforderungen erfüllt sein, damit die Funktion gewährleistet ist. Für die Funktion Touch and Pay (Berühren und Bezahlen) sind Skripte erforderlich.">
 			<combo_box.item label="Berühren (Standard)" name="Touch/grab(default)"/>
 			<combo_box.item label="Auf Objekt setzen" name="Sitonobject"/>
 			<combo_box.item label="Objekt kaufen" name="Buyobject"/>
@@ -35,37 +77,59 @@
 			<combo_box.item label="Zoomen" name="Zoom"/>
 		</combo_box>
 		<panel name="perms_inv">
-			<text name="perm_modify">Sie können dieses Objekt bearbeiten.</text>
-			<text name="Anyone can:">Jeder:</text>
-			<check_box label="Kopieren" name="checkbox allow everyone copy"/>
-			<check_box label="Bewegen" name="checkbox allow everyone move"/>
-			<text name="GroupLabel">Gruppe:</text>
+			<text name="perm_modify">
+				Sie können dieses Objekt bearbeiten.
+			</text>
+			<text name="Anyone can:">
+				Jeder:
+			</text>
+			<check_box label="Kopieren" name="checkbox allow everyone copy" tool_tip="Jeder Benutzer kann eine Kopie des Objekts erhalten. Das Objekt sowie alle seine Inhalte müssen kopier- und übertragbar sein."/>
+			<check_box label="Bewegen" name="checkbox allow everyone move" tool_tip="Jeder Benutzer kann das Objekt bewegen."/>
+			<text name="GroupLabel">
+				Gruppe:
+			</text>
 			<check_box label="Teilen" name="checkbox share with group" tool_tip="Mit allen Mitgliedern der zugeordneten Gruppe, Ihre Berechtigungen dieses Objekt zu ändern, teilen. Sie müssen Übereignen, um Rollenbeschränkungen zu aktivieren."/>
-			<text name="NextOwnerLabel">Nächster Eigentümer:</text>
-			<check_box label="Bearbeiten" name="checkbox next owner can modify"/>
-			<check_box label="Kopieren" name="checkbox next owner can copy"/>
+			<text name="NextOwnerLabel">
+				Nächster Eigentümer:
+			</text>
+			<check_box label="Bearbeiten" name="checkbox next owner can modify" tool_tip="Der nächste Eigentümer kann Eigenschaften wie den Artikelnamen oder den Maßstab dieses Objekts bearbeiten."/>
+			<check_box label="Kopieren" name="checkbox next owner can copy" tool_tip="Der nächste Eigentümer kann unbegrenzt viele Kopien dieses Objekts erstellen. Die Kopien enthalten Informationen zum Ersteller und können niemals mehr Berechtigungen enthalten als der kopierte Artikel."/>
 			<check_box label="Transferieren" name="checkbox next owner can transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/>
 		</panel>
-		<check_box label="Zum Verkauf" name="checkbox for sale"/>
-		<combo_box name="sale type">
+		<check_box label="Zum Verkauf" name="checkbox for sale" tool_tip="Ermöglicht, dass Einwohner dieses Objekt, seine Inhalte oder eine Kopie zum angegebenen Preis inworld erwerben."/>
+		<combo_box name="sale type" tool_tip="Wählen Sie aus, ob der Käufer eine Kopie, eine Kopie der Inhalte oder den Artikel selbst erhält.">
 			<combo_box.item label="Kopieren" name="Copy"/>
 			<combo_box.item label="Inhalt" name="Contents"/>
 			<combo_box.item label="Original" name="Original"/>
 		</combo_box>
-		<spinner label="Preis: L$" name="Edit Cost"/>
+		<spinner label="Preis: L$" name="Edit Cost" tool_tip="Objektkosten."/>
 		<check_box label="In Suche anzeigen" name="search_check" tool_tip="Dieses Objekt in Suchergebnissen anzeigen"/>
-		<text name="pathfinding_attributes_label">Pathfinding-Attribute:</text>
-		<text name="B:">B:</text>
-		<text name="O:">O:</text>
-		<text name="G:">G:</text>
-		<text name="E:">E:</text>
-		<text name="N:">N:</text>
-		<text name="F:">F:</text>
+		<text name="pathfinding_attributes_label">
+			Pathfinding-Attribute:
+		</text>
+		<text name="B:">
+			B:
+		</text>
+		<text name="O:">
+			O:
+		</text>
+		<text name="G:">
+			G:
+		</text>
+		<text name="E:">
+			E:
+		</text>
+		<text name="N:">
+			N:
+		</text>
+		<text name="F:">
+			F:
+		</text>
 	</panel>
 	<panel name="button_panel">
-		<button label="Öffnen" name="open_btn"/>
-		<button label="Bezahlen" name="pay_btn"/>
-		<button label="Kaufen" name="buy_btn"/>
-		<button label="Details" name="details_btn"/>
+		<button label="Öffnen" name="open_btn" tool_tip="Öffnen, um die Objektinhalte zu sehen."/>
+		<button label="Bezahlen" name="pay_btn" tool_tip="Öffnen Sie das Zahlungsfenster. Das Objekt muss über ein Zahlungs-Skript verfügen, um diese Funktion nutzen zu können."/>
+		<button label="Kaufen" name="buy_btn" tool_tip="Kauf-Fenster öffnen. Das Objekt muss als zu verkaufen gekennzeichnet sein."/>
+		<button label="Details" name="details_btn" tool_tip="Öffnen Sie das Fenster &quot;Objekt prüfen&quot;."/>
 	</panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 78d445f362..ac1f0d18e8 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -2271,7 +2271,7 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich unter http://suppo
 		Brust
 	</string>
 	<string name="ATTACH_HEAD">
-		Kopf
+		Schädel
 	</string>
 	<string name="ATTACH_LSHOULDER">
 		Linke Schulter
@@ -2292,7 +2292,7 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich unter http://suppo
 		Rechter Fuß
 	</string>
 	<string name="ATTACH_BACK">
-		Hinten
+		Wirbelsäule
 	</string>
 	<string name="ATTACH_PELVIS">
 		Becken
diff --git a/indra/newview/skins/default/xui/es/floater_bulk_perms.xml b/indra/newview/skins/default/xui/es/floater_bulk_perms.xml
index 5cd8b3c01f..75e324c7ef 100644
--- a/indra/newview/skins/default/xui/es/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/es/floater_bulk_perms.xml
@@ -38,17 +38,17 @@
 	<text name="GroupLabel">
 		Grupo:
 	</text>
-	<check_box label="Compartir" name="share_with_group"/>
+	<check_box label="Compartir" name="share_with_group" tool_tip="Permite que todos los miembros del grupo compartan tus permisos de modificación de este objeto. Debes transferirlo para activar las restricciones según los roles."/>
 	<text name="AnyoneLabel">
 		Cualquiera:
 	</text>
-	<check_box label="Copiarlo" name="everyone_copy"/>
+	<check_box label="Copiarlo" name="everyone_copy" tool_tip="Todos pueden tomar una copia del objeto. El objeto y todos sus contenidos deben tener un permiso para copiar y transferir."/>
 	<text name="NextOwnerLabel">
 		Próximo propietario:
 	</text>
-	<check_box label="Modificarlo" name="next_owner_modify"/>
-	<check_box label="Copiarlo" name="next_owner_copy"/>
-	<check_box initial_value="true" label="Transferirlo" name="next_owner_transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/>
+	<check_box label="Modificarlo" name="next_owner_modify" tool_tip="El próximo propietario puede editar ciertas propiedades como el nombre o la escala del objeto."/>
+	<check_box label="Copiarlo" name="next_owner_copy" tool_tip="El próximo propietario puede realizar copias ilimitadas de este objeto. Las copias mantienen la información del creador y nunca pueden ser más permisivas que el objeto que se está copiando."/>
+	<check_box initial_value="true" label="Transferirlo" name="next_owner_transfer" tool_tip="El próximo propietario puede dar o revender este objeto."/>
 	<button label="OK" name="ok"/>
 	<button label="Aplicar" name="apply"/>
 	<button label="Cancelar" name="close"/>
diff --git a/indra/newview/skins/default/xui/es/floater_my_scripts.xml b/indra/newview/skins/default/xui/es/floater_my_scripts.xml
new file mode 100644
index 0000000000..92711c5ea6
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_my_scripts.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="myscripts" title="Mis Scripts"/>
diff --git a/indra/newview/skins/default/xui/es/floater_preferences.xml b/indra/newview/skins/default/xui/es/floater_preferences.xml
index edd0824e57..70eb5a193e 100644
--- a/indra/newview/skins/default/xui/es/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/es/floater_preferences.xml
@@ -5,6 +5,9 @@
 	</floater.string>
 	<button label="OK" label_selected="OK" name="OK"/>
 	<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
+	<panel name="search_panel">
+		<search_editor label="Parámetros de Búsqueda" name="search_prefs_edit" tool_tip="Ingresa el término de búsqueda que te interesa aquí. Los resultados aparecerán para coincidencias parciales de texto completo en el nombre o comentario del parámetro."/>
+	</panel>
 	<tab_container name="pref core">
 		<panel label="General" name="general"/>
 		<panel label="Gráficos" name="display"/>
diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml
index d95b2e41af..52fd556b2b 100644
--- a/indra/newview/skins/default/xui/es/floater_tools.xml
+++ b/indra/newview/skins/default/xui/es/floater_tools.xml
@@ -152,9 +152,11 @@
 			<text name="Name:">
 				Nombre:
 			</text>
+			<line_editor name="Object Name" tool_tip="El nombre está limitado a 63 caracteres. Los nombres de prim más largos deberán abreviarse. Los nombres solo pueden tener caracteres imprimibles que formen parte del código de caracteres ASCII-7 (no extendido), exceptuando la barra vertical «|»."/>
 			<text name="Description:">
 				Descripción:
 			</text>
+			<line_editor name="Object Description" tool_tip="Cuando la opción «Mostrar Consejos al pasar el cursor en Todos los objetos» en los parámetros del visor esté seleccionada, cada vez que coloques el cursor del mouse sobre un objeto aparecerá su descripción. La descripción del prim está limitada a 127 bytes, cualquier string más larga quedará recortada."/>
 			<text name="Creator:">
 				Creador:
 			</text>
@@ -171,7 +173,7 @@
 			<text name="label click action">
 				Al tocarlo:
 			</text>
-			<combo_box name="clickaction">
+			<combo_box name="clickaction" tool_tip="Si haces clic izquierdo podrás interactuar con un objeto.  Cada vez que hagas clic aparecerá un cursor indicando en qué consiste. Algunas acciones de clic tienen ciertos requerimientos para poder funcionar. Por ejemplo Tocar y Pagar requiere scripts">
 				<combo_box.item label="Tocarlo (por defecto)" name="Touch/grab(default)"/>
 				<combo_box.item label="Sentarse en el objeto" name="Sitonobject"/>
 				<combo_box.item label="Comprar el objeto" name="Buyobject"/>
@@ -179,9 +181,9 @@
 				<combo_box.item label="Abrirlo" name="Open"/>
 				<combo_box.item label="Zoom" name="Zoom"/>
 			</combo_box>
-			<check_box label="En venta:" name="checkbox for sale"/>
-			<spinner label="L$" name="Edit Cost"/>
-			<combo_box name="sale type">
+			<check_box label="En venta:" name="checkbox for sale" tool_tip="Permite a las personas comprar este objeto, su contenido o su copia en el mundo virtual al precio indicado."/>
+			<spinner label="L$" name="Edit Cost" tool_tip="Precio del objeto."/>
+			<combo_box name="sale type" tool_tip="Selecciona si el comprador recibirá una copia, una copia del contenido o el objeto propiamente dicho.">
 				<combo_box.item label="Copia" name="Copy"/>
 				<combo_box.item label="Contenidos" name="Contents"/>
 				<combo_box.item label="Original" name="Original"/>
@@ -194,14 +196,14 @@
 				<text name="Anyone can:">
 					Cualquiera:
 				</text>
-				<check_box label="Moverlo" name="checkbox allow everyone move"/>
-				<check_box label="Copiarlo" name="checkbox allow everyone copy"/>
+				<check_box label="Moverlo" name="checkbox allow everyone move" tool_tip="Todos pueden mover el objeto."/>
+				<check_box label="Copiarlo" name="checkbox allow everyone copy" tool_tip="Todos pueden tomar una copia del objeto. El objeto y todos sus contenidos deben tener un permiso para copiar y transferir."/>
 				<text name="Next owner can:">
 					Próximo propietario:
 				</text>
-				<check_box label="Modificarlo" name="checkbox next owner can modify"/>
-				<check_box label="Copiarlo" left_delta="80" name="checkbox next owner can copy"/>
-				<check_box label="Transferirlo" left_delta="67" name="checkbox next owner can transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/>
+				<check_box label="Modificarlo" name="checkbox next owner can modify" tool_tip="El próximo propietario puede editar ciertas propiedades como el nombre o la escala del objeto."/>
+				<check_box label="Copiarlo" left_delta="80" name="checkbox next owner can copy" tool_tip="El próximo propietario puede realizar copias ilimitadas de este objeto. Las copias mantienen la información del creador y nunca pueden ser más permisivas que el objeto que se está copiando."/>
+				<check_box label="Transferirlo" left_delta="67" name="checkbox next owner can transfer" tool_tip="El próximo propietario puede dar o revender este objeto."/>
 				<text name="B:">
 					B:
 				</text>
diff --git a/indra/newview/skins/default/xui/es/floater_top_objects.xml b/indra/newview/skins/default/xui/es/floater_top_objects.xml
index 4eaa552fda..4f5d551eef 100644
--- a/indra/newview/skins/default/xui/es/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/es/floater_top_objects.xml
@@ -4,7 +4,7 @@
 		Scripts según su uso
 	</floater.string>
 	<floater.string name="top_scripts_text">
-		[COUNT] scripts con un total de [TIME] ms
+		Scripts [COUNT] que toman un total de [TIME] ms y usan [MEMORY] KB
 	</floater.string>
 	<floater.string name="scripts_score_label">
 		Tiempo
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index beb6c76c27..afb6790a88 100644
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -9,6 +9,7 @@
 		<menu_item_call label="Lugares..." name="Places"/>
 		<menu_item_call label="Destacados..." name="Picks"/>
 		<menu_item_call label="Experiencias..." name="Experiences"/>
+		<menu_item_call label="Mis Scripts..." name="MyScripts"/>
 		<menu_item_call label="Controles de la cámara..." name="Camera Controls"/>
 		<menu label="Movimiento" name="Movement">
 			<menu_item_call label="Sentarte" name="Sit Down Here"/>
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index 92c3864f62..78121c41fc 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -1594,9 +1594,25 @@ Por favor, pon en venta el objeto y vuelve a intentarlo.
 [DOWNLOAD_PATH].
 	</notification>
 	<notification name="RequiredUpdate">
-		La versión [VERSION] es necesaria para iniciar sesión. Esto debería haber sido actualizado, pero parece que no fue así. Por favor, descarga desde https://secondlife.com/support/downloads/
+		La versión [VERSION] es necesaria para iniciar sesión. 
+Por favor, realiza la descarga desde https://secondlife.com/support/downloads/
 		<usetemplate name="okbutton" yestext="Aceptar"/>
 	</notification>
+	<notification name="PauseForUpdate">
+		La versión [VERSION] es necesaria para iniciar sesión. 
+Haz clic en OK para descargar e instalar.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="OptionalUpdateReady">
+		La versión [VERSION] ha sido descargada y está lista para instalar. 
+Haz clic en OK para instalar.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="PromptOptionalUpdate">
+		La versión [VERSION] ha sido descargada y está lista para instalar. 
+¿Deseas continuar?
+		<usetemplate canceltext="Ahora no" name="yesnocancelbuttons" notext="Saltear" yestext="Instalar"/>
+	</notification>
 	<notification name="LoginFailedUnknown">
 		Lo sentimos, error en el inicio de sesión, motivo desconocido. Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
 		<usetemplate name="okbutton" yestext="Salir"/>
@@ -3059,15 +3075,6 @@ No autorices el acceso a tu cuenta si no conoces cuál es la razón exacta.
 			<button name="Deny" text="Denegar"/>
 		</form>
 	</notification>
-	<notification name="UnknownScriptQuestion">
-		&apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, un objeto propiedad de &apos;[NAME]&apos;, ha solicitado un permiso de script en tiempo de ejecución que el visor no reconoce ni puede conceder.
-
-Para obtener el permiso, descárgate aquí la última versión: [DOWNLOADURL].
-		<form name="form">
-			<button name="Deny" text="Aceptar"/>
-			<button name="Mute" text="Ignorar"/>
-		</form>
-	</notification>
 	<notification name="ScriptDialog">
 		&apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; de [NAME]
 [MESSAGE]
diff --git a/indra/newview/skins/default/xui/es/panel_status_bar.xml b/indra/newview/skins/default/xui/es/panel_status_bar.xml
index 8aaa236475..bdedd04cc8 100644
--- a/indra/newview/skins/default/xui/es/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/es/panel_status_bar.xml
@@ -1,16 +1,31 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="status">
-	<panel.string name="packet_loss_tooltip">Pérdida de paquetes</panel.string>
-	<panel.string name="bandwidth_tooltip">Ancho de banda</panel.string>
-	<panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>
-	<panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>
-	<panel.string name="buycurrencylabel">[AMT] L$</panel.string>
+	<panel.string name="packet_loss_tooltip">
+		Pérdida de paquetes
+	</panel.string>
+	<panel.string name="bandwidth_tooltip">
+		Ancho de banda
+	</panel.string>
+	<panel.string name="time">
+		[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+	</panel.string>
+	<panel.string name="timeTooltip">
+		[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+	</panel.string>
+	<panel.string name="buycurrencylabel">
+		[AMT] L$
+	</panel.string>
+	<panel name="menu_search_panel">
+		<search_editor label="Menús de Búsqueda" name="search_menu_edit" tool_tip="Ingresa el término de búsqueda que te interesa aquí. Los resultados aparecerán para coincidencias parciales de texto completo en el menú."/>
+	</panel>
 	<panel left="-431" name="balance_bg" width="200">
 		<text name="balance" tool_tip="Haz clic para actualizar tu saldo en L$" value="L$??"/>
 		<button label="Comprar L$" name="buyL" tool_tip="Pulsa para comprar más L$"/>
 		<button label="Comprar" name="goShop" tool_tip="Abrir el mercado de Second Life" width="80"/>
 	</panel>
-	<text name="TimeText" tool_tip="Hora actual (Pacífico)">24:00 AM PST</text>
+	<text name="TimeText" tool_tip="Hora actual (Pacífico)">
+		24:00 AM PST
+	</text>
 	<button name="media_toggle_btn" tool_tip="Iniciar/Parar todos los media (música, vídeo, páginas web)"/>
 	<button name="volume_btn" tool_tip="Control general del volumen"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/es/sidepanel_item_info.xml b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml
index 8132bbdb1b..0734e9c417 100644
--- a/indra/newview/skins/default/xui/es/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml
@@ -34,9 +34,11 @@
 			<text name="LabelItemNameTitle">
 				Nombre:
 			</text>
+			<line_editor name="LabelItemName" tool_tip="El nombre está limitado a 63 caracteres. Los nombres de prim más largos deberán abreviarse. Los nombres solo pueden tener caracteres imprimibles que formen parte del código de caracteres ASCII-7 (no extendido), exceptuando la barra vertical «|»."/>
 			<text name="LabelItemDescTitle">
 				Descripción:
 			</text>
+			<line_editor name="LabelItemDesc" tool_tip="Cuando la opción «Mostrar Consejos al pasar el cursor en Todos los objetos» en los parámetros del visor esté seleccionada, cada vez que coloques el cursor del mouse sobre un objeto aparecerá su descripción. La descripción del prim está limitada a 127 bytes, cualquier string más larga quedará recortada."/>
 			<text name="LabelCreatorTitle">
 				Creador:
 			</text>
@@ -59,7 +61,7 @@
 				<text name="AnyoneLabel">
 					Cualquiera:
 				</text>
-				<check_box label="Copiar" name="CheckEveryoneCopy"/>
+				<check_box label="Copiar" name="CheckEveryoneCopy" tool_tip="Todos pueden tomar una copia del objeto. El objeto y todos sus contenidos deben tener un permiso para copiar y transferir."/>
 				<text name="GroupLabel">
 					Grupo:
 				</text>
@@ -67,17 +69,17 @@
 				<text name="NextOwnerLabel">
 					Próximo propietario:
 				</text>
-				<check_box label="Modificar" name="CheckNextOwnerModify"/>
-				<check_box label="Copiar" name="CheckNextOwnerCopy"/>
-				<check_box label="Transferir" name="CheckNextOwnerTransfer" tool_tip="El próximo propietario puede dar o revender este objeto"/>
+				<check_box label="Modificar" name="CheckNextOwnerModify" tool_tip="El próximo propietario puede editar ciertas propiedades como el nombre o la escala del objeto."/>
+				<check_box label="Copiar" name="CheckNextOwnerCopy" tool_tip="El próximo propietario puede realizar copias ilimitadas de este objeto. Las copias mantienen la información del creador y nunca pueden ser más permisivas que el objeto que se está copiando."/>
+				<check_box label="Transferir" name="CheckNextOwnerTransfer" tool_tip="El próximo propietario puede dar o revender este objeto."/>
 			</panel>
-			<check_box label="En venta" name="CheckPurchase"/>
-			<combo_box name="ComboBoxSaleType">
+			<check_box label="En venta" name="CheckPurchase" tool_tip="Permite a las personas comprar este objeto, su contenido o su copia en el mundo virtual al precio indicado."/>
+			<combo_box name="ComboBoxSaleType" tool_tip="Selecciona si el comprador recibirá una copia, una copia del contenido o el objeto propiamente dicho.">
 				<combo_box.item label="Copiar" name="Copy"/>
 				<combo_box.item label="Contenidos" name="Contents"/>
 				<combo_box.item label="Original" name="Original"/>
 			</combo_box>
-			<spinner label="Precio: L$" name="Edit Cost"/>
+			<spinner label="Precio: L$" name="Edit Cost" tool_tip="Precio del objeto."/>
 		</panel>
 	</scroll_container>
 	<panel name="button_panel">
diff --git a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml
index b9c8139f16..874422c58b 100644
--- a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml
@@ -1,32 +1,74 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="object properties" title="Perfil del objeto">
-	<panel.string name="text deed continued">Transferir</panel.string>
-	<panel.string name="text deed">Transferir</panel.string>
-	<panel.string name="text modify info 1">Puedes modificar este objeto</panel.string>
-	<panel.string name="text modify info 2">Puedes modificar estos objetos</panel.string>
-	<panel.string name="text modify info 3">No puedes modificar este objeto</panel.string>
-	<panel.string name="text modify info 4">No puedes modificar estos objetos</panel.string>
-	<panel.string name="text modify info 5">No se puede modificar este objeto a través del límite de una región</panel.string>
-	<panel.string name="text modify info 6">No se pueden modificar estos objetos a través del límite de una región</panel.string>
-	<panel.string name="text modify warning">Este objeto tiene partes enlazadas</panel.string>
-	<panel.string name="Cost Default">Precio: L$</panel.string>
-	<panel.string name="Cost Total">Precio total: L$</panel.string>
-	<panel.string name="Cost Per Unit">Price Per: L$</panel.string>
-	<panel.string name="Cost Mixed">Mixed Price</panel.string>
-	<panel.string name="Sale Mixed">Mixed Sale</panel.string>
+	<panel.string name="text deed continued">
+		Transferir
+	</panel.string>
+	<panel.string name="text deed">
+		Transferir
+	</panel.string>
+	<panel.string name="text modify info 1">
+		Puedes modificar este objeto
+	</panel.string>
+	<panel.string name="text modify info 2">
+		Puedes modificar estos objetos
+	</panel.string>
+	<panel.string name="text modify info 3">
+		No puedes modificar este objeto
+	</panel.string>
+	<panel.string name="text modify info 4">
+		No puedes modificar estos objetos
+	</panel.string>
+	<panel.string name="text modify info 5">
+		No se puede modificar este objeto a través del límite de una región
+	</panel.string>
+	<panel.string name="text modify info 6">
+		No se pueden modificar estos objetos a través del límite de una región
+	</panel.string>
+	<panel.string name="text modify warning">
+		Este objeto tiene partes enlazadas
+	</panel.string>
+	<panel.string name="Cost Default">
+		Precio: L$
+	</panel.string>
+	<panel.string name="Cost Total">
+		Precio total: L$
+	</panel.string>
+	<panel.string name="Cost Per Unit">
+		Price Per: L$
+	</panel.string>
+	<panel.string name="Cost Mixed">
+		Mixed Price
+	</panel.string>
+	<panel.string name="Sale Mixed">
+		Mixed Sale
+	</panel.string>
 	<text name="title" value="Perfil del objeto"/>
 	<text name="where" value="(En el mundo)"/>
 	<panel label="" name="properties_panel">
-		<text name="Name:">Nombre:</text>
-		<text name="Description:">Descripción:</text>
-		<text name="CreatorNameLabel">Creador:</text>
-		<text name="Owner:">Propietario:</text>
-		<text name="Group_label">Grupo:</text>
+		<text name="Name:">
+			Nombre:
+		</text>
+		<line_editor name="Object Name" tool_tip="El nombre está limitado a 63 caracteres. Los nombres de prim más largos deberán abreviarse. Los nombres solo pueden tener caracteres imprimibles que formen parte del código de caracteres ASCII-7 (no extendido), exceptuando la barra vertical «|»."/>
+		<text name="Description:">
+			Descripción:
+		</text>
+		<line_editor name="Object Description" tool_tip="Cuando la opción «Mostrar Consejos al pasar el cursor en Todos los objetos» en los parámetros del visor esté seleccionada, cada vez que coloques el cursor del mouse sobre un objeto aparecerá su descripción. La descripción del prim está limitada a 127 bytes, cualquier string más larga quedará recortada."/>
+		<text name="CreatorNameLabel">
+			Creador:
+		</text>
+		<text name="Owner:">
+			Propietario:
+		</text>
+		<text name="Group_label">
+			Grupo:
+		</text>
 		<button name="button set group" tool_tip="Elige un grupo con el que compartir los permisos de este objeto"/>
 		<name_box initial_value="Cargando..." name="Group Name Proxy"/>
 		<button label="Transferir" label_selected="Transferir" name="button deed" tool_tip="La transferencia entrega este objeto con los permisos del próximo propietario. Los objetos compartidos por el grupo pueden ser transferidos por un oficial del grupo."/>
-		<text name="label click action">Pulsa para:</text>
-		<combo_box name="clickaction">
+		<text name="label click action">
+			Pulsa para:
+		</text>
+		<combo_box name="clickaction" tool_tip="Si haces clic izquierdo podrás interactuar con un objeto.  Cada vez que hagas clic aparecerá un cursor indicando en qué consiste. Algunas acciones de clic tienen ciertos requerimientos para poder funcionar. Por ejemplo Tocar y Pagar requiere scripts">
 			<combo_box.item label="Tocarlo (por defecto)" name="Touch/grab(default)"/>
 			<combo_box.item label="Sentarme en el objeto" name="Sitonobject"/>
 			<combo_box.item label="Comprar el objeto" name="Buyobject"/>
@@ -35,37 +77,59 @@
 			<combo_box.item label="Zoom" name="Zoom"/>
 		</combo_box>
 		<panel name="perms_inv">
-			<text name="perm_modify">Puedes modificar este objeto</text>
-			<text name="Anyone can:">Cualquiera:</text>
-			<check_box label="Copiar" name="checkbox allow everyone copy"/>
-			<check_box label="Mover" name="checkbox allow everyone move"/>
-			<text name="GroupLabel">Grupo:</text>
+			<text name="perm_modify">
+				Puedes modificar este objeto
+			</text>
+			<text name="Anyone can:">
+				Cualquiera:
+			</text>
+			<check_box label="Copiar" name="checkbox allow everyone copy" tool_tip="Todos pueden tomar una copia del objeto. El objeto y todos sus contenidos deben tener un permiso para copiar y transferir."/>
+			<check_box label="Mover" name="checkbox allow everyone move" tool_tip="Todos pueden mover el objeto."/>
+			<text name="GroupLabel">
+				Grupo:
+			</text>
 			<check_box label="Compartir" name="checkbox share with group" tool_tip="Permite que todos los miembros del grupo compartan tus permisos de modificación de este objeto. Debes transferirlo para activar las restricciones según los roles."/>
-			<text name="NextOwnerLabel">Próximo propietario:</text>
-			<check_box label="Modificar" name="checkbox next owner can modify"/>
-			<check_box label="Copiar" name="checkbox next owner can copy"/>
+			<text name="NextOwnerLabel">
+				Próximo propietario:
+			</text>
+			<check_box label="Modificar" name="checkbox next owner can modify" tool_tip="El próximo propietario puede editar ciertas propiedades como el nombre o la escala del objeto."/>
+			<check_box label="Copiar" name="checkbox next owner can copy" tool_tip="El próximo propietario puede realizar copias ilimitadas de este objeto. Las copias mantienen la información del creador y nunca pueden ser más permisivas que el objeto que se está copiando."/>
 			<check_box label="Transferir" name="checkbox next owner can transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/>
 		</panel>
-		<check_box label="En venta" name="checkbox for sale"/>
-		<combo_box name="sale type">
+		<check_box label="En venta" name="checkbox for sale" tool_tip="Permite a las personas comprar este objeto, su contenido o su copia en el mundo virtual al precio indicado."/>
+		<combo_box name="sale type" tool_tip="Selecciona si el comprador recibirá una copia, una copia del contenido o el objeto propiamente dicho.">
 			<combo_box.item label="Copiar" name="Copy"/>
 			<combo_box.item label="Contenidos" name="Contents"/>
 			<combo_box.item label="Original" name="Original"/>
 		</combo_box>
-		<spinner label="Precio: L$" name="Edit Cost"/>
+		<spinner label="Precio: L$" name="Edit Cost" tool_tip="Precio del objeto."/>
 		<check_box label="Mostrar en la búsqueda" name="search_check" tool_tip="Permitir que la gente vea este objeto en los resultados de la búsqueda"/>
-		<text name="pathfinding_attributes_label">Atributos de pathfinding:</text>
-		<text name="B:">B:</text>
-		<text name="O:">O:</text>
-		<text name="G:">G:</text>
-		<text name="E:">E:</text>
-		<text name="N:">N:</text>
-		<text name="F:">F:</text>
+		<text name="pathfinding_attributes_label">
+			Atributos de pathfinding:
+		</text>
+		<text name="B:">
+			B:
+		</text>
+		<text name="O:">
+			O:
+		</text>
+		<text name="G:">
+			G:
+		</text>
+		<text name="E:">
+			E:
+		</text>
+		<text name="N:">
+			N:
+		</text>
+		<text name="F:">
+			F:
+		</text>
 	</panel>
 	<panel name="button_panel">
-		<button label="Abrir" name="open_btn"/>
-		<button label="Pagar" name="pay_btn"/>
-		<button label="Comprar" name="buy_btn"/>
-		<button label="Detalles" name="details_btn"/>
+		<button label="Abrir" name="open_btn" tool_tip="Abre para ver los Contenidos del Objeto."/>
+		<button label="Pagar" name="pay_btn" tool_tip="Abre la Ventana Comprar. Los objetos deben tener un script relativo al pago para que esto funcione."/>
+		<button label="Comprar" name="buy_btn" tool_tip="Abre la Ventana Comprar. El objeto debe estar a la venta."/>
+		<button label="Detalles" name="details_btn" tool_tip="Abre la Ventana Inspeccionar Objeto."/>
 	</panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 15e3c0622d..a7d405f293 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -2248,7 +2248,7 @@ Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia
 		Tórax
 	</string>
 	<string name="ATTACH_HEAD">
-		Cabeza
+		Cráneo
 	</string>
 	<string name="ATTACH_LSHOULDER">
 		Hombro izquierdo
@@ -2269,7 +2269,7 @@ Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia
 		Pie der.
 	</string>
 	<string name="ATTACH_BACK">
-		Anterior
+		Columna
 	</string>
 	<string name="ATTACH_PELVIS">
 		Pelvis
@@ -2299,13 +2299,13 @@ Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia
 		Brazo der.
 	</string>
 	<string name="ATTACH_RLARM">
-		Antebrazo der.
+		Antebrazo derecho
 	</string>
 	<string name="ATTACH_LUARM">
 		Brazo izq.
 	</string>
 	<string name="ATTACH_LLARM">
-		Antebrazo izq.
+		Antebrazo izquierdo
 	</string>
 	<string name="ATTACH_RHIP">
 		Cadera der.
@@ -2326,7 +2326,7 @@ Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia
 		Pantorrilla izq.
 	</string>
 	<string name="ATTACH_BELLY">
-		Vientre
+		Abdomen
 	</string>
 	<string name="ATTACH_LEFT_PEC">
 		Pectoral izquierdo
diff --git a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml
index 7ee4441758..02b58f9b36 100644
--- a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml
@@ -38,17 +38,17 @@
 	<text name="GroupLabel">
 		Groupe :
 	</text>
-	<check_box label="Partager" name="share_with_group"/>
+	<check_box label="Partager" name="share_with_group" tool_tip="Autoriser tous les membres du groupe choisi à partager vos droits de modification pour cet objet. Pour activer les restrictions de rôles, vous devez d&apos;abord cliquer sur Autoriser."/>
 	<text name="AnyoneLabel">
 		N&apos;importe qui :
 	</text>
-	<check_box label="Copier" name="everyone_copy"/>
+	<check_box label="Copier" name="everyone_copy" tool_tip="Tout le monde peut prendre une copie de l&apos;objet. L&apos;objet et tout son contenu doit être autorisé à être copié et transféré."/>
 	<text name="NextOwnerLabel">
 		Prochain propr. :
 	</text>
-	<check_box label="Modifier" name="next_owner_modify"/>
-	<check_box label="Copier" name="next_owner_copy"/>
-	<check_box initial_value="true" label="Transférer" name="next_owner_transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/>
+	<check_box label="Modifier" name="next_owner_modify" tool_tip="Le prochain propriétaire peut modifier des propriétés telles que le libellé de l&apos;élément ou l&apos;échelle de cet objet."/>
+	<check_box label="Copier" name="next_owner_copy" tool_tip="Le prochain propriétaire peut faire des copies illimitées de cet objet. Les copies conservent les informations sur le créateur et ne peuvent jamais être plus permissives que l&apos;élément qui est copié."/>
+	<check_box initial_value="true" label="Transférer" name="next_owner_transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet."/>
 	<button label="OK" name="ok"/>
 	<button label="Appliquer" name="apply"/>
 	<button label="Annuler" name="close"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_my_scripts.xml b/indra/newview/skins/default/xui/fr/floater_my_scripts.xml
new file mode 100644
index 0000000000..84ef7b2623
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_my_scripts.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="myscripts" title="Mes scripts"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_preferences.xml b/indra/newview/skins/default/xui/fr/floater_preferences.xml
index 1730202031..564f77e5d3 100644
--- a/indra/newview/skins/default/xui/fr/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preferences.xml
@@ -5,6 +5,9 @@
 	</floater.string>
 	<button label="OK" label_selected="OK" name="OK"/>
 	<button label="Annuler" label_selected="Annuler" name="Cancel"/>
+	<panel name="search_panel">
+		<search_editor label="Paramètres de recherche" name="search_prefs_edit" tool_tip="Tapez le terme de recherche qui vous intéresse ici. Les résultats seront affichés pour les correspondances partielles de texte intégral dans le nom ou le commentaire du paramètre."/>
+	</panel>
 	<tab_container name="pref core">
 		<panel label="Général" name="general"/>
 		<panel label="Graphiques" name="display"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml
index 90c2bde6f4..f0d7b3416d 100644
--- a/indra/newview/skins/default/xui/fr/floater_tools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_tools.xml
@@ -172,9 +172,11 @@
 			<text name="Name:">
 				Nom :
 			</text>
+			<line_editor name="Object Name" tool_tip="Le nom est limité à 63 caractères. Les noms de prim plus longs sont écourtés. Les noms ne peuvent contenir que des caractères imprimables trouvés dans le jeu de caractères ASCII-7 (non étendu), à l&apos;exception de la barre / pipe verticale &apos;|&apos;."/>
 			<text name="Description:">
 				Description :
 			</text>
+			<line_editor name="Object Description" tool_tip="Lorsque les utilisateurs sélectionnent &apos;Conseils de survol sur tous les objets&apos; dans les paramètres de la visionneuse, la description contextuelle de chaque objet apparaît sous le pointeur de la souris. La description de la prim est limitée à 127 octets, toute chaîne supérieure à cette limite sera tronquée."/>
 			<text name="Creator:">
 				Créateur :
 			</text>
@@ -191,7 +193,7 @@
 			<text name="label click action">
 				Cliquer pour :
 			</text>
-			<combo_box name="clickaction">
+			<combo_box name="clickaction" tool_tip="Une action de clic vous permet d&apos;interagir avec un objet avec un simple clic gauche. Chaque action de clic a un curseur spécial indiquant ce qu&apos;il fait. Certaines actions de clic ont des exigences pour fonctionner.   Par exemple, Toucher and Payer nécessitent des scripts">
 				<combo_box.item label="Toucher (par défaut)" name="Touch/grab(default)"/>
 				<combo_box.item label="S&apos;asseoir sur l&apos;objet" name="Sitonobject"/>
 				<combo_box.item label="Acheter l&apos;objet" name="Buyobject"/>
@@ -199,9 +201,9 @@
 				<combo_box.item label="Ouvrir" name="Open"/>
 				<combo_box.item label="Zoomer" name="Zoom"/>
 			</combo_box>
-			<check_box label="À vendre :" name="checkbox for sale"/>
-			<spinner label="L$" name="Edit Cost"/>
-			<combo_box name="sale type">
+			<check_box label="À vendre :" name="checkbox for sale" tool_tip="Permet aux gens d&apos;acheter cet objet, son contenu ou de le copier dans Second Life à un prix donné."/>
+			<spinner label="L$" name="Edit Cost" tool_tip="Coût de l&apos;objet."/>
+			<combo_box name="sale type" tool_tip="Indiquez si l’acheteur recevra une copie, une copie du contenu ou l’article lui-même.">
 				<combo_box.item label="Copie" name="Copy"/>
 				<combo_box.item label="Contenus" name="Contents"/>
 				<combo_box.item label="Original" name="Original"/>
@@ -214,14 +216,14 @@
 				<text name="Anyone can:">
 					N&apos;importe qui :
 				</text>
-				<check_box label="Bouger" name="checkbox allow everyone move"/>
-				<check_box label="Copier" name="checkbox allow everyone copy"/>
+				<check_box label="Bouger" name="checkbox allow everyone move" tool_tip="Tout le monde peut déplacer l&apos;objet."/>
+				<check_box label="Copier" name="checkbox allow everyone copy" tool_tip="Tout le monde peut prendre une copie de l&apos;objet. L&apos;objet et tout son contenu doit être autorisé à être copié et transféré."/>
 				<text name="Next owner can:">
 					Le prochain propriétaire :
 				</text>
-				<check_box label="Modifier" name="checkbox next owner can modify"/>
-				<check_box label="Copier" left_delta="66" name="checkbox next owner can copy"/>
-				<check_box label="Transférer" name="checkbox next owner can transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/>
+				<check_box label="Modifier" name="checkbox next owner can modify" tool_tip="Le prochain propriétaire peut modifier des propriétés telles que le libellé de l&apos;élément ou l&apos;échelle de cet objet."/>
+				<check_box label="Copier" left_delta="66" name="checkbox next owner can copy" tool_tip="Le prochain propriétaire peut faire des copies illimitées de cet objet. Les copies conservent les informations sur le créateur et ne peuvent jamais être plus permissives que l&apos;élément qui est copié."/>
+				<check_box label="Transférer" name="checkbox next owner can transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet."/>
 				<text name="B:">
 					B :
 				</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_top_objects.xml b/indra/newview/skins/default/xui/fr/floater_top_objects.xml
index 2c411933a8..cc63ece093 100644
--- a/indra/newview/skins/default/xui/fr/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/fr/floater_top_objects.xml
@@ -4,7 +4,7 @@
 		Scripts les plus consommateurs
 	</floater.string>
 	<floater.string name="top_scripts_text">
-		[COUNT] scripts prenant un total de [TIME] ms
+		Scripts [COUNT] prenant un total de [TIME] ms et utilisant [MEMORY] KB
 	</floater.string>
 	<floater.string name="scripts_score_label">
 		Temps
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index 3980ca8e02..c15a27aac4 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -9,6 +9,7 @@
 		<menu_item_call label="Endroits..." name="Places"/>
 		<menu_item_call label="Favoris..." name="Picks"/>
 		<menu_item_call label="Expériences..." name="Experiences"/>
+		<menu_item_call label="Mes scripts..." name="MyScripts"/>
 		<menu_item_call label="Contrôles de la caméra..." name="Camera Controls"/>
 		<menu label="Déplacement" name="Movement">
 			<menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index 0ac5f78921..18b3b2a35e 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -1586,9 +1586,25 @@ Veuillez choisir un objet à vendre et réessayer.
 [DOWNLOAD_PATH].
 	</notification>
 	<notification name="RequiredUpdate">
-		La version [VERSION] est nécessaire pour vous connecter. Cette version aurait dû être mise à jour, mais visiblement, elle ne l&apos;a pas été. Veuillez télécharger la dernière version sur https://secondlife.com/support/downloads/
+		La version [VERSION] est nécessaire pour vous connecter. 
+Veuillez télécharger la dernière version sur https://secondlife.com/support/downloads/
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
+	<notification name="PauseForUpdate">
+		La version [VERSION] est nécessaire pour vous connecter. 
+Cliquez sur OK pour télécharger et installer.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="OptionalUpdateReady">
+		La version [VERSION] a été téléchargée et est prête à être installée. 
+Cliquez sur OK pour installer.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="PromptOptionalUpdate">
+		La version [VERSION] a été téléchargée et est prête à être installée. 
+Continuer ?
+		<usetemplate canceltext="Pas maintenant" name="yesnocancelbuttons" notext="Ignorer" yestext="Installer"/>
+	</notification>
 	<notification name="LoginFailedUnknown">
 		Désolé, la connexion a échoué pour un raison non reconnue. Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].
 		<usetemplate name="okbutton" yestext="Quitter"/>
@@ -3052,15 +3068,6 @@ N&apos;autorisez pas cet accès si vous ne comprenez pas entièrement pourquoi l
 			<button name="Deny" text="Refuser"/>
 		</form>
 	</notification>
-	<notification name="UnknownScriptQuestion">
-		Le client ne reconnaît pas le droit de script à l&apos;exécution demandé par &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, objet appartenant à [NAME], et ne peut donc pas l&apos;accorder.
-
-Pour accorder ce droit, mettez votre client à jour pour passer à la version la plus récente, à partir de [DOWNLOADURL].
-		<form name="form">
-			<button name="Deny" text="OK"/>
-			<button name="Mute" text="Ignorer"/>
-		</form>
-	</notification>
 	<notification name="ScriptDialog">
 		&lt;nolink&gt;[TITLE]&lt;/nolink&gt; de [NAME]
 [MESSAGE]
diff --git a/indra/newview/skins/default/xui/fr/panel_status_bar.xml b/indra/newview/skins/default/xui/fr/panel_status_bar.xml
index fef0379c2c..84c6dda4b4 100644
--- a/indra/newview/skins/default/xui/fr/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_status_bar.xml
@@ -1,16 +1,31 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="status">
-	<panel.string name="packet_loss_tooltip">Perte de paquets</panel.string>
-	<panel.string name="bandwidth_tooltip">Bande passante</panel.string>
-	<panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>
-	<panel.string name="timeTooltip">[weekday, datetime, slt] [sday, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>
-	<panel.string name="buycurrencylabel">[AMT] L$</panel.string>
+	<panel.string name="packet_loss_tooltip">
+		Perte de paquets
+	</panel.string>
+	<panel.string name="bandwidth_tooltip">
+		Bande passante
+	</panel.string>
+	<panel.string name="time">
+		[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+	</panel.string>
+	<panel.string name="timeTooltip">
+		[weekday, datetime, slt] [sday, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+	</panel.string>
+	<panel.string name="buycurrencylabel">
+		[AMT] L$
+	</panel.string>
+	<panel name="menu_search_panel">
+		<search_editor label="Menus de recherche" name="search_menu_edit" tool_tip="Tapez le terme de recherche qui vous intéresse ici. Les résultats seront affichés pour les correspondances partielles en texte intégral dans le menu."/>
+	</panel>
 	<panel left="-426" name="balance_bg" width="195">
 		<text name="balance" tool_tip="Cliquer sur ce bouton pour actualiser votre solde en L$." value="L$ ??"/>
 		<button label="Acheter L$" name="buyL" tool_tip="Cliquer pour acheter plus de L$."/>
 		<button label="Achats" name="goShop" tool_tip="Ouvrir la Place du marché Second Life." width="75"/>
 	</panel>
-	<text name="TimeText" tool_tip="Heure actuelle (Pacifique)">00h00 PST</text>
+	<text name="TimeText" tool_tip="Heure actuelle (Pacifique)">
+		00h00 PST
+	</text>
 	<button name="media_toggle_btn" tool_tip="Arrêter tous les médias (musique, vidéo, pages web)."/>
 	<button name="volume_btn" tool_tip="Régler le volume global."/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml
index ede5ec08af..caeb1f8589 100644
--- a/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml
@@ -34,9 +34,11 @@
 			<text name="LabelItemNameTitle">
 				Nom :
 			</text>
+			<line_editor name="LabelItemName" tool_tip="Le nom est limité à 63 caractères. Les noms de prim plus longs sont écourtés. Les noms ne peuvent contenir que des caractères imprimables trouvés dans le jeu de caractères ASCII-7 (non étendu), à l&apos;exception de la barre / pipe verticale &apos;|&apos;."/>
 			<text name="LabelItemDescTitle">
 				Description :
 			</text>
+			<line_editor name="LabelItemDesc" tool_tip="Lorsque les utilisateurs sélectionnent &apos;Conseils de survol sur tous les objets&apos; dans les paramètres de la visionneuse, la description contextuelle de chaque objet apparaît sous le pointeur de la souris. La description de la prim est limitée à 127 octets, toute chaîne supérieure à cette limite sera tronquée."/>
 			<text name="LabelCreatorTitle">
 				Créateur :
 			</text>
@@ -59,7 +61,7 @@
 				<text name="AnyoneLabel">
 					N&apos;importe qui :
 				</text>
-				<check_box label="Copier" name="CheckEveryoneCopy"/>
+				<check_box label="Copier" name="CheckEveryoneCopy" tool_tip="Tout le monde peut prendre une copie de l&apos;objet. L&apos;objet et tout son contenu doit être autorisé à être copié et transféré."/>
 				<text name="GroupLabel">
 					Groupe :
 				</text>
@@ -67,17 +69,17 @@
 				<text name="NextOwnerLabel">
 					Prochain propriétaire :
 				</text>
-				<check_box label="Modifier" name="CheckNextOwnerModify"/>
-				<check_box label="Copier" name="CheckNextOwnerCopy"/>
+				<check_box label="Modifier" name="CheckNextOwnerModify" tool_tip="Le prochain propriétaire peut modifier des propriétés telles que le libellé de l&apos;élément ou l&apos;échelle de cet objet."/>
+				<check_box label="Copier" name="CheckNextOwnerCopy" tool_tip="Le prochain propriétaire peut faire des copies illimitées de cet objet. Les copies conservent les informations sur le créateur et ne peuvent jamais être plus permissives que l&apos;élément qui est copié."/>
 				<check_box label="Transférer" name="CheckNextOwnerTransfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet."/>
 			</panel>
-			<check_box label="À vendre" name="CheckPurchase"/>
-			<combo_box name="ComboBoxSaleType">
+			<check_box label="À vendre" name="CheckPurchase" tool_tip="Permet aux gens d&apos;acheter cet objet, son contenu ou de le copier dans Second Life à un prix donné."/>
+			<combo_box name="ComboBoxSaleType" tool_tip="Indiquez si l’acheteur recevra une copie, une copie du contenu ou l’article lui-même.">
 				<combo_box.item label="Copier" name="Copy"/>
 				<combo_box.item label="Contenu" name="Contents"/>
 				<combo_box.item label="Original" name="Original"/>
 			</combo_box>
-			<spinner label="Prix : L$" name="Edit Cost"/>
+			<spinner label="Prix : L$" name="Edit Cost" tool_tip="Coût de l&apos;objet."/>
 		</panel>
 	</scroll_container>
 	<panel name="button_panel">
diff --git a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
index f6b4f28046..0b2ac87876 100644
--- a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
@@ -1,32 +1,74 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="object properties" title="Profil de l&apos;objet">
-	<panel.string name="text deed continued">Céder</panel.string>
-	<panel.string name="text deed">Céder</panel.string>
-	<panel.string name="text modify info 1">Vous pouvez modifier cet objet</panel.string>
-	<panel.string name="text modify info 2">Vous pouvez modifier ces objets</panel.string>
-	<panel.string name="text modify info 3">Vous ne pouvez pas modifier cet objet</panel.string>
-	<panel.string name="text modify info 4">Vous ne pouvez pas modifier ces objets</panel.string>
-	<panel.string name="text modify info 5">Impossible de modifier cet objet au-delà de la frontière d&apos;une région</panel.string>
-	<panel.string name="text modify info 6">Impossible de modifier ces objets au-delà de la frontière d&apos;une région</panel.string>
-	<panel.string name="text modify warning">Cet objet comprend des parties liées</panel.string>
-	<panel.string name="Cost Default">Prix : L$</panel.string>
-	<panel.string name="Cost Total">Prix total : L$</panel.string>
-	<panel.string name="Cost Per Unit">Prix par : L$</panel.string>
-	<panel.string name="Cost Mixed">Prix mixte</panel.string>
-	<panel.string name="Sale Mixed">Vente mixte</panel.string>
+	<panel.string name="text deed continued">
+		Céder
+	</panel.string>
+	<panel.string name="text deed">
+		Céder
+	</panel.string>
+	<panel.string name="text modify info 1">
+		Vous pouvez modifier cet objet
+	</panel.string>
+	<panel.string name="text modify info 2">
+		Vous pouvez modifier ces objets
+	</panel.string>
+	<panel.string name="text modify info 3">
+		Vous ne pouvez pas modifier cet objet
+	</panel.string>
+	<panel.string name="text modify info 4">
+		Vous ne pouvez pas modifier ces objets
+	</panel.string>
+	<panel.string name="text modify info 5">
+		Impossible de modifier cet objet au-delà de la frontière d&apos;une région
+	</panel.string>
+	<panel.string name="text modify info 6">
+		Impossible de modifier ces objets au-delà de la frontière d&apos;une région
+	</panel.string>
+	<panel.string name="text modify warning">
+		Cet objet comprend des parties liées
+	</panel.string>
+	<panel.string name="Cost Default">
+		Prix : L$
+	</panel.string>
+	<panel.string name="Cost Total">
+		Prix total : L$
+	</panel.string>
+	<panel.string name="Cost Per Unit">
+		Prix par : L$
+	</panel.string>
+	<panel.string name="Cost Mixed">
+		Prix mixte
+	</panel.string>
+	<panel.string name="Sale Mixed">
+		Vente mixte
+	</panel.string>
 	<text name="title" value="Profil de l&apos;objet"/>
 	<text name="where" value="(dans Second Life)"/>
 	<panel label="" name="properties_panel">
-		<text name="Name:">Nom :</text>
-		<text name="Description:">Description :</text>
-		<text name="CreatorNameLabel">Créateur :</text>
-		<text name="Owner:">Propriétaire :</text>
-		<text name="Group_label">Groupe :</text>
+		<text name="Name:">
+			Nom :
+		</text>
+		<line_editor name="Object Name" tool_tip="Le nom est limité à 63 caractères. Les noms de prim plus longs sont écourtés. Les noms ne peuvent contenir que des caractères imprimables trouvés dans le jeu de caractères ASCII-7 (non étendu), à l&apos;exception de la barre / pipe verticale &apos;|&apos;."/>
+		<text name="Description:">
+			Description :
+		</text>
+		<line_editor name="Object Description" tool_tip="Lorsque les utilisateurs sélectionnent &apos;Conseils de survol sur tous les objets&apos; dans les paramètres de la visionneuse, la description contextuelle de chaque objet apparaît sous le pointeur de la souris. La description de la prim est limitée à 127 octets, toute chaîne supérieure à cette limite sera tronquée."/>
+		<text name="CreatorNameLabel">
+			Créateur :
+		</text>
+		<text name="Owner:">
+			Propriétaire :
+		</text>
+		<text name="Group_label">
+			Groupe :
+		</text>
 		<button name="button set group" tool_tip="Choisir un groupe pour partager les droits relatifs à cet objet"/>
 		<name_box initial_value="Chargement…" name="Group Name Proxy"/>
 		<button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les droits au prochain propriétaire. Seul un officier peut céder les objets partagés d&apos;un groupe."/>
-		<text name="label click action">Cliquer pour :</text>
-		<combo_box name="clickaction">
+		<text name="label click action">
+			Cliquer pour :
+		</text>
+		<combo_box name="clickaction" tool_tip="Une action de clic vous permet d&apos;interagir avec un objet avec un simple clic gauche. Chaque action de clic a un curseur spécial indiquant ce qu&apos;il fait. Certaines actions de clic ont des exigences pour fonctionner.   Par exemple, Toucher and Payer nécessitent des scripts">
 			<combo_box.item label="Toucher (défaut)" name="Touch/grab(default)"/>
 			<combo_box.item label="S&apos;asseoir sur l&apos;objet" name="Sitonobject"/>
 			<combo_box.item label="Acheter l&apos;objet" name="Buyobject"/>
@@ -35,37 +77,59 @@
 			<combo_box.item label="Zoom" name="Zoom"/>
 		</combo_box>
 		<panel name="perms_inv">
-			<text name="perm_modify">Vous pouvez modifier cet objet</text>
-			<text name="Anyone can:">N&apos;importe qui :</text>
-			<check_box label="Copier" name="checkbox allow everyone copy"/>
-			<check_box label="Bouger" name="checkbox allow everyone move"/>
-			<text name="GroupLabel">Groupe :</text>
+			<text name="perm_modify">
+				Vous pouvez modifier cet objet
+			</text>
+			<text name="Anyone can:">
+				N&apos;importe qui :
+			</text>
+			<check_box label="Copier" name="checkbox allow everyone copy" tool_tip="Tout le monde peut prendre une copie de l&apos;objet. L&apos;objet et tout son contenu doit être autorisé à être copié et transféré."/>
+			<check_box label="Bouger" name="checkbox allow everyone move" tool_tip="Tout le monde peut déplacer l&apos;objet."/>
+			<text name="GroupLabel">
+				Groupe :
+			</text>
 			<check_box label="Partager" name="checkbox share with group" tool_tip="Autoriser tous les membres du groupe choisi à partager vos droits de modification pour cet objet. Pour activer les restrictions de rôles, vous devez d&apos;abord cliquer sur Céder."/>
-			<text name="NextOwnerLabel">Le prochain propriétaire :</text>
-			<check_box label="Modifier" name="checkbox next owner can modify"/>
-			<check_box label="Copier" name="checkbox next owner can copy"/>
+			<text name="NextOwnerLabel">
+				Le prochain propriétaire :
+			</text>
+			<check_box label="Modifier" name="checkbox next owner can modify" tool_tip="Le prochain propriétaire peut modifier des propriétés telles que le libellé de l&apos;élément ou l&apos;échelle de cet objet."/>
+			<check_box label="Copier" name="checkbox next owner can copy" tool_tip="Le prochain propriétaire peut faire des copies illimitées de cet objet. Les copies conservent les informations sur le créateur et ne peuvent jamais être plus permissives que l&apos;élément qui est copié."/>
 			<check_box label="Transférer" name="checkbox next owner can transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/>
 		</panel>
-		<check_box label="À vendre" name="checkbox for sale"/>
-		<combo_box name="sale type">
+		<check_box label="À vendre" name="checkbox for sale" tool_tip="Permet aux gens d&apos;acheter cet objet, son contenu ou de le copier dans Second Life à un prix donné."/>
+		<combo_box name="sale type" tool_tip="Indiquez si l’acheteur recevra une copie, une copie du contenu ou l’article lui-même.">
 			<combo_box.item label="Copier" name="Copy"/>
 			<combo_box.item label="Contenus" name="Contents"/>
 			<combo_box.item label="Original" name="Original"/>
 		</combo_box>
-		<spinner label="Prix : L$" name="Edit Cost"/>
+		<spinner label="Prix : L$" name="Edit Cost" tool_tip="Coût de l&apos;objet."/>
 		<check_box label="Afficher avec la recherche" name="search_check" tool_tip="Permettre aux autres résidents de voir cet objet dans les résultats de recherche"/>
-		<text name="pathfinding_attributes_label">Attributs de recherche de chemin :</text>
-		<text name="B:">B :</text>
-		<text name="O:">O :</text>
-		<text name="G:">G :</text>
-		<text name="E:">E :</text>
-		<text name="N:">N :</text>
-		<text name="F:">F :</text>
+		<text name="pathfinding_attributes_label">
+			Attributs de recherche de chemin :
+		</text>
+		<text name="B:">
+			B :
+		</text>
+		<text name="O:">
+			O :
+		</text>
+		<text name="G:">
+			G :
+		</text>
+		<text name="E:">
+			E :
+		</text>
+		<text name="N:">
+			N :
+		</text>
+		<text name="F:">
+			F :
+		</text>
 	</panel>
 	<panel name="button_panel">
-		<button label="Ouvrir" name="open_btn"/>
-		<button label="Payer" name="pay_btn"/>
-		<button label="Acheter" name="buy_btn"/>
-		<button label="Détails" name="details_btn"/>
+		<button label="Ouvrir" name="open_btn" tool_tip="Ouvrir pour afficher le contenu de l&apos;objet."/>
+		<button label="Payer" name="pay_btn" tool_tip="Ouvrir la fenêtre Payer. L&apos;objet doit avoir un script payant pour que cela fonctionne."/>
+		<button label="Acheter" name="buy_btn" tool_tip="Ouvrir la fenêtre Acheter Nécessite que l&apos;objet soit mis en vente."/>
+		<button label="Détails" name="details_btn" tool_tip="Ouvrir la fenêtre Inspecter l&apos;objet"/>
 	</panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 13dd2b3640..d1d5d7edf6 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -2272,7 +2272,7 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life 
 		Poitrine
 	</string>
 	<string name="ATTACH_HEAD">
-		Tête
+		Crâne
 	</string>
 	<string name="ATTACH_LSHOULDER">
 		Épaule gauche
@@ -2293,7 +2293,7 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life 
 		Pied droit
 	</string>
 	<string name="ATTACH_BACK">
-		Précédent
+		Colonne vertébrale
 	</string>
 	<string name="ATTACH_PELVIS">
 		Bassin
@@ -2350,7 +2350,7 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life 
 		Jambe gauche
 	</string>
 	<string name="ATTACH_BELLY">
-		Ventre
+		Estomac
 	</string>
 	<string name="ATTACH_LEFT_PEC">
 		Pectoral gauche
diff --git a/indra/newview/skins/default/xui/it/floater_bulk_perms.xml b/indra/newview/skins/default/xui/it/floater_bulk_perms.xml
index 399eb15802..10bbe933e3 100644
--- a/indra/newview/skins/default/xui/it/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/it/floater_bulk_perms.xml
@@ -38,17 +38,17 @@
 	<text name="GroupLabel">
 		Gruppo:
 	</text>
-	<check_box label="Condividi" name="share_with_group"/>
+	<check_box label="Condividi" name="share_with_group" tool_tip="Consenti a tutti i membri del gruppo selezionato di condividere i tuoi diritti di modifica per questo oggetto. Per attivare le restrizioni per ruolo devi prima effettuare la cessione."/>
 	<text name="AnyoneLabel">
 		Chiunque:
 	</text>
-	<check_box label="Copia" name="everyone_copy"/>
+	<check_box label="Copia" name="everyone_copy" tool_tip="Chiunque può prendere una copia di questo oggetto. L&apos;oggetto e tutti i suoi contenuti devono avere il permesso di copia e trasferimento."/>
 	<text name="NextOwnerLabel">
 		Proprietario successivo:
 	</text>
-	<check_box label="Modificare" name="next_owner_modify"/>
-	<check_box label="Copiare" name="next_owner_copy"/>
-	<check_box initial_value="true" label="Trasferisci" name="next_owner_transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/>
+	<check_box label="Modificare" name="next_owner_modify" tool_tip="Il prossimo proprietario può modificare le proprietà dell&apos;oggetto come il nome o la scala."/>
+	<check_box label="Copiare" name="next_owner_copy" tool_tip="Il proprietario successivo può prendere infinite copie di questo oggetto. Le copie mantengono le informazioni sul creatore, e non possono avere permessi maggiori di quelli posseduti dall&apos;oggetto copiato."/>
+	<check_box initial_value="true" label="Trasferisci" name="next_owner_transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto."/>
 	<button label="OK" name="ok"/>
 	<button label="Applica" name="apply"/>
 	<button label="Annulla" name="close"/>
diff --git a/indra/newview/skins/default/xui/it/floater_my_scripts.xml b/indra/newview/skins/default/xui/it/floater_my_scripts.xml
new file mode 100644
index 0000000000..a75f7f3f6f
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_my_scripts.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="myscripts" title="I miei Script"/>
diff --git a/indra/newview/skins/default/xui/it/floater_preferences.xml b/indra/newview/skins/default/xui/it/floater_preferences.xml
index 895b6eef3c..094b2de19f 100644
--- a/indra/newview/skins/default/xui/it/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/it/floater_preferences.xml
@@ -5,6 +5,9 @@
 	</floater.string>
 	<button label="OK" label_selected="OK" name="OK"/>
 	<button label="Annulla" label_selected="Annulla" name="Cancel"/>
+	<panel name="search_panel">
+		<search_editor label="Ricerca Impostazioni" name="search_prefs_edit" tool_tip="Digita qui il termine della tua ricerca. I risultati verranno mostrati secondo la concordanza parziale o totale con il nome dell&apos;impostazione."/>
+	</panel>
 	<tab_container name="pref core" tab_width="100">
 		<panel label="Generale" name="general"/>
 		<panel label="Grafica" name="display"/>
diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml
index 1ebb45d02b..4359275dc2 100644
--- a/indra/newview/skins/default/xui/it/floater_tools.xml
+++ b/indra/newview/skins/default/xui/it/floater_tools.xml
@@ -173,9 +173,11 @@
 			<text name="Name:">
 				Nome:
 			</text>
+			<line_editor name="Object Name" tool_tip="Il nome è limitato a 63 caratteri. Prim con nomi più lunghi verranno accorciati. I nomi possono avere solamente caratteri stampabili facenti parte del codice ASCII-7 (non esteso), con l&apos;eccezione della barra verticale &apos;|&apos;."/>
 			<text name="Description:">
 				Descrizione:
 			</text>
+			<line_editor name="Object Description" tool_tip="Quando la dicitura &quot;Vedi suggerimenti su tutti gli oggetti&quot; è selezionata nelle impostazioni del Viewer, passando il mouse sopra un oggetto si vedrà la sua descrizione. La descrizione dei Prim è limitata a 127 bytes. Se più lunga, verrá troncata."/>
 			<text name="Creator:">
 				Creatore:
 			</text>
@@ -198,7 +200,7 @@
 			<text name="label click action">
 				Fai clic per:
 			</text>
-			<combo_box name="clickaction">
+			<combo_box name="clickaction" tool_tip="Con l&apos;azione &quot;clic singolo&quot; puoi interagire con un oggetto semplicemente cliccandolo una volta. Ogni azione &quot;clic singolo&quot; ha un cursore speciale che indica il suo effetto. Alcune azioni &quot;clic singolo&quot; hanno dei requisiti per funzionare. Ad esempio per il comando &quot;Touch and Pay&quot; sono necessari degli script.">
 				<combo_box.item label="Tocca (predefinito)" name="Touch/grab(default)"/>
 				<combo_box.item label="Siediti sull&apos;oggetto" name="Sitonobject"/>
 				<combo_box.item label="Compra l&apos;oggetto" name="Buyobject"/>
@@ -206,9 +208,9 @@
 				<combo_box.item label="Apri" name="Open"/>
 				<combo_box.item label="Ingrandisci" name="Zoom"/>
 			</combo_box>
-			<check_box label="In vendita:" name="checkbox for sale"/>
-			<spinner label="L$" name="Edit Cost"/>
-			<combo_box name="sale type">
+			<check_box label="In vendita:" name="checkbox for sale" tool_tip="Permette alla gente di comprare questo oggetto, il suo contenuto o la sua copia virtuale ad un prezzo stabilito."/>
+			<spinner label="L$" name="Edit Cost" tool_tip="Costo oggetto."/>
+			<combo_box name="sale type" tool_tip="Decidi se vuoi che il compratore riceva una copia, una copia del contenuto o l&apos;oggetto stesso.">
 				<combo_box.item label="Copia" name="Copy"/>
 				<combo_box.item label="Contenuto" name="Contents"/>
 				<combo_box.item label="Originale" name="Original"/>
@@ -221,14 +223,14 @@
 				<text name="Anyone can:">
 					Chiunque:
 				</text>
-				<check_box label="Sposta" name="checkbox allow everyone move"/>
-				<check_box label="Copia" name="checkbox allow everyone copy"/>
+				<check_box label="Sposta" name="checkbox allow everyone move" tool_tip="Chiunque può muovere l&apos;oggetto."/>
+				<check_box label="Copia" name="checkbox allow everyone copy" tool_tip="Chiunque può prendere una copia di questo oggetto. L&apos;oggetto e tutti i suoi contenuti devono avere il permesso di copia e trasferimento."/>
 				<text name="Next owner can:">
 					Proprietario successivo:
 				</text>
-				<check_box label="Modificare" name="checkbox next owner can modify"/>
-				<check_box label="Copiare" name="checkbox next owner can copy"/>
-				<check_box label="Trasferisci" name="checkbox next owner can transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/>
+				<check_box label="Modificare" name="checkbox next owner can modify" tool_tip="Il prossimo proprietario può modificare le proprietà dell&apos;oggetto come il nome o la scala."/>
+				<check_box label="Copiare" name="checkbox next owner can copy" tool_tip="Il proprietario successivo può prendere infinite copie di questo oggetto. Le copie mantengono le informazioni sul creatore, e non possono avere permessi maggiori di quelli posseduti dall&apos;oggetto copiato."/>
+				<check_box label="Trasferisci" name="checkbox next owner can transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto."/>
 				<text name="B:">
 					B:
 				</text>
diff --git a/indra/newview/skins/default/xui/it/floater_top_objects.xml b/indra/newview/skins/default/xui/it/floater_top_objects.xml
index afd6a87646..f01ff2e1aa 100644
--- a/indra/newview/skins/default/xui/it/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/it/floater_top_objects.xml
@@ -4,7 +4,7 @@
 		Script pesanti
 	</floater.string>
 	<floater.string name="top_scripts_text">
-		[COUNT] script richiedono un totale di [TIME] ms
+		[COUNT] script che impiegano un totale di [TIME] ms e utilizzano [MEMORY] KB
 	</floater.string>
 	<floater.string name="scripts_score_label">
 		Ora
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index 825d127287..2bd8eeb8d9 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -9,6 +9,7 @@
 		<menu_item_call label="Luoghi..." name="Places"/>
 		<menu_item_call label="Preferiti..." name="Picks"/>
 		<menu_item_call label="Esperienze..." name="Experiences"/>
+		<menu_item_call label="I miei Script..." name="MyScripts"/>
 		<menu_item_call label="Controlli fotocamera..." name="Camera Controls"/>
 		<menu label="Spostamento" name="Movement">
 			<menu_item_call label="Siedi" name="Sit Down Here"/>
diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml
index 0175275eb3..9a1b1a1968 100644
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -1589,9 +1589,25 @@ Imposta l&apos;oggetto per la vendita e riprova.
 [DOWNLOAD_PATH].
 	</notification>
 	<notification name="RequiredUpdate">
-		É richiesta la versione [VERSION] per l’accesso. Sembra che dovresti avere la versione aggiornata, ma cosí non é. Scaricala da https://secondlife.com/support/downloads/
+		Per effettuare l&apos;accesso è richiesta la versione [VERSION]. 
+Scaricala dal sito https://secondlife.com/support/downloads/
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
+	<notification name="PauseForUpdate">
+		Per effettuare l&apos;accesso è richiesta la versione [VERSION]. 
+Fai clic su OK per scaricarla e installarla.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="OptionalUpdateReady">
+		La versione [VERSION] è stata scaricata ed è pronta per essere installata. 
+Fai clic su OK per installarla.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="PromptOptionalUpdate">
+		La versione [VERSION] è stata scaricata ed è pronta per essere installata. 
+Vuoi procedere?
+		<usetemplate canceltext="Non adesso" name="yesnocancelbuttons" notext="Salta" yestext="Installa"/>
+	</notification>
 	<notification name="LoginFailedUnknown">
 		Spiacenti, accesso non riuscito per ragioni sconosciute. Se continui a visualizzare questo messaggio, visita il [SUPPORT_SITE].
 		<usetemplate name="okbutton" yestext="Chiudi"/>
@@ -3055,15 +3071,6 @@ Non consentire l&apos;accesso se non comprendi perfettamente il motivo per cui d
 			<button name="Deny" text="Nega"/>
 		</form>
 	</notification>
-	<notification name="UnknownScriptQuestion">
-		L&apos;autorizzazione per script runtime richiesta da &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, un oggetto di proprietà di &apos;[NAME]&apos;, non è stata riconosciuta nel viewer e non può essere concessa.
-
-Per concedere questa autorizzazione è necessario che il viewer venga aggiornato alla versione più recente da [DOWNLOADURL].
-		<form name="form">
-			<button name="Deny" text="Ok"/>
-			<button name="Mute" text="Blocca"/>
-		</form>
-	</notification>
 	<notification name="ScriptDialog">
 		&apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; di [NAME]
 [MESSAGE]
diff --git a/indra/newview/skins/default/xui/it/panel_status_bar.xml b/indra/newview/skins/default/xui/it/panel_status_bar.xml
index 295ca8d9f2..160fd4e180 100644
--- a/indra/newview/skins/default/xui/it/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/it/panel_status_bar.xml
@@ -1,16 +1,31 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="status">
-	<panel.string name="packet_loss_tooltip">Perdita di pacchetti</panel.string>
-	<panel.string name="bandwidth_tooltip">Larghezza di banda</panel.string>
-	<panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>
-	<panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>
-	<panel.string name="buycurrencylabel">L$ [AMT]</panel.string>
+	<panel.string name="packet_loss_tooltip">
+		Perdita di pacchetti
+	</panel.string>
+	<panel.string name="bandwidth_tooltip">
+		Larghezza di banda
+	</panel.string>
+	<panel.string name="time">
+		[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+	</panel.string>
+	<panel.string name="timeTooltip">
+		[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+	</panel.string>
+	<panel.string name="buycurrencylabel">
+		L$ [AMT]
+	</panel.string>
+	<panel name="menu_search_panel">
+		<search_editor label="Ricerca Menu" name="search_menu_edit" tool_tip="Digita qui il termine della tua ricerca. I risultati verranno mostrati secondo la concordanza parziale o totale con il menú."/>
+	</panel>
 	<panel left="-426" name="balance_bg" width="195">
 		<text name="balance" tool_tip="Clicca per aggiornare il tuo saldo in L$" value="L$ ??"/>
 		<button label="Acquista L$" name="buyL" tool_tip="Clicca per acquistare più L$"/>
 		<button label="Acquisti" name="goShop" tool_tip="Apri Mercato Second Life" width="75"/>
 	</panel>
-	<text name="TimeText" tool_tip="Orario attuale (Pacifico)">24:00, ora del Pacifico</text>
+	<text name="TimeText" tool_tip="Orario attuale (Pacifico)">
+		24:00, ora del Pacifico
+	</text>
 	<button name="media_toggle_btn" tool_tip="Attiva/ferma tutti i media (musica, video, pagine Web)"/>
 	<button name="volume_btn" tool_tip="Regolazione del volume globale"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml
index 14c1c43816..9d659bb50d 100644
--- a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml
@@ -34,9 +34,11 @@
 			<text name="LabelItemNameTitle">
 				Nome:
 			</text>
+			<line_editor name="LabelItemName" tool_tip="Il nome è limitato a 63 caratteri. Prim con nomi più lunghi verranno accorciati. I nomi possono avere solamente caratteri stampabili facenti parte del codice ASCII-7 (non esteso), con l&apos;eccezione della barra verticale &apos;|&apos;."/>
 			<text name="LabelItemDescTitle">
 				Descrizione:
 			</text>
+			<line_editor name="LabelItemDesc" tool_tip="Quando la dicitura &quot;Vedi suggerimenti su tutti gli oggetti&quot; è selezionata nelle impostazioni del Viewer, passando il mouse sopra un oggetto si vedrà la sua descrizione. La descrizione dei Prim è limitata a 127 bytes. Se più lunga, verrá troncata."/>
 			<text name="LabelCreatorTitle">
 				Ideatore:
 			</text>
@@ -59,7 +61,7 @@
 				<text name="AnyoneLabel">
 					Chiunque:
 				</text>
-				<check_box label="Copia" name="CheckEveryoneCopy"/>
+				<check_box label="Copia" name="CheckEveryoneCopy" tool_tip="Chiunque può prendere una copia di questo oggetto. L&apos;oggetto e tutti i suoi contenuti devono avere il permesso di copia e trasferimento."/>
 				<text name="GroupLabel">
 					Gruppo:
 				</text>
@@ -67,17 +69,17 @@
 				<text name="NextOwnerLabel">
 					Proprietario successivo:
 				</text>
-				<check_box label="Modifica" name="CheckNextOwnerModify"/>
-				<check_box label="Copia" name="CheckNextOwnerCopy"/>
-				<check_box label="Trasferisci" name="CheckNextOwnerTransfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/>
+				<check_box label="Modifica" name="CheckNextOwnerModify" tool_tip="Il prossimo proprietario può modificare le proprietà dell&apos;oggetto come il nome o la scala."/>
+				<check_box label="Copia" name="CheckNextOwnerCopy" tool_tip="Il proprietario successivo può prendere infinite copie di questo oggetto. Le copie mantengono le informazioni sul creatore, e non possono avere permessi maggiori di quelli posseduti dall&apos;oggetto copiato."/>
+				<check_box label="Trasferisci" name="CheckNextOwnerTransfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto."/>
 			</panel>
-			<check_box label="In vendita" name="CheckPurchase"/>
-			<combo_box name="ComboBoxSaleType">
+			<check_box label="In vendita" name="CheckPurchase" tool_tip="Permette alla gente di comprare questo oggetto, il suo contenuto o la sua copia virtuale ad un prezzo stabilito."/>
+			<combo_box name="ComboBoxSaleType" tool_tip="Decidi se vuoi che il compratore riceva una copia, una copia del contenuto o l&apos;oggetto stesso.">
 				<combo_box.item label="Copia" name="Copy"/>
 				<combo_box.item label="Contenuti" name="Contents"/>
 				<combo_box.item label="Originale" name="Original"/>
 			</combo_box>
-			<spinner label="Prezzo: L$" name="Edit Cost"/>
+			<spinner label="Prezzo: L$" name="Edit Cost" tool_tip="Costo oggetto."/>
 		</panel>
 	</scroll_container>
 	<panel name="button_panel">
diff --git a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml
index aabefd7d3c..4736644dd4 100644
--- a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml
@@ -1,32 +1,74 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="object properties" title="Profilo dell&apos;oggetto">
-	<panel.string name="text deed continued">Cessione</panel.string>
-	<panel.string name="text deed">Cessione</panel.string>
-	<panel.string name="text modify info 1">Tu puoi modificare questo oggetto</panel.string>
-	<panel.string name="text modify info 2">Tu puoi modificare questi oggetti</panel.string>
-	<panel.string name="text modify info 3">Non puoi modificare questo oggetto</panel.string>
-	<panel.string name="text modify info 4">Non puoi modificare questi oggetti</panel.string>
-	<panel.string name="text modify info 5">Questo oggetto non può essere modificato attraverso il confine di una regione</panel.string>
-	<panel.string name="text modify info 6">Questi oggetti non possono essere modificati attraverso il confine di una regione</panel.string>
-	<panel.string name="text modify warning">Questo oggetto ha parti collegate</panel.string>
-	<panel.string name="Cost Default">Prezzo: L$</panel.string>
-	<panel.string name="Cost Total">Prezzo totale: L$</panel.string>
-	<panel.string name="Cost Per Unit">Prezzo per: L$</panel.string>
-	<panel.string name="Cost Mixed">Prezzo misto</panel.string>
-	<panel.string name="Sale Mixed">Vendita mista</panel.string>
+	<panel.string name="text deed continued">
+		Cessione
+	</panel.string>
+	<panel.string name="text deed">
+		Cessione
+	</panel.string>
+	<panel.string name="text modify info 1">
+		Tu puoi modificare questo oggetto
+	</panel.string>
+	<panel.string name="text modify info 2">
+		Tu puoi modificare questi oggetti
+	</panel.string>
+	<panel.string name="text modify info 3">
+		Non puoi modificare questo oggetto
+	</panel.string>
+	<panel.string name="text modify info 4">
+		Non puoi modificare questi oggetti
+	</panel.string>
+	<panel.string name="text modify info 5">
+		Questo oggetto non può essere modificato attraverso il confine di una regione
+	</panel.string>
+	<panel.string name="text modify info 6">
+		Questi oggetti non possono essere modificati attraverso il confine di una regione
+	</panel.string>
+	<panel.string name="text modify warning">
+		Questo oggetto ha parti collegate
+	</panel.string>
+	<panel.string name="Cost Default">
+		Prezzo: L$
+	</panel.string>
+	<panel.string name="Cost Total">
+		Prezzo totale: L$
+	</panel.string>
+	<panel.string name="Cost Per Unit">
+		Prezzo per: L$
+	</panel.string>
+	<panel.string name="Cost Mixed">
+		Prezzo misto
+	</panel.string>
+	<panel.string name="Sale Mixed">
+		Vendita mista
+	</panel.string>
 	<text name="title" value="Profilo dell&apos;oggetto"/>
 	<text name="where" value="(in Second Life)"/>
 	<panel label="" name="properties_panel">
-		<text name="Name:">Nome:</text>
-		<text name="Description:">Descrizione:</text>
-		<text name="CreatorNameLabel">Ideatore:</text>
-		<text name="Owner:">Proprietario:</text>
-		<text name="Group_label">Gruppo:</text>
+		<text name="Name:">
+			Nome:
+		</text>
+		<line_editor name="Object Name" tool_tip="Il nome è limitato a 63 caratteri. Prim con nomi più lunghi verranno accorciati. I nomi possono avere solamente caratteri stampabili facenti parte del codice ASCII-7 (non esteso), con l&apos;eccezione della barra verticale &apos;|&apos;."/>
+		<text name="Description:">
+			Descrizione:
+		</text>
+		<line_editor name="Object Description" tool_tip="Quando la dicitura &quot;Vedi suggerimenti su tutti gli oggetti&quot; è selezionata nelle impostazioni del Viewer, passando il mouse sopra un oggetto si vedrà la sua descrizione. La descrizione dei Prim è limitata a 127 bytes. Se più lunga, verrá troncata."/>
+		<text name="CreatorNameLabel">
+			Ideatore:
+		</text>
+		<text name="Owner:">
+			Proprietario:
+		</text>
+		<text name="Group_label">
+			Gruppo:
+		</text>
 		<button name="button set group" tool_tip="Scegli un gruppo con cui condividere i diritti relativi all&apos;oggetto"/>
 		<name_box initial_value="Caricamento in corso..." name="Group Name Proxy"/>
 		<button label="Cessione" label_selected="Cessione" name="button deed" tool_tip="Con una cessione si trasferisce il bene con i diritti al proprietario successivo Gli oggetti in proprietà condivisa di gruppo possono essere ceduti soltanto da un funzionario del gruppo."/>
-		<text name="label click action">Fai clic per:</text>
-		<combo_box name="clickaction">
+		<text name="label click action">
+			Fai clic per:
+		</text>
+		<combo_box name="clickaction" tool_tip="Con l&apos;azione &quot;clic singolo&quot; puoi interagire con un oggetto semplicemente cliccandolo una volta. Ogni azione &quot;clic singolo&quot; ha un cursore speciale che indica il suo effetto. Alcune azioni &quot;clic singolo&quot; hanno dei requisiti per funzionare. Ad esempio per il comando &quot;Touch and Pay&quot; sono necessari degli script.">
 			<combo_box.item label="Tocca (predefinito)" name="Touch/grab(default)"/>
 			<combo_box.item label="Siediti sull&apos;oggetto" name="Sitonobject"/>
 			<combo_box.item label="Acquista oggetto" name="Buyobject"/>
@@ -35,37 +77,59 @@
 			<combo_box.item label="Ingrandisci" name="Zoom"/>
 		</combo_box>
 		<panel name="perms_inv">
-			<text name="perm_modify">Tu puoi modificare questo oggetto</text>
-			<text name="Anyone can:">Chiunque:</text>
-			<check_box label="Copia" name="checkbox allow everyone copy"/>
-			<check_box label="Sposta" name="checkbox allow everyone move"/>
-			<text name="GroupLabel">Gruppo:</text>
+			<text name="perm_modify">
+				Tu puoi modificare questo oggetto
+			</text>
+			<text name="Anyone can:">
+				Chiunque:
+			</text>
+			<check_box label="Copia" name="checkbox allow everyone copy" tool_tip="Chiunque può prendere una copia di questo oggetto. L&apos;oggetto e tutti i suoi contenuti devono avere il permesso di copia e trasferimento."/>
+			<check_box label="Sposta" name="checkbox allow everyone move" tool_tip="Chiunque può muovere l&apos;oggetto."/>
+			<text name="GroupLabel">
+				Gruppo:
+			</text>
 			<check_box label="Condividi" name="checkbox share with group" tool_tip="Consenti a tutti i membri del gruppo selezionato di condividere i tuoi diritti di modifica di questo oggetto. Per attivare le restrizioni per ruolo devi prima effettuare la cessione."/>
-			<text name="NextOwnerLabel">Proprietario successivo:</text>
-			<check_box label="Modifica" name="checkbox next owner can modify"/>
-			<check_box label="Copia" name="checkbox next owner can copy"/>
+			<text name="NextOwnerLabel">
+				Proprietario successivo:
+			</text>
+			<check_box label="Modifica" name="checkbox next owner can modify" tool_tip="Il prossimo proprietario può modificare le proprietà dell&apos;oggetto come il nome o la scala."/>
+			<check_box label="Copia" name="checkbox next owner can copy" tool_tip="Il proprietario successivo può prendere infinite copie di questo oggetto. Le copie mantengono le informazioni sul creatore, e non possono avere permessi maggiori di quelli posseduti dall&apos;oggetto copiato."/>
 			<check_box label="Trasferisci" name="checkbox next owner can transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/>
 		</panel>
-		<check_box label="In vendita" name="checkbox for sale"/>
-		<combo_box name="sale type">
+		<check_box label="In vendita" name="checkbox for sale" tool_tip="Permette alla gente di comprare questo oggetto, il suo contenuto o la sua copia virtuale ad un prezzo stabilito."/>
+		<combo_box name="sale type" tool_tip="Decidi se vuoi che il compratore riceva una copia, una copia del contenuto o l&apos;oggetto stesso.">
 			<combo_box.item label="Copia" name="Copy"/>
 			<combo_box.item label="Contenuto" name="Contents"/>
 			<combo_box.item label="Originale" name="Original"/>
 		</combo_box>
-		<spinner label="Prezzo: L$" name="Edit Cost"/>
+		<spinner label="Prezzo: L$" name="Edit Cost" tool_tip="Costo oggetto."/>
 		<check_box label="Mostra nella ricerca" name="search_check" tool_tip="Permetti alle persone di vedere questo oggetto nei risultati della ricerca"/>
-		<text name="pathfinding_attributes_label">Attributi pathfinding:</text>
-		<text name="B:">B:</text>
-		<text name="O:">O:</text>
-		<text name="G:">G:</text>
-		<text name="E:">E:</text>
-		<text name="N:">N:</text>
-		<text name="F:">F:</text>
+		<text name="pathfinding_attributes_label">
+			Attributi pathfinding:
+		</text>
+		<text name="B:">
+			B:
+		</text>
+		<text name="O:">
+			O:
+		</text>
+		<text name="G:">
+			G:
+		</text>
+		<text name="E:">
+			E:
+		</text>
+		<text name="N:">
+			N:
+		</text>
+		<text name="F:">
+			F:
+		</text>
 	</panel>
 	<panel name="button_panel">
-		<button label="Apri" name="open_btn"/>
-		<button label="Paga" name="pay_btn"/>
-		<button label="Acquista" name="buy_btn"/>
-		<button label="Dettagli" name="details_btn"/>
+		<button label="Apri" name="open_btn" tool_tip="Apri per vedere i Contenuti dell&apos;Oggetto."/>
+		<button label="Paga" name="pay_btn" tool_tip="Apri finestra di Pagamento. L&apos;oggetto deve avere uno script di pagamento affinchè tutto ciò funzioni."/>
+		<button label="Acquista" name="buy_btn" tool_tip="Apri finestra Acquisto. È necessario che l&apos;oggetto sia impostato per la vendita."/>
+		<button label="Dettagli" name="details_btn" tool_tip="Apri finestra Ispezione oggetto."/>
 	</panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index be3acc14b3..11dbf8f96e 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -2256,7 +2256,7 @@ Se continui a ricevere questo messaggio, contatta l&apos;assistenza Second Life
 		Petto
 	</string>
 	<string name="ATTACH_HEAD">
-		Testa
+		Cranio
 	</string>
 	<string name="ATTACH_LSHOULDER">
 		Spalla sinistra
@@ -2277,7 +2277,7 @@ Se continui a ricevere questo messaggio, contatta l&apos;assistenza Second Life
 		Piede destro
 	</string>
 	<string name="ATTACH_BACK">
-		Indietro
+		Spina dorsale
 	</string>
 	<string name="ATTACH_PELVIS">
 		Pelvi
@@ -2334,7 +2334,7 @@ Se continui a ricevere questo messaggio, contatta l&apos;assistenza Second Life
 		Polpaccio sinistro
 	</string>
 	<string name="ATTACH_BELLY">
-		Addome
+		Stomaco
 	</string>
 	<string name="ATTACH_LEFT_PEC">
 		Petto sinistro
diff --git a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml
index 1b5a745cc4..b34fd192a9 100644
--- a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml
@@ -38,17 +38,17 @@
 	<text name="GroupLabel">
 		グループ:
 	</text>
-	<check_box label="共有" name="share_with_group"/>
+	<check_box label="共有" name="share_with_group" tool_tip="設定したグループのメンバー全員にこのオブジェクトの修正権限を与えます。譲渡しない限り、役割制限を有効にはできません。"/>
 	<text name="AnyoneLabel">
 		全員:
 	</text>
-	<check_box label="コピー" name="everyone_copy"/>
+	<check_box label="コピー" name="everyone_copy" tool_tip="オブジェクトのコピーは誰でも受け取ることができます。オブジェクトとそのオブジェクトの中身はすべて、コピーまたは譲渡できるように設定する必要があります"/>
 	<text name="NextOwnerLabel">
 		次の所有者:
 	</text>
-	<check_box label="修正" name="next_owner_modify"/>
-	<check_box label="コピー" name="next_owner_copy"/>
-	<check_box initial_value="true" label="再販・プレゼント" name="next_owner_transfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販することができます"/>
+	<check_box label="修正" name="next_owner_modify" tool_tip="次の所有者は、アイテム名などのプロパティ内容を編集したり、このオブジェクトのサイズを変更することができます。"/>
+	<check_box label="コピー" name="next_owner_copy" tool_tip="次の所有者は、このオブジェクトを無制限にコピーできます。コピーには制作者の情報が含まれ、コピー元のアイテムと違って許可などに関し制限があります。"/>
+	<check_box initial_value="true" label="再販・プレゼント" name="next_owner_transfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販できます。"/>
 	<button label="OK" name="ok"/>
 	<button label="適用" name="apply"/>
 	<button label="キャンセル" name="close"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_my_scripts.xml b/indra/newview/skins/default/xui/ja/floater_my_scripts.xml
new file mode 100644
index 0000000000..c691e37613
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_my_scripts.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="myscripts" title="スクリプト"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_preferences.xml b/indra/newview/skins/default/xui/ja/floater_preferences.xml
index 7482c4772a..4a316ef606 100644
--- a/indra/newview/skins/default/xui/ja/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preferences.xml
@@ -5,6 +5,9 @@
 	</floater.string>
 	<button label="OK" label_selected="OK" name="OK"/>
 	<button label="取り消し" label_selected="取り消し" name="Cancel"/>
+	<panel name="search_panel">
+		<search_editor label="設定の検索" name="search_prefs_edit" tool_tip="検索したい内容をここに入力してください。設定の名前またはコメントに部分的に一致する結果が表示されます。"/>
+	</panel>
 	<tab_container name="pref core">
 		<panel label="一般" name="general"/>
 		<panel label="グラフィック" name="display"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml
index a67916b50f..d21913919c 100644
--- a/indra/newview/skins/default/xui/ja/floater_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_tools.xml
@@ -172,9 +172,11 @@
 			<text name="Name:">
 				名前:
 			</text>
+			<line_editor name="Object Name" tool_tip="使用できる名前の文字数は最大 63 文字までです。長いプリム名は短縮されます。名前に使用できる文字は ASCII-7 (非拡張)に含まれる印字可能な文字のみです(縦線「|」は例外)。"/>
 			<text name="Description:">
 				説明:
 			</text>
+			<line_editor name="Object Description" tool_tip="ビューワの設定で [すべてのオブジェクト上でヒントを表示] が選択されている場合、オブジェクトにマウスのポインタをかざすとそのオブジェクトの説明がポップアップ表示されます。プリムの説明は最大 127 バイトまでに制限されているため、それよりも長い文字列は切り捨てられます。"/>
 			<text name="Creator:">
 				制作者:
 			</text>
@@ -197,7 +199,7 @@
 			<text name="label click action">
 				クリックで:
 			</text>
-			<combo_box name="clickaction">
+			<combo_box name="clickaction" tool_tip="マウスを 1 回左クリックすると、オブジェクトに対してアクションを起こせるようになります。各クリックアクションには、何ができるかを示す特別なカーソルがあります。クリックアクションによっては、動作要件が必要なものもあります。たとえば、[タッチ] や [支払い] にはスクリプトが必要になるなどです">
 				<combo_box.item label="触る(デフォルト)" name="Touch/grab(default)"/>
 				<combo_box.item label="オブジェクトに座る" name="Sitonobject"/>
 				<combo_box.item label="オブジェクトを購入する" name="Buyobject"/>
@@ -205,9 +207,9 @@
 				<combo_box.item label="開く" name="Open"/>
 				<combo_box.item label="ズームする" name="Zoom"/>
 			</combo_box>
-			<check_box label="販売対象:" name="checkbox for sale"/>
-			<spinner label="L$" name="Edit Cost"/>
-			<combo_box name="sale type">
+			<check_box label="販売対象:" name="checkbox for sale" tool_tip="このオブジェクトやオブジェクトの中身が購入できるようになるか、指定価格でインワールドにコピーできるようになります。"/>
+			<spinner label="L$" name="Edit Cost" tool_tip="オブジェクトの価格。"/>
+			<combo_box name="sale type" tool_tip="購入者がコピー、コピーの中身、またはアイテム自体を受け取るのか選択してください。">
 				<combo_box.item label="コピー" name="Copy"/>
 				<combo_box.item label="中身" name="Contents"/>
 				<combo_box.item label="オリジナル" name="Original"/>
@@ -220,14 +222,14 @@
 				<text name="Anyone can:">
 					全員:
 				</text>
-				<check_box label="移動" name="checkbox allow everyone move"/>
-				<check_box label="コピー" name="checkbox allow everyone copy"/>
+				<check_box label="移動" name="checkbox allow everyone move" tool_tip="オブジェクトは誰でも動かすことができます。"/>
+				<check_box label="コピー" name="checkbox allow everyone copy" tool_tip="オブジェクトのコピーは誰でも受け取ることができます。オブジェクトとそのオブジェクトの中身はすべて、コピーまたは譲渡できるように設定する必要があります。"/>
 				<text name="Next owner can:">
 					次の所有者:
 				</text>
-				<check_box label="修正" name="checkbox next owner can modify"/>
-				<check_box label="コピー" name="checkbox next owner can copy"/>
-				<check_box label="再販・プレゼント" name="checkbox next owner can transfer" tool_tip="次に所有する人は、このオブジェクトを他人にあげたり再販できます"/>
+				<check_box label="修正" name="checkbox next owner can modify" tool_tip="次の所有者は、アイテム名などのプロパティ内容を編集したり、このオブジェクトのサイズを変更することができます。"/>
+				<check_box label="コピー" name="checkbox next owner can copy" tool_tip="次の所有者は、このオブジェクトを無制限にコピーできます。コピーには制作者の情報が含まれ、コピー元のアイテムと違って許可などに関し制限があります。"/>
+				<check_box label="再販・プレゼント" name="checkbox next owner can transfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販できます。"/>
 				<text name="B:">
 					B:
 				</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_top_objects.xml b/indra/newview/skins/default/xui/ja/floater_top_objects.xml
index cc81ead116..c57f91f619 100644
--- a/indra/newview/skins/default/xui/ja/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/ja/floater_top_objects.xml
@@ -4,7 +4,7 @@
 		トップ・スクリプト
 	</floater.string>
 	<floater.string name="top_scripts_text">
-		[COUNT]スクリプト全体の実行時間は[TIME]ミリ秒。
+		[COUNT] スクリプトには合計で [TIME] 分かかり、[MEMORY] KB 使用しています。
 	</floater.string>
 	<floater.string name="scripts_score_label">
 		時間
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index 93d15517cd..a7c894ea69 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -9,6 +9,7 @@
 		<menu_item_call label="場所..." name="Places"/>
 		<menu_item_call label="ピック..." name="Picks"/>
 		<menu_item_call label="体験..." name="Experiences"/>
+		<menu_item_call label="スクリプト…" name="MyScripts"/>
 		<menu_item_call label="カメラコントロール..." name="Camera Controls"/>
 		<menu label="ムーブメント" name="Movement">
 			<menu_item_call label="座る" name="Sit Down Here"/>
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index 315e35bc41..a73891c9eb 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -1620,9 +1620,25 @@ SHA1 フィンガープリント: [MD5_DIGEST]
 [DOWNLOAD_PATH]
 	</notification>
 	<notification name="RequiredUpdate">
-		ログインするには、バージョン [VERSION] が必要です。このアップデートは自動的に行われるものですが、まだ実行されてないようです。https://secondlife.com/support/downloads/ からダウンロードしてください。
+		ログインするには、バージョン [VERSION] が必要です。
+https://secondlife.com/support/downloads/ からダウンロードしてください。
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
+	<notification name="PauseForUpdate">
+		ログインするには、バージョン [VERSION] が必要です。
+[OK] をクリックして、ダウンロードとインストールを開始します。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="OptionalUpdateReady">
+		バージョン [VERSION] のダウンロードが完了し、インストールの準備ができました。
+[OK] をクリックして、インストールを開始します。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="PromptOptionalUpdate">
+		バージョン [VERSION] のダウンロードが完了し、インストールの準備ができました。
+続けますか?
+		<usetemplate canceltext="あとで" name="yesnocancelbuttons" notext="スキップ" yestext="インストール"/>
+	</notification>
 	<notification name="LoginFailedUnknown">
 		申し訳ありませんが、不明な理由によってログインに失敗しました。このメッセージが何度も出る場合は、[SUPPORT_SITE] をご確認ください。
 		<usetemplate name="okbutton" yestext="終了"/>
@@ -3098,15 +3114,6 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
 			<button name="Deny" text="拒否"/>
 		</form>
 	</notification>
-	<notification name="UnknownScriptQuestion">
-		&apos;[NAME]&apos; が所有する &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; によってリクエストされたランタイムスクリプト権限がビューアによって認識されないため、許可できません。
-
-この権限を許可するには、ビューアを [DOWNLOADURL] からの最新バージョンにアップデートしてください。
-		<form name="form">
-			<button name="Deny" text="Ok"/>
-			<button name="Mute" text="ブロック"/>
-		</form>
-	</notification>
 	<notification name="ScriptDialog">
 		[NAME] の「&lt;nolink&gt;[TITLE]&lt;/nolink&gt;」
 [MESSAGE]
diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
index 3f3845e491..139c4d7fdd 100644
--- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
@@ -1,16 +1,31 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="status">
-	<panel.string name="packet_loss_tooltip">パケット損失</panel.string>
-	<panel.string name="bandwidth_tooltip">帯域幅</panel.string>
-	<panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>
-	<panel.string name="timeTooltip">[year, datetime, slt] [month, datetime, slt] [day, datetime, slt] ([weekday, datetime, slt])</panel.string>
-	<panel.string name="buycurrencylabel">L$ [AMT]</panel.string>
+	<panel.string name="packet_loss_tooltip">
+		パケット損失
+	</panel.string>
+	<panel.string name="bandwidth_tooltip">
+		帯域幅
+	</panel.string>
+	<panel.string name="time">
+		[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+	</panel.string>
+	<panel.string name="timeTooltip">
+		[year, datetime, slt] [month, datetime, slt] [day, datetime, slt] ([weekday, datetime, slt])
+	</panel.string>
+	<panel.string name="buycurrencylabel">
+		L$ [AMT]
+	</panel.string>
+	<panel name="menu_search_panel">
+		<search_editor label="メニューの検索" name="search_menu_edit" tool_tip="検索したい内容をここに入力してください。メニューに部分的に一致する結果が表示されます。"/>
+	</panel>
 	<panel left="-391" name="balance_bg" width="160">
 		<text name="balance" tool_tip="クリックして L$ 残高を更新" value="L$??"/>
 		<button label="L$ の購入" name="buyL" tool_tip="クリックして L$ を購入します"/>
 		<button label="店" name="goShop" tool_tip="Second Life マーケットプレイスを開く" width="40"/>
 	</panel>
-	<text name="TimeText" tool_tip="現在時刻(太平洋)">24:00 AM PST</text>
+	<text name="TimeText" tool_tip="現在時刻(太平洋)">
+		24:00 AM PST
+	</text>
 	<button name="media_toggle_btn" tool_tip="すべてのメディアを開始・停止(音楽、ビデオ、Web ページ)"/>
 	<button name="volume_btn" tool_tip="グローバル音量設定"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml
index 35e9b66bc8..3bdf8405e7 100644
--- a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml
@@ -34,9 +34,11 @@
 			<text name="LabelItemNameTitle">
 				名前:
 			</text>
+			<line_editor name="LabelItemName" tool_tip="使用できる名前の文字数は最大 63 文字までです。長いプリム名は短縮されます。名前に使用できる文字は ASCII-7 (非拡張)に含まれる印字可能な文字のみです(縦線「|」は例外)。"/>
 			<text name="LabelItemDescTitle">
 				説明:
 			</text>
+			<line_editor name="LabelItemDesc" tool_tip="ビューワの設定で [すべてのオブジェクト上でヒントを表示] が選択されている場合、オブジェクトにマウスのポインタをかざすとそのオブジェクトの説明がポップアップ表示されます。プリムの説明は最大 127 バイトまでに制限されているため、それよりも長い文字列は切り捨てられます。"/>
 			<text name="LabelCreatorTitle">
 				制作者:
 			</text>
@@ -59,7 +61,7 @@
 				<text name="AnyoneLabel">
 					全員:
 				</text>
-				<check_box label="コピー" name="CheckEveryoneCopy"/>
+				<check_box label="コピー" name="CheckEveryoneCopy" tool_tip="オブジェクトのコピーは誰でも受け取ることができます。オブジェクトとそのオブジェクトの中身はすべて、コピーまたは譲渡できるように設定する必要があります。"/>
 				<text name="GroupLabel">
 					グループ:
 				</text>
@@ -67,17 +69,17 @@
 				<text name="NextOwnerLabel">
 					次の所有者:
 				</text>
-				<check_box label="修正" name="CheckNextOwnerModify"/>
-				<check_box label="コピー" name="CheckNextOwnerCopy"/>
-				<check_box label="再販・プレゼント" name="CheckNextOwnerTransfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販できます"/>
+				<check_box label="修正" name="CheckNextOwnerModify" tool_tip="次の所有者は、アイテム名などのプロパティ内容を編集したり、このオブジェクトのサイズを変更することができます。"/>
+				<check_box label="コピー" name="CheckNextOwnerCopy" tool_tip="次の所有者は、このオブジェクトを無制限にコピーできます。コピーには制作者の情報が含まれ、コピー元のアイテムと違って許可などに関し制限があります。"/>
+				<check_box label="再販・プレゼント" name="CheckNextOwnerTransfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販できます。"/>
 			</panel>
-			<check_box label="販売中" name="CheckPurchase"/>
-			<combo_box name="ComboBoxSaleType">
+			<check_box label="販売中" name="CheckPurchase" tool_tip="このオブジェクトやオブジェクトの中身が購入できるようになるか、指定価格でインワールドにコピーできるようになります。"/>
+			<combo_box name="ComboBoxSaleType" tool_tip="購入者がコピー、コピーの中身、またはアイテム自体を受け取るのか選択してください。">
 				<combo_box.item label="コピー" name="Copy"/>
 				<combo_box.item label="コンテンツ" name="Contents"/>
 				<combo_box.item label="オリジナル" name="Original"/>
 			</combo_box>
-			<spinner label="価格: L$" name="Edit Cost"/>
+			<spinner label="価格: L$" name="Edit Cost" tool_tip="オブジェクトの価格。"/>
 		</panel>
 	</scroll_container>
 	<panel name="button_panel">
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
index 858307800b..52f093e154 100644
--- a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
@@ -1,32 +1,74 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="object properties" title="オブジェクトのプロフィール">
-	<panel.string name="text deed continued">譲渡</panel.string>
-	<panel.string name="text deed">譲渡</panel.string>
-	<panel.string name="text modify info 1">このオブジェクトを修正できます</panel.string>
-	<panel.string name="text modify info 2">これらのオブジェクトを修正できます</panel.string>
-	<panel.string name="text modify info 3">このオブジェクトを修正できません</panel.string>
-	<panel.string name="text modify info 4">これらのオブジェクトを修正できません</panel.string>
-	<panel.string name="text modify info 5">地域(リージョン)の境界を越えてこのオブジェクトを修正できません</panel.string>
-	<panel.string name="text modify info 6">地域(リージョン)の境界を越えてこれらのオブジェクトを修正できません</panel.string>
-	<panel.string name="text modify warning">このオブジェクトには、パーツがリンクされています</panel.string>
-	<panel.string name="Cost Default">価格: L$</panel.string>
-	<panel.string name="Cost Total">合計価格: L$</panel.string>
-	<panel.string name="Cost Per Unit">Price Per: L$</panel.string>
-	<panel.string name="Cost Mixed">Mixed Price</panel.string>
-	<panel.string name="Sale Mixed">Mixed Sale</panel.string>
+	<panel.string name="text deed continued">
+		譲渡
+	</panel.string>
+	<panel.string name="text deed">
+		譲渡
+	</panel.string>
+	<panel.string name="text modify info 1">
+		このオブジェクトを修正できます
+	</panel.string>
+	<panel.string name="text modify info 2">
+		これらのオブジェクトを修正できます
+	</panel.string>
+	<panel.string name="text modify info 3">
+		このオブジェクトを修正できません
+	</panel.string>
+	<panel.string name="text modify info 4">
+		これらのオブジェクトを修正できません
+	</panel.string>
+	<panel.string name="text modify info 5">
+		地域(リージョン)の境界を越えてこのオブジェクトを修正できません
+	</panel.string>
+	<panel.string name="text modify info 6">
+		地域(リージョン)の境界を越えてこれらのオブジェクトを修正できません
+	</panel.string>
+	<panel.string name="text modify warning">
+		このオブジェクトには、パーツがリンクされています
+	</panel.string>
+	<panel.string name="Cost Default">
+		価格: L$
+	</panel.string>
+	<panel.string name="Cost Total">
+		合計価格: L$
+	</panel.string>
+	<panel.string name="Cost Per Unit">
+		Price Per: L$
+	</panel.string>
+	<panel.string name="Cost Mixed">
+		Mixed Price
+	</panel.string>
+	<panel.string name="Sale Mixed">
+		Mixed Sale
+	</panel.string>
 	<text name="title" value="オブジェクトのプロフィール"/>
 	<text name="where" value="(インワールド)"/>
 	<panel label="" name="properties_panel">
-		<text name="Name:">名前:</text>
-		<text name="Description:">説明:</text>
-		<text name="CreatorNameLabel">制作者:</text>
-		<text name="Owner:">所有者:</text>
-		<text name="Group_label">グループ:</text>
+		<text name="Name:">
+			名前:
+		</text>
+		<line_editor name="Object Name" tool_tip="使用できる名前の文字数は最大 63 文字までです。長いプリム名は短縮されます。名前に使用できる文字は ASCII-7 (非拡張)に含まれる印字可能な文字のみです(縦線「|」は例外)。"/>
+		<text name="Description:">
+			説明:
+		</text>
+		<line_editor name="Object Description" tool_tip="ビューワの設定で [すべてのオブジェクト上でヒントを表示] が選択されている場合、オブジェクトにマウスのポインタをかざすとそのオブジェクトの説明がポップアップ表示されます。プリムの説明は最大 127 バイトまでに制限されているため、それよりも長い文字列は切り捨てられます。"/>
+		<text name="CreatorNameLabel">
+			制作者:
+		</text>
+		<text name="Owner:">
+			所有者:
+		</text>
+		<text name="Group_label">
+			グループ:
+		</text>
 		<button name="button set group" tool_tip="このオブジェクト権限を共有するグループを選択します"/>
 		<name_box initial_value="ローディング..." name="Group Name Proxy"/>
 		<button label="譲渡" label_selected="譲渡" name="button deed" tool_tip="このアイテムを譲渡すると「次の所有者」の権限が適用されます。 グループ共有オブジェクトは、グループのオフィサーが譲渡できます。"/>
-		<text name="label click action">クリックで:</text>
-		<combo_box name="clickaction">
+		<text name="label click action">
+			クリックで:
+		</text>
+		<combo_box name="clickaction" tool_tip="マウスを 1 回左クリックすると、オブジェクトに対してアクションを起こせるようになります。各クリックアクションには、何ができるかを示す特別なカーソルがあります。クリックアクションによっては、動作要件が必要なものもあります。たとえば、[タッチ] や [支払い] にはスクリプトが必要になるなどです">
 			<combo_box.item label="触る(デフォルト)" name="Touch/grab(default)"/>
 			<combo_box.item label="オブジェクトに座る" name="Sitonobject"/>
 			<combo_box.item label="オブジェクトを買う" name="Buyobject"/>
@@ -35,37 +77,59 @@
 			<combo_box.item label="ズーム" name="Zoom"/>
 		</combo_box>
 		<panel name="perms_inv">
-			<text name="perm_modify">このオブジェクトを修正できます</text>
-			<text name="Anyone can:">全員:</text>
-			<check_box label="コピー" name="checkbox allow everyone copy"/>
-			<check_box label="移動" name="checkbox allow everyone move"/>
-			<text name="GroupLabel">グループ:</text>
+			<text name="perm_modify">
+				このオブジェクトを修正できます
+			</text>
+			<text name="Anyone can:">
+				全員:
+			</text>
+			<check_box label="コピー" name="checkbox allow everyone copy" tool_tip="オブジェクトのコピーは誰でも受け取ることができます。オブジェクトとそのオブジェクトの中身はすべて、コピーまたは譲渡できるように設定する必要があります。"/>
+			<check_box label="移動" name="checkbox allow everyone move" tool_tip="オブジェクトは誰でも動かすことができます。"/>
+			<text name="GroupLabel">
+				グループ:
+			</text>
 			<check_box label="共有" name="checkbox share with group" tool_tip="設定したグループのメンバー全員にこのオブジェクトの修正権限を与えます。 譲渡しない限り、役割制限を有効にはできません。"/>
-			<text name="NextOwnerLabel">次の所有者:</text>
-			<check_box label="修正" name="checkbox next owner can modify"/>
-			<check_box label="コピー" name="checkbox next owner can copy"/>
+			<text name="NextOwnerLabel">
+				次の所有者:
+			</text>
+			<check_box label="修正" name="checkbox next owner can modify" tool_tip="次の所有者は、アイテム名などのプロパティ内容を編集したり、このオブジェクトのサイズを変更することができます。"/>
+			<check_box label="コピー" name="checkbox next owner can copy" tool_tip="次の所有者は、このオブジェクトを無制限にコピーできます。コピーには制作者の情報が含まれ、コピー元のアイテムと違って許可などに関し制限があります。"/>
 			<check_box label="再販・プレゼント" name="checkbox next owner can transfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販できます"/>
 		</panel>
-		<check_box label="販売中" name="checkbox for sale"/>
-		<combo_box name="sale type">
+		<check_box label="販売中" name="checkbox for sale" tool_tip="このオブジェクトやオブジェクトの中身が購入できるようになるか、指定価格でインワールドにコピーできるようになります。"/>
+		<combo_box name="sale type" tool_tip="購入者がコピーを受け取るのか、コピーの中身を受け取るのか、またはアイテム自体を受け取るのかを選択してください。">
 			<combo_box.item label="コピー" name="Copy"/>
 			<combo_box.item label="中身" name="Contents"/>
 			<combo_box.item label="オリジナル" name="Original"/>
 		</combo_box>
-		<spinner label="価格: L$" name="Edit Cost"/>
+		<spinner label="価格: L$" name="Edit Cost" tool_tip="オブジェクトの価格。"/>
 		<check_box label="検索に表示" name="search_check" tool_tip="このオブジェクトを検索結果に表示します"/>
-		<text name="pathfinding_attributes_label">パスファインディング属性:</text>
-		<text name="B:">B.</text>
-		<text name="O:">O:</text>
-		<text name="G:">G:</text>
-		<text name="E:">E:</text>
-		<text name="N:">N:</text>
-		<text name="F:">F:</text>
+		<text name="pathfinding_attributes_label">
+			パスファインディング属性:
+		</text>
+		<text name="B:">
+			B.
+		</text>
+		<text name="O:">
+			O:
+		</text>
+		<text name="G:">
+			G:
+		</text>
+		<text name="E:">
+			E:
+		</text>
+		<text name="N:">
+			N:
+		</text>
+		<text name="F:">
+			F:
+		</text>
 	</panel>
 	<panel name="button_panel">
-		<button label="開く" name="open_btn"/>
-		<button label="支払う" name="pay_btn"/>
-		<button label="買う" name="buy_btn"/>
-		<button label="詳細" name="details_btn"/>
+		<button label="開く" name="open_btn" tool_tip="[オブジェクトの中身] を開いて確認します。"/>
+		<button label="支払う" name="pay_btn" tool_tip="[支払い] ウィンドウを開きます。オブジェクトでこの動作を実行するには、支払い用のスクリプトが必要です。"/>
+		<button label="買う" name="buy_btn" tool_tip="[購入] ウィンドウを開きます。オブジェクトは販売用に設定する必要があります。"/>
+		<button label="詳細" name="details_btn" tool_tip="[オブジェクトを調べる] ウィンドウを開きます。"/>
 	</panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index 9116bba8bb..f0fcbab642 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -2270,7 +2270,7 @@ support@secondlife.com にお問い合わせください。
 		胸部
 	</string>
 	<string name="ATTACH_HEAD">
-		頭
+		頭蓋
 	</string>
 	<string name="ATTACH_LSHOULDER">
 		左肩
@@ -2291,7 +2291,7 @@ support@secondlife.com にお問い合わせください。
 		右足
 	</string>
 	<string name="ATTACH_BACK">
-		背中
+		背骨
 	</string>
 	<string name="ATTACH_PELVIS">
 		骨盤
@@ -2321,13 +2321,13 @@ support@secondlife.com にお問い合わせください。
 		右腕(上)
 	</string>
 	<string name="ATTACH_RLARM">
-		右腕(下)
+		右前腕
 	</string>
 	<string name="ATTACH_LUARM">
 		左腕(上)
 	</string>
 	<string name="ATTACH_LLARM">
-		左腕(下)
+		左前腕
 	</string>
 	<string name="ATTACH_RHIP">
 		右腰
@@ -2348,7 +2348,7 @@ support@secondlife.com にお問い合わせください。
 		左脚(下)
 	</string>
 	<string name="ATTACH_BELLY">
-		お腹
+		腹
 	</string>
 	<string name="ATTACH_LEFT_PEC">
 		左胸筋
diff --git a/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml b/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml
index 998fa8b2d6..a31b049345 100644
--- a/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml
@@ -38,16 +38,16 @@
 	<text name="GroupLabel">
 		Grupo:
 	</text>
-	<check_box label="Compartilhar" name="share_with_group"/>
+	<check_box label="Compartilhar" name="share_with_group" tool_tip="Permitir que todos os membros do grupo tenhas suas permissões de modificação para este objeto. Faça uma doação para ativar restrições de função."/>
 	<text name="AnyoneLabel">
 		Todos:
 	</text>
-	<check_box label="Copiar" name="everyone_copy"/>
+	<check_box label="Copiar" name="everyone_copy" tool_tip="Qualquer um pode fazer uma cópia do objeto. O objeto e todos os conteúdos devem ter permissão para cópia e transferência."/>
 	<text name="NextOwnerLabel">
 		Próximo proprietário:
 	</text>
-	<check_box label="Modificar" name="next_owner_modify"/>
-	<check_box label="Copiar" name="next_owner_copy"/>
+	<check_box label="Modificar" name="next_owner_modify" tool_tip="O próximo proprietário pode editar as propriedades, como o nome do item ou escala desse objeto."/>
+	<check_box label="Copiar" name="next_owner_copy" tool_tip="O próximo proprietário pode fazer cópias ilimitadas desse objeto. As cópias mantêm as informações do criador e nunca podem ser mais permissivo do que o item copiado."/>
 	<check_box initial_value="true" label="Transferir" name="next_owner_transfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/>
 	<button label="OK" name="ok"/>
 	<button label="Aplicar" name="apply"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_my_scripts.xml b/indra/newview/skins/default/xui/pt/floater_my_scripts.xml
new file mode 100644
index 0000000000..a355ad1242
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_my_scripts.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="myscripts" title="Meus Scripts"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_preferences.xml b/indra/newview/skins/default/xui/pt/floater_preferences.xml
index 8a2ef83a3b..b219e8cec9 100644
--- a/indra/newview/skins/default/xui/pt/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preferences.xml
@@ -5,6 +5,9 @@
 	</floater.string>
 	<button label="OK" label_selected="OK" name="OK"/>
 	<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
+	<panel name="search_panel">
+		<search_editor label="Buscar configurações" name="search_prefs_edit" tool_tip="Digite o termo de busca que você se interessar aqui. Os resultados serão exibidos para correspondências parciais de texto completo no nome ou no comentário da configuração."/>
+	</panel>
 	<tab_container name="pref core">
 		<panel label="Geral" name="general"/>
 		<panel label="Vídeo" name="display"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml
index 0c17624aa5..3875b403b1 100644
--- a/indra/newview/skins/default/xui/pt/floater_tools.xml
+++ b/indra/newview/skins/default/xui/pt/floater_tools.xml
@@ -172,9 +172,11 @@
 			<text name="Name:">
 				Nome:
 			</text>
+			<line_editor name="Object Name" tool_tip="O nome está limitado em 63 caracteres. Nomes prim maior são cortados. Os nomes podem consistir em caracteres impressos encontrados no conjunto de caracteres ASCII-7 (não estendido), com a exceção da barra/tupo vertical ‘|’."/>
 			<text name="Description:">
 				Descrição:
 			</text>
+			<line_editor name="Object Description" tool_tip="Quando as pessoas selecionam &apos;Passe o mouse em todos os objetos’ na configuração de visualização, eles verão a descrição dos objetos em uma janela pop-up sempre que passar o mouse por cima. A descrição prim é limitada em 127 bytes, qualquer string maior ficará truncada."/>
 			<text name="Creator:">
 				Criador:
 			</text>
@@ -191,7 +193,7 @@
 			<text name="label click action">
 				Clique para:
 			</text>
-			<combo_box name="clickaction">
+			<combo_box name="clickaction" tool_tip="Ao clicar, você pode interagir com um objeto com um clique no botão esquerdo do mouse. Cada ação de clicar tem um cursor especial indicador. Algumas ações de clique tem exigências para a função. Por exemplo, Tocar e Pagar exige scripts.">
 				<combo_box.item label="Tocar (padrão)" name="Touch/grab(default)"/>
 				<combo_box.item label="Sentar no objeto" name="Sitonobject"/>
 				<combo_box.item label="Comprar objeto" name="Buyobject"/>
@@ -199,9 +201,9 @@
 				<combo_box.item label="Abrir" name="Open"/>
 				<combo_box.item label="Zoom" name="Zoom"/>
 			</combo_box>
-			<check_box label="À venda" name="checkbox for sale"/>
-			<spinner label="L$" name="Edit Cost"/>
-			<combo_box name="sale type">
+			<check_box label="À venda" name="checkbox for sale" tool_tip="Permita que as pessoas comprem esse objeto, seu conteúdo ou copiá-lo no mundo virtual por um preço específico."/>
+			<spinner label="L$" name="Edit Cost" tool_tip="Custo do objeto."/>
+			<combo_box name="sale type" tool_tip="Selecione se o comprador receberá uma cópia. A cópia do conteúdo ou o próprio item.">
 				<combo_box.item label="Cópia" name="Copy"/>
 				<combo_box.item label="Conteúdo" name="Contents"/>
 				<combo_box.item label="Original" name="Original"/>
@@ -214,13 +216,13 @@
 				<text name="Anyone can:">
 					Todos:
 				</text>
-				<check_box label="Movimentar" name="checkbox allow everyone move"/>
-				<check_box label="Copiar" name="checkbox allow everyone copy"/>
+				<check_box label="Movimentar" name="checkbox allow everyone move" tool_tip="Qualquer pessoa pode mover o objeto."/>
+				<check_box label="Copiar" name="checkbox allow everyone copy" tool_tip="Qualquer um pode fazer uma cópia do objeto. O objeto e todos os conteúdos devem ter permissão para cópia e transferência."/>
 				<text name="Next owner can:">
 					Próximo proprietário:
 				</text>
-				<check_box label="Modificar" name="checkbox next owner can modify"/>
-				<check_box label="Copiar" left_delta="80" name="checkbox next owner can copy"/>
+				<check_box label="Modificar" name="checkbox next owner can modify" tool_tip="O próximo proprietário pode editar as propriedades, como o nome do item ou escala desse objeto."/>
+				<check_box label="Copiar" left_delta="80" name="checkbox next owner can copy" tool_tip="O próximo proprietário pode fazer cópias ilimitadas desse objeto. As cópias mantêm as informações do criador e nunca podem ser mais permissivo do que o item copiado."/>
 				<check_box label="Transferir" left_delta="67" name="checkbox next owner can transfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/>
 				<text name="B:">
 					B:
diff --git a/indra/newview/skins/default/xui/pt/floater_top_objects.xml b/indra/newview/skins/default/xui/pt/floater_top_objects.xml
index f37b5be23f..b55fa10c0d 100644
--- a/indra/newview/skins/default/xui/pt/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/pt/floater_top_objects.xml
@@ -4,7 +4,7 @@
 		Principais Scripts
 	</floater.string>
 	<floater.string name="top_scripts_text">
-		[COUNT] scripts tomando um total de [TIME] ms
+		[COUNT] scripts levam um total de [TIME] ms e usando [MEMORY] KB
 	</floater.string>
 	<floater.string name="scripts_score_label">
 		Tempo
diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml
index 1d0953e756..cff26196cc 100644
--- a/indra/newview/skins/default/xui/pt/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml
@@ -9,6 +9,7 @@
 		<menu_item_call label="Lugares..." name="Places"/>
 		<menu_item_call label="Destaques..." name="Picks"/>
 		<menu_item_call label="Experiências..." name="Experiences"/>
+		<menu_item_call label="Meus Scripts..." name="MyScripts"/>
 		<menu_item_call label="Controles da câmera..." name="Camera Controls"/>
 		<menu label="Movimentos" name="Movement">
 			<menu_item_call label="Sentar" name="Sit Down Here"/>
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index b7a057e769..60607ee0b4 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -1580,9 +1580,25 @@ Por favor, ponha o objeto à venda e tente novamente.
 [DOWNLOAD_PATH]
 	</notification>
 	<notification name="RequiredUpdate">
-		Versão [VERSION] é obrigatório para efetuar login. Isto deveria ter sido atualizado por você, mas aparentemente não foi. Baixe a versão mais recente em https://secondlife.com/support/downloads/
+		Versão [VERSION] é obrigatório para efetuar login. 
+Baixe a versão mais recente em https://secondlife.com/support/downloads/
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
+	<notification name="PauseForUpdate">
+		Versão [VERSION] é obrigatório para efetuar login. 
+Clique em OK para baixar e instalar
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="OptionalUpdateReady">
+		A versão [VERSION] foi baixada e está pronta para ser instalada. 
+Clique em OK para instalar
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="PromptOptionalUpdate">
+		A versão [VERSION] foi baixada e está pronta para ser instalada. 
+Deseja prosseguir?
+		<usetemplate canceltext="Ainda não" name="yesnocancelbuttons" notext="Ignorar" yestext="Instalar"/>
+	</notification>
 	<notification name="LoginFailedUnknown">
 		Desculpe, motivo de falha de login desconhecido. Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE].
 		<usetemplate name="okbutton" yestext="Sair"/>
@@ -3040,15 +3056,6 @@ Não conceda acesso se você não entender completamente por que ele deseja aces
 			<button name="Deny" text="Negar"/>
 		</form>
 	</notification>
-	<notification name="UnknownScriptQuestion">
-		A permissão de script de tempo de execução solicitada por &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, um objeto de &apos;[NAME]&apos;, não é reconhecida pelo visualizador e não pode ser concedida.
-
-Para conceder essa permissão, atualize seu visualizador para a versão mais recente em [DOWNLOADURL].
-		<form name="form">
-			<button name="Deny" text="Ok"/>
-			<button name="Mute" text="Bloquear"/>
-		</form>
-	</notification>
 	<notification name="ScriptDialog">
 		&apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; de [NAME]
 [MESSAGE]
diff --git a/indra/newview/skins/default/xui/pt/panel_status_bar.xml b/indra/newview/skins/default/xui/pt/panel_status_bar.xml
index c35863734f..9e15f9a02c 100644
--- a/indra/newview/skins/default/xui/pt/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/pt/panel_status_bar.xml
@@ -1,16 +1,31 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="status">
-	<panel.string name="packet_loss_tooltip">Perda de pacote</panel.string>
-	<panel.string name="bandwidth_tooltip">Banda</panel.string>
-	<panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>
-	<panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>
-	<panel.string name="buycurrencylabel">L$ [AMT]</panel.string>
+	<panel.string name="packet_loss_tooltip">
+		Perda de pacote
+	</panel.string>
+	<panel.string name="bandwidth_tooltip">
+		Banda
+	</panel.string>
+	<panel.string name="time">
+		[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+	</panel.string>
+	<panel.string name="timeTooltip">
+		[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+	</panel.string>
+	<panel.string name="buycurrencylabel">
+		L$ [AMT]
+	</panel.string>
+	<panel name="menu_search_panel">
+		<search_editor label="Buscar Menus" name="search_menu_edit" tool_tip="Digite o termo de busca que você se interessar aqui. Os resultados serão exibidos para correspondências parciais de texto completo no menu."/>
+	</panel>
 	<panel left="-431" name="balance_bg" width="200">
 		<text name="balance" tool_tip="Atualizar saldo de L$" value="L$??"/>
 		<button label="Comprar L$" name="buyL" tool_tip="Comprar mais L$"/>
 		<button label="Comprar" name="goShop" tool_tip="Abrir Mercado do Second Life" width="80"/>
 	</panel>
-	<text name="TimeText" tool_tip="Hora atual (Pacífico)">24:00 AM PST</text>
+	<text name="TimeText" tool_tip="Hora atual (Pacífico)">
+		24:00 AM PST
+	</text>
 	<button name="media_toggle_btn" tool_tip="Tocar/Pausar todas mídias (música, vídeo, páginas web)"/>
 	<button name="volume_btn" tool_tip="Volume geral"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml
index 47ffffaf15..9afcb67d3d 100644
--- a/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml
@@ -34,9 +34,11 @@
 			<text name="LabelItemNameTitle">
 				Nome:
 			</text>
+			<line_editor name="LabelItemName" tool_tip="O nome está limitado em 63 caracteres. Nomes prim maior são cortados. Os nomes podem consistir em caracteres impressos encontrados no conjunto de caracteres ASCII-7 (não estendido), com a exceção da barra/tupo vertical ‘|’."/>
 			<text name="LabelItemDescTitle">
 				Descrição:
 			</text>
+			<line_editor name="LabelItemDesc" tool_tip="Quando as pessoas selecionam &apos;Passe o mouse em todos os objetos’ na configuração de visualização, eles verão a descrição dos objetos em uma janela pop-up sempre que passar o mouse por cima. A descrição prim é limitada em 127 bytes, qualquer string maior ficará truncada."/>
 			<text name="LabelCreatorTitle">
 				Criador:
 			</text>
@@ -59,7 +61,7 @@
 				<text name="AnyoneLabel">
 					Todos:
 				</text>
-				<check_box label="Copiar" name="CheckEveryoneCopy"/>
+				<check_box label="Copiar" name="CheckEveryoneCopy" tool_tip="Qualquer um pode fazer uma cópia do objeto. O objeto e todos os conteúdos devem ter permissão para cópia e transferência."/>
 				<text name="GroupLabel">
 					Grupo:
 				</text>
@@ -67,17 +69,17 @@
 				<text name="NextOwnerLabel">
 					Próximo proprietário:
 				</text>
-				<check_box label="Modificar" name="CheckNextOwnerModify"/>
-				<check_box label="Copiar" name="CheckNextOwnerCopy"/>
+				<check_box label="Modificar" name="CheckNextOwnerModify" tool_tip="O próximo proprietário pode editar as propriedades, como o nome do item ou escala desse objeto."/>
+				<check_box label="Copiar" name="CheckNextOwnerCopy" tool_tip="O próximo proprietário pode fazer cópias ilimitadas desse objeto. As cópias mantêm as informações do criador e nunca podem ser mais permissivo do que o item copiado."/>
 				<check_box label="Transferir" name="CheckNextOwnerTransfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/>
 			</panel>
-			<check_box label="À venda" name="CheckPurchase"/>
-			<combo_box name="ComboBoxSaleType">
+			<check_box label="À venda" name="CheckPurchase" tool_tip="Permita que as pessoas comprem esse objeto, seu conteúdo ou copiá-lo no mundo virtual por um preço específico."/>
+			<combo_box name="ComboBoxSaleType" tool_tip="Selecione se o comprador receberá uma cópia. A cópia do conteúdo ou o próprio item.">
 				<combo_box.item label="Cortar" name="Copy"/>
 				<combo_box.item label="Conteúdo" name="Contents"/>
 				<combo_box.item label="Original" name="Original"/>
 			</combo_box>
-			<spinner label="Preço: L$" name="Edit Cost"/>
+			<spinner label="Preço: L$" name="Edit Cost" tool_tip="Custo do objeto."/>
 		</panel>
 	</scroll_container>
 	<panel name="button_panel">
diff --git a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml
index bbfaa4a4f5..d616bd5186 100644
--- a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml
@@ -1,32 +1,74 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="object properties" title="Perfil do objeto">
-	<panel.string name="text deed continued">Doar</panel.string>
-	<panel.string name="text deed">Doar</panel.string>
-	<panel.string name="text modify info 1">Você pode modificar este objeto</panel.string>
-	<panel.string name="text modify info 2">Você pode modificar estes objetos</panel.string>
-	<panel.string name="text modify info 3">Você não pode modificar este objeto</panel.string>
-	<panel.string name="text modify info 4">Você não pode modificar estes objetos</panel.string>
-	<panel.string name="text modify info 5">Não é possível modificar este objeto através de uma demarcação da região</panel.string>
-	<panel.string name="text modify info 6">Não é possível modificar estes objetos através de uma demarcação da região</panel.string>
-	<panel.string name="text modify warning">O objeto contém links ligando suas partes</panel.string>
-	<panel.string name="Cost Default">Preço: L$</panel.string>
-	<panel.string name="Cost Total">Preço total: L$</panel.string>
-	<panel.string name="Cost Per Unit">Preço unitário: L$</panel.string>
-	<panel.string name="Cost Mixed">Preço misto</panel.string>
-	<panel.string name="Sale Mixed">Venda mista</panel.string>
+	<panel.string name="text deed continued">
+		Doar
+	</panel.string>
+	<panel.string name="text deed">
+		Doar
+	</panel.string>
+	<panel.string name="text modify info 1">
+		Você pode modificar este objeto
+	</panel.string>
+	<panel.string name="text modify info 2">
+		Você pode modificar estes objetos
+	</panel.string>
+	<panel.string name="text modify info 3">
+		Você não pode modificar este objeto
+	</panel.string>
+	<panel.string name="text modify info 4">
+		Você não pode modificar estes objetos
+	</panel.string>
+	<panel.string name="text modify info 5">
+		Não é possível modificar este objeto através de uma demarcação da região
+	</panel.string>
+	<panel.string name="text modify info 6">
+		Não é possível modificar estes objetos através de uma demarcação da região
+	</panel.string>
+	<panel.string name="text modify warning">
+		O objeto contém links ligando suas partes
+	</panel.string>
+	<panel.string name="Cost Default">
+		Preço: L$
+	</panel.string>
+	<panel.string name="Cost Total">
+		Preço total: L$
+	</panel.string>
+	<panel.string name="Cost Per Unit">
+		Preço unitário: L$
+	</panel.string>
+	<panel.string name="Cost Mixed">
+		Preço misto
+	</panel.string>
+	<panel.string name="Sale Mixed">
+		Venda mista
+	</panel.string>
 	<text name="title" value="Perfil do objeto"/>
 	<text name="where" value="(Inworld)"/>
 	<panel label="" name="properties_panel">
-		<text name="Name:">Nome:</text>
-		<text name="Description:">Descrição:</text>
-		<text name="CreatorNameLabel">Criador:</text>
-		<text name="Owner:">Proprietário:</text>
-		<text name="Group_label">Grupo:</text>
+		<text name="Name:">
+			Nome:
+		</text>
+		<line_editor name="Object Name" tool_tip="O nome está limitado em 63 caracteres. Nomes prim maior são cortados. Os nomes podem consistir em caracteres impressos encontrados no conjunto de caracteres ASCII-7 (não estendido), com a exceção da barra/tupo vertical ‘|’."/>
+		<text name="Description:">
+			Descrição:
+		</text>
+		<line_editor name="Object Description" tool_tip="Quando as pessoas selecionam &apos;Passe o mouse em todos os objetos’ na configuração de visualização, eles verão a descrição dos objetos em uma janela pop-up sempre que passar o mouse por cima. A descrição prim é limitada em 127 bytes, qualquer string maior ficará truncada."/>
+		<text name="CreatorNameLabel">
+			Criador:
+		</text>
+		<text name="Owner:">
+			Proprietário:
+		</text>
+		<text name="Group_label">
+			Grupo:
+		</text>
 		<button name="button set group" tool_tip="Selecione o grupo que terá acesso à autorização do objeto"/>
 		<name_box initial_value="Carregando..." name="Group Name Proxy"/>
 		<button label="Doar" label_selected="Doar" name="button deed" tool_tip="Ao doar este item, o próximo dono terá permissões de próximo dono. Objetos de grupos podem ser doados por um oficial do grupo."/>
-		<text name="label click action">Clique para:</text>
-		<combo_box name="clickaction">
+		<text name="label click action">
+			Clique para:
+		</text>
+		<combo_box name="clickaction" tool_tip="Ao clicar, você pode interagir com um objeto com um clique no botão esquerdo do mouse. Cada ação de clicar tem um cursor especial indicador. Algumas ações de clique tem exigências para a função. Por exemplo, Tocar e Pagar exige scripts.">
 			<combo_box.item label="Tocar (padrão)" name="Touch/grab(default)"/>
 			<combo_box.item label="Sentar em objeto" name="Sitonobject"/>
 			<combo_box.item label="Comprar objeto" name="Buyobject"/>
@@ -35,37 +77,59 @@
 			<combo_box.item label="Zoom" name="Zoom"/>
 		</combo_box>
 		<panel name="perms_inv">
-			<text name="perm_modify">Você pode modificar este objeto</text>
-			<text name="Anyone can:">Todos:</text>
-			<check_box label="Copiar" name="checkbox allow everyone copy"/>
-			<check_box label="Movimentar" name="checkbox allow everyone move"/>
-			<text name="GroupLabel">Grupo:</text>
+			<text name="perm_modify">
+				Você pode modificar este objeto
+			</text>
+			<text name="Anyone can:">
+				Todos:
+			</text>
+			<check_box label="Copiar" name="checkbox allow everyone copy" tool_tip="Qualquer um pode fazer uma cópia do objeto. O objeto e todos os conteúdos devem ter permissão para cópia e transferência."/>
+			<check_box label="Movimentar" name="checkbox allow everyone move" tool_tip="Qualquer pessoa pode mover o objeto."/>
+			<text name="GroupLabel">
+				Grupo:
+			</text>
 			<check_box label="Compartilhar" name="checkbox share with group" tool_tip="Permitir que todos os membros do grupo tenham o seu nível de modificação para este objeto. Faça uma doação para ativar restrições de função."/>
-			<text name="NextOwnerLabel">Próximo proprietário:</text>
-			<check_box label="Modificar" name="checkbox next owner can modify"/>
-			<check_box label="Copiar" name="checkbox next owner can copy"/>
+			<text name="NextOwnerLabel">
+				Próximo proprietário:
+			</text>
+			<check_box label="Modificar" name="checkbox next owner can modify" tool_tip="O próximo proprietário pode editar as propriedades, como o nome do item ou escala desse objeto."/>
+			<check_box label="Copiar" name="checkbox next owner can copy" tool_tip="O próximo proprietário pode fazer cópias ilimitadas desse objeto. As cópias mantêm as informações do criador e nunca podem ser mais permissivo do que o item copiado."/>
 			<check_box label="Transferir" name="checkbox next owner can transfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/>
 		</panel>
-		<check_box label="À venda" name="checkbox for sale"/>
-		<combo_box name="sale type">
+		<check_box label="À venda" name="checkbox for sale" tool_tip="Permita que as pessoas comprem esse objeto, seu conteúdo ou copiá-lo no mundo virtual por um preço específico."/>
+		<combo_box name="sale type" tool_tip="Selecione se o comprador receberá uma cópia. A cópia do conteúdo ou o próprio item.">
 			<combo_box.item label="Copiar" name="Copy"/>
 			<combo_box.item label="Conteúdo" name="Contents"/>
 			<combo_box.item label="Original" name="Original"/>
 		</combo_box>
-		<spinner label="Preço: L$" name="Edit Cost"/>
+		<spinner label="Preço: L$" name="Edit Cost" tool_tip="Custo do objeto."/>
 		<check_box label="Mostrar nos resultados de busca" name="search_check" tool_tip="Incluir o objeto nos resultados de busca"/>
-		<text name="pathfinding_attributes_label">Atributos do pathfinding:</text>
-		<text name="B:">B:</text>
-		<text name="O:">O:</text>
-		<text name="G:">G:</text>
-		<text name="E:">E:</text>
-		<text name="N:">N:</text>
-		<text name="F:">F:</text>
+		<text name="pathfinding_attributes_label">
+			Atributos do pathfinding:
+		</text>
+		<text name="B:">
+			B:
+		</text>
+		<text name="O:">
+			O:
+		</text>
+		<text name="G:">
+			G:
+		</text>
+		<text name="E:">
+			E:
+		</text>
+		<text name="N:">
+			N:
+		</text>
+		<text name="F:">
+			F:
+		</text>
 	</panel>
 	<panel name="button_panel">
-		<button label="Abrir" name="open_btn"/>
-		<button label="Pagar" name="pay_btn"/>
-		<button label="Comprar" name="buy_btn"/>
-		<button label="Detalhes" name="details_btn"/>
+		<button label="Abrir" name="open_btn" tool_tip="Abrir para visualizar os Conteúdos do Objeto."/>
+		<button label="Pagar" name="pay_btn" tool_tip="Abrir janela Pagar O objeto deve ter um script de pagamento para que funcione."/>
+		<button label="Comprar" name="buy_btn" tool_tip="Abrir janela Comprar É necessário que o objeto seja definido como para venda."/>
+		<button label="Detalhes" name="details_btn" tool_tip="Abrir a janela Inspecionar Objeto."/>
 	</panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 4151ef36ac..7068d3b267 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -2216,7 +2216,7 @@ Se você continuar a receber essa mensagem, entre em contato com o suporte do Se
 		Peito
 	</string>
 	<string name="ATTACH_HEAD">
-		Cabeça
+		Crânio
 	</string>
 	<string name="ATTACH_LSHOULDER">
 		Ombro esquerdo
@@ -2237,7 +2237,7 @@ Se você continuar a receber essa mensagem, entre em contato com o suporte do Se
 		Pé direito
 	</string>
 	<string name="ATTACH_BACK">
-		Atrás
+		Coluna
 	</string>
 	<string name="ATTACH_PELVIS">
 		Pélvis
@@ -2294,7 +2294,7 @@ Se você continuar a receber essa mensagem, entre em contato com o suporte do Se
 		Perna esquerda
 	</string>
 	<string name="ATTACH_BELLY">
-		Barriga
+		Estômago
 	</string>
 	<string name="ATTACH_LEFT_PEC">
 		Peitorais E
diff --git a/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml
index 304bf97dc1..55b0e0c3bd 100644
--- a/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml
@@ -29,17 +29,17 @@
 	<text name="GroupLabel">
 		Группа:
 	</text>
-	<check_box label="Поделиться" name="share_with_group"/>
+	<check_box label="Поделиться" name="share_with_group" tool_tip="Позволить всем участникам выбранной группы получить установленные вам права на этот объект. Для включения ролевых ограничений необходимо произвести сделку."/>
 	<text name="AnyoneLabel">
 		Все:
 	</text>
-	<check_box label="Копировать" name="everyone_copy"/>
+	<check_box label="Копировать" name="everyone_copy" tool_tip="Копию объекта может взять любой желающий. Объект и все его содержимое должны копироваться и передаваться."/>
 	<text name="NextOwnerLabel">
 		Следующий владелец:
 	</text>
-	<check_box label="Изменять" name="next_owner_modify"/>
-	<check_box label="Копировать" name="next_owner_copy"/>
-	<check_box initial_value="true" label="Передать" name="next_owner_transfer" tool_tip="Следующий владелец может отдать или перепродать объект"/>
+	<check_box label="Изменять" name="next_owner_modify" tool_tip="Следующий владелец может отредактировать свойства, такие как имя отдельного предмета или масштаб этого объекта."/>
+	<check_box label="Копировать" name="next_owner_copy" tool_tip="Следующий владелец может сделать неограниченное количество копий этого объекта. Копии содержат информацию о создателе и никогда не могут быть более разрешительными, чем копируемый предмет."/>
+	<check_box initial_value="true" label="Передать" name="next_owner_transfer" tool_tip="Следующий владелец может отдать или перепродать этот объект."/>
 	<button label="OK" name="ok"/>
 	<button label="Применить" name="apply"/>
 	<button label="Отмена" name="close"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_my_scripts.xml b/indra/newview/skins/default/xui/ru/floater_my_scripts.xml
new file mode 100644
index 0000000000..4c73893085
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_my_scripts.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="myscripts" title="Мои скрипты"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_preferences.xml b/indra/newview/skins/default/xui/ru/floater_preferences.xml
index 1f04eabaf7..0c1cbd9dca 100644
--- a/indra/newview/skins/default/xui/ru/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/ru/floater_preferences.xml
@@ -5,6 +5,9 @@
 	</floater.string>
 	<button label="ОК" label_selected="ОК" name="OK"/>
 	<button label="Отмена" label_selected="Отмена" name="Cancel"/>
+	<panel name="search_panel">
+		<search_editor label="Настройки поиска" name="search_prefs_edit" tool_tip="Введите интересующий вас термин для поиска здесь. Результаты будут отображены для частичного совпадения полного текста в названии параметра или комментариях."/>
+	</panel>
 	<tab_container name="pref core">
 		<panel label="Общие" name="general"/>
 		<panel label="Графика" name="display"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_tools.xml b/indra/newview/skins/default/xui/ru/floater_tools.xml
index 74c27ce162..3e1a81f101 100644
--- a/indra/newview/skins/default/xui/ru/floater_tools.xml
+++ b/indra/newview/skins/default/xui/ru/floater_tools.xml
@@ -175,9 +175,11 @@
 			<text name="Name:">
 				Название:
 			</text>
+			<line_editor name="Object Name" tool_tip="Название ограничено 63 символами. Более длинные имена примитива сокращаются. Имена могут состоять только из печатаемых символов, содержащихся в ASCII-7 (нерасширенном) наборе символов, за исключением вертикальной черты/линии &quot;|&quot;."/>
 			<text name="Description:">
 				Описание:
 			</text>
+			<line_editor name="Object Description" tool_tip="Когда в настройках окна просмотра выбрано &apos;Всплывающие подсказки на всех объектах&apos;, у игроков появляется всплывающее окошко с описанием объекта при наведении мыши на любой объект. Описание примитива ограничивается 127 байтами и строка со значением, превышающим этот размер, усекается."/>
 			<text name="Creator:">
 				Создатель:
 			</text>
@@ -194,7 +196,7 @@
 			<text name="label click action">
 				По щелчку:
 			</text>
-			<combo_box name="clickaction">
+			<combo_box name="clickaction" tool_tip="Взаимодействие с объектом производиться нажатием на левую кнопку мыши. При каждом клике появляется специальный курсор, указывающий на производимое действие. Некоторые клики имеют функциональные требования. Например, для Touch and Pay требуются скрипты">
 				<combo_box.item label="Коснуться (по умолчанию)" name="Touch/grab(default)"/>
 				<combo_box.item label="Сесть на объект" name="Sitonobject"/>
 				<combo_box.item label="Купить объект" name="Buyobject"/>
@@ -202,9 +204,9 @@
 				<combo_box.item label="Открыть" name="Open"/>
 				<combo_box.item label="Увеличение" name="Zoom"/>
 			</combo_box>
-			<check_box label="Для продажи:" name="checkbox for sale"/>
-			<spinner label="L$" name="Edit Cost"/>
-			<combo_box name="sale type">
+			<check_box label="Для продажи:" name="checkbox for sale" tool_tip="Позволяет игрокам покупать этот объект, его содержимое или копировать его в игровом мире по указанной цене."/>
+			<spinner label="L$" name="Edit Cost" tool_tip="Стоимость объекта."/>
+			<combo_box name="sale type" tool_tip="Выберите, получит ли покупатель копию, копию содержимого или сам предмет.">
 				<combo_box.item label="Копировать" name="Copy"/>
 				<combo_box.item label="Контент" name="Contents"/>
 				<combo_box.item label="Оригинал" name="Original"/>
@@ -217,14 +219,14 @@
 				<text name="Anyone can:">
 					Все:
 				</text>
-				<check_box label="Переместить" name="checkbox allow everyone move"/>
-				<check_box label="Копировать" name="checkbox allow everyone copy"/>
+				<check_box label="Переместить" name="checkbox allow everyone move" tool_tip="Любой игрок может переместить объект."/>
+				<check_box label="Копировать" name="checkbox allow everyone copy" tool_tip="Копию объекта может взять любой желающий. Объект и все его содержимое должны копироваться и передаваться."/>
 				<text name="Next owner can:">
 					Следующий владелец:
 				</text>
-				<check_box label="Изменять" name="checkbox next owner can modify"/>
-				<check_box label="Копировать" name="checkbox next owner can copy"/>
-				<check_box label="Передать" name="checkbox next owner can transfer" tool_tip="Следующий владелец может отдать или перепродать объект"/>
+				<check_box label="Изменять" name="checkbox next owner can modify" tool_tip="Следующий владелец может отредактировать свойства, такие как имя отдельного предмета или масштаб этого объекта."/>
+				<check_box label="Копировать" name="checkbox next owner can copy" tool_tip="Следующий владелец может сделать неограниченное количество копий этого объекта. Копии содержат информацию о создателе и никогда не могут быть более разрешительными, чем копируемый предмет."/>
+				<check_box label="Передать" name="checkbox next owner can transfer" tool_tip="Следующий владелец может отдать или перепродать этот объект."/>
 				<text name="B:">
 					Н:
 				</text>
diff --git a/indra/newview/skins/default/xui/ru/floater_top_objects.xml b/indra/newview/skins/default/xui/ru/floater_top_objects.xml
index b045c5bff3..39eae1e8d1 100644
--- a/indra/newview/skins/default/xui/ru/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/ru/floater_top_objects.xml
@@ -4,7 +4,7 @@
 		Лучшие скрипты
 	</floater.string>
 	<floater.string name="top_scripts_text">
-		[COUNT] скриптов длительностью [TIME] мс
+		[COUNT] скриптов длительностью [TIME] мс и размером \[MEMORY] Кбайт
 	</floater.string>
 	<floater.string name="scripts_score_label">
 		Время
diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml
index 67ebda684a..d2ebfbecc0 100644
--- a/indra/newview/skins/default/xui/ru/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml
@@ -9,6 +9,7 @@
 		<menu_item_call label="Места..." name="Places"/>
 		<menu_item_call label="Подборка..." name="Picks"/>
 		<menu_item_call label="Приключения..." name="Experiences"/>
+		<menu_item_call label="Мои скрипты..." name="MyScripts"/>
 		<menu_item_call label="Управление камерой..." name="Camera Controls"/>
 		<menu label="Движение" name="Movement">
 			<menu_item_call label="Сесть" name="Sit Down Here"/>
diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml
index 4801c22cc6..ad6dff2839 100644
--- a/indra/newview/skins/default/xui/ru/notifications.xml
+++ b/indra/newview/skins/default/xui/ru/notifications.xml
@@ -1588,9 +1588,25 @@
 [DOWNLOAD_PATH].
 	</notification>
 	<notification name="RequiredUpdate">
-		Для входа необходима версия \[VERSION]. Для вас обновление должно было произведено автоматически, но по какой-то причине этого не произошло. Скачайте обновление с веб-сайта https://secondlife.com/support/downloads/
+		Для входа необходима версия \[VERSION]. 
+Скачайте обновление с веб-сайта https://secondlife.com/support/downloads/
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
+	<notification name="PauseForUpdate">
+		Для входа необходима версия \[VERSION]. 
+Нажмите OK для загрузки и установки.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="OptionalUpdateReady">
+		Версия \[VERSION] загружена и готова к установке. 
+Нажмите OK для установки.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="PromptOptionalUpdate">
+		Версия \[VERSION] загружена и готова к установке. 
+Продолжить?
+		<usetemplate canceltext="Не сейчас" name="yesnocancelbuttons" notext="Пропустить" yestext="Установить"/>
+	</notification>
 	<notification name="LoginFailedUnknown">
 		Извините, ошибка входа по неустановленной причине. Если данное сообщение повторится, посетите веб-сайт [SUPPORT_SITE].
 		<usetemplate name="okbutton" yestext="Выйти"/>
@@ -3051,15 +3067,6 @@
 			<button name="Deny" text="Отклонить"/>
 		</form>
 	</notification>
-	<notification name="UnknownScriptQuestion">
-		Объект &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;» владельца «[NAME]» требует разрешения на выполнение скрипта; разрешение не распознается клиентом и не будет предоставлено
-
-Для получения этого разрешения установите последнюю версию клиента из [DOWNLOADURL].
-		<form name="form">
-			<button name="Deny" text="OK"/>
-			<button name="Mute" text="Заблокировать"/>
-		</form>
-	</notification>
 	<notification name="ScriptDialog">
 		[NAME] – «&lt;nolink&gt;[TITLE]&lt;/nolink&gt;»
 [MESSAGE]
diff --git a/indra/newview/skins/default/xui/ru/panel_status_bar.xml b/indra/newview/skins/default/xui/ru/panel_status_bar.xml
index 49c48ae654..124b8f2cff 100644
--- a/indra/newview/skins/default/xui/ru/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/ru/panel_status_bar.xml
@@ -1,16 +1,31 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="status">
-	<panel.string name="packet_loss_tooltip">Потери пакетов</panel.string>
-	<panel.string name="bandwidth_tooltip">Ширина канала</panel.string>
-	<panel.string name="time">[hour, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt]</panel.string>
-	<panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>
-	<panel.string name="buycurrencylabel">L$ [AMT]</panel.string>
+	<panel.string name="packet_loss_tooltip">
+		Потери пакетов
+	</panel.string>
+	<panel.string name="bandwidth_tooltip">
+		Ширина канала
+	</panel.string>
+	<panel.string name="time">
+		[hour, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt]
+	</panel.string>
+	<panel.string name="timeTooltip">
+		[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+	</panel.string>
+	<panel.string name="buycurrencylabel">
+		L$ [AMT]
+	</panel.string>
+	<panel name="menu_search_panel">
+		<search_editor label="Меню поиска" name="search_menu_edit" tool_tip="Введите интересующий вас термин для поиска здесь. Результаты будут отображены для частичного совпадения полного текста в меню."/>
+	</panel>
 	<panel left="-471" name="balance_bg" width="240">
 		<text name="balance" tool_tip="Щелкните для обновления вашего баланса L$" value="L$??"/>
 		<button label="Купить L$" name="buyL" tool_tip="Щелкните для покупки L$"/>
 		<button label="Торговый центр" name="goShop" tool_tip="Открыть торговый центр Second Life" width="121"/>
 	</panel>
-	<text name="TimeText" tool_tip="Текущее время (тихоокеанское)">00:00 (тихоокеанское время)</text>
+	<text name="TimeText" tool_tip="Текущее время (тихоокеанское)">
+		00:00 (тихоокеанское время)
+	</text>
 	<button name="media_toggle_btn" tool_tip="Запуск/остановка всех медиа (музыка, видео, веб-страницы)"/>
 	<button name="volume_btn" tool_tip="Регулятор громкости"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml b/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml
index c434dcd6a8..79a645f536 100644
--- a/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml
@@ -34,9 +34,11 @@
 			<text name="LabelItemNameTitle">
 				Название:
 			</text>
+			<line_editor name="LabelItemName" tool_tip="Название ограничено 63 символами. Более длинные имена примитива сокращаются. Имена могут состоять только из печатаемых символов, содержащихся в ASCII-7 (нерасширенном) наборе символов, за исключением вертикальной черты/линии &quot;|&quot;."/>
 			<text name="LabelItemDescTitle">
 				Описание:
 			</text>
+			<line_editor name="LabelItemDesc" tool_tip="Когда в настройках окна просмотра выбрано &apos;Всплывающие подсказки на всех объектах&apos;, у игроков появляется всплывающее окошко с описанием объекта при наведении мыши на любой объект. Описание примитива ограничивается 127 байтами и строка со значением, превышающим этот размер, усекается."/>
 			<text name="LabelCreatorTitle">
 				Создатель:
 			</text>
@@ -59,7 +61,7 @@
 				<text name="AnyoneLabel">
 					Все:
 				</text>
-				<check_box label="Копировать" name="CheckEveryoneCopy"/>
+				<check_box label="Копировать" name="CheckEveryoneCopy" tool_tip="Копию объекта может взять любой желающий. Объект и все его содержимое должны копироваться и передаваться."/>
 				<text name="GroupLabel">
 					Группа:
 				</text>
@@ -67,17 +69,17 @@
 				<text name="NextOwnerLabel">
 					Следующий владелец:
 				</text>
-				<check_box label="Изменять" name="CheckNextOwnerModify"/>
-				<check_box label="Копировать" name="CheckNextOwnerCopy"/>
-				<check_box label="Передать" name="CheckNextOwnerTransfer" tool_tip="Следующий владелец может отдать или перепродать объект"/>
+				<check_box label="Изменять" name="CheckNextOwnerModify" tool_tip="Следующий владелец может отредактировать свойства, такие как имя отдельного предмета или масштаб этого объекта."/>
+				<check_box label="Копировать" name="CheckNextOwnerCopy" tool_tip="Следующий владелец может сделать неограниченное количество копий этого объекта. Копии содержат информацию о создателе и никогда не могут быть более разрешительными, чем копируемый предмет."/>
+				<check_box label="Передать" name="CheckNextOwnerTransfer" tool_tip="Следующий владелец может отдать или перепродать этот объект."/>
 			</panel>
-			<check_box label="Для продажи" name="CheckPurchase"/>
-			<combo_box name="ComboBoxSaleType">
+			<check_box label="Для продажи" name="CheckPurchase" tool_tip="Позволяет игрокам покупать этот объект, его содержимое или копировать его в игровом мире по указанной цене."/>
+			<combo_box name="ComboBoxSaleType" tool_tip="Выберите, получит ли покупатель копию, копию содержимого или сам предмет.">
 				<combo_box.item label="Копировать" name="Copy"/>
 				<combo_box.item label="Содержимое" name="Contents"/>
 				<combo_box.item label="Оригинал" name="Original"/>
 			</combo_box>
-			<spinner label="Цена: L$" name="Edit Cost"/>
+			<spinner label="Цена: L$" name="Edit Cost" tool_tip="Стоимость объекта."/>
 		</panel>
 	</scroll_container>
 	<panel name="button_panel">
diff --git a/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml
index 4059a800f0..a2b8753317 100644
--- a/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml
@@ -1,32 +1,74 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="object properties" title="Профиль объекта">
-	<panel.string name="text deed continued">Сделка</panel.string>
-	<panel.string name="text deed">Сделка</panel.string>
-	<panel.string name="text modify info 1">Этот объект можно изменять</panel.string>
-	<panel.string name="text modify info 2">Эти объекты можно изменять</panel.string>
-	<panel.string name="text modify info 3">Этот объект нельзя изменять</panel.string>
-	<panel.string name="text modify info 4">Эти объекты нельзя изменять</panel.string>
-	<panel.string name="text modify info 5">Этот объект нельзя изменять через границу региона</panel.string>
-	<panel.string name="text modify info 6">Эти объекты нельзя изменять через границу региона</panel.string>
-	<panel.string name="text modify warning">Этот объект содержит объединенные части</panel.string>
-	<panel.string name="Cost Default">Цена: L$</panel.string>
-	<panel.string name="Cost Total">Итоговая цена: L$</panel.string>
-	<panel.string name="Cost Per Unit">Цена за: L$</panel.string>
-	<panel.string name="Cost Mixed">Смешанная цена</panel.string>
-	<panel.string name="Sale Mixed">Смешанная продажа</panel.string>
+	<panel.string name="text deed continued">
+		Сделка
+	</panel.string>
+	<panel.string name="text deed">
+		Сделка
+	</panel.string>
+	<panel.string name="text modify info 1">
+		Этот объект можно изменять
+	</panel.string>
+	<panel.string name="text modify info 2">
+		Эти объекты можно изменять
+	</panel.string>
+	<panel.string name="text modify info 3">
+		Этот объект нельзя изменять
+	</panel.string>
+	<panel.string name="text modify info 4">
+		Эти объекты нельзя изменять
+	</panel.string>
+	<panel.string name="text modify info 5">
+		Этот объект нельзя изменять через границу региона
+	</panel.string>
+	<panel.string name="text modify info 6">
+		Эти объекты нельзя изменять через границу региона
+	</panel.string>
+	<panel.string name="text modify warning">
+		Этот объект содержит объединенные части
+	</panel.string>
+	<panel.string name="Cost Default">
+		Цена: L$
+	</panel.string>
+	<panel.string name="Cost Total">
+		Итоговая цена: L$
+	</panel.string>
+	<panel.string name="Cost Per Unit">
+		Цена за: L$
+	</panel.string>
+	<panel.string name="Cost Mixed">
+		Смешанная цена
+	</panel.string>
+	<panel.string name="Sale Mixed">
+		Смешанная продажа
+	</panel.string>
 	<text name="title" value="Профиль объекта"/>
 	<text name="where" value="(в мире)"/>
 	<panel label="" name="properties_panel">
-		<text name="Name:">Название:</text>
-		<text name="Description:">Описание:</text>
-		<text name="CreatorNameLabel">Создатель:</text>
-		<text name="Owner:">Владелец:</text>
-		<text name="Group_label">Группа:</text>
+		<text name="Name:">
+			Название:
+		</text>
+		<line_editor name="Object Name" tool_tip="Название ограничено 63 символами. Более длинные имена примитива сокращаются. Имена могут состоять только из печатаемых символов, содержащихся в ASCII-7 (нерасширенном) наборе символов, за исключением вертикальной черты/линии &quot;|&quot;."/>
+		<text name="Description:">
+			Описание:
+		</text>
+		<line_editor name="Object Description" tool_tip="Когда в настройках окна просмотра выбрано &apos;Всплывающие подсказки на всех объектах&apos;, у игроков появляется всплывающее окошко с описанием объекта при наведении мыши на любой объект. Описание примитива ограничивается 127 байтами и строка со значением, превышающим этот размер, усекается."/>
+		<text name="CreatorNameLabel">
+			Создатель:
+		</text>
+		<text name="Owner:">
+			Владелец:
+		</text>
+		<text name="Group_label">
+			Группа:
+		</text>
 		<button name="button set group" tool_tip="Выберите группу для передачи ей прав доступа к объекту"/>
 		<name_box initial_value="Загрузка..." name="Group Name Proxy"/>
 		<button label="Сделка" label_selected="Сделка" name="button deed" tool_tip="В результате сделки объект передается группе, при этом права на него будут соответствовать правам следующего владельца. Переданный группе объект может передаваться должностным лицом группы."/>
-		<text name="label click action">Действие по щелчку:</text>
-		<combo_box name="clickaction">
+		<text name="label click action">
+			Действие по щелчку:
+		</text>
+		<combo_box name="clickaction" tool_tip="Взаимодействие с объектом производиться нажатием на левую кнопку мыши. При каждом клике появляется специальный курсор, указывающий на производимое действие. Некоторые клики имеют функциональные требования. Например, для Touch and Pay требуются скрипты">
 			<combo_box.item label="Коснуться (по умолчанию)" name="Touch/grab(default)"/>
 			<combo_box.item label="Сесть на объект" name="Sitonobject"/>
 			<combo_box.item label="Купить объект" name="Buyobject"/>
@@ -35,37 +77,59 @@
 			<combo_box.item label="Приблизить" name="Zoom"/>
 		</combo_box>
 		<panel name="perms_inv">
-			<text name="perm_modify">Этот объект можно изменять</text>
-			<text name="Anyone can:">Все:</text>
-			<check_box label="Копировать" name="checkbox allow everyone copy"/>
-			<check_box label="Переместить" name="checkbox allow everyone move"/>
-			<text name="GroupLabel">Группа:</text>
+			<text name="perm_modify">
+				Этот объект можно изменять
+			</text>
+			<text name="Anyone can:">
+				Все:
+			</text>
+			<check_box label="Копировать" name="checkbox allow everyone copy" tool_tip="Копию объекта может взять любой желающий. Объект и все его содержимое должны копироваться и передаваться."/>
+			<check_box label="Переместить" name="checkbox allow everyone move" tool_tip="Любой игрок может переместить объект."/>
+			<text name="GroupLabel">
+				Группа:
+			</text>
 			<check_box label="Поделиться" name="checkbox share with group" tool_tip="Позволить всем участникам выбранной группы получить установленные вам права на этот объект. Для включения ролевых ограничений необходимо произвести сделку."/>
-			<text name="NextOwnerLabel">Следующий владелец:</text>
-			<check_box label="Изменять" name="checkbox next owner can modify"/>
-			<check_box label="Копировать" name="checkbox next owner can copy"/>
+			<text name="NextOwnerLabel">
+				Следующий владелец:
+			</text>
+			<check_box label="Изменять" name="checkbox next owner can modify" tool_tip="Следующий владелец может отредактировать свойства, такие как имя отдельного предмета или масштаб этого объекта."/>
+			<check_box label="Копировать" name="checkbox next owner can copy" tool_tip="Следующий владелец может сделать неограниченное количество копий этого объекта. Копии содержат информацию о создателе и никогда не могут быть более разрешительными, чем копируемый предмет."/>
 			<check_box label="Передать" name="checkbox next owner can transfer" tool_tip="Следующий владелец может отдать или перепродать объект"/>
 		</panel>
-		<check_box label="Для продажи" name="checkbox for sale"/>
-		<combo_box name="sale type">
+		<check_box label="Для продажи" name="checkbox for sale" tool_tip="Позволяет игрокам покупать этот объект, его содержимое или копировать его в игровом мире по указанной цене."/>
+		<combo_box name="sale type" tool_tip="Выберите, получит ли покупатель копию, копию содержимого или сам предмет.">
 			<combo_box.item label="Копировать" name="Copy"/>
 			<combo_box.item label="Контент" name="Contents"/>
 			<combo_box.item label="Оригинал" name="Original"/>
 		</combo_box>
-		<spinner label="Цена: L$" name="Edit Cost"/>
+		<spinner label="Цена: L$" name="Edit Cost" tool_tip="Стоимость объекта."/>
 		<check_box label="Показать в результатах поиска" name="search_check" tool_tip="Показывать объект в результатах поиска"/>
-		<text name="pathfinding_attributes_label">Атрибуты поиска пути:</text>
-		<text name="B:">Н:</text>
-		<text name="O:">O:</text>
-		<text name="G:">G:</text>
-		<text name="E:">В:</text>
-		<text name="N:">С:</text>
-		<text name="F:">F:</text>
+		<text name="pathfinding_attributes_label">
+			Атрибуты поиска пути:
+		</text>
+		<text name="B:">
+			Н:
+		</text>
+		<text name="O:">
+			O:
+		</text>
+		<text name="G:">
+			G:
+		</text>
+		<text name="E:">
+			В:
+		</text>
+		<text name="N:">
+			С:
+		</text>
+		<text name="F:">
+			F:
+		</text>
 	</panel>
 	<panel name="button_panel">
-		<button label="Открыть" name="open_btn"/>
-		<button label="Заплатить" name="pay_btn"/>
-		<button label="Купить" name="buy_btn"/>
-		<button label="Подробности" name="details_btn"/>
+		<button label="Открыть" name="open_btn" tool_tip="Откройте для просмотра содержимого объекта."/>
+		<button label="Заплатить" name="pay_btn" tool_tip="Откройте окно Оплатить. Чтобы оплатить за объект, он должен иметь скрипт для оплаты."/>
+		<button label="Купить" name="buy_btn" tool_tip="Откройте окно Купить. Требуется, чтобы объект был выставлен на продажу."/>
+		<button label="Подробности" name="details_btn" tool_tip="Откройте окно осмотра объекта."/>
 	</panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
index dcc503f18c..64d0e8ccf3 100644
--- a/indra/newview/skins/default/xui/ru/strings.xml
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -2269,7 +2269,7 @@ support@secondlife.com.
 		Грудь
 	</string>
 	<string name="ATTACH_HEAD">
-		Голова
+		Череп
 	</string>
 	<string name="ATTACH_LSHOULDER">
 		Левое плечо
@@ -2290,7 +2290,7 @@ support@secondlife.com.
 		Правая ступня
 	</string>
 	<string name="ATTACH_BACK">
-		Спина
+		Позвоночник
 	</string>
 	<string name="ATTACH_PELVIS">
 		Таз
diff --git a/indra/newview/skins/default/xui/tr/floater_bulk_perms.xml b/indra/newview/skins/default/xui/tr/floater_bulk_perms.xml
index bf4473ce1f..a7708b5882 100644
--- a/indra/newview/skins/default/xui/tr/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/tr/floater_bulk_perms.xml
@@ -29,17 +29,17 @@
 	<text name="GroupLabel">
 		Grup:
 	</text>
-	<check_box label="Paylaş" name="share_with_group"/>
+	<check_box label="Paylaş" name="share_with_group" tool_tip="Ayarlanan grubun tüm üyelerinin, bu nesne için değiştirme izinlerinizi paylaşmasına izin verir. Rol kısıtlamalarını etkinleştirmek için Devretmeniz gerekiyor."/>
 	<text name="AnyoneLabel">
 		Herkes:
 	</text>
-	<check_box label="Kopyala" name="everyone_copy"/>
+	<check_box label="Kopyala" name="everyone_copy" tool_tip="Herkes nesnenin bir kopyasını alabilir. Nesne ve sahip olduğu tüm içerikler kopyalamaya ve aktarıma izin vermelidir."/>
 	<text name="NextOwnerLabel">
 		Sonraki sahip:
 	</text>
-	<check_box label="Değiştir" name="next_owner_modify"/>
-	<check_box label="Kopyala" name="next_owner_copy"/>
-	<check_box initial_value="true" label="Aktar" name="next_owner_transfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/>
+	<check_box label="Değiştir" name="next_owner_modify" tool_tip="Sonraki sahip öğe adı veya bu nesnenin büyüklüğü gibi özellikleri düzenleyebilir."/>
+	<check_box label="Kopyala" name="next_owner_copy" tool_tip="Sonraki sahip bu nesnenin sınırsız sayıda kopyasını oluşturabilir. Kopyalar oluşturucu bilgisini içerir ve asla kopyalanan öğeden daha fazla izin veren bir özellikte olamaz."/>
+	<check_box initial_value="true" label="Aktar" name="next_owner_transfer" tool_tip="Sonraki sahibi bu nesneyi hediye edebilir veya tekrar satabilir."/>
 	<button label="Tamam" name="ok"/>
 	<button label="Uygula" name="apply"/>
 	<button label="İptal" name="close"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_my_scripts.xml b/indra/newview/skins/default/xui/tr/floater_my_scripts.xml
new file mode 100644
index 0000000000..2a4ad55606
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_my_scripts.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="myscripts" title="Komut Dosyalarım"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_preferences.xml b/indra/newview/skins/default/xui/tr/floater_preferences.xml
index c9d509c868..03e95b4681 100644
--- a/indra/newview/skins/default/xui/tr/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/tr/floater_preferences.xml
@@ -5,6 +5,9 @@
 	</floater.string>
 	<button label="Tamam" label_selected="Tamam" name="OK"/>
 	<button label="İptal" label_selected="İptal" name="Cancel"/>
+	<panel name="search_panel">
+		<search_editor label="Ayarlarda Ara" name="search_prefs_edit" tool_tip="Merak ettiğiniz arama terimini buraya yazın. Sonuçlar, ayar adı veya açıklaması içindeki kısmi tam metin eşleşmeleri şeklinde görüntülenir."/>
+	</panel>
 	<tab_container name="pref core">
 		<panel label="Genel" name="general"/>
 		<panel label="Grafikler" name="display"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_tools.xml b/indra/newview/skins/default/xui/tr/floater_tools.xml
index 0c26f717af..e46e53c110 100644
--- a/indra/newview/skins/default/xui/tr/floater_tools.xml
+++ b/indra/newview/skins/default/xui/tr/floater_tools.xml
@@ -175,9 +175,11 @@
 			<text name="Name:">
 				Ad:
 			</text>
+			<line_editor name="Object Name" tool_tip="Ad, 63 karakter ile sınırlıdır. Daha uzun prim adları kesilerek kısaltılır. Adlar, dikey çubuk &apos;|&apos; hariç olmak üzere, sadece ASCII-7 (genişletilmemiş) karakter kümesinde bulunan yazdırılabilir karakterlerden oluşabilir."/>
 			<text name="Description:">
 				Açıklama:
 			</text>
+			<line_editor name="Object Description" tool_tip="Görüntüleyici ayarlarında &apos;İpuçlarını Tüm Nesnelerin Üzerine Getir&apos; seçildiğinde, fare imlecinin altındaki herhangi bir nesneye ait nesne açıklaması açılır penceresi görülür. Prim (temel öğe) açıklaması 127 bayt ile sınırlıdır ve bundan daha uzun her dize kesilir."/>
 			<text name="Creator:">
 				Oluşturan:
 			</text>
@@ -194,7 +196,7 @@
 			<text name="label click action">
 				Şu eylem için tıklayın:
 			</text>
-			<combo_box name="clickaction">
+			<combo_box name="clickaction" tool_tip="Tıklama eylemi, tek bir sol tıklama yoluyla bir nesne ile etkileşime girmenize olanak sağlar. Her tıklama eylemi, ne işe yaradığını gösteren özel bir imlece sahiptir. Bazı tıklama eylemlerinin işlevlerini yerine getirmesi için belirli gereklilikler vardır. Örneğin, Dokun ve Öde komut dosyaları gerektirir">
 				<combo_box.item label="Dokun (varsayılan)" name="Touch/grab(default)"/>
 				<combo_box.item label="Nesnenin üzerine otur" name="Sitonobject"/>
 				<combo_box.item label="Nesneyi satın al" name="Buyobject"/>
@@ -202,9 +204,9 @@
 				<combo_box.item label="Aç" name="Open"/>
 				<combo_box.item label="Yakınlaştır" name="Zoom"/>
 			</combo_box>
-			<check_box label="Satılık:" name="checkbox for sale"/>
-			<spinner label="L$" name="Edit Cost"/>
-			<combo_box name="sale type">
+			<check_box label="Satılık:" name="checkbox for sale" tool_tip="İnsanların bu nesneyi, içeriğini veya SL dünyasındaki kopyasını satın almasına izin verin."/>
+			<spinner label="L$" name="Edit Cost" tool_tip="Nesne maliyeti."/>
+			<combo_box name="sale type" tool_tip="Alıcının bir kopya mı, yani içeriğin kopyasını mı yoksa öğenin kendisini mi alacağını seçin.">
 				<combo_box.item label="Kopyala" name="Copy"/>
 				<combo_box.item label="İçerik" name="Contents"/>
 				<combo_box.item label="Orijinal" name="Original"/>
@@ -217,14 +219,14 @@
 				<text name="Anyone can:">
 					Herkes:
 				</text>
-				<check_box label="Hareket Et" name="checkbox allow everyone move"/>
-				<check_box label="Kopyala" name="checkbox allow everyone copy"/>
+				<check_box label="Hareket Et" name="checkbox allow everyone move" tool_tip="Herkes nesneyi hareket ettirebilir."/>
+				<check_box label="Kopyala" name="checkbox allow everyone copy" tool_tip="Herkes nesnenin bir kopyasını alabilir. Nesne ve sahip olduğu tüm içerikler kopyalamaya ve aktarıma izin vermelidir."/>
 				<text name="Next owner can:">
 					Sonraki sahip:
 				</text>
-				<check_box label="Değiştir" name="checkbox next owner can modify"/>
-				<check_box label="Kopyala" name="checkbox next owner can copy"/>
-				<check_box label="Aktar" name="checkbox next owner can transfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/>
+				<check_box label="Değiştir" name="checkbox next owner can modify" tool_tip="Sonraki sahip öğe adı veya bu nesnenin büyüklüğü gibi özellikleri düzenleyebilir."/>
+				<check_box label="Kopyala" name="checkbox next owner can copy" tool_tip="Sonraki sahip bu nesnenin sınırsız sayıda kopyasını oluşturabilir. Kopyalar oluşturucu bilgisini içerir ve asla kopyalanan öğeden daha fazla izin veren bir özellikte olamaz."/>
+				<check_box label="Aktar" name="checkbox next owner can transfer" tool_tip="Sonraki sahibi bu nesneyi hediye edebilir veya tekrar satabilir."/>
 				<text name="B:">
 					B:
 				</text>
diff --git a/indra/newview/skins/default/xui/tr/floater_top_objects.xml b/indra/newview/skins/default/xui/tr/floater_top_objects.xml
index 013e8d7ce1..35cecd92cf 100644
--- a/indra/newview/skins/default/xui/tr/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/tr/floater_top_objects.xml
@@ -4,7 +4,7 @@
 		Top Komut Dosyaları
 	</floater.string>
 	<floater.string name="top_scripts_text">
-		[COUNT] komut tosyası toplam [TIME] ms sürüyor
+		[COUNT] komut dosyası toplam [TIME] ms zaman alıyor ve [MEMORY] KB bellek kullanıyor
 	</floater.string>
 	<floater.string name="scripts_score_label">
 		Süre
diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml
index e43ca504f7..158308c99b 100644
--- a/indra/newview/skins/default/xui/tr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml
@@ -9,6 +9,7 @@
 		<menu_item_call label="Yerler..." name="Places"/>
 		<menu_item_call label="Favoriler..." name="Picks"/>
 		<menu_item_call label="Deneyimler..." name="Experiences"/>
+		<menu_item_call label="Komut Dosyalarım..." name="MyScripts"/>
 		<menu_item_call label="Kamera Denetimleri..." name="Camera Controls"/>
 		<menu label="Hareket" name="Movement">
 			<menu_item_call label="Otur" name="Sit Down Here"/>
diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml
index 291f8539b3..d80f8e6686 100644
--- a/indra/newview/skins/default/xui/tr/notifications.xml
+++ b/indra/newview/skins/default/xui/tr/notifications.xml
@@ -1589,9 +1589,25 @@ Nesneyi satılık olarak ayarlayıp tekrar deneyin.
 [DOWNLOAD_PATH].
 	</notification>
 	<notification name="RequiredUpdate">
-		Oturum açma için [VERSION] sürümü gerekli. Bu sizin için güncellenmiş olmalıydı ancak görünüşe göre güncellenmemiş. Lütfen www.secondlife.com adresinden indirin.
+		Oturum açmak için [VERSION] sürümü gerekli. 
+Lütfen https://secondlife.com/support/downloads/ adresinden indirin
 		<usetemplate name="okbutton" yestext="Tamam"/>
 	</notification>
+	<notification name="PauseForUpdate">
+		Oturum açmak için [VERSION] sürümü gerekli. 
+İndirmek ve yüklemek için Tamam&apos;a tıklayın.
+		<usetemplate name="okbutton" yestext="Tamam"/>
+	</notification>
+	<notification name="OptionalUpdateReady">
+		[VERSION] sürümü indirildi ve yüklenmeye hazır. 
+Yüklemek için Tamam&apos;a tıklayın.
+		<usetemplate name="okbutton" yestext="Tamam"/>
+	</notification>
+	<notification name="PromptOptionalUpdate">
+		[VERSION] sürümü indirildi ve yüklenmeye hazır. 
+Devam edilsin mi?
+		<usetemplate canceltext="Şimdi Değil" name="yesnocancelbuttons" notext="Atla" yestext="Yükle"/>
+	</notification>
 	<notification name="LoginFailedUnknown">
 		Üzgünüz, oturum açma bilinmeyen bir nedenden dolayı başarısız oldu. Bu mesajı almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
 		<usetemplate name="okbutton" yestext="Çık"/>
@@ -3051,15 +3067,6 @@ Eğer hesabınıza neden erişmek istediğini tam olarak anlamıyorsanız, eriş
 			<button name="Deny" text="Reddet"/>
 		</form>
 	</notification>
-	<notification name="UnknownScriptQuestion">
-		&apos;[NAME]&apos; tarafından sahip olunan bir nesne olan &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; tarafından istenen çalışma zamanı komut dosyası izni görüntüleyici tarafından tanınmadı ve verilemez.
-
-Bu izni vermek için lütfen [DOWNLOADURL] adresinden görüntüleyicinizi en son sürüme güncelleyin.
-		<form name="form">
-			<button name="Deny" text="Tamam"/>
-			<button name="Mute" text="Engelle"/>
-		</form>
-	</notification>
 	<notification name="ScriptDialog">
 		[NAME] adlı kişiye ait &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
 [MESSAGE]
diff --git a/indra/newview/skins/default/xui/tr/panel_status_bar.xml b/indra/newview/skins/default/xui/tr/panel_status_bar.xml
index 7c7bfc7e14..616960ffb4 100644
--- a/indra/newview/skins/default/xui/tr/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/tr/panel_status_bar.xml
@@ -1,16 +1,31 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="status">
-	<panel.string name="packet_loss_tooltip">Paket Kaybı</panel.string>
-	<panel.string name="bandwidth_tooltip">Bant genişliği</panel.string>
-	<panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>
-	<panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>
-	<panel.string name="buycurrencylabel">L$ [AMT]</panel.string>
+	<panel.string name="packet_loss_tooltip">
+		Paket Kaybı
+	</panel.string>
+	<panel.string name="bandwidth_tooltip">
+		Bant genişliği
+	</panel.string>
+	<panel.string name="time">
+		[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+	</panel.string>
+	<panel.string name="timeTooltip">
+		[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+	</panel.string>
+	<panel.string name="buycurrencylabel">
+		L$ [AMT]
+	</panel.string>
+	<panel name="menu_search_panel">
+		<search_editor label="Menülerde Ara" name="search_menu_edit" tool_tip="Merak ettiğiniz arama terimini buraya yazın. Sonuçlar, menü içindeki kısmi tam metin eşleşmeleri şeklinde görüntülenir."/>
+	</panel>
 	<panel left="-446" name="balance_bg" width="215">
 		<text name="balance" tool_tip="L$ bakiyenizi yenilemek için buraya tıklayın" value="L$??"/>
 		<button label="L$ Satın Al" name="buyL" tool_tip="Daha fazla L$ satın almak için tıklayın"/>
 		<button label="Alışveriş yap" name="goShop" tool_tip="Second Life Pazaryeri Aç" width="95"/>
 	</panel>
-	<text name="TimeText" tool_tip="Geçerli zaman (Pasifik)">24:00 AM PST</text>
+	<text name="TimeText" tool_tip="Geçerli zaman (Pasifik)">
+		24:00 AM PST
+	</text>
 	<button name="media_toggle_btn" tool_tip="Tüm Ortam Öğelerini Başlat/Durdur (Müzik, Video, Web sayfaları)"/>
 	<button name="volume_btn" tool_tip="Küresel Ses Kontrolü"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml b/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml
index 92d57deb12..9c1b6a8dfd 100644
--- a/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml
@@ -34,9 +34,11 @@
 			<text name="LabelItemNameTitle">
 				Ad:
 			</text>
+			<line_editor name="LabelItemName" tool_tip="Ad, 63 karakter ile sınırlıdır. Daha uzun prim adları kesilerek kısaltılır. Adlar, dikey çubuk &apos;|&apos; hariç olmak üzere, sadece ASCII-7 (genişletilmemiş) karakter kümesinde bulunan yazdırılabilir karakterlerden oluşabilir."/>
 			<text name="LabelItemDescTitle">
 				Açıklama:
 			</text>
+			<line_editor name="LabelItemDesc" tool_tip="Görüntüleyici ayarlarında &apos;İpuçlarını Tüm Nesnelerin Üzerine Getir&apos; seçildiğinde, fare imlecinin altındaki herhangi bir nesneye ait nesne açıklaması açılır penceresi görülür. Prim (temel öğe) açıklaması 127 bayt ile sınırlıdır ve bundan daha uzun her dize kesilir."/>
 			<text name="LabelCreatorTitle">
 				Oluşturan:
 			</text>
@@ -59,7 +61,7 @@
 				<text name="AnyoneLabel">
 					Herkes:
 				</text>
-				<check_box label="Kopyala" name="CheckEveryoneCopy"/>
+				<check_box label="Kopyala" name="CheckEveryoneCopy" tool_tip="Herkes nesnenin bir kopyasını alabilir. Nesne ve sahip olduğu tüm içerikler kopyalamaya ve aktarıma izin vermelidir."/>
 				<text name="GroupLabel">
 					Grup:
 				</text>
@@ -67,17 +69,17 @@
 				<text name="NextOwnerLabel">
 					Sonraki sahip:
 				</text>
-				<check_box label="Değiştir" name="CheckNextOwnerModify"/>
-				<check_box label="Kopyala" name="CheckNextOwnerCopy"/>
-				<check_box label="Aktar" name="CheckNextOwnerTransfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/>
+				<check_box label="Değiştir" name="CheckNextOwnerModify" tool_tip="Sonraki sahip öğe adı veya bu nesnenin büyüklüğü gibi özellikleri düzenleyebilir."/>
+				<check_box label="Kopyala" name="CheckNextOwnerCopy" tool_tip="Sonraki sahip bu nesnenin sınırsız sayıda kopyasını oluşturabilir. Kopyalar oluşturucu bilgisini içerir ve asla kopyalanan öğeden daha fazla izin veren bir özellikte olamaz."/>
+				<check_box label="Aktar" name="CheckNextOwnerTransfer" tool_tip="Sonraki sahibi bu nesneyi hediye edebilir veya tekrar satabilir."/>
 			</panel>
-			<check_box label="Satılık" name="CheckPurchase"/>
-			<combo_box name="ComboBoxSaleType">
+			<check_box label="Satılık" name="CheckPurchase" tool_tip="İnsanların bu nesneyi, içeriğini veya SL dünyasındaki kopyasını satın almasına izin verin."/>
+			<combo_box name="ComboBoxSaleType" tool_tip="Alıcının bir kopya mı, yani içeriğin kopyasını mı yoksa öğenin kendisini mi alacağını seçin.">
 				<combo_box.item label="Kopyala" name="Copy"/>
 				<combo_box.item label="İçerik" name="Contents"/>
 				<combo_box.item label="Orijinal" name="Original"/>
 			</combo_box>
-			<spinner label="Fiyat: L$" name="Edit Cost"/>
+			<spinner label="Fiyat: L$" name="Edit Cost" tool_tip="Nesne maliyeti."/>
 		</panel>
 	</scroll_container>
 	<panel name="button_panel">
diff --git a/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml
index ddb4bbf160..266ddbd433 100644
--- a/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml
@@ -1,32 +1,74 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="object properties" title="Nesne Profili">
-	<panel.string name="text deed continued">Devret</panel.string>
-	<panel.string name="text deed">Devret</panel.string>
-	<panel.string name="text modify info 1">Bu nesneyi değiştirebilirsiniz</panel.string>
-	<panel.string name="text modify info 2">Bu nesneleri değiştirebilirsiniz</panel.string>
-	<panel.string name="text modify info 3">Bu nesneyi değiştiremezsiniz</panel.string>
-	<panel.string name="text modify info 4">Bu nesneleri değiştiremezsiniz</panel.string>
-	<panel.string name="text modify info 5">Bir bölge sınırı üzerinden bu nesneyi değiştiremezsiniz</panel.string>
-	<panel.string name="text modify info 6">Bir bölge sınırı üzerinden bu nesneleri değiştiremezsiniz</panel.string>
-	<panel.string name="text modify warning">Bu nesne bağlantılı parçalara sahip</panel.string>
-	<panel.string name="Cost Default">Fiyat: L$</panel.string>
-	<panel.string name="Cost Total">Toplam Fiyat: L$</panel.string>
-	<panel.string name="Cost Per Unit">Birim Fiyatı: L$</panel.string>
-	<panel.string name="Cost Mixed">Karma Fiyat</panel.string>
-	<panel.string name="Sale Mixed">Karma Satış</panel.string>
+	<panel.string name="text deed continued">
+		Devret
+	</panel.string>
+	<panel.string name="text deed">
+		Devret
+	</panel.string>
+	<panel.string name="text modify info 1">
+		Bu nesneyi değiştirebilirsiniz
+	</panel.string>
+	<panel.string name="text modify info 2">
+		Bu nesneleri değiştirebilirsiniz
+	</panel.string>
+	<panel.string name="text modify info 3">
+		Bu nesneyi değiştiremezsiniz
+	</panel.string>
+	<panel.string name="text modify info 4">
+		Bu nesneleri değiştiremezsiniz
+	</panel.string>
+	<panel.string name="text modify info 5">
+		Bir bölge sınırı üzerinden bu nesneyi değiştiremezsiniz
+	</panel.string>
+	<panel.string name="text modify info 6">
+		Bir bölge sınırı üzerinden bu nesneleri değiştiremezsiniz
+	</panel.string>
+	<panel.string name="text modify warning">
+		Bu nesne bağlantılı parçalara sahip
+	</panel.string>
+	<panel.string name="Cost Default">
+		Fiyat: L$
+	</panel.string>
+	<panel.string name="Cost Total">
+		Toplam Fiyat: L$
+	</panel.string>
+	<panel.string name="Cost Per Unit">
+		Birim Fiyatı: L$
+	</panel.string>
+	<panel.string name="Cost Mixed">
+		Karma Fiyat
+	</panel.string>
+	<panel.string name="Sale Mixed">
+		Karma Satış
+	</panel.string>
 	<text name="title" value="Nesne Profili"/>
 	<text name="where" value="(SL Dünyası)"/>
 	<panel label="" name="properties_panel">
-		<text name="Name:">Ad:</text>
-		<text name="Description:">Açıklama:</text>
-		<text name="CreatorNameLabel">Oluşturan:</text>
-		<text name="Owner:">Sahip:</text>
-		<text name="Group_label">Grup:</text>
+		<text name="Name:">
+			Ad:
+		</text>
+		<line_editor name="Object Name" tool_tip="Ad, 63 karakter ile sınırlıdır. Daha uzun prim adları kesilerek kısaltılır. Adlar, dikey çubuk &apos;|&apos; hariç olmak üzere, sadece ASCII-7 (genişletilmemiş) karakter kümesinde bulunan yazdırılabilir karakterlerden oluşabilir."/>
+		<text name="Description:">
+			Açıklama:
+		</text>
+		<line_editor name="Object Description" tool_tip="Görüntüleyici ayarlarında &apos;İpuçlarını Tüm Nesnelerin Üzerine Getir&apos; seçildiğinde, fare imlecinin altındaki herhangi bir nesneye ait nesne açıklaması açılır penceresi görülür. Prim (temel öğe) açıklaması 127 bayt ile sınırlıdır ve bundan daha uzun her dize kesilir."/>
+		<text name="CreatorNameLabel">
+			Oluşturan:
+		</text>
+		<text name="Owner:">
+			Sahip:
+		</text>
+		<text name="Group_label">
+			Grup:
+		</text>
 		<button name="button set group" tool_tip="Bu nesnenin izinlerini paylaşmak için bir grup seçin"/>
 		<name_box initial_value="Yükleniyor..." name="Group Name Proxy"/>
 		<button label="Devret" label_selected="Devret" name="button deed" tool_tip="Bu nesne devredilerek verildiğinde, nesnenin sonraki sahibi için izinler geçerli olur. Grup içerisinde paylaşılan nesneler bir grup yetkilisi tarafından devredilebilir."/>
-		<text name="label click action">Şu eylem için tıklayın:</text>
-		<combo_box name="clickaction">
+		<text name="label click action">
+			Şu eylem için tıklayın:
+		</text>
+		<combo_box name="clickaction" tool_tip="Tıklama eylemi, tek bir sol tıklama yoluyla bir nesne ile etkileşime girmenize olanak sağlar. Her tıklama eylemi, ne işe yaradığını gösteren özel bir imlece sahiptir. Bazı tıklama eylemlerinin işlevlerini yerine getirmesi için belirli gereklilikler vardır. Örneğin, Dokun ve Öde komut dosyaları gerektirir">
 			<combo_box.item label="Dokun (varsayılan)" name="Touch/grab(default)"/>
 			<combo_box.item label="Nesnenin üzerine otur" name="Sitonobject"/>
 			<combo_box.item label="Nesneyi satın al" name="Buyobject"/>
@@ -35,37 +77,59 @@
 			<combo_box.item label="Yakınlaştır" name="Zoom"/>
 		</combo_box>
 		<panel name="perms_inv">
-			<text name="perm_modify">Bu nesneyi değiştirebilirsiniz</text>
-			<text name="Anyone can:">Herkes:</text>
-			<check_box label="Kopyala" name="checkbox allow everyone copy"/>
-			<check_box label="Hareket Et" name="checkbox allow everyone move"/>
-			<text name="GroupLabel">Grup:</text>
+			<text name="perm_modify">
+				Bu nesneyi değiştirebilirsiniz
+			</text>
+			<text name="Anyone can:">
+				Herkes:
+			</text>
+			<check_box label="Kopyala" name="checkbox allow everyone copy" tool_tip="Herkes nesnenin bir kopyasını alabilir. Nesne ve sahip olduğu tüm içerikler kopyalamaya ve aktarıma izin vermelidir."/>
+			<check_box label="Hareket Et" name="checkbox allow everyone move" tool_tip="Herkes nesneyi hareket ettirebilir."/>
+			<text name="GroupLabel">
+				Grup:
+			</text>
 			<check_box label="Paylaş" name="checkbox share with group" tool_tip="Ayarlanan grubun tüm üyelerinin, bu nesne için değiştirme izinlerinizi paylaşmasına izin verir. Rol kısıtlamalarını etkinleştirmek için Devretme yapmalısınız."/>
-			<text name="NextOwnerLabel">Sonraki sahip:</text>
-			<check_box label="Değiştir" name="checkbox next owner can modify"/>
-			<check_box label="Kopyala" name="checkbox next owner can copy"/>
+			<text name="NextOwnerLabel">
+				Sonraki sahip:
+			</text>
+			<check_box label="Değiştir" name="checkbox next owner can modify" tool_tip="Sonraki sahip öğe adı veya bu nesnenin büyüklüğü gibi özellikleri düzenleyebilir."/>
+			<check_box label="Kopyala" name="checkbox next owner can copy" tool_tip="Sonraki sahip bu nesnenin sınırsız sayıda kopyasını oluşturabilir. Kopyalar oluşturucu bilgisini içerir ve asla kopyalanan öğeden daha fazla izin veren bir özellikte olamaz."/>
 			<check_box label="Aktar" name="checkbox next owner can transfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/>
 		</panel>
-		<check_box label="Satılık" name="checkbox for sale"/>
-		<combo_box name="sale type">
+		<check_box label="Satılık" name="checkbox for sale" tool_tip="İnsanların bu nesneyi, içeriğini veya SL dünyasındaki kopyasını satın almasına izin verin."/>
+		<combo_box name="sale type" tool_tip="Alıcının bir kopya mı, yani içeriğin kopyasını mı yoksa öğenin kendisini mi alacağını seçin.">
 			<combo_box.item label="Kopyala" name="Copy"/>
 			<combo_box.item label="İçerik" name="Contents"/>
 			<combo_box.item label="Orijinal" name="Original"/>
 		</combo_box>
-		<spinner label="Fiyat: L$" name="Edit Cost"/>
+		<spinner label="Fiyat: L$" name="Edit Cost" tool_tip="Nesne maliyeti."/>
 		<check_box label="Aramada göster" name="search_check" tool_tip="Kişiler arama sonuçlarında bu nesneyi görebilsin"/>
-		<text name="pathfinding_attributes_label">Yol bulma özellikleri:</text>
-		<text name="B:">B:</text>
-		<text name="O:">O:</text>
-		<text name="G:">G:</text>
-		<text name="E:">E:</text>
-		<text name="N:">N:</text>
-		<text name="F:">F:</text>
+		<text name="pathfinding_attributes_label">
+			Yol bulma özellikleri:
+		</text>
+		<text name="B:">
+			B:
+		</text>
+		<text name="O:">
+			O:
+		</text>
+		<text name="G:">
+			G:
+		</text>
+		<text name="E:">
+			E:
+		</text>
+		<text name="N:">
+			N:
+		</text>
+		<text name="F:">
+			F:
+		</text>
 	</panel>
 	<panel name="button_panel">
-		<button label="Aç" name="open_btn"/>
-		<button label="Öde" name="pay_btn"/>
-		<button label="Satın Al" name="buy_btn"/>
-		<button label="Ayrıntl" name="details_btn"/>
+		<button label="Aç" name="open_btn" tool_tip="Nesne İçeriklerini görüntülemek için açın."/>
+		<button label="Öde" name="pay_btn" tool_tip="Ödeme Penceresini Aç. Bunun işe yaraması için nesnenin ödeme komut dosyasına sahip olması gerekir."/>
+		<button label="Satın Al" name="buy_btn" tool_tip="Alım Penceresini Aç. Nesnenin satışa çıkarılmasını gerektirir."/>
+		<button label="Ayrıntl" name="details_btn" tool_tip="Nesneyi İncele Penceresini Aç."/>
 	</panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
index ea6f2115e4..222e0da6a4 100644
--- a/indra/newview/skins/default/xui/tr/strings.xml
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -2269,7 +2269,7 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin
 		Göğüs
 	</string>
 	<string name="ATTACH_HEAD">
-		Baş
+		Kafatası
 	</string>
 	<string name="ATTACH_LSHOULDER">
 		Sol Omuz
@@ -2290,7 +2290,7 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin
 		Sağ Ayak
 	</string>
 	<string name="ATTACH_BACK">
-		Geri
+		Omurga
 	</string>
 	<string name="ATTACH_PELVIS">
 		Leğen Kemiği
@@ -2320,13 +2320,13 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin
 		Sol Üst Kol
 	</string>
 	<string name="ATTACH_RLARM">
-		Sağ Alt Kol
+		Sağ Ön Kol
 	</string>
 	<string name="ATTACH_LUARM">
 		Sol Üst Kol
 	</string>
 	<string name="ATTACH_LLARM">
-		Sol Alt Kol
+		Sol Ön Kol
 	</string>
 	<string name="ATTACH_RHIP">
 		Sağ Kalça
@@ -2347,7 +2347,7 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin
 		Sol Alt Bacak
 	</string>
 	<string name="ATTACH_BELLY">
-		Göbek
+		Karın
 	</string>
 	<string name="ATTACH_LEFT_PEC">
 		Sol Göğüs
diff --git a/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml b/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml
index c103ea938f..dbf4a21416 100644
--- a/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml
@@ -29,17 +29,17 @@
 	<text name="GroupLabel">
 		群組:
 	</text>
-	<check_box label="分享" name="share_with_group"/>
+	<check_box label="分享" name="share_with_group" tool_tip="允許此群組所有成員共享你修改此物件的權限。 你必須讓渡才能啟動角色限制。"/>
 	<text name="AnyoneLabel">
 		任何人:
 	</text>
-	<check_box label="恚庨" name="everyone_copy"/>
+	<check_box label="複製" name="everyone_copy" tool_tip="任何人都可取用本物件的複本。 物件和其所有內容都必須允許複製和轉移"/>
 	<text name="NextOwnerLabel">
 		下一個所有人:
 	</text>
-	<check_box label="修改" name="next_owner_modify"/>
-	<check_box label="恚庨" name="next_owner_copy"/>
-	<check_box initial_value="true" label="轉移" name="next_owner_transfer" tool_tip="下一個所有人可贈送或轉售這個物件"/>
+	<check_box label="修改" name="next_owner_modify" tool_tip="下一個所有人可以編輯本物件的性質,如名稱或尺寸。"/>
+	<check_box label="複製" name="next_owner_copy" tool_tip="下一個所有人可無限複製本物件。 複本將保留創作人的資料,其允許設定不能比原本物件更加放寬。"/>
+	<check_box initial_value="true" label="轉移" name="next_owner_transfer" tool_tip="下一個所有人可贈送或轉售這個物件。"/>
 	<button label="確定" name="ok"/>
 	<button label="套用" name="apply"/>
 	<button label="取消" name="close"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_my_scripts.xml b/indra/newview/skins/default/xui/zh/floater_my_scripts.xml
new file mode 100644
index 0000000000..0c68dd0e88
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_my_scripts.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="myscripts" title="我的腳本"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_preferences.xml b/indra/newview/skins/default/xui/zh/floater_preferences.xml
index 7f35f40b9e..fd640ca63d 100644
--- a/indra/newview/skins/default/xui/zh/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/zh/floater_preferences.xml
@@ -6,6 +6,9 @@ https://accounts.secondlife.com/change_email/
 	</floater.string>
 	<button label="確定" label_selected="確定" name="OK"/>
 	<button label="取消" label_selected="取消" name="Cancel"/>
+	<panel name="search_panel">
+		<search_editor label="搜尋設定" name="search_prefs_edit" tool_tip="在這裡輸入你想搜索的字詞。 若在設定的名稱或評論中有全文配對結果,將會顯示部分結果。"/>
+	</panel>
 	<tab_container name="pref core">
 		<panel label="基本設定" name="general"/>
 		<panel label="顯像" name="display"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_tools.xml b/indra/newview/skins/default/xui/zh/floater_tools.xml
index f51f7a8ae2..1ac35487ba 100644
--- a/indra/newview/skins/default/xui/zh/floater_tools.xml
+++ b/indra/newview/skins/default/xui/zh/floater_tools.xml
@@ -175,9 +175,11 @@
 			<text name="Name:">
 				名稱:
 			</text>
+			<line_editor name="Object Name" tool_tip="名稱限長63字元。 幾何元件名稱超過限長,會被截短。 名稱僅可使用ASCII-7字元集(非延伸版)的可列印字元,唯一的例外是垂直槓字元「|」。"/>
 			<text name="Description:">
 				描述:
 			</text>
+			<line_editor name="Object Description" tool_tip="當人們在瀏覽器設定中選擇了「針對所有物件懸置顯示提醒」時,他們滑鼠所指的物件將會彈出描述該物件的內容。 幾何元件的描述內容不得超過127位元組,否則會被截短。"/>
 			<text name="Creator:">
 				創造者:
 			</text>
@@ -194,7 +196,7 @@
 			<text name="label click action">
 				點按以:
 			</text>
-			<combo_box name="clickaction">
+			<combo_box name="clickaction" tool_tip="點按的動作讓你點一下滑鼠左鍵,就可以與物件互動。 每一個動作都有特殊的游標,顯示它的作用。 有些點按動作需配合其他條件才可正常運作。 例如,觸摸和付款動作要有配合腳本">
 				<combo_box.item label="觸碰(預設)" name="Touch/grab(default)"/>
 				<combo_box.item label="坐在物件上" name="Sitonobject"/>
 				<combo_box.item label="購買物件" name="Buyobject"/>
@@ -202,9 +204,9 @@
 				<combo_box.item label="打開" name="Open"/>
 				<combo_box.item label="縮放" name="Zoom"/>
 			</combo_box>
-			<check_box label="出售中:" name="checkbox for sale"/>
-			<spinner label="L$" name="Edit Cost"/>
-			<combo_box name="sale type">
+			<check_box label="出售中:" name="checkbox for sale" tool_tip="允許別人在虛擬世界裡以特定的價格購買此物件、其內容或其複本。"/>
+			<spinner label="L$" name="Edit Cost" tool_tip="物件成本。"/>
+			<combo_box name="sale type" tool_tip="決定購買者會收到物件複本、物件內容複本、還是物件本身。">
 				<combo_box.item label="恚庨" name="Copy"/>
 				<combo_box.item label="內容" name="Contents"/>
 				<combo_box.item label="原件" name="Original"/>
@@ -217,14 +219,14 @@
 				<text name="Anyone can:">
 					任何人:
 				</text>
-				<check_box label="移動" name="checkbox allow everyone move"/>
-				<check_box label="恚庨" name="checkbox allow everyone copy"/>
+				<check_box label="移動" name="checkbox allow everyone move" tool_tip="任何人皆可移動該物件。"/>
+				<check_box label="恚庨" name="checkbox allow everyone copy" tool_tip="任何人都可取用本物件的複本。 物件和其所有內容都必須允許複製和轉移。"/>
 				<text name="Next owner can:">
 					下一個所有人:
 				</text>
-				<check_box label="修改" name="checkbox next owner can modify"/>
-				<check_box label="恚庨" name="checkbox next owner can copy"/>
-				<check_box label="轉移" name="checkbox next owner can transfer" tool_tip="下一個所有人可贈送或轉售這個物件"/>
+				<check_box label="修改" name="checkbox next owner can modify" tool_tip="下一個所有人可以編輯本物件的性質,如名稱或尺寸。"/>
+				<check_box label="恚庨" name="checkbox next owner can copy" tool_tip="下一個所有人可無限複製本物件。 複本將保留創作人的資料,其允許設定不能比原本物件更加放寬。"/>
+				<check_box label="轉移" name="checkbox next owner can transfer" tool_tip="下一個所有人可贈送或轉售這個物件。"/>
 				<text name="B:">
 					B:
 				</text>
diff --git a/indra/newview/skins/default/xui/zh/floater_top_objects.xml b/indra/newview/skins/default/xui/zh/floater_top_objects.xml
index 58530f00c1..d42ae5bc8f 100644
--- a/indra/newview/skins/default/xui/zh/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/zh/floater_top_objects.xml
@@ -4,7 +4,7 @@
 		排行最高的腳本
 	</floater.string>
 	<floater.string name="top_scripts_text">
-		[COUNT] 個腳本共需時 [TIME] 毫秒
+		[COUNT]個腳本共需時[TIME]毫秒,耗用[MEMORY]KB
 	</floater.string>
 	<floater.string name="scripts_score_label">
 		時間
diff --git a/indra/newview/skins/default/xui/zh/menu_viewer.xml b/indra/newview/skins/default/xui/zh/menu_viewer.xml
index a8ac7cbf0e..a1f438ff72 100644
--- a/indra/newview/skins/default/xui/zh/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml
@@ -9,6 +9,7 @@
 		<menu_item_call label="地點…" name="Places"/>
 		<menu_item_call label="精選地點…" name="Picks"/>
 		<menu_item_call label="體驗…" name="Experiences"/>
+		<menu_item_call label="我的腳本…" name="MyScripts"/>
 		<menu_item_call label="攝影機控制…" name="Camera Controls"/>
 		<menu label="動作" name="Movement">
 			<menu_item_call label="坐下" name="Sit Down Here"/>
diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml
index e8b2481a7c..c5fdea8578 100644
--- a/indra/newview/skins/default/xui/zh/notifications.xml
+++ b/indra/newview/skins/default/xui/zh/notifications.xml
@@ -1583,10 +1583,24 @@ SHA1 指紋:[MD5_DIGEST]
 	</notification>
 	<notification name="RequiredUpdate">
 		必須用[VERSION]版本登入。
-本來應該已經完成更新,但看來你的尚未更新。
 請到 http://secondlife.com/support/ 下載更新版
 		<usetemplate name="okbutton" yestext="確定"/>
 	</notification>
+	<notification name="PauseForUpdate">
+		必須用[VERSION]版本登入。
+點按「確定」開始下載並安裝。
+		<usetemplate name="okbutton" yestext="確定"/>
+	</notification>
+	<notification name="OptionalUpdateReady">
+		版本[VERSION]已下載,可以開始安裝。
+點按「確定」開始安裝。
+		<usetemplate name="okbutton" yestext="確定"/>
+	</notification>
+	<notification name="PromptOptionalUpdate">
+		版本[VERSION]已下載,可以開始安裝。
+繼續?
+		<usetemplate canceltext="暫時不要" name="yesnocancelbuttons" notext="略過" yestext="安裝"/>
+	</notification>
 	<notification name="LoginFailedUnknown">
 		抱歉,登入失敗,原因不明。
 如果你一直看到此訊息,請查閱 [SUPPORT_SITE]。
@@ -3047,15 +3061,6 @@ SHA1 指紋:[MD5_DIGEST]
 			<button name="Deny" text="拒絕"/>
 		</form>
 	</notification>
-	<notification name="UnknownScriptQuestion">
-		由 &apos;[NAME]&apos; 所擁有的物件 &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; 正請求某項執行時期腳本權限,但本瀏覽器無法辨識該權限,故不允准。
-
-欲准許此權限,請從 [DOWNLOADURL] 下載並更新為最新版瀏覽器。
-		<form name="form">
-			<button name="Deny" text="確定"/>
-			<button name="Mute" text="封鎖"/>
-		</form>
-	</notification>
 	<notification name="ScriptDialog">
 		[NAME] 的 &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
 [MESSAGE]
diff --git a/indra/newview/skins/default/xui/zh/panel_status_bar.xml b/indra/newview/skins/default/xui/zh/panel_status_bar.xml
index 2de31eb526..0d6fcea451 100644
--- a/indra/newview/skins/default/xui/zh/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/zh/panel_status_bar.xml
@@ -1,16 +1,31 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="status">
-	<panel.string name="packet_loss_tooltip">封包損失</panel.string>
-	<panel.string name="bandwidth_tooltip">頻寬</panel.string>
-	<panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>
-	<panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>
-	<panel.string name="buycurrencylabel">L$ [AMT]</panel.string>
+	<panel.string name="packet_loss_tooltip">
+		封包損失
+	</panel.string>
+	<panel.string name="bandwidth_tooltip">
+		頻寬
+	</panel.string>
+	<panel.string name="time">
+		[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+	</panel.string>
+	<panel.string name="timeTooltip">
+		[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+	</panel.string>
+	<panel.string name="buycurrencylabel">
+		L$ [AMT]
+	</panel.string>
+	<panel name="menu_search_panel">
+		<search_editor label="搜尋選單" name="search_menu_edit" tool_tip="在這裡輸入你想搜索的字詞。 若在選單中有全文配對到結果,將會顯示部分結果。"/>
+	</panel>
 	<panel name="balance_bg">
 		<text name="balance" tool_tip="點按以重新更新你的 L$ 帳戶餘額" value="L$??"/>
 		<button label="購買 L$" name="buyL" tool_tip="點按以購買更多 L$"/>
 		<button label="購物" name="goShop" tool_tip="打開第二人生購物市集"/>
 	</panel>
-	<text name="TimeText" tool_tip="目前時區(太平洋)">24:00 AM PST</text>
+	<text name="TimeText" tool_tip="目前時區(太平洋)">
+		24:00 AM PST
+	</text>
 	<button name="media_toggle_btn" tool_tip="開始/停止全部媒體(音樂、影片、網頁)"/>
 	<button name="volume_btn" tool_tip="全域音量控制"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml
index 9c5798d256..61c52066d0 100644
--- a/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml
@@ -34,9 +34,11 @@
 			<text name="LabelItemNameTitle">
 				名稱:
 			</text>
+			<line_editor name="LabelItemName" tool_tip="名稱限長63字元。 幾何元件名稱超過限長,會被截短。 名稱僅可使用ASCII-7字元集(非延伸版)的可列印字元,唯一的例外是垂直槓字元「|」。"/>
 			<text name="LabelItemDescTitle">
 				描述:
 			</text>
+			<line_editor name="LabelItemDesc" tool_tip="當人們在瀏覽器設定中選擇了「針對所有物件懸置顯示提醒」時,他們滑鼠所指的物件將會彈出描述該物件的內容。 幾何元件的描述內容不得超過127位元組,否則會被截短。"/>
 			<text name="LabelCreatorTitle">
 				創造者:
 			</text>
@@ -59,7 +61,7 @@
 				<text name="AnyoneLabel">
 					任何人:
 				</text>
-				<check_box label="複製" name="CheckEveryoneCopy"/>
+				<check_box label="複製" name="CheckEveryoneCopy" tool_tip="任何人都可取用本物件的複本。 物件和其所有內容都必須允許複製和轉移。"/>
 				<text name="GroupLabel">
 					群組:
 				</text>
@@ -67,17 +69,17 @@
 				<text name="NextOwnerLabel">
 					下一個所有人:
 				</text>
-				<check_box label="修改" name="CheckNextOwnerModify"/>
-				<check_box label="複製" name="CheckNextOwnerCopy"/>
-				<check_box label="轉移" name="CheckNextOwnerTransfer" tool_tip="下一個所有人可贈送或轉售這個物件"/>
+				<check_box label="修改" name="CheckNextOwnerModify" tool_tip="下一個所有人可以編輯本物件的性質,如名稱或尺寸。"/>
+				<check_box label="複製" name="CheckNextOwnerCopy" tool_tip="下一個所有人可無限複製本物件。 複本將保留創作人的資料,其允許設定不能比原本物件更加放寬。"/>
+				<check_box label="轉移" name="CheckNextOwnerTransfer" tool_tip="下一個所有人可贈送或轉售這個物件。"/>
 			</panel>
-			<check_box label="出售" name="CheckPurchase"/>
-			<combo_box name="ComboBoxSaleType">
+			<check_box label="出售" name="CheckPurchase" tool_tip="允許別人在虛擬世界裡以特定的價格購買此物件、其內容或其複本。"/>
+			<combo_box name="ComboBoxSaleType" tool_tip="決定購買者會收到物件複本、物件內容複本、還是物件本身。">
 				<combo_box.item label="複製" name="Copy"/>
 				<combo_box.item label="內容" name="Contents"/>
 				<combo_box.item label="原件" name="Original"/>
 			</combo_box>
-			<spinner label="價格: L$" name="Edit Cost"/>
+			<spinner label="價格: L$" name="Edit Cost" tool_tip="物件成本。"/>
 		</panel>
 	</scroll_container>
 	<panel name="button_panel">
diff --git a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml
index 0884f1789b..5ca10e5bda 100644
--- a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml
@@ -1,32 +1,74 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="object properties" title="物件檔案">
-	<panel.string name="text deed continued">讓渡</panel.string>
-	<panel.string name="text deed">讓渡</panel.string>
-	<panel.string name="text modify info 1">你能修改這個物件</panel.string>
-	<panel.string name="text modify info 2">你能修改這些物件</panel.string>
-	<panel.string name="text modify info 3">你不能修改這個物件</panel.string>
-	<panel.string name="text modify info 4">你不能修改這些物件</panel.string>
-	<panel.string name="text modify info 5">無法跨地區修改這個物件</panel.string>
-	<panel.string name="text modify info 6">無法跨地區修改這些物件</panel.string>
-	<panel.string name="text modify warning">這個物件含有聯結的部分</panel.string>
-	<panel.string name="Cost Default">價格: L$</panel.string>
-	<panel.string name="Cost Total">總價格:L$</panel.string>
-	<panel.string name="Cost Per Unit">單價:L$</panel.string>
-	<panel.string name="Cost Mixed">混合價格</panel.string>
-	<panel.string name="Sale Mixed">混合銷售</panel.string>
+	<panel.string name="text deed continued">
+		讓渡
+	</panel.string>
+	<panel.string name="text deed">
+		讓渡
+	</panel.string>
+	<panel.string name="text modify info 1">
+		你能修改這個物件
+	</panel.string>
+	<panel.string name="text modify info 2">
+		你能修改這些物件
+	</panel.string>
+	<panel.string name="text modify info 3">
+		你不能修改這個物件
+	</panel.string>
+	<panel.string name="text modify info 4">
+		你不能修改這些物件
+	</panel.string>
+	<panel.string name="text modify info 5">
+		無法跨地區修改這個物件
+	</panel.string>
+	<panel.string name="text modify info 6">
+		無法跨地區修改這些物件
+	</panel.string>
+	<panel.string name="text modify warning">
+		這個物件含有聯結的部分
+	</panel.string>
+	<panel.string name="Cost Default">
+		價格: L$
+	</panel.string>
+	<panel.string name="Cost Total">
+		總價格:L$
+	</panel.string>
+	<panel.string name="Cost Per Unit">
+		單價:L$
+	</panel.string>
+	<panel.string name="Cost Mixed">
+		混合價格
+	</panel.string>
+	<panel.string name="Sale Mixed">
+		混合銷售
+	</panel.string>
 	<text name="title" value="物件檔案"/>
 	<text name="where" value="(在虛擬世界)"/>
 	<panel label="" name="properties_panel">
-		<text name="Name:">名稱:</text>
-		<text name="Description:">描述:</text>
-		<text name="CreatorNameLabel">創造者:</text>
-		<text name="Owner:">所有人:</text>
-		<text name="Group_label">群組:</text>
+		<text name="Name:">
+			名稱:
+		</text>
+		<line_editor name="Object Name" tool_tip="名稱限長63字元。 幾何元件名稱超過限長,會被截短。 名稱僅可使用ASCII-7字元集(非延伸版)的可列印字元,唯一的例外是垂直槓字元「|」。"/>
+		<text name="Description:">
+			描述:
+		</text>
+		<line_editor name="Object Description" tool_tip="當人們在瀏覽器設定中選擇了「針對所有物件懸置顯示提醒」時,他們滑鼠所指的物件將會彈出描述該物件的內容。 幾何元件的描述內容不得超過127位元組,否則會被截短。"/>
+		<text name="CreatorNameLabel">
+			創造者:
+		</text>
+		<text name="Owner:">
+			所有人:
+		</text>
+		<text name="Group_label">
+			群組:
+		</text>
 		<button name="button set group" tool_tip="選擇一個群組以分享這物件的權限"/>
 		<name_box initial_value="載入中..." name="Group Name Proxy"/>
 		<button label="讓渡" label_selected="讓渡" name="button deed" tool_tip="「讓渡」會把這物件贈送出去並賦予「下一個所有人」權限。 群組所分享的物件可由群組職員加以讓渡。"/>
-		<text name="label click action">點按以:</text>
-		<combo_box name="clickaction">
+		<text name="label click action">
+			點按以:
+		</text>
+		<combo_box name="clickaction" tool_tip="點按的動作讓你點一下滑鼠左鍵,就可以與物件互動。 每一個動作都有特殊的游標,顯示它的作用。 有些點按動作需配合其他條件才可正常運作。 例如,觸摸和付款動作要有配合腳本">
 			<combo_box.item label="觸碰(預設)" name="Touch/grab(default)"/>
 			<combo_box.item label="坐在物件上" name="Sitonobject"/>
 			<combo_box.item label="購買物件" name="Buyobject"/>
@@ -35,37 +77,59 @@
 			<combo_box.item label="縮放" name="Zoom"/>
 		</combo_box>
 		<panel name="perms_inv">
-			<text name="perm_modify">你能修改這個物件</text>
-			<text name="Anyone can:">任何人:</text>
-			<check_box label="恚庨" name="checkbox allow everyone copy"/>
-			<check_box label="移動" name="checkbox allow everyone move"/>
-			<text name="GroupLabel">群組:</text>
+			<text name="perm_modify">
+				你能修改這個物件
+			</text>
+			<text name="Anyone can:">
+				任何人:
+			</text>
+			<check_box label="恚庨" name="checkbox allow everyone copy" tool_tip="任何人都可取用本物件的複本。 物件和其所有內容都必須允許複製和轉移。"/>
+			<check_box label="移動" name="checkbox allow everyone move" tool_tip="任何人皆可移動該物件。"/>
+			<text name="GroupLabel">
+				群組:
+			</text>
 			<check_box label="分享" name="checkbox share with group" tool_tip="允許此群組所有成員共享你修改此物件的權限。 你必須讓渡才能啟動角色限制。"/>
-			<text name="NextOwnerLabel">下一個所有人:</text>
-			<check_box label="修改" name="checkbox next owner can modify"/>
-			<check_box label="恚庨" name="checkbox next owner can copy"/>
+			<text name="NextOwnerLabel">
+				下一個所有人:
+			</text>
+			<check_box label="修改" name="checkbox next owner can modify" tool_tip="下一個所有人可以編輯本物件的性質,如名稱或尺寸。"/>
+			<check_box label="恚庨" name="checkbox next owner can copy" tool_tip="下一個所有人可無限複製本物件。 複本將保留創作人的資料,其允許設定不能比原本物件更加放寬。"/>
 			<check_box label="轉移" name="checkbox next owner can transfer" tool_tip="下一個所有人可贈送或轉售這個物件"/>
 		</panel>
-		<check_box label="出售" name="checkbox for sale"/>
-		<combo_box name="sale type">
+		<check_box label="出售" name="checkbox for sale" tool_tip="允許別人在虛擬世界裡以特定的價格購買此物件、其內容或其複本。"/>
+		<combo_box name="sale type" tool_tip="決定購買者會收到物件複本、物件內容複本、還是物件本身。">
 			<combo_box.item label="恚庨" name="Copy"/>
 			<combo_box.item label="內容" name="Contents"/>
 			<combo_box.item label="原件" name="Original"/>
 		</combo_box>
-		<spinner label="價格: L$" name="Edit Cost"/>
+		<spinner label="價格: L$" name="Edit Cost" tool_tip="物件成本。"/>
 		<check_box label="顯示在搜尋中" name="search_check" tool_tip="讓其他人可以在搜尋結果中察看到此物件"/>
-		<text name="pathfinding_attributes_label">尋徑屬性:</text>
-		<text name="B:">B:</text>
-		<text name="O:">O:</text>
-		<text name="G:">G:</text>
-		<text name="E:">E:</text>
-		<text name="N:">N:</text>
-		<text name="F:">F:</text>
+		<text name="pathfinding_attributes_label">
+			尋徑屬性:
+		</text>
+		<text name="B:">
+			B:
+		</text>
+		<text name="O:">
+			O:
+		</text>
+		<text name="G:">
+			G:
+		</text>
+		<text name="E:">
+			E:
+		</text>
+		<text name="N:">
+			N:
+		</text>
+		<text name="F:">
+			F:
+		</text>
 	</panel>
 	<panel name="button_panel">
-		<button label="打開" name="open_btn"/>
-		<button label="支付" name="pay_btn"/>
-		<button label="購買" name="buy_btn"/>
-		<button label="細節" name="details_btn"/>
+		<button label="打開" name="open_btn" tool_tip="開啓後可瀏覽物件內容。"/>
+		<button label="支付" name="pay_btn" tool_tip="開啟付款視窗。 物件必須有付款腳本,這功能才能正常運作。"/>
+		<button label="購買" name="buy_btn" tool_tip="開啟購買視窗。 物件需要設定為待售。"/>
+		<button label="細節" name="details_btn" tool_tip="開啟檢驗物件視窗。"/>
 	</panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml
index f8fd727145..036a2f6713 100644
--- a/indra/newview/skins/default/xui/zh/strings.xml
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -2265,7 +2265,7 @@ http://secondlife.com/support 求助解決問題。
 		胸部
 	</string>
 	<string name="ATTACH_HEAD">
-		頭部
+		頭顱
 	</string>
 	<string name="ATTACH_LSHOULDER">
 		左肩
@@ -2286,7 +2286,7 @@ http://secondlife.com/support 求助解決問題。
 		右腳
 	</string>
 	<string name="ATTACH_BACK">
-		背部
+		脊椎
 	</string>
 	<string name="ATTACH_PELVIS">
 		骨盆
-- 
cgit v1.2.3


From db6d4a3cb45e65d06f2e2dca54b5352694cd0a16 Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Mon, 15 Apr 2019 20:26:13 +0300
Subject: SL-10888 Fixed OSX mouse issues in HiDPI mode

---
 indra/llwindow/llopenglview-objc.mm   | 14 +++++++++++++-
 indra/llwindow/llwindowmacosx-objc.h  |  6 +++---
 indra/llwindow/llwindowmacosx-objc.mm |  6 +++---
 indra/llwindow/llwindowmacosx.cpp     |  8 ++++++--
 4 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm
index 65c0a53a96..33eed7227a 100644
--- a/indra/llwindow/llopenglview-objc.mm
+++ b/indra/llwindow/llopenglview-objc.mm
@@ -343,7 +343,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
 
 - (void) mouseDown:(NSEvent *)theEvent
 {
-    NSPoint mPoint = [theEvent locationInWindow];
+    NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
     mMousePos[0] = mPoint.x;
     mMousePos[1] = mPoint.y;
 
@@ -384,11 +384,17 @@ attributedStringInfo getSegments(NSAttributedString *str)
 
 - (void) rightMouseDown:(NSEvent *)theEvent
 {
+    NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
+    mMousePos[0] = mPoint.x;
+    mMousePos[1] = mPoint.y;
 	callRightMouseDown(mMousePos, [theEvent modifierFlags]);
 }
 
 - (void) rightMouseUp:(NSEvent *)theEvent
 {
+    NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
+    mMousePos[0] = mPoint.x;
+    mMousePos[1] = mPoint.y;
 	callRightMouseUp(mMousePos, [theEvent modifierFlags]);
 }
 
@@ -435,11 +441,17 @@ attributedStringInfo getSegments(NSAttributedString *str)
 
 - (void) otherMouseDown:(NSEvent *)theEvent
 {
+    NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
+    mMousePos[0] = mPoint.x;
+    mMousePos[1] = mPoint.y;
 	callMiddleMouseDown(mMousePos, [theEvent modifierFlags]);
 }
 
 - (void) otherMouseUp:(NSEvent *)theEvent
 {
+    NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
+    mMousePos[0] = mPoint.x;
+    mMousePos[1] = mPoint.y;
 	callMiddleMouseUp(mMousePos, [theEvent modifierFlags]);
 }
 
diff --git a/indra/llwindow/llwindowmacosx-objc.h b/indra/llwindow/llwindowmacosx-objc.h
index 34da99de19..10bd3cbb91 100644
--- a/indra/llwindow/llwindowmacosx-objc.h
+++ b/indra/llwindow/llwindowmacosx-objc.h
@@ -110,9 +110,9 @@ void glSwapBuffers(void* context);
 CGLContextObj getCGLContextObj(GLViewRef view);
 unsigned long getVramSize(GLViewRef view);
 float getDeviceUnitSize(GLViewRef view);
-const CGPoint & getContentViewBoundsPosition(NSWindowRef window);
-const CGSize & getContentViewBoundsSize(NSWindowRef window);
-const CGSize & getDeviceContentViewSize(NSWindowRef window, GLViewRef view);
+const CGPoint getContentViewBoundsPosition(NSWindowRef window);
+const CGSize getContentViewBoundsSize(NSWindowRef window);
+const CGSize getDeviceContentViewSize(NSWindowRef window, GLViewRef view);
 void getWindowSize(NSWindowRef window, float* size);
 void setWindowSize(NSWindowRef window, int width, int height);
 void getCursorPos(NSWindowRef window, float* pos);
diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm
index c3eb9b8c8a..8fece7c5c7 100644
--- a/indra/llwindow/llwindowmacosx-objc.mm
+++ b/indra/llwindow/llwindowmacosx-objc.mm
@@ -258,17 +258,17 @@ float getDeviceUnitSize(GLViewRef view)
 	return [(LLOpenGLView*)view convertSizeToBacking:NSMakeSize(1, 1)].width;
 }
 
-const CGPoint & getContentViewBoundsPosition(NSWindowRef window)
+const CGPoint getContentViewBoundsPosition(NSWindowRef window)
 {
 	return [[(LLNSWindow*)window contentView] bounds].origin;
 }
 
-const CGSize & getContentViewBoundsSize(NSWindowRef window)
+const CGSize getContentViewBoundsSize(NSWindowRef window)
 {
 	return [[(LLNSWindow*)window contentView] bounds].size;
 }
 
-const CGSize & getDeviceContentViewSize(NSWindowRef window, GLViewRef view)
+const CGSize getDeviceContentViewSize(NSWindowRef window, GLViewRef view)
 {
     return [(NSOpenGLView*)view convertRectToBacking:[[(LLNSWindow*)window contentView] bounds]].size;
 }
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index fedea3de08..6dec131a34 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -869,10 +869,11 @@ BOOL LLWindowMacOSX::getSize(LLCoordScreen *size)
 
 		size->mX = sz.width;
 		size->mY = sz.height;
+        err = noErr;
 	}
 	else
 	{
-		LL_ERRS() << "LLWindowMacOSX::getPosition(): no window and not fullscreen!" << LL_ENDL;
+		LL_ERRS() << "LLWindowMacOSX::getSize(): no window and not fullscreen!" << LL_ENDL;
 	}
 
 	return (err == noErr);
@@ -894,10 +895,13 @@ BOOL LLWindowMacOSX::getSize(LLCoordWindow *size)
 		
 		size->mX = sz.width;
 		size->mY = sz.height;
+        err = noErr;
+        
+        
 	}
 	else
 	{
-		LL_ERRS() << "LLWindowMacOSX::getPosition(): no window and not fullscreen!" << LL_ENDL;
+		LL_ERRS() << "LLWindowMacOSX::getSize(): no window and not fullscreen!" << LL_ENDL;
 	}
 	
 	return (err == noErr);
-- 
cgit v1.2.3


From 099e58f75b3edc036cff9f6cf5587dacaf16e3fc Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Tue, 23 Apr 2019 15:13:38 +0100
Subject: SL-10401 - get agent attachment limit from SimulatorFeatures if
 available

---
 indra/llcommon/indra_constants.h    |  1 -
 indra/newview/llcofwearables.cpp    |  3 ++-
 indra/newview/llinventorybridge.cpp |  2 +-
 indra/newview/llvoavatar.cpp        | 25 +++++++++++++++++++++++--
 indra/newview/llvoavatar.h          |  1 +
 5 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h
index a00a82aff0..c0213d7c16 100644
--- a/indra/llcommon/indra_constants.h
+++ b/indra/llcommon/indra_constants.h
@@ -153,7 +153,6 @@ const U8 SIM_ACCESS_DOWN	= 254;
 const U8 SIM_ACCESS_MAX 	= SIM_ACCESS_ADULT;
 
 // attachment constants
-const S32 MAX_AGENT_ATTACHMENTS = 38;
 const U8  ATTACHMENT_ADD = 0x80;
 
 // god levels
diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp
index 307f93e28c..b47e0930a3 100644
--- a/indra/newview/llcofwearables.cpp
+++ b/indra/newview/llcofwearables.cpp
@@ -42,6 +42,7 @@
 #include "llwearableitemslist.h"
 #include "llpaneloutfitedit.h"
 #include "lltrans.h"
+#include "llvoavatarself.h"
 
 static LLPanelInjector<LLCOFWearables> t_cof_wearables("cof_wearables");
 
@@ -330,7 +331,7 @@ void LLCOFWearables::setAttachmentsTitle()
 {
 	if (mAttachmentsTab)
 	{
-		U32 free_slots = MAX_AGENT_ATTACHMENTS - mAttachments->size();
+		U32 free_slots = gAgentAvatarp->getMaxAttachments() - mAttachments->size();
 
 		LLStringUtil::format_map_t args_attachments;
 		args_attachments["[COUNT]"] = llformat ("%d", free_slots);
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 1987e15850..b3f6d354df 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -6307,7 +6307,7 @@ bool confirm_attachment_rez(const LLSD& notification, const LLSD& response)
 	if (!gAgentAvatarp->canAttachMoreObjects())
 	{
 		LLSD args;
-		args["MAX_ATTACHMENTS"] = llformat("%d", MAX_AGENT_ATTACHMENTS);
+		args["MAX_ATTACHMENTS"] = llformat("%d", gAgentAvatarp->getMaxAttachments());
 		LLNotificationsUtil::add("MaxAttachmentsOnOutfit", args);
 		return false;
 	}
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 321f774210..c9f2ba1a3c 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -7036,13 +7036,34 @@ U32 LLVOAvatar::getNumAttachments() const
 	return num_attachments;
 }
 
+//-----------------------------------------------------------------------------
+// getMaxAttachments()
+//-----------------------------------------------------------------------------
+S32 LLVOAvatar::getMaxAttachments() const
+{
+	const S32 MAX_AGENT_ATTACHMENTS = 38;
+
+	S32 max_attach = MAX_AGENT_ATTACHMENTS;
+	
+	if (gAgent.getRegion())
+	{
+		LLSD features;
+		gAgent.getRegion()->getSimulatorFeatures(features);
+		if (features.has("MaxAgentAttachments"))
+		{
+			max_attach = features["MaxAgentAttachments"].asInteger();
+		}
+	}
+	return max_attach;
+}
+
 //-----------------------------------------------------------------------------
 // canAttachMoreObjects()
 // Returns true if we can attach <n> more objects.
 //-----------------------------------------------------------------------------
 BOOL LLVOAvatar::canAttachMoreObjects(U32 n) const
 {
-	return (getNumAttachments() + n) <= MAX_AGENT_ATTACHMENTS;
+	return (getNumAttachments() + n) <= getMaxAttachments();
 }
 
 //-----------------------------------------------------------------------------
@@ -7070,7 +7091,7 @@ S32 LLVOAvatar::getMaxAnimatedObjectAttachments() const
     S32 max_attach = 0;
     if (gSavedSettings.getBOOL("AnimatedObjectsIgnoreLimits"))
     {
-        max_attach = MAX_AGENT_ATTACHMENTS;
+        max_attach = getMaxAttachments(); 
     }
     else
     {
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index deb22617a4..e1ea7c619b 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -809,6 +809,7 @@ public:
 	BOOL 				hasHUDAttachment() const;
 	LLBBox 				getHUDBBox() const;
 	void 				resetHUDAttachments();
+	S32					getMaxAttachments() const;
 	BOOL				canAttachMoreObjects(U32 n=1) const;
     S32					getMaxAnimatedObjectAttachments() const;
     BOOL				canAttachMoreAnimatedObjects(U32 n=1) const;
-- 
cgit v1.2.3


From d1f5e87ad08f63cf8bdf0421566d6e646f76a6d0 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Tue, 23 Apr 2019 15:31:25 +0100
Subject: via viewer-neko - don't crash test viewer due to missing version
 checker

---
 indra/newview/llappviewer.cpp | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 1bc21ec469..f54d87e5a3 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1167,8 +1167,18 @@ bool LLAppViewer::init()
 	// ForceAddressSize
 	updater.args.add(stringize(gSavedSettings.getU32("ForceAddressSize")));
 
-	// Run the updater. An exception from launching the updater should bother us.
+#if LL_WINDOWS && !LL_RELEASE_FOR_DOWNLOAD && !LL_SEND_CRASH_REPORTS
+	// This is neither a release package, nor crash-reporting enabled test build
+	// try to run version updater, but don't bother if it fails (file might be missing)
+	LLLeap *leap_p = LLLeap::create(updater, false);
+	if (!leap_p)
+	{
+		LL_WARNS("LLLeap") << "Failed to run LLLeap" << LL_ENDL;
+	}
+#else
+ 	// Run the updater. An exception from launching the updater should bother us.
 	LLLeap::create(updater, true);
+#endif
 
 	// Iterate over --leap command-line options. But this is a bit tricky: if
 	// there's only one, it won't be an array at all.
-- 
cgit v1.2.3


From 06009e9b533fe65841c31214afdadb78a79a43ae Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Thu, 25 Apr 2019 22:02:47 +0100
Subject: SL-10400 - get group limits from SimulatorFeatures

---
 indra/newview/llpanelpeople.cpp | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 1cbff37287..3f48ac63b4 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -67,6 +67,7 @@
 #include "llrecentpeople.h"
 #include "llviewercontrol.h"		// for gSavedSettings
 #include "llviewermenu.h"			// for gMenuHolder
+#include "llviewerregion.h"
 #include "llvoiceclient.h"
 #include "llworld.h"
 #include "llspeakers.h"
@@ -1165,8 +1166,25 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string)
 void LLPanelPeople::onGroupLimitInfo()
 {
 	LLSD args;
-	args["MAX_BASIC"] = BASE_MAX_AGENT_GROUPS;
-	args["MAX_PREMIUM"] = PREMIUM_MAX_AGENT_GROUPS;
+
+	S32 max_basic = BASE_MAX_AGENT_GROUPS;
+	S32 max_premium = PREMIUM_MAX_AGENT_GROUPS;
+	if (gAgent.getRegion())
+	{
+		LLSD features;
+		gAgent.getRegion()->getSimulatorFeatures(features);
+		if (features.has("MaxAgentGroupsBasic"))
+		{
+			max_basic = features["MaxAgentGroupsBasic"].asInteger();
+		}
+		if (features.has("MaxAgentGroupsPremium"))
+		{
+			max_premium = features["MaxAgentGroupsPremium"].asInteger();
+		}
+	}
+	args["MAX_BASIC"] = max_basic; 
+	args["MAX_PREMIUM"] = max_premium; 
+
 	LLNotificationsUtil::add("GroupLimitInfo", args);
 }
 
-- 
cgit v1.2.3


From a44f03573d5d64102775922ff0e61f1bce2d1a22 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Fri, 26 Apr 2019 14:23:57 +0100
Subject: SL-10400 - more on group limits from SimulatorFeatures

---
 indra/newview/llpanelpeople.cpp | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 3f48ac63b4..617ca05281 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -614,12 +614,23 @@ void LLPanelPeople::removePicker()
 
 BOOL LLPanelPeople::postBuild()
 {
+	S32 max_premium = PREMIUM_MAX_AGENT_GROUPS; 
+	if (gAgent.getRegion())
+	{
+		LLSD features;
+		gAgent.getRegion()->getSimulatorFeatures(features);
+		if (features.has("MaxAgentGroupsPremium"))
+		{
+			max_premium = features["MaxAgentGroupsPremium"].asInteger();
+		}
+	}
+
 	getChild<LLFilterEditor>("nearby_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
 	getChild<LLFilterEditor>("friends_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
 	getChild<LLFilterEditor>("groups_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
 	getChild<LLFilterEditor>("recent_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
 
-	if(gMaxAgentGroups <= BASE_MAX_AGENT_GROUPS)
+	if(gMaxAgentGroups < max_premium)
 	{
 	    getChild<LLTextBox>("groupcount")->setText(getString("GroupCountWithInfo"));
 	    getChild<LLTextBox>("groupcount")->setURLClickedCallback(boost::bind(&LLPanelPeople::onGroupLimitInfo, this));
-- 
cgit v1.2.3


From 81c39d28fe75c0d90628e2a34ec134d931873efb Mon Sep 17 00:00:00 2001
From: Graham Linden <graham@lindenlab.com>
Date: Tue, 30 Apr 2019 14:25:48 -0700
Subject: Fix spurious assert from using highlights without binding highlight
 shader.

Only affects devs, but could have downstream consequences for rendering.
---
 indra/newview/pipeline.cpp | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index e8c9909f8c..a72244929e 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -4139,7 +4139,12 @@ void LLPipeline::renderHighlights()
 
 		glStencilFunc(GL_ALWAYS, 0, 0xFFFFFFFF);
 		glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
-				
+
+        if (canUseVertexShaders())
+        {
+            gHighlightProgram.bind();
+        }
+
 		gGL.setColorMask(false, false);
 		for (std::set<HighlightItem>::iterator iter = mHighlightSet.begin(); iter != mHighlightSet.end(); ++iter)
 		{
@@ -10507,6 +10512,11 @@ void LLPipeline::generateHighlight(LLCamera& camera)
 		gGL.setColorMask(true, true);
 		mHighlight.clear();
 
+        if (canUseVertexShaders())
+        {
+            gHighlightProgram.bind();
+        }
+
 		gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep);
 		for (std::set<HighlightItem>::iterator iter = mHighlightSet.begin(); iter != mHighlightSet.end(); )
 		{
-- 
cgit v1.2.3


From 031ebc8d6d200b6be3a8ab075385e9a25e6de5a1 Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Tue, 7 May 2019 15:24:00 -0400
Subject: Added tag 6.2.1-release for changeset 706bdc7e25c6

---
 .hgtags | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.hgtags b/.hgtags
index 4823c05504..96ea267be3 100755
--- a/.hgtags
+++ b/.hgtags
@@ -547,3 +547,4 @@ ac3b1332ad4f55b7182a8cbcc1254535a0069f75 5.1.7-release
 a3143db58a0f6b005232bf9018e7fef17ff9ec90 6.1.0-release
 50f0ece62ddb5a244ecb6d00ef5a89d80ad50efa 6.1.1-release
 82a89165e5929a6c3073d6cd60a543cb395f147b 6.2.0-release
+706bdc7e25c6e6b8fb56f4a13fcce2936e70a79c 6.2.1-release
-- 
cgit v1.2.3


From 34322f8f37380df868703051230f2a4109602b3f Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Tue, 7 May 2019 15:24:01 -0400
Subject: increment viewer version to 6.2.2

---
 indra/newview/VIEWER_VERSION.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 024b066c0b..ca06394388 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-6.2.1
+6.2.2
-- 
cgit v1.2.3


From b5055e890743783746a3691f14b81a6bc62f2bff Mon Sep 17 00:00:00 2001
From: Graham Linden <graham@lindenlab.com>
Date: Wed, 8 May 2019 09:32:34 -0700
Subject: Fix version to be bumped as we're an RC.

---
 indra/newview/VIEWER_VERSION.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index ca06394388..bee9433817 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-6.2.2
+6.2.3
-- 
cgit v1.2.3


From 605c9c19661702755171669e2af846abe77d2a51 Mon Sep 17 00:00:00 2001
From: Graham Linden <graham@lindenlab.com>
Date: Wed, 8 May 2019 11:42:31 -0700
Subject: Fix merge fail.

---
 indra/llui/llmenugl.h                |  7 ++++++-
 indra/newview/llinventorybridge.cpp  |  5 ++++-
 indra/newview/llinventorypanel.cpp   |  3 ---
 indra/newview/llmeshrepository.cpp   | 13 -------------
 indra/newview/llviewerfloaterreg.cpp |  2 +-
 indra/newview/llviewermenufile.cpp   |  2 +-
 indra/newview/llviewermessage.cpp    | 28 ++++++----------------------
 indra/newview/llviewertexture.cpp    |  4 ++--
 indra/newview/llviewertexture.h      |  2 +-
 indra/newview/llvovolume.cpp         |  4 ++--
 10 files changed, 23 insertions(+), 47 deletions(-)

diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index aa87329020..1f11f26192 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -175,7 +175,12 @@ protected:
 	// This function appends the character string representation of
 	// the current accelerator key and mask to the provided string.
 	void appendAcceleratorString( std::string& st ) const;
-		
+
+	virtual std::string _getSearchText() const
+	{
+		return mLabel.getString();
+	}
+
 protected:
 	KEY mAcceleratorKey;
 	MASK mAcceleratorMask;
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 50c4fdc870..ee9dfbc376 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -81,6 +81,10 @@
 #include "llwearableitemslist.h"
 #include "lllandmarkactions.h"
 #include "llpanellandmarks.h"
+#include "llviewerparcelmgr.h"
+#include "llparcel.h"
+
+#include "llenvironment.h"
 
 #include <boost/shared_ptr.hpp>
 
@@ -4058,7 +4062,6 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t&   items
                 }
 			}
 			getClipboardEntries(false, items, disabled_items, flags);
-
 		}
 		else
 		{
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 4eb42950b7..dd541defa1 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -1726,9 +1726,6 @@ bool LLInventoryPanel::isSelectionRemovable()
 /************************************************************************/
 /* Recent Inventory Panel related class                                 */
 /************************************************************************/
-class LLInventoryRecentItemsPanel;
-static LLDefaultChildRegistry::Register<LLInventoryRecentItemsPanel> t_recent_inventory_panel("recent_inventory_panel");
-
 static const LLRecentInventoryBridgeBuilder RECENT_ITEMS_BUILDER;
 class LLInventoryRecentItemsPanel : public LLInventoryPanel
 {
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 4e9ebec0f2..127d04c34d 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -2190,7 +2190,6 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
 
 	std::map<LLModel*,S32> mesh_index;
 	std::string model_name;
-	std::string model_metric;
 
 	S32 instance_num = 0;
 	
@@ -2220,11 +2219,6 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
 				model_name = data.mBaseModel->getName();
 			}
 
-			if (model_metric.empty())
-			{
-				model_metric = data.mBaseModel->getMetric();
-			}
-
 			std::stringstream ostr;
 			
 			LLModel::Decomposition& decomp =
@@ -2379,11 +2373,6 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
 				model_name = data.mBaseModel->getName();
 			}
 
-			if (model_metric.empty())
-			{
-				model_metric = data.mBaseModel->getMetric();
-			}
-
 			std::stringstream ostr;
 			
 			LLModel::Decomposition& decomp =
@@ -2514,8 +2503,6 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
 
 	if (model_name.empty()) model_name = "mesh model";
 	result["name"] = model_name;
-	if (model_metric.empty()) model_metric = "MUT_Unspecified";
-	res["metric"] = model_metric;
 	result["asset_resources"] = res;
 	dump_llsd_to_file(result,make_dump_name("whole_model_",dump_num));
 
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index ad016d0817..ffc21e8f14 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -90,7 +90,7 @@
 #include "llfloatermemleak.h"
 #include "llfloatermodelpreview.h"
 #include "llfloatermyscripts.h"
-"llfloatermyenvironment.h"
+#include "llfloatermyenvironment.h"
 #include "llfloaternamedesc.h"
 #include "llfloaternotificationsconsole.h"
 #include "llfloaternotificationstabbed.h"
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 693d2ab60a..07873f482f 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -812,7 +812,7 @@ void upload_done_callback(
 		LLStringUtil::trim(asset_name);
 
 		std::string display_name = LLStringUtil::null;
-		LLAssetStorage::LLStoreAssetCallback callback = NULL;
+		LLAssetStorage::LLStoreAssetCallback callback;
 		void *userdata = NULL;
 		upload_new_resource(
 			next_file,
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 982f1980f1..c22be25f1f 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -3760,6 +3760,7 @@ void process_kill_object(LLMessageSystem *mesgsys, void **user_data)
 void process_time_synch(LLMessageSystem *mesgsys, void **user_data)
 {
 	LLVector3 sun_direction;
+    LLVector3 moon_direction;
 	LLVector3 sun_ang_velocity;
 	F32 phase;
 	U64	space_time_usec;
@@ -3781,12 +3782,10 @@ void process_time_synch(LLMessageSystem *mesgsys, void **user_data)
 
 	LL_DEBUGS("WindlightSync") << "Sun phase: " << phase << " rad = " << fmodf(phase / F_TWO_PI + 0.25, 1.f) * 24.f << " h" << LL_ENDL;
 
-	gSky.setSunPhase(phase);
-	gSky.setSunTargetDirection(sun_direction, sun_ang_velocity);
-	if ( !(gSavedSettings.getBOOL("SkyOverrideSimSunPosition") || gSky.getOverrideSun()) )
-	{
-		gSky.setSunDirection(sun_direction, sun_ang_velocity);
-	}
+	/* LAPRAS
+        We decode these parts of the message but ignore them
+        as the real values are provided elsewhere. */
+    (void)sun_direction, (void)moon_direction, (void)phase;
 }
 
 void process_sound_trigger(LLMessageSystem *msg, void **)
@@ -5531,17 +5530,6 @@ void notify_cautioned_script_question(const LLSD& notification, const LLSD& resp
 
 void script_question_mute(const LLUUID& item_id, const std::string& object_name);
 
-bool unknown_script_question_cb(const LLSD& notification, const LLSD& response)
-{
-	// Only care if they muted the object here.
-	if ( response["Mute"] ) // mute
-	{
-		LLUUID task_id = notification["payload"]["task_id"].asUUID();
-		script_question_mute(task_id,notification["payload"]["object_name"].asString());
-	}
-	return false;
-}
-
 void experiencePermissionBlock(LLUUID experience, LLSD result)
 {
     LLSD permission;
@@ -5647,8 +5635,7 @@ void script_question_mute(const LLUUID& task_id, const std::string& object_name)
       	bool matches(const LLNotificationPtr notification) const
         {
             if (notification->getName() == "ScriptQuestionCaution"
-                || notification->getName() == "ScriptQuestion"
-				/*|| notification->getName() == "UnknownScriptQuestion"*/)
+                || notification->getName() == "ScriptQuestion")
             {
                 return (notification->getPayload()["task_id"].asUUID() == blocked_id);
             }
@@ -5665,7 +5652,6 @@ void script_question_mute(const LLUUID& task_id, const std::string& object_name)
 static LLNotificationFunctorRegistration script_question_cb_reg_1("ScriptQuestion", script_question_cb);
 static LLNotificationFunctorRegistration script_question_cb_reg_2("ScriptQuestionCaution", script_question_cb);
 static LLNotificationFunctorRegistration script_question_cb_reg_3("ScriptQuestionExperience", script_question_cb);
-//static LLNotificationFunctorRegistration unknown_script_question_cb_reg("UnknownScriptQuestion", unknown_script_question_cb);
 
 void process_script_experience_details(const LLSD& experience_details, LLSD args, LLSD payload)
 {
@@ -5775,8 +5761,6 @@ void process_script_question(LLMessageSystem *msg, void **user_data)
 			}
 		}
 	
-        script_question += "\n";
-
 		args["QUESTIONS"] = script_question;
 
 		if (known_questions != questions)
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 68a9994bee..5bd60c6b94 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -98,8 +98,8 @@ const S32 MAX_CACHED_RAW_IMAGE_AREA = 64 * 64;
 const S32 MAX_CACHED_RAW_SCULPT_IMAGE_AREA = LLViewerTexture::sMaxSculptRez * LLViewerTexture::sMaxSculptRez;
 const S32 MAX_CACHED_RAW_TERRAIN_IMAGE_AREA = 128 * 128;
 const S32 DEFAULT_ICON_DIMENTIONS = 32;
-S32 LLViewerTexture::sMinLargeImageSize = 65536; //256 * 256.
-S32 LLViewerTexture::sMaxSmallImageSize = MAX_CACHED_RAW_IMAGE_AREA;
+U32 LLViewerTexture::sMinLargeImageSize = 65536; //256 * 256.
+U32 LLViewerTexture::sMaxSmallImageSize = MAX_CACHED_RAW_IMAGE_AREA;
 bool LLViewerTexture::sFreezeImageUpdates = false;
 F32 LLViewerTexture::sCurrentTime = 0.0f;
 F32  LLViewerTexture::sTexelPixelRatio = 1.0f;
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index 78bebb542a..69568cc825 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -125,7 +125,7 @@ public:
 	virtual BOOL isMissingAsset() const ;
 	virtual void dump();	// debug info to LL_INFOS()
 	
-    virtual BOOL isViewerMediaTexture() const { return false; }
+    virtual bool isViewerMediaTexture() const { return false; }
 
 	/*virtual*/ bool bindDefaultImage(const S32 stage = 0) ;
 	/*virtual*/ bool bindDebugImage(const S32 stage = 0) ;
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 08798d81b7..664615d4eb 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -4981,7 +4981,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
 	if (   type == LLRenderPass::PASS_ALPHA 
 		&& facep->getTextureEntry()->getMaterialParams().notNull() 
 		&& !facep->getVertexBuffer()->hasDataType(LLVertexBuffer::TYPE_TANGENT)
-		&& LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 1)
+		&& LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 1)
 	{
 		LL_WARNS_ONCE("RenderMaterials") << "Oh no! No binormals for this alpha blended face!" << LL_ENDL;
 	}
@@ -5882,7 +5882,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
 		spec_mask = spec_mask | LLVertexBuffer::MAP_EMISSIVE;
 	}
 
-	BOOL batch_textures = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 1;
+	BOOL batch_textures = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 1;
 
 	if (batch_textures)
 	{
-- 
cgit v1.2.3


From 42fa05bd4cd8d587af4c216faca5e8c010812c8b Mon Sep 17 00:00:00 2001
From: Graham Linden <graham@lindenlab.com>
Date: Wed, 8 May 2019 12:49:02 -0700
Subject: Remove unref'd vars for Clang.

---
 indra/newview/lltexturectrl.cpp | 2 --
 1 file changed, 2 deletions(-)

diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 39a7e81184..c21b16e4f8 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -70,8 +70,6 @@
 #include "lllocalbitmaps.h"
 #include "llerror.h"
 
-static const F32 CONTEXT_CONE_IN_ALPHA = 0.0f;
-static const F32 CONTEXT_CONE_OUT_ALPHA = 1.f;
 static const F32 CONTEXT_FADE_TIME = 0.08f;
 
 static const S32 LOCAL_TRACKING_ID_COLUMN = 1;
-- 
cgit v1.2.3