diff options
Diffstat (limited to 'indra/newview')
681 files changed, 26359 insertions, 16544 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index da9a145423..7288bf6933 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -77,7 +77,7 @@ include_directories(  set(viewer_SOURCE_FILES      groupchatlistener.cpp -    llaccountingquotamanager.cpp +    llaccountingcostmanager.cpp      llagent.cpp      llagentaccess.cpp      llagentcamera.cpp @@ -102,7 +102,6 @@ set(viewer_SOURCE_FILES      llavatarlist.cpp      llavatarlistitem.cpp      llavatarpropertiesprocessor.cpp -    llbottomtray.cpp      llbox.cpp      llbreadcrumbview.cpp      llbrowsernotification.cpp @@ -118,6 +117,7 @@ set(viewer_SOURCE_FILES      llchatitemscontainerctrl.cpp      llchatmsgbox.cpp      llchiclet.cpp +    llchicletbar.cpp      llclassifiedinfo.cpp      llclassifiedstatsresponder.cpp      llcofwearables.cpp @@ -150,8 +150,9 @@ set(viewer_SOURCE_FILES      lldrawpoolwlsky.cpp      lldriverparam.cpp      lldynamictexture.cpp -    llenvmanager.cpp      llemote.cpp +    llenvmanager.cpp +    llestateinfomodel.cpp      lleventnotifier.cpp      lleventpoll.cpp      llexpandabletextbox.cpp @@ -167,6 +168,7 @@ set(viewer_SOURCE_FILES      llfloaterabout.cpp      llfloateranimpreview.cpp      llfloaterauction.cpp +    llfloateravatar.cpp      llfloateravatarpicker.cpp      llfloateravatartextures.cpp      llfloaterbeacons.cpp @@ -181,6 +183,7 @@ set(viewer_SOURCE_FILES      llfloatercamera.cpp      llfloatercolorpicker.cpp      llfloaterdeleteenvpreset.cpp +    llfloaterdestinations.cpp      llfloaterdisplayname.cpp      llfloatereditdaycycle.cpp      llfloatereditsky.cpp @@ -208,9 +211,11 @@ set(viewer_SOURCE_FILES      llfloatermediasettings.cpp      llfloatermemleak.cpp      llfloatermodelpreview.cpp +    llfloatermodeluploadbase.cpp      llfloatermodelwizard.cpp      llfloaternamedesc.cpp      llfloaternotificationsconsole.cpp +    llfloaterobjectweights.cpp      llfloateropenobject.cpp      llfloaterpay.cpp      llfloaterperms.cpp @@ -226,7 +231,7 @@ set(viewer_SOURCE_FILES      llfloatersearch.cpp      llfloatersellland.cpp      llfloatersettingsdebug.cpp -    llfloatersidetraytab.cpp +    llfloatersidepanelcontainer.cpp      llfloatersnapshot.cpp      llfloatersounddevices.cpp      llfloatertelehub.cpp @@ -235,6 +240,7 @@ set(viewer_SOURCE_FILES      llfloatertools.cpp      llfloatertopobjects.cpp      llfloatertos.cpp +    llfloatertoybox.cpp      llfloateruipreview.cpp      llfloaterurlentry.cpp      llfloatervoiceeffect.cpp @@ -366,6 +372,7 @@ set(viewer_SOURCE_FILES      llpanelmarketplaceinbox.cpp      llpanelmarketplaceinboxinventory.cpp      llpanelmarketplaceoutbox.cpp +    llpanelmarketplaceoutboxinventory.cpp      llpanelmediasettingsgeneral.cpp      llpanelmediasettingspermissions.cpp      llpanelmediasettingssecurity.cpp @@ -437,13 +444,10 @@ set(viewer_SOURCE_FILES      llsidepanelinventorysubpanel.cpp      llsidepaneliteminfo.cpp      llsidepaneltaskinfo.cpp -    llsidetray.cpp -    llsidetraylistener.cpp      llsidetraypanelcontainer.cpp      llsky.cpp      llslurl.cpp      llspatialpartition.cpp -    llspeakbutton.cpp      llspeakers.cpp      llspeakingindicatormanager.cpp      llsplitbutton.cpp @@ -479,6 +483,7 @@ set(viewer_SOURCE_FILES      lltoastpanel.cpp      lltoastscripttextbox.cpp      lltool.cpp +    lltoolbarview.cpp      lltoolbrush.cpp      lltoolcomp.cpp      lltooldraganddrop.cpp @@ -502,6 +507,7 @@ set(viewer_SOURCE_FILES      lltranslate.cpp      lluilistener.cpp      lluploaddialog.cpp +    lluploadfloaterobservers.cpp      llurl.cpp      llurldispatcher.cpp      llurldispatcherlistener.cpp @@ -598,6 +604,7 @@ set(viewer_SOURCE_FILES      llweb.cpp      llwebsharing.cpp      llwind.cpp +    llwindowlistener.cpp      llwlanimator.cpp      llwldaycycle.cpp      llwlhandlers.cpp @@ -635,7 +642,7 @@ set(viewer_HEADER_FILES      CMakeLists.txt      ViewerInstall.cmake      groupchatlistener.h -    llaccountingquotamanager.h +    llaccountingcostmanager.h      llagent.h      llagentaccess.h      llagentcamera.h @@ -661,7 +668,6 @@ set(viewer_HEADER_FILES      llavatarlist.h      llavatarlistitem.h      llavatarpropertiesprocessor.h -    llbottomtray.h      llbox.h      llbreadcrumbview.h      llbuycurrencyhtml.h @@ -677,6 +683,7 @@ set(viewer_HEADER_FILES      llchatitemscontainerctrl.h      llchatmsgbox.h      llchiclet.h +    llchicletbar.h      llclassifiedinfo.h      llclassifiedstatsresponder.h      llcofwearables.h @@ -711,6 +718,7 @@ set(viewer_HEADER_FILES      lldynamictexture.h      llemote.h      llenvmanager.h +    llestateinfomodel.h      lleventnotifier.h      lleventpoll.h      llexpandabletextbox.h @@ -726,6 +734,7 @@ set(viewer_HEADER_FILES      llfloaterabout.h      llfloateranimpreview.h      llfloaterauction.h +    llfloateravatar.h      llfloateravatarpicker.h      llfloateravatartextures.h      llfloaterbeacons.h @@ -740,6 +749,7 @@ set(viewer_HEADER_FILES      llfloatercamera.h      llfloatercolorpicker.h      llfloaterdeleteenvpreset.h +    llfloaterdestinations.h      llfloaterdisplayname.h      llfloatereditdaycycle.h      llfloatereditsky.h @@ -767,9 +777,11 @@ set(viewer_HEADER_FILES      llfloatermediasettings.h      llfloatermemleak.h      llfloatermodelpreview.h +    llfloatermodeluploadbase.h      llfloatermodelwizard.h      llfloaternamedesc.h      llfloaternotificationsconsole.h +    llfloaterobjectweights.h      llfloateropenobject.h      llfloaterpay.h      llfloaterperms.h @@ -785,7 +797,7 @@ set(viewer_HEADER_FILES      llfloatersearch.h      llfloatersellland.h      llfloatersettingsdebug.h -    llfloatersidetraytab.h +    llfloatersidepanelcontainer.h      llfloatersnapshot.h      llfloatersounddevices.h      llfloatertelehub.h @@ -794,6 +806,7 @@ set(viewer_HEADER_FILES      llfloatertools.h      llfloatertopobjects.h      llfloatertos.h +    llfloatertoybox.h      llfloateruipreview.h      llfloaterurlentry.h      llfloatervoiceeffect.h @@ -919,6 +932,7 @@ set(viewer_HEADER_FILES      llpanelmarketplaceinbox.h      llpanelmarketplaceinboxinventory.h      llpanelmarketplaceoutbox.h +    llpanelmarketplaceoutboxinventory.h      llpanelmediasettingsgeneral.h      llpanelmediasettingspermissions.h      llpanelmediasettingssecurity.h @@ -991,13 +1005,10 @@ set(viewer_HEADER_FILES      llsidepanelinventorysubpanel.h      llsidepaneliteminfo.h      llsidepaneltaskinfo.h -    llsidetray.h -    llsidetraylistener.h      llsidetraypanelcontainer.h      llsky.h      llslurl.h      llspatialpartition.h -    llspeakbutton.h      llspeakers.h      llspeakingindicatormanager.h      llsplitbutton.h @@ -1034,6 +1045,7 @@ set(viewer_HEADER_FILES      lltoastpanel.h      lltoastscripttextbox.h      lltool.h +    lltoolbarview.h      lltoolbrush.h      lltoolcomp.h      lltooldraganddrop.h @@ -1058,6 +1070,7 @@ set(viewer_HEADER_FILES      lluiconstants.h      lluilistener.h      lluploaddialog.h +    lluploadfloaterobservers.h      llurl.h      llurldispatcher.h      llurldispatcherlistener.h @@ -1151,6 +1164,7 @@ set(viewer_HEADER_FILES      llweb.h      llwebsharing.h      llwind.h +    llwindowlistener.h      llwlanimator.h      llwldaycycle.h      llwlhandlers.h @@ -1246,6 +1260,36 @@ if (WINDOWS)          set(viewer_SOURCE_FILES "${viewer_SOURCE_FILES}" llviewerprecompiledheaders.cpp)      endif(USE_PRECOMPILED_HEADERS) +    # Replace the icons with the appropriate ones for the channel +    # ('test' is the default) +    set(ICON_PATH "test") +    string(TOLOWER ${VIEWER_CHANNEL} channel_lower) +    if(channel_lower MATCHES "^second life release") +        set(ICON_PATH "release") +    elseif(channel_lower MATCHES "^second life beta viewer") +        set(ICON_PATH "beta") +    elseif(channel_lower MATCHES "^second life development") +        set(ICON_PATH "development") +    elseif(channel_lower MATCHES "project") +        set(ICON_PATH "project") +    endif() +    message("Copying icons for ${ICON_PATH}") +    execute_process( +      COMMAND ${CMAKE_COMMAND} -E copy_if_different +        "${CMAKE_CURRENT_SOURCE_DIR}/icons/${ICON_PATH}/secondlife.ico" +        "${CMAKE_CURRENT_SOURCE_DIR}/res/ll_icon.ico" +      ) +    execute_process( +      COMMAND ${CMAKE_COMMAND} -E copy_if_different +        "${CMAKE_CURRENT_SOURCE_DIR}/icons/${ICON_PATH}/secondlife_256.BMP" +        "${CMAKE_CURRENT_SOURCE_DIR}/res/ll_icon.BMP" +      ) +    execute_process( +      COMMAND ${CMAKE_COMMAND} -E copy_if_different +        "${CMAKE_CURRENT_SOURCE_DIR}/icons/${ICON_PATH}/secondlife_256.BMP" +        "${CMAKE_CURRENT_SOURCE_DIR}/res-sdl/ll_icon.BMP" +      ) +      # Add resource files to the project.      # viewerRes.rc is the only buildable file, but      # the rest are all dependencies of it. @@ -1275,6 +1319,7 @@ if (WINDOWS)          res/lltooltranslate.cur          res/lltoolzoomin.cur          res/lltoolzoomout.cur +        res-sdl/ll_icon.BMP          res/ll_icon.BMP          res/ll_icon.ico          res/resource.h @@ -1342,11 +1387,6 @@ endif (WINDOWS)  set(viewer_XUI_FILES      skins/default/colors.xml      skins/default/textures/textures.xml -    skins/minimal/colors.xml -    skins/minimal/textures/textures.xml - - -      )  file(GLOB DEFAULT_XUI_FILE_GLOB_LIST       ${CMAKE_CURRENT_SOURCE_DIR}/skins/*/xui/en/*.xml) @@ -1373,6 +1413,7 @@ list(APPEND viewer_SOURCE_FILES ${viewer_XUI_FILES})  set(viewer_APPSETTINGS_FILES      app_settings/anim.ini      app_settings/cmd_line.xml +    app_settings/commands.xml      app_settings/grass.xml      app_settings/high_graphics.xml      app_settings/ignorable_dialogs.xml @@ -1385,8 +1426,8 @@ set(viewer_APPSETTINGS_FILES      app_settings/settings_crash_behavior.xml      app_settings/settings_files.xml      app_settings/settings_per_account.xml -    app_settings/settings_minimal.xml      app_settings/std_bump.ini +    app_settings/toolbars.xml      app_settings/trees.xml      app_settings/ultra_graphics.xml      app_settings/viewerart.xml @@ -1697,7 +1738,7 @@ endif (WINDOWS)  # that they depend upon. -brad  target_link_libraries(${VIEWER_BINARY_NAME}      ${UPDATER_LIBRARIES} -	${GOOGLE_PERFTOOLS_LIBRARIES} +    ${GOOGLE_PERFTOOLS_LIBRARIES}      ${LLAUDIO_LIBRARIES}      ${LLCHARACTER_LIBRARIES}      ${LLIMAGE_LIBRARIES} @@ -1760,14 +1801,14 @@ if (LINUX)    # These are the generated targets that are copied to package/    set(COPY_INPUT_DEPENDENCIES -	${VIEWER_BINARY_NAME} -	linux-crash-logger -	linux-updater -	SLPlugin -	media_plugin_webkit -	media_plugin_gstreamer010 -	llcommon -	) +    ${VIEWER_BINARY_NAME} +    linux-crash-logger +    linux-updater +    SLPlugin +    media_plugin_webkit +    media_plugin_gstreamer010 +    llcommon +    )    add_custom_command(        OUTPUT ${product}.tar.bz2 @@ -2026,12 +2067,12 @@ if (LL_TESTS)      )    LL_ADD_INTEGRATION_TEST(llsimplestat -	"" +    ""      "${test_libs}"      )    LL_ADD_INTEGRATION_TEST(llviewerassetstats -	llviewerassetstats.cpp +    llviewerassetstats.cpp      "${test_libs}"      ) diff --git a/indra/newview/app_settings/CA.pem b/indra/newview/app_settings/CA.pem index 63bb036c92..8c1b9a1f37 100644 --- a/indra/newview/app_settings/CA.pem +++ b/indra/newview/app_settings/CA.pem @@ -1,362 +1,322 @@  -----BEGIN CERTIFICATE----- -MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIx -EzARBgNVBAoTCklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25h -bCBkZSBUZWNub2xvZ2lhIGRhIEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJy -YXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UEAxMoQXV0b3JpZGFkZSBDZXJ0aWZp -Y2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4MDBaFw0xMTExMzAy -MzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsG -A1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3Jt -YWNhbyAtIElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYD -VQQDEyhBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVA -isamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma/3pUpgcfNAj0vYm5gsyj -Qo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt4CyNrY50 -QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYt -bRhFboUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbUR -yEeNvZneVRKAAU6ouwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwID -AQABo4HSMIHPME4GA1UdIARHMEUwQwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0 -cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQQ2FjcmFpei5wZGYwPQYDVR0f -BDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0xDUmFj -cmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1 -U/hgIh6OcgLAfiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGl -YjJe+9zd+izPRbBqXPVQA34EXcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75Fos -SzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQfS//JYeIc7Fue2JNLd00UOSMMaiK/ -t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u -mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb -K+9A46sd33oqK8n8 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA -Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS -BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v -cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9 -4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB -Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J -0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ -FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx -bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q -SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb -6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV -m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g -eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG -kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7 -6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG -CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc -aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB -gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w -aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6 -tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0 -nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M -77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV -Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L -ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM -zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU -rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF -YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT -oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu -FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB -0m6lG5kngOcLqagA ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA -Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO -BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi -MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ -ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ -8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 -zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y -fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 -w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc -G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k -epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q -laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ -QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU -fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 -YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w -ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY -gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe -MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 -IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy -dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw -czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 -dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl -aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC -AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg -b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB -ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc -nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg -18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c -gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl -Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY -sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T -SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF -CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum -GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk -zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW -omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIESzCCAzOgAwIBAgIJAJigUTEEXRQpMA0GCSqGSIb3DQEBBQUAMHYxCzAJBgNV -BAYTAkRFMQ8wDQYDVQQIEwZIZXNzZW4xDjAMBgNVBAcTBUZ1bGRhMRAwDgYDVQQK -EwdEZWJjb25mMRMwEQYDVQQDEwpEZWJjb25mIENBMR8wHQYJKoZIhvcNAQkBFhBq -b2VyZ0BkZWJpYW4ub3JnMB4XDTA1MTEwNTE3NTUxNFoXDTE1MTEwMzE3NTUxNFow -djELMAkGA1UEBhMCREUxDzANBgNVBAgTBkhlc3NlbjEOMAwGA1UEBxMFRnVsZGEx -EDAOBgNVBAoTB0RlYmNvbmYxEzARBgNVBAMTCkRlYmNvbmYgQ0ExHzAdBgkqhkiG -9w0BCQEWEGpvZXJnQGRlYmlhbi5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvbOo0SrIwI5IMlsshH8WF3dHB9r9JlSKhMPaybawa1EyvZspMQ3wa -F5qxNf3Sj+NElEmjseEqvCZiIIzqwerHu0Qw62cDYCdCd2+Wb5m0bPYB5CGHiyU1 -eNP0je42O0YeXG2BvUujN8AviocVo39X2YwNQ0ryy4OaqYgm2pRlbtT2ESbF+SfV -Y2iqQj/f8ymF+lHo/pz8tbAqxWcqaSiHFAVQJrdqtFhtoodoNiE3q76zJoUkZTXB -k60Yc3MJSnatZCpnsSBr/D7zpntl0THrUjjtdRWCjQVhqfhM1yZJV+ApbLdheFh0 -ZWlSxdnp25p0q0XYw/7G92ELyFDfBUUNAgMBAAGjgdswgdgwHQYDVR0OBBYEFMuV -dFNb4mCWUFbcP5LOtxFLrEVTMIGoBgNVHSMEgaAwgZ2AFMuVdFNb4mCWUFbcP5LO -txFLrEVToXqkeDB2MQswCQYDVQQGEwJERTEPMA0GA1UECBMGSGVzc2VuMQ4wDAYD -VQQHEwVGdWxkYTEQMA4GA1UEChMHRGViY29uZjETMBEGA1UEAxMKRGViY29uZiBD -QTEfMB0GCSqGSIb3DQEJARYQam9lcmdAZGViaWFuLm9yZ4IJAJigUTEEXRQpMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAGZXxHg4mnkvilRIM1EQfGdY -S5b/WcyF2MYSTeTvK4aIB6VHwpZoZCnDGj2m2D3CkHT0upAD9o0zM1tdsfncLzV+ -mDT/jNmBtYo4QXx5vEPwvEIcgrWjwk7SyaEUhZjtolTkHB7ACl0oD0r71St4iEPR -qTUCEXk2E47bg1Fz58wNt/yo2+4iqiRjg1XCH4evkQuhpW+dTZnDyFNqwSYZapOE -TBA+9zBb6xD1KM2DdY7r4GiyYItN0BKLfuWbh9LXGbl1C+f4P11g+m2MPiavIeCe -1iazG5pcS3KoTLACsYlEX24TINtg4kcuS81XdllcnsV3Kdts0nIqPj6uhTTZD0k= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT +MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0 +aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw +WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE +AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m +OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu +T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c +JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR +Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz +PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm +aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM +TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g +LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO +BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv +dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB +AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL +NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W +b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul +F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC +ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w +ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk +aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 +YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg +c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 +d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG +CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF +wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS +Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst +0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc +pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl +CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF +P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK +1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm +KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ +8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm +fyWl8kgAwKQB2j8=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw -MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD -VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul -CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n -tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl -dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch -PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC -+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O -BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl -MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk -ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X -7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz -43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl -pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA -WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy +MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA +vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G +CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA +WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ +h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 +f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN +B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy +vUxFnmG6v4SBkgPR0ml8xQ==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx -MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB -ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV -BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV -6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX -GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP -dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH -1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF -62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW -BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL -MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU -cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv -b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 -IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ -iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh -4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm -XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 -MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK -EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh -BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq -xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G -87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i -2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U -WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 -0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G -A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr -pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL -ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm -aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv -hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm -hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 -P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y -iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no -xqE= +MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt +YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu +Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa +MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG +cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh +d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY +DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E +rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq +uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN +BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP +MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa +/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei +gQ==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP -bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 -MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft -ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk -hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym -1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW -OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb -2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko -O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU -AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB -BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF -Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb -LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir -oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C -MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg +b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa +MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB +ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw +IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B +AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb +unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d +BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq +7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 +0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX +roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG +A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j +aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p +26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA +BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud +EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN +BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB +AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd +p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi +1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc +XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 +eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu +tGWaIZDgqtCYvDi1czyL+Nw=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP -bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 -MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft -ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC -206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci -KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 -JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 -BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e -Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B -PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 -Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq -Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ -o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 -+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj -YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj -FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn -xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 -LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc -obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 -CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe -IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA -DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F -AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX -Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb -AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl -Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw -RY8mkaKO/qk= +MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD +QSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloXDTExMDkyMzExMTgxN1owdjELMAkG +A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV +BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0MgU2ln +bmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJY +rISEtSsduHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ1 +2FJarD1X6mSQ4cfN/60vLfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjR +AM0tdwXSnzuTEunfw0Oup559y3Iqxg1cExflB6cfAgMBAAGjggGXMIIBkzBBBgNV +HR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3JpdW0v +Y3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsG +AQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYB +BQUHAgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVu +dGVtICJQb2xpdHlrYSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5p +ZSBjemFzZW0iLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVw +b3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJfMS5wZGYwHwYDVR0jBBgwFoAU +w4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavOYd9u9tej53vW +XwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz ++z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMb +skF8I31JxIeBvueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR ++7KtwMg4sFDJZ8RNgOf7tbA=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx -HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh -IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1 -MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg -SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M -IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U -0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI -TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf -RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF -zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh -BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA -AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY -PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ -BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn -9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT -Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF -Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX -n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW -H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S +MIIDlDCCAnygAwIBAgIQWAsFbFMk27JQVxhf+eWmUDANBgkqhkiG9w0BAQUFADAn +MQswCQYDVQQGEwJCRTEYMBYGA1UEAxMPQmVsZ2l1bSBSb290IENBMB4XDTAzMDEy +NjIzMDAwMFoXDTE0MDEyNjIzMDAwMFowJzELMAkGA1UEBhMCQkUxGDAWBgNVBAMT +D0JlbGdpdW0gUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AMihcekcRkJ5eHFvna6pqKsot03HIOswkVp19eLSz8hMFJhCWK3HEcVAQGpa+XQS +J4fpnOVxTiIs0RIYqjBeoiG52bv/9nTrMQHnO35YD5EWTXaJqAFPrSJmcPpLHZXB +MFjqvNll2Jq0iOtJRlLf0lMVdssUXRlJsW9q09P9vMIt7EU/CT9YvvzU7wCMgTVy +v/cY6pZifSsofxVsY9LKyn0FrMhtB20yvmi4BUCuVJhWPmbxMOjvxKuTXgfeMo8S +dKpbNCNUwOpszv42kqgJF+qhLc9s44Qd3ocuMws8dOIhUDiVLlzg5cYx+dtA+mqh +pIqTm6chBocdJ9PEoclMsG8CAwEAAaOBuzCBuDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGBWA4AQEBMC4wLAYIKwYBBQUHAgEW +IGh0dHA6Ly9yZXBvc2l0b3J5LmVpZC5iZWxnaXVtLmJlMB0GA1UdDgQWBBQQ8AxW +m2HqVzq2NZdtn925FI7b5jARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAU +EPAMVpth6lc6tjWXbZ/duRSO2+YwDQYJKoZIhvcNAQEFBQADggEBAMhtIlGKYfgP +lm7VILKB+MbcoxYA2s1q52sq+llIp0xJN9dzoWoBZV4yveeX09AuPHPTjHuD79ZC +wT+oqV0PN7p20kC9zC0/00RBSZz9Wyn0AiMiW3Ebv1jZKE4tRfTa57VjRUQRDSp/ +M382SbTObqkCMa5c/ciJv0J71/Fg8teH9lcuen5qE4Ad3OPQYx49cTGxYNSeCMqr +8JTHSHVUgfMbrXec6LKP24OsjzRr6L/D2fVDw2RV6xq9NoY2uiGMlxoh1OotO6y6 +7Kcdq765Sps1LxxcHVGnH1TtEpf/8m6HfUbJdNbv6z195lluBpQE5KJVhzgoaiJe +4r50ErAEQyo= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH8jCCB1ugAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl +SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl +SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 +DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIzMTExMTEwM1oXDTI1MTIyOTEx +MTEwM1owggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD +VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n +IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g +IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA55+R7+voFuF0vIkTodduR8ZfPxKU5u/h +M+GrgqufAwHmdG+KF5fPVy8Mdi7mbqfK2veLFBVADbNq2e2+s2q8Ai0chS3vl//P +l9rrR10eU79dVN4ndGMZfpXUMZblz0/Kq3Uvk5AsWUwfv1YokIhi4RMeBtOCVv3j +LSV1rDsiap8CAwEAAaOCBFIwggROMB0GA1UdDgQWBBRtW6MBjmE3nQR4tq+blh0C +QeXbeTCCAUQGA1UdIwSCATswggE3gBRtW6MBjmE3nQR4tq+blh0CQeXbeaGCARqk +ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE +BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT +ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC +LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD +VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr +BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB +FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC +AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB +D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0UxIENBIENlcnRp +ZmljYXRlIGlzc3VlZCBieSBodHRwczovL3d3dy5pcHMuZXMvMCoGCWCGSAGG+EIB +AgQdFhtodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi8wOwYJYIZIAYb4QgEEBC4W +LGh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMEAG +CWCGSAGG+EIBAwQzFjFodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0 +aW9uQ0xBU0UxLmh0bWw/MD0GCWCGSAGG+EIBBwQwFi5odHRwczovL3d3dy5pcHMu +ZXMvaXBzMjAwMi9yZW5ld2FsQ0xBU0UxLmh0bWw/MDsGCWCGSAGG+EIBCAQuFixo +dHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTEuaHRtbDB1BgNV +HR8EbjBsMDKgMKAuhixodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy +Q0xBU0UxLmNybDA2oDSgMoYwaHR0cHM6Ly93d3diYWNrLmlwcy5lcy9pcHMyMDAy +L2lwczIwMDJDTEFTRTEuY3JsMC8GCCsGAQUFBwEBBCMwITAfBggrBgEFBQcwAYYT +aHR0cDovL29jc3AuaXBzLmVzLzANBgkqhkiG9w0BAQUFAAOBgQBacEdMbCU0z2bO +X+iyJafrUbjPE+5KzJz2jB1YXC2d7kMy2Hhbp8gVyfUFQpd+F2IgBBj9z3IRNkDN +foHhdse5j2cUUH+fno9jj8EPE2GPhXVmCjIP6KuPp8yzz89gC+ry+bkfSFzjHUQt +K15I/jRAHfyJywwUrwtmklZIX0E5Og== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIEO8rJUjANBgkqhkiG9w0BAQUFADBmMQswCQYDVQQGEwJE +SzEMMAoGA1UEChMDS01EMQ8wDQYDVQQLEwZLTUQtQ0ExFjAUBgNVBAMTDUtNRC1D +QSBTZXJ2ZXIxIDAeBgoJkiaJk/IsZAEDFBBpbmZvY2FAa21kLWNhLmRrMB4XDTk4 +MTAxNjE5MTkyMVoXDTE4MTAxMjE5MTkyMVowZjELMAkGA1UEBhMCREsxDDAKBgNV +BAoTA0tNRDEPMA0GA1UECxMGS01ELUNBMRYwFAYDVQQDEw1LTUQtQ0EgU2VydmVy +MSAwHgYKCZImiZPyLGQBAxQQaW5mb2NhQGttZC1jYS5kazCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAJsLpbSgFxQ7IhFgf5f+RfBxnbCkx5C7yTjfCZvp +/BP2LBD3OKjgLRwvASoCU3I5NMhccho6uhZVf1HC+Ac5HmXUUd+v92a7gDnohPPy +Rgv8c6f/+R2fFen37SBemYFDtZveamVXZ2To7xAxNiMKgPTPs/Rl7F6LDsYgv1bD +36FrjahNoSTmTbYRoK21eIOVwrZeNSzo9w3W8fj0n+V2IB1jsOh+AvjXkjbvAVky +0/57GMlyBNKP7JIGP7LXqwWfrBXuAph1DUMz467KlHZOMkPwCjTZOab7CcLQXCCY +12s5c5QAkwpf35hQRuOaNo6d/XFM6J9mofiWlGTT3Px1EX0CAwEAAaMQMA4wDAYD +VR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAPlA6VZ2C2cJbsI0SBIe9v+M9 +GxI45QI7P0D7QGyrqM7oNqGq7hJdN6NFb0LyPcF3/pVzmtYVJzaGKF6spaxOEveB +9ki1xRoXUKpaCxSweBpTzEktWa43OytRy0sbryEmHJCQkz8MPufWssf2yXHzgFFo +XMQpcMyT7JwxPlfYVvab9Kp+nW7fIyDOG0wdmBerZ+GEQJxJEkri1HskjigxhGze +ziocJatBuOWgqw5KRylgGIQjUGRTCbODVta+Kmqb9d+cB7FStbYtt2HebOXzBIY3 +XUM5KtGC++We7DqgU5Firek7brw8i2XsHPLKJTceb6Xo6DsSxLfBAWV6+8DCkQ==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx -HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh -IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz -NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg -SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M -IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ -7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb -m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY -xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ -YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq -JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx -I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz -kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh -EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S -Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM -gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu -rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO -1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu -h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP -yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q -7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT -RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ -ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB -M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ -my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO -AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT -9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H -hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5 -fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg +MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz +MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy +dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD +VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg +xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu +xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 +XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k +heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J +YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C +urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 +JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 +b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV +9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 +kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh +fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA +aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS +RGQDJereW26fyfJOrN3H  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE-----  MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli @@ -390,184 +350,85 @@ gkHNZTfqjjJ+vWuZXTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb  CReJf8Py05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli -ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq -YmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0aW9uMB4XDTAy -MDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UEChMJYmVUUlVTVGVk -MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl -ZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1Q+xVkrYwfTVXDNvzDSduTPdQqJtO -K2/b9a0cS12zqcH+e0TrW6MFDR/FNCswACnxeECypP869AGIF37m1CbTukzqMvtD -d5eHI8XbQ6P1KqNRXuE70mVpflUVm3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdj -DheT389Lrm5zdeDzqrmkwAkbhepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCe -yv78IZTuEyhL11xeDGbu6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCkt -VjMFu5dZfsZJT4nXLySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMB -MIIBtwYDVR0gBIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYI -KwYBBQUHAgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRp -ZmljYXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug -b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0 -aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGljaCBjYW4gYmUg -Zm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0cHM6Ly93d3cuYmV0 -cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMEIGCCsGAQUF -BwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2Vz -L2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQDAgAHMIGJBgNVHR8EgYEwfzB9oHug -eaR3MHUxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJv -b3QgQ0FzMTMwMQYDVQQDEypiZVRSVVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1w -bGVtZW50YXRpb24xDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEw -ODI0MjdagQ8yMDIyMDQxMTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaA -FH1w5a44iwY/qhwaj/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQw -qoSEFjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIE -kDANBgkqhkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ -5V04ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB -evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220Y/oz -ADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2KjiS2d2k -XgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFiaDrmLzfzgYYh -xKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep9w== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUFADBi -MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENB -czEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRp -b24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBiMRIwEAYDVQQKEwli -ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEvMC0GA1UEAxMm -YmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQwCY5X0LkGLG9uJIAiv11DpvpPrILn -HGhwhRujbrWqeNluB0s/6d/16uhUoWGKDi9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I -1DpAa5LxmZZk3tv/ePTulh1HiXzUvrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPk -tPDgaTuID0GQ+NRxQyTBjyZLO1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnU -GxlkVgoZ98zh/4avflherHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8er -cmsl9fNTGwxMLvF1S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIY -MIICFDAMBgNVHRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+ -AAADCSiDkTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5j -b20vcHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB -OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjcmVh -dGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRoZSB0aGVu -IGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNl -LCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgYW5kIHRoZSBS -ZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRo -ZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuYmV0cnVzdGVkLmNvbS9w -cm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMAsGA1UdDwQEAwIBBjAfBgNVHSME -GDAWgBSp7BR++dlDzFMrFK3P9/BZiUHNGTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxSt -z/fwWYlBzRkwDQYJKoZIhvcNAQEFBQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g -6IHHtt9DwSwddUvUQo3neqh03GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuK -mET7m9cqg5c0Lcd9NUwtNLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbd -LrML3kqNWz2rDcI1UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28Bb -J1zTcwfBwvNMm2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3 -SK41ty8ymmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E -jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo -ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI -ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu -Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg -AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 -HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA -uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa -TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg -xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q -CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x -O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs -6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp -ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow -fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV -BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM -cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S -HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 -CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk -3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz -6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV -HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud -EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv -Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw -Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww -DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 -5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI -gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ -aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl -izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 -aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla -MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO -BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD -VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW -fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt -TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL -fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW -1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 -kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G -A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v -ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo -dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu -Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ -HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS -jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ -xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn -dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV -UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL -EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ -BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x -ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg -bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ -j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV -Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG -SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx -JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI -RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw -MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 -fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i -+DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG -SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN -QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ -gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg +Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL +MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD +VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0 +ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX +l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB +HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B +5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3 +WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP +gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+ +DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu +BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs +h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk +LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW +Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q +Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 +1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq +ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 +Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX +XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN +irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 +TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 +g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB +95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj +S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE-----  MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV @@ -589,141 +450,75 @@ xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL  B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVu -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcxNjE2NDBaFw0yMDAy -MDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7Ny -Spj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0 -iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn -5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHd -BgNVHR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0 -MUAwPgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy -ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5l -dCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAy -MDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdF -fP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w -AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMS -hAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/ -GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKd -zmVml64mXg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChML -RW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGlu -Y29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg -RW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJl -IFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDQxNzIwMDBa -Fw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0GA1UE -CxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO -8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaB -bL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2 -dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4 -QgEBBAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoT -C0VudHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw -IEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3Vy -ZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEw -KwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD -VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1Ud -DgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2 -fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsia -d0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbvH9X07t9WLebKahlzqlO+krNQAraF -JnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1U -yrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy -MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA -vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G -CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA -WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo -oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ -h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 -f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN -B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy -vUxFnmG6v4SBkgPR0ml8xQ== +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5u -ZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlh -Yi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV -BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJVUzEU -MBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9D -bGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMq -RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0G -CSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo -6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux -5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zm -AqTmT173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSC -ARkwggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 -cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5m -by9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMp -IDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQg -Q2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg -KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNV -HRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8E -BAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYE -FMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA -BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7 -pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzz -wy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/a -EkP/TOYGJqibGapEPHayXOw= +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy +MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp +eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg +/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl +wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh +AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 +PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu +AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR +MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc +HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ +Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ +f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO +rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch +6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 +7CAFYd4=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE-----  MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV @@ -745,75 +540,268 @@ A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y  1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT -ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw -MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j -LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo -RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu -WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw -Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD -AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK -eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM -zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ -WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN -/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz +MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N +IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 +bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE +RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO +zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 +bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF +MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 +VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC +OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW +tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ +q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb +EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ +Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O +VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEAq6HgBiMui0NiZdH3zNiWYwDQYJKoZIhvcNAQEFBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh +YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 +FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBAIDToA+IyeVoW4R7gB+nt+MjWBEc9RTwWBKMi99x2ZAk +EXyge8N6GRm9cr0gvwA63/rVeszC42JFi8tJg5jBcGnQnl6CjDVHjk8btB9jAa3k +ltax7nosZm4XNq8afjgGhixrTcsnkm54vwDVAcCxB8MJqmSFKPKdc57PYDoKHUpI  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj -dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 -NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD -VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G -vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ -BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX -MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl -IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw -NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq -y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy -0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 -E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD +EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X +DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw +DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u +c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr +TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA +OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC +2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW +RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P +AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW +ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 +YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz +b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO +ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB +IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs +b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s +YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg +a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g +SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 +aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg +YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg +Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY +ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g +pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 +Fp1hBWeAyNDYpQcCNJgEjTME1A==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT -ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw -MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj -dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l -c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC -UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc -58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ -o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr -aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA -A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA -Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv -8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN +BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd +BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN +MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g +Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG +A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l +c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT +6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa +Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL +8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC +9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ +pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ +CayJSdM= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCVVMx +DTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2 +aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcNMDAwODE2MjI1 +MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklT +QTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRp +b24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZDK9vZBv42pWUJGkzEXDK41Z0ohdX +ZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJXLB1LRckaeNCYOTudNargFbYiCjh+20i +/SN8RnNPflRzHqgsVVh1t0zzWkWlAhr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU +58fy+pmjIlC++QU3o63tmsPm7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/g +halMCXI5Etuz9c9OYmTaxhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E +1w0cslSsMoW0ZA3eQbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ +ca3CBfYDdYDOqU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHb +mQdpNSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ +kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoLaxhN +dBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/RtLdh6yumJ +ivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8ofyrEK9ca3Cn +B+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEajCCA1KgAwIBAgIBATANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJKUDEN +MAsGA1UECgwESlBLSTEpMCcGA1UECwwgUHJlZmVjdHVyYWwgQXNzb2NpYXRpb24g +Rm9yIEpQS0kxETAPBgNVBAsMCEJyaWRnZUNBMB4XDTAzMTIyNzA1MDgxNVoXDTEz +MTIyNjE0NTk1OVowWjELMAkGA1UEBhMCSlAxDTALBgNVBAoMBEpQS0kxKTAnBgNV +BAsMIFByZWZlY3R1cmFsIEFzc29jaWF0aW9uIEZvciBKUEtJMREwDwYDVQQLDAhC +cmlkZ2VDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANTnUmg7K3m8 +52vd77kwkq156euwoWm5no8E8kmaTSc7x2RABPpqNTlMKdZ6ttsyYrqREeDkcvPL +yF7yf/I8+innasNtsytcTAy8xY8Avsbd4JkCGW9dyPjk9pzzc3yLQ64Rx2fujRn2 +agcEVdPCr/XpJygX8FD5bbhkZ0CVoiASBmlHOcC3YpFlfbT1QcpOSOb7o+VdKVEi +MMfbBuU2IlYIaSr/R1nO7RPNtkqkFWJ1/nKjKHyzZje7j70qSxb+BTGcNgTHa1YA +UrogKB+UpBftmb4ds+XlkEJ1dvwokiSbCDaWFKD+YD4B2s0bvjCbw8xuZFYGhNyR +/2D5XfN1s2MCAwEAAaOCATkwggE1MA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MG0GA1UdHwRmMGQwYqBgoF6kXDBaMQswCQYDVQQGEwJKUDENMAsGA1UE +CgwESlBLSTEpMCcGA1UECwwgUHJlZmVjdHVyYWwgQXNzb2NpYXRpb24gRm9yIEpQ +S0kxETAPBgNVBAsMCEJyaWRnZUNBMIGDBgNVHREEfDB6pHgwdjELMAkGA1UEBhMC +SlAxJzAlBgNVBAoMHuWFrOeahOWAi+S6uuiqjeiovOOCteODvOODk+OCuTEeMBwG +A1UECwwV6YO96YGT5bqc55yM5Y2U6K2w5LyaMR4wHAYDVQQLDBXjg5bjg6rjg4Pj +grjoqo3oqLzlsYAwHQYDVR0OBBYEFNQXMiCqQNkR2OaZmQgLtf8mR8p8MA0GCSqG +SIb3DQEBBQUAA4IBAQATjJo4reTNPC5CsvAKu1RYT8PyXFVYHbKsEpGt4GR8pDCg +HEGAiAhHSNrGh9CagZMXADvlG0gmMOnXowriQQixrtpkmx0TB8tNAlZptZWkZC+R +8TnjOkHrk2nFAEC3ezbdK0R7MR4tJLDQCnhEWbg50rf0wZ/aF8uAaVeEtHXa6W0M +Xq3dSe0XAcrLbX4zZHQTaWvdpLAIjl6DZ3SCieRMyoWUL+LXaLFdTP5WBCd+No58 +IounD9X4xxze2aeRVaiV/WnQ0OSPNS7n7YXy6xQdnaOU4KRW/Lne1EDf5IfWC/ih +bVAmhZMbcrkWWcsR6aCPG+2mV3zTD6AUzuKPal8Y +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB +VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp +bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R +dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTA1MDgxNzIyMDAw +MFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy +dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52 +ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMM +EEEtVHJ1c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCtPWFuA/OQO8BBC4SAzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUj +lUC5B3ilJfYKvUWG6Nm9wASOhURh73+nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZ +znF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPESU7l0+m0iKsMrmKS1GWH +2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4iHQF63n1 +k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs +2e3Vcuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYD +VR0OBAoECERqlWdVeRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAVdRU0VlIXLOThaq/Yy/kgM40ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fG +KOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmrsQd7TZjTXLDR8KdCoLXEjq/+ +8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZdJXDRZslo+S4R +FGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS +mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmE +DNuxUCAKGkq6ahq97BvIxYSazQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE-----  MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzELMAkG @@ -837,19 +825,305 @@ ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBgHcl5JLL2bP2o  Zg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv -bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv -b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds -b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH -iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS -r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 -04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r -GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 -3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P -lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +MIIETTCCAzWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBtMQswCQYDVQQGEwJDSDEO +MAwGA1UEChMFYWRtaW4xETAPBgNVBAsTCFNlcnZpY2VzMSIwIAYDVQQLExlDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0aWVzMRcwFQYDVQQDEw5BZG1pbkNBLUNELVQwMTAe +Fw0wNjAxMjUxMzM2MTlaFw0xNjAxMjUxMjM2MTlaMG0xCzAJBgNVBAYTAkNIMQ4w +DAYDVQQKEwVhZG1pbjERMA8GA1UECxMIU2VydmljZXMxIjAgBgNVBAsTGUNlcnRp +ZmljYXRpb24gQXV0aG9yaXRpZXMxFzAVBgNVBAMTDkFkbWluQ0EtQ0QtVDAxMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0jQlMZmpLDhV+GNR9TAoSNle +JgQB4xAXJELQf5/ySMfoFA4MmjKqYXQkB6MGPuQKwR9XRRSPf61vqb8YPsdjRmgp +byHBcUd5t0N8RX6wRZUnPMW+bCCo2VqAU4XFbnlc2gHKaam0wdTtbBTXEkv0ieIH +fxCfFxXqSsSr60IkF/2/xbrAgV/QD5yHk6Ie8feAVWwi5UtaFqtu4LiFEh2QMyxs +Oyz1OcvKzkM2g873tyiE7jzMgZP+Ww3tibk2F9+e6ZeiB37TLOmVtvgpmrws4fiI +rFNXEYSWBVrUTbn81U47yWzOgf5fEHP07bRV5QOCzCm99qNimsbL6CG7nT78CQID +AQABo4H3MIH0MBIGA1UdEwEB/wQIMAYBAf8CAQAwga4GA1UdIASBpjCBozCBoAYI +YIV0AREDFQEwgZMwSAYIKwYBBQUHAgIwPBo6VGhpcyBpcyB0aGUgQWRtaW5DQS1D +RC1UMDEgQ2VydGlmaWNhdGUgUHJhY3RpY2UgU3RhdGVtZW50LjBHBggrBgEFBQcC +ARY7aHR0cDovL3d3dy5wa2kuYWRtaW4uY2gvcG9saWN5L0NQU18yXzE2Xzc1Nl8x +XzE3XzNfMjFfMS5wZGYwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQqxGkKocZV +xgNucM6GgbOkD6oZ2zANBgkqhkiG9w0BAQUFAAOCAQEAn356bbusjI5glGXRQ1DR +v21qQf0S4s3GHyZm7cqdOkFleM70ArBT+kOP5Nm7rlSAFyVgEkmBdOg7s9tlXClU +yeZFnp6UEYRUcijPN8D1VaNRK6PIUObpDBQT0C+kAfxG9z4v29T0SxT4sgAdC/xQ +Fyv58Fp9bPn7owuKwKcyCH1XSyi/Bp4XFELlLOaigBZO/w+dPBz4FcJSdZjU+BaJ +0E3nKAjHlShO5ouBSZnaJz3p+nkw2Wyo36s6GxCK0XbkSP45iniIG4FmwwZkonYF +ypQntHbx2oL7tUQQY0PDo8bGBMcPy/G2j+dciqZRlsnfgMy10SCzQ9MUx92xUG2V +eg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV +BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt +ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4 +MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg +SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl +a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h +4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk +tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s +tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL +dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4 +c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um +TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z ++kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O +Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW +OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW +fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2 +l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw +FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+ +8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI +6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO +TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME +wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY +Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn +xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q +DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q +Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t +hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4 +7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7 +QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGJDCCBY2gAwIBAgIEQoaroDANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjA3 +MTQxNzEwMjhaFw0xNDA3MTQxNzQwMjhaMFwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK +EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xGzAZBgNV +BAMTEkRpZ2lDZXJ0IEdsb2JhbCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAMQ8vMy66mLmnkIjr7SyEa5ijdmh04/MFHIZ7Zn2/d5du1nAsMKvaplS +lVcLNf/hhvqvosPBBWUnIHYvClQlfOor3ZVBV5sPO89H6AEGjMVESPwHLvNygzBR +lJ5pOoOph5AU2V7EoniPwT7UGWEOGufcGpUgQb5vF9q4HEHumLD61x01PxanBCgT +XT0FdZouhp4ssBeHIFhX7+HqVWC4LHAhrCljDBD8YLz51Rw3ZNW0+x6rJjlGiKTL +zTBnwCZ55cpo+SLX5dKxu0hMmwuYW0KS5dLtDkcw+t0nVmNqpQHHjq/wTjsbVRVE +1T5NVx7hkeq4oI/OOmNflom6CD7+RLsCAwEAAaOCAwUwggMBMBIGA1UdEwEB/wQI +MAYBAf8CAQAwggEyBgNVHSAEggEpMIIBJTCCASEGCSqGSIb2fQdLAjCCARIwJgYI +KwYBBQUHAgEWGmh0dHA6Ly93d3cuZW50cnVzdC5uZXQvY3BzMIHnBggrBgEFBQcC +AjCB2hqB10ZvciB1c2Ugc29sZWx5IHdpdGggU1NMIGFuZCBTL01JTUUgY2VydGlm +aWNhdGVzIGlzc3VlZCBieSBEaWdpY2VydCwgSW5jLiB0byBhdXRob3JpemVkIHN1 +YnNjcmliZXJzLg0KRE9FUyBOT1QgcmVwcmVzZW50IGFueSBlbmRvcnNlbWVudCBi +eSBFbnRydXN0IEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMgYXMgdG8gdGhlIGlkZW50 +aXR5IG9mIGFueSBjZXJ0aWZpY2F0ZSBob2xkZXIuMDEGA1UdJQQqMCgGCCsGAQUF +BwMBBggrBgEFBQcDAgYIKwYBBQUHAwQGCCsGAQUFBwMJMIIBGAYDVR0fBIIBDzCC +AQswKKAmoCSGImh0dHA6Ly9jcmwuZW50cnVzdC5uZXQvc2VydmVyMS5jcmwwgd6g +gduggdikgdUwgdIxCzAJBgNVBAYTAlVTMRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE7 +MDkGA1UECxMyd3d3LmVudHJ1c3QubmV0L0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0 +ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwCwYDVR0PBAQDAgEGMB8GA1Ud +IwQYMBaAFPAXYhNVPbP/CgBr+1CEl/PtYtAaMB0GA1UdDgQWBBSnxxOgegE8ne+C +SIJI1XNRthJWKjAZBgkqhkiG9n0HQQAEDDAKGwRWNy4xAwIAgTANBgkqhkiG9w0B +AQUFAAOBgQBK8bPOaGnjWKNh7bYWyJOxGDA+4HLfTz3iTeG4/D/ByeNFqV2pwdqj +5TbXjtYPrTavbLxE5ppGlKYRoNBS59pVsPYchftjUnu2mY8f4stHZKLrCGXmUdsc +S21/U58eDTGT1DBdHm4BBydgXbvT9ONsHSAPdSozEKe3idepFxQyAw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 +WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv +bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU +UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw +bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe +LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef +J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh +R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ +Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX +JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p +zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S +Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq +ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz +gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH +uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS +y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh +YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 +FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg +J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc +r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEwOTIzMTMxODE3WjB1MQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQg +LSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g +5DY1Hw7hgCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZs +jqBeynX8T90vFILqsY2K5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfH +HB67Af+g7u0dEHdDW7lwy81MwFYxBTRy9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAEgfwwgfkwgfYGDSsGAQQB +vj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3eXN0YXdp +b255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2pp +IGRsYSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENB +IHcgaGllcmFyY2hpaSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3 +LnNpZ25ldC5wbC9yZXBvenl0b3JpdW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQw +HwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQbsa8wHQYDVR0OBBYEFMODHtVZ +d1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQBFIGh8Jpxt87A +gSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy +f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIis +TsytFzVP32/W+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB +3vSaoYg+wdkcvb6souMJzuc2uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U +1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uftXncwKJrMiE3lvgOOBITRzcahirL +er4c +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB +lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt +SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG +A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe +MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v +d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh +cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn +0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ +M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a +MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd +oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI +DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy +oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 +dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy +bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF +BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli +CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE +CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t +3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS +KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx +ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w +MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD +VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx +FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu +ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 +gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH +fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a +ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT +ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk +c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto +dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt +aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI +hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk +QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ +h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR +rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 +9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE-----  MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVT @@ -897,69 +1171,46 @@ HnNDJGD1HWHc3JagvPsd4+cSACczAsDAK1M92GsDgaPb1pOVIO/Tln4mkImcJpvN  b2ar7QMiRDjMWb2f2/YHogF/JsRj9SVCXmK9  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl -SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl -SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 -DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAwNTkzOFoXDTI1MTIyNzAw -NTkzOFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD -VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n -IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g -IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywS -zHb5BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS -YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJZHMQ -KD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzcuh9morKb -adB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKbadB4CKGCARqk -ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE -BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT -ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC -LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD -VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr -BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB -FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC -AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB -D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRp -ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC -BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito -dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMD8GCWCG -SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D -TEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw -czIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov -L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTEuaHRtbDBzBgNVHR8EbDBq -MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEu -Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy -Q0xBU0UxLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v -Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuK -Yn4VLenZMdMu9Ccj/1urxUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpj -V4F1Wo7ojPsCwJTGKbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+ -hjM+5i9Ibq9UkE6tsSU= +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT +MIIH8jCCB1ugAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT  MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE  ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE  ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl  SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl  SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 -DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMDE0NFoXDTI1MTIyNzAx -MDE0NFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD +DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIzMTExMTkzMVoXDTI1MTIyOTEx +MTkzMVowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD  VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n  IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g  IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv  biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv  biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZ -H49NzjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY -8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBxRiVr -SXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLnev42USGj -mFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGjmFsMNKGCARqk +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAve2QhYLxoN2P3DVo4Xw+6Gyb2vDjfzvB +JRvH+WFIXO3KItC1dJk2W7iFnsZJnb65Q6NDKxhwfQ4XnLuBSPqMVJ6EHB++I1p2 +pg0j7YOtec++o3ysS6zf1r01HSh8i85+AcGcgLO4Z79w9jtEGlSdrFhCLUjJJSEs +XdzSbkEFrkMCAwEAAaOCBFIwggROMB0GA1UdDgQWBBT7o4z3Z4tAqk02rzCA6po7 +4C9o6DCCAUQGA1UdIwSCATswggE3gBT7o4z3Z4tAqk02rzCA6po74C9o6KGCARqk  ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE  BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT  ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC @@ -970,86 +1221,653 @@ VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr  BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB  FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC  AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB -D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRp -ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC -BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito -dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMD8GCWCG -SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D -TEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw -czIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov -L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTMuaHRtbDBzBgNVHR8EbDBq -MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMu -Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy -Q0xBU0UzLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v -Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dD -qsfwfewPxqmurpYPdikc4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9 -D6eSb9ijBmgpjnn1/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGy -r33I6unUVtkOE7LFRVA= +D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0UzIENBIENlcnRp +ZmljYXRlIGlzc3VlZCBieSBodHRwczovL3d3dy5pcHMuZXMvMCoGCWCGSAGG+EIB +AgQdFhtodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi8wOwYJYIZIAYb4QgEEBC4W +LGh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMEAG +CWCGSAGG+EIBAwQzFjFodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0 +aW9uQ0xBU0UzLmh0bWw/MD0GCWCGSAGG+EIBBwQwFi5odHRwczovL3d3dy5pcHMu +ZXMvaXBzMjAwMi9yZW5ld2FsQ0xBU0UzLmh0bWw/MDsGCWCGSAGG+EIBCAQuFixo +dHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTMuaHRtbDB1BgNV +HR8EbjBsMDKgMKAuhixodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy +Q0xBU0UzLmNybDA2oDSgMoYwaHR0cHM6Ly93d3diYWNrLmlwcy5lcy9pcHMyMDAy +L2lwczIwMDJDTEFTRTMuY3JsMC8GCCsGAQUFBwEBBCMwITAfBggrBgEFBQcwAYYT +aHR0cDovL29jc3AuaXBzLmVzLzANBgkqhkiG9w0BAQUFAAOBgQAiu2FuR8MoQlYw +3QtFc/BI7DgkUUeSIM49JoMU0H3a4Y+JbQxQ4q/n6yAbEuMETUyqob/HmS/NkLJq +ur3RvGBseDXgxNyePGjFc97ITNWf5X1+4CXtBf+TTKNEMg1UpPbCz+9EkjzTcYj1 +5tjLbAp/mmLLZmCOV7cCGuXGSTBNzA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIG0zCCBbugAwIBAgIBADANBgkqhkiG9w0BAQUFADCBzDELMAkGA1UEBhMCQVQx +EDAOBgNVBAgTB0F1c3RyaWExDzANBgNVBAcTBlZpZW5uYTE6MDgGA1UEChMxQVJH +RSBEQVRFTiAtIEF1c3RyaWFuIFNvY2lldHkgZm9yIERhdGEgUHJvdGVjdGlvbjEl +MCMGA1UECxMcQS1DRVJUIENlcnRpZmljYXRpb24gU2VydmljZTEYMBYGA1UEAxMP +QS1DRVJUIEFEVkFOQ0VEMR0wGwYJKoZIhvcNAQkBFg5pbmZvQGEtY2VydC5hdDAe +Fw0wNDEwMjMxNDE0MTRaFw0xMTEwMjMxNDE0MTRaMIHMMQswCQYDVQQGEwJBVDEQ +MA4GA1UECBMHQXVzdHJpYTEPMA0GA1UEBxMGVmllbm5hMTowOAYDVQQKEzFBUkdF +IERBVEVOIC0gQXVzdHJpYW4gU29jaWV0eSBmb3IgRGF0YSBQcm90ZWN0aW9uMSUw +IwYDVQQLExxBLUNFUlQgQ2VydGlmaWNhdGlvbiBTZXJ2aWNlMRgwFgYDVQQDEw9B +LUNFUlQgQURWQU5DRUQxHTAbBgkqhkiG9w0BCQEWDmluZm9AYS1jZXJ0LmF0MIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3euXIy+mnf6BYKbK+QH5k679 +tUFqeT8jlZxMew8eNiHuw9KoxWBzL6KksK+5uK7Gatw+sbAYntEGE80P+Jg1hADM +e+Fr5V0bc6QS3gkVtfUCW/RIvfMM39oxvmqJmOgPnJU7H6+nmLtsq61tv9kVJi/2 +4Y5wXW3odet72sF57EoG6s78w0BUVLNcMngS9bZZzmdG3/d6JbkGgoNF/8DcgCBJ +W/t0JrcIzyppXIOVtUzzOrrU86zuUgT3Rtkl5kjG7DEHpFb9H0fTOY1v8+gRoaO6 +2gA0PCiysgVZjwgVeYe3KAg11nznyleDv198uK3Dc1oXIGYjJx2FpKWUvAuAEwID +AQABo4ICvDCCArgwHQYDVR0OBBYEFDd/Pj6ZcWDKJNSRE3nQdCm0qCTYMIH5BgNV +HSMEgfEwge6AFDd/Pj6ZcWDKJNSRE3nQdCm0qCTYoYHSpIHPMIHMMQswCQYDVQQG +EwJBVDEQMA4GA1UECBMHQXVzdHJpYTEPMA0GA1UEBxMGVmllbm5hMTowOAYDVQQK +EzFBUkdFIERBVEVOIC0gQXVzdHJpYW4gU29jaWV0eSBmb3IgRGF0YSBQcm90ZWN0 +aW9uMSUwIwYDVQQLExxBLUNFUlQgQ2VydGlmaWNhdGlvbiBTZXJ2aWNlMRgwFgYD +VQQDEw9BLUNFUlQgQURWQU5DRUQxHTAbBgkqhkiG9w0BCQEWDmluZm9AYS1jZXJ0 +LmF0ggEAMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMEcGA1UdJQRAMD4G +CCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcD +CAYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAP8wUQYDVR0gBEowSDBGBggq +KAAYAQEBAzA6MDgGCCsGAQUFBwIBFixodHRwOi8vd3d3LmEtY2VydC5hdC9jZXJ0 +aWZpY2F0ZS1wb2xpY3kuaHRtbDA7BglghkgBhvhCAQgELhYsaHR0cDovL3d3dy5h +LWNlcnQuYXQvY2VydGlmaWNhdGUtcG9saWN5Lmh0bWwwGQYDVR0RBBIwEIEOaW5m +b0BhLWNlcnQuYXQwLwYDVR0SBCgwJoEOaW5mb0BhLWNlcnQuYXSGFGh0dHA6Ly93 +d3cuYS1jZXJ0LmF0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHBzOi8vc2VjdXJlLmEt +Y2VydC5hdC9jZ2ktYmluL2EtY2VydC1hZHZhbmNlZC5jZ2kwDQYJKoZIhvcNAQEF +BQADggEBACX1IvgfdG2rvfv35O48vSEvcVaEdlN8USFBHWz3JRAozgzvaBtwHkjK +Zwt5l/BWOtjbvHfRjDt7ijlBEcxOOrNC1ffyMHwHrXpvff6YpQ5wnxmIYEQcURiG +HMqruEX0WkuDNgSKwefsgXs27eeBauHgNGVcTYH1rmHu/ZyLpLxOyJQ2PCzA1DzW +3rWkIX92ogJ7lTRdWrbxwUL1XGinxnnaQ74+/y0pI9JNEv7ic2tpkweRMpkedaLW +msC1+orfKTebsg69aMaCx7o6jNONRmR/7TVaPf8/k6g52cHZ9YWjQvup22b5rWxG +J5r5LZ4vCPmF4+T4lutjUYAa/lGuQTg=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E +jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo +ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI +ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu +Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg +AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 +HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA +uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa +TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg +xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q +CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs +6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV +MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe +TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 +dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 +N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC +dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu +MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL +b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD +zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi +3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 +WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY +Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi +NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC +ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 +QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 +YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz +aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm +ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg +ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs +amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv +IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 +Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 +ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 +YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg +dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs +b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G +CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO +xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP +0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ +QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk +f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK +8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK +VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm +Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J +h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul +uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 +DzFc6PLZ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYwOTIxMTU0MjE5WjB2MQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQg +LSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3 +LanJtdueNe6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP +6KZTU0DixOrV+K7iWaqAiQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6H +dbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPEOpO94mAKcBUhk6T/ki0evXX/ZvvktwmF +3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Dbw34hA1A+ckTwhxzecrB8 +TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC3P8QqoK4 +ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHk +MIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll +IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENB +Ii4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNo +aWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwv +cmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw +OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Ev +cm9vdGNhLmNybDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNV +HQ4EFgQUXvthcPHlH5BgGhlMErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIc +e95Mvn710KCAISA0CuHD4aznTU6pLoCDShW47OR+GTpJUm1coTcUqlBHV9mra4VF +rBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJGdsJF/XU/7smummgj +MNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oFJTlp +uxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1D +OcePEhKz1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BX +WCW+KxwiBrtQTXv4dTE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT +AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ +TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG +9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw +MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM +BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO +MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 +LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI +s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 +xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 +u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b +F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx +Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd +PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV +HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx +NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF +AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ +L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY +YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a +NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R +0982gaEbeC9xs/FZTEYYKKuF0mBWWg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH/zCCB2igAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVT  MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE  ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm -SVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT -JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI -hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNTMyWhcNMjUxMjI3 -MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ -BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp -bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G -LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw -gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8 -m2mdd81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd -ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1e+J8 -eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/2LUDnf47 -3P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf473P7yiuYV3TCh -ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ -BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp -bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G -LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC -AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF -BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB -BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg -hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud -EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBD -QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG -SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC -AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j -cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2 -b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu -aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRtbD8wOwYJYIZIAYb4QgEI -BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMS5odG1s -MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz -MjAwMkNMQVNFQTEuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz -MjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF -BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyA -AIQVCtWYUQxkxZwCWINmyq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeF -aQoO42Hu6r4okzPV7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aL -H2betgPAK7N41lUH5Y85UN4HI3LmvSAUS7SG +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEzMDEGA1UECxMq +SVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTMwMQYD +VQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +HjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczAeFw0wMTEyMzExMTE0NTRa +Fw0yNTEyMjkxMTE0NTRaMIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl +bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQg +cHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMu +ZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBD +QXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFp +bmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYP +aXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpOZZJ +iHAzKHzoV9xIki3eLXp56UjxFehnY+c+Dh1nUiVO0t//vmGMP6B2LTFfx9FBKRBi +kYcW7raIcSDi62Or0sAG5UUgG4ruGLE7XtCnnx4xjgbFZ4tTjdgi5Wh9GVhfP7Oo +9ahi8Eqao+alFbhvB6LD3xZZqM2j9cmD8GzYAQIDAQABo4IESzCCBEcwHQYDVR0O +BBYEFAeUqHBsCqTumbhV3S5MRXf2Nq+5MIIBTgYDVR0jBIIBRTCCAUGAFAeUqHBs +CqTumbhV3S5MRXf2Nq+5oYIBJKSCASAwggEcMQswCQYDVQQGEwJFUzESMBAGA1UE +CBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJ +bnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0Bt +YWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxMzAxBgNVBAsTKklQUyBDQSBD +aGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEzMDEGA1UEAxMqSVBT +IENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI +hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E +BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMG +CCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYB +BAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw +EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBD +BglghkgBhvhCAQ0ENhY0Q2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg +aHR0cHM6Ly93d3cuaXBzLmVzLzAqBglghkgBhvhCAQIEHRYbaHR0cHM6Ly93d3cu +aXBzLmVzL2lwczIwMDIvMDgGCWCGSAGG+EIBBAQrFilodHRwczovL3d3dy5pcHMu +ZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA9BglghkgBhvhCAQMEMBYuaHR0cHM6 +Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2b2NhdGlvbkNBQy5odG1sPzA6BglghkgB +hvhCAQcELRYraHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENBQy5o +dG1sPzA4BglghkgBhvhCAQgEKxYpaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIv +cG9saWN5Q0FDLmh0bWwwbwYDVR0fBGgwZjAvoC2gK4YpaHR0cHM6Ly93d3cuaXBz +LmVzL2lwczIwMDIvaXBzMjAwMkNBQy5jcmwwM6AxoC+GLWh0dHBzOi8vd3d3YmFj +ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDAvBggrBgEFBQcBAQQjMCEw +HwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQAD +gYEATiRvY2nro9B6QNgTOgojWSrXMKpXHa6hLRxL2GZPEFg059x2ERs3pw7RlJJZ +ctupZam06zvBnGfQL4ZhevXl6ST6RAAmOikuj8kbiFSgujjCJY1wv5/7zzgBWzdL +NzqKC18p1T2KZa8B2qKfQCqzV/J3fgI/725+9ekqKNLiE5Q=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUFADBi +MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENB +czEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRp +b24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBiMRIwEAYDVQQKEwli +ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEvMC0GA1UEAxMm +YmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQwCY5X0LkGLG9uJIAiv11DpvpPrILn +HGhwhRujbrWqeNluB0s/6d/16uhUoWGKDi9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I +1DpAa5LxmZZk3tv/ePTulh1HiXzUvrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPk +tPDgaTuID0GQ+NRxQyTBjyZLO1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnU +GxlkVgoZ98zh/4avflherHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8er +cmsl9fNTGwxMLvF1S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIY +MIICFDAMBgNVHRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+ +AAADCSiDkTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5j +b20vcHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB +OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjcmVh +dGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRoZSB0aGVu +IGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNl +LCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgYW5kIHRoZSBS +ZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRo +ZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuYmV0cnVzdGVkLmNvbS9w +cm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMAsGA1UdDwQEAwIBBjAfBgNVHSME +GDAWgBSp7BR++dlDzFMrFK3P9/BZiUHNGTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxSt +z/fwWYlBzRkwDQYJKoZIhvcNAQEFBQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g +6IHHtt9DwSwddUvUQo3neqh03GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuK +mET7m9cqg5c0Lcd9NUwtNLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbd +LrML3kqNWz2rDcI1UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28Bb +J1zTcwfBwvNMm2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3 +SK41ty8ymmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEUzCCAzugAwIBAgIDAOJDMA0GCSqGSIb3DQEBBQUAMIHPMQswCQYDVQQGEwJB +VDGBizCBiAYDVQQKHoGAAEEALQBUAHIAdQBzAHQAIABHAGUAcwAuACAAZgD8AHIA +IABTAGkAYwBoAGUAcgBoAGUAaQB0AHMAcwB5AHMAdABlAG0AZQAgAGkAbQAgAGUA +bABlAGsAdAByAC4AIABEAGEAdABlAG4AdgBlAHIAawBlAGgAcgAgAEcAbQBiAEgx +GDAWBgNVBAsTD0EtVHJ1c3QtUXVhbC0wMTEYMBYGA1UEAxMPQS1UcnVzdC1RdWFs +LTAxMB4XDTA0MTEzMDIzMDAwMFoXDTE0MTEzMDIzMDAwMFowgc8xCzAJBgNVBAYT +AkFUMYGLMIGIBgNVBAoegYAAQQAtAFQAcgB1AHMAdAAgAEcAZQBzAC4AIABmAPwA +cgAgAFMAaQBjAGgAZQByAGgAZQBpAHQAcwBzAHkAcwB0AGUAbQBlACAAaQBtACAA +ZQBsAGUAawB0AHIALgAgAEQAYQB0AGUAbgB2AGUAcgBrAGUAaAByACAARwBtAGIA +SDEYMBYGA1UECxMPQS1UcnVzdC1RdWFsLTAxMRgwFgYDVQQDEw9BLVRydXN0LVF1 +YWwtMDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCmhgdxIbxTGEOH +fXGiewI3NFldAWKFWfLofO+5I1UbvA5avt7IgsGXz/tI/f5HGUbascI0i7xG0tqV +lA5ctQgLRqxgxHtgTkMcqsAEYdsz3LZsCdXO1QrvEBGLTSABdxiL/gSWJ6z77CSw +x7Xg02HwxPV82cjGkSF3ENGJntuIAAnRDWn/ORHjFatNRymoMbHaOEZXSGhf7Y5F +rrHEqGyi9E6sv784De/T1aTvskn8cWeUmDzv//omiG/a/V9KQex/61XN8OthUQVn +X+u/liL2NKx74I2C/GgHX5B0WkPNqsSOgmlvJ/cKuT0PveUgVFDAA0oYBgcE1KDM +lBbN0kmPAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECEs8jB2F +6W+tMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAIUusmJzMJRiQ +8TAHrJAOelfuWoTGcqdIv7Tys/fNl2yF2fjvHT8J01aKialFVpbVeQ2XKb1O2bHO +QYAKgsdZ2jZ/sdL2UVFRTHmidLu6PdgWCBRhJYQELQophO9QVvfhAA0TwbESYqTz ++nlI5Gr7CZe8f6HEmhJmCtUQsdQCufGglRh4T+tIGiNGcnyVEHZ93mSVepFr1VA2 +9CTRPteuGjA81jeAz9peYiFE1CXvxK9cJiv0BcALFLWmADCoRLzIRZhA+sAwYUmw +M1rqVCPA3kBQvIC95tyQvNy2dG0Vs+O6PwLaNX/suSlElQ06X2l1VwMaYb4vZKFq +N0bOhBXEVg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDyzCCArOgAwIBAgIDAOJIMA0GCSqGSIb3DQEBBQUAMIGLMQswCQYDVQQGEwJB +VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp +bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRgwFgYDVQQLDA9BLVRydXN0LVF1 +YWwtMDIxGDAWBgNVBAMMD0EtVHJ1c3QtUXVhbC0wMjAeFw0wNDEyMDIyMzAwMDBa +Fw0xNDEyMDIyMzAwMDBaMIGLMQswCQYDVQQGEwJBVDFIMEYGA1UECgw/QS1UcnVz +dCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy +a2VociBHbWJIMRgwFgYDVQQLDA9BLVRydXN0LVF1YWwtMDIxGDAWBgNVBAMMD0Et +VHJ1c3QtUXVhbC0wMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJaR +q9eOsFm4Ab20Hq2Z/aH86gyWa48uSUjY6eQkguHYuszr3gdcSMYZggFHQgnhfLmf +ro/27l5rqKhWiDhWs+b+yZ1PNDhRPJy+86ycHMg9XJqErveULBSyZDdgjhSwOyrN +ibUir/fkf+4sKzP5jjytTKJXD/uCxY4fAd9TjMEVpN3umpIS0ijpYhclYDHvzzGU +833z5Dwhq5D8bc9jp8YSAHFJ1xzIoO1jmn3jjyjdYPnY5harJtHQL73nDQnfbtTs +5ThT9GQLulrMgLU4WeyAWWWEMWpfVZFMJOUkmoOEer6A8e5fIAeqdxdsC+JVqpZ4 +CAKel/Arrlj1gFA//jsCAwEAAaM2MDQwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4E +CgQIQj0rJKbBRc4wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBG +yxFjUA2bPkXUSC2SfJ29tmrbiLKal+g6a9M8Xwd+Ejo+oYkNP6F4GfeDtAXpm7xb +9Ly8lhdbHcpRhzCUQHJ1tBCiGdLgmhSx7TXjhhanKOdDgkdsC1T+++piuuYL72TD +gUy2Sb1GHlJ1Nc6rvB4fpxSDAOHqGpUq9LWsc3tFkXqRqmQVtqtR77npKIFBioc6 +2jTBwDMPX3hDJDR1DSPc6BnZliaNw2IHdiMQ0mBoYeRnFdq+TyDKsjmJOOQPLzzL +/saaw6F891+gBjLFEFquDyR73lAPJS279R3csi8WWk4ZYUC/1V8H3Ktip/J6ac8e +qhLCbmJ81Lo92JGHz/ot +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEXzCCA0egAwIBAgIBATANBgkqhkiG9w0BAQUFADCB0DELMAkGA1UEBhMCRVMx +SDBGBgNVBAoTP0laRU5QRSBTLkEuIC0gQ0lGIEEtMDEzMzcyNjAtUk1lcmMuVml0 +b3JpYS1HYXN0ZWl6IFQxMDU1IEY2MiBTODFCMEAGA1UEBxM5QXZkYSBkZWwgTWVk +aXRlcnJhbmVvIEV0b3JiaWRlYSAzIC0gMDEwMTAgVml0b3JpYS1HYXN0ZWl6MRMw +EQYDVQQDEwpJemVucGUuY29tMR4wHAYJKoZIhvcNAQkBFg9JbmZvQGl6ZW5wZS5j +b20wHhcNMDMwMTMwMjMwMDAwWhcNMTgwMTMwMjMwMDAwWjCB0DELMAkGA1UEBhMC +RVMxSDBGBgNVBAoTP0laRU5QRSBTLkEuIC0gQ0lGIEEtMDEzMzcyNjAtUk1lcmMu +Vml0b3JpYS1HYXN0ZWl6IFQxMDU1IEY2MiBTODFCMEAGA1UEBxM5QXZkYSBkZWwg +TWVkaXRlcnJhbmVvIEV0b3JiaWRlYSAzIC0gMDEwMTAgVml0b3JpYS1HYXN0ZWl6 +MRMwEQYDVQQDEwpJemVucGUuY29tMR4wHAYJKoZIhvcNAQkBFg9JbmZvQGl6ZW5w +ZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1btoCXXhp3xIW +D+Bxl8nUCxkyiazWfpt0e68t+Qt9+lZjKZSdEw2Omj4qvr+ovRmDXO3iWpWVOWDl +3JHJjAzFCe8ZEBNDH+QNYwZHmPBaMYFOYFdbAFVHWvys152C308hcFJ6xWWGmjvl +2eMiEl9P2nR2LWue368DCu+ak7j3gjAXaCOdP1a7Bfr+RW3X2SC5R4Xyp8iHlL5J +PHJD/WBkLrezwzQPdACw8m9EG7q9kUwlNpL32mROujS3ZkT6mQTzJieLiE3X04s0 +uIUqVkk5MhjcHFf7al0N5CzjtTcnXYJKN2Z9EDVskk4olAdGi46eSoZXbjUOP5gk +Ej6wVZAXAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBTqVk/sPIOhFIh4gbIrBSLAB0FbQjANBgkqhkiG9w0BAQUFAAOC +AQEAYp7mEzzhw6o5Hf5+T5kcI+t4BJyiIWy7vHlLs/G8dLYXO81aN/Mzg928eMTR +TxxYZL8dd9uwsJ50TVfX6L0R4Dyw6wikh3fHRrat9ufXi63j5K91Ysr7aXqnF38d +iAgHYkrwC3kuxHBb9C0KBz6h8Q45/KCyN7d37wWAq38yyhPDlaOvyoE6bdUuK5hT +m5EYA5JmPyrhQ1moDOyueWBAjxzMEMj+OAY1H90cLv6wszsqerxRrdTOHBdv7MjB +EIpvEEQkXUxVXAzFuuT6m2t91Lfnwfl/IvljHaVC7DlyyhRYHD6D4Rx+4QKp4tWL +vpw6LkI+gKNJ/YdMCsRZQzEEFA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD +EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 +OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l +dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK +gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX +iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc +Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E +BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G +SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu +b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh +bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv +Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln +aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 +IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph +biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo +ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP +UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj +YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA +bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 +sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa +n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS +NitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICZzCCAdCgAwIBAgIBBDANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJVUzEY +MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT +A1BLSTEcMBoGA1UEAxMTRG9EIENMQVNTIDMgUm9vdCBDQTAeFw0wMDA1MTkxMzEz +MDBaFw0yMDA1MTQxMzEzMDBaMGExCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMu +IEdvdmVybm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRwwGgYDVQQD +ExNEb0QgQ0xBU1MgMyBSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB +gQC1MP5kvurMbe2BLPd/6Rm6DmlqKOGpqcuVWB/x5pppU+CIP5HFUbljl6jmIYwT +XjY8qFf6+HAsTGrLvzCnTBbkMlz4ErBR+BZXjS+0TfouqJToKmHUVw1Hzm4sL36Y +Z8wACKu2lhY1woWR5VugCsdmUmLzYXWVF668KlYppeArUwIDAQABoy8wLTAdBgNV +HQ4EFgQUbJyl8FyPbUGNxBc7kFfCD6PNbf4wDAYDVR0TBAUwAwEB/zANBgkqhkiG +9w0BAQUFAAOBgQCvcUT5lyPMaGmMQwdBuoggsyIAQciYoFUczT9usZNcrfoYmrsc +c2/9JEKPh59Rz76Gn+nXikhPCNlplKw/5g8tlw8ok3ZPYt//oM1h+KaGDDE0INx/ +L6j7Ob6V7jhZAmLB3mwVT+DfnbvkeXMk/WNklfdKqJkfSGWVx3u/eDLneg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDNjCCAp+gAwIBAgIQNhIilsXjOKUgodJfTNcJVDANBgkqhkiG9w0BAQUFADCB +zjELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ +Q2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE +CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhh +d3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl +cnZlckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIxMDEwMTIzNTk1OVow +gc4xCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcT +CUNhcGUgVG93bjEdMBsGA1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNV +BAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRo +YXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1z +ZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 +aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560 +ZXUCTe/LCaIhUdib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j ++ao6hnO2RlNYyIkFvYMRuHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/ +BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQBlkKyID1bZ5jA01CbH0FDxkt5r1DmI +CSLGpmODA/eZd9iy5Ri4XWPz1HP7bJyZePFLeH0ZJMMrAoT4vCLZiiLXoPxx7JGH +IPG47LHlVYCsPVLIOQ7C8MAFT9aCdYy9X9LcdpoFEsmvcsPcJX6kTY4XpeCHf+Ga +WuFg3GQjPEIuTQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAx +MDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV3f5mCc8kPD6ugU5O +isRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4mmdxY +78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9 +zp9+1BlqFikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAd +BgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEA +Py1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdN +T1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgD +mMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV +BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 +c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx +MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg +R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD +VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR +JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T +fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu +jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z +wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ +fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD +VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G +CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 +7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn +8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs +ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ +2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH/zCCB2igAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT  MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE  ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE  ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm  SVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT  JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI -hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNzUwWhcNMjUxMjI3 -MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjMxMTEyMzU5WhcNMjUxMjI5 +MTEyMzU5WjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ  BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp  bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G  LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh  dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj  YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw -gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvN -G7uGBiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU -VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4Ninn -6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2YZM50yz8 -2l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz82l09BXW3mQKh +gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMFh+lWUEmnBK5F6da6IALvvPO6f +MWYw9LFAmwJsjcdKTVElPugUKLwgPLHxjO19kdmXIqPVzGOxq9krIwvdppffBYRU +Fro6y8xja40gpdaeBXFGdVj19mR7C2adPoeVPTy1OTdSVLsWF8W/rdiLMy/p+PrV +gTP/t56Fpu9MOeDjAgMBAAGjggRbMIIEVzAdBgNVHQ4EFgQU/J6FGtwGJXEh8C+L +ElXQxYDuBq4wggFGBgNVHSMEggE9MIIBOYAU/J6FGtwGJXEh8C+LElXQxYDuBq6h  ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ  BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp  bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G @@ -1060,21 +1878,456 @@ AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF  BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB  BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg  hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud -EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBD -QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG -SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC -AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j -cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2 -b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu -aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRtbD8wOwYJYIZIAYb4QgEI -BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMy5odG1s -MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz -MjAwMkNMQVNFQTMuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz -MjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF -BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca -2on0eisxeewBwMwB9dbB/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI -3y2s6Q73nMify5NF8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYS -AfWRMS1Jjbs/RU4s4OjNtckUFQzjB4ObJnXv +EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBDBglghkgBhvhCAQ0ENhY0Q0xBU0VBMyBD +QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cHM6Ly93d3cuaXBzLmVzLzAqBglg +hkgBhvhCAQIEHRYbaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDwGCWCGSAGG ++EIBBAQvFi1odHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VB +My5jcmwwQQYJYIZIAYb4QgEDBDQWMmh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMyMDAy +L3Jldm9jYXRpb25DTEFTRUEzLmh0bWw/MD4GCWCGSAGG+EIBBwQxFi9odHRwczov +L3d3dy5pcHMuZXMvaXBzMjAwMi9yZW5ld2FsQ0xBU0VBMy5odG1sPzA8BglghkgB +hvhCAQgELxYtaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VB +My5odG1sMHcGA1UdHwRwMG4wM6AxoC+GLWh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMy +MDAyL2lwczIwMDJDTEFTRUEzLmNybDA3oDWgM4YxaHR0cHM6Ly93d3diYWNrLmlw +cy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRUEzLmNybDAvBggrBgEFBQcBAQQjMCEw +HwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQAD +gYEAGG8JN0Ca0pQR0X/Lg33qtKfi2JPe2iRqdRswDoL3CTn+bRN20V/wbKDAwyxc +7eJOroysytPkEF4wZhipaKCjaWJROZGCeU1jM7mZe9pQPzeofT//VLi8zKaUA4lZ +BvYI44gntZQoaFxJna5NHHde+mbbPYlHb8c6g0mf9S3tODs= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDXTCCAkWgAwIBAgIDAOJCMA0GCSqGSIb3DQEBBQUAMFUxCzAJBgNVBAYTAkFU +MRAwDgYDVQQKEwdBLVRydXN0MRkwFwYDVQQLExBBLVRydXN0LW5RdWFsLTAxMRkw +FwYDVQQDExBBLVRydXN0LW5RdWFsLTAxMB4XDTA0MTEzMDIzMDAwMFoXDTE0MTEz +MDIzMDAwMFowVTELMAkGA1UEBhMCQVQxEDAOBgNVBAoTB0EtVHJ1c3QxGTAXBgNV +BAsTEEEtVHJ1c3QtblF1YWwtMDExGTAXBgNVBAMTEEEtVHJ1c3QtblF1YWwtMDEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD/9RyAEZ6eHmhYzNJ328f0 +jmdSUFi6EqRqOxb3jHNPTIpK82CR6z5lmSnZQNUuCPD+htbNZffd2DKVB06NOyZ1 +2zcOMCgj4GtkZoqE0zPpPT3bpoE55nkZZe/qWEX/64wz/L/4EdkvKDSKG/UsP75M +tmCVY5m2Eg73RVFRz4ccBIMpHel4lzEqSkdDtZOY5fnkrE333hx67nxq21vY8Eyf +8O4fPQ5RtN8eohQCcPQ1z6ypU1R7N9jPRpnI+yzMOiwd3+QcKhHi1miCzo0pkOaB +1CwmfsTyNl8qU0NJUL9Ta6cea7WThwTiWol2yD88cd2cy388xpbNkfrCPmZNGLoV +AgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECE5ZzscCMocwMA4G +A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEA69I9R1hU9Gbl9vV7W7AH +QpUJAlFAvv2It/eY8p2ouQUPVaSZikaKtAYrCD/arzfXB43Qet+dM6CpHsn8ikYR +vQKePjXv3Evf+C1bxwJAimcnZV6W+bNOTpdo8lXljxkmfN+Z5S+XzvK2ttUtP4Et +YOVaxHw2mPMNbvDeY+foJkiBn3KYjGabMaR8moZqof5ofj4iS/WyamTZti6v/fKx +n1vII+/uWkcxV5DT5+r9HLon0NYF0Vg317Wh+gWDV59VZo+dcwJDb+keYqMFYoqp +77SGkZGu41S8NGYkQY3X9rNHRkDbLfpKYDmy6NanpOE1EHW1/sNSFAs43qZZKJEQ +xg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDMDCCApmgAwIBAgIQDY4VEuGsu3eNOOMk34ww8jANBgkqhkiG9w0BAQUFADCB +yzELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ +Q2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3Rl +IFBlcnNvbmFsIEJhc2ljIENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNp +Y0B0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIxMDEwMTIzNTk1OVowgcsx +CzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNh +cGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0Nl +cnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQ +ZXJzb25hbCBCYXNpYyBDQTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNA +dGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+C +FeZIlDWmWr5vQvoPR+53dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeV +oQxN2jSQHReJl+A1OFdKwPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlW +Cy4cgNrx454p7xS9CkT7G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQUFAAOBgQCIO/64+XpCRhGgpKJkhc1IHJzVilHNL8F9sQfP +1wHeMj+W5IT+0V6tDH4OY0lqDhDkl9A/xacp2aZTHkseP1T6wIQ1c+qRqdxdk1cF +BgwHua8LRDmIIaDugnOpRi9pbCV0qc3fp9f9hTAElDVKpxszJCxEFu0KxN+AqmUa +v3Em8A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVu +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcxNjE2NDBaFw0yMDAy +MDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7Ny +Spj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0 +iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn +5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHd +BgNVHR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0 +MUAwPgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy +ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5l +dCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAy +MDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdF +fP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w +AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMS +hAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/ +GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKd +zmVml64mXg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg +bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ +j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV +Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw +MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 +fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i ++DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN +QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ +gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIESzCCAzOgAwIBAgIJAJigUTEEXRQpMA0GCSqGSIb3DQEBBQUAMHYxCzAJBgNV +BAYTAkRFMQ8wDQYDVQQIEwZIZXNzZW4xDjAMBgNVBAcTBUZ1bGRhMRAwDgYDVQQK +EwdEZWJjb25mMRMwEQYDVQQDEwpEZWJjb25mIENBMR8wHQYJKoZIhvcNAQkBFhBq +b2VyZ0BkZWJpYW4ub3JnMB4XDTA1MTEwNTE3NTUxNFoXDTE1MTEwMzE3NTUxNFow +djELMAkGA1UEBhMCREUxDzANBgNVBAgTBkhlc3NlbjEOMAwGA1UEBxMFRnVsZGEx +EDAOBgNVBAoTB0RlYmNvbmYxEzARBgNVBAMTCkRlYmNvbmYgQ0ExHzAdBgkqhkiG +9w0BCQEWEGpvZXJnQGRlYmlhbi5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvbOo0SrIwI5IMlsshH8WF3dHB9r9JlSKhMPaybawa1EyvZspMQ3wa +F5qxNf3Sj+NElEmjseEqvCZiIIzqwerHu0Qw62cDYCdCd2+Wb5m0bPYB5CGHiyU1 +eNP0je42O0YeXG2BvUujN8AviocVo39X2YwNQ0ryy4OaqYgm2pRlbtT2ESbF+SfV +Y2iqQj/f8ymF+lHo/pz8tbAqxWcqaSiHFAVQJrdqtFhtoodoNiE3q76zJoUkZTXB +k60Yc3MJSnatZCpnsSBr/D7zpntl0THrUjjtdRWCjQVhqfhM1yZJV+ApbLdheFh0 +ZWlSxdnp25p0q0XYw/7G92ELyFDfBUUNAgMBAAGjgdswgdgwHQYDVR0OBBYEFMuV +dFNb4mCWUFbcP5LOtxFLrEVTMIGoBgNVHSMEgaAwgZ2AFMuVdFNb4mCWUFbcP5LO +txFLrEVToXqkeDB2MQswCQYDVQQGEwJERTEPMA0GA1UECBMGSGVzc2VuMQ4wDAYD +VQQHEwVGdWxkYTEQMA4GA1UEChMHRGViY29uZjETMBEGA1UEAxMKRGViY29uZiBD +QTEfMB0GCSqGSIb3DQEJARYQam9lcmdAZGViaWFuLm9yZ4IJAJigUTEEXRQpMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAGZXxHg4mnkvilRIM1EQfGdY +S5b/WcyF2MYSTeTvK4aIB6VHwpZoZCnDGj2m2D3CkHT0upAD9o0zM1tdsfncLzV+ +mDT/jNmBtYo4QXx5vEPwvEIcgrWjwk7SyaEUhZjtolTkHB7ACl0oD0r71St4iEPR +qTUCEXk2E47bg1Fz58wNt/yo2+4iqiRjg1XCH4evkQuhpW+dTZnDyFNqwSYZapOE +TBA+9zBb6xD1KM2DdY7r4GiyYItN0BKLfuWbh9LXGbl1C+f4P11g+m2MPiavIeCe +1iazG5pcS3KoTLACsYlEX24TINtg4kcuS81XdllcnsV3Kdts0nIqPj6uhTTZD0k= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05 +NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD +VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp +bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N +H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR +4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN +BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo +EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5 +FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx +lA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID2TCCAsGgAwIBAgIDAjbQMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMTAwMjE5MjIzOTI2WhcNMjAwMjE4MjIzOTI2WjBAMQswCQYDVQQG +EwJVUzEXMBUGA1UEChMOR2VvVHJ1c3QsIEluYy4xGDAWBgNVBAMTD0dlb1RydXN0 +IFNTTCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJCzgMHk5Uat +cGA9uuUU3Z6KXot1WubKbUGlI+g5hSZ6p1V3mkihkn46HhrxJ6ujTDnMyz1Hr4Gu +FmpcN+9FQf37mpc8oEOdxt8XIdGKolbCA0mEEoE+yQpUYGa5jFTk+eb5lPHgX3UR +8im55IaisYmtph6DKWOy8FQchQt65+EuDa+kvc3nsVrXjAVaDktzKIt1XTTYdwvh +dGLicTBi2LyKBeUxY0pUiWozeKdOVSQdl+8a5BLGDzAYtDRN4dgjOyFbLTAZJQ50 +96QhS6CkIMlszZhWwPKoXz4mdaAN+DaIiixafWcwqQ/RmXAueOFRJq9VeiS+jDkN +d53eAsMMvR8CAwEAAaOB2TCB1jAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFEJ5 +VBthzVUrPmPVPEhX9Z/7Rc5KMB8GA1UdIwQYMBaAFMB6mGiNifurBWQMEX2qfWW4 +ysxOMBIGA1UdEwEB/wQIMAYBAf8CAQAwOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDov +L2NybC5nZW90cnVzdC5jb20vY3Jscy9ndGdsb2JhbC5jcmwwNAYIKwYBBQUHAQEE +KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5nZW90cnVzdC5jb20wDQYJKoZI +hvcNAQEFBQADggEBANTvU4ToGr2hiwTAqfVfoRB4RV2yV2pOJMtlTjGXkZrUJPji +J2ZwMZzBYlQG55cdOprApClICq8kx6jEmlTBfEx4TCtoLF0XplR4TEbigMMfOHES +0tdT41SFULgCy+5jOvhWiU1Vuy7AyBh3hjELC3DwfjWDpCoTZFZnNF0WX3OsewYk +2k9QbSqr0E1TQcKOu3EDSSmGGM8hQkx0YlEVxW+o78Qn5Rsz3VqI138S0adhJR/V +4NwdzxoQ2KDLX4z6DOW/cf/lXUQdpj6HR/oaToODEj+IZpWYeZqF6wJHzSXj8gYE +TpnKXKBuervdo5AaRTPvvz7SBMS24CqFZUE+ENQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdjCCAl6gAwIBAgIEOhsEBTANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJE +SzEMMAoGA1UEChMDS01EMQ8wDQYDVQQLEwZLTUQtQ0ExIzAhBgNVBAMTGktNRC1D +QSBLdmFsaWZpY2VyZXQgUGVyc29uMB4XDTAwMTEyMTIzMjQ1OVoXDTE1MTEyMjIz +MjQ1OVowUTELMAkGA1UEBhMCREsxDDAKBgNVBAoTA0tNRDEPMA0GA1UECxMGS01E +LUNBMSMwIQYDVQQDExpLTUQtQ0EgS3ZhbGlmaWNlcmV0IFBlcnNvbjCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBANriF4Xd6yD7ZlBE317UBDObn+vRMVc6 +p3wNQODdEDJe2z1ncCz9NJvhoLGdOJhyg7VVPh0P2c+KZ9WI9mWOKZI2bp2WkLju +jCcxbhTrurY3Wfc6gwLBqqFV8wWgaZKmvVWizjw9Kyi25f3yX4fOho6Qq2lvVbub +tvVFXAd51GJ+/2Yed+a4Or2bz2RcqHS81B3pywsD4mgJR5xREv5jqPfwNP+V7bkc +X+pfO4kVhZ/V+8MSPdQHgcV/iB3wP2mwgWyIBNc1reBidGTiz8unnWu55hcNfsvt +LJbTs9OHhsR7naRuy+S402nDnD5vnONOFEsiHn46w+T0rtu7h6j4OvkCAwEAAaNW +MFQwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUeWLqmhI42Jxj7DifDsW+ +DlQhKD0wHwYDVR0jBBgwFoAUeWLqmhI42Jxj7DifDsW+DlQhKD0wDQYJKoZIhvcN +AQEFBQADggEBANML/P42OuJ9aUV/0fItuIyc1JhqWvSqn5bXj+9eyEegcp8bHLHY +42D1O+z0lNipdjYPSdMJ0wZOEUhr+150SdDQ1P/zQL8AUaLEBkRt7ZdzXPVH3PER +qnf9IrpYBknZKfCAoVchA6Rr9WU3Sd8bMoRfMLKg8c0M8G6EPwCTcOFriSkbtvNG +zd8r8I+WfUYIN/p8DI9JT9qfjVODnYPRMUm6KPvq27TsrGruKrqyaV94kWc8co8A +v3zFLeCtghvUiRBdx+8Q7m5t4CkuSr0WINrqjIPFW2QrM1r82y09Fd16RkqL4LOg +Lh6vB5KnTApv62rWdw7zWwYnjY6/vXYY1Aw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 +IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB +IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA +Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS +BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v +cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9 +4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB +Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J +0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ +FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx +bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q +SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb +6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV +m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g +eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG +kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7 +6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG +CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc +aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB +gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w +aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6 +tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0 +nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M +77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV +Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L +ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM +zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU +rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF +YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT +oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu +FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB +0m6lG5kngOcLqagA +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF8DCCA9igAwIBAgIPBuhGJy8fCo/RhFzjafbVMA0GCSqGSIb3DQEBBQUAMDgx +CzAJBgNVBAYTAkVTMRQwEgYDVQQKDAtJWkVOUEUgUy5BLjETMBEGA1UEAwwKSXpl +bnBlLmNvbTAeFw0wNzEyMTMxMzA4MjdaFw0zNzEyMTMwODI3MjVaMDgxCzAJBgNV +BAYTAkVTMRQwEgYDVQQKDAtJWkVOUEUgUy5BLjETMBEGA1UEAwwKSXplbnBlLmNv +bTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMnTesoPHqynhugWZWqx +whtFMnGV2f4QW8yv56V5AY+Jw8ryVXH3d753lPNypCxE2J6SmxQ6oeckkAoKVo7F +2CaU4dlI4S0+2gpy3aOZFdqBoof0e24md4lYrdbrDLJBenNubdt6eEHpCIgSfocu +ZhFjbFT7PJ1ywLwu/8K33Q124zrX97RovqL144FuwUZvXY3gTcZUVYkaMzEKsVe5 +o4qYw+w7NMWVQWl+dcI8IMVhulFHoCCQk6GQS/NOfIVFVJrRBSZBsLVNHTO+xAPI +JXzBcNs79AktVCdIrC/hxKw+yMuSTFM5NyPs0wH54AlETU1kwOENWocivK0bo/4m +tRXzp/yEGensoYi0RGmEg/OJ0XQGqcwL1sLeJ4VQJsoXuMl6h1YsGgEebL4TrRCs +tST1OJGh1kva8bvS3ke18byB9llrzxlT6Y0Vy0rLqW9E5RtBz+GGp8rQap+8TI0G +M1qiheWQNaBiXBZO8OOi+gMatCxxs1gs3nsL2xoP694hHwZ3BgOwye+Z/MC5TwuG +KP7Suerj2qXDR2kS4Nvw9hmL7Xtw1wLW7YcYKCwEJEx35EiKGsY7mtQPyvp10gFA +Wo15v4vPS8+qFsGV5K1Mij4XkdSxYuWC5YAEpAN+jb/af6IPl08M0w3719Hlcn4c +yHf/W5oPt64FRuXxqBbsR6QXAgMBAAGjgfYwgfMwgbAGA1UdEQSBqDCBpYEPaW5m +b0BpemVucGUuY29tpIGRMIGOMUcwRQYDVQQKDD5JWkVOUEUgUy5BLiAtIENJRiBB +MDEzMzcyNjAtUk1lcmMuVml0b3JpYS1HYXN0ZWl6IFQxMDU1IEY2MiBTODFDMEEG +A1UECQw6QXZkYSBkZWwgTWVkaXRlcnJhbmVvIEV0b3JiaWRlYSAxNCAtIDAxMDEw +IFZpdG9yaWEtR2FzdGVpejAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUHRxlDqjyJXu0kc/ksbHmvVV0bAUwDQYJKoZIhvcNAQEFBQAD +ggIBAMeBRm8hGE+gBe/n1bqXUKJg7aWSFBpSm/nxiEqg3Hh10dUflU7F57dp5iL0 ++CmoKom+z892j+Mxc50m0xwbRxYpB2iEitL7sRskPtKYGCwkjq/2e+pEFhsqxPqg +l+nqbFik73WrAGLRne0TNtsiC7bw0fRue0aHwp28vb5CO7dz0JoqPLRbEhYArxk5 +ja2DUBzIgU+9Ag89njWW7u/kwgN8KRwCfr00J16vU9adF79XbOnQgxCvv11N75B7 +XSus7Op9ACYXzAJcY9cZGKfsK8eKPlgOiofmg59OsjQerFQJTx0CCzl+gQgVuaBp +E8gyK+OtbBPWg50jLbJtooiGfqgNASYJQNntKE6MkyQP2/EeTXp6WuKlWPHcj1+Z +ggwuz7LdmMySlD/5CbOlliVbN/UShUHiGUzGigjB3Bh6Dx4/glmimj4/+eAJn/3B +kUtdyXvWton83x18hqrNA/ILUpLxYm9/h+qrdslsUMIZgq+qHfUgKGgu1fxkN0/P +pUTEvnK0jHS0bKf68r10OEMr3q/53NjgnZ/cPcqlY0S/kqJPTIAcuxrDmkoEVU3K +7iYLHL8CxWTTnn7S05EcS6L1HOUXHA0MUqORH5zwIe0ClG+poEnK6EOMxPQ02nwi +o8ZmPrgbBYhdurz3vOXcFD2nhqi2WVIhA16L4wTtSyoeo09Q +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICsDCCAhmgAwIBAgIQZ8jh6OO+HL38kTuOpiOHSTANBgkqhkiG9w0BAQUFADCB +izELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxML +RHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENl +cnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcN +OTcwMTAxMDAwMDAwWhcNMjEwMTAxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTAT +BgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNV +BAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNV +BAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0A +MIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u +6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522 +FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzAR +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAS+mqF4EF+3kKMZ/F +QfRWVKvpwuWXjhj+kckMPiZkyaFMJ2SnvQGTVXFuF0853BvcSTUQOSP/ypvIz2Y/ +3Ewa1IEGQlIf4SaxFhe65nByMUToTo1b5NP50OOPJWQx5yr4GIg2GlLFDUE1G2m3 +JvUXzMEZXkt8XOKDgJH6L/uatxY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDtDCCApygAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJKUDEc +MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEOMAwGA1UECxMFTVBIUFQxJjAk +BgNVBAsTHU1QSFBUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTAyMDMxNDA3 +NTAyNloXDTEyMDMxMzE0NTk1OVowYzELMAkGA1UEBhMCSlAxHDAaBgNVBAoTE0ph +cGFuZXNlIEdvdmVybm1lbnQxDjAMBgNVBAsTBU1QSFBUMSYwJAYDVQQLEx1NUEhQ +VCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAI3GUWlK9G9FVm8DhpKu5t37oxZbj6lZcFvEZY07YrYojWO657ub +z56WE7q/PI/6Sm7i7qYE+Vp80r6thJvfmn7SS3BENrRqiapSenhooYD12jIe3iZQ +2SXqx7WgYwyBGdQwGaYTijzbRFpgc0K8o4a99fIoHhz9J8AKqXasddMCqfJRaH30 +YJ7HnOvRYGL6HBrGhJ7X4Rzijyk9a9+3VOBsYcnIlx9iODoiYhA6r0ojuIu8/JA1 +oTTZrS0MyU/SLdFdJze2O1wnqTULXQybzJz3ad6oC/F5a69c0m92akYd9nGBrPxj +EhucaQynC/QoCLs3aciLgioAnEJqy7i3EgUCAwEAAaNzMHEwHwYDVR0jBBgwFoAU +YML3pLoA0h93Yngl8Gb/UgAh73owHQYDVR0OBBYEFGDC96S6ANIfd2J4JfBm/1IA +Ie96MAwGA1UdEwQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQE +AwIABTANBgkqhkiG9w0BAQUFAAOCAQEANPR8DN66iWZBs/lSm1vOzhqRkXDLT6xL +LvJtjPLqmE469szGyFSKzsof6y+/8YgZlOoeX1inF4ox/SH1ATnwdIIsPbXuRLjt +axboXvBh5y2ffC3hmzJVvJ87tb6mVWQeL9VFUhNhAI0ib+9OIZVEYI/64MFkDk4e +iWG5ts6oqIJH1V7dVZg6pQ1Tc0Ckhn6N1m1hD30S0/zoPn/20Wq6OCF3he8VJrRG +dcW9BD/Bkesko1HKhMBDjHVrJ8cFwbnDSoo+Ki47eJWaz/cOzaSsaMVUsR5POava +/abhhgHn/eOJdXiVslyK0DYscjsdB3aBUfwZlomxYOzG6CgjQPhJdw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD +QSBLbGFzYSAyMB4XDTAzMTAxNDExNTgyMloXDTE3MDQxODEyNTMwN1owdzELMAkG +A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV +BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEhMB8GA1UEAxMYQ0MgU2ln +bmV0IC0gT0NTUCBLbGFzYSAyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCo +VCsaBStblXQYVNthe3dvaCrfvKpPXngh4almm988iIlEv9CVTaAdCfaJNihvA+Vs +Qw8++ix1VqteMQE474/MV/YaXigP0Zr0QB+g+/7PWVlv+5U9Gzp9+Xx4DJay8AoI +iB7Iy5Qf9iZiHm5BiPRIuUXT4ZRbZRYPh0/76vgRsQIDAQABo4IBkjCCAY4wDgYD +VR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEEGA1UdHwQ6MDgwNqA0 +oDKGMGh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9jcmwva2xhc2Ey +LmNybDCB2AYDVR0gBIHQMIHNMIHKBg4rBgEEAb4/AoFICgwBADCBtzBsBggrBgEF +BQcCAjBgGl5DZXJ0eWZpa2F0IHd5ZGFueSB6Z29kbmllIHogZG9rdW1lbnRlbSAi +UG9saXR5a2EgQ2VydHlmaWthY2ppIC0gQ2VydHlmaWthdHkgcmVzcG9uZGVyb3cg +T0NTUCIuMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0 +b3JpdW0vZG9rdW1lbnR5L3BjX29jc3BfMV8wLnBkZjAfBgNVHSMEGDAWgBS7RQZS +C8uBzSlUs7x8QUzNBw6MJTAdBgNVHQ4EFgQUKEVrOY7cEHvsVgvoyZdytlbtgwEw +CQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOCAQEAQrRg5MV6dxr0HU2IsLInxhvt +iUVmSFkIUsBCjzLoewOXA16d2oDyHhI/eE+VgAsp+2ANjZu4xRteHIHoYMsN218M +eD2MLRsYS0U9xxAFK9gDj/KscPbrrdoqLvtPSMhUb4adJS9HLhvUe6BicvBf3A71 +iCNe431axGNDWKnpuj2KUpj4CFHYsWCXky847YtTXDjri9NIwJJauazsrSjK+oXp +ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv +hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE-----  MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVT @@ -1123,112 +2376,169 @@ hvcNAQEFBQADgYEAZbrBzAAalZHK6Ww6vzoeFAh8+4Pua2JR0zORtWB5fgTYXXk3  3pGW7hdbrqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== +MIIFujCCBKKgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhjELMAkGA1UEBhMCVVMx +HTAbBgNVBAoTFEFwcGxlIENvbXB1dGVyLCBJbmMuMS0wKwYDVQQLEyRBcHBsZSBD +b21wdXRlciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAnBgNVBAMTIEFwcGxlIFJv +b3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA1MDIxMDAwMTgxNFoXDTI1MDIx +MDAwMTgxNFowgYYxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBcHBsZSBDb21wdXRl +ciwgSW5jLjEtMCsGA1UECxMkQXBwbGUgQ29tcHV0ZXIgQ2VydGlmaWNhdGUgQXV0 +aG9yaXR5MSkwJwYDVQQDEyBBcHBsZSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOSRqQkfkdseR1DrBe1e +eYQt6zaiV0xV7IsZid75S2z1B6siMALoGD74UAnTf0GomPnRymacJGsR0KO75Bsq +wx+VnnoMpEeLW9QWNzPLxA9NzhRp0ckZcvVdDtV/X5vyJQO6VY9NXQ3xZDUjFUsV +WR2zlPf2nJ7PULrBWFBnjwi0IPfLrCwgb3C2PwEwjLdDzw+dPfMrSSgayP7OtbkO +2V4c1ss9tTqt9A8OAJILsSEWLnTVPA3bYharo3GSR1NVwa8vQbP4++NwzeajTEV+ +H0xrUJZBicR0YgsQg0GHM4qBsTBY7FoEMoxos48d3mVz/2deZbxJ2HafMxRloXeU +yS0CAwEAAaOCAi8wggIrMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBQr0GlHlHYJ/vRrjS5ApvdHTX8IXjAfBgNVHSMEGDAWgBQr0GlH +lHYJ/vRrjS5ApvdHTX8IXjCCASkGA1UdIASCASAwggEcMIIBGAYJKoZIhvdjZAUB +MIIBCTBBBggrBgEFBQcCARY1aHR0cHM6Ly93d3cuYXBwbGUuY29tL2NlcnRpZmlj +YXRlYXV0aG9yaXR5L3Rlcm1zLmh0bWwwgcMGCCsGAQUFBwICMIG2GoGzUmVsaWFu +Y2Ugb24gdGhpcyBjZXJ0aWZpY2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBhY2Nl +cHRhbmNlIG9mIHRoZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5k +IGNvbmRpdGlvbnMgb2YgdXNlLCBjZXJ0aWZpY2F0ZSBwb2xpY3kgYW5kIGNlcnRp +ZmljYXRpb24gcHJhY3RpY2Ugc3RhdGVtZW50cy4wRAYDVR0fBD0wOzA5oDegNYYz +aHR0cHM6Ly93d3cuYXBwbGUuY29tL2NlcnRpZmljYXRlYXV0aG9yaXR5L3Jvb3Qu +Y3JsMFUGCCsGAQUFBwEBBEkwRzBFBggrBgEFBQcwAoY5aHR0cHM6Ly93d3cuYXBw +bGUuY29tL2NlcnRpZmljYXRlYXV0aG9yaXR5L2Nhc2lnbmVycy5odG1sMA0GCSqG +SIb3DQEBBQUAA4IBAQCd2i0oWC99dgS5BNM+zrdmY06PL9T+S61yvaM5xlJNBZhS +9YlRASR5vhoy9+VEi0tEBzmC1lrKtCBe2a4VXR2MHTK/ODFiSF3H4ZCx+CRA+F9Y +m1FdV53B5f88zHIhbsTp6aF31ywXJsM/65roCwO66bNKcuszCVut5mIxauivL9Wv +Hld2j383LS4CXN1jyfJxuCZA3xWNdUQ/eb3mHZnhQyw+rW++uaT+DjUZUWOxw961 +kj5ReAFziqQjyqSI8R5cH0EWLX6VCqrpiUGYGxrdyyC/R14MJsVVNU3GMIuZZxTH +CR+6R8faAQmHJEKVvRNgGQrv6n8Obs3BREM6StXj +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV +BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1 +c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAeFw0wOTA5MDkwODE1MjdaFw0yOTEy +MzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNUQyBUcnVzdENlbnRl +ciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0ExKDAm +BgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF +5+cvAqBNLaT6hdqbJYUtQCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYv +DIRlzg9uwliT6CwLOunBjvvya8o84pxOjuT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8v +zArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+EutCHnNaYlAJ/Uqwa1D7KRT +yGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1M4BDj5yj +dipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBh +MB8GA1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI +4jANBgkqhkiG9w0BAQUFAAOCAQEAg8ev6n9NCjw5sWi+e22JLumzCecYV42Fmhfz +dkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+KGwWaODIl0YgoGhnYIg5IFHY +aAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhKBgePxLcHsU0G +DeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV +CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPH +LQNjO9Po5KIqwoIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy -NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD -cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs -2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY -JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE -Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ -n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +MIIDvjCCA3ygAwIBAgIFJQaThoEwCwYHKoZIzjgEAwUAMIGFMQswCQYDVQQGEwJG +UjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYDVQQHEwVQYXJpczEQMA4GA1UEChMHUE0v +U0dETjEOMAwGA1UECxMFRENTU0kxDjAMBgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcN +AQkBFhRpZ2NhQHNnZG4ucG0uZ291di5mcjAeFw0wMjEyMTMxNDM5MTVaFw0yMDEw +MTcxNDM5MTRaMIGFMQswCQYDVQQGEwJGUjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYD +VQQHEwVQYXJpczEQMA4GA1UEChMHUE0vU0dETjEOMAwGA1UECxMFRENTU0kxDjAM +BgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcNAQkBFhRpZ2NhQHNnZG4ucG0uZ291di5m +cjCCAbYwggErBgcqhkjOOAQBMIIBHgKBgQCFkMImdk9zDzJfTO4XPdAAmLbAdWws +ZiEMZh19RyTo3CyhFqO77OIXrwY6vc1pcc3MgWJ0dgQpAgrDMtmFFxpUu4gmjVsx +8GpxQC+4VOgLY8Cvmcd/UDzYg07EIRto8BwCpPJ/JfUxwzV2V3N713aAX+cEoKZ/ +s+kgxC6nZCA7oQIVALME/JYjkdW2uKIGngsEPbXAjdhDAoGADh/uqWJx94UBm31c +9d8ZTBfRGRnmSSRVFDgPWgA69JD4BR5da8tKz+1HjfMhDXljbMH86ixpD5Ka1Z0V +pRYUPbyAoB37tsmXMJY7kjyD19d5VdaZboUjVvhH6UJy5lpNNNGSvFl4fqkxyvw+ +pq1QV0N5RcvK120hlXdfHUX+YKYDgYQAAoGAQGr7IuKJcYIvJRMjxwl43KxXY2xC +aoCiM/bv117MfI94aNf1UusGhp7CbYAY9CXuL60P0oPMAajbaTE5Z34AuITeHq3Y +CNMHwxalip8BHqSSGmGiQsXeK7T+r1rPXsccZ1c5ikGDZ4xn5gUaCyy2rCmb+fOJ +6VAfCbAbAjmNKwejdzB1MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgFGMBUG +A1UdIAQOMAwwCgYIKoF6AXkBAQEwHQYDVR0OBBYEFPkeNRcUf8idzpKblYbLNxs0 +MQhSMB8GA1UdIwQYMBaAFPkeNRcUf8idzpKblYbLNxs0MQhSMAsGByqGSM44BAMF +AAMvADAsAhRVh+CJA5eVyEYU5AO9Tm7GxX0rmQIUBCqsU5u1WxoZ5lEXicDX5/Ob +sRQ=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6 -MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp -dHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAX -BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAx -MDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV3f5mCc8kPD6ugU5O -isRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4mmdxY -78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9 -zp9+1BlqFikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAd -BgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEA -Py1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdN -T1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgD -mMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 -MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp -dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX -BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy -MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp -eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg -/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl -wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh -AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 -PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu -AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR -MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc -HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ -Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ -f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO -rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch -6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 -7CAFYd4= +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE-----  MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP @@ -1250,70 +2560,323 @@ kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w  zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx +HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh +IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz +NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg +SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M +IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ +7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb +m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY +xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ +YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq +JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx +I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz +kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh +EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S +Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM +gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu +rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO +1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu +h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP +yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q +7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT +RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ +ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB +M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ +my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO +AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT +9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H +hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5 +fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO -TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy -MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk -ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn -ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 -9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO -hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U -tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o -BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh -SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww -OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv -cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA -7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k -/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm -eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 -u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy -7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR -iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj +dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 +NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD +VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G +vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ +BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl +IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw +NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq +y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy +0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 +E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE -SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg -Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV -BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl -cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA -vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu -Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a -0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 -4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN -eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD -R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG -A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu -dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME -Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 -WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw -HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ -KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO -Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX -wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 -9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 -jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 -aQNiuJkFBT1reBK9sG9l +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF3zCCA8egAwIBAgIOGTMAAQACKBqaBLzyVUUwDQYJKoZIhvcNAQEFBQAwejEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV +BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEnMCUGA1UEAxMeVEMgVHJ1 +c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJMB4XDTA2MDMyMjE1NTgzNFoXDTMwMTIz +MTIyNTk1OVowejELMAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVy +IEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEnMCUG +A1UEAxMeVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJMIICIjANBgkqhkiG +9w0BAQEFAAOCAg8AMIICCgKCAgEAi9R3azRs5TbYalxeOO781R15Azt7g2JEgk6I +7d6D/+7MUGIFBZWZdpj2ufJf2AaRksL2LWYXH/1TA+iojWOpbuHWG4y8mLOLO9Tk +Lsp9hUkmW3m4GotAnn+7yT9jLM/RWny6KCJBElpN+Rd3/IX9wkngKhh/6aAsnPlE +/AxoOUL1JwW+jhV6YJ3wO8c85j4WvK923mq3ouGrRkXrjGV90ZfzlxElq1nroCLZ +gt2Y7X7i+qBhCkoy3iwX921E6oFHWZdXNwM53V6CItQzuPomCba8OYgvURVOm8M7 +3xOCiN1LNPIz1pDp81PcNXzAw9l8eLPNcD+NauCjgUjkKa1juPD8KGQ7mbN9/pqd +iPaZIgiRRxaJNXhdd6HPv0nh/SSUK2k2e+gc5iqQilvVOzRZQtxtz7sPQRxVzfUN +Wy4WIibvYR6X/OJTyM9bo8ep8boOhhLLE8oVx+zkNo3aXBM9ZdIOXXB03L+PemrB +Lg/Txl4PK1lszGFs/sBhTtnmT0ayWuIZFHCE+CAA7QGnl37DvRJckiMXoKUdRRcV +I5qSCLUiiI3cKyTr4LEXaNOvYb3ZhXj2jbp4yjeNY77nrB/fpUcJucglMVRGURFV +DYlcjdrSGC1z8rjVJ/VIIjfRYvd7Dcg4i6FKsPzQ8eu3hmPn4A5zf/1yUbXpfeJV +BWR4Z38CAwEAAaNjMGEwHwYDVR0jBBgwFoAUzdeQoW6jv9sw1toyJZAM5jkegGUw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFM3XkKFu +o7/bMNbaMiWQDOY5HoBlMA0GCSqGSIb3DQEBBQUAA4ICAQB+FojoEw42zG4qhQc4 +xlaJeuNHIWZMUAgxWlHQ/KZeFHXeTDvs8e3MfhEHSmHu6rOOOqQzxu2KQmZP8Tx7 +yaUFQZmx7Cxb7tyW0ohTS3g0uW7muw/FeqZ8Dhjfbw90TNGp8aHp2FRkzF6WeKJW +GsFzshXGVwXf2vdIJIqOf2qp+U3pPmrOYCx9LZAI9mOPFdAtnIz/8f38DBZQVhT7 +upeG7rRJA1TuG1l/MDoCgoYhrv7wFfLfToPmmcW6NfcgkIw47XXP4S73BDD7Ua2O +giRAyn0pXdXZ92Vk/KqfdLh9kl3ShCngE+qK99CrxK7vFcXCifJ7tjtJmGHzTnKR +N4xJkunI7Cqg90lufA0kxmts8jgvynAF5X/fxisrgIDV2m/LQLvYG/AkyRDIRAJ+ +LtOYqqIN8SvQ2vqOHP9U6OFKbt2o1ni1N6WsZNUUI8cOpevhCTjXwHxgpV2Yj4wC +1dxWqPNNWKkL1HxkdAEy8t8PSoqpAqKiHYR3wvHMl700GXRd4nQ+dSf3r7/ufA5t +VIimVuImrTESPB5BeW0X6hNeH/Vcn0lZo7Ivo0LD+qh+v6WfSMlgYmIK371F3uNC +tVGW/cT1Gpm4UqJEzS1hjBWPgdVdotSQPYxuQGHDWV3Y2eH2dEcieXR92sqjbzcV +NvAsGnE8EXbfXRo+VGN4a2V+Hw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHqTCCBZGgAwIBAgIQYwaGp8U3ZaVDkKhqWMzUMjANBgkqhkiG9w0BAQUFADCB +jzELMAkGA1UEBhMCTFYxNTAzBgNVBAoTLFZBUyBMYXR2aWphcyBQYXN0cyAtIFZp +ZW4ucmVnLk5yLjQwMDAzMDUyNzkwMSMwIQYDVQQLExpTZXJ0aWZpa2FjaWphcyBw +YWthbHBvanVtaTEkMCIGA1UEAxMbVkFTIExhdHZpamFzIFBhc3RzIFNTSShSQ0Ep +MB4XDTA2MDkxMzA5MjIxMFoXDTI0MDkxMzA5Mjc1N1owgY8xCzAJBgNVBAYTAkxW +MTUwMwYDVQQKEyxWQVMgTGF0dmlqYXMgUGFzdHMgLSBWaWVuLnJlZy5Oci40MDAw +MzA1Mjc5MDEjMCEGA1UECxMaU2VydGlmaWthY2lqYXMgcGFrYWxwb2p1bWkxJDAi +BgNVBAMTG1ZBUyBMYXR2aWphcyBQYXN0cyBTU0koUkNBKTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAJu4+f1hVS9PpKUUtS6OuSSPrPuxVD9A/0/F5YZo +e1OT+zWCNahQLpRSoNuDPnXaFXCsCc/ugkmtNkm5tHGLtAChQgbKCApjl7YI/O60 +3Jh4GYLJ+H9kPqrJ/rGN67Bk9bzzxD46kOpOjj8bGbxqg8ORPGxV+wpSwOjhXXeF +M8VJ3+xqv79sN/6OSaIVGM6LjmseOKMwb4iBfnJWRBrEejkP9sSPltSy6wBOXN67 +5zu35iQFk2tN5pFEv+6YG8eFGxFBeyI2p74+6Ho33BjekJ2PzbLXmj/iF39bDOHv +P2Y9biTksM7DDIhslNo4JXxSOeNzFLMARWOaDEJAXgTG93JkzsluM7Pk020klTeT +fvIAXRmLH/NDc6ifRdIGqey0Qrv67gzHTz9RH9Gv0KwYf4eBIv6p3QeWbXz4TtlN +OlBp1UF+xdp02I5z5X6D4cMZgbe9v0COvi6aogyqTgIuuyrhCF0xA8msJ7Cv3NXI +FH1AnVWJIfmQzNTJYEFzq+jN2DpVOQqCmf6b9fU8HJHLwPpGVK4h/CqsXHveepdx +/WxrzUiapNuBfBg3L5B9YZS9F8lctlQWd8oJSqrpvE+UdQFaVryS0o+515feVnQB +9xZxSbH1GEaZQe5i4bMsZXVpKXJDA/ibH/o49J7sQBCOrJfVsDO+nxjcLfdBeFRK +YkTnAgMBAAGjggH9MIIB+TAOBgNVHQ8BAf8EBAMCAQYwGAYIKwYBBQUHAQMEDDAK +MAgGBgQAjkYBATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTMw/Vm/3OsOFqW +GyGJuIFMH8teJTAQBgkrBgEEAYI3FQEEAwIBADCCAYkGA1UdIASCAYAwggF8MIIB +eAYLKwYBBAGBxFkBAQIwggFnMIIBOAYIKwYBBQUHAgIwggEqHoIBJgBTAGkAcwAg +AGkAcgAgAHMAZQByAHQAaQBmAGkAawBhAHQAcwAsACAAawBvACAAaQB6AGQAZQB2 +AGkAcwAgAFYAQQBTACAATABhAHQAdgBpAGoAYQBzACAAUABhAHMAdABzACwAIABu +AG8AZAByAG8AcwBpAG4AbwB0ACAAYQB0AGIAaQBsAHMAdABpAGIAdQAgAEUAbABl +AGsAdAByAG8AbgBpAHMAawBvACAAZABvAGsAdQBtAGUAbgB0AHUAIABsAGkAawB1 +AG0AYQBtACAAdQBuACAARQBpAHIAbwBwAGEAcwAgAFAAYQByAGwAYQBtAGUAbgB0 +AGEAIABkAGkAcgBlAGsAdABpAHYAYQBpACAAMQA5ADkAOQAvADkAMwAvAEUASzAp +BggrBgEFBQcCARYdaHR0cDovL3d3dy5lLW1lLmx2L3JlcG9zaXRvcnkwDQYJKoZI +hvcNAQEFBQADggIBAB8oSjWQIWNoCi94r6MegiaXoz8nGdJLo0J6BhNlW8EEy+t9 +fO+U8vGJ9bffUgIhadLqljTloM+XuJxVDhCFoxReLAX4tTp28/l6uN62DCdp8suU +kQsdudWOb5kvzfIZVjk6SFbwAf+Cdbay/dHU9fJjV0xNoX7MELoEae/0FPyzlx9F +7m9KKH/Rxie8x6Opa3vtghNvq94P+3HrXBEaqSzQMJ/8NjdW75XpurcTtq6fAmGt +nuxrBG82nw+Z98LJyEwouSjUIdeeVNXAzvSO5FWUe48kxjj8q3qkVnc9qEXvZJKk +0Ep+u3OL9A1Sc7g6SF5DgNOpcHdi/8coHHMeQ+YnJFtJueY2pI79xS0veqV5EnrX +IbIlbcgPosNhS+VI4le6n/KKId3bZPDaGd/OwJuAOcJ3d2MVU3KE+qSPBzeGIX1Q ++j1qN9uRDjez/c4Lynth0Jx0nH04aG3pex3W8Sq07ztgUncF5gLCX4xbvPB9t3PH +kWuyKrNjozTVq60lcUf/Gj56to2VdsPups0DCWzuRWeYz5lIdsHOinSaaFIBNCLI +7eIUC4S9bhCMsXKbvugI11fVf+q0AT1O5OLoZ+eMfunnQhHvlUbIkda+JxeAGTSY +58bfHvwhX56GPbx+8Jy9cp70R4JbcWfz+txUTKhc2FnH0AcOEzMnvPRp8Gsh +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIIBhDCeat3PfIwDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UE +BhMCQ0gxEjAQBgNVBAoTCVN3aXNzU2lnbjEyMDAGA1UEAxMpU3dpc3NTaWduIENB +IChSU0EgSUsgTWF5IDYgMTk5OSAxODowMDo1OCkxHzAdBgkqhkiG9w0BCQEWEGNh +QFN3aXNzU2lnbi5jb20wHhcNMDAxMTI2MjMyNzQxWhcNMzExMTI2MjMyNzQxWjB2 +MQswCQYDVQQGEwJDSDESMBAGA1UEChMJU3dpc3NTaWduMTIwMAYDVQQDEylTd2lz +c1NpZ24gQ0EgKFJTQSBJSyBNYXkgNiAxOTk5IDE4OjAwOjU4KTEfMB0GCSqGSIb3 +DQEJARYQY2FAU3dpc3NTaWduLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKw5fjnmNneLQlUCQG8jQLwwfbrOZoUwNX8cbNqhxK03/xUloFVgAt+S +Te2RxNXaCAXLBPn5ZST35TLV57aLmbHCtifv3YZqaaQGvjedltIBMJihJhZ+h3LY +SKsUb+xEJ3x5ZUf8jP+Q1g57y1s8SnBFWN/ni5NkF1Y1y31VwOi9wiOf/VISL+uu +SC4i1CP1Kbz3BDs6Hht1GpRYCbJ/K0bc9oJSpWpT5PGONsGIawqMbJuyoDghsXQ1 +pbn2e8K64BSscGZVZTNooSGgNiHmACNJBYXiWVWrwXPF4l6SddmC3Rj0aKXjgECc +FkHLDQcsM5JsK2ZLryTDUsQFbxVP2ikCAwEAAaNHMEUwCwYDVR0PBAQDAgEGMAwG +A1UdEwQFMAMBAf8wHQYDVR0OBBYEFJbXcc05KtT8iLGKq1N4ae+PR34WMAkGA1Ud +IwQCMAAwDQYJKoZIhvcNAQEFBQADggEBAKMy6W8HvZdS1fBpEUzl6Lvw50bgE1Xc +HU1JypSBG9mhdcXZo5AlPB4sCvx9Dmfwhyrdsshc0TP2V3Vh6eQqnEF5qB4lVziT +Bko9mW6Ot+pPnwsy4SHpx3rw6jCYnOqfUcZjWqqqRrq/3P1waz+Mn4cLMVEg3Xaz +qYov/khvSqS0JniwjRlo2H6f/1oVUKZvP+dUhpQepfZrOqMAWZW4otp6FolyQyeU +NN6UCRNiUKl5vTijbKwUUwfER/1Vci3M1/O1QCfttQ4vRN4Buc0xqYtGL3cd5WiO +vWzyhlTzAI6VUdNkQhhHJSAyTpj6dmXDRzrryoFGa2PjgESxz7XBaSI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB +kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw +IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG +EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD +VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu +dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 +E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ +D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK +4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq +lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW +bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB +o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT +MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js +LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr +BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB +AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj +j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH +KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv +2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 +mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET +MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE +AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw +CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg +YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE +Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX +mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD +XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW +S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp +FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD +AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu +ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z +ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv +Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw +DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6 +yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq +EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB +EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN +PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw +MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD +VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul +CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n +tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl +dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch +PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC ++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O +BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk +ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X +7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz +43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl +pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA +WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE-----  MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE @@ -1346,143 +2909,59 @@ YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9  BKNDLdr8C2LqL19iUw==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj -IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X -DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw -EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE -ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy -dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD -QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53 -dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK -wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7 -G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF -AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 -c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P -9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt -YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu -Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa -MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG -cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh -d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY -DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E -rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq -uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN -BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP -MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa -/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei -gQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p -dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv -bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa -QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY -BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u -IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl -bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu -Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs -Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI -Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD -ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG -SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH -b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh -KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy -dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t -MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB -MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG -A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl -cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv -bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE -VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ -ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR -uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM -pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm -MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx -MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 -dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl -cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 -DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD -gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 -yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX -L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj -EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG -7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ -qdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN -BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd -BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN -MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g -Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG -A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l -c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT -6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa -Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL -8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB -Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC -9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ -pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ -CayJSdM= +MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD +EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz +aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w +MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l +dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh +bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq +eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe +r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5 +3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd +vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l +mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC +wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg +hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0 +TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh +biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg +ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg +dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6 +b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl +c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0 +ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3 +dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu +ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo +ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3 +Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u +ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA +A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ +MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+ +NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR +VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY +83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3 +macqaJVmlaut74nLYKkGEsaUR+ko  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB -kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw -IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG -EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD -VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu -dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 -E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ -D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK -4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq -lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW -bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB -o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT -MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js -LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr -BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB -AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj -j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH -KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv -2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 -mfnGV/TJVTl4uix5yaaIK/QI +MIICmDCCAgGgAwIBAgIBDjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJVUzEY +MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNFQ0ExFDASBgNVBAMT +C0VDQSBSb290IENBMB4XDTA0MDYxNDEwMjAwOVoXDTQwMDYxNDEwMjAwOVowSzEL +MAkGA1UEBhMCVVMxGDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMD +RUNBMRQwEgYDVQQDEwtFQ0EgUm9vdCBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw +gYkCgYEArkr2eXIS6oAKIpDkOlcQZdMGdncoygCEIU+ktqY3of5SVVXU7/it7kJ1 +EUzR4ii2vthQtbww9aAnpQxcEmXZk8eEyiGEPy+cCQMllBY+efOtKgjbQNDZ3lB9 +19qzUJwBl2BMxslU1XsJQw9SK10lPbQm4asa8E8e5zTUknZBWnECAwEAAaOBizCB +iDAfBgNVHSMEGDAWgBT2uAQnDlYW2blj2f2hVGVBoAhILzAdBgNVHQ4EFgQU9rgE +Jw5WFtm5Y9n9oVRlQaAISC8wDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wJQYDVR0gBB4wHDAMBgpghkgBZQMCAQwBMAwGCmCGSAFlAwIBDAIwDQYJKoZI +hvcNAQEFBQADgYEAHh0EQY2cZ209aBb5q0wW1ER0dc4OGzsLyqjHfaQ4TEaMmUwL +AJRta/c4KVWLiwbODsvgJk+CaWmSL03gRW/ciVb/qDV7qh9Pyd1cOlanZTAnPog2 +i82yL3i2fK9DCC84uoxEQbgqK2jx9bIjFTwlAqITk9fGAm5mdT84IEwq1Gw=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE-----  MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB @@ -1512,56 +2991,234 @@ eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk  USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB -lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt -SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG -A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe -MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v -d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh -cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn -0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ -M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a -MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd -oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI -DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy -oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 -dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy -bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF -BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli -CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE -CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t -3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS -KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== +MIIDIjCCAougAwIBAgIQNKT/9jCvTKU8MxdCoZRmdTANBgkqhkiG9w0BAQUFADCB +xDELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ +Q2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE +CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhh +d3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wHhcNOTYwODAxMDAwMDAwWhcNMjEwMTAxMjM1OTU5WjCBxDELMAkGA1UE +BhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZl +ciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl +/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF +/rFrKbYvScg71CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982 +OsK1ZiIS1ocNAgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEF +BQADgYEAvkBpQW/G28GnvwfAReTQtUMeTJUzNelewj4o9qgNUNX/4gwP/FACjq6R +ua00io2fJ3GqGcxL6ATK1BdrEhrWxl/WzV7/iXa/2EjYWb0IiokdV81FHlK6EpqE ++hiJX+j5MDVqAWC5mYCDhQpu2vTJj15zLTFKY6B08h+LItIpPus=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB -ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt -TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1 -NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD -VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS -Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2 -N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH -iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe -YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1 -axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g -yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD -AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh -ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V -VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB -BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y -IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs -QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4 -ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM -YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb -QErNaLly7HF27FSOH4UMAWr6pjisH8SE +MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj +IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X +DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw +EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE +ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy +dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD +QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53 +dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK +wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7 +G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF +AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 +c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P +9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC +206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci +KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 +JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 +BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e +Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B +PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 +Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq +Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ +o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 ++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj +FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn +xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 +LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc +obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 +CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe +IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA +DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F +AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX +Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb +AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl +Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw +RY8mkaKO/qk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx +IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs +cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 +MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl +bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD +DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r +WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU +Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs +HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj +z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf +SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl +AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG +KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P +AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j +BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC +VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX +ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB +ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd +/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB +A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn +k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 +iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv +2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgIQMDAwMDk3Mzc1NzM4NjAwMDANBgkqhkiG9w0BAQUFADBV +MQswCQYDVQQGEwJGUjETMBEGA1UEChMKQ2VydGlOb21pczEcMBoGA1UECxMTQUMg +UmFjaW5lIC0gUm9vdCBDQTETMBEGA1UEAxMKQ2VydGlOb21pczAeFw0wMDExMDkw +MDAwMDBaFw0xMjExMDkwMDAwMDBaMFUxCzAJBgNVBAYTAkZSMRMwEQYDVQQKEwpD +ZXJ0aU5vbWlzMRwwGgYDVQQLExNBQyBSYWNpbmUgLSBSb290IENBMRMwEQYDVQQD +EwpDZXJ0aU5vbWlzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8SWb +4mS5RXB3ENSIcfrEzCj/TRUQuT1tMCU0YUfXFSgcPdWglIzCv3kvh07QoB+8xMl+ +fQHvSSduAxnNewz0GBY9rApCPKlP6CcnJr74OSVZIiWt9wLfl4wwhNhZOiikIpZp +EdOXWqRc84P5cUlN3Lwmr1sjCWmHfTSS4cAKxfDbFLfE61etosyoFZUTQbIhb1Bf +JL5xRXAUZudQiU42n/yAoSUrN4FLUfPQNlOe1AB81pIgX8g2ojwxDjfgqSs1JmBF +uLKJ45uVLEenQBPmQCGjL3maV86IRmR3a9UGlgvKAk0NBdh8mrQyQvcUlLBIQBCm +l7wppt6maQHUNEPQSwIDAQABoz8wPTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQU+F4ho6ijFeb4tRG7/kIEXU2OgnowDQYJKoZIhvcNAQEF +BQADggEBACe9FJayK6bXkJQrilBFMh75QPdFOks9PJuo86OMUlBDZGYFTCh9Arex +N3KYCnAEzazYIALwr7eASJJDIQMu1Q+pkx/7ACde4kP47F27M2rm+v5HnGooCLz2 +s7Fe/WUycTQqgwF5lNp03m1ce/TvovgkEZeVN5wM/7+SsZLJGDigXGeq48j2g2hn +8OckX9Ciyo0U3/1IVeigNBisiaOlsHSZOEPBZQRiZULob+NVbXVPo8nM1OyP3aHI +LQex1yYcCr9m93nOiZyKkur3Uedf1yMTBe+fflnPFKGYnVqvTGXCKVdHzQBfpILA +AuaC+5ykZhSiSMf8nmL2oPMcLO7YQw4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli +ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq +YmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0aW9uMB4XDTAy +MDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UEChMJYmVUUlVTVGVk +MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl +ZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1Q+xVkrYwfTVXDNvzDSduTPdQqJtO +K2/b9a0cS12zqcH+e0TrW6MFDR/FNCswACnxeECypP869AGIF37m1CbTukzqMvtD +d5eHI8XbQ6P1KqNRXuE70mVpflUVm3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdj +DheT389Lrm5zdeDzqrmkwAkbhepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCe +yv78IZTuEyhL11xeDGbu6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCkt +VjMFu5dZfsZJT4nXLySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMB +MIIBtwYDVR0gBIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYI +KwYBBQUHAgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRp +ZmljYXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug +b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0 +aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGljaCBjYW4gYmUg +Zm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0cHM6Ly93d3cuYmV0 +cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMEIGCCsGAQUF +BwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2Vz +L2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQDAgAHMIGJBgNVHR8EgYEwfzB9oHug +eaR3MHUxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJv +b3QgQ0FzMTMwMQYDVQQDEypiZVRSVVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1w +bGVtZW50YXRpb24xDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEw +ODI0MjdagQ8yMDIyMDQxMTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaA +FH1w5a44iwY/qhwaj/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQw +qoSEFjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIE +kDANBgkqhkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ +5V04ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB +evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220Y/oz +ADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2KjiS2d2k +XgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFiaDrmLzfzgYYh +xKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep9w== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEuzCCA6OgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQGEwJVUzET +MBEGA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxFjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwHhcNMDYwNDI1MjE0 +MDM2WhcNMzUwMjA5MjE0MDM2WjBiMQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBw +bGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +FjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDkkakJH5HbHkdQ6wXtXnmELes2oldMVeyLGYne+Uts9QerIjAC6Bg+ ++FAJ039BqJj50cpmnCRrEdCju+QbKsMflZ56DKRHi1vUFjczy8QPTc4UadHJGXL1 +XQ7Vf1+b8iUDulWPTV0N8WQ1IxVLFVkds5T39pyez1C6wVhQZ48ItCD3y6wsIG9w +tj8BMIy3Q88PnT3zK0koGsj+zrW5DtleHNbLPbU6rfQPDgCSC7EhFi501TwN22IW +q6NxkkdTVcGvL0Gz+PvjcM3mo0xFfh9Ma1CWQYnEdGILEINBhzOKgbEwWOxaBDKM +aLOPHd5lc/9nXmW8Sdh2nzMUZaF3lMktAgMBAAGjggF6MIIBdjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUK9BpR5R2Cf70a40uQKb3 +R01/CF4wHwYDVR0jBBgwFoAUK9BpR5R2Cf70a40uQKb3R01/CF4wggERBgNVHSAE +ggEIMIIBBDCCAQAGCSqGSIb3Y2QFATCB8jAqBggrBgEFBQcCARYeaHR0cHM6Ly93 +d3cuYXBwbGUuY29tL2FwcGxlY2EvMIHDBggrBgEFBQcCAjCBthqBs1JlbGlhbmNl +IG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0 +YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBj +b25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZp +Y2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMA0GCSqGSIb3DQEBBQUAA4IBAQBc +NplMLXi37Yyb3PN3m/J20ncwT8EfhYOFG5k9RzfyqZtAjizUsZAS2L70c5vu0mQP +y3lPNNiiPvl4/2vIB+x9OYOLUyDTOMSxv5pPCmv/K/xZpwUJfBdAVhEedNO3iyM7 +R6PVbyTi69G3cN8PReEnyvFteO3ntRcXqNx+IjXKJdXZD9Zr1KIkIxH3oayPc4Fg +xhtbCS+SsvhESPBgOJ4V9T0mZyCKM2r3DYLP3uujL/lTaltkwGMzd/c6ByxW69oP +IQ7aunMZT7XZNn/Bh1XZp5m5MkL72NVxnn6hUrcbvZNCJBIqxw8dtk2cXmPIS4AX +UKqK1drk/NAJBzewdXUh  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE-----  MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCB @@ -1590,6 +3247,278 @@ mMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU  Uh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm +SVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT +JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI +hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNzUwWhcNMjUxMjI3 +MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw +gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvN +G7uGBiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU +VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4Ninn +6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2YZM50yz8 +2l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz82l09BXW3mQKh +ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC +AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF +BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB +BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg +hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud +EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBD +QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG +SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC +AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j +cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2 +b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu +aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRtbD8wOwYJYIZIAYb4QgEI +BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMy5odG1s +MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz +MjAwMkNMQVNFQTMuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF +BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca +2on0eisxeewBwMwB9dbB/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI +3y2s6Q73nMify5NF8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYS +AfWRMS1Jjbs/RU4s4OjNtckUFQzjB4ObJnXv +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDPDCCAqWgAwIBAgIQEj3w59oqIkekOIngiu7JZzANBgkqhkiG9w0BAQUFADCB +0TELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ +Q2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3Rl +IFBlcnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1m +cmVlbWFpbEB0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIxMDEwMTIzNTk1 +OVowgdExCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNV +BAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNV +BAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1Ro +YXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29u +YWwtZnJlZW1haWxAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC +gYEA1GnX1LCUZFtx6UfYDFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Z +hx2G6qPduc6WZBrCFG5ErHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56 +fAylS1V/Bhkpf56aJtVquzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYD +VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQAemGDU5fJUYLA9GoFkR/db +o9lvwykLp9KpgUn2w22FFChFRAH0cVyVLhQPGivRqWvBX2c9FvFyIK++FsoOMF/J +y6WTLMNnVB5yIoojdmyUHVFSbJ3E4EcC18y/8IB7GG4l3GJh1qb+wR1/2bP9jVxF +EFrGZWSa6yz1A0/WSGL7Lg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEUDCCA7mgAwIBAgIJAN4ppNGwj6yIMA0GCSqGSIb3DQEBBAUAMIHMMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j +aXNjbzEZMBcGA1UEChMQTGluZGVuIExhYiwgSW5jLjEpMCcGA1UECxMgTGluZGVu +IExhYiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAnBgNVBAMTIExpbmRlbiBMYWIg +Q2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYJKoZIhvcNAQkBFhBjYUBsaW5kZW5s +YWIuY29tMB4XDTA1MDQyMTAyNDAzMVoXDTI1MDQxNjAyNDAzMVowgcwxCzAJBgNV +BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp +c2NvMRkwFwYDVQQKExBMaW5kZW4gTGFiLCBJbmMuMSkwJwYDVQQLEyBMaW5kZW4g +TGFiIENlcnRpZmljYXRlIEF1dGhvcml0eTEpMCcGA1UEAxMgTGluZGVuIExhYiBD +ZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgkqhkiG9w0BCQEWEGNhQGxpbmRlbmxh +Yi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKXh1MThucdTbMg9bYBO +rAm8yWns32YojB0PRfbq8rUjepEhTm3/13s0u399Uc202v4ejcGhkIDWJZd2NZMF +oKrhmRfxGHSKPCuFaXC3jh0lRECj7k8FoPkcmaPjSyodrDFDUUuv+C06oYJoI+rk +8REyal9NwgHvqCzOrZtiTXAdAgMBAAGjggE2MIIBMjAdBgNVHQ4EFgQUO1zK2e1f +1wO1fHAjq6DTJobKDrcwggEBBgNVHSMEgfkwgfaAFDtcytntX9cDtXxwI6ug0yaG +yg63oYHSpIHPMIHMMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEW +MBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQTGluZGVuIExhYiwgSW5j +LjEpMCcGA1UECxMgTGluZGVuIExhYiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAn +BgNVBAMTIExpbmRlbiBMYWIgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYJKoZI +hvcNAQkBFhBjYUBsaW5kZW5sYWIuY29tggkA3imk0bCPrIgwDAYDVR0TBAUwAwEB +/zANBgkqhkiG9w0BAQQFAAOBgQA/ZkgfvwHYqk1UIAKZS3kMCxz0HvYuEQtviwnu +xA39CIJ65Zozs28Eg1aV9/Y+Of7TnWhW+U3J3/wD/GghaAGiKK6vMn9gJBIdBX/9 +e6ef37VGyiOEFFjnUIbuk0RWty0orN76q/lI/xjCi15XSA/VSq2j4vmnwfZcPTDu +glmQ1A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIx +EzARBgNVBAoTCklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25h +bCBkZSBUZWNub2xvZ2lhIGRhIEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJy +YXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UEAxMoQXV0b3JpZGFkZSBDZXJ0aWZp +Y2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4MDBaFw0xMTExMzAy +MzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsG +A1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3Jt +YWNhbyAtIElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYD +VQQDEyhBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVA +isamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma/3pUpgcfNAj0vYm5gsyj +Qo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt4CyNrY50 +QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYt +bRhFboUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbUR +yEeNvZneVRKAAU6ouwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwID +AQABo4HSMIHPME4GA1UdIARHMEUwQwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0 +cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQQ2FjcmFpei5wZGYwPQYDVR0f +BDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0xDUmFj +cmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1 +U/hgIh6OcgLAfiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGl +YjJe+9zd+izPRbBqXPVQA34EXcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75Fos +SzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQfS//JYeIc7Fue2JNLd00UOSMMaiK/ +t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u +mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb +K+9A46sd33oqK8n8 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJKUDEO +MAwGA1UEChMFTEdQS0kxGjAYBgNVBAsTEUFwcGxpY2F0aW9uIENBIEcyMB4XDTA2 +MDMzMTE1MDAwMFoXDTE2MDMzMTE0NTk1OVowOTELMAkGA1UEBhMCSlAxDjAMBgNV +BAoTBUxHUEtJMRowGAYDVQQLExFBcHBsaWNhdGlvbiBDQSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBALk1xhD422jbB8RATLAdHjbcw0H2z1UVbQh/ +XMZoVeXnV/GWUebhTXgPbkAVcDtl/hHf59PWWDU74Z8C/JRSRi6znmCbAp7JgtL2 +464JT4REtmKbAFFouDqt7GTRMkvplESDtA7OIYlrsDbAmMZLnMI+W2AqCTErLatM +3rGg/VhWwoMdILzEhAmHe6iVl8YljoPgPpMN0cd9c6mo/BkAQC4iuHozQfV4/Vpx +54LZSIhc7KiFhy1tgIlnGmm+EMBaju2IfT5vLDhrN85H2KIxMN5+U2Vsi4ZTQSBs +vUilfq8AWlYSWIHR3IlZ+bXu+E2a2EQpi3mn9yKq6nxctBaIIA0CAwEAAaOBsjCB +rzAdBgNVHQ4EFgQUf7hdjsQYa8Z9zC7prs405xdd4KEwDgYDVR0PAQH/BAQDAgEG +MEwGA1UdHwRFMEMwQaA/oD2kOzA5MQswCQYDVQQGEwJKUDEOMAwGA1UEChMFTEdQ +S0kxGjAYBgNVBAsTEUFwcGxpY2F0aW9uIENBIEcyMA8GA1UdEwEB/wQFMAMBAf8w +HwYDVR0jBBgwFoAUf7hdjsQYa8Z9zC7prs405xdd4KEwDQYJKoZIhvcNAQEFBQAD +ggEBADzYczZABkhKVBn1J0g5JaVuQue2zRvLOTS3m+xPKr535MqE/B3rmyJA1fT7 +aIdy/Eddag5SSuO1XUjGIpbmM21tq/bN18skWoyoRZ4+YYJ9lNUF8Bo1X3EvLlS1 +QQXvhg1S75yYG/EsTDrR84bTjD56L4ZFjoMyJlu/U8oOUVbcmsJaMBkNp57Vqpsg +OWl4IfSXbdEOEUwu0xtasPmXeFwqj1Jl7kxCJcI3MA5tKzWUgwbor0U7BGanMLv5 +4CE7Y259RF06alPvERck/VSyWmxzViHJbC2XpEKzJ2EFIWNt6ii8TxpvQtyYq1XT +HhvAkj+bweY7F1bixJhDJe62ywA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx +CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp +ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa +QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw +NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft +ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu +QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG +qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL +fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ +Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4 +Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ +54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b +MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j +ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej +YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt +A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF +rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ +pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB +lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy +YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50 +7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs +YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6 +xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc +unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/ +Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp +ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42 +gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0 +jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+ +XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD +W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/ +RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r +MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk +BYn8eNZcLCZDqQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE-----  MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0  IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz  BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y @@ -1608,306 +3537,165 @@ I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw  nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05 -NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD -VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp -bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N -H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR -4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN -BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo -EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5 -FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx -lA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK -VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm -Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J -h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul -uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 -DzFc6PLZ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 -nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO -8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV -ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb -PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 -6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr -n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a -qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 -wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 -ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs -pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 -E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh -YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 -FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg -J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc -r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns -YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y -aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe -Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj -IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx -KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM -HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw -DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC -AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji -nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX -rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn -jBJ7xUS0rg== +MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p +dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv +bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa +QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY +BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u +IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl +bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu +Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs +Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI +Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD +ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH +b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh +KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy -aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp -Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV -BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp -Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g -Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt -IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU -J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO -JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY -wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o -koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN -qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E -Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe -xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u -7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU -sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI -sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP -cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkG  A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +cyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmlt  YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 -pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 -13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk -U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY -oJ2daZH9 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM -HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK -qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj -cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y -cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP -T8qAkbYp ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 -GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ -+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd -U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm -NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY -ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ -ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 -CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq -g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c -2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ -bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +ADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0f +zGVuDLDQVoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHi +TkVWaR94AoDa3EeRKbs2yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBAFgVKTk8d6PaXCUDfGD67gmZPCcQcMgMCeazh88K4hiW +NWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n0a3hUKw8fGJLj7qE1xIV +Gx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZRjXZ+Hxb +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD +TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2 +MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF +Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh +IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6 +dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO +V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC +GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN +v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB +AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB +Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO +76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK +OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH +ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi +yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL +buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj +2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCVVMx -DTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2 -aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcNMDAwODE2MjI1 -MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklT -QTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRp -b24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZDK9vZBv42pWUJGkzEXDK41Z0ohdX -ZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJXLB1LRckaeNCYOTudNargFbYiCjh+20i -/SN8RnNPflRzHqgsVVh1t0zzWkWlAhr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU -58fy+pmjIlC++QU3o63tmsPm7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/g -halMCXI5Etuz9c9OYmTaxhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E -1w0cslSsMoW0ZA3eQbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ -ca3CBfYDdYDOqU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHb -mQdpNSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ -kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoLaxhN -dBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/RtLdh6yumJ -ivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8ofyrEK9ca3Cn -B+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc +MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp +b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT +AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs +aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H +j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K +f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55 +IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw +FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht +QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm +/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ +k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ +MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC +seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ +hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+ +eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U +DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj +B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ -TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu -dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS -b290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEwOTIzMTMxODE3WjB1MQswCQYDVQQG -EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb -Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQg -LSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g -5DY1Hw7hgCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZs -jqBeynX8T90vFILqsY2K5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfH -HB67Af+g7u0dEHdDW7lwy81MwFYxBTRy9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAEgfwwgfkwgfYGDSsGAQQB -vj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3eXN0YXdp -b255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2pp -IGRsYSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENB -IHcgaGllcmFyY2hpaSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3 -LnNpZ25ldC5wbC9yZXBvenl0b3JpdW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQw -HwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQbsa8wHQYDVR0OBBYEFMODHtVZ -d1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQBFIGh8Jpxt87A -gSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy -f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIis -TsytFzVP32/W+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB -3vSaoYg+wdkcvb6souMJzuc2uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U -1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uftXncwKJrMiE3lvgOOBITRzcahirL -er4c +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs +IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg +R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A +PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 +Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL +TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL +5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 +S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe +2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap +EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td +EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv +/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN +A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 +abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF +I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz +4iIprn2DQKi6bA==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE-----  MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQ @@ -1939,90 +3727,166 @@ aLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF6caa  wBFjzz5ePr3WHV1wA7EY6oT4zBx+2gT9XBTB  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ -TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu -dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD -QSBLbGFzYSAyMB4XDTAzMTAxNDExNTgyMloXDTE3MDQxODEyNTMwN1owdzELMAkG -A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV -BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEhMB8GA1UEAxMYQ0MgU2ln -bmV0IC0gT0NTUCBLbGFzYSAyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCo -VCsaBStblXQYVNthe3dvaCrfvKpPXngh4almm988iIlEv9CVTaAdCfaJNihvA+Vs -Qw8++ix1VqteMQE474/MV/YaXigP0Zr0QB+g+/7PWVlv+5U9Gzp9+Xx4DJay8AoI -iB7Iy5Qf9iZiHm5BiPRIuUXT4ZRbZRYPh0/76vgRsQIDAQABo4IBkjCCAY4wDgYD -VR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEEGA1UdHwQ6MDgwNqA0 -oDKGMGh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9jcmwva2xhc2Ey -LmNybDCB2AYDVR0gBIHQMIHNMIHKBg4rBgEEAb4/AoFICgwBADCBtzBsBggrBgEF -BQcCAjBgGl5DZXJ0eWZpa2F0IHd5ZGFueSB6Z29kbmllIHogZG9rdW1lbnRlbSAi -UG9saXR5a2EgQ2VydHlmaWthY2ppIC0gQ2VydHlmaWthdHkgcmVzcG9uZGVyb3cg -T0NTUCIuMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0 -b3JpdW0vZG9rdW1lbnR5L3BjX29jc3BfMV8wLnBkZjAfBgNVHSMEGDAWgBS7RQZS -C8uBzSlUs7x8QUzNBw6MJTAdBgNVHQ4EFgQUKEVrOY7cEHvsVgvoyZdytlbtgwEw -CQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOCAQEAQrRg5MV6dxr0HU2IsLInxhvt -iUVmSFkIUsBCjzLoewOXA16d2oDyHhI/eE+VgAsp+2ANjZu4xRteHIHoYMsN218M -eD2MLRsYS0U9xxAFK9gDj/KscPbrrdoqLvtPSMhUb4adJS9HLhvUe6BicvBf3A71 -iCNe431axGNDWKnpuj2KUpj4CFHYsWCXky847YtTXDjri9NIwJJauazsrSjK+oXp -ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv -hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ== +MIIC+TCCAmKgAwIBAgIENvEbGTANBgkqhkiG9w0BAQUFADA2MQswCQYDVQQGEwJF +UzENMAsGA1UEChMERk5NVDEYMBYGA1UECxMPRk5NVCBDbGFzZSAyIENBMB4XDTk5 +MDMxODE0NTYxOVoXDTE5MDMxODE1MjYxOVowNjELMAkGA1UEBhMCRVMxDTALBgNV +BAoTBEZOTVQxGDAWBgNVBAsTD0ZOTVQgQ2xhc2UgMiBDQTCBnTANBgkqhkiG9w0B +AQEFAAOBiwAwgYcCgYEAmD+tGTaTPT7+dkIU/TVv8fqtInpY40bQXcZa+WItjzFe +/rQw/lB0rNadHeBixkndFBJ9cQusBsE/1waH4JCJ1uXjA7LyJ7GfM8iqazZKo8Q/ +eUGdiUYvKz5j1DhWkaodsQ1CdU3zh07jD03MtGy/YhOH6tCbjrbi/xn0lAnVlmEC +AQOjggEUMIIBEDARBglghkgBhvhCAQEEBAMCAAcwWAYDVR0fBFEwTzBNoEugSaRH +MEUxCzAJBgNVBAYTAkVTMQ0wCwYDVQQKEwRGTk1UMRgwFgYDVQQLEw9GTk1UIENs +YXNlIDIgQ0ExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5OTAzMTgxNDU2 +MTlagQ8yMDE5MDMxODE0NTYxOVowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFECa +dkSXdAfErBTLHo1POkV8MNdhMB0GA1UdDgQWBBRAmnZEl3QHxKwUyx6NTzpFfDDX +YTAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBAGFMoHxZY1tm+O5lE85DgEe5sjXJyITHa3NgReSdN531jiW5 ++aqqyuP4Q5wvoIkFsUUylCoeA41dpt7PV5Xa3yZgX8vflR64zgjY+IrJT6lodZPj +LwVMZGACokIeb4ZoZVUO2ENv8pExPqNHPCgFr0W2nSJMJntLfVsV+RlG3whd +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDcDCCAligAwIBAgIBBTANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQGEwJVUzEY +MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT +A1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMjAeFw0wNDEyMTMxNTAwMTBaFw0y +OTEyMDUxNTAwMTBaMFsxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVy +bm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRYwFAYDVQQDEw1Eb0Qg +Um9vdCBDQSAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwCzB9o07 +rP8/PNZxvrh0IgfscEEV/KtA4weqwcPYn/7aTDq/P8jYKHtLNgHArEUlw9IOCo+F +GGQQPRoTcCpvjtfcjZOzQQ84Ic2tq8I9KgXTVxE3Dc2MUfmT48xGSSGOFLTNyxQ+ +OM1yMe6rEvJl6jQuVl3/7mN1y226kTT8nvP0LRy+UMRC31mI/2qz+qhsPctWcXEF +lrufgOWARVlnQbDrw61gpIB1BhecDvRD4JkOG/t/9bPMsoGCsf0ywbi+QaRktWA6 +WlEwjM7eQSwZR1xJEGS5dKmHQa99brrBuKG/ZTE6BGf5tbuOkooAY7ix5ow4X4P/ +UNU7ol1rshDMYwIDAQABoz8wPTAdBgNVHQ4EFgQUSXS7DF66ev4CVO97oMaVxgmA +cJYwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBAJiRjT+JyLv1wGlzKTs1rLqzCHY9cAmS6YREIQF9FHYb7lFsHY0VNy17MWn0 +mkS4r0bMNPojywMnGdKDIXUr5+AbmSbchECV6KjSzPZYXGbvP0qXEIIdugqi3VsG +K52nZE7rLgE1pLQ/E61V5NVzqGmbEfGY8jEeb0DU+HifjpGgb3AEkGaqBivO4XqS +tX3h4NGW56E6LcyxnR8FRO2HmdNNGnA5wQQM5X7Z8a/XIA7xInolpHOZzD+kByeW +qKKV7YK5FtOeC4fCwfKI9WLfaN/HvGlR7bFc3FRUKQ8JOZqsA8HbDE2ubwp6Fknx +v5HSOJTT9pUst2zJQraNypCNhdk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgIBBDANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJLUjEN +MAsGA1UECgwES0lTQTEuMCwGA1UECwwlS29yZWEgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkgQ2VudHJhbDEWMBQGA1UEAwwNS0lTQSBSb290Q0EgMTAeFw0wNTA4MjQw +ODA1NDZaFw0yNTA4MjQwODA1NDZaMGQxCzAJBgNVBAYTAktSMQ0wCwYDVQQKDARL +SVNBMS4wLAYDVQQLDCVLb3JlYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBDZW50 +cmFsMRYwFAYDVQQDDA1LSVNBIFJvb3RDQSAxMIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAvATk+hM58DSWIGtsaLv623f/J/es7C/n/fB/bW+MKs0lCVsk +9KFo/CjsySXirO3eyDOE9bClCTqnsUdIxcxPjHmc+QZXfd3uOPbPFLKc6tPAXXdi +8EcNuRpAU1xkcK8IWsD3z3X5bI1kKB4g/rcbGdNaZoNy4rCbvdMlFQ0yb2Q3lIVG +yHK+d9VuHygvx2nt54OJM1jT3qC/QOhDUO7cTWu8peqmyGGO9cNkrwYV3CmLP3WM +vHFE2/yttRcdbYmDz8Yzvb9Fov4Kn6MRXw+5H5wawkbMnChmn3AmPC7fqoD+jMUE +CSVPzZNHPDfqAmeS/vwiJFys0izgXAEzisEZ2wIBA6MyMDAwHQYDVR0OBBYEFL+2 +J9gDWnZlTGEBQVYx5Yt7OtnMMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEF +BQADggEBABOvUQveimpb5poKyLGQSk6hAp3MiNKrZr097LuxQpVqslxa/6FjZJap +aBV/JV6K+KRzwYCKhQoOUugy50X4TmWAkZl0Q+VFnUkq8JSV3enhMNITbslOsXfl +BM+tWh6UCVrXPAgcrnrpFDLBRa3SJkhyrKhB2vAhhzle3/xk/2F0KpzZm4tfwjeT +2KM3LzuTa7IbB6d/CVDv0zq+IWuKkDsnSlFOa56ch534eJAx7REnxqhZvvwYC/uO +fi5C4e3nCSG9uRPFVmf0JqZCQ5BEVLRxm3bkGhKsGigA35vB1fjbXKP4krG9tNT5 +UNkAAk/bg9ART6RCVmE6fhMy04Qfybo= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ -TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu -dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS -b290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYwOTIxMTU0MjE5WjB2MQswCQYDVQQG -EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb -Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQg -LSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7B -rBlbN5maM5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRA -spEXE4gvwb08ASY6w5s+HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8w -nfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxWCeol9IekpBRVmuuSA6QG0Jkm+pGDJ05y -j2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9JyN0ag1yII/LPx8HK5J4 -W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3xW20QjQcS -ZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHk -MIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll -IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENB -Ii4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNo -aWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwv -cmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw -OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Ev -cm9vdGNhLmNybDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNV -HQ4EFgQUwGxGyl2CfpYHRonE82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1 -TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkxUGY7U9kVrLI71xBgoNVyzXTiMNDB -vjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsanot1Xt6j0ZDC+03Fj -LHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G22Ohu -+EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqW -uHitKQDVtcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6 -NA9GRTCNxm/dXlcwnmY= +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ -TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu -dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS -b290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYwOTIxMTU0MjE5WjB2MQswCQYDVQQG -EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb -Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQg -LSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3 -LanJtdueNe6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP -6KZTU0DixOrV+K7iWaqAiQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6H -dbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPEOpO94mAKcBUhk6T/ki0evXX/ZvvktwmF -3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Dbw34hA1A+ckTwhxzecrB8 -TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC3P8QqoK4 -ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHk -MIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll -IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENB -Ii4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNo -aWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwv -cmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw -OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Ev -cm9vdGNhLmNybDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNV -HQ4EFgQUXvthcPHlH5BgGhlMErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIc -e95Mvn710KCAISA0CuHD4aznTU6pLoCDShW47OR+GTpJUm1coTcUqlBHV9mra4VF -rBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJGdsJF/XU/7smummgj -MNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oFJTlp -uxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1D -OcePEhKz1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BX -WCW+KxwiBrtQTXv4dTE= +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE-----  MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ @@ -2053,75 +3917,266 @@ G7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmABKK6o  3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ -TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu -dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD -QSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloXDTExMDkyMzExMTgxN1owdjELMAkG -A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV -BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0MgU2ln -bmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJY -rISEtSsduHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ1 -2FJarD1X6mSQ4cfN/60vLfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjR -AM0tdwXSnzuTEunfw0Oup559y3Iqxg1cExflB6cfAgMBAAGjggGXMIIBkzBBBgNV -HR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3JpdW0v -Y3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsG -AQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYB -BQUHAgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVu -dGVtICJQb2xpdHlrYSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5p -ZSBjemFzZW0iLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVw -b3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJfMS5wZGYwHwYDVR0jBBgwFoAU -w4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavOYd9u9tej53vW -XwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz -+z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMb -skF8I31JxIeBvueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR -+7KtwMg4sFDJZ8RNgOf7tbA= +MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM +HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK +qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj +cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y +cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP +T8qAkbYp  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIDvjCCA3ygAwIBAgIFJQaThoEwCwYHKoZIzjgEAwUAMIGFMQswCQYDVQQGEwJG -UjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYDVQQHEwVQYXJpczEQMA4GA1UEChMHUE0v -U0dETjEOMAwGA1UECxMFRENTU0kxDjAMBgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcN -AQkBFhRpZ2NhQHNnZG4ucG0uZ291di5mcjAeFw0wMjEyMTMxNDM5MTVaFw0yMDEw -MTcxNDM5MTRaMIGFMQswCQYDVQQGEwJGUjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYD -VQQHEwVQYXJpczEQMA4GA1UEChMHUE0vU0dETjEOMAwGA1UECxMFRENTU0kxDjAM -BgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcNAQkBFhRpZ2NhQHNnZG4ucG0uZ291di5m -cjCCAbYwggErBgcqhkjOOAQBMIIBHgKBgQCFkMImdk9zDzJfTO4XPdAAmLbAdWws -ZiEMZh19RyTo3CyhFqO77OIXrwY6vc1pcc3MgWJ0dgQpAgrDMtmFFxpUu4gmjVsx -8GpxQC+4VOgLY8Cvmcd/UDzYg07EIRto8BwCpPJ/JfUxwzV2V3N713aAX+cEoKZ/ -s+kgxC6nZCA7oQIVALME/JYjkdW2uKIGngsEPbXAjdhDAoGADh/uqWJx94UBm31c -9d8ZTBfRGRnmSSRVFDgPWgA69JD4BR5da8tKz+1HjfMhDXljbMH86ixpD5Ka1Z0V -pRYUPbyAoB37tsmXMJY7kjyD19d5VdaZboUjVvhH6UJy5lpNNNGSvFl4fqkxyvw+ -pq1QV0N5RcvK120hlXdfHUX+YKYDgYQAAoGAQGr7IuKJcYIvJRMjxwl43KxXY2xC -aoCiM/bv117MfI94aNf1UusGhp7CbYAY9CXuL60P0oPMAajbaTE5Z34AuITeHq3Y -CNMHwxalip8BHqSSGmGiQsXeK7T+r1rPXsccZ1c5ikGDZ4xn5gUaCyy2rCmb+fOJ -6VAfCbAbAjmNKwejdzB1MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgFGMBUG -A1UdIAQOMAwwCgYIKoF6AXkBAQEwHQYDVR0OBBYEFPkeNRcUf8idzpKblYbLNxs0 -MQhSMB8GA1UdIwQYMBaAFPkeNRcUf8idzpKblYbLNxs0MQhSMAsGByqGSM44BAMF -AAMvADAsAhRVh+CJA5eVyEYU5AO9Tm7GxX0rmQIUBCqsU5u1WxoZ5lEXicDX5/Ob -sRQ= +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i +2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ +2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT -AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ -TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG -9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw -MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM -BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO -MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 -LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI -s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 -xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 -u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b -F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx -Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd -PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV -HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx -NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF -AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ -L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY -YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a -NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R -0982gaEbeC9xs/FZTEYYKKuF0mBWWg== +MIIH/zCCB2igAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm +SVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT +JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI +hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjMxMTEyMTQxWhcNMjUxMjI5 +MTEyMTQxWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw +gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM8g89BgSKoCxBXZ5C+NnlURLSnM +UWZoAGXaFFWf6q7f69uN1nXaUfTEzPstvTUfE7fpZmF8lEDz+2AvjBg086hVnra0 +b0APA0VnanJyW2ZIlkKFGMCB4WJqh7JB7i45jITVXthPV2vsjlKM97Pnnhimz8Fb +r+RZcsz69vRptMqxAgMBAAGjggRbMIIEVzAdBgNVHQ4EFgQUL8zsbGe+T/iqPIiN +EvvHnUxb9F4wggFGBgNVHSMEggE9MIIBOYAUL8zsbGe+T/iqPIiNEvvHnUxb9F6h +ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC +AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF +BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB +BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg +hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud +EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBDBglghkgBhvhCAQ0ENhY0Q0xBU0VBMSBD +QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cHM6Ly93d3cuaXBzLmVzLzAqBglg +hkgBhvhCAQIEHRYbaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDwGCWCGSAGG ++EIBBAQvFi1odHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VB +MS5jcmwwQQYJYIZIAYb4QgEDBDQWMmh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMyMDAy +L3Jldm9jYXRpb25DTEFTRUExLmh0bWw/MD4GCWCGSAGG+EIBBwQxFi9odHRwczov +L3d3dy5pcHMuZXMvaXBzMjAwMi9yZW5ld2FsQ0xBU0VBMS5odG1sPzA8BglghkgB +hvhCAQgELxYtaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VB +MS5odG1sMHcGA1UdHwRwMG4wM6AxoC+GLWh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMy +MDAyL2lwczIwMDJDTEFTRUExLmNybDA3oDWgM4YxaHR0cHM6Ly93d3diYWNrLmlw +cy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRUExLmNybDAvBggrBgEFBQcBAQQjMCEw +HwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQAD +gYEAGY2khC4v4mlenqRcy8Mn8mcWca88t4CY9LCJMqlIt7i559BNkMMB66tXsNp9 +N2QhnTordKOjkdgZJmCb7DUdMJEQQT0Y5W7JA6WvHatAFu8feRJ4ImaTjI0Xz3Dd +Jbz6O++igCw0l4EY5gayn2BFpAm+7ZpEcdpR/OCOH80lNDo= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE +SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg +Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV +BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl +cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA +vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu +Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a +0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 +4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN +eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD +R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG +A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu +dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME +Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 +WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw +HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ +KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO +Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX +wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 +9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 +jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 +aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 +GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ ++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd +U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm +NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ +ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 +CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq +g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c +2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ +bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 +MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK +EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh +BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq +xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G +87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i +2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U +WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 +0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G +A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr +pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL +ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm +aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv +hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm +hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 +P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y +iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no +xqE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFUjCCBDqgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJLUjEN +MAsGA1UEChMES0lTQTEuMCwGA1UECxMlS29yZWEgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkgQ2VudHJhbDEWMBQGA1UEAxMNS0lTQSBSb290Q0EgMzAeFw0wNDExMTkw +NjM5NTFaFw0xNDExMTkwNjM5NTFaMGQxCzAJBgNVBAYTAktSMQ0wCwYDVQQKEwRL +SVNBMS4wLAYDVQQLEyVLb3JlYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBDZW50 +cmFsMRYwFAYDVQQDEw1LSVNBIFJvb3RDQSAzMIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEA3rrtF2Wu0b1KPazbgHLMWOHn4ZPazDB6z+8Lri2nQ6u/p0LP +CFYIpEcdffqG79gwlyY0YTyADvjU65/8IjAboW0+40zSVU4WQDfC9gdu2we1pYyW +geKbXH6UYcjOhDyx+gDmctMJhXfp3F4hT7TkTvTiF6tQrxz/oTlYdVsSspa5jfBw +YkhbVigqpYeRNrkeJPW5unu2UlFbF1pgBWycwubGjD756t08jP+J3kNwrB248XXN +OMpTDUdoasY8GMq94bS+DvTQ49IT+rBRERHUQavo9DmO4TSETwuTqmo4/OXGeEeu +dhf6oYA3BgAVCP1rI476cg2V1ktisWjC3TSbXQIBA6OCAg8wggILMB8GA1UdIwQY +MBaAFI+B8NqmzXQ8vmb0FWtGpP4GKMyqMB0GA1UdDgQWBBSPgfDaps10PL5m9BVr +RqT+BijMqjAOBgNVHQ8BAf8EBAMCAQYwggEuBgNVHSAEggElMIIBITCCAR0GBFUd +IAAwggETMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LnJvb3RjYS5vci5rci9yY2Ev +Y3BzLmh0bWwwgd4GCCsGAQUFBwICMIHRHoHOx3QAIMd4yZ3BHLKUACCs9cd4x3jJ +ncEcx4WyyLLkACgAVABoAGkAcwAgAGMAZQByAHQAaQBmAGkAYwBhAHQAZQAgAGkA +cwAgAGEAYwBjAHIAZQBkAGkAdABlAGQAIAB1AG4AZABlAHIAIABFAGwAZQBjAHQA +cgBvAG4AaQBjACAAUwBpAGcAbgBhAHQAdQByAGUAIABBAGMAdAAgAG8AZgAgAHQA +aABlACAAUgBlAHAAdQBiAGwAaQBjACAAbwBmACAASwBvAHIAZQBhACkwMwYDVR0R +BCwwKqQoMCYxJDAiBgNVBAMMG+2VnOq1reygleuztOuztO2YuOynhO2dpeybkDAz +BgNVHRIELDAqpCgwJjEkMCIGA1UEAwwb7ZWc6rWt7KCV67O067O07Zi47KeE7Z2l +7JuQMA8GA1UdEwEB/wQFMAMBAf8wDAYDVR0kBAUwA4ABADANBgkqhkiG9w0BAQUF +AAOCAQEAz9b3Dv2wjG4FFY6oXCuyWtEeV6ZeGKqCEQj8mbdbp+PI0qLT+SQ09+Pk +rolUR9NpScmAwRHr4inH9gaLX7riXs+rw87P7pIl3J85Hg4D9N6QW6FwmVzHc07J +pHVJeyWhn4KSjU3sYcUMMqfHODiAVToqgx2cZHm5Dac1Smjvj/8F2LpOVmHY+Epw +mAiWk9hgxzrsX58dKzVPSBShmrtv7tIDhlPxEMcHVGJeNo7iHCsdF03m9VrvirqC +6HfZKBF+N4dKlArJQOk1pTr7ZD7yXxZ683bXzu4/RB1Fql8RqlMcOh9SUWJUD6OQ +Nc9Nb7rHviwJ8TX4Absk3TC8SA/u2Q== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgIQKTZHquOKrIZKI1byyrdhrzANBgkqhkiG9w0BAQUFADBO +MQswCQYDVQQGEwJ1czEYMBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQ0wCwYDVQQL +EwRGQkNBMRYwFAYDVQQDEw1Db21tb24gUG9saWN5MB4XDTA3MTAxNTE1NTgwMFoX +DTI3MTAxNTE2MDgwMFowTjELMAkGA1UEBhMCdXMxGDAWBgNVBAoTD1UuUy4gR292 +ZXJubWVudDENMAsGA1UECxMERkJDQTEWMBQGA1UEAxMNQ29tbW9uIFBvbGljeTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJeNvTMn5K1b+3i9L0dHbsd4 +6ZOcpN7JHP0vGzk4rEcXwH53KQA7Ax9oD81Npe53uCxiazH2+nIJfTApBnznfKM9 +hBiKHa4skqgf6F5PjY7rPxr4nApnnbBnTfAu0DDew5SwoM8uCjR/VAnTNr2kSVdS +c+md/uRIeUYbW40y5KVIZPMiDZKdCBW/YDyD90ciJSKtKXG3d+8XyaK2lF7IMJCk +FEhcVlcLQUwF1CpMP64Sm1kRdXAHImktLNMxzJJ+zM2kfpRHqpwJCPZLr1LoakCR +xVW9QLHIbVeGlRfmH3O+Ry4+i0wXubklHKVSFzYIWcBCvgortFZRPBtVyYyQd+sC +AwEAAaN7MHkwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFC9Yl9ipBZilVh/72at17wI8NjTHMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJ +KwYBBAGCNxUCBBYEFHa3YJbdFFYprHWF03BjwbxHhhyLMA0GCSqGSIb3DQEBBQUA +A4IBAQBgrvNIFkBypgiIybxHLCRLXaCRc+1leJDwZ5B6pb8KrbYq+Zln34PFdx80 +CTj5fp5B4Ehg/uKqXYeI6oj9XEWyyWrafaStsU+/HA2fHprA1RRzOCuKeEBuMPdi +4c2Z/FFpZ2wR3bgQo2jeJqVW/TZsN5hs++58PGxrcD/3SDcJjwtCga1GRrgLgwb0 +Gzigf0/NC++DiYeXHIowZ9z9VKEDfgHLhUyxCynDvux84T8PCVI8L6eaSP436REG +WOE2QYrEtr+O3c5Ks7wawM36GpnScZv6z7zyxFSjiDV2zBssRm8MtNHDYXaSdBHq +S4CNHIkRi+xb/xfJSPzn4AYR4oRe +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx +OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry +b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC +VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE +sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F +ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY +KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG ++7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG +HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P +IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M +733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk +Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW +AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5 +mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa +XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ +qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE-----  MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB @@ -2149,319 +4204,141 @@ BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB  ZQ==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg -b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa -MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB -ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw -IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B -AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb -unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d -BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq -7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 -0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX -roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG -A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j -aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p -26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA -BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud -EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN -BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB -AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd -p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi -1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc -XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 -eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu -tGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo -YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 -MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy -NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G -A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA -A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 -Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s -QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV -eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 -B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh -z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T -AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i -ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w -TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH -MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD -VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE -VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B -AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM -bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi -ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG -VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c -ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ -AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx -ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w -MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD -VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx -FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu -ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 -gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH -fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a -ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT -ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk -c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto -dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt -aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI -hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk -QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ -h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR -rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 -9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx -IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 -dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w -HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx -IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 -dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u -Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY -rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z -hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay -BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL -iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb -AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv -bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0 -MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E -FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n -VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq -u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m -hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl -ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp -QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5 -quGnM/b9Sh/22WA= +MIIIQTCCB6qgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjE0MDIGA1UECxMr +SVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE0MDIG +A1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIzMTExMjY0 +M1oXDTI1MTIyOTExMjY0M1owggEeMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFy +Y2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5l +dCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlw +cy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3Rh +bXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBU +aW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0B +CQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA +0umTdn+FPP2gAb0RL0ZCDyt/BZvGa/VRcayaUh8flSfMkO+WP45RNv0WAM43pSGU +Rmvt5P+hfuqf0aKbOPMTxLmYumVFQ/nXvRWdlC4AYN6YGrk8yfXh/NbEJN/n48iE +GRK0HFyz9eIWYSdg8vAt5PDzrPigeYSdReL2AfBE5ZECAwEAAaOCBIkwggSFMB0G +A1UdDgQWBBSR2UK8nKnK0Bw3E1JXFqANHikdPjCCAVAGA1UdIwSCAUcwggFDgBSR +2UK8nKnK0Bw3E1JXFqANHikdPqGCASakggEiMIIBHjELMAkGA1UEBhMCRVMxEjAQ +BgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJ +UFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJp +cHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMg +Q0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTQwMgYDVQQD +EytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4w +HAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM +BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB +FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYD +VR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlw +cy5lczBIBglghkgBhvhCAQ0EOxY5VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl +IGlzc3VlZCBieSBodHRwczovL3d3dy5pcHMuZXMvMCoGCWCGSAGG+EIBAgQdFhto +dHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi8wQQYJYIZIAYb4QgEEBDQWMmh0dHBz +Oi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMEYG +CWCGSAGG+EIBAwQ5FjdodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0 +aW9uVGltZXN0YW1waW5nLmh0bWw/MEMGCWCGSAGG+EIBBwQ2FjRodHRwczovL3d3 +dy5pcHMuZXMvaXBzMjAwMi9yZW5ld2FsVGltZXN0YW1waW5nLmh0bWw/MEEGCWCG +SAGG+EIBCAQ0FjJodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lUaW1l +c3RhbXBpbmcuaHRtbDCBgQYDVR0fBHoweDA4oDagNIYyaHR0cHM6Ly93d3cuaXBz +LmVzL2lwczIwMDIvaXBzMjAwMlRpbWVzdGFtcGluZy5jcmwwPKA6oDiGNmh0dHBz +Oi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyVGltZXN0YW1waW5nLmNy +bDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5l +cy8wDQYJKoZIhvcNAQEFBQADgYEAxKMCdGABCUwYXU900W1zDCfTSDC1TxFVGRnH +I4soqfp4D34sJ/adkgD2GMgkAMVf+C1MY/yQFV4nmOal9K7SNrG1JR8OeDoRjpM4 +rtO9qYbuHD3TW47/y/aZSZxP4ccocGpPOkvqfrnndKRKY0WUk/7Qg5aqpIXni2Gg +olkTZbQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC +Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g +Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0 +aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa +Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg +SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo +aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp +ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z +7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA// +DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx +zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8 +hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs +4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u +gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY +NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E +FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3 +j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG +52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB +echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws +ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI +zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy +wy39FCqQmbkHzJ8=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs -IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg -R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A -PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 -Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL -TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL -5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 -S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe -2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap -EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td -EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv -/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN -A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 -abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF -I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz -4iIprn2DQKi6bA== +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk +hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym +1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW +OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb +2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko +O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU +AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF +Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb +LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir +oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C +MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB +ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt +TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1 +NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD +VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS +Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2 +N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH +iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe +YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1 +axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g +yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD +AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh +ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V +VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB +BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y +IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs +QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4 +ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM +YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb +QErNaLly7HF27FSOH4UMAWr6pjisH8SE  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE-----  MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW @@ -2495,327 +4372,37 @@ OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH  QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD -EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 -OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l -dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG -SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK -gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX -iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc -Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E -BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G -SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu -b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln -aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 -IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph -biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo -ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP -UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj -YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA -bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 -sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa -n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS -NitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD -EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X -DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw -DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u -c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr -TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA -OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC -2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW -RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P -AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW -ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 -YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO -ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB -IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs -b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s -YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg -a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g -SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 -aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg -YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg -Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY -ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g -pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 -Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV -MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe -TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 -dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 -N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC -dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu -MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL -b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD -zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi -3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 -WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY -Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi -NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC -ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 -QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 -YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz -aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm -ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg -ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs -amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv -IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 -Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 -ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 -YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg -dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs -b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G -CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO -xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP -0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ -QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk -f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK -8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD -EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz -aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w -MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l -dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh -bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq -eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe -r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5 -3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd -vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l -mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC -wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg -hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0 -TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh -biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg -ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg -dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6 -b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl -c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0 -ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3 -dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu -ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh -bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo -ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3 -Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u -ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA -A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ -MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+ -NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR -VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY -83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3 -macqaJVmlaut74nLYKkGEsaUR+ko ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu +IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw +WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD +ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y +IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn +IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+ +6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob +jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw +izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl ++zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY +zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP +pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF +KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW +ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB +AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0 +ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW +IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA +A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0 +uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+ +FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7 +jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/ +u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D +YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1 +puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa +icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG +DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x +kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z +Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE-----  MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW @@ -2862,100 +4449,73 @@ um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh  NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwx -DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0 -Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBG -cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS -YWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoXDTM1MDMxMDE3Mzc0 -OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcTBUVp -bGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3Jp -dHkgRGVwLjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkxITAfBgkqhkiG9w0BCQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG -9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOeyEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x -18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+o5c5s7XvIywI6Nivcy+5 -yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2IhULpNYI -LzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0G -A1UdDgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOW -zL3+MtUNjIExtpidjShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT -BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4x -GjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3Rh -cnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV -HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8G -CWCGSAGG+EIBDQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAy -BglghkgBhvhCAQQEJRYjaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5j -cmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJ -YIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9pbmRleC5waHA/ -YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhBOlP1 -ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p -00UOpO6wNnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLb -cCOxgN8aIDjnfg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV -BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln -biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF -MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT -d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 -76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ -bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c -6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE -emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd -MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt -MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y -MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y -FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi -aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM -gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB -qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 -lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn -8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 -45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO -UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 -O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC -bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv -GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a -77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC -hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 -92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp -Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w -ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt -Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm +SVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT +JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI +hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNTMyWhcNMjUxMjI3 +MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw +gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8 +m2mdd81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd +ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1e+J8 +eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/2LUDnf47 +3P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf473P7yiuYV3TCh +ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ +BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp +bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G +LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC +AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF +BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB +BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg +hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud +EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBD +QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG +SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC +AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j +cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2 +b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu +aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRtbD8wOwYJYIZIAYb4QgEI +BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMS5odG1s +MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz +MjAwMkNMQVNFQTEuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz +MjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF +BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyA +AIQVCtWYUQxkxZwCWINmyq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeF +aQoO42Hu6r4okzPV7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aL +H2betgPAK7N41lUH5Y85UN4HI3LmvSAUS7SG  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE -BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu -IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw -WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD -ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y -IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn -IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+ -6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob -jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw -izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl -+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY -zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP -pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF -KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW -ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB -AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0 -ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW -IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA -A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0 -uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+ -FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7 -jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/ -u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D -YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1 -puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa -icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG -DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x -kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z -Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== +MIIEGjCCAwKgAwIBAgIDAYagMA0GCSqGSIb3DQEBBQUAMIGjMQswCQYDVQQGEwJG +STEQMA4GA1UECBMHRmlubGFuZDEhMB8GA1UEChMYVmFlc3RvcmVraXN0ZXJpa2Vz +a3VzIENBMSkwJwYDVQQLEyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBTZXJ2aWNl +czEZMBcGA1UECxMQVmFybWVubmVwYWx2ZWx1dDEZMBcGA1UEAxMQVlJLIEdvdi4g +Um9vdCBDQTAeFw0wMjEyMTgxMzUzMDBaFw0yMzEyMTgxMzUxMDhaMIGjMQswCQYD +VQQGEwJGSTEQMA4GA1UECBMHRmlubGFuZDEhMB8GA1UEChMYVmFlc3RvcmVraXN0 +ZXJpa2Vza3VzIENBMSkwJwYDVQQLEyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBT +ZXJ2aWNlczEZMBcGA1UECxMQVmFybWVubmVwYWx2ZWx1dDEZMBcGA1UEAxMQVlJL +IEdvdi4gUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALCF +FdrIAzfQo0Y3bBseljDCWoUSZyPyu5/nioFgJ/gTqTy894aqqvTzJSm0/nWuHoGG +igWyHWWyOOi0zCia+xc28ZPVec7Bg4shT8MNrUHfeJ1I4x9CRPw8bSEga60ihCRC +jxdNwlAfZM0tOSJWiP2yY51U2kJpwMhP1xjiPshphJQ9LIDGfM6911Mf64i5psu7 +hVfvV3ZdDIvTXhJBnyHAOfQmbQj6OLOhd7HuFtjQaNq0mKWgZUZKa41+qk1guPjI +DfxxPu45h4G02fhukO4/DmHXHSto5i7hQkQmeCxY8n0Wf2HASSQqiYe2XS8pGfim +545SnkFLWg6quMJmQlMCAwEAAaNVMFMwDwYDVR0TAQH/BAUwAwEB/zARBglghkgB +hvhCAQEEBAMCAAcwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBTb6eGb0tEkC/yr +46Bn6q6cS3f0sDANBgkqhkiG9w0BAQUFAAOCAQEArX1ID1QRnljurw2bEi8hpM2b +uoRH5sklVSPj3xhYKizbXvfNVPVRJHtiZ+GxH0mvNNDrsczZog1Sf0JLiGCXzyVy +t08pLWKfT6HAVVdWDsRol5EfnGTCKTIB6dTI2riBmCguGMcs/OubUpbf9MiQGS0j +8/G7cdqehSO9Gu8u5Hp5t8OdhkktY7ktdM9lDzJmid87Ie4pbzlj2RXBbvbfgD5Q +eBmK3QOjFKU3p7UsfLYRh+cF8ry23tT/l4EohP7+bEaFEEGfTXWMB9SZZ291im/k +UJL2mdUQuMSpe/cXjUu/15WfCdxEDx4yw8DP03kN5Mc7h/CQNIghYkmSBAQfvA==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE-----  MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE @@ -3025,53 +4585,24 @@ zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6  MBr1mmz0DlP5OlvRHA==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg -MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 -dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz -MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy -dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD -VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg -xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu -xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 -XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k -heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J -YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C -urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 -JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 -b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV -9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 -kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh -fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA -aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS -RGQDJereW26fyfJOrN3H ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS -S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg -SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 -WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv -bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU -UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw -bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe -LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef -J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh -R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ -Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX -JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p -zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S -Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ -KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq -ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 -Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz -gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH -uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS -y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= +MIIDQzCCAiugAwIBAgIQX/h7KCtU3I1CoxW1aMmt/zANBgkqhkiG9w0BAQUFADA1 +MRYwFAYDVQQKEw1DaXNjbyBTeXN0ZW1zMRswGQYDVQQDExJDaXNjbyBSb290IENB +IDIwNDgwHhcNMDQwNTE0MjAxNzEyWhcNMjkwNTE0MjAyNTQyWjA1MRYwFAYDVQQK +Ew1DaXNjbyBTeXN0ZW1zMRswGQYDVQQDExJDaXNjbyBSb290IENBIDIwNDgwggEg +MA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQCwmrmrp68Kd6ficba0ZmKUeIhH +xmJVhEAyv8CrLqUccda8bnuoqrpu0hWISEWdovyD0My5jOAmaHBKeN8hF570YQXJ +FcjPFto1YYmUQ6iEqDGYeJu5Tm8sUxJszR2tKyS7McQr/4NEb7Y9JHcJ6r8qqB9q +VvYgDxFUl4F1pyXOWWqCZe+36ufijXWLbvLdT6ZeYpzPEApk0E5tzivMW/VgpSdH +jWn0f84bcN5wGyDWbs2mAag8EtKpP6BrXruOIIt6keO1aO6g58QBdKhTCytKmg9l +Eg6CTY5j/e/rmxrbU6YTYK/CfdfHbBcl1HP7R2RQgYCUTOG/rksc35LtLgXfAgED +o1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUJ/PI +FR5umgIJFq0roIlgX9p7L6owEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEF +BQADggEBAJ2dhISjQal8dwy3U8pORFBi71R803UXHOjgxkhLtv5MOhmBVrBW7hmW +Yqpao2TB9k5UM8Z3/sUcuuVdJcr18JOagxEu5sv4dEX+5wW4q+ffy0vhN4TauYuX +cB7w4ovXsNgOnbFp1iqRe6lJT37mjpXYgyc81WhJDtSd9i7rp77rMKSsH0T8lasz +Bvt9YAretIpjsJyp8qS5UwGH0GikJ3+r/+n6yUA4iGe0OcaEb1fJU9u6ju7AQ7L4 +CYNu/2bPPu8Xs1gYJQk0XuPL1hS27PKSb3TkL4Eq1ZKR4OCXPDJoBYVL0fdX4lId +kxpUnwVwwEpxYB5DC2Ae/qPOgRnhCzU=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE-----  MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ @@ -3106,80 +4637,188 @@ LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl  pYYsfPQS  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v -dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0 -MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww -KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G -A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13 -5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE -SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O -JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu -ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE -AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB -AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB -CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw -b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo -7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/ -0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7 -nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx -x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ -33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx +IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w +HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx +IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u +Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY +rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z +hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay +BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL +iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb +AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv +bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0 +MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E +FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n +VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m +hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl +ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp +QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5 +quGnM/b9Sh/22WA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 +aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla +MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO +BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD +VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW +fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt +TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL +fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW +1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 +kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G +A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v +ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo +dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu +Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ +HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS +jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ +xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn +dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 +nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO +8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV +ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb +PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 +6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr +n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a +qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 +wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs +pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 +E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf +tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg +uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J +XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK +8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 +5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 +kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS +GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt +ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 +au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV +hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI +dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE-----  MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB @@ -3207,6 +4846,477 @@ LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7  jVaMaA==  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx +MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB +ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV +BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV +6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX +GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP +dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH +1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF +62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW +BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL +MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU +cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv +b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 +IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ +iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh +4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm +XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl +SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl +SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 +DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMDE0NFoXDTI1MTIyNzAx +MDE0NFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD +VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n +IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g +IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZ +H49NzjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY +8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBxRiVr +SXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLnev42USGj +mFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGjmFsMNKGCARqk +ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE +BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT +ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC +LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD +VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr +BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB +FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC +AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB +D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRp +ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC +BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito +dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMD8GCWCG +SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D +TEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov +L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTMuaHRtbDBzBgNVHR8EbDBq +MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMu +Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy +Q0xBU0UzLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v +Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dD +qsfwfewPxqmurpYPdikc4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9 +D6eSb9ijBmgpjnn1/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGy +r33I6unUVtkOE7LFRVA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDODCCAqGgAwIBAgIQQAWyU6AaRkNQCYGPEhB27DANBgkqhkiG9w0BAQUFADCB +zzELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ +Q2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3Rl +IFBlcnNvbmFsIFByZW1pdW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXBy +ZW1pdW1AdGhhd3RlLmNvbTAeFw05NjAxMDEwMDAwMDBaFw0yMTAxMDEyMzU5NTla +MIHPMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQH +EwlDYXBlIFRvd24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQL +Ex9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3 +dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwt +cHJlbWl1bUB0aGF3dGUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJ +Ztn4B0TPuYwu8KHvE0VsBd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O +0DI3lIi1DbbZ8/JE2dWIEt12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8f +AHB8Zs8QJQi6+u4A6UYDZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMB +Af8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBALpkCujztDHJJ2+idqAtNnHHhsAI +wk7t2pokGYf8WiOcck0I361cwzskgR1Xj7YSpSID7xK90S1elo8mJk9LG3w7oFIa +pag3hsRHKsrdQfho9cITQSma8AyozaH8FSMC23or1GJRQkfEox/00sVNVBDr2vDM +p083DL08yxDjGugV +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE +ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE +ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl +SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl +SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 +DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAwNTkzOFoXDTI1MTIyNzAw +NTkzOFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD +VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n +IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g +IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywS +zHb5BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS +YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJZHMQ +KD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzcuh9morKb +adB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKbadB4CKGCARqk +ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE +BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT +ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC +LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD +VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr +BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB +FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC +AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB +D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRp +ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC +BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito +dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMD8GCWCG +SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D +TEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov +L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTEuaHRtbDBzBgNVHR8EbDBq +MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEu +Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy +Q0xBU0UxLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v +Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuK +Yn4VLenZMdMu9Ccj/1urxUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpj +V4F1Wo7ojPsCwJTGKbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+ +hjM+5i9Ibq9UkE6tsSU= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFVTCCBD2gAwIBAgIEO/OB0DANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQGEwJj +aDEOMAwGA1UEChMFYWRtaW4xETAPBgNVBAsTCFNlcnZpY2VzMSIwIAYDVQQLExlD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0aWVzMRYwFAYDVQQDEw1BZG1pbi1Sb290LUNB +MB4XDTAxMTExNTA4NTEwN1oXDTIxMTExMDA3NTEwN1owbDELMAkGA1UEBhMCY2gx +DjAMBgNVBAoTBWFkbWluMREwDwYDVQQLEwhTZXJ2aWNlczEiMCAGA1UECxMZQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdGllczEWMBQGA1UEAxMNQWRtaW4tUm9vdC1DQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMvgr0QUIv5qF0nyXZ3PXAJi +C4C5Wr+oVTN7oxIkXkxvO0GJToM9n7OVJjSmzBL0zJ2HXj0MDRcvhSY+KiZZc6Go +vDvr5Ua481l7ILFeQAFtumeza+vvxeL5Nd0Maga2miiacLNAKXbAcUYRa0Ov5VZB +++YcOYNNt/aisWbJqA2y8He+NsEgJzK5zNdayvYXQTZN+7tVgWOck16Da3+4FXdy +fH1NCWtZlebtMKtERtkVAaVbiWW24CjZKAiVfggjsiLo3yVMPGj3budLx5D9hEEm +vlyDOtcjebca+AcZglppWMX/iHIrx7740y0zd6cWEqiLIcZCrnpkr/KzwO135GkC +AwEAAaOCAf0wggH5MA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIASBkTCBjjCBiwYI +YIV0AREDAQAwfzArBggrBgEFBQcCAjAfGh1UaGlzIGlzIHRoZSBBZG1pbi1Sb290 +LUNBIENQUzBQBggrBgEFBQcCARZEaHR0cDovL3d3dy5pbmZvcm1hdGlrLmFkbWlu +LmNoL1BLSS9saW5rcy9DUFNfMl8xNl83NTZfMV8xN18zXzFfMC5wZGYwfwYDVR0f +BHgwdjB0oHKgcKRuMGwxFjAUBgNVBAMTDUFkbWluLVJvb3QtQ0ExIjAgBgNVBAsT +GUNlcnRpZmljYXRpb24gQXV0aG9yaXRpZXMxETAPBgNVBAsTCFNlcnZpY2VzMQ4w +DAYDVQQKEwVhZG1pbjELMAkGA1UEBhMCY2gwHQYDVR0OBBYEFIKf+iNzIPGXi7JM +Tb5CxX9mzWToMIGZBgNVHSMEgZEwgY6AFIKf+iNzIPGXi7JMTb5CxX9mzWTooXCk +bjBsMQswCQYDVQQGEwJjaDEOMAwGA1UEChMFYWRtaW4xETAPBgNVBAsTCFNlcnZp +Y2VzMSIwIAYDVQQLExlDZXJ0aWZpY2F0aW9uIEF1dGhvcml0aWVzMRYwFAYDVQQD +Ew1BZG1pbi1Sb290LUNBggQ784HQMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0B +AQUFAAOCAQEAeE96XCYRpy6umkPKXDWCRn7INo96ZrWpMggcDORuofHIwdTkgOeM +vWOxDN/yuT7CC3FAaUajbPRbDw0hRMcqKz0aC8CgwcyIyhw/rFK29mfNTG3EviP9 +QSsEbnelFnjpm1wjz4EaBiFjatwpUbI6+Zv3XbEt9QQXBn+c6DeFLe4xvC4B+MTr +a440xTk59pSYux8OHhEvqIwHCkiijGqZhTS3KmGFeBopaR+dJVBRBMoXwzk4B3Hn +0Zib1dEYFZa84vPJZyvxCbLOnPRDJgH6V2uQqbG+6DXVaf/wORVOvF/wzzv0viM/ +RWbEtJZdvo8N3sdtCULzifnxP/V0T9+4ZQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDOzCCAiOgAwIBAgIRANAeRlAAACmMAAAAAgAAAAIwDQYJKoZIhvcNAQEFBQAw +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYNDAeFw0wMDA5MTMwNjIyNTBaFw0yMDA5MTMwNjIyNTBa +MD8xJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjEXMBUGA1UE +AxMORFNUIFJvb3QgQ0EgWDQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCthX3OFEYY8gSeIYur0O4ypOT68HnDrjLfIutL5PZHRwQGjzCPb9PFo/ihboJ8 +RvfGhBAqpQCo47zwYEhpWm1jB+L/OE/dBBiyn98krfU2NiBKSom2J58RBeAwHGEy +cO+lewyjVvbDDLUy4CheY059vfMjPAftCRXjqSZIolQb9FdPcAoa90mFwB7rKniE +J7vppdrUScSS0+eBrHSUPLdvwyn4RGp+lSwbWYcbg5EpSpE0GRJdchic0YDjvIoC +YHpe7Rkj93PYRTQyU4bhC88ck8tMqbvRYqMRqR+vobbkrj5LLCOQCHV5WEoxWh+0 +E2SpIFe7RkV++MmpIAc0h1tZAgMBAAGjMjAwMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFPCD6nPIP1ubWzdf9UyPWvf0hki9MA0GCSqGSIb3DQEBBQUAA4IBAQCE +G85wl5eEWd7adH6XW/ikGN5salvpq/Fix6yVTzE6CrhlP5LBdkf6kx1bSPL18M45 +g0rw2zA/MWOhJ3+S6U+BE0zPGCuu8YQaZibR7snm3HiHUaZNMu5c8D0x0bcMxDjY +AVVcHCoNiL53Q4PLW27nbY6wwG0ffFKmgV3blxrYWfuUDgGpyPwHwkfVFvz9qjaV +mf12VJffL6W8omBPtgteb6UaT/k1oJ7YI0ldGf+ngpVbRhD+LC3cUtT6GO/BEPZu +8YTV/hbiDH5v3khVqMIeKT6o8IuXGG7F6a6vKwP1F1FwTXf4UC/ivhme7vdUH7B/ +Vv4AEbT8dNfEeFxrkDbh +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns +YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y +aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe +Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj +IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx +KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM +HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw +DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC +AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji +nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX +rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn +jBJ7xUS0rg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYwOTIxMTU0MjE5WjB2MQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQg +LSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7B +rBlbN5maM5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRA +spEXE4gvwb08ASY6w5s+HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8w +nfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxWCeol9IekpBRVmuuSA6QG0Jkm+pGDJ05y +j2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9JyN0ag1yII/LPx8HK5J4 +W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3xW20QjQcS +ZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHk +MIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll +IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENB +Ii4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNo +aWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwv +cmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw +OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Ev +cm9vdGNhLmNybDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNV +HQ4EFgQUwGxGyl2CfpYHRonE82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1 +TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkxUGY7U9kVrLI71xBgoNVyzXTiMNDB +vjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsanot1Xt6j0ZDC+03Fj +LHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G22Ohu ++EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqW +uHitKQDVtcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6 +NA9GRTCNxm/dXlcwnmY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChML +RW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGlu +Y29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg +RW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJl +IFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDQxNzIwMDBa +Fw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0GA1UE +CxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO +8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaB +bL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2 +dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4 +QgEBBAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoT +C0VudHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw +IEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3Vy +ZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEw +KwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD +VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1Ud +DgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2 +fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsia +d0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbvH9X07t9WLebKahlzqlO+krNQAraF +JnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1U +yrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo +YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 +MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy +NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G +A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA +A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 +Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s +QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV +eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 +B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh +z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T +AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i +ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w +TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH +MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD +VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE +VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B +AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM +bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi +ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG +VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c +ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ +AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5u +ZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlh +Yi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJVUzEU +MBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9D +bGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMq +RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0G +CSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo +6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux +5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zm +AqTmT173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSC +ARkwggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 +cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5m +by9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMp +IDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQg +Q2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg +KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNV +HRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8E +BAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYE +FMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7 +pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzz +wy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/a +EkP/TOYGJqibGapEPHayXOw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy +aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp +Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV +BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp +Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g +Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU +J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO +JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY +wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o +koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN +qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E +Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe +xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u +7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI +sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP +cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0 +MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww +KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G +A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13 +5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE +SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O +JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu +ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE +AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB +AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB +CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw +b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo +7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/ +0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7 +nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ +33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgIOBcAAAQACQdAGCk3OdRAwDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDQgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDQgQ0EgSUkwHhcNMDYwMzIzMTQxMDIzWhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgNCBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgNCBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBALXNTJytrlG7fEjFDSmGehSt2VA9CXIgDRS2Y8b+WJ7gIV7z +jyIZ3E6RIM1viCmis8GsKnK6i1S4QF/yqvhDhsIwXMynXX/GCEnkDjkvjhjWkd0j +FnmA22xIHbzB3ygQY9GB493fL3l1oht48pQB5hBiecugfQLANIJ7x8CtHUzXapZ2 +W78mhEj9h/aECqqSB5lIPGG8ToVYx5ct/YFKocabEvVCUNFkPologiJw3fX64yhC +L04y87OjNopq1mJcrPoBbbTgci6VaLTxkwzGioLSHVPqfOA/QrcSWrjN2qUGZ8uh +d32llvCSHmcOHUJG5vnt+0dTf1cERh9GX8eu4I8CAwEAAaNCMEAwDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFB/quz4lGwa9pd1iBX7G +TFq/6A9DMA0GCSqGSIb3DQEBBQUAA4IBAQBYpCubTPfkpJKknGWYGWIi/HIy6QRd +xMRwLVpG3kxHiiW5ot3u6hKvSI3vK2fbO8w0mCr3CEf/Iq978fTr4jgCMxh1KBue +dmWsiANy8jhHHYz1nwqIUxAUu4DlDLNdjRfuHhkcho0UZ3iMksseIUn3f9MYv5x5 ++F0IebWqak2SNmy8eesOPXmK2PajVnBd3ttPedJ60pVchidlvqDTB4FAVd0Qy+BL +iILAkH0457+W4Ze6mqtCD9Of2J4VMxHL94J59bXAQVaS4d9VA61Iz9PyLrHHLVZM +ZHQqMc7cdalUR6SnQnIJ5+ECpkeyBM1CE+FhDOB4OiIgohxgQoaH96Xm +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg +Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL +MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD +VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg +isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z +NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI ++MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R +hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+ +mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP +Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s +EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2 +mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC +e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow +dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE-----  MIIIDjCCBfagAwIBAgIJAOiOtsn4KhQoMA0GCSqGSIb3DQEBBQUAMIG8MQswCQYD  VQQGEwJVUzEQMA4GA1UECBMHSW5kaWFuYTEVMBMGA1UEBxMMSW5kaWFuYXBvbGlz  MSgwJgYDVQQKEx9Tb2Z0d2FyZSBpbiB0aGUgUHVibGljIEludGVyZXN0MRMwEQYD @@ -3253,85 +5363,211 @@ yaXG67Ljxay2oHA1u8hRadDytaIybrw/oDc5fHE2pgXfDBLkFqfF1stjo5VwP+YE  o2A=  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== +MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 +IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB +IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA +Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO +BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi +MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ +ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ +8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 +zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y +fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 +w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc +G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k +epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q +laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ +QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU +fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 +YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w +ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY +gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe +MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 +IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy +dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw +czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 +dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl +aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC +AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg +b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB +ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc +nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg +18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c +gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl +Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY +sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T +SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF +CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum +GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk +zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW +omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIGJDCCBY2gAwIBAgIEQoaroDANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjA3 -MTQxNzEwMjhaFw0xNDA3MTQxNzQwMjhaMFwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK -EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xGzAZBgNV -BAMTEkRpZ2lDZXJ0IEdsb2JhbCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAMQ8vMy66mLmnkIjr7SyEa5ijdmh04/MFHIZ7Zn2/d5du1nAsMKvaplS -lVcLNf/hhvqvosPBBWUnIHYvClQlfOor3ZVBV5sPO89H6AEGjMVESPwHLvNygzBR -lJ5pOoOph5AU2V7EoniPwT7UGWEOGufcGpUgQb5vF9q4HEHumLD61x01PxanBCgT -XT0FdZouhp4ssBeHIFhX7+HqVWC4LHAhrCljDBD8YLz51Rw3ZNW0+x6rJjlGiKTL -zTBnwCZ55cpo+SLX5dKxu0hMmwuYW0KS5dLtDkcw+t0nVmNqpQHHjq/wTjsbVRVE -1T5NVx7hkeq4oI/OOmNflom6CD7+RLsCAwEAAaOCAwUwggMBMBIGA1UdEwEB/wQI -MAYBAf8CAQAwggEyBgNVHSAEggEpMIIBJTCCASEGCSqGSIb2fQdLAjCCARIwJgYI -KwYBBQUHAgEWGmh0dHA6Ly93d3cuZW50cnVzdC5uZXQvY3BzMIHnBggrBgEFBQcC -AjCB2hqB10ZvciB1c2Ugc29sZWx5IHdpdGggU1NMIGFuZCBTL01JTUUgY2VydGlm -aWNhdGVzIGlzc3VlZCBieSBEaWdpY2VydCwgSW5jLiB0byBhdXRob3JpemVkIHN1 -YnNjcmliZXJzLg0KRE9FUyBOT1QgcmVwcmVzZW50IGFueSBlbmRvcnNlbWVudCBi -eSBFbnRydXN0IEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMgYXMgdG8gdGhlIGlkZW50 -aXR5IG9mIGFueSBjZXJ0aWZpY2F0ZSBob2xkZXIuMDEGA1UdJQQqMCgGCCsGAQUF -BwMBBggrBgEFBQcDAgYIKwYBBQUHAwQGCCsGAQUFBwMJMIIBGAYDVR0fBIIBDzCC -AQswKKAmoCSGImh0dHA6Ly9jcmwuZW50cnVzdC5uZXQvc2VydmVyMS5jcmwwgd6g -gduggdikgdUwgdIxCzAJBgNVBAYTAlVTMRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE7 -MDkGA1UECxMyd3d3LmVudHJ1c3QubmV0L0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxp -bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0 -ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwCwYDVR0PBAQDAgEGMB8GA1Ud -IwQYMBaAFPAXYhNVPbP/CgBr+1CEl/PtYtAaMB0GA1UdDgQWBBSnxxOgegE8ne+C -SIJI1XNRthJWKjAZBgkqhkiG9n0HQQAEDDAKGwRWNy4xAwIAgTANBgkqhkiG9w0B -AQUFAAOBgQBK8bPOaGnjWKNh7bYWyJOxGDA+4HLfTz3iTeG4/D/ByeNFqV2pwdqj -5TbXjtYPrTavbLxE5ppGlKYRoNBS59pVsPYchftjUnu2mY8f4stHZKLrCGXmUdsc -S21/U58eDTGT1DBdHm4BBydgXbvT9ONsHSAPdSozEKe3idepFxQyAw== +MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx +HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh +IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1 +MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg +SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M +IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U +0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI +TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf +RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF +zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh +BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA +AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY +PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ +BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn +9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT +Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF +Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX +n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW +H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S  -----END CERTIFICATE-----  -----BEGIN CERTIFICATE----- -MIIEUDCCA7mgAwIBAgIJAN4ppNGwj6yIMA0GCSqGSIb3DQEBBAUAMIHMMQswCQYD -VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j -aXNjbzEZMBcGA1UEChMQTGluZGVuIExhYiwgSW5jLjEpMCcGA1UECxMgTGluZGVu -IExhYiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAnBgNVBAMTIExpbmRlbiBMYWIg -Q2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYJKoZIhvcNAQkBFhBjYUBsaW5kZW5s -YWIuY29tMB4XDTA1MDQyMTAyNDAzMVoXDTI1MDQxNjAyNDAzMVowgcwxCzAJBgNV -BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp -c2NvMRkwFwYDVQQKExBMaW5kZW4gTGFiLCBJbmMuMSkwJwYDVQQLEyBMaW5kZW4g -TGFiIENlcnRpZmljYXRlIEF1dGhvcml0eTEpMCcGA1UEAxMgTGluZGVuIExhYiBD -ZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgkqhkiG9w0BCQEWEGNhQGxpbmRlbmxh -Yi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKXh1MThucdTbMg9bYBO -rAm8yWns32YojB0PRfbq8rUjepEhTm3/13s0u399Uc202v4ejcGhkIDWJZd2NZMF -oKrhmRfxGHSKPCuFaXC3jh0lRECj7k8FoPkcmaPjSyodrDFDUUuv+C06oYJoI+rk -8REyal9NwgHvqCzOrZtiTXAdAgMBAAGjggE2MIIBMjAdBgNVHQ4EFgQUO1zK2e1f -1wO1fHAjq6DTJobKDrcwggEBBgNVHSMEgfkwgfaAFDtcytntX9cDtXxwI6ug0yaG -yg63oYHSpIHPMIHMMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEW -MBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQTGluZGVuIExhYiwgSW5j -LjEpMCcGA1UECxMgTGluZGVuIExhYiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAn -BgNVBAMTIExpbmRlbiBMYWIgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYJKoZI -hvcNAQkBFhBjYUBsaW5kZW5sYWIuY29tggkA3imk0bCPrIgwDAYDVR0TBAUwAwEB -/zANBgkqhkiG9w0BAQQFAAOBgQA/ZkgfvwHYqk1UIAKZS3kMCxz0HvYuEQtviwnu -xA39CIJ65Zozs28Eg1aV9/Y+Of7TnWhW+U3J3/wD/GghaAGiKK6vMn9gJBIdBX/9 -e6ef37VGyiOEFFjnUIbuk0RWty0orN76q/lI/xjCi15XSA/VSq2j4vmnwfZcPTDu -glmQ1A== +MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT +MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0 +aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw +WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE +AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m +OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu +T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c +JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR +Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz +PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm +aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM +TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g +LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO +BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv +dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB +AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL +NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W +b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp +ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow +fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV +BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM +cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S +HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 +CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk +3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz +6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV +HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv +Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw +Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww +DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 +5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI +gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ +aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl +izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwx +DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0 +Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS +YWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoXDTM1MDMxMDE3Mzc0 +OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcTBUVp +bGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3Jp +dHkgRGVwLjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxITAfBgkqhkiG9w0BCQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOeyEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x +18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+o5c5s7XvIywI6Nivcy+5 +yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2IhULpNYI +LzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0G +A1UdDgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOW +zL3+MtUNjIExtpidjShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT +BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4x +GjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3Rh +cnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV +HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8G +CWCGSAGG+EIBDQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAy +BglghkgBhvhCAQQEJRYjaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5j +cmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJ +YIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9pbmRleC5waHA/ +YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhBOlP1 +ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p +00UOpO6wNnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLb +cCOxgN8aIDjnfg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN +AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp +dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw +MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw +CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ +MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB +SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz +ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH +LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP +PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL +2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w +ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC +MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk +AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0 +AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz +AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz +AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f +BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY +P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi +CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g +kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95 +HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS +na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q +qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z +TbvGRNs2yyqcjg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO +TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy +MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk +ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn +ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 +9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO +hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U +tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o +BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh +SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww +OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv +cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA +7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k +/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm +eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 +u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy +7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==  -----END CERTIFICATE----- diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml index 89e5949fbe..15434f2b8f 100644 --- a/indra/newview/app_settings/cmd_line.xml +++ b/indra/newview/app_settings/cmd_line.xml @@ -220,8 +220,7 @@      <map>        <key>desc</key>        <string>Set the detail level.  -              0 - low, 1 - medium, 2 - high, 3 - ultra -       </string> +0 - low, 1 - medium, 2 - high, 3 - ultra</string>        <key>count</key>        <integer>1</integer>      </map> @@ -229,10 +228,7 @@      <key>setdefault</key>      <map>        <key>desc</key> -      <string> specify the value of a particular -               configuration variable which can be -               overridden by settings.xml -      </string> +      <string>specify the value of a particular configuration variable which can be overridden by settings.xml.</string>        <key>count</key>        <integer>2</integer>        <!-- Special case. Mapped to settings procedurally. --> @@ -241,10 +237,7 @@      <key>set</key>      <map>        <key>desc</key> -      <string> specify the value of a particular -               configuration variable that -               overrides all other settings -      </string> +      <string>specify the value of a particular configuration variable that overrides all other settings.</string>        <key>count</key>        <integer>2</integer>        <key>compose</key> diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml new file mode 100644 index 0000000000..391a864846 --- /dev/null +++ b/indra/newview/app_settings/commands.xml @@ -0,0 +1,240 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<commands> +  <command name="aboutland" +           available_in_toybox="true" +           icon="Command_AboutLand_Icon" +           label_ref="Command_AboutLand_Label" +           tooltip_ref="Command_AboutLand_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="about_land" +           is_running_function="Floater.IsOpen" +           is_running_parameters="about_land" +           /> +  <command name="appearance" +           available_in_toybox="true" +           icon="Command_Appearance_Icon" +           label_ref="Command_Appearance_Label" +           tooltip_ref="Command_Appearance_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="appearance" +           is_running_function="Floater.IsOpen" +           is_running_parameters="appearance" +           /> +  <command name="avatar" +           available_in_toybox="true" +           icon="Command_Avatar_Icon" +           label_ref="Command_Avatar_Label" +           tooltip_ref="Command_Avatar_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="avatar" +           is_running_function="Floater.IsOpen" +           is_running_parameters="avatar" +           /> +  <command name="build" +           available_in_toybox="true" +           icon="Command_Build_Icon" +           label_ref="Command_Build_Label" +           tooltip_ref="Command_Build_Tooltip" +           execute_function="Build.Toggle" +           execute_parameters="build" +           is_running_function="Floater.IsOpen" +           is_running_parameters="build" +           /> +  <command name="chat" +           available_in_toybox="true" +           icon="Command_Chat_Icon" +           label_ref="Command_Chat_Label" +           tooltip_ref="Command_Chat_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="chat_bar" +           is_running_function="Floater.IsOpen" +           is_running_parameters="chat_bar" +           /> +  <command name="compass" +           available_in_toybox="false" +           icon="Command_Compass_Icon" +           label_ref="Command_Compass_Label" +           tooltip_ref="Command_Compass_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="compass" +           is_running_function="Floater.IsOpen" +           is_running_parameters="compass" +           /> +  <command name="destinations" +           available_in_toybox="true" +           icon="Command_Destinations_Icon" +           label_ref="Command_Destinations_Label" +           tooltip_ref="Command_Destinations_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="destinations" +           is_running_function="Floater.IsOpen" +           is_running_parameters="destinations" +           /> +  <command name="gestures" +           available_in_toybox="true" +           icon="Command_Gestures_Icon" +           label_ref="Command_Gestures_Label" +           tooltip_ref="Command_Gestures_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="gestures" +           is_running_function="Floater.IsOpen" +           is_running_parameters="gestures" +           /> +  <command name="howto" +           available_in_toybox="true" +           icon="Command_HowTo_Icon" +           label_ref="Command_HowTo_Label" +           tooltip_ref="Command_HowTo_Tooltip" +           execute_function="Help.ToggleHowTo" +           is_running_function="Help.HowToVisible" +           /> +  <command name="inventory" +           available_in_toybox="true" +           icon="Command_Inventory_Icon" +           label_ref="Command_Inventory_Label" +           tooltip_ref="Command_Inventory_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="inventory" +           is_running_function="Floater.IsOpen" +           is_running_parameters="inventory" +           /> +  <command name="map" +           available_in_toybox="true" +           icon="Command_Map_Icon" +           label_ref="Command_Map_Label" +           tooltip_ref="Command_Map_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="world_map" +           is_running_function="Floater.IsOpen" +           is_running_parameters="world_map" +           /> +  <command name="marketplace" +           available_in_toybox="false" +           icon="Command_Marketplace_Icon" +           label_ref="Command_Marketplace_Label" +           tooltip_ref="Command_Marketplace_Tooltip" +           execute_function="Avatar.OpenMarketplace" +           /> +  <command name="minimap" +           available_in_toybox="true" +           icon="Command_MiniMap_Icon" +           label_ref="Command_MiniMap_Label" +           tooltip_ref="Command_MiniMap_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="mini_map" +           is_running_function="Floater.IsOpen" +           is_running_parameters="mini_map" +           /> +  <command name="move" +           available_in_toybox="true" +           icon="Command_Move_Icon" +           label_ref="Command_Move_Label" +           tooltip_ref="Command_Move_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="moveview" +           is_running_function="Floater.IsOpen" +           is_running_parameters="moveview" +           /> +  <command name="people" +           available_in_toybox="true" +           icon="Command_People_Icon" +           label_ref="Command_People_Label" +           tooltip_ref="Command_People_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="people" +           is_running_function="Floater.IsOpen" +           is_running_parameters="people" +           /> +  <command name="picks" +           available_in_toybox="true" +           icon="Command_Picks_Icon" +           label_ref="Command_Picks_Label" +           tooltip_ref="Command_Picks_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="picks" +           is_running_function="Floater.IsOpen" +           is_running_parameters="picks" +           /> +  <command name="places" +           available_in_toybox="true" +           icon="Command_Places_Icon" +           label_ref="Command_Places_Label" +           tooltip_ref="Command_Places_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="places" +           is_running_function="Floater.IsOpen" +           is_running_parameters="places" +           /> +  <command name="preferences" +           available_in_toybox="true" +           icon="Command_Preferences_Icon" +           label_ref="Command_Preferences_Label" +           tooltip_ref="Command_Preferences_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="preferences" +           is_running_function="Floater.IsOpen" +           is_running_parameters="preferences" +           /> +  <command name="profile" +           available_in_toybox="true" +           icon="Command_Profile_Icon" +           label_ref="Command_Profile_Label" +           tooltip_ref="Command_Profile_Tooltip" +           execute_function="Avatar.ToggleMyProfile" +           is_running_function="Avatar.IsMyProfileOpen" +           /> +  <command name="search" +           available_in_toybox="true" +           icon="Command_Search_Icon" +           label_ref="Command_Search_Label" +           tooltip_ref="Command_Search_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="search" +           is_running_function="Floater.IsOpen" +           is_running_parameters="search" +           /> +  <command name="snapshot" +           available_in_toybox="true" +           icon="Command_Snapshot_Icon" +           label_ref="Command_Snapshot_Label" +           tooltip_ref="Command_Snapshot_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="snapshot" +           is_running_function="Floater.IsOpen" +           is_running_parameters="snapshot" +           /> +  <command name="speak" +           available_in_toybox="true" +           icon="Command_Speak_Icon" +           label_ref="Command_Speak_Label" +           tooltip_ref="Command_Speak_Tooltip" +           execute_function="Agent.PressMicrophone" +           execute_parameters="speak" +           execute_stop_function="Agent.ReleaseMicrophone" +           execute_stop_parameters="speak" +           is_enabled_function="Agent.IsActionAllowed" +           is_enabled_parameters="speak" +           is_running_function="Agent.IsMicrophoneOn" +           is_running_parameters="speak" +           /> +  <command name="view" +           available_in_toybox="true" +           icon="Command_View_Icon" +           label_ref="Command_View_Label" +           tooltip_ref="Command_View_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="camera" +           is_running_function="Floater.IsOpen" +           is_running_parameters="camera" +           /> +  <command name="voice" +           available_in_toybox="true" +           icon="Command_Voice_Icon" +           label_ref="Command_Voice_Label" +           tooltip_ref="Command_Voice_Tooltip" +           execute_function="Floater.ToggleOrBringToFront" +           execute_parameters="voice_controls" +           is_running_function="Floater.IsOpen" +           is_running_parameters="voice_controls" +           /> +</commands> diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml index 9f4e89691f..ae72dee900 100644 --- a/indra/newview/app_settings/logcontrol.xml +++ b/indra/newview/app_settings/logcontrol.xml @@ -44,7 +44,6 @@  						<array>  							<!-- sample entry for debugging a specific item	-->  <!--						<string>Voice</string>							--> -              <string>Capabilities</string>  						</array>  				</map>  			</array> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 4b62e376b5..52aa2a3be3 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -16,8 +16,10 @@      <key>AFKTimeout</key>      <map>        <key>Comment</key> -      <string>Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never).  -        Valid values are: 0, 120, 300, 600, 1800</string> +            <string> +                Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never). +                Valid values are: 0, 120, 300, 600, 1800 +</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -617,7 +619,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string></string> +      <string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/avatars.html</string>      </map>      <key>AvatarBakedTextureUploadTimeout</key>      <map> @@ -796,6 +798,61 @@        <key>Value</key>        <integer>5</integer>      </map> +    <key>Socks5ProxyEnabled</key> +    <map> +      <key>Comment</key> +      <string>Use Socks5 Proxy</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>HttpProxyType</key> +    <map> +      <key>Comment</key> +      <string>Proxy type to use for HTTP operations</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>Socks</string> +    </map> +    <key>Socks5ProxyHost</key> +    <map> +      <key>Comment</key> +      <string>Socks 5 Proxy Host</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string></string> +    </map> +    <key>Socks5ProxyPort</key> +    <map> +      <key>Comment</key> +      <string>Socks 5 Proxy Port</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>1080</integer> +    </map> +    <key>Socks5AuthType</key> +    <map> +      <key>Comment</key> +      <string>Selected Auth mechanism for Socks5</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>None</string> +    </map>      <key>BuildAxisDeadZone0</key>      <map>        <key>Comment</key> @@ -1093,28 +1150,6 @@        <key>Value</key>        <integer>0</integer>      </map> -    <key>ButtonFlashCount</key> -    <map> -      <key>Comment</key> -      <string>Number of flashes after which flashing buttons stay lit up</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>S32</string> -      <key>Value</key> -      <integer>8</integer> -    </map> -    <key>ButtonFlashRate</key> -    <map> -      <key>Comment</key> -      <string>Frequency at which buttons flash (hz)</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>F32</string> -      <key>Value</key> -      <real>1.25</real> -    </map>      <key>ButtonHPad</key>      <map>        <key>Comment</key> @@ -1627,17 +1662,6 @@          <string />        </array>      </map> -    <key>CompressSnapshotsToDisk</key> -    <map> -      <key>Comment</key> -      <string>Compress snapshots saved to disk (Using JPEG 2000)</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map>          <key>ConnectAsGod</key>      <map>        <key>Comment</key> @@ -1803,6 +1827,17 @@        <key>Value</key>        <integer>0</integer>      </map> +  <key>CurlUseMultipleThreads</key> +  <map> +    <key>Comment</key> +    <string>Use background threads for executing curl_multi_perform (requires restart)</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>0</integer> +  </map>      <key>Cursor3D</key>      <map>        <key>Comment</key> @@ -1924,6 +1959,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>DebugShowPrivateMem</key> +    <map> +      <key>Comment</key> +      <string>Show Private Mem Info</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>DebugShowRenderInfo</key>      <map>        <key>Comment</key> @@ -1935,17 +1981,6 @@        <key>Value</key>        <integer>0</integer>      </map> -  <key>DebugShowUploadCost</key> -  <map> -    <key>Comment</key> -    <string>Show what it would cost to upload assets in current scene</string> -    <key>Persist</key> -    <integer>1</integer> -    <key>Type</key> -    <string>Boolean</string> -    <key>Value</key> -    <integer>0</integer> -  </map>    <key>DebugShowRenderMatrices</key>    <map>      <key>Comment</key> @@ -1979,6 +2014,17 @@        <key>Value</key>        <integer>0</integer>      </map> +  <key>DebugShowUploadCost</key> +  <map> +    <key>Comment</key> +    <string>Show mesh upload cost</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>1</integer> +  </map>    <key>DebugShowXUINames</key>      <map>        <key>Comment</key> @@ -2584,6 +2630,17 @@        <key>Value</key>        <integer>-1</integer>      </map> +    <key>DebugToolbarFUI</key> +    <map> +      <key>Comment</key> +      <string>Turn on the FUI Toolbars</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>DebugViews</key>      <map>        <key>Comment</key> @@ -2660,7 +2717,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string></string> +      <string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/guide.html</string>      </map>    <key>DisableCameraConstraints</key>      <map> @@ -3111,7 +3168,7 @@        <key>Type</key>        <string>Boolean</string>        <key>Value</key> -      <integer>1</integer> +      <integer>0</integer>      </map>      <key>EnableVoiceChat</key>      <map> @@ -3848,7 +3905,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>https://www.xstreetsl.com/modules.php?name=Marketplace&CategoryID=233</string> +      <string>https://marketplace.secondlife.com/products/search?search[category_id]=200&search[maturity][]=General&search[page]=1&search[per_page]=12</string>      </map>      <key>GridCrossSections</key>      <map> @@ -3971,6 +4028,17 @@        <key>Value</key>        <string>http://viewer-help.secondlife.com/[LANGUAGE]/[CHANNEL]/[VERSION]/[TOPIC][DEBUG_MODE]</string>      </map> +    <key>HowToHelpURL</key> +    <map> +      <key>Comment</key> +      <string>URL for How To help content</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/howto/index.html</string> +    </map>          <key>HomeSidePanelURL</key>      <map>        <key>Comment</key> @@ -3991,7 +4059,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://search-beta.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string> +      <string>http://search.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string>      </map>      <key>WebProfileURL</key>      <map> @@ -4189,7 +4257,7 @@          <key>Type</key>          <string>Boolean</string>          <key>Value</key> -        <integer>0</integer> +        <integer>1</integer>      </map>      <key>InventoryDisplayOutbox</key>      <map> @@ -4213,6 +4281,17 @@  		<key>Value</key>  		<integer>0</integer>  	</map> +    <key>InventoryMarketplaceUserStatus</key> +    <map> +      <key>Comment</key> +      <string>Marketplace user status.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>InventorySortOrder</key>      <map>        <key>Comment</key> @@ -4444,17 +4523,6 @@        <key>Value</key>          <real>2.0</real>      </map> -    <key>LastInventoryInboxExpand</key> -    <map> -        <key>Comment</key> -        <string>The last time the received items inbox was expanded.</string> -        <key>Persist</key> -        <integer>1</integer> -        <key>Type</key> -        <string>String</string> -        <key>Value</key> -        <string /> -    </map>      <key>LCDDestination</key>      <map>        <key>Comment</key> @@ -4872,7 +4940,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string /> +      <string/>      </map>      <key>LosslessJ2CUpload</key>      <map> @@ -4894,7 +4962,7 @@        <key>Type</key>        <string>F32</string>        <key>Value</key> -      <real>20.0</real> +      <real>60.0</real>      </map>      <key>MapOverlayIndex</key>      <map> @@ -5026,7 +5094,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/</string> +      <string>https://marketplace.secondlife.com/</string>      </map>      <key>MarketplaceURL_objectFemale</key>      <map> @@ -5037,7 +5105,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/attachments</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/attachments</string>      </map>      <key>MarketplaceURL_objectMale</key>      <map> @@ -5048,7 +5116,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/attachments</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/attachments</string>      </map>      <key>MarketplaceURL_clothingFemale</key>      <map> @@ -5059,7 +5127,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/clothing_female_avatar</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/clothing_female_avatar</string>      </map>      <key>MarketplaceURL_clothingMale</key>      <map> @@ -5070,7 +5138,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/clothing_male_avatar</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/clothing_male_avatar</string>      </map>      <key>MarketplaceURL_bodypartFemale</key>      <map> @@ -5081,7 +5149,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com</string> +      <string>https://marketplace.secondlife.com/</string>      </map>      <key>MarketplaceURL_bodypartMale</key>      <map> @@ -5092,7 +5160,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/</string> +      <string>https://marketplace.secondlife.com/</string>      </map>      <key>MarketplaceURL_glovesMale</key>      <map> @@ -5103,7 +5171,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/gloves_both_women_and_men</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/gloves_both_women_and_men</string>      </map>      <key>MarketplaceURL_glovesFemale</key>      <map> @@ -5114,7 +5182,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/gloves_both_women_and_men</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/gloves_both_women_and_men</string>      </map>      <key>MarketplaceURL_jacketFemale</key>      <map> @@ -5125,7 +5193,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/jacket_womens</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/jacket_womens</string>      </map>      <key>MarketplaceURL_jacketMale</key>      <map> @@ -5136,7 +5204,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/jacket_mens</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/jacket_mens</string>      </map>      <key>MarketplaceURL_shirtFemale</key>      <map> @@ -5147,7 +5215,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/shirt_womens</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/shirt_womens</string>      </map>      <key>MarketplaceURL_shirtMale</key>      <map> @@ -5158,7 +5226,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/shirt_mens</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/shirt_mens</string>      </map>      <key>MarketplaceURL_undershirtFemale</key>      <map> @@ -5169,7 +5237,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/undershirt_womens</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/undershirt_womens</string>      </map>      <key>MarketplaceURL_undershirtMale</key>      <map> @@ -5180,7 +5248,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/undershirt_mens</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/undershirt_mens</string>      </map>      <key>MarketplaceURL_skirtFemale</key>      <map> @@ -5191,7 +5259,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/skirts_women</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/skirts_women</string>      </map>      <key>MarketplaceURL_skirtMale</key>      <map> @@ -5202,7 +5270,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/skirts_women</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/skirts_women</string>      </map>      <key>MarketplaceURL_pantsFemale</key>      <map> @@ -5213,7 +5281,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/pants_women</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/pants_women</string>      </map>      <key>MarketplaceURL_pantsMale</key>      <map> @@ -5224,7 +5292,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/pants_men</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/pants_men</string>      </map>      <key>MarketplaceURL_underpantsFemale</key>      <map> @@ -5235,7 +5303,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/underwear_women</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/underwear_women</string>      </map>      <key>MarketplaceURL_underpantsMale</key>      <map> @@ -5246,7 +5314,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/underwear_men</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/underwear_men</string>      </map>      <key>MarketplaceURL_shoesFemale</key>      <map> @@ -5257,7 +5325,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/shoes_women</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/shoes_women</string>      </map>      <key>MarketplaceURL_shoesMale</key>      <map> @@ -5268,7 +5336,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/shoes_men</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/shoes_men</string>      </map>      <key>MarketplaceURL_socksFemale</key>      <map> @@ -5279,7 +5347,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/socks_women</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/socks_women</string>      </map>      <key>MarketplaceURL_socksMale</key>      <map> @@ -5290,7 +5358,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/socks_women</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/socks_women</string>      </map>      <key>MarketplaceURL_tattooMale</key>      <map> @@ -5301,7 +5369,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/tattoo_both_women_and_men</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/tattoo_both_women_and_men</string>      </map>      <key>MarketplaceURL_tattooFemale</key>      <map> @@ -5312,7 +5380,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/tattoo_both_women_and_men</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/tattoo_both_women_and_men</string>      </map>      <key>MarketplaceURL_hairFemale</key>      <map> @@ -5323,7 +5391,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_hair</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/womens_hair</string>      </map>      <key>MarketplaceURL_hairMale</key>      <map> @@ -5334,7 +5402,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_hair</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/mens_hair</string>      </map>      <key>MarketplaceURL_eyesFemale</key>      <map> @@ -5345,7 +5413,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_eyes</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/womens_eyes</string>      </map>      <key>MarketplaceURL_eyesMale</key>      <map> @@ -5356,7 +5424,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_eyes</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/mens_eyes</string>      </map>      <key>MarketplaceURL_shapeFemale</key>      <map> @@ -5367,7 +5435,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_shape</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/womens_shape</string>      </map>      <key>MarketplaceURL_shapeMale</key>      <map> @@ -5378,7 +5446,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_shape</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/mens_shape</string>      </map>      <key>MarketplaceURL_skinFemale</key>      <map> @@ -5389,7 +5457,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_skin</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/womens_skin</string>      </map>      <key>MarketplaceURL_skinMale</key>      <map> @@ -5400,7 +5468,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_skin</string> +      <string>https://marketplace.secondlife.com/trampoline/viewer21/mens_skin</string>      </map>      <key>MaxDragDistance</key>      <map> @@ -5413,6 +5481,17 @@        <key>Value</key>        <real>48.0</real>      </map> +    <key>MaxHeapSize</key> +    <map> +      <key>Comment</key> +      <string>Maximum heap size (GB)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.6</real> +    </map>      <key>MaxSelectDistance</key>      <map>        <key>Comment</key> @@ -5422,7 +5501,7 @@        <key>Type</key>        <string>F32</string>        <key>Value</key> -      <real>64.0</real> +      <real>128.0</real>      </map>      <key>MaxWearableWaitTime</key>      <map> @@ -5435,6 +5514,17 @@        <key>Value</key>        <real>60.0</real>      </map> +  <key>MediaPluginDebugging</key> +  <map> +    <key>Comment</key> +    <string>Turn on debugging messages that may help diagnosing media issues (WARNING: May reduce performance).</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>0</integer> +  </map>    <key>MediaControlFadeTime</key>    <map>      <key>Comment</key> @@ -5534,6 +5624,17 @@      <key>Value</key>      <integer>1</integer>    </map> +  <key>MemoryFailurePreventionEnabled</key> +  <map> +    <key>Comment</key> +    <string>If set, the viewer will quit to avoid crash when memory failure happens</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>0</integer> +  </map>    <key>MemoryLogFrequency</key>          <map>          <key>Comment</key> @@ -5545,6 +5646,28 @@          <key>Value</key>              <real>600.0</real>          </map> +    <key>MemoryPrivatePoolEnabled</key> +    <map> +      <key>Comment</key> +      <string>Enable the private memory pool management</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map> +    <key>MemoryPrivatePoolSize</key> +    <map> +      <key>Comment</key> +      <string>Size of the private memory pool in MB (min. value is 256)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>512</integer> +    </map>      <key>MemProfiling</key>      <map>        <key>Comment</key> @@ -5609,7 +5732,7 @@      <key>Type</key>      <string>Boolean</string>      <key>Value</key> -    <real>0</real> +    <real>1</real>    </map>    <key>MeshImportUseSLM</key>    <map> @@ -5620,7 +5743,7 @@      <key>Type</key>      <string>Boolean</string>      <key>Value</key> -    <real>0</real> +    <real>1</real>    </map>    <key>MeshUploadLogXML</key>    <map> @@ -5644,6 +5767,17 @@      <key>Value</key>      <real>0</real>    </map> +  <key>MeshUploadTimeOut</key> +  <map> +    <key>Comment</key> +    <string>Maximum time in seconds for llcurl to execute a mesh uoloading request</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>S32</string> +    <key>Value</key> +    <real>600</real> +  </map>    <key>MigrateCacheDirectory</key>      <map>        <key>Comment</key> @@ -6054,10 +6188,12 @@      <key>ToastButtonWidth</key>      <map>        <key>Comment</key> -      <string>Default width of buttons in the toast.  +            <string> +                Default width of buttons in the toast.        Notes:        If required width will be less then this one, a button will be reshaped to default size , otherwise to required -      Change of this parameter will affect the layout of buttons in notification toast.</string> +                Change of this parameter will affect the layout of buttons in notification toast. +</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -6599,7 +6735,7 @@      <key>Type</key>      <string>Boolean</string>      <key>Value</key> -    <string>0</string> +      <integer>0</integer>    </map>      <key>PrecachingDelay</key>      <map> @@ -6991,17 +7127,6 @@        <key>Value</key>        <real>0.0</real>      </map> -    <key>QuitAfterSecondsOfAFK</key> -    <map> -      <key>Comment</key> -      <string>The duration allowed after being AFK before quitting.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>F32</string> -      <key>Value</key> -      <real>0.0</real> -    </map>      <key>QuitOnLoginActivated</key>      <map>        <key>Comment</key> @@ -7302,6 +7427,88 @@        <key>Value</key>        <integer>1</integer>      </map> +  <key>RenderAvatarComplexityLimit</key> +    <map> +      <key>Comment</key> +      <string>Max visual complexity of avatars in a scene</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>-1</integer> +    </map> +  <key>RenderComplexityColorMin</key> +    <map> +      <key>Comment</key> +      <string>Max visual complexity of avatars in a scene</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.0</real> +        <real>0.0</real> +        <real>1.0</real> +        <real>0.5</real> +      </array> +    </map> +  <key>RenderComplexityColorMid</key> +    <map> +      <key>Comment</key> +      <string>Max visual complexity of avatars in a scene</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.0</real> +        <real>1.0</real> +        <real>0.0</real> +        <real>0.5</real> +      </array> +    </map> +  <key>RenderComplexityColorMax</key> +    <map> +      <key>Comment</key> +      <string>Max visual complexity of avatars in a scene</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>RenderComplexityThreshold</key> +    <map> +      <key>Comment</key> +      <string>Only color objects higher than render threshold</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>-1</integer> +    </map> +  <key>RenderComplexityStaticMax</key> +    <map> +      <key>Comment</key> +      <string>Sets a static max value for scaling of RenderComplexity  +        display (-1 for dynamic scaling)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>-1</integer> +    </map>      <key>RenderAvatarLODFactor</key>      <map>        <key>Comment</key> @@ -7349,8 +7556,10 @@      <key>RenderPerformanceTest</key>      <map>        <key>Comment</key> -      <string>Disable rendering of everything but in-world content for  -        performance testing</string> +            <string> +                Disable rendering of everything but in-world content for +                performance testing +</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -9188,28 +9397,51 @@        <key>Value</key>        <real>1.0</real>      </map> -  <key>MeshStreamingCostScaler</key> +  <key>MeshTriangleBudget</key>    <map>      <key>Comment</key> -    <string>DEBUG</string> +    <string>Target visible triangle budget to use when estimating streaming cost.</string>      <key>Persist</key>      <integer>1</integer>      <key>Type</key> -    <string>F32</string> +    <string>U32</string>      <key>Value</key> -    <real>2.0</real> +    <real>250000</real>    </map> -  <key>MeshThreadCount</key> +  <key>MeshMetaDataDiscount</key>    <map>      <key>Comment</key> -    <string>Number of threads to use for loading meshes.</string> +    <string>Number of bytes to deduct for metadata when determining streaming cost.</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>U32</string> +    <key>Value</key> +    <real>384</real> +  </map> +  <key>MeshMinimumByteSize</key> +  <map> +    <key>Comment</key> +    <string>Minimum number of bytes per LoD block when determining streaming cost.</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>U32</string> +    <key>Value</key> +    <real>16</real> +  </map> +  <key>MeshBytesPerTriangle</key> +  <map> +    <key>Comment</key> +    <string>Approximation of bytes per triangle to use for determining mesh streaming cost.</string>      <key>Persist</key>      <integer>1</integer>      <key>Type</key>      <string>U32</string>      <key>Value</key> -    <integer>8</integer> +    <real>16</real>    </map> +    <key>MeshMaxConcurrentRequests</key>    <map>      <key>Comment</key> @@ -9499,7 +9731,7 @@      <key>ShowBuildButton</key>      <map>        <key>Comment</key> -      <string>Shows/Hides Build button in the bottom tray.</string> +      <string>Shows/hides build button in the bottom tray.</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -9510,7 +9742,7 @@      <key>ShowCameraButton</key>      <map>        <key>Comment</key> -      <string>Show/Hide View button in the bottom tray.</string> +      <string>Show/hide view button in the bottom tray.</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -9598,7 +9830,7 @@      <key>ShowGestureButton</key>      <map>        <key>Comment</key> -      <string>Shows/Hides Gesture button in the bottom tray.</string> +      <string>Shows/hides gesture button in the bottom tray.</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -9631,7 +9863,7 @@      <key>ShowMiniMapButton</key>      <map>        <key>Comment</key> -      <string>Shows/Hides Mini-Map button in the bottom tray.</string> +      <string>Shows/hides mini-map button in the bottom tray.</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -9642,7 +9874,7 @@      <key>ShowMoveButton</key>      <map>        <key>Comment</key> -      <string>Shows/Hides Move button in the bottom tray.</string> +      <string>Shows/hides move button in the bottom tray.</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -9675,7 +9907,7 @@      <key>ShowSearchButton</key>      <map>        <key>Comment</key> -      <string>Shows/Hides Search button in the bottom tray.</string> +      <string>Shows/hides search button in the bottom tray.</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -9686,7 +9918,7 @@      <key>ShowSnapshotButton</key>      <map>        <key>Comment</key> -      <string>Shows/Hides Snapshot button button in the bottom tray.</string> +      <string>Shows/hides snapshot button button in the bottom tray.</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -9708,7 +9940,7 @@      <key>ShowNavbarFavoritesPanel</key>          <map>        <key>Comment</key> -      <string>Show/Hide Navigation Bar Favorites Panel</string> +      <string>Show/hide navigation bar favorites panel</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -9719,7 +9951,7 @@      <key>ShowNavbarNavigationPanel</key>              <map>        <key>Comment</key> -      <string>Show/Hide Navigation Bar Navigation Panel</string> +      <string>Show/hide navigation bar navigation panel</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -9730,7 +9962,7 @@      <key>ShowWorldMapButton</key>      <map>        <key>Comment</key> -      <string>Shows/Hides Map button in the bottom tray.</string> +      <string>Shows/hides map button in the bottom tray.</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -9741,18 +9973,7 @@      <key>ShowMiniLocationPanel</key>      <map>        <key>Comment</key> -      <string>Show/Hide Mini-Location Panel</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>SidebarCameraMovement</key> -    <map> -      <key>Comment</key> -      <string>Reflects world rect changing while changing sidebar visibility.</string> +      <string>Show/hide mini-location panel</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -10695,7 +10916,17 @@        <key>Value</key>        <real>0.699999988079</real>      </map> -    <key>ToolTipFadeTime</key> +     <key>ToolTipFastDelay</key> +    <map> +      <key>Comment</key> +      <string>Seconds before displaying tooltip when mouse stops over UI element (when a tooltip is already visible)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map>   <key>ToolTipFadeTime</key>      <map>        <key>Comment</key>        <string>Seconds over which tooltip fades away</string> @@ -12578,13 +12809,13 @@      <key>WatchdogEnabled</key>      <map>        <key>Comment</key> -      <string>Controls whether the thread watchdog timer is activated.</string> +      <string>Controls whether the thread watchdog timer is activated. Value is boolean. Set to -1 to defer to built-in default.</string>        <key>Persist</key>        <integer>0</integer>        <key>Type</key>        <string>S32</string>        <key>Value</key> -      <integer>20</integer> +      <integer>0</integer>      </map>      <key>WaterGLFogDensityScale</key>      <map> @@ -13343,7 +13574,7 @@        <key>Type</key>        <string>Boolean</string>        <key>Value</key> -      <integer>0</integer> +      <integer>1</integer>      </map>      <key>ShowOfferedInventory</key>      <map> @@ -13367,17 +13598,6 @@        <key>Value</key>        <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/404.html</string>      </map> -    <key>DestinationsAndAvatarsVisibility</key> -    <map> -      <key>Comment</key> -      <string>Whether destination panel or avatar picker are open (0=destination guide, 1=avatar picker, default=nothing)</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>S32</string> -      <key>Value</key> -      <integer>0</integer> -    </map>      <key>OpenIMOnVoice</key>      <map>        <key>Comment</key> @@ -13414,9 +13634,9 @@          <integer>650</integer>          <integer>490</integer>          <integer>0</integer> -      </array>     -    </map> -   <key>HelpFloaterOpen</key> +        </array> +        </map> +    <key>HelpFloaterOpen</key>      <map>        <key>Comment</key>        <string>Show Help Floater on login?</string> diff --git a/indra/newview/app_settings/settings_files.xml b/indra/newview/app_settings/settings_files.xml index 079a54f957..bfc09286e3 100644 --- a/indra/newview/app_settings/settings_files.xml +++ b/indra/newview/app_settings/settings_files.xml @@ -20,7 +20,8 @@            file_name="settings.xml"            file_name_setting="ClientSettingsFile"/>      <file name="CrashSettings" -          file_name="settings_crash_behavior"/> +          file_name="settings_crash_behavior.xml" +          file_name_setting="CrashSettingsFile"/>      <file name="Warnings"            file_name="ignorable_dialogs.xml"            file_name_setting="WarningSettingsFile"/> @@ -61,4 +62,4 @@            file_name="colors.xml"            file_name_setting="SkinningSettingsFile"/>    </group> -</settings_files>
\ No newline at end of file +</settings_files> diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index 29e52ab054..01a70f2671 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -1,474 +1 @@ -<llsd> -  <map> -    <key>ChannelBottomPanelMargin</key> -        <map> -        <key>Comment</key> -            <string>Space from a lower toast to the Bottom Tray</string> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>2</integer> -        </map> -    <key>ClickActionBuyEnabled</key> -        <map> -        <key>Comment</key> -            <string>Enable click to buy actions in tool pie menu</string> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -    <key>ClickActionPayEnabled</key> -        <map> -        <key>Comment</key> -            <string>Enable click to pay actions in tool pie menu</string> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -    <key>EnableGrab</key> -        <map> -        <key>Comment</key> -            <string>Use Ctrl+mouse to grab and manipulate objects</string> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -    <key>EnableMouselook</key> -        <map> -        <key>Comment</key> -            <string>Allow first person perspective and mouse control of camera</string> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -    <key>HelpURLFormat</key> -        <map> -        <key>Comment</key> -            <string>URL pattern for help page; arguments will be encoded; see llviewerhelp.cpp:buildHelpURL for arguments</string> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/howto/index.html?topic=[TOPIC]</string> -        </map> -    <key>PreferredMaturity</key> -        <map> -        <key>Comment</key> -            <string>Setting for the user's preferred maturity level (consts in indra_constants.h)</string> -        <key>Type</key> -            <string>U32</string> -        <key>Value</key> -            <integer>21</integer> -        </map> -    <key>RenderTrackerBeacon</key> -        <map> -        <key>Comment</key> -            <string>Display tracking arrow and beacon to target avatar, teleport destination</string> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -    <key>ShowScriptErrors</key> -        <map> -        <key>Comment</key> -            <string>Show script errors</string> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -    <key>ShowScriptErrorsLocation</key> -        <map> -        <key>Comment</key> -            <string>Show script error in chat or window</string> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -    <key>SkinCurrent</key> -        <map> -        <key>Comment</key> -            <string>The currently selected skin.</string> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>minimal</string> -        </map> -    <key>UseExternalBrowser</key> -        <map> -        <key>Comment</key> -            <string>Use default browser when opening web pages instead of in-world browser.</string> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -    <key>VoiceCallsRejectGroup</key> -        <map> -        <key>Comment</key> -            <string>Silently reject all incoming group voice calls.</string> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> -    <key>VoiceDisableMic</key> -        <map> -        <key>Comment</key> -            <string>Completely disable the ability to open the mic.</string> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -      <key>ScriptsCanShowUI</key> -      <map> -        <key>Comment</key> -        <string>Allow LSL calls (such as LLMapDestination) to spawn viewer UI</string> -        <key>Persist</key> -        <integer>1</integer> -        <key>Type</key> -        <string>Boolean</string> -        <key>Value</key> -        <integer>0</integer> -      </map> -      <key>ChatFontSize</key> -      <map> -        <key>Comment</key> -        <string>Size of chat text in chat console (0 = small, 1 = big, 2 = extra large)</string> -        <key>Persist</key> -        <integer>1</integer> -        <key>Type</key> -        <string>S32</string> -        <key>Value</key> -        <integer>1</integer> -      </map> -      <key>AvatarPickerHintTimeout</key> -      <map> -        <key>Comment</key> -        <string>Number of seconds to wait before telling resident about avatar picker.</string> -        <key>Persist</key> -        <integer>1</integer> -        <key>Type</key> -        <string>F32</string> -        <key>Value</key> -        <real>0.0</real> -      </map> -    <key>RenderShowGroupTitleAll</key> -    <map> -      <key>Comment</key> -      <string>Show group titles in name labels</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>OpenSidePanelsInFloaters</key> -    <map> -      <key>Comment</key> -      <string>If true, will always open side panel contents in a floater.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>1</integer> -    </map> -    <key>AvatarInspectorTooltipDelay</key> -    <map> -      <key>Comment</key> -      <string>Seconds before displaying avatar inspector tooltip</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>F32</string> -      <key>Value</key> -      <real>0.1</real> -    </map> -    <key>AFKTimeout</key> -    <map> -      <key>Comment</key> -      <string> -        Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never). -        Valid values are: 0, 120, 300, 600, 1800 -      </string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>S32</string> -      <key>Value</key> -      <real>0</real> -    </map> -    <key>SLURLTeleportDirectly</key> -    <map> -      <key>Comment</key> -      <string>Clicking on a slurl will teleport you directly instead of opening places panel</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>1</integer> -    </map> -    <key>EnableClassifieds</key> -    <map> -      <key>Comment</key> -      <string>Enable creation of new classified ads</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>EnableGroupInfo</key> -    <map> -      <key>Comment</key> -      <string>Enable viewing and editing of group info.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>EnablePlaceProfile</key> -    <map> -      <key>Comment</key> -      <string>Enable viewing of place profile from web link</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>EnablePicks</key> -    <map> -      <key>Comment</key> -      <string>Enable editing of picks</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>EnableWorldMap</key> -    <map> -      <key>Comment</key> -      <string>Enable opening world map from web link</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>EnableAvatarPay</key> -    <map> -      <key>Comment</key> -      <string>Enable paying other avatars from web link</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>EnableVoiceCall</key> -    <map> -      <key>Comment</key> -      <string>Enable voice calls from web link</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>1</integer> -    </map> -    <key>EnableAvatarShare</key> -    <map> -      <key>Comment</key> -      <string>Enable sharing from web link</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>EnableInventory</key> -    <map> -      <key>Comment</key> -      <string>Enable opening inventory from web link</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>EnableSearch</key> -    <map> -      <key>Comment</key> -      <string>Enable opening search from web link</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>EnableAppearance</key> -    <map> -      <key>Comment</key> -      <string>Enable opening appearance from web link</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>DoubleClickShowWorldMap</key> -    <map> -      <key>Comment</key> -      <string>Enable double-click to show world map from mini map</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>EnableGroupChatPopups</key> -    <map> -      <key>Comment</key> -      <string>Enable Incoming Group Chat Popups</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>SearchFromAddressBar</key> -    <map> -      <key>Comment</key> -      <string>Can enter search queries into navigation address bar</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>DestinationGuideURL</key> -    <map> -      <key>Comment</key> -      <string>Destination guide contents</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/guide.html</string> -    </map> -    <key>AvatarPickerURL</key> -    <map> -      <key>Comment</key> -      <string>Avatar picker contents</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/avatars.html</string> -    </map> -    <key>LogInventoryDecline</key> -    <map> -      <key>Comment</key> -      <string>Log in system chat whenever an inventory offer is declined</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>UseHTTPInventory</key> -    <map> -      <key>Comment</key> -      <string>Allow use of http inventory transfers instead of UDP</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>ClickToWalk</key> -    <map> -      <key>Comment</key> -      <string>Click in world to walk to location</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>1</integer> -    </map> -    <key>ShowOfferedInventory</key> -    <map> -      <key>Comment</key> -      <string>Show inventory window with last inventory offer selected when receiving inventory from other users.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>OpenIMOnVoice</key> -    <map> -      <key>Comment</key> -      <string>Open the corresponding IM window when connecting to a voice call.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>1</integer> -    </map> -    <key>AllowBottomTrayButtonReordering</key> -    <map> -      <key>Comment</key> -      <string>Allow user to move and hide bottom tray buttons</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>ShowHelpOnFirstLogin</key> -    <map> -      <key>Comment</key> -      <string>Show Help Floater on first login</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>1</integer> -    </map> -    </map> -</llsd> +<llsd/>
\ No newline at end of file diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index ff24efaf2c..d8295ddb87 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -33,6 +33,17 @@          <key>Value</key>              <string />          </map> +    <key>LastInventoryInboxActivity</key> +        <map> +        <key>Comment</key> +            <string>The last time the received items inbox was poked by the user.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>U32</string> +        <key>Value</key> +            <integer>0</integer> +        </map>      <key>LastLogoff</key>          <map>          <key>Comment</key> diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl index b0fa0ddd3e..b631ecb7d2 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl @@ -2,6 +2,24 @@   * @file avatarF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl index d9f29ced4f..c72da8d758 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl @@ -2,6 +2,24 @@   * @file avatarSkinV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl index 2796222c68..c2fe60ddaf 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl @@ -2,6 +2,24 @@   * @file avatarV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl b/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl index d86ef19a04..4296e551db 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl @@ -2,6 +2,24 @@   * @file eyeballF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl b/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl index 2eb814bd91..1a0866be0a 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl @@ -2,6 +2,24 @@   * @file eyeballV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl index 7613e50dca..09688b2be2 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl @@ -1,8 +1,25 @@  /**    * @file objectSkinV.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl index 2638351e96..374808c091 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl @@ -2,6 +2,24 @@   * @file pickAvatarF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl index 86b189b282..e25d84a594 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl @@ -2,6 +2,24 @@   * @file pickAvatarV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index 4a0815a163..19de0c0b39 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -2,6 +2,24 @@   * @file alphaF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl index b0d029dbf4..d4f56896cf 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl @@ -2,6 +2,24 @@   * @file alphaF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl index ac3f7189c2..d57b8f8525 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl @@ -1,8 +1,25 @@  /**    * @file alphaSkinnedV.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl index 44cb78e914..f6a280462e 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl @@ -2,6 +2,24 @@   * @file alphaV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl index 870d593311..0c930848e5 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl @@ -1,8 +1,25 @@  /**    * @file avatarShadowF.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl index c7a4f86727..bf4e79d815 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl @@ -1,8 +1,25 @@  /**    * @file attachmentShadowV.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl index 68e4055cf2..f70ea4da52 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl @@ -2,6 +2,24 @@   * @file avatarAlphaV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl index 7bc78fe407..d0f3397932 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl @@ -2,6 +2,24 @@   * @file avatarEyesV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl index 3268618093..3f30402583 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl @@ -2,6 +2,24 @@   * @file avatarF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl index 78986ab12e..c9a349f026 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl @@ -2,6 +2,24 @@   * @file avatarShadowF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl index f177fcd8f1..3d2ad397df 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl @@ -2,6 +2,24 @@   * @file avatarShadowV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl index 7eac11287a..37fcef81f3 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl @@ -2,6 +2,24 @@   * @file avatarV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl index 8c75c8045a..3609cc054b 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl @@ -2,6 +2,24 @@   * @file blurLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl index 6ca51377c1..c858eb7a3a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl @@ -2,6 +2,24 @@   * @file blurLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl index 862f809de5..e904b7ded0 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl @@ -2,6 +2,24 @@   * @file blurLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl index 75b4dc624a..429a891f07 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl @@ -2,6 +2,24 @@   * @file bumpF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl index dc69519a85..7d934e7ff8 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl @@ -1,8 +1,25 @@  /**    * @file bumpV.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl index 5b6726488b..92fd41554d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl @@ -2,6 +2,24 @@   * @file bumpV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl index ef300d5631..f4310dae95 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl @@ -2,6 +2,24 @@   * @file WLCloudsF.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl index 3eac63076c..c175a834c2 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl @@ -2,6 +2,24 @@   * @file WLCloudsV.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl new file mode 100644 index 0000000000..933e50fed1 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl @@ -0,0 +1,48 @@ +/**  + * @file diffuseF.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ +  + +uniform float minimum_alpha; +uniform float maximum_alpha; + +uniform sampler2D diffuseMap; + +varying vec3 vary_normal; + +void main()  +{ +	vec4 col = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color; +	 +	if (col.a < minimum_alpha || col.a > maximum_alpha) +	{ +		discard; +	} + +	gl_FragData[0] = vec4(col.rgb, 0.0); +	gl_FragData[1] = vec4(0,0,0,0); // spec +	vec3 nvn = normalize(vary_normal); +	gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0); +} + diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl new file mode 100644 index 0000000000..f3ad6f92de --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl @@ -0,0 +1,44 @@ +/**  + * @file diffuseAlphaMaskIndexedF.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ +  +varying vec3 vary_normal; + +uniform float minimum_alpha; +uniform float maximum_alpha; + +void main()  +{ +	vec4 col = diffuseLookup(gl_TexCoord[0].xy) * gl_Color; +	 +	if (col.a < minimum_alpha || col.a > maximum_alpha) +	{ +		discard; +	} + +	gl_FragData[0] = vec4(col.rgb, 0.0); +	gl_FragData[1] = vec4(0,0,0,0); +	vec3 nvn = normalize(vary_normal); +	gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0); +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl index 43af480c50..9c9a8b56c5 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl @@ -2,6 +2,24 @@   * @file diffuseF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl index e7b5dcce7f..4d996a099d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl @@ -2,6 +2,24 @@   * @file diffuseIndexedF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl index 2c4caea109..1470d7c9ca 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl @@ -1,8 +1,25 @@  /**    * @file diffuseSkinnedV.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl index b56d1493c3..7c5a4d35b3 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl @@ -2,6 +2,24 @@   * @file diffuseV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl index d781e08548..6c506676af 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl @@ -2,6 +2,24 @@   * @file fullbrightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl index 2eed044b7c..a4ff0b80e2 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl @@ -2,6 +2,24 @@   * @file fullbrightV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/giF.glsl b/indra/newview/app_settings/shaders/class1/deferred/giF.glsl index 41c149e774..bfb7760af8 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/giF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/giF.glsl @@ -2,6 +2,24 @@   * @file giF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/giV.glsl b/indra/newview/app_settings/shaders/class1/deferred/giV.glsl index e86f2896da..190e32b6a3 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/giV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/giV.glsl @@ -2,6 +2,24 @@   * @file giV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl index fa811f0d55..7152e13946 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl @@ -1,10 +1,30 @@  /**    * @file impostorF.glsl   * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ +uniform float minimum_alpha; +uniform float maximum_alpha;  uniform sampler2D diffuseMap; @@ -14,6 +34,12 @@ uniform sampler2D specularMap;  void main()   {  	vec4 col = texture2D(diffuseMap, gl_TexCoord[0].xy); + +	if (col.a < minimum_alpha || col.a > maximum_alpha) +	{ +		discard; +	} +  	gl_FragData[0] = vec4(col.rgb, col.a * 0.005);  	gl_FragData[1] = texture2D(specularMap, gl_TexCoord[0].xy);  	gl_FragData[2] = vec4(texture2D(normalMap, gl_TexCoord[0].xy).xyz, 0.0); diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl index 723777bd3a..0cf8c68173 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl @@ -2,6 +2,24 @@   * @file impostorV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl index 25e93ae266..4ba26fb0c6 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl @@ -2,6 +2,24 @@   * @file luminanceF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl index 4baf1fc65a..9f22175f84 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl @@ -2,6 +2,24 @@   * @file giV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl index 3c5c780d94..42212a978e 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl @@ -2,6 +2,24 @@   * @file multiPointLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl index 6c43679acf..863bac19cf 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl @@ -2,6 +2,24 @@   * @file multiPointLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl index 434fb6f534..1362a48daf 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl @@ -2,6 +2,24 @@   * @file multiPointLightV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl index 0d25d7792d..85b0ce5beb 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl @@ -2,6 +2,24 @@   * @file multiSpotLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl index c80a54346e..10285817c2 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl @@ -2,6 +2,24 @@   * @file multiSpotLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl index 5efa3200d4..0771f9b91a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl @@ -2,6 +2,24 @@   * @file pointLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl index feaf38115d..cdce58c84e 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl @@ -2,6 +2,24 @@   * @file pointLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl index c510d8ad77..db1b9d3feb 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl @@ -2,6 +2,24 @@   * @file pointLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index f6b0402bb9..29f5f899ba 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -2,6 +2,24 @@   * @file postDeferredF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl index 62ae5f917a..792102a64d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl @@ -2,6 +2,24 @@   * @file postDeferredF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl index bf829bfc56..34e30a3070 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl @@ -2,6 +2,24 @@   * @file postDeferredF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl index bf35dfe11c..41849858e7 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl @@ -2,6 +2,24 @@   * @file postDeferredF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl index 876f65ee3a..cb83dda795 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl @@ -2,6 +2,24 @@   * @file postDeferredV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl index fa3f04bcc8..99257daca4 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl @@ -2,6 +2,24 @@   * @file postgiF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl b/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl index eebe930666..6231ee68b7 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl @@ -2,6 +2,24 @@   * @file postgiV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl new file mode 100644 index 0000000000..615317febf --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl @@ -0,0 +1,45 @@ +/**  + * @file shadowAlphaMaskF.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ +  +uniform float minimum_alpha; +uniform float maximum_alpha; + +uniform sampler2D diffuseMap; + +varying vec4 post_pos; + +void main()  +{ +	float alpha = texture2D(diffuseMap, gl_TexCoord[0].xy).a * gl_Color.a; + +	if (alpha < minimum_alpha || alpha > maximum_alpha) +	{ +		discard; +	} + +	gl_FragColor = vec4(1,1,1,1); +	 +	gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0); +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl new file mode 100644 index 0000000000..4be18a9c5e --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl @@ -0,0 +1,41 @@ +/**  + * @file shadowAlphaMaskV.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ +  + + +varying vec4 post_pos; + +void main() +{ +	//transform vertex +	vec4 pos = gl_ModelViewProjectionMatrix*gl_Vertex; +	 +	post_pos = pos; +	 +	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); +	 +	gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; +	gl_FrontColor = gl_Color; +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl index e0c5406483..541f08d5fe 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl @@ -1,19 +1,35 @@  /**    * @file shadowF.glsl   * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ -uniform sampler2D diffuseMap; -  varying vec4 post_pos;  void main()   { -	gl_FragColor = vec4(1,1,1,texture2D(diffuseMap, gl_TexCoord[0].xy).a * gl_Color.a); +	gl_FragColor = vec4(1,1,1,1);  	gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl index 9271a5115c..fc3ff45614 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl @@ -1,7 +1,25 @@  /**    * @file shadowV.glsl   * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ @@ -17,7 +35,4 @@ void main()  	post_pos = pos;  	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); -	 -	gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; -	gl_FrontColor = gl_Color;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl index 820c82ffd7..59c0a994cd 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl @@ -2,6 +2,24 @@   * @file WLSkyF.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl index 1ea00f723a..3a44bb6d26 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl @@ -2,6 +2,24 @@   * @file WLSkyV.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index 60082f40d6..855d89ebe6 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -2,6 +2,24 @@   * @file softenLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ @@ -270,72 +288,41 @@ void main()  	vec4 diffuse = texture2DRect(diffuseRect, tc);  	vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); -	calcAtmospherics(pos.xyz, 1.0); +	vec3 col; +	float bloom = 0.0; +	if (diffuse.a < 0.9) +	{ +		calcAtmospherics(pos.xyz, 1.0); +	 +		col = atmosAmbient(vec3(0)); +		col += atmosAffectDirectionalLight(max(min(da, 1.0), diffuse.a)); -	vec3 col = atmosAmbient(vec3(0)); -	col += atmosAffectDirectionalLight(max(min(da, 1.0), diffuse.a)); +		col *= diffuse.rgb; -	col *= diffuse.rgb; +		if (spec.a > 0.0) // specular reflection +		{ +			// the old infinite-sky shiny reflection +			// +			vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); +			float sa = dot(refnormpersp, vary_light.xyz); +			vec3 dumbshiny = vary_SunlitColor*texture2D(lightFunc, vec2(sa, spec.a)).a; +			 +			// add the two types of shiny together +			vec3 spec_contrib = dumbshiny * spec.rgb; +			bloom = dot(spec_contrib, spec_contrib); +			col += spec_contrib; +		} -	if (spec.a > 0.0) // specular reflection +		col = atmosLighting(col); +		col = scaleSoftClip(col); + +		col = mix(col.rgb, diffuse.rgb, diffuse.a); +	} +	else  	{ -		// the old infinite-sky shiny reflection -		// -		vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); -		float sa = dot(refnormpersp, vary_light.xyz); -		vec3 dumbshiny = vary_SunlitColor*texture2D(lightFunc, vec2(sa, spec.a)).a; - -		/* -		// screen-space cheap fakey reflection map -		// -		vec3 refnorm = normalize(reflect(vec3(0,0,-1), norm.xyz)); -		depth -= 0.5; // unbias depth -		// first figure out where we'll make our 2D guess from -		vec2 ref2d = (0.25 * screen_res.y) * (refnorm.xy) * abs(refnorm.z) / depth; -		// Offset the guess source a little according to a trivial -		// checkerboard dither function and spec.a. -		// This is meant to be similar to sampling a blurred version -		// of the diffuse map.  LOD would be better in that regard. -		// The goal of the blur is to soften reflections in surfaces -		// with low shinyness, and also to disguise our lameness. -		float checkerboard = floor(mod(tc.x+tc.y, 2.0)); // 0.0, 1.0 -		float checkoffset = (3.0 + (7.0*(1.0-spec.a)))*(checkerboard-0.5); -		ref2d += vec2(checkoffset, checkoffset); -		ref2d += tc.xy; // use as offset from destination -		// Get attributes from the 2D guess point. -		// We average two samples of diffuse (not of anything else) per -		// pixel to try to reduce aliasing some more. -		vec3 refcol = 0.5 * (texture2DRect(diffuseRect, ref2d + vec2(0.0, -checkoffset)).rgb + -				     texture2DRect(diffuseRect, ref2d + vec2(-checkoffset, 0.0)).rgb); -		float refdepth = texture2DRect(depthMap, ref2d).a; -		vec3 refpos = getPosition_d(ref2d, refdepth).xyz; -		vec3 refn = texture2DRect(normalMap, ref2d).rgb; -		refn = normalize(vec3((refn.xy-0.5)*2.0,refn.z)); // unpack norm -		// figure out how appropriate our guess actually was -		float refapprop = max(0.0, dot(-refnorm, normalize(pos - refpos))); -		// darken reflections from points which face away from the reflected ray - our guess was a back-face -		//refapprop *= step(dot(refnorm, refn), 0.0); -		refapprop = min(refapprop, max(0.0, -dot(refnorm, refn))); // more conservative variant -		// get appropriate light strength for guess-point. -		// reflect light direction to increase the illusion that -		// these are reflections. -		vec3 reflight = reflect(lightnorm.xyz, norm.xyz); -		float reflit = max(dot(refn, reflight.xyz), 0.0); -		// apply sun color to guess-point, dampen according to inappropriateness of guess -		float refmod = min(refapprop, reflit); -		vec3 refprod = vary_SunlitColor * refcol.rgb * refmod; -		vec3 ssshiny = (refprod * spec.a); -		ssshiny *= 0.3; // dampen it even more -		*/ -		vec3 ssshiny = vec3(0,0,0); - -		// add the two types of shiny together -		col += (ssshiny + dumbshiny) * spec.rgb; +		col = diffuse.rgb;  	} -	 -	col = atmosLighting(col); -	col = scaleSoftClip(col); -		 +  	gl_FragColor.rgb = col; -	gl_FragColor.a = 0.0; +	gl_FragColor.a = bloom;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl index 9dfacfb520..f118b0da2a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl @@ -2,6 +2,24 @@   * @file softenLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ @@ -266,7 +284,7 @@ void main()  	vec2 tc = vary_fragcoord.xy;  	ivec2 itc = ivec2(tc); -	vec3 fcol = vec3(0,0,0); +	vec4 fcol = vec4(0,0,0,0);  	for (int i = 0; i < samples; ++i)  	{ @@ -280,17 +298,16 @@ void main()  		float da = max(dot(norm.xyz, vary_light.xyz), 0.0);  		vec4 diffuse = texelFetch(diffuseRect, itc, i); -		if (diffuse.a >= 1.0) -		{ -			fcol += diffuse.rgb; -		} -		else +		vec3 col; +		float bloom = 0.0; + +		if (diffuse.a < 0.9)  		{  			vec4 spec = texelFetch(specularRect, itc, i);  			calcAtmospherics(pos.xyz, 1.0); -			vec3 col = atmosAmbient(vec3(0)); +			col = atmosAmbient(vec3(0));  			col += atmosAffectDirectionalLight(max(min(da, 1.0), diffuse.a));  			col *= diffuse.rgb; @@ -304,15 +321,22 @@ void main()  				vec3 dumbshiny = vary_SunlitColor*texture2D(lightFunc, vec2(sa, spec.a)).a;  				// add the two types of shiny together -				col += dumbshiny * spec.rgb; +				vec3 spec_contrib = dumbshiny * spec.rgb; +				bloom = dot(spec_contrib, spec_contrib); +				col += spec_contrib;  			}  			col = atmosLighting(col);  			col = scaleSoftClip(col); -			fcol += col; +			col = mix(col, diffuse.rgb, diffuse.a);  		} +		else +		{ +			col = diffuse.rgb; +		} + +		fcol += vec4(col, bloom);  	} -	gl_FragColor.rgb = fcol.rgb/samples; -	gl_FragColor.a = 0.0; +	gl_FragColor = fcol/samples;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl index 745cc01992..fed238510a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl @@ -2,6 +2,24 @@   * @file softenLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl index 9aaffc15bf..7363bd6715 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl @@ -2,6 +2,24 @@   * @file spotLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl index 4bb9bad275..0c0171881f 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl @@ -2,6 +2,24 @@   * @file multiSpotLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl index 2cf7d194cc..4ab59d4d66 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl @@ -2,6 +2,24 @@   * @file starsF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl index c43125dad9..84adf6bc41 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl @@ -2,6 +2,24 @@   * @file starsV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl index f20886565a..78ea15e87a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl @@ -2,6 +2,24 @@   * @file sunLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl index f20886565a..78ea15e87a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl @@ -2,6 +2,24 @@   * @file sunLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl index 665d8126a0..2f880d65dd 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl @@ -1,8 +1,25 @@  /**    * @file sunLightSSAOF.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl index 32d1b2149a..abb64334ed 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl @@ -1,8 +1,25 @@  /**    * @file sunLightSSAOF.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl index 814deb3677..e7ab11c6ed 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl @@ -2,6 +2,24 @@   * @file sunLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl index d005f67bf6..c6578ea177 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl @@ -2,6 +2,24 @@   * @file terrainF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl b/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl index 3038fd2966..fc19a73709 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl @@ -2,6 +2,24 @@   * @file terrainV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl index de7e038402..56a149523e 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl @@ -2,6 +2,24 @@   * @file treeF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl index a9bef4292d..01401028d6 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl @@ -2,6 +2,24 @@   * @file treeV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl index 2710422d32..c3e7371c8e 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl @@ -2,6 +2,24 @@   * @file waterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl index 5397290b11..9d415ade85 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl @@ -2,6 +2,24 @@   * @file waterV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl index 32f5f5f236..e827863436 100644 --- a/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl +++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl @@ -2,6 +2,24 @@   * @file glowExtractF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl index 9267a8585d..c2cc8ed567 100644 --- a/indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl +++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl @@ -2,6 +2,24 @@   * @file glowExtractF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl b/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl index 76736fed53..8db6d1bf24 100644 --- a/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl +++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl @@ -2,6 +2,24 @@   * @file glowExtractV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/effects/glowF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowF.glsl index d3225546b3..75cff75ea9 100644 --- a/indra/newview/app_settings/shaders/class1/effects/glowF.glsl +++ b/indra/newview/app_settings/shaders/class1/effects/glowF.glsl @@ -2,6 +2,24 @@   * @file glowF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/effects/glowV.glsl b/indra/newview/app_settings/shaders/class1/effects/glowV.glsl index 9bb41626ae..a5aacc0196 100644 --- a/indra/newview/app_settings/shaders/class1/effects/glowV.glsl +++ b/indra/newview/app_settings/shaders/class1/effects/glowV.glsl @@ -2,6 +2,24 @@   * @file glowV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl index cdc2ca3da2..c61d5a2a08 100644 --- a/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl @@ -2,6 +2,24 @@   * @file terrainF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl index 8af981915b..917891c063 100644 --- a/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl @@ -2,6 +2,24 @@   * @file terrainV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl index d94d986581..711b42b95e 100644 --- a/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl @@ -2,6 +2,24 @@   * @file terrainWaterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl b/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl index 06854fcc0a..72e8e739b3 100644 --- a/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl @@ -2,6 +2,24 @@   * @file underWaterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/environment/waterF.glsl b/indra/newview/app_settings/shaders/class1/environment/waterF.glsl index 0f24e3c35a..4d555b566a 100644 --- a/indra/newview/app_settings/shaders/class1/environment/waterF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/waterF.glsl @@ -2,6 +2,24 @@   * @file waterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl index 630459b324..d44690d1fb 100644 --- a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl @@ -2,6 +2,24 @@   * @file waterFogF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl index 831d6a761c..610c06fbbc 100644 --- a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl @@ -2,6 +2,24 @@   * @file waterV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl b/indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl new file mode 100644 index 0000000000..27c63fdc8b --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl @@ -0,0 +1,35 @@ +/**  + * @file customalphaF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$ + */ +  +uniform sampler2D diffuseMap; + +uniform float custom_alpha; + +void main()  +{ +	vec4 color = gl_Color*texture2D(diffuseMap, gl_TexCoord[0].xy); +	color.a *= custom_alpha; +	gl_FragColor = color; +} diff --git a/indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl b/indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl new file mode 100644 index 0000000000..c4c896c35c --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl @@ -0,0 +1,34 @@ +/**  + * @file customalphaV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$ + */ +  + + +void main() +{ +	gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; +	gl_TexCoord[0] = gl_MultiTexCoord0; +	gl_FrontColor = gl_Color; +} + diff --git a/indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl b/indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl new file mode 100644 index 0000000000..b8963e1dec --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl @@ -0,0 +1,35 @@ +/**  + * @file glowcombineF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$ + */ +  +#extension GL_ARB_texture_rectangle : enable + +uniform sampler2D glowMap; +uniform sampler2DRect screenMap; + +void main()  +{ +	gl_FragColor = texture2D(glowMap, gl_TexCoord[0].xy) + +					texture2DRect(screenMap, gl_TexCoord[1].xy); +} diff --git a/indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl b/indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl new file mode 100644 index 0000000000..4c6360f71d --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl @@ -0,0 +1,33 @@ +/**  + * @file glowcombineV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$ + */ +  + +void main() +{ +	gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; +	gl_TexCoord[0] = gl_MultiTexCoord0; +	gl_TexCoord[1] = gl_MultiTexCoord1; +} + diff --git a/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl b/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl index f6c6d945de..a3cb5225ba 100644 --- a/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl @@ -2,6 +2,24 @@   * @file highlightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl b/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl index f114f766bf..da3bea6d06 100644 --- a/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl @@ -2,6 +2,24 @@   * @file highlightV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl b/indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl new file mode 100644 index 0000000000..57248699cb --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl @@ -0,0 +1,29 @@ +/**  + * @file occlusionF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$ + */ +  +void main()  +{ +	gl_FragColor = vec4(1,1,1,1); +} diff --git a/indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl b/indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl new file mode 100644 index 0000000000..915e452e0f --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl @@ -0,0 +1,30 @@ +/**  + * @file uiV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$ + */ + +void main() +{ +	gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; +} + diff --git a/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl b/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl new file mode 100644 index 0000000000..b1d2b949ac --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl @@ -0,0 +1,33 @@ +/**  + * @file twotextureaddF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$ + */ +  +uniform sampler2D tex0; + +void main()  +{ +	float alpha = texture2D(tex0, gl_TexCoord[0].xy).a * gl_Color.a; + +	gl_FragColor = vec4(gl_Color.rgb, alpha); +} diff --git a/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl b/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl new file mode 100644 index 0000000000..fedf6ae546 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl @@ -0,0 +1,34 @@ +/**  + * @file solidcolorV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$ + */ +  + + +void main() +{ +	gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; +	gl_FrontColor = gl_Color; +	gl_TexCoord[0] = gl_MultiTexCoord0; +} + diff --git a/indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl b/indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl new file mode 100644 index 0000000000..3408cc44f8 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl @@ -0,0 +1,32 @@ +/**  + * @file twotextureaddF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$ + */ +  +uniform sampler2D tex0; +uniform sampler2D tex1; + +void main()  +{ +	gl_FragColor = texture2D(tex0, gl_TexCoord[0].xy)+texture2D(tex1, gl_TexCoord[1].xy); +} diff --git a/indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl b/indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl new file mode 100644 index 0000000000..94aa964be6 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl @@ -0,0 +1,34 @@ +/**  + * @file twotextureaddV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$ + */ +  + + +void main() +{ +	gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; +	gl_TexCoord[0] = gl_MultiTexCoord0; +	gl_TexCoord[1] = gl_MultiTexCoord1; +} + diff --git a/indra/newview/app_settings/shaders/class1/interface/uiF.glsl b/indra/newview/app_settings/shaders/class1/interface/uiF.glsl new file mode 100644 index 0000000000..7694056b08 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/uiF.glsl @@ -0,0 +1,31 @@ +/**  + * @file uiF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$ + */ +  +uniform sampler2D diffuseMap; + +void main()  +{ +	gl_FragColor = gl_Color*texture2D(diffuseMap, gl_TexCoord[0].xy); +} diff --git a/indra/newview/app_settings/shaders/class1/interface/uiV.glsl b/indra/newview/app_settings/shaders/class1/interface/uiV.glsl new file mode 100644 index 0000000000..b1b90d0b5e --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/uiV.glsl @@ -0,0 +1,34 @@ +/**  + * @file uiV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$ + */ +  + + +void main() +{ +	gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; +	gl_TexCoord[0] = gl_MultiTexCoord0; +	gl_FrontColor = gl_Color; +} + diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl index 1796730c92..5cb3eb05a7 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl @@ -2,6 +2,24 @@   * @file lightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl index bfe0be9fdf..f3ba8b73a8 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl @@ -2,6 +2,24 @@   * @file lightFullbrightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl index 6f1fe91007..b4c8a9abce 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl @@ -2,6 +2,24 @@   * @file lightFullbrightShinyF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl index 19072cd052..925d6fbcfd 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl @@ -1,8 +1,25 @@  /**    * @file lightFullbrightShinyWaterF.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl index 0ae6dc89e2..71238f7d31 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl @@ -2,6 +2,24 @@   * @file lightFullbrightWaterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl index 5d4bf2c33e..85cddc647d 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl @@ -2,6 +2,24 @@   * @file lightFuncSpecularV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl index 574252af12..a9288b3df6 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl @@ -2,6 +2,24 @@   * @file lightFuncV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl index 29f575b7e5..7c9b7c218f 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl @@ -2,6 +2,24 @@   * @file lightShinyF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl index 65da5a6825..ca1af8fc79 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl @@ -2,6 +2,24 @@   * @file lightShinyWaterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl index d491f1102e..4a59b8245d 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl @@ -2,6 +2,24 @@   * @file lightV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl index ef38ee9699..742cb38d80 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl @@ -2,6 +2,24 @@   * @file lightV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl index 286c92326b..da76a977b6 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl @@ -2,6 +2,24 @@   * @file lightWaterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl b/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl index 772a420e33..3e0815226c 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl @@ -2,6 +2,24 @@   * @file sumLightsSpecularV.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl index da60a3ddf5..c271dbcd18 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl @@ -2,6 +2,24 @@   * @file sumLightsV.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl b/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl new file mode 100644 index 0000000000..11031a8829 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl @@ -0,0 +1,35 @@ +/**  + * @file bumpF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$ + */ +  +uniform sampler2D texture0; +uniform sampler2D texture1; + +void main()  +{ +	float tex0 = texture2D(texture0, gl_TexCoord[0].xy).a; +	float tex1 = texture2D(texture1, gl_TexCoord[1].xy).a; + +	gl_FragColor = vec4(tex0+(1.0-tex1)-0.5); +} diff --git a/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl b/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl new file mode 100644 index 0000000000..c50ed86315 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl @@ -0,0 +1,34 @@ +/**  + * @file bumpV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$ + */ +  + +void main() +{ +	//transform vertex +	gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex; +	gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; +	gl_TexCoord[1] = gl_TextureMatrix[1] * gl_MultiTexCoord1; +	gl_FrontColor = gl_Color; +} diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl index c0b72115dd..0fab5e5001 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl @@ -2,6 +2,24 @@   * @file fullbrightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl index 391c06edc8..b312665032 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl @@ -2,6 +2,24 @@   * @file fullbrightShinyF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl index f44a5ce32e..e1a7f263f7 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl @@ -1,8 +1,25 @@  /**    * @file shinySimpleSkinnedV.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ @@ -10,8 +27,6 @@  void calcAtmospherics(vec3 inPositionEye);  mat4 getObjectSkinnedTransform(); -attribute vec4 object_weight; -  void main()  {  	mat4 mat = getObjectSkinnedTransform(); diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl index 31e0f0a429..36b00dfbc1 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl @@ -2,6 +2,24 @@   * @file fullbrightShinyV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl index 8ffb252f57..e1f3919907 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl @@ -1,8 +1,25 @@  /**    * @file fullbrightShinyWaterF.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl index e5dafa8c78..b540054c56 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl @@ -1,8 +1,25 @@  /**    * @file fullbrightSkinnedV.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ @@ -10,8 +27,6 @@  void calcAtmospherics(vec3 inPositionEye);  mat4 getObjectSkinnedTransform(); -attribute vec4 object_weight; -  void main()  {  	//transform vertex diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl index 3382384c99..22f731ffde 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl @@ -2,6 +2,24 @@   * @file fullbrightV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl index 220f26614f..5d0ea0a8dd 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl @@ -2,6 +2,24 @@   * @file fullbrightWaterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/objects/impostorF.glsl b/indra/newview/app_settings/shaders/class1/objects/impostorF.glsl new file mode 100644 index 0000000000..92c09ce937 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/objects/impostorF.glsl @@ -0,0 +1,44 @@ +/**  + * @file impostorF.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ +  +uniform float minimum_alpha; +uniform float maximum_alpha; + +vec3 fullbrightAtmosTransport(vec3 light); +vec3 fullbrightScaleSoftClip(vec3 light); + +uniform sampler2D diffuseMap; + +void main() +{ +	vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy) * gl_Color; +	 +	if (color.a < minimum_alpha || color.a > maximum_alpha) +	{ +		discard; +	} + +	gl_FragColor = color; +} diff --git a/indra/newview/app_settings/shaders/class1/objects/impostorV.glsl b/indra/newview/app_settings/shaders/class1/objects/impostorV.glsl new file mode 100644 index 0000000000..eea51eba45 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/objects/impostorV.glsl @@ -0,0 +1,34 @@ +/** + * @file impostorV.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ +  +  +void main() +{ +	//transform vertex +	gl_Position = ftransform(); +	gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; +	 +	gl_FrontColor = gl_Color; +} diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl index d079de5377..f8f88e2577 100644 --- a/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl @@ -2,6 +2,24 @@   * @file shinyF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl index cd655f3bb5..f5fd4ededd 100644 --- a/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl @@ -1,8 +1,25 @@  /**    * @file shinySimpleSkinnedV.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ @@ -11,8 +28,6 @@ vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);  void calcAtmospherics(vec3 inPositionEye);  mat4 getObjectSkinnedTransform(); -attribute vec4 object_weight; -  void main()  {  	mat4 mat = getObjectSkinnedTransform(); diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl index 68a086dbc1..13a58f0d4a 100644 --- a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl @@ -2,6 +2,24 @@   * @file shinyV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl index 4649d1c47c..1e72e23eef 100644 --- a/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl @@ -2,6 +2,24 @@   * @file shinyWaterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl index b4e4dcfbbf..29a2ce617b 100644 --- a/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl @@ -2,6 +2,24 @@   * @file simpleF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl index 900448035c..ad171f7b43 100644 --- a/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl @@ -1,8 +1,25 @@  /**    * @file simpleSkinnedV.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ @@ -11,8 +28,6 @@ vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);  void calcAtmospherics(vec3 inPositionEye);  mat4 getObjectSkinnedTransform(); -attribute vec4 object_weight; -  void main()  {  	//transform vertex diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl index b493f76fcc..dc1794e132 100644 --- a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl @@ -2,6 +2,24 @@   * @file simpleV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl index 4ec5ee43b4..2e87ac5bbc 100644 --- a/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl @@ -2,6 +2,24 @@   * @file simpleWaterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl index 3d05850ab3..aacc503e13 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl @@ -2,6 +2,24 @@   * @file atmosphericsF.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl index f1a0af21af..15738e37e8 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl @@ -2,6 +2,24 @@   * @file atmosphericsHelpersV.glsl    *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl index 73bbd57315..76d7d5059d 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl @@ -2,6 +2,24 @@   * @file atmosphericsV.glsl    *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl index e0eb7b3767..dbacf28637 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl @@ -2,6 +2,24 @@   * @file atmosphericVarsF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl index a251213ff5..e051ac9851 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl @@ -2,6 +2,24 @@   * @file atmosphericVarsV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl b/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl index 4958cb2f72..62f4e51449 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl @@ -2,6 +2,24 @@   * @file gammaF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl b/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl index 75929bc609..7c95ecdb14 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl @@ -2,6 +2,24 @@   * @file transportF.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl b/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl index 3e8b719f93..f9f376c2b7 100644 --- a/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl +++ b/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl @@ -2,6 +2,24 @@   * @file eyeballV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl index 681e52de2a..839606cdcb 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl @@ -2,6 +2,24 @@   * @file alphaF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl index 5350359f75..84e49a5f8f 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl @@ -2,6 +2,24 @@   * @file alphaF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl index 948a52da5b..20121da52d 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl @@ -1,8 +1,25 @@  /**    * @file alphaSkinnedV.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl index f616ecc872..307ae30098 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl @@ -2,6 +2,24 @@   * @file alphaV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl index 01e40afc4f..80f386ecb0 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl @@ -2,6 +2,24 @@   * @file avatarAlphaV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl b/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl index 729e4b5543..d9eafb6eba 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl @@ -2,6 +2,24 @@   * @file edgeF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl index b22bc5b288..a84fdd5dc1 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl @@ -2,6 +2,24 @@   * @file edgeF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl b/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl index 393084a3db..9deff7bb2a 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl @@ -2,6 +2,24 @@   * @file edgeV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl index f54186ffca..0b31cbefd1 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl @@ -2,6 +2,24 @@   * @file multiSpotLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl index fee32be3e3..1afa9a9fb4 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl @@ -2,6 +2,24 @@   * @file multiSpotLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl index 66a1a8515f..d7407332e5 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -2,6 +2,24 @@   * @file softenLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ @@ -267,34 +285,49 @@ void main()  	float da = max(dot(norm.xyz, vary_light.xyz), 0.0);  	vec4 diffuse = texture2DRect(diffuseRect, tc); -	vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); -	 -	vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg; -	float scol = max(scol_ambocc.r, diffuse.a);  -	float ambocc = scol_ambocc.g; + +	vec3 col; +	float bloom = 0.0; + +	if (diffuse.a < 0.9) +	{ +		vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); +		 +		vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg; +		float scol = max(scol_ambocc.r, diffuse.a);  +		float ambocc = scol_ambocc.g; -	calcAtmospherics(pos.xyz, ambocc); +		calcAtmospherics(pos.xyz, ambocc); -	vec3 col = atmosAmbient(vec3(0)); -	col += atmosAffectDirectionalLight(max(min(da, scol), diffuse.a)); +		col = atmosAmbient(vec3(0)); +		col += atmosAffectDirectionalLight(max(min(da, scol), diffuse.a)); -	col *= diffuse.rgb; +		col *= diffuse.rgb; -	if (spec.a > 0.0) // specular reflection +		if (spec.a > 0.0) // specular reflection +		{ +			// the old infinite-sky shiny reflection +			// +			vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); +			float sa = dot(refnormpersp, vary_light.xyz); +			vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*texture2D(lightFunc, vec2(sa, spec.a)).a; + +			// add the two types of shiny together +			vec3 spec_contrib = dumbshiny * spec.rgb; +			bloom = dot(spec_contrib, spec_contrib); +			col += spec_contrib; +		} +			 +		col = atmosLighting(col); +		col = scaleSoftClip(col); + +		col = mix(col, diffuse.rgb, diffuse.a); +	} +	else  	{ -		// the old infinite-sky shiny reflection -		// -		vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); -		float sa = dot(refnormpersp, vary_light.xyz); -		vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*texture2D(lightFunc, vec2(sa, spec.a)).a; - -		// add the two types of shiny together -		col += dumbshiny * spec.rgb; +		col = diffuse.rgb;  	} -	 -	col = atmosLighting(col); -	col = scaleSoftClip(col);  	gl_FragColor.rgb = col; -	gl_FragColor.a = 0.0; +	gl_FragColor.a = bloom;  } diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightMSF.glsl index 0bae10ca7d..1244294451 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightMSF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightMSF.glsl @@ -2,6 +2,24 @@   * @file softenLightMSF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ @@ -255,7 +273,7 @@ void main()  	vec2 tc = vary_fragcoord.xy;  	ivec2 itc = ivec2(tc); -	vec3 fcol = vec3(0,0,0); +	vec4 fcol = vec4(0,0,0,0);  	vec2 scol_ambocc = texture2DRect(lightMap, tc).rg;  	float ambocc = scol_ambocc.g; @@ -270,38 +288,50 @@ void main()  		float da = max(dot(norm.xyz, vary_light.xyz), 0.0);  		vec4 diffuse = texelFetch(diffuseRect, itc, i); -		vec4 spec = texelFetch(specularRect, itc, i); +		vec3 col; +		float bloom = 0.0; +		if (diffuse.a < 0.9) +		{ +			vec4 spec = texelFetch(specularRect, itc, i); -		float amb = 0; +			float amb = 0; -		float scol = max(scol_ambocc.r, diffuse.a);  -		amb += ambocc; +			float scol = max(scol_ambocc.r, diffuse.a);  +			amb += ambocc; -		calcAtmospherics(pos.xyz, ambocc); +			calcAtmospherics(pos.xyz, ambocc); +	 +			col = atmosAmbient(vec3(0)); +			col += atmosAffectDirectionalLight(max(min(da, scol), diffuse.a)); -		vec3 col = atmosAmbient(vec3(0)); -		col += atmosAffectDirectionalLight(max(min(da, scol), diffuse.a)); +			col *= diffuse.rgb; -		col *= diffuse.rgb; +			if (spec.a > 0.0) // specular reflection +			{ +				// the old infinite-sky shiny reflection +				// +				vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); +				float sa = dot(refnormpersp, vary_light.xyz); +				vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*texture2D(lightFunc, vec2(sa, spec.a)).a; + +				// add the two types of shiny together +				vec3 spec_contrib = dumbshiny * spec.rgb; +				bloom = dot(spec_contrib, spec_contrib); +				col += spec_contrib; +			} -		if (spec.a > 0.0) // specular reflection +			col = atmosLighting(col); +			col = scaleSoftClip(col); + +			col = mix(col, diffuse.rgb, diffuse.a); +		} +		else  		{ -			// the old infinite-sky shiny reflection -			// -			vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); -			float sa = dot(refnormpersp, vary_light.xyz); -			vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*texture2D(lightFunc, vec2(sa, spec.a)).a; - -			// add the two types of shiny together -			col += dumbshiny * spec.rgb; +			col = diffuse.rgb;  		} -	 -		col = atmosLighting(col); -		col = scaleSoftClip(col); -		fcol += col; +		fcol += vec4(col, bloom);  	} -	gl_FragColor.rgb = fcol/samples;  -	gl_FragColor.a = 0.0; +	gl_FragColor = fcol/samples;   } diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl index 745cc01992..fed238510a 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl @@ -2,6 +2,24 @@   * @file softenLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl index cd3828fbd4..25270f4939 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl @@ -2,6 +2,24 @@   * @file spotLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl index ec9b547a47..4962e73e39 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl @@ -2,6 +2,24 @@   * @file multiSpotLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl index 315139b415..1809cff1e5 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl @@ -2,6 +2,24 @@   * @file sunLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl index 63d13c996d..ac4fe52655 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl @@ -2,6 +2,24 @@   * @file sunLightMSF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl index d53850b489..681186d6b2 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl @@ -1,8 +1,25 @@  /**    * @file sunLightSSAOF.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOMSF.glsl index a2a76eed9f..0fd7b7525d 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOMSF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOMSF.glsl @@ -1,8 +1,25 @@  /**    * @file sunLightSSAOF.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl index 814deb3677..e7ab11c6ed 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl @@ -2,6 +2,24 @@   * @file sunLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/effects/blurF.glsl b/indra/newview/app_settings/shaders/class2/effects/blurF.glsl index dff4d4a68f..35411db04b 100644 --- a/indra/newview/app_settings/shaders/class2/effects/blurF.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/blurF.glsl @@ -2,6 +2,24 @@   * @file blurf.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/effects/blurV.glsl b/indra/newview/app_settings/shaders/class2/effects/blurV.glsl index de469542f9..3e47ed15fe 100644 --- a/indra/newview/app_settings/shaders/class2/effects/blurV.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/blurV.glsl @@ -2,6 +2,24 @@   * @file blurV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl b/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl index 8871bb3fc7..42ab8d40e8 100644 --- a/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl @@ -2,6 +2,24 @@   * @file colorFilterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl b/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl index 9c52b8dd5d..25806cd914 100644 --- a/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl @@ -2,6 +2,24 @@   * @file drawQuadV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/effects/extractF.glsl b/indra/newview/app_settings/shaders/class2/effects/extractF.glsl index 713f8021de..9187c8ec31 100644 --- a/indra/newview/app_settings/shaders/class2/effects/extractF.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/extractF.glsl @@ -2,6 +2,24 @@   * @file extractF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl b/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl index fd94b2e95f..76b675a9bd 100644 --- a/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl @@ -2,6 +2,24 @@   * @file nightVisionF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl b/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl index a1a9c9716c..abf1be6645 100644 --- a/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl @@ -2,6 +2,24 @@   * @file simpleF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl b/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl index 9527dc469b..df08fce0da 100644 --- a/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl +++ b/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl @@ -2,6 +2,24 @@   * @file terrainF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl b/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl index 2658bee88d..36d0c99b63 100644 --- a/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl +++ b/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl @@ -2,6 +2,24 @@   * @file terrainV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl b/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl index 974e227b77..90468b45a2 100644 --- a/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl +++ b/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl @@ -2,6 +2,24 @@   * @file terrainWaterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl b/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl index 702e0881ac..f947aa4be1 100644 --- a/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl +++ b/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl @@ -2,6 +2,24 @@   * @file underWaterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/environment/waterF.glsl b/indra/newview/app_settings/shaders/class2/environment/waterF.glsl index c4e4bc08c5..dc543b2231 100644 --- a/indra/newview/app_settings/shaders/class2/environment/waterF.glsl +++ b/indra/newview/app_settings/shaders/class2/environment/waterF.glsl @@ -2,6 +2,24 @@   * @file waterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl b/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl index b66b72b401..4bdfce9260 100644 --- a/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl +++ b/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl @@ -2,6 +2,24 @@   * @file waterFogF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightAlphaMaskF.glsl new file mode 100644 index 0000000000..4c05329065 --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/lighting/lightAlphaMaskF.glsl @@ -0,0 +1,48 @@ +/**  + * @file lightAlphaMaskF.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ +  + +uniform float minimum_alpha; +uniform float maximum_alpha; + +vec3 atmosLighting(vec3 light); +vec3 scaleSoftClip(vec3 light); + +void default_lighting()  +{ +	vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color; +	 +	if (color.a < minimum_alpha || color.a > maximum_alpha) +	{ +		discard; +	} + +	color.rgb = atmosLighting(color.rgb); + +	color.rgb = scaleSoftClip(color.rgb); + +	gl_FragColor = color; +} + diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightAlphaMaskNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightAlphaMaskNonIndexedF.glsl new file mode 100644 index 0000000000..0de909353e --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/lighting/lightAlphaMaskNonIndexedF.glsl @@ -0,0 +1,51 @@ +/**  + * @file lightAlphaMaskNonIndexedF.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ +  + +uniform float minimum_alpha; +uniform float maximum_alpha; + + +uniform sampler2D diffuseMap; + +vec3 atmosLighting(vec3 light); +vec3 scaleSoftClip(vec3 light); + +void default_lighting()  +{ +	vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy) * gl_Color; + +	if (color.a < minimum_alpha || color.a > maximum_alpha) +	{ +		discard; +	} + +	color.rgb = atmosLighting(color.rgb); + +	color.rgb = scaleSoftClip(color.rgb); + +	gl_FragColor = color; +} + diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl index 4c31602736..d12d88f1c5 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl @@ -2,6 +2,24 @@   * @file lightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightAlphaMaskF.glsl new file mode 100644 index 0000000000..8c7713c08d --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightAlphaMaskF.glsl @@ -0,0 +1,47 @@ +/**  + * @file lightFullbrightAlphaMaskF.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ +  +uniform float minimum_alpha; +uniform float maximum_alpha; + +vec3 fullbrightAtmosTransport(vec3 light); +vec3 fullbrightScaleSoftClip(vec3 light); + +void fullbright_lighting() +{ +	vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color; +	 +	if (color.a < minimum_alpha || color.a > maximum_alpha) +	{ +		discard; +	} + +	color.rgb = fullbrightAtmosTransport(color.rgb); +	 +	color.rgb = fullbrightScaleSoftClip(color.rgb); + +	gl_FragColor = color; +} + diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl index 95bd052b5d..f03b1fdc74 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl @@ -2,6 +2,24 @@   * @file lightFullbrightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl new file mode 100644 index 0000000000..89468b9665 --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl @@ -0,0 +1,49 @@ +/**  + * @file lightFullbrightNonIndexedAlphaMaskF.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ +  +uniform float minimum_alpha; +uniform float maximum_alpha; + +vec3 fullbrightAtmosTransport(vec3 light); +vec3 fullbrightScaleSoftClip(vec3 light); + +uniform sampler2D diffuseMap; + +void fullbright_lighting() +{ +	vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy) * gl_Color; +	 +	if (color.a < minimum_alpha || color.a > maximum_alpha) +	{ +		discard; +	} + +	color.rgb = fullbrightAtmosTransport(color.rgb); +	 +	color.rgb = fullbrightScaleSoftClip(color.rgb); + +	gl_FragColor = color; +} + diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl index b1e61e1a33..a909ff608a 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl @@ -2,6 +2,24 @@   * @file lightFullbrightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl index 26f0ea84e0..d2bc912edb 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl @@ -2,6 +2,24 @@   * @file lightFullbrightShinyF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl index 953298da0d..af73168c13 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl @@ -2,6 +2,24 @@   * @file lightFullbrightShinyF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl index a6e10a249d..e9dab85095 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl @@ -1,8 +1,25 @@  /**    * @file lightFullbrightShinyWaterF.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl index b4bb665a2b..e0a7986705 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl @@ -1,8 +1,25 @@  /**    * @file lightFullbrightShinyWaterF.glsl - * - * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. - * $License$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterAlphaMaskF.glsl new file mode 100644 index 0000000000..e5998b77a9 --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterAlphaMaskF.glsl @@ -0,0 +1,47 @@ +/**  + * @file lightFullbrightWaterAlphaMaskF.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ + +uniform float minimum_alpha; +uniform float maximum_alpha; + +vec4 diffuseLookup(vec2 texcoord); + +vec3 fullbrightAtmosTransport(vec3 light); +vec4 applyWaterFog(vec4 color); + +void fullbright_lighting_water() +{ +	vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color; + +	if (color.a < minimum_alpha || color.a > maximum_alpha) +	{ +		discard; +	} + +	color.rgb = fullbrightAtmosTransport(color.rgb); +	 +	gl_FragColor = applyWaterFog(color); +} + diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl index 887d4130e7..20ff3712af 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl @@ -2,6 +2,24 @@   * @file lightFullbrightWaterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl new file mode 100644 index 0000000000..3fdd110f7d --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl @@ -0,0 +1,47 @@ +/**  + * @file lightFullbrightWaterNonIndexedAlphaMaskF.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ +  +uniform float minimum_alpha; +uniform float maximum_alpha; + +uniform sampler2D diffuseMap; + +vec3 fullbrightAtmosTransport(vec3 light); +vec4 applyWaterFog(vec4 color); + +void fullbright_lighting_water() +{ +	vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color; + +	if (color.a < minimum_alpha || color.a > maximum_alpha) +	{ +		discard; +	} + +	color.rgb = fullbrightAtmosTransport(color.rgb); +	 +	gl_FragColor = applyWaterFog(color); +} + diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl index 1234682ae9..01b89019b1 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl @@ -2,6 +2,24 @@   * @file lightFullbrightWaterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightNonIndexedF.glsl index 149cf791f5..d419c2d116 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightNonIndexedF.glsl @@ -2,6 +2,24 @@   * @file lightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl index 300fcac092..ba4cd949d6 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl @@ -2,6 +2,24 @@   * @file lightShinyF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl index e877c0abb1..3b30ebf6f1 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl @@ -2,6 +2,24 @@   * @file lightShinyF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl index 07572fa915..c451e68763 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl @@ -2,6 +2,24 @@   * @file lightShinyWaterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl index 3904179427..eeb997fb5f 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl @@ -2,6 +2,24 @@   * @file lightShinyWaterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl index 3384f64d07..24bf9b3cee 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl @@ -2,6 +2,24 @@   * @file lightSpecularV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl index 10c770fcc2..8045809b82 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl @@ -2,6 +2,24 @@   * @file lightV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightWaterAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightWaterAlphaMaskF.glsl new file mode 100644 index 0000000000..072dcaa6b6 --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/lighting/lightWaterAlphaMaskF.glsl @@ -0,0 +1,45 @@ +/**  + * @file lightWaterAlphaMaskF.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ +  +uniform float minimum_alpha; +uniform float maximum_alpha; + +vec3 atmosLighting(vec3 light); +vec4 applyWaterFog(vec4 color); + +void default_lighting_water() +{ +	vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color; + +	if (color.a < minimum_alpha || color.a > maximum_alpha) +	{ +		discard; +	} + +	color.rgb = atmosLighting(color.rgb); + +	gl_FragColor = applyWaterFog(color); +} + diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightWaterAlphaMaskNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightWaterAlphaMaskNonIndexedF.glsl new file mode 100644 index 0000000000..2df34da4b4 --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/lighting/lightWaterAlphaMaskNonIndexedF.glsl @@ -0,0 +1,49 @@ +/**  + * @file lightWaterAlphaMaskNonIndexedF.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ +  +uniform float minimum_alpha; +uniform float maximum_alpha; + +uniform sampler2D diffuseMap; + +vec3 atmosLighting(vec3 light); +vec4 applyWaterFog(vec4 color); + +void default_lighting_water() +{ +	vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy) * gl_Color; + +	if (color.a < minimum_alpha || color.a > maximum_alpha) +	{ +		discard; +	} + +	color.rgb = atmosLighting(color.rgb); + +	color = applyWaterFog(color); +	 +	gl_FragColor = color; +} + diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl index 61341a9f1f..ae7be4d231 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl @@ -2,6 +2,24 @@   * @file lightWaterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl index ba850b61d0..5a86dad827 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl @@ -2,6 +2,24 @@   * @file lightWaterF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl b/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl index 8df2e6f222..d0a12479db 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl @@ -2,6 +2,24 @@   * @file sumLightsV.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl index 3d43a1813a..ad045a3058 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl @@ -2,6 +2,24 @@   * @file sumLightsV.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl b/indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl index f49e74406f..819b28e4fd 100644 --- a/indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl +++ b/indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl @@ -2,6 +2,24 @@   * @file fullbrightShinyV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/objects/fullbrightV.glsl b/indra/newview/app_settings/shaders/class2/objects/fullbrightV.glsl index 3076fa3260..abf6e37b7c 100644 --- a/indra/newview/app_settings/shaders/class2/objects/fullbrightV.glsl +++ b/indra/newview/app_settings/shaders/class2/objects/fullbrightV.glsl @@ -2,6 +2,24 @@   * @file fullbrightV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl b/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl index 49992d3535..44c711701b 100644 --- a/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl +++ b/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl @@ -2,6 +2,24 @@   * @file shinyV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/objects/simpleV.glsl b/indra/newview/app_settings/shaders/class2/objects/simpleV.glsl index 5e02391767..b0114763c1 100644 --- a/indra/newview/app_settings/shaders/class2/objects/simpleV.glsl +++ b/indra/newview/app_settings/shaders/class2/objects/simpleV.glsl @@ -2,6 +2,24 @@   * @file simpleV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl index 21a0812c1b..fea3cbf69b 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl @@ -2,6 +2,24 @@   * @file atmosphericsF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl index ab4cf4806d..62a034ce05 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl @@ -2,6 +2,24 @@   * @file atmosphericsHelpersV.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl index b61b0bb396..be990c1757 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl @@ -2,6 +2,24 @@   * @file atmosphericsV.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl index 3a6585bb33..a98c04b259 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl @@ -2,6 +2,24 @@   * @file atmosphericVars.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl index 0f6e231ca6..7c3cb88b3c 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl @@ -2,6 +2,24 @@   * @file atmosphericVars.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl index 20f907a006..b90cec119b 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl @@ -2,6 +2,24 @@   * @file WLCloudsF.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl index 3eac63076c..c175a834c2 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl @@ -2,6 +2,24 @@   * @file WLCloudsV.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl b/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl index 6570dcb608..478373d729 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl @@ -2,6 +2,24 @@   * @file gammaF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl index d14c638130..ac569e8257 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl @@ -2,6 +2,24 @@   * @file WLSkyF.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl index 1ea00f723a..3a44bb6d26 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl @@ -2,6 +2,24 @@   * @file WLSkyV.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl b/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl index 28381482c1..8a8e4cb0f6 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl @@ -2,6 +2,24 @@   * @file transportF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl b/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl index 3d970d252c..151602dbc0 100644 --- a/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl +++ b/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl @@ -2,6 +2,24 @@   * @file avatarV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl index 498fee7c66..616ea5fe9e 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl @@ -2,6 +2,24 @@   * @file giDownsampleF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl index eebe930666..6231ee68b7 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl @@ -2,6 +2,24 @@   * @file postgiV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class3/deferred/giF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giF.glsl index 9896f8dafe..95913a502c 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/giF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/giF.glsl @@ -2,6 +2,24 @@   * @file giF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl index df4c6b3e0a..7c55fcc286 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl @@ -2,6 +2,24 @@   * @file giFinalF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ @@ -24,4 +42,4 @@ void main()  	gl_FragColor = bloom + diff;  	//gl_FragColor.rgb = vec3(texture2DRect(edgeMap, vary_fragcoord.xy).a); -}
\ No newline at end of file +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl b/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl index 7e20d71529..a6a206502c 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl @@ -2,6 +2,24 @@   * @file giFinalV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class3/deferred/giV.glsl b/indra/newview/app_settings/shaders/class3/deferred/giV.glsl index e86f2896da..190e32b6a3 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/giV.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/giV.glsl @@ -2,6 +2,24 @@   * @file giV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl b/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl index 980def6443..13517a26ba 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl @@ -2,6 +2,24 @@   * @file luminanceF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl b/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl index 9afeac6ddf..2d99ef5481 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl @@ -2,6 +2,24 @@   * @file giV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl index 6d4c20f68c..0364da6258 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl @@ -2,6 +2,24 @@   * @file postDeferredF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl b/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl index 876f65ee3a..cb83dda795 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl @@ -2,6 +2,24 @@   * @file postDeferredV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl b/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl index fc65881680..009b5cc743 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl @@ -2,6 +2,24 @@   * @file postgiF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl b/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl index eebe930666..6231ee68b7 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl @@ -2,6 +2,24 @@   * @file postgiV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl index d38d33cc21..1c02adea89 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl @@ -2,6 +2,24 @@   * @file softenLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ @@ -268,91 +286,50 @@ void main()  	float da = max(dot(norm.xyz, vary_light.xyz), 0.0);  	vec4 diffuse = texture2DRect(diffuseRect, tc); -	vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); +	vec3 col; +	float bloom = 0.0; + +	if (diffuse.a < 0.9) +	{ +		vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); -	da = texture2D(lightFunc, vec2(da, 0.0)).a; +		da = texture2D(lightFunc, vec2(da, 0.0)).a; -	vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg; -	float scol = max(scol_ambocc.r, diffuse.a);  -	float ambocc = scol_ambocc.g; +		vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg; +		float scol = max(scol_ambocc.r, diffuse.a);  +		float ambocc = scol_ambocc.g; -	calcAtmospherics(pos.xyz, ambocc); +		calcAtmospherics(pos.xyz, ambocc); -	vec3 col = atmosAmbient(vec3(0)); -	col += atmosAffectDirectionalLight(max(min(da, scol), diffuse.a)); +		col = atmosAmbient(vec3(0)); +		col += atmosAffectDirectionalLight(max(min(da, scol), diffuse.a)); -	col *= diffuse.rgb; +		col *= diffuse.rgb; -	if (spec.a > 0.0) // specular reflection +		if (spec.a > 0.0) // specular reflection +		{ +			// the old infinite-sky shiny reflection +			// +			vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); +			float sa = dot(refnormpersp, vary_light.xyz); +			vec3 dumbshiny = vary_SunlitColor*scol*texture2D(lightFunc, vec2(sa, spec.a)).a; +		 +			// add the two types of shiny together +			vec3 spec_contrib = dumbshiny * spec.rgb; +			bloom = dot(spec_contrib, spec_contrib); +			col += spec_contrib;		 +		} +	 +		col = atmosLighting(col); +		col = scaleSoftClip(col); + +		col = mix(col, diffuse.rgb, diffuse.a); +	} +	else  	{ -		// the old infinite-sky shiny reflection -		// -		vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); -		float sa = dot(refnormpersp, vary_light.xyz); -		vec3 dumbshiny = vary_SunlitColor*scol*texture2D(lightFunc, vec2(sa, spec.a)).a; - -		/* -		// screen-space cheap fakey reflection map -		// -		vec3 refnorm = normalize(reflect(vec3(0,0,-1), norm.xyz)); -		depth -= 0.5; // unbias depth -		// first figure out where we'll make our 2D guess from -		vec2 ref2d = (0.25 * screen_res.y) * (refnorm.xy) * abs(refnorm.z) / depth; -		// Offset the guess source a little according to a trivial -		// checkerboard dither function and spec.a. -		// This is meant to be similar to sampling a blurred version -		// of the diffuse map.  LOD would be better in that regard. -		// The goal of the blur is to soften reflections in surfaces -		// with low shinyness, and also to disguise our lameness. -		float checkerboard = floor(mod(tc.x+tc.y, 2.0)); // 0.0, 1.0 -		float checkoffset = (3.0 + (7.0*(1.0-spec.a)))*(checkerboard-0.5); - -		ref2d += vec2(checkoffset, checkoffset); -		ref2d += tc.xy; // use as offset from destination -		// Get attributes from the 2D guess point. -		// We average two samples of diffuse (not of anything else) per -		// pixel to try to reduce aliasing some more. -		vec3 refcol = 0.5 * (texture2DRect(diffuseRect, ref2d + vec2(0.0, -checkoffset)).rgb + -				     texture2DRect(diffuseRect, ref2d + vec2(-checkoffset, 0.0)).rgb); -		float refdepth = texture2DRect(depthMap, ref2d).a; -		vec3 refpos = getPosition_d(ref2d, refdepth).xyz; -		float refshad = texture2DRect(lightMap, ref2d).r; -		vec3 refn = texture2DRect(normalMap, ref2d).rgb; -		refn = vec3((refn.xy-0.5)*2.0,refn.z); // unpack norm -		refn = normalize(refn); -		// figure out how appropriate our guess actually was -		float refapprop = max(0.0, dot(-refnorm, normalize(pos - refpos))); -		// darken reflections from points which face away from the reflected ray - our guess was a back-face -		//refapprop *= step(dot(refnorm, refn), 0.0); -		refapprop = min(refapprop, max(0.0, -dot(refnorm, refn))); // more conservative variant -		// get appropriate light strength for guess-point. -		// reflect light direction to increase the illusion that -		// these are reflections. -		vec3 reflight = reflect(lightnorm.xyz, norm.xyz); -		float reflit = min(max(dot(refn, reflight.xyz), 0.0), refshad); -		// apply sun color to guess-point, dampen according to inappropriateness of guess -		float refmod = min(refapprop, reflit); -		vec3 refprod = vary_SunlitColor * refcol.rgb * refmod; -		vec3 ssshiny = (refprod * spec.a); -		ssshiny *= 0.3; // dampen it even more -		*/ -		vec3 ssshiny = vec3(0,0,0); - -		// add the two types of shiny together -		col += (ssshiny + dumbshiny) * spec.rgb; +		col = diffuse.rgb;  	} -	 -	col = atmosLighting(col); -	col = scaleSoftClip(col);  	gl_FragColor.rgb = col; -	 -	//gl_FragColor.rgb = gi_col.rgb; -	gl_FragColor.a = 0.0; -	 -	//gl_FragColor.rg = scol_ambocc.rg; -	//gl_FragColor.rgb = texture2DRect(lightMap, vary_fragcoord.xy).rgb; -	//gl_FragColor.rgb = norm.rgb*0.5+0.5; -	//gl_FragColor.rgb = vec3(ambocc); -	//gl_FragColor.rgb = vec3(scol); +	gl_FragColor.a = bloom;  } diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl index 745cc01992..fed238510a 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl @@ -2,6 +2,24 @@   * @file softenLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl index de7e038402..56a149523e 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl @@ -2,6 +2,24 @@   * @file treeF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$   */ diff --git a/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl b/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl index 92347a5b4a..79bd017efc 100644 --- a/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl +++ b/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl @@ -2,6 +2,24 @@   * @file sumLightsV.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl index 24bbc0a1a1..dcdc72ac02 100644 --- a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl +++ b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl @@ -2,6 +2,24 @@   * @file sumLightsV.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$   */ diff --git a/indra/newview/app_settings/toolbars.xml b/indra/newview/app_settings/toolbars.xml new file mode 100644 index 0000000000..f2192a75ad --- /dev/null +++ b/indra/newview/app_settings/toolbars.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toolbars> +  <bottom_toolbar +    button_display_mode="icons_with_text"> +    <command name="chat"/> +    <command name="speak"/> +    <command name="destinations"/> +    <command name="people"/> +    <command name="profile"/> +    <command name="view"/> +    <command name="move"/> +    <command name="howto"/> +  </bottom_toolbar> +  <left_toolbar +    button_display_mode="icons_only"> +    <command name="avatar"/> +    <command name="appearance"/> +    <command name="inventory"/> +    <command name="search"/> +    <command name="places"/> +    <command name="voice"/> +    <command name="minimap"/> +  </left_toolbar> +</toolbars> diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index 22c79a4cbd..e12c2f7853 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -1,6 +1,6 @@ -version 30 +version 32 -// NOTE: This is mostly identical to featuretable_mac.txt with a few differences +// NOTE: This is mostly identical to featuretable_mac.txt with a few differences   // Should be combined into one table  // @@ -88,7 +88,7 @@ RenderTerrainLODFactor		1	1  RenderTransparentWater		1	0  RenderTreeLODFactor			1	0  RenderUseImpostors			1	1 -RenderVolumeLODFactor		1	0.5 +RenderVolumeLODFactor		1	1.125  VertexShaderEnable			1	0  WindLightUseAtmosShaders	1	0  WLSkyDetail					1	48 @@ -244,10 +244,10 @@ RenderDeferredSSAO			0	0  RenderShadowDetail			0	0  // -// No GL_ARB_map_buffer_range +// GL_ARB_map_buffer_range exists  // -list NoMapBufferRange -RenderVBOMappingDisable		1	0 +list MapBufferRange +RenderVBOMappingDisable		1	1  // diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index 649f5ebd18..6e962f3c56 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -1,4 +1,4 @@ -version 25 +version 27  // NOTE: This is mostly identical to featuretable_mac.txt with a few differences  // Should be combined into one table @@ -242,10 +242,10 @@ RenderDeferredSSAO			0	0  RenderShadowDetail			0	0  // -// No GL_ARB_map_buffer_range +// GL_ARB_map_buffer_range exists  // -list NoMapBufferRange -RenderVBOMappingDisable		1	0 +list MapBufferRange +RenderVBOMappingDisable		1	1 diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index ee08e78af5..2690e8ec70 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -1,4 +1,4 @@ -version 26 +version 30  // NOTE: This is mostly identical to featuretable_mac.txt with a few differences  // Should be combined into one table @@ -47,8 +47,8 @@ RenderTerrainLODFactor			1	2.0  RenderTransparentWater			1	1  RenderTreeLODFactor				1	1.0  RenderUseImpostors				1	1 -RenderVBOEnable					1	1 -RenderVBOMappingDisable		1	1 +RenderVBOEnable					1	0 +RenderVBOMappingDisable		1	0  RenderVolumeLODFactor			1	2.0  UseStartScreen				1	1  UseOcclusion					1	1 @@ -63,7 +63,7 @@ RenderDeferred				1	1  RenderDeferredSSAO			1	1  RenderShadowDetail			1	2  WatchdogDisabled				1	1 -RenderUseStreamVBO			1	1 +RenderUseStreamVBO			1	0  RenderFSAASamples			1	16  // @@ -244,13 +244,6 @@ RenderDeferredSSAO			0	0  RenderShadowDetail			0	0  // -// No GL_ARB_map_buffer_range -// -list NoMapBufferRange -RenderVBOMappingDisable		1	0 - - -//  // "Default" setups for safe, low, medium, high  //  list safe diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt index ba74f9a6c2..a0245f5369 100644 --- a/indra/newview/featuretable_xp.txt +++ b/indra/newview/featuretable_xp.txt @@ -1,4 +1,4 @@ -version 30 +version 31  // NOTE: This is mostly identical to featuretable_mac.txt with a few differences  // Should be combined into one table @@ -244,10 +244,10 @@ RenderDeferredSSAO			0	0  RenderShadowDetail			0	0  // -// No GL_ARB_map_buffer_range +// GL_ARB_map_buffer_range exists  // -list NoMapBufferRange -RenderVBOMappingDisable		1	0 +list MapBufferRange +RenderVBOMappingDisable		1	1  // diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt index 6ed4e3b7f7..b7d951e018 100644 --- a/indra/newview/gpu_table.txt +++ b/indra/newview/gpu_table.txt @@ -5,6 +5,10 @@  // against driver strings, a class number, and whether we claim  // to support them or not.  // +// Case is not significant in either the regular expressions or the +// driver strings; the recognizer code lowercases both before using +// them. +//  // If you modify this table, use the (perl) gpu_table_tester  // to compare the results of recognizing known cards (it is easy  // to mess this up by putting things in the wrong order): @@ -12,13 +16,13 @@  // perl ../../scripts/gpu_table_tester -g gpu_table.txt tests/gpus_seen.txt | diff - tests/gpus_results.txt  //  // Format: -//   Fields are separated by one or more tab (not space) characters -//   <recognizer name>	<regular expression>	<class>		<supported> +//	 Fields are separated by one or more tab (not space) characters +//	 <recognizer name>	<regular expression>	<class>		<supported>  //  // Class Numbers: -//		0 - Defaults to low graphics settings.  No shaders on by default -//		1 - Defaults to mid graphics settings.  Basic shaders on by default -//		2 - Defaults to high graphics settings.  Atmospherics on by default. +//		0 - Defaults to low graphics settings.	No shaders on by default +//		1 - Defaults to mid graphics settings.	Basic shaders on by default +//		2 - Defaults to high graphics settings.	 Atmospherics on by default.  //		3 - Same as class 2 for now.  //  // Supported Number: @@ -39,7 +43,8 @@ ATI All-in-Wonder X800			.*ATI.*All-in-Wonder X8.*					2		1  ATI All-in-Wonder X1800			.*ATI.*All-in-Wonder X18.*					3		1  ATI All-in-Wonder X1900			.*ATI.*All-in-Wonder X19.*					3		1  ATI All-in-Wonder PCI-E			.*ATI.*All-in-Wonder.*PCI-E.*				1		1 -ATI All-in-Wonder Radeon 		.*ATI.*All-in-Wonder Radeon.*				0		1 +ATI All-in-Wonder Radeon		.*ATI.*All-in-Wonder Radeon.*				0		1 +ATI ASUS ARES					.*ATI.*ASUS.*ARES.*							3		1  ATI ASUS A9xxx					.*ATI.*ASUS.*A9.*							1		1  ATI ASUS AH24xx					.*ATI.*ASUS.*AH24.*							1		1  ATI ASUS AH26xx					.*ATI.*ASUS.*AH26.*							3		1 @@ -51,6 +56,7 @@ ATI ASUS AX5xx					.*ATI.*ASUS.*AX5.*							1		1  ATI ASUS AX8xx					.*ATI.*ASUS.*AX8.*							2		1  ATI ASUS EAH24xx				.*ATI.*ASUS.*EAH24.*						2		1  ATI ASUS EAH26xx				.*ATI.*ASUS.*EAH26.*						3		1 +ATI ASUS EAH29xx				.*ATI.*ASUS.*EAH29.*						3		1  ATI ASUS EAH34xx				.*ATI.*ASUS.*EAH34.*						1		1  ATI ASUS EAH36xx				.*ATI.*ASUS.*EAH36.*						3		1  ATI ASUS EAH38xx				.*ATI.*ASUS.*EAH38.*						3		1 @@ -59,12 +65,17 @@ ATI ASUS EAH45xx				.*ATI.*ASUS.*EAH45.*						1		1  ATI ASUS EAH48xx				.*ATI.*ASUS.*EAH48.*						3		1  ATI ASUS EAH57xx				.*ATI.*ASUS.*EAH57.*						3		1  ATI ASUS EAH58xx				.*ATI.*ASUS.*EAH58.*						3		1 +ATI ASUS EAH6xxx				.*ATI.*ASUS.*EAH6.*							3		1  ATI ASUS Radeon X1xxx			.*ATI.*ASUS.*X1.*							3		1  ATI Radeon X7xx					.*ATI.*ASUS.*X7.*							1		1 -ATI Radeon X1xxx				.*ATI.*X1.*									0		1 -ATI Radeon X13xx				.*ATI.*Diamond X13.*						1		1 -ATI Radeon X16xx				.*ATI.*Diamond X16.*						1		1 -ATI Radeon X19xx				.*ATI.*Diamond X19.*						1		1 +ATI Radeon X19xx				.*ATI.*(Radeon|Diamond) X19.* ?.*			3		1 +ATI Radeon X18xx				.*ATI.*(Radeon|Diamond) X18.* ?.*			3		1 +ATI Radeon X17xx				.*ATI.*(Radeon|Diamond) X17.* ?.*			2		1 +ATI Radeon X16xx				.*ATI.*(Radeon|Diamond) X16.* ?.*			2		1 +ATI Radeon X15xx				.*ATI.*(Radeon|Diamond) X15.* ?.*			2		1 +ATI Radeon X13xx				.*ATI.*(Radeon|Diamond) X13.* ?.*			1		1 +ATI Radeon X1xxx				.*ATI.*(Radeon|Diamond) X1.. ?.*			1		1 +ATI Radeon X2xxx				.*ATI.*(Radeon|Diamond) X2.. ?.*			1		1  ATI Display Adapter				.*ATI.*display adapter.*					0		1  ATI FireGL 5200					.*ATI.*FireGL V52.*							0		1  ATI FireGL 5xxx					.*ATI.*FireGL V5.*							1		1 @@ -74,8 +85,9 @@ ATI FirePro M5800				.*ATI.*FirePro.*M58.*						3		1  ATI FirePro M7740				.*ATI.*FirePro.*M77.*						3		1  ATI FirePro M7820				.*ATI.*FirePro.*M78.*						3		1  ATI FireMV						.*ATI.*FireMV.*								0		1 -ATI Geforce 9500 GT				.*ATI.*Geforce 9500 *GT						2		1 -ATI Geforce 9800 GT				.*ATI.*Geforce 9800 *GT						2		1 +ATI Geforce 9500 GT				.*ATI.*Geforce 9500 *GT.*					2		1 +ATI Geforce 9600 GT				.*ATI.*Geforce 9600 *GT.*					2		1 +ATI Geforce 9800 GT				.*ATI.*Geforce 9800 *GT.*					2		1  ATI Generic						.*ATI.*Generic.*							0		0  ATI Hercules 9800				.*ATI.*Hercules.*9800.*						1		1  ATI IGP 340M					.*ATI.*IGP.*340M.*							0		0 @@ -85,168 +97,156 @@ ATI M56							.*ATI.*M56.*								1		1  ATI M71							.*ATI.*M71.*								1		1  ATI M72							.*ATI.*M72.*								1		1  ATI M76							.*ATI.*M76.*								3		1 -ATI Mobility Radeon 4100		.*ATI.*(Mobility|MOBILITY).*41.*			0		1 -ATI Mobility Radeon 7xxx		.*ATI.*(Mobility|MOBILITY).*Radeon 7.*		0		1 -ATI Mobility Radeon 8xxx		.*ATI.*(Mobility|MOBILITY).*Radeon 8.*		0		1 -ATI Mobility Radeon 9800		.*ATI.*(Mobility|MOBILITY).*98.*			1		1 -ATI Mobility Radeon 9700		.*ATI.*(Mobility|MOBILITY).*97.*			1		1 -ATI Mobility Radeon 9600		.*ATI.*(Mobility|MOBILITY).*96.*			0		1 -ATI Mobility Radeon HD 530v		.*ATI.*(Mobility|MOBILITY).*HD *530v.*		1		1 -ATI Mobility Radeon HD 540v		.*ATI.*(Mobility|MOBILITY).*HD *540v.*		2		1 -ATI Mobility Radeon HD 545v		.*ATI.*(Mobility|MOBILITY).*HD *545v.*		2		1 -ATI Mobility Radeon HD 550v		.*ATI.*(Mobility|MOBILITY).*HD *550v.*		2		1 -ATI Mobility Radeon HD 560v		.*ATI.*(Mobility|MOBILITY).*HD *560v.*		2		1 -ATI Mobility Radeon HD 565v		.*ATI.*(Mobility|MOBILITY).*HD *565v.*		2		1 -ATI Mobility Radeon HD 2300		.*ATI.*(Mobility|MOBILITY).*HD *23.*		1		1 -ATI Mobility Radeon HD 2400		.*ATI.*(Mobility|MOBILITY).*HD *24.*		1		1 -ATI Mobility Radeon HD 2600		.*ATI.*(Mobility|MOBILITY).*HD *26.*		3		1 -ATI Mobility Radeon HD 2700		.*ATI.*(Mobility|MOBILITY).*HD *27.*		3		1 -ATI Mobility Radeon HD 3100		.*ATI.*(Mobility|MOBILITY).*HD *31.*		0		1 -ATI Mobility Radeon HD 3200		.*ATI.*(Mobility|MOBILITY).*HD *32.*		0		1 -ATI Mobility Radeon HD 3400		.*ATI.*(Mobility|MOBILITY).*HD *34.*		2		1 -ATI Mobility Radeon HD 3600		.*ATI.*(Mobility|MOBILITY).*HD *36.*		3		1 -ATI Mobility Radeon HD 3800		.*ATI.*(Mobility|MOBILITY).*HD *38.*		3		1 -ATI Mobility Radeon HD 4200		.*ATI.*(Mobility|MOBILITY).*HD *42.*		2		1 -ATI Mobility Radeon HD 4300		.*ATI.*(Mobility|MOBILITY).*HD *43.*		2		1 -ATI Mobility Radeon HD 4500		.*ATI.*(Mobility|MOBILITY).*HD *45.*		3		1 -ATI Mobility Radeon HD 4600		.*ATI.*(Mobility|MOBILITY).*HD *46.*		3		1 -ATI Mobility Radeon HD 4800		.*ATI.*(Mobility|MOBILITY).*HD *48.*		3		1 -ATI Mobility Radeon HD 5100		.*ATI.*(Mobility|MOBILITY).*HD *51.*		2		1 -ATI Mobility Radeon HD 5300		.*ATI.*(Mobility|MOBILITY).*HD *53.*		2		1 -ATI Mobility Radeon HD 5400		.*ATI.*(Mobility|MOBILITY).*HD *54.*		2		1 -ATI Mobility Radeon HD 5500		.*ATI.*(Mobility|MOBILITY).*HD *55.*		2		1 -ATI Mobility Radeon HD 5600		.*ATI.*(Mobility|MOBILITY).*HD *56.*		2		1 -ATI Mobility Radeon HD 5700		.*ATI.*(Mobility|MOBILITY).*HD *57.*		3		1 -ATI Mobility Radeon HD 6200		.*ATI.*(Mobility|MOBILITY).*HD *62.*		2		1 -ATI Mobility Radeon HD 6300		.*ATI.*(Mobility|MOBILITY).*HD *63.*		2		1 -ATI Mobility Radeon HD 6400M	.*ATI.*(Mobility|MOBILITY).*HD *64.*		3		1 -ATI Mobility Radeon HD 6500M	.*ATI.*(Mobility|MOBILITY).*HD *65.*		3		1 -ATI Mobility Radeon HD 6600M	.*ATI.*(Mobility|MOBILITY).*HD *66.*		3		1 -ATI Mobility Radeon HD 6700M	.*ATI.*(Mobility|MOBILITY).*HD *67.*		3		1 -ATI Mobility Radeon HD 6800M	.*ATI.*(Mobility|MOBILITY).*HD *68.*		3		1 -ATI Mobility Radeon HD 6900M	.*ATI.*(Mobility|MOBILITY).*HD *69.*		3		1 -ATI Mobility Radeon X1xxx		.*ATI.*(Mobility|MOBILITY).*X1.*			0		1 -ATI Mobility Radeon X2xxx		.*ATI.*(Mobility|MOBILITY).*X2.*			0		1 -ATI Mobility Radeon X3xx		.*ATI.*(Mobility|MOBILITY).*X3.*			1		1 -ATI Mobility Radeon X6xx		.*ATI.*(Mobility|MOBILITY).*X6.*			1		1 -ATI Mobility Radeon X7xx		.*ATI.*(Mobility|MOBILITY).*X7.*			1		1 -ATI Mobility Radeon Xxxx		.*ATI.*(Mobility|MOBILITY).*X.*				0		1 -ATI Mobility Radeon				.*ATI.*(Mobility|MOBILITY).*				0		1 -ATI Radeon HD 2300				.*ATI.*(Radeon|RADEON) HD *23.*				0		1 -ATI Radeon HD 2400				.*ATI.*(Radeon|RADEON) HD *24.*				1		1 -ATI Radeon HD 2600				.*ATI.*(Radeon|RADEON) HD *26.*				2		1 -ATI Radeon HD 2900				.*ATI.*(Radeon|RADEON) HD *29.*				3		1 -ATI Radeon HD 3000				.*ATI.*(Radeon|RADEON) HD *30.*				0		1 -ATI Radeon HD 3100				.*ATI.*(Radeon|RADEON) HD *31.*				1		1 -ATI Radeon HD 3200				.*ATI.*(Radeon|RADEON) HD *32.*				0		1 -ATI Radeon HD 3300				.*ATI.*(Radeon|RADEON) HD *33.*				1		1 -ATI Radeon HD 3400				.*ATI.*(Radeon|RADEON) HD *34.*				1		1 -ATI Radeon HD 3500				.*ATI.*(Radeon|RADEON) HD *35.*				1		1 -ATI Radeon HD 3600				.*ATI.*(Radeon|RADEON) HD *36.*				3		1 -ATI Radeon HD 3700				.*ATI.*(Radeon|RADEON) HD *37.*				3		1 -ATI Radeon HD 3800				.*ATI.*(Radeon|RADEON) HD *38.*				3		1 -ATI Radeon HD 4200				.*ATI.*(Radeon|RADEON) HD *42.*				1		1 -ATI Radeon HD 4300				.*ATI.*(Radeon|RADEON) HD *43.*				1		1 -ATI Radeon HD 4400				.*ATI.*(Radeon|RADEON) HD *44.*				1		1 -ATI Radeon HD 4500				.*ATI.*(Radeon|RADEON) HD *45.*				3		1 -ATI Radeon HD 4600				.*ATI.*(Radeon|RADEON) HD *46.*				3		1 -ATI Radeon HD 4700				.*ATI.*(Radeon|RADEON) HD *47.*				3		1 -ATI Radeon HD 4800				.*ATI.*(Radeon|RADEON) HD *48.*				3		1 -ATI Radeon HD 5400				.*ATI.*(Radeon|RADEON) HD *54.*				3		1 -ATI Radeon HD 5500				.*ATI.*(Radeon|RADEON) HD *55.*				3		1 -ATI Radeon HD 5600				.*ATI.*(Radeon|RADEON) HD *56.*				3		1 -ATI Radeon HD 5700				.*ATI.*(Radeon|RADEON) HD *57.*				3		1 -ATI Radeon HD 5800				.*ATI.*(Radeon|RADEON) HD *58.*				3		1 -ATI Radeon HD 5900				.*ATI.*(Radeon|RADEON) HD *59.*				3		1 -ATI Radeon HD 6200				.*ATI.*(Radeon|RADEON) HD *62.*				2		1 -ATI Radeon HD 6300				.*ATI.*(Radeon|RADEON) HD *63.*				2		1 -ATI Radeon HD 6400				.*ATI.*(Radeon|RADEON) HD *64.*				3		1 -ATI Radeon HD 6500				.*ATI.*(Radeon|RADEON) HD *65.*				3		1 -ATI Radeon HD 66xx				.*ATI.*(Radeon|RADEON) HD *66.*				3		1 -ATI Radeon HD 6700				.*ATI.*(Radeon|RADEON) HD *67.*				3		1 -ATI Radeon HD 6800				.*ATI.*(Radeon|RADEON) HD *68.*				3		1 -ATI Radeon HD 6900				.*ATI.*(Radeon|RADEON) HD *69.*				3		1 -ATI Radeon OpenGL				.*ATI.*(Radeon|RADEON) OpenGL.* 			0		0 -ATI Radeon 2100					.*ATI.*(Radeon|RADEON) 21.*					0		1 -ATI Radeon 3000					.*ATI.*(Radeon|RADEON) 30.*					0		1 -ATI Radeon 3100					.*ATI.*(Radeon|RADEON) 31.*					1		1 -ATI Radeon 5xxx					.*ATI.*(Radeon|RADEON) 5.*					3		1 -ATI Radeon 7xxx					.*ATI.*(Radeon|RADEON) 7.*					0		1 -ATI Radeon 8xxx					.*ATI.*(Radeon|RADEON) 8.*					0		1 -ATI Radeon 9000					.*ATI.*(Radeon|RADEON) 90.*					0		1 -ATI Radeon 9100					.*ATI.*(Radeon|RADEON) 91.*					0		1 -ATI Radeon 9200					.*ATI.*(Radeon|RADEON) 92.*					0		1 -ATI Radeon 9500					.*ATI.*(Radeon|RADEON) 95.*					0		1 -ATI Radeon 9600					.*ATI.*(Radeon|RADEON) 96.*					0		1 -ATI Radeon 9700					.*ATI.*(Radeon|RADEON) 97.*					1		1 -ATI Radeon 9800					.*ATI.*(Radeon|RADEON) 98.*					1		1 +ATI Radeon HD 64xx				.*ATI.*AMD Radeon.* HD [67]4..[MG]			3		1 +ATI Radeon HD 65xx				.*ATI.*AMD Radeon.* HD [67]5..[MG]			3		1 +ATI Radeon HD 66xx				.*ATI.*AMD Radeon.* HD [67]6..[MG]			3		1 +ATI Mobility Radeon 4100		.*ATI.*Mobility.*41..						1		1 +ATI Mobility Radeon 7xxx		.*ATI.*Mobility.*Radeon 7.*					0		1 +ATI Mobility Radeon 8xxx		.*ATI.*Mobility.*Radeon 8.*					0		1 +ATI Mobility Radeon 9800		.*ATI.*Mobility.*98.*						1		1 +ATI Mobility Radeon 9700		.*ATI.*Mobility.*97.*						1		1 +ATI Mobility Radeon 9600		.*ATI.*Mobility.*96.*						0		1 +ATI Mobility Radeon HD 530v		.*ATI.*Mobility.*HD *530v.*					1		1 +ATI Mobility Radeon HD 540v		.*ATI.*Mobility.*HD *540v.*					2		1 +ATI Mobility Radeon HD 545v		.*ATI.*Mobility.*HD *545v.*					2		1 +ATI Mobility Radeon HD 550v		.*ATI.*Mobility.*HD *550v.*					2		1 +ATI Mobility Radeon HD 560v		.*ATI.*Mobility.*HD *560v.*					2		1 +ATI Mobility Radeon HD 565v		.*ATI.*Mobility.*HD *565v.*					2		1 +ATI Mobility Radeon HD 2300		.*ATI.*Mobility.*HD *23.*					1		1 +ATI Mobility Radeon HD 2400		.*ATI.*Mobility.*HD *24.*					1		1 +ATI Mobility Radeon HD 2600		.*ATI.*Mobility.*HD *26.*					3		1 +ATI Mobility Radeon HD 2700		.*ATI.*Mobility.*HD *27.*					3		1 +ATI Mobility Radeon HD 3100		.*ATI.*Mobility.*HD *31.*					0		1 +ATI Mobility Radeon HD 3200		.*ATI.*Mobility.*HD *32.*					0		1 +ATI Mobility Radeon HD 3400		.*ATI.*Mobility.*HD *34.*					2		1 +ATI Mobility Radeon HD 3600		.*ATI.*Mobility.*HD *36.*					3		1 +ATI Mobility Radeon HD 3800		.*ATI.*Mobility.*HD *38.*					3		1 +ATI Mobility Radeon HD 4200		.*ATI.*Mobility.*HD *42.*					2		1 +ATI Mobility Radeon HD 4300		.*ATI.*Mobility.*HD *43.*					2		1 +ATI Mobility Radeon HD 4500		.*ATI.*Mobility.*HD *45.*					3		1 +ATI Mobility Radeon HD 4600		.*ATI.*Mobility.*HD *46.*					3		1 +ATI Mobility Radeon HD 4800		.*ATI.*Mobility.*HD *48.*					3		1 +ATI Mobility Radeon HD 5100		.*ATI.*Mobility.*HD *51.*					3		1 +ATI Mobility Radeon HD 5300		.*ATI.*Mobility.*HD *53.*					3		1 +ATI Mobility Radeon HD 5400		.*ATI.*Mobility.*HD *54.*					3		1 +ATI Mobility Radeon HD 5500		.*ATI.*Mobility.*HD *55.*					3		1 +ATI Mobility Radeon HD 5600		.*ATI.*Mobility.*HD *56.*					3		1 +ATI Mobility Radeon HD 5700		.*ATI.*Mobility.*HD *57.*					3		1 +ATI Mobility Radeon HD 6200		.*ATI.*Mobility.*HD *62.*					3		1 +ATI Mobility Radeon HD 6300		.*ATI.*Mobility.*HD *63.*					3		1 +ATI Mobility Radeon HD 6400M	.*ATI.*Mobility.*HD *64.*					3		1 +ATI Mobility Radeon HD 6500M	.*ATI.*Mobility.*HD *65.*					3		1 +ATI Mobility Radeon HD 6600M	.*ATI.*Mobility.*HD *66.*					3		1 +ATI Mobility Radeon HD 6700M	.*ATI.*Mobility.*HD *67.*					3		1 +ATI Mobility Radeon HD 6800M	.*ATI.*Mobility.*HD *68.*					3		1 +ATI Mobility Radeon HD 6900M	.*ATI.*Mobility.*HD *69.*					3		1 +ATI Radeon HD 2300				.*ATI.*Radeon HD *23..						0		1 +ATI Radeon HD 2400				.*ATI.*Radeon HD *24..						1		1 +ATI Radeon HD 2600				.*ATI.*Radeon HD *26..						2		1 +ATI Radeon HD 2900				.*ATI.*Radeon HD *29..						3		1 +ATI Radeon HD 3000				.*ATI.*Radeon HD *30..						0		1 +ATI Radeon HD 3100				.*ATI.*Radeon HD *31..						1		1 +ATI Radeon HD 3200				.*ATI.*Radeon HD *32..						1		1 +ATI Radeon HD 3300				.*ATI.*Radeon HD *33..						1		1 +ATI Radeon HD 3400				.*ATI.*Radeon HD *34..						1		1 +ATI Radeon HD 3500				.*ATI.*Radeon HD *35..						1		1 +ATI Radeon HD 3600				.*ATI.*Radeon HD *36..						3		1 +ATI Radeon HD 3700				.*ATI.*Radeon HD *37..						3		1 +ATI Radeon HD 3800				.*ATI.*Radeon HD *38..						3		1 +ATI Radeon HD 4100				.*ATI.*Radeon HD *41..						1		1 +ATI Radeon HD 4200				.*ATI.*Radeon HD *42..						1		1 +ATI Radeon HD 4300				.*ATI.*Radeon HD *43..						1		1 +ATI Radeon HD 4400				.*ATI.*Radeon HD *44..						1		1 +ATI Radeon HD 4500				.*ATI.*Radeon HD *45..						3		1 +ATI Radeon HD 4600				.*ATI.*Radeon HD *46..						3		1 +ATI Radeon HD 4700				.*ATI.*Radeon HD *47..						3		1 +ATI Radeon HD 4800				.*ATI.*Radeon HD *48..						3		1 +ATI Radeon HD 5400				.*ATI.*Radeon HD *54..						3		1 +ATI Radeon HD 5500				.*ATI.*Radeon HD *55..						3		1 +ATI Radeon HD 5600				.*ATI.*Radeon HD *56..						3		1 +ATI Radeon HD 5700				.*ATI.*Radeon HD *57..						3		1 +ATI Radeon HD 5800				.*ATI.*Radeon HD *58..						3		1 +ATI Radeon HD 5900				.*ATI.*Radeon HD *59..						3		1 +ATI Radeon HD 6200				.*ATI.*Radeon HD *62..						3		1 +ATI Radeon HD 6300				.*ATI.*Radeon HD *63..						3		1 +ATI Radeon HD 6400				.*ATI.*Radeon HD *64..						3		1 +ATI Radeon HD 6500				.*ATI.*Radeon HD *65..						3		1 +ATI Radeon HD 6600				.*ATI.*Radeon HD *66..						3		1 +ATI Radeon HD 6700				.*ATI.*Radeon HD *67..						3		1 +ATI Radeon HD 6800				.*ATI.*Radeon HD *68..						3		1 +ATI Radeon HD 6900				.*ATI.*Radeon HD *69..						3		1 +ATI Radeon OpenGL				.*ATI.*Radeon OpenGL.*						0		0 +ATI Radeon 2100					.*ATI.*Radeon 21..							0		1 +ATI Radeon 3000					.*ATI.*Radeon 30..							0		1 +ATI Radeon 3100					.*ATI.*Radeon 31..							1		1 +ATI Radeon 5xxx					.*ATI.*Radeon 5...							3		1 +ATI Radeon 7xxx					.*ATI.*Radeon 7...							0		1 +ATI Radeon 8xxx					.*ATI.*Radeon 8...							0		1 +ATI Radeon 9000					.*ATI.*Radeon 90..							0		1 +ATI Radeon 9100					.*ATI.*Radeon 91..							0		1 +ATI Radeon 9200					.*ATI.*Radeon 92..							0		1 +ATI Radeon 9500					.*ATI.*Radeon 95..							0		1 +ATI Radeon 9600					.*ATI.*Radeon 96..							0		1 +ATI Radeon 9700					.*ATI.*Radeon 97..							1		1 +ATI Radeon 9800					.*ATI.*Radeon 98..							1		1  ATI Radeon RV250				.*ATI.*RV250.*								0		1  ATI Radeon RV600				.*ATI.*RV6.*								1		1  ATI Radeon RX700				.*ATI.*RX70.*								1		1 -ATI Radeon RX800				.*ATI.*(Radeon|RADEON) *RX80.*				2		1 +ATI Radeon RX800				.*ATI.*Radeon *RX80.*						2		1  ATI RS880M						.*ATI.*RS880M								1		1  ATI Radeon RX9550				.*ATI.*RX9550.*								1		1 -ATI Radeon VE					.*ATI.*(Radeon|RADEON).*VE.*				0		0 -ATI Radeon X1000				.*ATI.*(Radeon|RADEON) *X10.*				0		1 -ATI Radeon X1200				.*ATI.*(Radeon|RADEON) *X12.*				0		1 -ATI Radeon X1300				.*ATI.*(Radeon|RADEON) *X13.*				1		1 -ATI Radeon X1400				.*ATI.*(Radeon|RADEON) *X14.*				1		1 -ATI Radeon X1500				.*ATI.*(Radeon|RADEON) *X15.*				1		1 -ATI Radeon X1600				.*ATI.*(Radeon|RADEON) *X16.*				1		1 -ATI Radeon X1700				.*ATI.*(Radeon|RADEON) *X17.*				1		1 -ATI Radeon X1800				.*ATI.*(Radeon|RADEON) *X18.*				3		1 -ATI Radeon X1900				.*ATI.*(Radeon|RADEON) *X19.*				3		1 -ATI Radeon X300					.*ATI.*(Radeon|RADEON) *X3.*				0		1 -ATI Radeon X400					.*ATI.*(Radeon|RADEON) X4.*					0		1 -ATI Radeon X500					.*ATI.*(Radeon|RADEON) X5.*					0		1 -ATI Radeon X600					.*ATI.*(Radeon|RADEON) X6.*					1		1 -ATI Radeon X700					.*ATI.*(Radeon|RADEON) X7.*					1		1 -ATI Radeon X800					.*ATI.*(Radeon|RADEON) X8.*					2		1 -ATI Radeon X900					.*ATI.*(Radeon|RADEON) X9.*					2		1 -ATI Radeon Xpress				.*ATI.*(Radeon|RADEON) (Xpress|XPRESS).*	0		1 +ATI Radeon VE					.*ATI.*Radeon.*VE.*							0		0 +ATI Radeon X300					.*ATI.*Radeon *X3.*							0		1 +ATI Radeon X400					.*ATI.*Radeon ?X4.*							0		1 +ATI Radeon X500					.*ATI.*Radeon ?X5.*							0		1 +ATI Radeon X600					.*ATI.*Radeon ?X6.*							1		1 +ATI Radeon X700					.*ATI.*Radeon ?X7.*							1		1 +ATI Radeon X800					.*ATI.*Radeon ?X8.*							2		1 +ATI Radeon X900					.*ATI.*Radeon ?X9.*							2		1 +ATI Radeon Xpress				.*ATI.*Radeon Xpress.*						0		1  ATI Rage 128					.*ATI.*Rage 128.*							0		1 -ATI R350 (9800)					.*(ATI)?.*R350.*							1		1 -ATI R580 (X1900)				.*(ATI)?.*R580.*							3		1 -ATI RC410 (Xpress 200)			.*(ATI)?.*RC410.*							0		0 -ATI RS48x (Xpress 200x)			.*(ATI)?.*RS48.*							0		0 -ATI RS600 (Xpress 3200)			.*(ATI)?.*RS600.*							0		0 -ATI RV350 (9600)				.*(ATI)?.*RV350.*							0		1 -ATI RV370 (X300)				.*(ATI)?.*RV370.*							0		1 -ATI RV410 (X700)				.*(ATI)?.*RV410.*							1		1 -ATI RV515						.*(ATI)?.*RV515.*							1		1 -ATI RV570 (X1900 GT/PRO)		.*(ATI)?.*RV570.*							3		1 -ATI RV380						.*(ATI)?.*RV380.*							0		1 -ATI RV530						.*(ATI)?.*RV530.*							1		1 -ATI RX480 (Xpress 200P)			.*(ATI)?.*RX480.*							0		1 -ATI RX700						.*(ATI)?.*RX700.*							1		1 -AMD ANTILLES (HD 6990)			.*(AMD|ATI).*(Antilles|ANTILLES).*			3		1 -AMD BARTS (HD 6800)				.*(AMD|ATI).*(Barts|BARTS).*				3		1 -AMD CAICOS (HD 6400)			.*(AMD|ATI).*(Caicos|CAICOS).*				3		1 +ATI R350 (9800)					.*R350.*									1		1 +ATI R580 (X1900)				.*R580.*									3		1 +ATI RC410 (Xpress 200)			.*RC410.*									0		0 +ATI RS48x (Xpress 200x)			.*RS48.*									0		0 +ATI RS600 (Xpress 3200)			.*RS600.*									0		0 +ATI RV350 (9600)				.*RV350.*									0		1 +ATI RV370 (X300)				.*RV370.*									0		1 +ATI RV410 (X700)				.*RV410.*									1		1 +ATI RV515						.*RV515.*									1		1 +ATI RV570 (X1900 GT/PRO)		.*RV570.*									3		1 +ATI RV380						.*RV380.*									0		1 +ATI RV530						.*RV530.*									1		1 +ATI RX480 (Xpress 200P)			.*RX480.*									0		1 +ATI RX700						.*RX700.*									1		1 +AMD ANTILLES (HD 6990)			.*(AMD|ATI).*Antilles.*						3		1 +AMD BARTS (HD 6800)				.*(AMD|ATI).*Barts.*						3		1 +AMD CAICOS (HD 6400)			.*(AMD|ATI).*Caicos.*						3		1  AMD CAYMAN (HD 6900)			.*(AMD|ATI).*(Cayman|CAYMAM).*				3		1 -AMD CEDAR (HD 5450)				.*(AMD|ATI).*(Cedar|CEDAR).*				2		1 -AMD CYPRESS (HD 5800)			.*(AMD|ATI).*(Cypress|CYPRESS).*			3		1 -AMD HEMLOCK (HD 5970)			.*(AMD|ATI).*(Hemlock|HEMLOCK).*			3		1 -AMD JUNIPER (HD 5700)			.*(AMD|ATI).*(Juniper|JUNIPER).*			3		1 -AMD PARK						.*(AMD|ATI).*(Park|PARK).*					3		1 -AMD REDWOOD (HD 5500/5600)		.*(AMD|ATI).*(Redwood|REDWOOD).*			3		1 -AMD TURKS (HD 6500/6600)		.*(AMD|ATI).*(Turks|TURKS).*				3		1 -AMD RS780 (HD 3200)				.*(AMD|ATI)?.*RS780.*						0		1 -AMD RS880 (HD 4200)				.*(AMD|ATI)?.*RS880.*						1		1 -AMD RV610 (HD 2400)				.*(AMD|ATI)?.*RV610.*						1		1 -AMD RV620 (HD 3400)				.*(AMD|ATI)?.*RV620.*						1		1 -AMD RV630 (HD 2600)				.*(AMD|ATI)?.*RV630.*						2		1 -AMD RV635 (HD 3600)				.*(AMD|ATI)?.*RV635.*						3		1 -AMD RV670 (HD 3800)				.*(AMD|ATI)?.*RV670.*						3		1 -AMD R680 (HD 3870 X2)			.*(AMD|ATI)?.*R680.*						3		1 -AMD R700 (HD 4800 X2)			.*(AMD|ATI)?.*R700.*						3		1 -AMD RV710 (HD 4300)				.*(AMD|ATI)?.*RV710.*						1		1 -AMD RV730 (HD 4600)				.*(AMD|ATI)?.*RV730.*						3		1 -AMD RV740 (HD 4700)				.*(AMD|ATI)?.*RV740.*						3		1 -AMD RV770 (HD 4800)				.*(AMD|ATI)?.*RV770.*						3		1 -AMD RV790 (HD 4800)				.*(AMD|ATI)?.*RV790.*						3		1 +AMD CEDAR (HD 5450)				.*(AMD|ATI).*Cedar.*						2		1 +AMD CYPRESS (HD 5800)			.*(AMD|ATI).*Cypress.*						3		1 +AMD HEMLOCK (HD 5970)			.*(AMD|ATI).*Hemlock.*						3		1 +AMD JUNIPER (HD 5700)			.*(AMD|ATI).*Juniper.*						3		1 +AMD PARK						.*(AMD|ATI).*Park.*							3		1 +AMD REDWOOD (HD 5500/5600)		.*(AMD|ATI).*Redwood.*						3		1 +AMD TURKS (HD 6500/6600)		.*(AMD|ATI).*Turks.*						3		1 +AMD RS780 (HD 3200)				.*RS780.*									0		1 +AMD RS880 (HD 4200)				.*RS880.*									1		1 +AMD RV610 (HD 2400)				.*RV610.*									1		1 +AMD RV620 (HD 3400)				.*RV620.*									1		1 +AMD RV630 (HD 2600)				.*RV630.*									2		1 +AMD RV635 (HD 3600)				.*RV635.*									3		1 +AMD RV670 (HD 3800)				.*RV670.*									3		1 +AMD R680 (HD 3870 X2)			.*R680.*									3		1 +AMD R700 (HD 4800 X2)			.*R700.*									3		1 +AMD RV710 (HD 4300)				.*RV710.*									1		1 +AMD RV730 (HD 4600)				.*RV730.*									3		1 +AMD RV740 (HD 4700)				.*RV740.*									3		1 +AMD RV770 (HD 4800)				.*RV770.*									3		1 +AMD RV790 (HD 4800)				.*RV790.*									3		1  ATI 760G/Radeon 3000			.*ATI.*AMD 760G.*							1		1  ATI 780L/Radeon 3000			.*ATI.*AMD 780L.*							1		1 -ATI Radeon DDR					.*ATI.*(Radeon|RADEON) ?DDR.*				0		1 +ATI Radeon DDR					.*ATI.*Radeon ?DDR.*						0		1  ATI FirePro 2000				.*ATI.*FirePro 2.*							1		1  ATI FirePro 3000				.*ATI.*FirePro V3.*							1		1  ATI FirePro 4000				.*ATI.*FirePro V4.*							2		1 @@ -255,8 +255,8 @@ ATI FirePro 7000				.*ATI.*FirePro V7.*							3		1  ATI FirePro M					.*ATI.*FirePro M.*							3		1  ATI Technologies				.*ATI *Technologies.*						0		1  // This entry is last to work around the "R300" driver problem. -ATI R300 (9700)					.*(ATI)?.*R300.*							1		1 -ATI Radeon 						.*ATI.*Radeon.*								0		1 +ATI R300 (9700)					.*R300.*									1		1 +ATI Radeon						.*ATI.*(Diamond|Radeon).*					0		1  Intel X3100						.*Intel.*X3100.*							0		1  Intel 830M						.*Intel.*830M								0		0  Intel 845G						.*Intel.*845G								0		0 @@ -273,13 +273,13 @@ Intel G33						.*Intel.*G33.*								0		0  Intel G41						.*Intel.*G41.*								0		1  Intel G45						.*Intel.*G45.*								0		1  Intel Bear Lake					.*Intel.*Bear Lake.*						0		0 -Intel Broadwater 				.*Intel.*Broadwater.*						0		0 +Intel Broadwater				.*Intel.*Broadwater.*						0		0  Intel Brookdale					.*Intel.*Brookdale.*						0		0  Intel Cantiga					.*Intel.*Cantiga.*							0		0  Intel Eaglelake					.*Intel.*Eaglelake.*						0		1  Intel Graphics Media HD			.*Intel.*Graphics Media.*HD.*				0		1  Intel HD Graphics				.*Intel.*HD Graphics.*						2		1 -Intel Mobile 4 Series			.*Intel.*Mobile *4 Series.*					0		1 +Intel Mobile 4 Series			.*Intel.*Mobile.* 4 Series.*				0		1  Intel Media Graphics HD			.*Intel.*Media Graphics HD.*				0		1  Intel Montara					.*Intel.*Montara.*							0		0  Intel Pineview					.*Intel.*Pineview.*							0		1 @@ -288,204 +288,219 @@ Intel HD Graphics 2000			.*Intel.*HD2000.*							1		1  Intel HD Graphics 3000			.*Intel.*HD3000.*							2		1  Matrox							.*Matrox.*									0		0  Mesa							.*Mesa.*									0		0 -NVIDIA 205						.*NVIDIA.*GeForce 205.*						2		1 -NVIDIA 210						.*NVIDIA.*GeForce 210.*						2		1 -NVIDIA 310M						.*NVIDIA.*GeForce 310M.*					1		1 -NVIDIA 310						.*NVIDIA.*GeForce 310.*						3		1 -NVIDIA 315M						.*NVIDIA.*GeForce 315M.*					2		1 -NVIDIA 315						.*NVIDIA.*GeForce 315.*						3		1 -NVIDIA 320M						.*NVIDIA.*GeForce 320M.*					2		1 -NVIDIA G100M					.*NVIDIA *(GeForce)? *(G)? ?100M.*			0		1 -NVIDIA G100						.*NVIDIA *(GeForce)? *(G)? ?100.*			0		1 -NVIDIA G102M					.*NVIDIA *(GeForce)? *(G)? ?102M.*			0		1 -NVIDIA G103M					.*NVIDIA *(GeForce)? *(G)? ?103M.*			0		1 -NVIDIA G105M					.*NVIDIA *(GeForce)? *(G)? ?105M.*			0		1 -NVIDIA G 110M					.*NVIDIA *(GeForce)? *(G)? ?110M.*			0		1 -NVIDIA G 120M					.*NVIDIA *(GeForce)? *(G)? ?120M.*			1		1 -NVIDIA G 200					.*NVIDIA *(GeForce)? *(G)? ?200(M)?.*		0		1 -NVIDIA G 205M					.*NVIDIA *(GeForce)? *(G)? ?205(M)?.*		0		1 -NVIDIA G 210					.*NVIDIA *(GeForce)? *(G)? ?210(M)?.*		1		1 -NVIDIA 305M						.*NVIDIA *(GeForce)? *(G)? ?305(M)?.*		1		1 -NVIDIA G 310M					.*NVIDIA *(GeForce)? *(G)? ?310(M)?.*		2		1 -NVIDIA G 315					.*NVIDIA *(GeForce)? *(G)? ?315(M)?.*		2		1 -NVIDIA G 320M					.*NVIDIA *(GeForce)? *(G)? ?320(M)?.*		2		1 -NVIDIA G 405					.*NVIDIA *(GeForce)? *(G)? ?405(M)?.*		1		1 -NVIDIA G 410M					.*NVIDIA *(GeForce)? *(G)? ?410(M)?.*		1		1 -NVIDIA GT 120M					.*NVIDIA.*(GeForce)? *GT *120(M)?.*			2		1 -NVIDIA GT 120					.*NVIDIA.*GT.*120							2		1 -NVIDIA GT 130M					.*NVIDIA.*(GeForce)? *GT *130(M)?.*			2		1 -NVIDIA GT 140M					.*NVIDIA.*(GeForce)? *GT *140(M)?.*			2		1 -NVIDIA GT 150M					.*NVIDIA.*(GeForce)? *GT(S)? *150(M)?.*		2		1 -NVIDIA GT 160M					.*NVIDIA.*(GeForce)? *GT *160(M)?.*			2		1 -NVIDIA GT 220M					.*NVIDIA.*(GeForce)? *GT *220(M)?.*			2		1 -NVIDIA GT 230M					.*NVIDIA.*(GeForce)? *GT *230(M)?.*			2		1 -NVIDIA GT 240M					.*NVIDIA.*(GeForce)? *GT *240(M)?.*			2		1 -NVIDIA GT 250M					.*NVIDIA.*(GeForce)? *GT *250(M)?.*			2		1 -NVIDIA GT 260M					.*NVIDIA.*(GeForce)? *GT *260(M)?.*			2		1 -NVIDIA GT 320M					.*NVIDIA.*(GeForce)? *GT *320(M)?.*			2		1 -NVIDIA GT 325M					.*NVIDIA.*(GeForce)? *GT *325(M)?.*			0		1 -NVIDIA GT 330M					.*NVIDIA.*(GeForce)? *GT *330(M)?.*			3		1 -NVIDIA GT 335M					.*NVIDIA.*(GeForce)? *GT *335(M)?.*			1		1 -NVIDIA GT 340M					.*NVIDIA.*(GeForce)? *GT *340(M)?.*			2		1 -NVIDIA GT 415M					.*NVIDIA.*(GeForce)? *GT *415(M)?.*			2		1 -NVIDIA GT 420M					.*NVIDIA.*(GeForce)? *GT *420(M)?.*			2		1 -NVIDIA GT 425M					.*NVIDIA.*(GeForce)? *GT *425(M)?.*			3		1 -NVIDIA GT 430M					.*NVIDIA.*(GeForce)? *GT *430(M)?.*			3		1 -NVIDIA GT 435M					.*NVIDIA.*(GeForce)? *GT *435(M)?.*			3		1 -NVIDIA GT 440M					.*NVIDIA.*(GeForce)? *GT *440(M)?.*			3		1 -NVIDIA GT 445M					.*NVIDIA.*(GeForce)? *GT *445(M)?.*			3		1 -NVIDIA GT 450M					.*NVIDIA.*(GeForce)? *GT *450(M)?.*			3		1 -NVIDIA GT 520M					.*NVIDIA.*(GeForce)? *GT *520(M)?.*			3		1 -NVIDIA GT 525M					.*NVIDIA.*(GeForce)? *GT *525(M)?.*			3		1 -NVIDIA GT 540M					.*NVIDIA.*(GeForce)? *GT *540(M)?.*			3		1 -NVIDIA GT 550M					.*NVIDIA.*(GeForce)? *GT *550(M)?.*			3		1 -NVIDIA GT 555M					.*NVIDIA.*(GeForce)? *GT *555(M)?.*			3		1 -NVIDIA GTS 160M					.*NVIDIA.*(GeForce)? *GT(S)? *160(M)?.*		2		1 -NVIDIA GTS 240					.*NVIDIA.*(GeForce)? *GTS *24.*				3		1 -NVIDIA GTS 250					.*NVIDIA.*(GeForce)? *GTS *25.*				3		1 -NVIDIA GTS 350M					.*NVIDIA.*(GeForce)? *GTS *350M.*			3		1 -NVIDIA GTS 360M					.*NVIDIA.*(GeForce)? *GTS *360M.*			3		1 -NVIDIA GTS 360					.*NVIDIA.*(GeForce)? *GTS *360.*			3		1 -NVIDIA GTS 450					.*NVIDIA.*(GeForce)? *GTS *45.*				3		1 -NVIDIA GTX 260					.*NVIDIA.*(GeForce)? *GTX *26.*				3		1 -NVIDIA GTX 275					.*NVIDIA.*(GeForce)? *GTX *275.*			3		1 -NVIDIA GTX 270					.*NVIDIA.*(GeForce)? *GTX *27.*				3		1 -NVIDIA GTX 285					.*NVIDIA.*(GeForce)? *GTX *285.*			3		1 -NVIDIA GTX 280					.*NVIDIA.*(GeForce)? *GTX *280.*			3		1 -NVIDIA GTX 290					.*NVIDIA.*(GeForce)? *GTX *290.*			3		1 -NVIDIA GTX 295					.*NVIDIA.*(GeForce)? *GTX *295.*			3		1 -NVIDIA GTX 460M					.*NVIDIA.*(GeForce)? *GTX *460M.*			3		1 -NVIDIA GTX 465					.*NVIDIA.*(GeForce)? *GTX *465.*			3		1 -NVIDIA GTX 460					.*NVIDIA.*(GeForce)? *GTX *46.*				3		1 -NVIDIA GTX 470M					.*NVIDIA.*(GeForce)? *GTX *470M.*			3		1 -NVIDIA GTX 470					.*NVIDIA.*(GeForce)? *GTX *47.*				3		1 -NVIDIA GTX 480M					.*NVIDIA.*(GeForce)? *GTX *480M.*			3		1 -NVIDIA GTX 485M					.*NVIDIA.*(GeForce)? *GTX *485M.*			3		1 -NVIDIA GTX 480					.*NVIDIA.*(GeForce)? *GTX *48.*				3		1 -NVIDIA GTX 530					.*NVIDIA.*(GeForce)? *GTX *53.*				3		1 -NVIDIA GTX 550					.*NVIDIA.*(GeForce)? *GTX *55.*				3		1 -NVIDIA GTX 560					.*NVIDIA.*(GeForce)? *GTX *56.*				3		1 -NVIDIA GTX 570					.*NVIDIA.*(GeForce)? *GTX *57.*				3		1 -NVIDIA GTX 580M					.*NVIDIA.*(GeForce)? *GTX *580M.*			3		1 -NVIDIA GTX 580					.*NVIDIA.*(GeForce)? *GTX *58.*				3		1 -NVIDIA GTX 590					.*NVIDIA.*(GeForce)? *GTX *59.*				3		1 -NVIDIA C51						.*NVIDIA.*(GeForce)? *C51.*					0		1 -NVIDIA G72						.*NVIDIA.*(GeForce)? *G72.*					1		1 -NVIDIA G73						.*NVIDIA.*(GeForce)? *G73.*					1		1 -NVIDIA G84						.*NVIDIA.*(GeForce)? *G84.*					2		1 -NVIDIA G86						.*NVIDIA.*(GeForce)? *G86.*					3		1 -NVIDIA G92						.*NVIDIA.*(GeForce)? *G92.*					3		1 +NVIDIA 205						.*NVIDIA .*GeForce 205.*					2		1 +NVIDIA 210						.*NVIDIA .*GeForce 210.*					2		1 +NVIDIA 310M						.*NVIDIA .*GeForce 310M.*					1		1 +NVIDIA 310						.*NVIDIA .*GeForce 310.*					3		1 +NVIDIA 315M						.*NVIDIA .*GeForce 315M.*					2		1 +NVIDIA 315						.*NVIDIA .*GeForce 315.*					3		1 +NVIDIA 320M						.*NVIDIA .*GeForce 320M.*					2		1 +NVIDIA G100M					.*NVIDIA .*100M.*							0		1 +NVIDIA G100						.*NVIDIA .*100.*							0		1 +NVIDIA G102M					.*NVIDIA .*102M.*							0		1 +NVIDIA G103M					.*NVIDIA .*103M.*							0		1 +NVIDIA G105M					.*NVIDIA .*105M.*							0		1 +NVIDIA G 110M					.*NVIDIA .*110M.*							0		1 +NVIDIA G 120M					.*NVIDIA .*120M.*							1		1 +NVIDIA G 200					.*NVIDIA .*200(M)?.*						0		1 +NVIDIA G 205M					.*NVIDIA .*205(M)?.*						0		1 +NVIDIA G 210					.*NVIDIA .*210(M)?.*						1		1 +NVIDIA 305M						.*NVIDIA .*305(M)?.*						1		1 +NVIDIA G 310M					.*NVIDIA .*310(M)?.*						2		1 +NVIDIA G 315					.*NVIDIA .*315(M)?.*						2		1 +NVIDIA G 320M					.*NVIDIA .*320(M)?.*						2		1 +NVIDIA G 405					.*NVIDIA .*405(M)?.*						1		1 +NVIDIA G 410M					.*NVIDIA .*410(M)?.*						1		1 +NVIDIA GT 120M					.*NVIDIA .*GT *120(M)?.*					2		1 +NVIDIA GT 120					.*NVIDIA .*GT.*120							2		1 +NVIDIA GT 130M					.*NVIDIA .*GT *130(M)?.*					2		1 +NVIDIA GT 140M					.*NVIDIA .*GT *140(M)?.*					2		1 +NVIDIA GT 150M					.*NVIDIA .*GT(S)? *150(M)?.*				2		1 +NVIDIA GT 160M					.*NVIDIA .*GT *160(M)?.*					2		1 +NVIDIA GT 220M					.*NVIDIA .*GT *220(M)?.*					2		1 +NVIDIA GT 230M					.*NVIDIA .*GT *230(M)?.*					2		1 +NVIDIA GT 240M					.*NVIDIA .*GT *240(M)?.*					2		1 +NVIDIA GT 250M					.*NVIDIA .*GT *250(M)?.*					2		1 +NVIDIA GT 260M					.*NVIDIA .*GT *260(M)?.*					2		1 +NVIDIA GT 320M					.*NVIDIA .*GT *320(M)?.*					2		1 +NVIDIA GT 325M					.*NVIDIA .*GT *325(M)?.*					0		1 +NVIDIA GT 330M					.*NVIDIA .*GT *330(M)?.*					3		1 +NVIDIA GT 335M					.*NVIDIA .*GT *335(M)?.*					1		1 +NVIDIA GT 340M					.*NVIDIA .*GT *340(M)?.*					2		1 +NVIDIA GT 415M					.*NVIDIA .*GT *415(M)?.*					2		1 +NVIDIA GT 420M					.*NVIDIA .*GT *420(M)?.*					2		1 +NVIDIA GT 425M					.*NVIDIA .*GT *425(M)?.*					3		1 +NVIDIA GT 430M					.*NVIDIA .*GT *430(M)?.*					3		1 +NVIDIA GT 435M					.*NVIDIA .*GT *435(M)?.*					3		1 +NVIDIA GT 440M					.*NVIDIA .*GT *440(M)?.*					3		1 +NVIDIA GT 445M					.*NVIDIA .*GT *445(M)?.*					3		1 +NVIDIA GT 450M					.*NVIDIA .*GT *450(M)?.*					3		1 +NVIDIA GT 520M					.*NVIDIA .*GT *52.(M)?.*					3		1 +NVIDIA GT 530M					.*NVIDIA .*GT *530(M)?.*					3		1 +NVIDIA GT 540M					.*NVIDIA .*GT *54.(M)?.*					3		1 +NVIDIA GT 550M					.*NVIDIA .*GT *550(M)?.*					3		1 +NVIDIA GT 555M					.*NVIDIA .*GT *555(M)?.*					3		1 +NVIDIA GTS 160M					.*NVIDIA .*GT(S)? *160(M)?.*				2		1 +NVIDIA GTS 240					.*NVIDIA .*GTS *24.*						3		1 +NVIDIA GTS 250					.*NVIDIA .*GTS *25.*						3		1 +NVIDIA GTS 350M					.*NVIDIA .*GTS *350M.*						3		1 +NVIDIA GTS 360M					.*NVIDIA .*GTS *360M.*						3		1 +NVIDIA GTS 360					.*NVIDIA .*GTS *360.*						3		1 +NVIDIA GTS 450					.*NVIDIA .*GTS *45.*						3		1 +NVIDIA GTX 260					.*NVIDIA .*GTX *26.*						3		1 +NVIDIA GTX 275					.*NVIDIA .*GTX *275.*						3		1 +NVIDIA GTX 270					.*NVIDIA .*GTX *27.*						3		1 +NVIDIA GTX 285					.*NVIDIA .*GTX *285.*						3		1 +NVIDIA GTX 280					.*NVIDIA .*GTX *280.*						3		1 +NVIDIA GTX 290					.*NVIDIA .*GTX *290.*						3		1 +NVIDIA GTX 295					.*NVIDIA .*GTX *295.*						3		1 +NVIDIA GTX 460M					.*NVIDIA .*GTX *460M.*						3		1 +NVIDIA GTX 465					.*NVIDIA .*GTX *465.*						3		1 +NVIDIA GTX 460					.*NVIDIA .*GTX *46.*						3		1 +NVIDIA GTX 470M					.*NVIDIA .*GTX *470M.*						3		1 +NVIDIA GTX 470					.*NVIDIA .*GTX *47.*						3		1 +NVIDIA GTX 480M					.*NVIDIA .*GTX *480M.*						3		1 +NVIDIA GTX 485M					.*NVIDIA .*GTX *485M.*						3		1 +NVIDIA GTX 480					.*NVIDIA .*GTX *48.*						3		1 +NVIDIA GTX 530					.*NVIDIA .*GTX *53.*						3		1 +NVIDIA GTX 550					.*NVIDIA .*GTX *55.*						3		1 +NVIDIA GTX 560					.*NVIDIA .*GTX *56.*						3		1 +NVIDIA GTX 570					.*NVIDIA .*GTX *57.*						3		1 +NVIDIA GTX 580M					.*NVIDIA .*GTX *580M.*						3		1 +NVIDIA GTX 580					.*NVIDIA .*GTX *58.*						3		1 +NVIDIA GTX 590					.*NVIDIA .*GTX *59.*						3		1 +NVIDIA C51						.*NVIDIA .*C51.*							0		1 +NVIDIA G72						.*NVIDIA .*G72.*							1		1 +NVIDIA G73						.*NVIDIA .*G73.*							1		1 +NVIDIA G84						.*NVIDIA .*G84.*							2		1 +NVIDIA G86						.*NVIDIA .*G86.*							3		1 +NVIDIA G92						.*NVIDIA .*G92.*							3		1  NVIDIA GeForce					.*GeForce 256.*								0		0  NVIDIA GeForce 2				.*GeForce ?2 ?.*							0		1  NVIDIA GeForce 3				.*GeForce ?3 ?.*							0		1  NVIDIA GeForce 3 Ti				.*GeForce ?3 Ti.*							0		1 -NVIDIA GeForce 4				.*NVIDIA.*GeForce ?4.*						0		1 -NVIDIA GeForce 4 Go				.*NVIDIA.*GeForce ?4.*Go.*					0		1 -NVIDIA GeForce 4 MX				.*NVIDIA.*GeForce ?4 MX.*					0		1 -NVIDIA GeForce 4 PCX			.*NVIDIA.*GeForce ?4 PCX.*					0		1 -NVIDIA GeForce 4 Ti				.*NVIDIA.*GeForce ?4 Ti.*					0		1 -NVIDIA GeForce 6100				.*NVIDIA.*GeForce 61.*						0		1 -NVIDIA GeForce 6200				.*NVIDIA.*GeForce 62.*						0		1 -NVIDIA GeForce 6500				.*NVIDIA.*GeForce 65.*						0		1 -NVIDIA GeForce 6600				.*NVIDIA.*GeForce 66.*						1		1 -NVIDIA GeForce 6700				.*NVIDIA.*GeForce 67.*						2		1 -NVIDIA GeForce 6800				.*NVIDIA.*GeForce 68.*						2		1 -NVIDIA GeForce 7000				.*NVIDIA.*GeForce 70.*						0		1 -NVIDIA GeForce 7100				.*NVIDIA.*GeForce 71.*						0		1 -NVIDIA GeForce 7200				.*NVIDIA.*GeForce 72.*						1		1 -NVIDIA GeForce 7300				.*NVIDIA.*GeForce 73.*						1		1 -NVIDIA GeForce 7500				.*NVIDIA.*GeForce 75.*						1		1 -NVIDIA GeForce 7600				.*NVIDIA.*GeForce 76.*						2		1 -NVIDIA GeForce 7800				.*NVIDIA.*GeForce 78.*						2		1 -NVIDIA GeForce 7900				.*NVIDIA.*GeForce 79.*						2		1 -NVIDIA GeForce 8100				.*NVIDIA.*GeForce 81.*						1		1 -NVIDIA GeForce 8200M			.*NVIDIA.*GeForce 8200M.*					1		1 -NVIDIA GeForce 8200				.*NVIDIA.*GeForce 82.*						1		1 -NVIDIA GeForce 8300				.*NVIDIA.*GeForce 83.*						1		1 -NVIDIA GeForce 8400M			.*NVIDIA.*GeForce 8400M.*					1		1 -NVIDIA GeForce 8400				.*NVIDIA.*GeForce 84.*						1		1 -NVIDIA GeForce 8500				.*NVIDIA.*GeForce 85.*						3		1 -NVIDIA GeForce 8600M			.*NVIDIA.*GeForce 8600M.*					1		1 -NVIDIA GeForce 8600				.*NVIDIA.*GeForce 86.*						3		1 -NVIDIA GeForce 8700M			.*NVIDIA.*GeForce 8700M.*					3		1 -NVIDIA GeForce 8700				.*NVIDIA.*GeForce 87.*						3		1 -NVIDIA GeForce 8800M			.*NVIDIA.*GeForce 8800M.*					3		1 -NVIDIA GeForce 8800				.*NVIDIA.*GeForce 88.*						3		1 -NVIDIA GeForce 9100M			.*NVIDIA.*GeForce 9100M.*					0		1 -NVIDIA GeForce 9100				.*NVIDIA.*GeForce 91.*						0		1 -NVIDIA GeForce 9200M			.*NVIDIA.*GeForce 9200M.*					1		1 -NVIDIA GeForce 9200				.*NVIDIA.*GeForce 92.*						1		1 -NVIDIA GeForce 9300M			.*NVIDIA.*GeForce 9300M.*					1		1 -NVIDIA GeForce 9300				.*NVIDIA.*GeForce 93.*						1		1 -NVIDIA GeForce 9400M			.*NVIDIA.*GeForce 9400M.*					1		1 -NVIDIA GeForce 9400				.*NVIDIA.*GeForce 94.*						1		1 -NVIDIA GeForce 9500M			.*NVIDIA.*GeForce 9500M.*					2		1 -NVIDIA GeForce 9500				.*NVIDIA.*GeForce 95.*						2		1 -NVIDIA GeForce 9600M			.*NVIDIA.*GeForce 9600M.*					3		1 -NVIDIA GeForce 9600				.*NVIDIA.*GeForce 96.*						2		1 -NVIDIA GeForce 9700M			.*NVIDIA.*GeForce 9700M.*					2		1 -NVIDIA GeForce 9800M			.*NVIDIA.*GeForce 9800M.*					3		1 -NVIDIA GeForce 9800				.*NVIDIA.*GeForce 98.*						3		1 -NVIDIA GeForce FX 5100			.*NVIDIA.*GeForce FX 51.*					0		1 -NVIDIA GeForce FX 5200			.*NVIDIA.*GeForce FX 52.*					0		1 -NVIDIA GeForce FX 5300			.*NVIDIA.*GeForce FX 53.*					0		1 -NVIDIA GeForce FX 5500			.*NVIDIA.*GeForce FX 55.*					0		1 -NVIDIA GeForce FX 5600			.*NVIDIA.*GeForce FX 56.*					0		1 -NVIDIA GeForce FX 5700			.*NVIDIA.*GeForce FX 57.*					1		1 -NVIDIA GeForce FX 5800			.*NVIDIA.*GeForce FX 58.*					1		1 -NVIDIA GeForce FX 5900			.*NVIDIA.*GeForce FX 59.*					1		1 -NVIDIA GeForce FX Go5100		.*NVIDIA.*GeForce FX Go51.*					0		1 -NVIDIA GeForce FX Go5200		.*NVIDIA.*GeForce FX Go52.*					0		1 -NVIDIA GeForce FX Go5300		.*NVIDIA.*GeForce FX Go53.*					0		1 -NVIDIA GeForce FX Go5500		.*NVIDIA.*GeForce FX Go55.*					0		1 -NVIDIA GeForce FX Go5600		.*NVIDIA.*GeForce FX Go56.*					0		1 -NVIDIA GeForce FX Go5700		.*NVIDIA.*GeForce FX Go57.*					1		1 -NVIDIA GeForce FX Go5800		.*NVIDIA.*GeForce FX Go58.*					1		1 -NVIDIA GeForce FX Go5900		.*NVIDIA.*GeForce FX Go59.*					1		1 -NVIDIA GeForce FX Go5xxx		.*NVIDIA.*GeForce FX Go.*					0		1 -NVIDIA GeForce Go 6100			.*NVIDIA.*GeForce Go 61.*					0		1 -NVIDIA GeForce Go 6200			.*NVIDIA.*GeForce Go 62.*					0		1 -NVIDIA GeForce Go 6400			.*NVIDIA.*GeForce Go 64.*					1		1 -NVIDIA GeForce Go 6500			.*NVIDIA.*GeForce Go 65.*					1		1 -NVIDIA GeForce Go 6600			.*NVIDIA.*GeForce Go 66.*					1		1 -NVIDIA GeForce Go 6700			.*NVIDIA.*GeForce Go 67.*					1		1 -NVIDIA GeForce Go 6800			.*NVIDIA.*GeForce Go 68.*					1		1 -NVIDIA GeForce Go 7200			.*NVIDIA.*GeForce Go 72.*					1		1 -NVIDIA GeForce Go 7300 LE		.*NVIDIA.*GeForce Go 73.*LE.*				0		1 -NVIDIA GeForce Go 7300			.*NVIDIA.*GeForce Go 73.*					1		1 -NVIDIA GeForce Go 7400			.*NVIDIA.*GeForce Go 74.*					1		1 -NVIDIA GeForce Go 7600			.*NVIDIA.*GeForce Go 76.*					2		1 -NVIDIA GeForce Go 7700			.*NVIDIA.*GeForce Go 77.*					2		1 -NVIDIA GeForce Go 7800			.*NVIDIA.*GeForce Go 78.*					2		1 -NVIDIA GeForce Go 7900			.*NVIDIA.*GeForce Go 79.*					2		1 -NVIDIA D9M						.*NVIDIA.*D9M.*								1		1 -NVIDIA G94						.*NVIDIA.*G94.*								3		1 +NVIDIA GeForce 4				.*NVIDIA .*GeForce ?4.*						0		1 +NVIDIA GeForce 4 Go				.*NVIDIA .*GeForce ?4.*Go.*					0		1 +NVIDIA GeForce 4 MX				.*NVIDIA .*GeForce ?4 MX.*					0		1 +NVIDIA GeForce 4 PCX			.*NVIDIA .*GeForce ?4 PCX.*					0		1 +NVIDIA GeForce 4 Ti				.*NVIDIA .*GeForce ?4 Ti.*					0		1 +NVIDIA GeForce 6100				.*NVIDIA .*GeForce 61.*						0		1 +NVIDIA GeForce 6200				.*NVIDIA .*GeForce 62.*						0		1 +NVIDIA GeForce 6500				.*NVIDIA .*GeForce 65.*						0		1 +NVIDIA GeForce 6600				.*NVIDIA .*GeForce 66.*						1		1 +NVIDIA GeForce 6700				.*NVIDIA .*GeForce 67.*						2		1 +NVIDIA GeForce 6800				.*NVIDIA .*GeForce 68.*						2		1 +NVIDIA GeForce 7000				.*NVIDIA .*GeForce 70.*						0		1 +NVIDIA GeForce 7100				.*NVIDIA .*GeForce 71.*						0		1 +NVIDIA GeForce 7200				.*NVIDIA .*GeForce 72.*						1		1 +NVIDIA GeForce 7300				.*NVIDIA .*GeForce 73.*						1		1 +NVIDIA GeForce 7500				.*NVIDIA .*GeForce 75.*						1		1 +NVIDIA GeForce 7600				.*NVIDIA .*GeForce 76.*						2		1 +NVIDIA GeForce 7800				.*NVIDIA .*GeForce 78.*						2		1 +NVIDIA GeForce 7900				.*NVIDIA .*GeForce 79.*						2		1 +NVIDIA GeForce 8100				.*NVIDIA .*GeForce 81.*						1		1 +NVIDIA GeForce 8200M			.*NVIDIA .*GeForce 8200M.*					1		1 +NVIDIA GeForce 8200				.*NVIDIA .*GeForce 82.*						1		1 +NVIDIA GeForce 8300				.*NVIDIA .*GeForce 83.*						1		1 +NVIDIA GeForce 8400M			.*NVIDIA .*GeForce 8400M.*					1		1 +NVIDIA GeForce 8400				.*NVIDIA .*GeForce 84.*						1		1 +NVIDIA GeForce 8500				.*NVIDIA .*GeForce 85.*						3		1 +NVIDIA GeForce 8600M			.*NVIDIA .*GeForce 8600M.*					1		1 +NVIDIA GeForce 8600				.*NVIDIA .*GeForce 86.*						3		1 +NVIDIA GeForce 8700M			.*NVIDIA .*GeForce 8700M.*					3		1 +NVIDIA GeForce 8700				.*NVIDIA .*GeForce 87.*						3		1 +NVIDIA GeForce 8800M			.*NVIDIA .*GeForce 8800M.*					3		1 +NVIDIA GeForce 8800				.*NVIDIA .*GeForce 88.*						3		1 +NVIDIA GeForce 9100M			.*NVIDIA .*GeForce 9100M.*					0		1 +NVIDIA GeForce 9100				.*NVIDIA .*GeForce 91.*						0		1 +NVIDIA GeForce 9200M			.*NVIDIA .*GeForce 9200M.*					1		1 +NVIDIA GeForce 9200				.*NVIDIA .*GeForce 92.*						1		1 +NVIDIA GeForce 9300M			.*NVIDIA .*GeForce 9300M.*					1		1 +NVIDIA GeForce 9300				.*NVIDIA .*GeForce 93.*						1		1 +NVIDIA GeForce 9400M			.*NVIDIA .*GeForce 9400M.*					1		1 +NVIDIA GeForce 9400				.*NVIDIA .*GeForce 94.*						1		1 +NVIDIA GeForce 9500M			.*NVIDIA .*GeForce 9500M.*					2		1 +NVIDIA GeForce 9500				.*NVIDIA .*GeForce 95.*						2		1 +NVIDIA GeForce 9600M			.*NVIDIA .*GeForce 9600M.*					3		1 +NVIDIA GeForce 9600				.*NVIDIA .*GeForce 96.*						2		1 +NVIDIA GeForce 9700M			.*NVIDIA .*GeForce 9700M.*					2		1 +NVIDIA GeForce 9800M			.*NVIDIA .*GeForce 9800M.*					3		1 +NVIDIA GeForce 9800				.*NVIDIA .*GeForce 98.*						3		1 +NVIDIA GeForce FX 5100			.*NVIDIA .*GeForce FX 51.*					0		1 +NVIDIA GeForce FX 5200			.*NVIDIA .*GeForce FX 52.*					0		1 +NVIDIA GeForce FX 5300			.*NVIDIA .*GeForce FX 53.*					0		1 +NVIDIA GeForce FX 5500			.*NVIDIA .*GeForce FX 55.*					0		1 +NVIDIA GeForce FX 5600			.*NVIDIA .*GeForce FX 56.*					0		1 +NVIDIA GeForce FX 5700			.*NVIDIA .*GeForce FX 57.*					1		1 +NVIDIA GeForce FX 5800			.*NVIDIA .*GeForce FX 58.*					1		1 +NVIDIA GeForce FX 5900			.*NVIDIA .*GeForce FX 59.*					1		1 +NVIDIA GeForce FX Go5100		.*NVIDIA .*GeForce FX Go51.*				0		1 +NVIDIA GeForce FX Go5200		.*NVIDIA .*GeForce FX Go52.*				0		1 +NVIDIA GeForce FX Go5300		.*NVIDIA .*GeForce FX Go53.*				0		1 +NVIDIA GeForce FX Go5500		.*NVIDIA .*GeForce FX Go55.*				0		1 +NVIDIA GeForce FX Go5600		.*NVIDIA .*GeForce FX Go56.*				0		1 +NVIDIA GeForce FX Go5700		.*NVIDIA .*GeForce FX Go57.*				1		1 +NVIDIA GeForce FX Go5800		.*NVIDIA .*GeForce FX Go58.*				1		1 +NVIDIA GeForce FX Go5900		.*NVIDIA .*GeForce FX Go59.*				1		1 +NVIDIA GeForce FX Go5xxx		.*NVIDIA .*GeForce FX Go.*					0		1 +NVIDIA GeForce Go 6100			.*NVIDIA .*GeForce Go 61.*					0		1 +NVIDIA GeForce Go 6200			.*NVIDIA .*GeForce Go 62.*					0		1 +NVIDIA GeForce Go 6400			.*NVIDIA .*GeForce Go 64.*					1		1 +NVIDIA GeForce Go 6500			.*NVIDIA .*GeForce Go 65.*					1		1 +NVIDIA GeForce Go 6600			.*NVIDIA .*GeForce Go 66.*					1		1 +NVIDIA GeForce Go 6700			.*NVIDIA .*GeForce Go 67.*					1		1 +NVIDIA GeForce Go 6800			.*NVIDIA .*GeForce Go 68.*					1		1 +NVIDIA GeForce Go 7200			.*NVIDIA .*GeForce Go 72.*					1		1 +NVIDIA GeForce Go 7300 LE		.*NVIDIA .*GeForce Go 73.*LE.*				0		1 +NVIDIA GeForce Go 7300			.*NVIDIA .*GeForce Go 73.*					1		1 +NVIDIA GeForce Go 7400			.*NVIDIA .*GeForce Go 74.*					1		1 +NVIDIA GeForce Go 7600			.*NVIDIA .*GeForce Go 76.*					2		1 +NVIDIA GeForce Go 7700			.*NVIDIA .*GeForce Go 77.*					2		1 +NVIDIA GeForce Go 7800			.*NVIDIA .*GeForce Go 78.*					2		1 +NVIDIA GeForce Go 7900			.*NVIDIA .*GeForce Go 79.*					2		1 +NVIDIA D9M						.*NVIDIA .*D9M.*							1		1 +NVIDIA G94						.*NVIDIA .*G94.*							3		1  NVIDIA GeForce Go 6				.*GeForce Go 6.*							1		1 -NVIDIA ION 2					.*NVIDIA ION 2.*							2		1 -NVIDIA ION						.*NVIDIA ION.*								2		1 -NVIDIA NB9M						.*GeForce NB9M.*							1		1 -NVIDIA NB9P						.*GeForce NB9P.*							1		1 +NVIDIA ION 2					.*NVIDIA .*ION 2.*							2		1 +NVIDIA ION 						.*NVIDIA .*ION.*							2		1 +NVIDIA NB8M						.*NVIDIA .*NB8M.*							1		1 +NVIDIA NB8P						.*NVIDIA .*NB8P.*							2		1 +NVIDIA NB9E						.*NVIDIA .*NB9E.*							3		1 +NVIDIA NB9M						.*NVIDIA .*NB9M.*							1		1 +NVIDIA NB9P						.*NVIDIA .*NB9P.*							2		1 +NVIDIA N10						.*NVIDIA .*N10.*							1		1  NVIDIA GeForce PCX				.*GeForce PCX.*								0		1 -NVIDIA Generic					.*NVIDIA.*Unknown.*							0		0 -NVIDIA NV17						.*GeForce NV17.*							0		1 -NVIDIA NV34						.*NVIDIA.*NV34.*							0		1 -NVIDIA NV35						.*NVIDIA.*NV35.*							0		1 -NVIDIA NV36						.*GeForce NV36.*							1		1 -NVIDIA NV43						.*NVIDIA *NV43.*							1		1 -NVIDIA NV44						.*NVIDIA *NV44.*							1		1 -NVIDIA nForce					.*NVIDIA *nForce.*							0		0 -NVIDIA MCP78					.*NVIDIA *MCP78.*							1		1 +NVIDIA Generic					.*NVIDIA .*Unknown.*						0		0 +NVIDIA NV17						.*NVIDIA .*NV17.*							0		1 +NVIDIA NV34						.*NVIDIA .*NV34.*							0		1 +NVIDIA NV35						.*NVIDIA .*NV35.*							0		1 +NVIDIA NV36						.*NVIDIA .*NV36.*							1		1 +NVIDIA NV41						.*NVIDIA .*NV41.*							1		1 +NVIDIA NV43						.*NVIDIA .*NV43.*							1		1 +NVIDIA NV44						.*NVIDIA .*NV44.*							1		1 +NVIDIA nForce					.*NVIDIA .*nForce.*							0		0 +NVIDIA MCP51					.*NVIDIA .*MCP51.*							1		1 +NVIDIA MCP61					.*NVIDIA .*MCP61.*							1		1 +NVIDIA MCP67					.*NVIDIA .*MCP67.*							1		1 +NVIDIA MCP68					.*NVIDIA .*MCP68.*							1		1 +NVIDIA MCP73					.*NVIDIA .*MCP73.*							1		1 +NVIDIA MCP77					.*NVIDIA .*MCP77.*							1		1 +NVIDIA MCP78					.*NVIDIA .*MCP78.*							1		1 +NVIDIA MCP79					.*NVIDIA .*MCP79.*							1		1 +NVIDIA MCP7A					.*NVIDIA .*MCP7A.*							1		1  NVIDIA Quadro2					.*Quadro2.*									0		1  NVIDIA Quadro 1000M				.*Quadro.*1000M.*							2		1 -NVIDIA Quadro 2000 M/D			.*Quadro.*2000(M|D)?.*						3		1 +NVIDIA Quadro 2000 M/D			.*Quadro.*2000.*							3		1 +NVIDIA Quadro 3000M				.*Quadro.*3000M.*							3		1  NVIDIA Quadro 4000M				.*Quadro.*4000M.*							3		1  NVIDIA Quadro 4000				.*Quadro *4000.*							3		1 -NVIDIA Quadro 50x0 M			.*Quadro.*50.0(M)?.*						3		1 +NVIDIA Quadro 50x0 M			.*Quadro.*50.0.*							3		1  NVIDIA Quadro 6000				.*Quadro.*6000.*							3		1  NVIDIA Quadro 400				.*Quadro.*400.*								2		1  NVIDIA Quadro 600				.*Quadro.*600.*								2		1  NVIDIA Quadro4					.*Quadro4.*									0		1  NVIDIA Quadro DCC				.*Quadro DCC.*								0		1 +NVIDIA Quadro CX				.*Quadro.*CX.*								3		1  NVIDIA Quadro FX 770M			.*Quadro.*FX *770M.*						2		1  NVIDIA Quadro FX 1500M			.*Quadro.*FX *1500M.*						1		1  NVIDIA Quadro FX 1600M			.*Quadro.*FX *1600M.*						2		1 @@ -498,16 +513,16 @@ NVIDIA Quadro FX 3700			.*Quadro.*FX *3700.*						3		1  NVIDIA Quadro FX 3800			.*Quadro.*FX *3800.*						3		1  NVIDIA Quadro FX 4500			.*Quadro.*FX *45.*							3		1  NVIDIA Quadro FX 880M			.*Quadro.*FX *880M.*						3		1 -NVIDIA Quadro FX 4800			.*NVIDIA.*Quadro *FX *4800.*				3		1 +NVIDIA Quadro FX 4800			.*NVIDIA .*Quadro *FX *4800.*				3		1  NVIDIA Quadro FX				.*Quadro FX.*								1		1  NVIDIA Quadro NVS 1xxM			.*Quadro NVS *1.[05]M.*						0		1 -NVIDIA Quadro NVS 300M			.*NVIDIA.*NVS *300M.*						2		1 -NVIDIA Quadro NVS 320M			.*NVIDIA.*NVS *320M.*						2		1 -NVIDIA Quadro NVS 2100M			.*NVIDIA.*NVS *2100M.*						2		1 -NVIDIA Quadro NVS 3100M			.*NVIDIA.*NVS *3100M.*						2		1 -NVIDIA Quadro NVS 4200M			.*NVIDIA.*NVS *4200M.*						2		1 -NVIDIA Quadro NVS 5100M			.*NVIDIA.*NVS *5100M.*						2		1 -NVIDIA Quadro NVS				.*NVIDIA.*NVS								0		1 +NVIDIA Quadro NVS 300M			.*NVIDIA .*NVS *300M.*						2		1 +NVIDIA Quadro NVS 320M			.*NVIDIA .*NVS *320M.*						2		1 +NVIDIA Quadro NVS 2100M			.*NVIDIA .*NVS *2100M.*						2		1 +NVIDIA Quadro NVS 3100M			.*NVIDIA .*NVS *3100M.*						2		1 +NVIDIA Quadro NVS 4200M			.*NVIDIA .*NVS *4200M.*						2		1 +NVIDIA Quadro NVS 5100M			.*NVIDIA .*NVS *5100M.*						2		1 +NVIDIA Quadro NVS				.*NVIDIA .*NVS								0		1  NVIDIA RIVA TNT					.*RIVA TNT.*								0		0  S3								.*S3 Graphics.*								0		0  SiS								SiS.*										0		0 @@ -517,3 +532,4 @@ XGI								XGI.*										0		0  VIA								VIA.*										0		0  Apple Generic					Apple.*Generic.*							0		0  Apple Software Renderer			Apple.*Software Renderer.*					0		0 +Humper							Humper.*									0		1 diff --git a/indra/newview/icons/beta/secondlife.icns b/indra/newview/icons/beta/secondlife.icns Binary files differnew file mode 100644 index 0000000000..1fa50547bb --- /dev/null +++ b/indra/newview/icons/beta/secondlife.icns diff --git a/indra/newview/icons/beta/secondlife.ico b/indra/newview/icons/beta/secondlife.ico Binary files differnew file mode 100644 index 0000000000..9bdd21b904 --- /dev/null +++ b/indra/newview/icons/beta/secondlife.ico diff --git a/indra/newview/icons/beta/secondlife_128.png b/indra/newview/icons/beta/secondlife_128.png Binary files differnew file mode 100644 index 0000000000..fa42aa764b --- /dev/null +++ b/indra/newview/icons/beta/secondlife_128.png diff --git a/indra/newview/icons/beta/secondlife_16.png b/indra/newview/icons/beta/secondlife_16.png Binary files differnew file mode 100644 index 0000000000..ff648cf3fc --- /dev/null +++ b/indra/newview/icons/beta/secondlife_16.png diff --git a/indra/newview/icons/beta/secondlife_256.BMP b/indra/newview/icons/beta/secondlife_256.BMP Binary files differnew file mode 100644 index 0000000000..97bd67d3d6 --- /dev/null +++ b/indra/newview/icons/beta/secondlife_256.BMP diff --git a/indra/newview/icons/beta/secondlife_256.png b/indra/newview/icons/beta/secondlife_256.png Binary files differnew file mode 100644 index 0000000000..245e2c3e9f --- /dev/null +++ b/indra/newview/icons/beta/secondlife_256.png diff --git a/indra/newview/icons/beta/secondlife_32.png b/indra/newview/icons/beta/secondlife_32.png Binary files differnew file mode 100644 index 0000000000..fd7f46bf4d --- /dev/null +++ b/indra/newview/icons/beta/secondlife_32.png diff --git a/indra/newview/icons/beta/secondlife_48.png b/indra/newview/icons/beta/secondlife_48.png Binary files differnew file mode 100644 index 0000000000..cc3a795e2b --- /dev/null +++ b/indra/newview/icons/beta/secondlife_48.png diff --git a/indra/newview/icons/beta/secondlife_512.png b/indra/newview/icons/beta/secondlife_512.png Binary files differnew file mode 100644 index 0000000000..a959bd9a9e --- /dev/null +++ b/indra/newview/icons/beta/secondlife_512.png diff --git a/indra/newview/icons/development/secondlife.icns b/indra/newview/icons/development/secondlife.icns Binary files differnew file mode 100644 index 0000000000..44f63d384c --- /dev/null +++ b/indra/newview/icons/development/secondlife.icns diff --git a/indra/newview/icons/development/secondlife.ico b/indra/newview/icons/development/secondlife.ico Binary files differnew file mode 100644 index 0000000000..b53f23ae58 --- /dev/null +++ b/indra/newview/icons/development/secondlife.ico diff --git a/indra/newview/icons/development/secondlife_128.png b/indra/newview/icons/development/secondlife_128.png Binary files differnew file mode 100644 index 0000000000..9b9fe656fc --- /dev/null +++ b/indra/newview/icons/development/secondlife_128.png diff --git a/indra/newview/skins/minimal/textures/bottomtray/close_off.png b/indra/newview/icons/development/secondlife_16.png Binary files differindex 241a24bde9..91493a033c 100644 --- a/indra/newview/skins/minimal/textures/bottomtray/close_off.png +++ b/indra/newview/icons/development/secondlife_16.png diff --git a/indra/newview/icons/development/secondlife_256.BMP b/indra/newview/icons/development/secondlife_256.BMP Binary files differnew file mode 100644 index 0000000000..174b22319a --- /dev/null +++ b/indra/newview/icons/development/secondlife_256.BMP diff --git a/indra/newview/icons/development/secondlife_256.png b/indra/newview/icons/development/secondlife_256.png Binary files differnew file mode 100644 index 0000000000..29ed40abdc --- /dev/null +++ b/indra/newview/icons/development/secondlife_256.png diff --git a/indra/newview/icons/development/secondlife_32.png b/indra/newview/icons/development/secondlife_32.png Binary files differnew file mode 100644 index 0000000000..3b84f5ec77 --- /dev/null +++ b/indra/newview/icons/development/secondlife_32.png diff --git a/indra/newview/icons/development/secondlife_48.png b/indra/newview/icons/development/secondlife_48.png Binary files differnew file mode 100644 index 0000000000..d2636d9d72 --- /dev/null +++ b/indra/newview/icons/development/secondlife_48.png diff --git a/indra/newview/icons/development/secondlife_512.png b/indra/newview/icons/development/secondlife_512.png Binary files differnew file mode 100644 index 0000000000..75f9b231f4 --- /dev/null +++ b/indra/newview/icons/development/secondlife_512.png diff --git a/indra/newview/icons/project/secondlife.icns b/indra/newview/icons/project/secondlife.icns Binary files differnew file mode 100644 index 0000000000..d6e26a8ed9 --- /dev/null +++ b/indra/newview/icons/project/secondlife.icns diff --git a/indra/newview/icons/project/secondlife.ico b/indra/newview/icons/project/secondlife.ico Binary files differnew file mode 100644 index 0000000000..ebb27e5325 --- /dev/null +++ b/indra/newview/icons/project/secondlife.ico diff --git a/indra/newview/icons/project/secondlife_128.png b/indra/newview/icons/project/secondlife_128.png Binary files differnew file mode 100644 index 0000000000..d67b8228f9 --- /dev/null +++ b/indra/newview/icons/project/secondlife_128.png diff --git a/indra/newview/skins/minimal/textures/bottomtray/close_press.png b/indra/newview/icons/project/secondlife_16.png Binary files differindex 3ed9c99a26..91493a033c 100644 --- a/indra/newview/skins/minimal/textures/bottomtray/close_press.png +++ b/indra/newview/icons/project/secondlife_16.png diff --git a/indra/newview/icons/project/secondlife_256.BMP b/indra/newview/icons/project/secondlife_256.BMP Binary files differnew file mode 100644 index 0000000000..cd890725f8 --- /dev/null +++ b/indra/newview/icons/project/secondlife_256.BMP diff --git a/indra/newview/icons/project/secondlife_256.png b/indra/newview/icons/project/secondlife_256.png Binary files differnew file mode 100644 index 0000000000..cccfaf7cba --- /dev/null +++ b/indra/newview/icons/project/secondlife_256.png diff --git a/indra/newview/icons/project/secondlife_32.png b/indra/newview/icons/project/secondlife_32.png Binary files differnew file mode 100644 index 0000000000..ad7b33f789 --- /dev/null +++ b/indra/newview/icons/project/secondlife_32.png diff --git a/indra/newview/icons/project/secondlife_48.png b/indra/newview/icons/project/secondlife_48.png Binary files differnew file mode 100644 index 0000000000..104a931fbc --- /dev/null +++ b/indra/newview/icons/project/secondlife_48.png diff --git a/indra/newview/icons/project/secondlife_512.png b/indra/newview/icons/project/secondlife_512.png Binary files differnew file mode 100644 index 0000000000..74e2fa9bc6 --- /dev/null +++ b/indra/newview/icons/project/secondlife_512.png diff --git a/indra/newview/icons/release/secondlife.icns b/indra/newview/icons/release/secondlife.icns Binary files differnew file mode 100644 index 0000000000..e15e34140d --- /dev/null +++ b/indra/newview/icons/release/secondlife.icns diff --git a/indra/newview/icons/release/secondlife.ico b/indra/newview/icons/release/secondlife.ico Binary files differnew file mode 100644 index 0000000000..28bf1e7664 --- /dev/null +++ b/indra/newview/icons/release/secondlife.ico diff --git a/indra/newview/icons/release/secondlife_128.png b/indra/newview/icons/release/secondlife_128.png Binary files differnew file mode 100644 index 0000000000..bcf94dcae8 --- /dev/null +++ b/indra/newview/icons/release/secondlife_128.png diff --git a/indra/newview/icons/release/secondlife_16.png b/indra/newview/icons/release/secondlife_16.png Binary files differnew file mode 100644 index 0000000000..90311ea8b0 --- /dev/null +++ b/indra/newview/icons/release/secondlife_16.png diff --git a/indra/newview/icons/release/secondlife_256.BMP b/indra/newview/icons/release/secondlife_256.BMP Binary files differnew file mode 100644 index 0000000000..74deedd7d3 --- /dev/null +++ b/indra/newview/icons/release/secondlife_256.BMP diff --git a/indra/newview/icons/release/secondlife_256.png b/indra/newview/icons/release/secondlife_256.png Binary files differnew file mode 100644 index 0000000000..a89fb4c74f --- /dev/null +++ b/indra/newview/icons/release/secondlife_256.png diff --git a/indra/newview/icons/release/secondlife_32.png b/indra/newview/icons/release/secondlife_32.png Binary files differnew file mode 100644 index 0000000000..530e8fc80c --- /dev/null +++ b/indra/newview/icons/release/secondlife_32.png diff --git a/indra/newview/icons/release/secondlife_48.png b/indra/newview/icons/release/secondlife_48.png Binary files differnew file mode 100644 index 0000000000..cb33c51f8a --- /dev/null +++ b/indra/newview/icons/release/secondlife_48.png diff --git a/indra/newview/icons/release/secondlife_512.png b/indra/newview/icons/release/secondlife_512.png Binary files differnew file mode 100644 index 0000000000..f291e60586 --- /dev/null +++ b/indra/newview/icons/release/secondlife_512.png diff --git a/indra/newview/icons/test/secondlife.icns b/indra/newview/icons/test/secondlife.icns Binary files differnew file mode 100644 index 0000000000..eb8d16a7e7 --- /dev/null +++ b/indra/newview/icons/test/secondlife.icns diff --git a/indra/newview/icons/test/secondlife.ico b/indra/newview/icons/test/secondlife.ico Binary files differnew file mode 100644 index 0000000000..ceb8e8e6eb --- /dev/null +++ b/indra/newview/icons/test/secondlife.ico diff --git a/indra/newview/icons/test/secondlife_128.png b/indra/newview/icons/test/secondlife_128.png Binary files differnew file mode 100644 index 0000000000..019f65db28 --- /dev/null +++ b/indra/newview/icons/test/secondlife_128.png diff --git a/indra/newview/icons/test/secondlife_16.png b/indra/newview/icons/test/secondlife_16.png Binary files differnew file mode 100644 index 0000000000..91493a033c --- /dev/null +++ b/indra/newview/icons/test/secondlife_16.png diff --git a/indra/newview/icons/test/secondlife_256.BMP b/indra/newview/icons/test/secondlife_256.BMP Binary files differnew file mode 100644 index 0000000000..e23fcfdbe9 --- /dev/null +++ b/indra/newview/icons/test/secondlife_256.BMP diff --git a/indra/newview/icons/test/secondlife_256.png b/indra/newview/icons/test/secondlife_256.png Binary files differnew file mode 100644 index 0000000000..f402424c51 --- /dev/null +++ b/indra/newview/icons/test/secondlife_256.png diff --git a/indra/newview/icons/test/secondlife_32.png b/indra/newview/icons/test/secondlife_32.png Binary files differnew file mode 100644 index 0000000000..80d6efe13d --- /dev/null +++ b/indra/newview/icons/test/secondlife_32.png diff --git a/indra/newview/icons/test/secondlife_48.png b/indra/newview/icons/test/secondlife_48.png Binary files differnew file mode 100644 index 0000000000..bba938feba --- /dev/null +++ b/indra/newview/icons/test/secondlife_48.png diff --git a/indra/newview/icons/test/secondlife_512.png b/indra/newview/icons/test/secondlife_512.png Binary files differnew file mode 100644 index 0000000000..10ff65312b --- /dev/null +++ b/indra/newview/icons/test/secondlife_512.png diff --git a/indra/newview/installers/windows/lang_zh.nsi b/indra/newview/installers/windows/lang_zh.nsi Binary files differindex 4b7e4810ed..f4fb70a726 100644 --- a/indra/newview/installers/windows/lang_zh.nsi +++ b/indra/newview/installers/windows/lang_zh.nsi diff --git a/indra/newview/llaccountingcostmanager.cpp b/indra/newview/llaccountingcostmanager.cpp new file mode 100644 index 0000000000..8767955fcb --- /dev/null +++ b/indra/newview/llaccountingcostmanager.cpp @@ -0,0 +1,181 @@ +/**  + * @file LLAccountingQuotaManager.cpp + * @ Handles the setting and accessing for costs associated with mesh  + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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 "llaccountingcostmanager.h" +#include "llagent.h" +#include "llcurl.h" +#include "llhttpclient.h" +//=============================================================================== +LLAccountingCostManager::LLAccountingCostManager() +{	 +} +//=============================================================================== +class LLAccountingCostResponder : public LLCurl::Responder +{ +public: +	LLAccountingCostResponder( const LLSD& objectIDs, const LLHandle<LLAccountingCostObserver>& observer_handle ) +	: mObjectIDs( objectIDs ), +	  mObserverHandle( observer_handle ) +	{ +		LLAccountingCostObserver* observer = mObserverHandle.get(); +		if (observer) +		{ +			mTransactionID = observer->getTransactionID(); +		} +	} + +	void clearPendingRequests ( void ) +	{ +		for ( LLSD::array_iterator iter = mObjectIDs.beginArray(); iter != mObjectIDs.endArray(); ++iter ) +		{ +			LLAccountingCostManager::getInstance()->removePendingObject( iter->asUUID() ); +		} +	} +	 +	void error( U32 statusNum, const std::string& reason ) +	{ +		llwarns	<< "Transport error "<<reason<<llendl;	 +		clearPendingRequests(); + +		LLAccountingCostObserver* observer = mObserverHandle.get(); +		if (observer && observer->getTransactionID() == mTransactionID) +		{ +			observer->setErrorStatus(statusNum, reason); +		} +	} +	 +	void result( const LLSD& content ) +	{ +		//Check for error +		if ( !content.isMap() || content.has("error") ) +		{ +			llwarns	<< "Error on fetched data"<< llendl; +		} +		else if (content.has("selected")) +		{ +			F32 physicsCost		= 0.0f; +			F32 networkCost		= 0.0f; +			F32 simulationCost	= 0.0f; + +			physicsCost		= content["selected"]["physics"].asReal(); +			networkCost		= content["selected"]["streaming"].asReal(); +			simulationCost	= content["selected"]["simulation"].asReal(); +				 +			SelectionCost selectionCost( /*transactionID,*/ physicsCost, networkCost, simulationCost ); + +			LLAccountingCostObserver* observer = mObserverHandle.get(); +			if (observer && observer->getTransactionID() == mTransactionID) +			{ +				observer->onWeightsUpdate(selectionCost); +			} +		} + +		clearPendingRequests(); +	} +	 +private: +	//List of posted objects +	LLSD mObjectIDs; + +	// Current request ID +	LLUUID mTransactionID; + +	// Cost update observer handle +	LLHandle<LLAccountingCostObserver> mObserverHandle; +}; +//=============================================================================== +void LLAccountingCostManager::fetchCosts( eSelectionType selectionType, +										  const std::string& url, +										  const LLHandle<LLAccountingCostObserver>& observer_handle ) +{ +	// Invoking system must have already determined capability availability +	if ( !url.empty() ) +	{ +		LLSD objectList; +		U32  objectIndex = 0; +		 +		IDIt IDIter = mObjectList.begin(); +		IDIt IDIterEnd = mObjectList.end(); +		 +		for ( ; IDIter != IDIterEnd; ++IDIter ) +		{ +			// Check to see if a request for this object has already been made. +			if ( mPendingObjectQuota.find( *IDIter ) ==	mPendingObjectQuota.end() ) +			{ +				mPendingObjectQuota.insert( *IDIter ); +				objectList[objectIndex++] = *IDIter; +			} +		} +	 +		mObjectList.clear(); +		 +		//Post results +		if ( objectList.size() > 0 ) +		{ +			std::string keystr; +			if ( selectionType == Roots )  +			{  +				keystr="selected_roots";  +			} +			else +			if ( selectionType == Prims )  +			{  +				keystr="selected_prims"; +			} +			else  +			{ +				llinfos<<"Invalid selection type "<<llendl; +				mObjectList.clear(); +				mPendingObjectQuota.clear(); +				return; +			} +			 +			LLSD dataToPost = LLSD::emptyMap();		 +			dataToPost[keystr.c_str()] = objectList; + +			LLHTTPClient::post( url, dataToPost, new LLAccountingCostResponder( objectList, observer_handle )); +		} +	} +	else +	{ +		//url was empty - warn & continue +		llwarns<<"Supplied url is empty "<<llendl; +		mObjectList.clear(); +		mPendingObjectQuota.clear(); +	} +} +//=============================================================================== +void LLAccountingCostManager::addObject( const LLUUID& objectID ) +{ +	mObjectList.insert( objectID ); +} +//=============================================================================== +void LLAccountingCostManager::removePendingObject( const LLUUID& objectID ) +{ +	mPendingObjectQuota.erase( objectID ); +} +//=============================================================================== diff --git a/indra/newview/llaccountingquotamanager.h b/indra/newview/llaccountingcostmanager.h index 9251ef9351..0bca1f54ef 100644 --- a/indra/newview/llaccountingquotamanager.h +++ b/indra/newview/llaccountingcostmanager.h @@ -27,29 +27,49 @@  #ifndef LL_ACCOUNTINGQUOTAMANAGER_H  #define LL_ACCOUNTINGQUOTAMANAGER_H  //=============================================================================== -#include "llaccountingquota.h" +#include "llhandle.h" + +#include "llaccountingcost.h" +//=============================================================================== +// An interface class for panels which display the parcel accounting information. +class LLAccountingCostObserver +{ +public: +	LLAccountingCostObserver() { mObserverHandle.bind(this); } +	virtual ~LLAccountingCostObserver() {} +	virtual void onWeightsUpdate(const SelectionCost& selection_cost) = 0; +	virtual void setErrorStatus(U32 status, const std::string& reason) = 0; +	const LLHandle<LLAccountingCostObserver>& getObserverHandle() const { return mObserverHandle; } +	const LLUUID& getTransactionID() { return mTransactionID; } + +protected: +	virtual void generateTransactionID() = 0; + +	LLRootHandle<LLAccountingCostObserver> mObserverHandle; +	LLUUID		mTransactionID; +};  //=============================================================================== -class LLAccountingQuotaManager : public LLSingleton<LLAccountingQuotaManager> +class LLAccountingCostManager : public LLSingleton<LLAccountingCostManager>  {  public:  	//Ctor -	LLAccountingQuotaManager(); +	LLAccountingCostManager();  	//Store an object that will be eventually fetched -	void updateObjectCost( const LLUUID& objectID ); +	void addObject( const LLUUID& objectID );  	//Request quotas for object list -	void fetchQuotas( const std::string& url ); +	void fetchCosts( eSelectionType selectionType, const std::string& url, +			const LLHandle<LLAccountingCostObserver>& observer_handle );  	//Delete a specific object from the pending list -	void removePendingObjectQuota( const LLUUID& objectID ); +	void removePendingObject( const LLUUID& objectID );  private: -	//Set of objects that need to update their cost -	std::set<LLUUID> mUpdateObjectQuota; -	//During fetchQuota we move object into a the pending set to signify that  +	//Set of objects that will be used to generate a cost +	std::set<LLUUID> mObjectList; +	//During fetchCosts we move object into a the pending set to signify that   	//a fetch has been instigated.  	std::set<LLUUID> mPendingObjectQuota;  	typedef std::set<LLUUID>::iterator IDIt;  };  //=============================================================================== -#endif // LLACCOUNTINGQUOTAMANAGER - +#endif // LLACCOUNTINGCOSTMANAGER diff --git a/indra/newview/llaccountingquotamanager.cpp b/indra/newview/llaccountingquotamanager.cpp deleted file mode 100644 index a4f5de5632..0000000000 --- a/indra/newview/llaccountingquotamanager.cpp +++ /dev/null @@ -1,278 +0,0 @@ -/**  - * @file LLAccountingQuotaManager.cpp - * @ Handles the setting and accessing for costs associated with mesh  - * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, 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 "llaccountingquotamanager.h" -#include "llagent.h" -#include "llviewerregion.h" -#include "llviewerobject.h" -#include "llviewerobjectlist.h" -#include "llviewerparcelmgr.h" -#include "llparcel.h" - -//=============================================================================== -LLAccountingQuotaManager::LLAccountingQuotaManager() -{	 -} -//=============================================================================== -class LLAccountingQuotaResponder : public LLCurl::Responder -{ -public: -	LLAccountingQuotaResponder( const LLSD& objectIDs ) -	: mObjectIDs( objectIDs ) -	{ -	} -		 -	void clearPendingRequests ( void ) -	{ -		for ( LLSD::array_iterator iter = mObjectIDs.beginArray(); iter != mObjectIDs.endArray(); ++iter ) -		{ -			LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( iter->asUUID() ); -		} -	} -	 -	void error( U32 statusNum, const std::string& reason ) -	{ -		llwarns	<< "Transport error "<<reason<<llendl;	 -		//prep#do we really want to remove all because of one failure - verify -		clearPendingRequests(); -	} -	 -	void result( const LLSD& content ) -	{ -		if ( !content.isMap() || content.has("error") ) -		{ -			llwarns	<< "Error on fetched data"<< llendl; -			//prep#do we really want to remove all because of one failure - verify -			clearPendingRequests(); -			return; -		} -		 -		//Differentiate what the incoming caps could be from the data	 -		bool containsParcel    = content.has("parcel"); -		bool containsSelection = content.has("selected"); -					 -		//Loop over the stored object ids checking against the incoming data -		for ( LLSD::array_iterator iter = mObjectIDs.beginArray(); iter != mObjectIDs.endArray(); ++iter ) -		{ -			LLUUID objectID = iter->asUUID(); -						 -			LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( objectID ); -				 -			if ( containsParcel ) -			{ -					//Typically should be one -					S32 dataCount = content["parcel"].size(); -					for(S32 i = 0; i < dataCount; i++) -					{ -						//prep#todo verify that this is safe, otherwise just add a bool -						LLUUID parcelId; -						//S32 parcelOwner = 0; -						if ( content["parcel"][i].has("parcel_id") ) -						{ -							parcelId = content["parcel"][i]["parcel_id"].asUUID(); -						} -						 -						//if ( content["parcel"][i].has("parcel_owner") ) -						//{ -						//	parcelOwner = content["parcel"][i]["parcel_owner"].asInteger(); -						//} -											 -						F32 ownerRenderCost		= 0; -						F32 ownerPhysicsCost	= 0; -						F32 ownerNetworkCost	= 0; -						F32 ownerSimulationCost = 0; -						 -						F32 groupRenderCost		= 0; -						F32 groupPhysicsCost	= 0; -						F32 groupNetworkCost	= 0; -						F32 groupSimulationCost = 0; -						 -						F32 otherRenderCost		= 0; -						F32 otherPhysicsCost	= 0; -						F32 otherNetworkCost	= 0; -						F32 otherSimulationCost = 0; -						 -						F32 tempRenderCost		= 0; -						F32 tempPhysicsCost		= 0; -						F32 tempNetworkCost		= 0; -						F32 tempSimulationCost  = 0; -						 -						F32 selectedRenderCost		= 0; -						F32 selectedPhysicsCost		= 0; -						F32 selectedNetworkCost		= 0; -						F32 selectedSimulationCost  = 0; -						 -						F32 parcelCapacity			= 0; - -						if ( content["parcel"][i].has("capacity") ) -						{ -							parcelCapacity =  content["parcel"][i].has("capacity"); -						} - -						if ( content["parcel"][i].has("owner") ) -						{ -							ownerRenderCost		= content["parcel"][i]["owner"]["rendering"].asReal(); -							ownerPhysicsCost	= content["parcel"][i]["owner"]["physics"].asReal(); -							ownerNetworkCost	= content["parcel"][i]["owner"]["streaming"].asReal(); -							ownerSimulationCost = content["parcel"][i]["owner"]["simulation"].asReal();							 -						} - -						if ( content["parcel"][i].has("group") ) -						{ -							groupRenderCost		= content["parcel"][i]["group"]["rendering"].asReal(); -							groupPhysicsCost	= content["parcel"][i]["group"]["physics"].asReal(); -							groupNetworkCost	= content["parcel"][i]["group"]["streaming"].asReal(); -							groupSimulationCost = content["parcel"][i]["group"]["simulation"].asReal(); -							 -						} -						if ( content["parcel"][i].has("other") ) -						{ -							otherRenderCost		= content["parcel"][i]["other"]["rendering"].asReal(); -							otherPhysicsCost	= content["parcel"][i]["other"]["physics"].asReal(); -							otherNetworkCost	= content["parcel"][i]["other"]["streaming"].asReal(); -							otherSimulationCost = content["parcel"][i]["other"]["simulation"].asReal(); -						} -						 -						if ( content["parcel"][i].has("temp") ) -						{ -							tempRenderCost		= content["parcel"][i]["total"]["rendering"].asReal(); -							tempPhysicsCost		= content["parcel"][i]["total"]["physics"].asReal(); -							tempNetworkCost		= content["parcel"][i]["total"]["streaming"].asReal(); -							tempSimulationCost  = content["parcel"][i]["total"]["simulation"].asReal();							 -						} - -						if ( content["parcel"][i].has("selected") ) -						{ -							selectedRenderCost		= content["parcel"][i]["total"]["rendering"].asReal(); -							selectedPhysicsCost		= content["parcel"][i]["total"]["physics"].asReal(); -							selectedNetworkCost		= content["parcel"][i]["total"]["streaming"].asReal(); -							selectedSimulationCost  = content["parcel"][i]["total"]["simulation"].asReal();							 -						} -						 -						ParcelQuota parcelQuota( ownerRenderCost,	 ownerPhysicsCost,	  ownerNetworkCost,    ownerSimulationCost, -												 groupRenderCost,	 groupPhysicsCost,	  groupNetworkCost,    groupSimulationCost, -												 otherRenderCost,	 otherPhysicsCost,	  otherNetworkCost,    otherSimulationCost, -												 tempRenderCost,	 tempPhysicsCost,	  tempNetworkCost,	   tempSimulationCost, -												 selectedRenderCost, selectedPhysicsCost, selectedNetworkCost, selectedSimulationCost, -												 parcelCapacity ); -						//Update the Parcel						 -						LLParcel* pParcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel(); -						if ( pParcel ) -						{ -							pParcel->updateQuota( objectID, parcelQuota );  -						} -					}					 -				} -			else  -			if ( containsSelection ) -			{ -				S32 dataCount = content["selected"].size(); -				for(S32 i = 0; i < dataCount; i++) -				{ -					 -					F32 renderCost		= 0; -					F32 physicsCost		= 0; -					F32 networkCost		= 0; -					F32 simulationCost	= 0; -					 -					LLUUID objectId; -					 -					objectId		= content["selected"][i]["local_id"].asUUID(); -					renderCost		= content["selected"][i]["rendering"].asReal(); -					physicsCost		= content["selected"][i]["physics"].asReal(); -					networkCost		= content["selected"][i]["streaming"].asReal(); -					simulationCost	= content["selected"][i]["simulation"].asReal(); -					 -					SelectionQuota selectionQuota( objectId, renderCost, physicsCost, networkCost, simulationCost ); -					 -					//Update the objects					 -					gObjectList.updateQuota( objectId, selectionQuota );  -					 -				} -			} -			else -			{ -				//Nothing in string  -				LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( objectID ); -			} -		} -	} -	 -private: -	//List of posted objects -	LLSD mObjectIDs; -}; -//=============================================================================== -void LLAccountingQuotaManager::fetchQuotas( const std::string& url ) -{ -	// Invoking system must have already determined capability availability -	if ( !url.empty() ) -	{ -		LLSD objectList; -		U32  objectIndex = 0; -		IDIt IDIter = mUpdateObjectQuota.begin(); -		IDIt IDIterEnd = mUpdateObjectQuota.end(); -		 -		for ( ; IDIter != IDIterEnd; ++IDIter ) -		{ -			// Check to see if a request for this object has already been made. -			if ( mPendingObjectQuota.find( *IDIter ) ==	mPendingObjectQuota.end() ) -			{ -				mPendingObjectQuota.insert( *IDIter );	 -				objectList[objectIndex++] = *IDIter; -			} -		} -	 -		mUpdateObjectQuota.clear(); -		 -		//Post results -		if ( objectList.size() > 0 ) -		{ -			LLSD dataToPost = LLSD::emptyMap();			 -			dataToPost["object_ids"] = objectList; -			LLHTTPClient::post( url, dataToPost, new LLAccountingQuotaResponder( objectList )); -		} -	} -	else -	{ -		//url was empty - warn & continue -		llwarns<<"Supplied url is empty "<<llendl; -		mUpdateObjectQuota.clear(); -		mPendingObjectQuota.clear(); -	} -} -//=============================================================================== -void LLAccountingQuotaManager::updateObjectCost( const LLUUID& objectID ) -{ -	mUpdateObjectQuota.insert( objectID ); -} -//=============================================================================== -void LLAccountingQuotaManager::removePendingObjectQuota( const LLUUID& objectID ) -{ -	mPendingObjectQuota.erase( objectID ); -} -//=============================================================================== diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 492cfe7c1b..773e20eda7 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -36,10 +36,10 @@  #include "llagentwearables.h"  #include "llagentui.h"  #include "llanimationstates.h" -#include "llbottomtray.h"  #include "llcallingcard.h"  #include "llcapabilitylistener.h"  #include "llchannelmanager.h" +#include "llchicletbar.h"  #include "llconsole.h"  #include "llenvmanager.h"  #include "llfirstuse.h" @@ -68,9 +68,11 @@  #include "llstatusbar.h"  #include "llteleportflags.h"  #include "lltool.h" +#include "lltoolbarview.h"  #include "lltoolpie.h"  #include "lltoolmgr.h"  #include "lltrans.h" +#include "lluictrl.h"  #include "llurlentry.h"  #include "llviewercontrol.h"  #include "llviewerdisplay.h" @@ -107,7 +109,6 @@ const F64 CHAT_AGE_FAST_RATE = 3.0;  const F32 MIN_FIDGET_TIME = 8.f; // seconds  const F32 MAX_FIDGET_TIME = 20.f; // seconds -  // The agent instance.  LLAgent gAgent; @@ -115,6 +116,9 @@ LLAgent gAgent;  // Statics  // +/// minimum time after setting away state before coming back based on movement +const F32 LLAgent::MIN_AFK_TIME = 10.0f; +  const F32 LLAgent::TYPING_TIMEOUT_SECS = 5.f;  std::map<std::string, std::string> LLAgent::sTeleportErrorMessages; @@ -150,6 +154,60 @@ bool handleSlowMotionAnimation(const LLSD& newvalue)  	return true;  } +// static +void LLAgent::parcelChangedCallback() +{ +	bool can_edit = LLToolMgr::getInstance()->canEdit(); + +	gAgent.mCanEditParcel = can_edit; +} + +// static +bool LLAgent::isActionAllowed(const LLSD& sdname) +{ +	bool retval = false; + +	const std::string& param = sdname.asString(); + +	if (param == "build") +	{ +		retval = gAgent.canEditParcel(); +	} +	else if (param == "speak") +	{ +		if ( gAgent.isVoiceConnected() ) +		{ +			retval = true; +		} +		else +		{ +			retval = false; +		} +	} + +	return retval; +} + +// static  +void LLAgent::pressMicrophone(const LLSD& name) +{ +	LLFirstUse::speak(false); + +	 LLVoiceClient::getInstance()->inputUserControlState(true); +} + +// static  +void LLAgent::releaseMicrophone(const LLSD& name) +{ +	LLVoiceClient::getInstance()->inputUserControlState(false); +} + +// static +bool LLAgent::isMicrophoneOn(const LLSD& sdname) +{ +	return LLVoiceClient::getInstance()->getUserPTTState(); +} +  // ************************************************************  // Enabled this definition to compile a 'hacked' viewer that  // locally believes the end user has godlike powers. @@ -181,6 +239,7 @@ LLAgent::LLAgent() :  	mbTeleportKeepsLookAt(false),  	mAgentAccess(new LLAgentAccess(gSavedSettings)), +	mCanEditParcel(false),  	mTeleportSourceSLURL(new LLSLURL),  	mTeleportState( TELEPORT_NONE ),  	mRegionp(NULL), @@ -229,6 +288,8 @@ LLAgent::LLAgent() :  	mCurrentFidget(0),  	mFirstLogin(FALSE),  	mGenderChosen(FALSE), +	 +	mVoiceConnected(false),  	mAppearanceSerialNum(0), @@ -244,6 +305,13 @@ LLAgent::LLAgent() :  	mListener.reset(new LLAgentListener(*this));  	mMoveTimer.stop(); + +	LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&LLAgent::parcelChangedCallback)); + +	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Agent.IsActionAllowed", boost::bind(&LLAgent::isActionAllowed, _2)); +	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Agent.PressMicrophone", boost::bind(&LLAgent::pressMicrophone, _2)); +	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Agent.ReleaseMicrophone", boost::bind(&LLAgent::releaseMicrophone, _2)); +	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Agent.IsMicrophoneOn", boost::bind(&LLAgent::isMicrophoneOn, _2));  }  // Requires gSavedSettings to be initialized. @@ -1165,6 +1233,7 @@ void LLAgent::setAFK()  	{  		sendAnimationRequest(ANIM_AGENT_AWAY, ANIM_REQUEST_START);  		setControlFlags(AGENT_CONTROL_AWAY | AGENT_CONTROL_STOP); +		LL_INFOS("AFK") << "Setting Away" << LL_ENDL;  		gAwayTimer.start();  		if (gAFKMenu)  		{ @@ -1188,6 +1257,7 @@ void LLAgent::clearAFK()  	{  		sendAnimationRequest(ANIM_AGENT_AWAY, ANIM_REQUEST_STOP);  		clearControlFlags(AGENT_CONTROL_AWAY); +		LL_INFOS("AFK") << "Clearing Away" << LL_ENDL;  		if (gAFKMenu)  		{  			gAFKMenu->setLabel(LLTrans::getString("AvatarSetAway")); @@ -1793,11 +1863,12 @@ void LLAgent::endAnimationUpdateUI()  	// clean up UI from mode we're leaving  	if (gAgentCamera.getLastCameraMode() == CAMERA_MODE_MOUSELOOK )  	{ +		gToolBarView->setToolBarsVisible(true);  		// show mouse cursor  		gViewerWindow->showCursor();  		// show menus  		gMenuBarView->setVisible(TRUE); -		LLNavigationBar::getInstance()->setVisible(TRUE); +		LLNavigationBar::getInstance()->setVisible(TRUE && gSavedSettings.getBOOL("ShowNavbarNavigationPanel"));  		gStatusBar->setVisibleForMouselook(true);  		if (gSavedSettings.getBOOL("ShowMiniLocationPanel")) @@ -1805,7 +1876,7 @@ void LLAgent::endAnimationUpdateUI()  			LLPanelTopInfoBar::getInstance()->setVisible(TRUE);  		} -		LLBottomTray::getInstance()->onMouselookModeOut(); +		LLChicletBar::getInstance()->setVisible(TRUE);  		LLPanelStandStopFlying::getInstance()->setVisible(TRUE); @@ -1902,14 +1973,19 @@ void LLAgent::endAnimationUpdateUI()  	//---------------------------------------------------------------------  	if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK)  	{ -		// hide menus +		// clean up UI +		// first show anything hidden by UI toggle +		gViewerWindow->setUIVisibility(TRUE); + +		// then hide stuff we want hidden for mouselook  +		gToolBarView->setToolBarsVisible(false);  		gMenuBarView->setVisible(FALSE);  		LLNavigationBar::getInstance()->setVisible(FALSE);  		gStatusBar->setVisibleForMouselook(false);  		LLPanelTopInfoBar::getInstance()->setVisible(FALSE); -		LLBottomTray::getInstance()->onMouselookModeIn(); +		LLChicletBar::getInstance()->setVisible(FALSE);  		LLPanelStandStopFlying::getInstance()->setVisible(FALSE); @@ -3356,8 +3432,15 @@ bool LLAgent::teleportCore(bool is_local)  	// hide the Region/Estate floater  	LLFloaterReg::hideInstance("region_info"); -	// hide the search floater (EXT-8276) -	LLFloaterReg::hideInstance("search"); +	// minimize the Search floater (STORM-1474) +	{ +		LLFloater* instance = LLFloaterReg::getInstance("search"); + +		if (instance && instance->getVisible()) +		{ +			instance->setMinimized(TRUE); +		} +	}  	LLViewerParcelMgr::getInstance()->deselectLand();  	LLViewerMediaFocus::getInstance()->clearFocus(); diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 67ed1923c0..0f7ed9ce68 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -282,7 +282,21 @@ public:  	static void		toggleFlying();  	static bool		enableFlying();  	BOOL			canFly(); 			// Does this parcel allow you to fly? -	 + +	//-------------------------------------------------------------------- +	// Voice +	//-------------------------------------------------------------------- +public: +	bool 			isVoiceConnected() const { return mVoiceConnected; } +	void			setVoiceConnected(const bool b)	{ mVoiceConnected = b; } + +	static void		pressMicrophone(const LLSD& name); +	static void		releaseMicrophone(const LLSD& name); +	static bool		isMicrophoneOn(const LLSD& sdname); + +private: +	bool			mVoiceConnected; +  	//--------------------------------------------------------------------  	// Chat  	//-------------------------------------------------------------------- @@ -318,7 +332,8 @@ public:  	void			setAFK();  	void			clearAFK();  	BOOL			getAFK() const; - +	static const F32 MIN_AFK_TIME; +	  	//--------------------------------------------------------------------  	// Run  	//-------------------------------------------------------------------- @@ -574,6 +589,15 @@ private:   **                                                                            **   *******************************************************************************/ +	// Build +public: +	bool			canEditParcel() const { return mCanEditParcel; } +private: +	bool			mCanEditParcel; + +	static bool isActionAllowed(const LLSD& sdname); +	static void parcelChangedCallback(); +  /********************************************************************************   **                                                                            **   **                    ACCESS diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index c30d3b9aa3..751b73e1eb 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -393,8 +393,6 @@ LLVector3 LLAgentCamera::calcFocusOffset(LLViewerObject *object, LLVector3 origi  	LLQuaternion inv_obj_rot = ~obj_rot; // get inverse of rotation  	LLVector3 object_extents = object->getScale();	 -	const LLVector4a* oe4 = object->mDrawable->getSpatialExtents(); -	object_extents.set( oe4[1][0], oe4[1][1], oe4[1][2] );  	// make sure they object extents are non-zero  	object_extents.clamp(0.001f, F32_MAX); @@ -2042,11 +2040,12 @@ void LLAgentCamera::resetCamera()  //-----------------------------------------------------------------------------  void LLAgentCamera::changeCameraToMouselook(BOOL animate)  { -	if (!gSavedSettings.getBOOL("EnableMouselook") || LLViewerJoystick::getInstance()->getOverrideCamera()) +	if (!gSavedSettings.getBOOL("EnableMouselook")  +		|| LLViewerJoystick::getInstance()->getOverrideCamera())  	{  		return;  	} - +	  	// visibility changes at end of animation  	gViewerWindow->getWindow()->resetBusyCount(); diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 36272f0c7c..13b62cb019 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -33,6 +33,7 @@  #include "llagentwearablesfetch.h"  #include "llappearancemgr.h"  #include "llcallbacklist.h" +#include "llfloatersidepanelcontainer.h"  #include "llgesturemgr.h"  #include "llinventorybridge.h"  #include "llinventoryfunctions.h" @@ -42,7 +43,6 @@  #include "llnotificationsutil.h"  #include "lloutfitobserver.h"  #include "llsidepanelappearance.h" -#include "llsidetray.h"  #include "lltexlayer.h"  #include "lltooldraganddrop.h"  #include "llviewerregion.h" @@ -1168,15 +1168,12 @@ private:  	std::vector<LLWearable*> mWearablesAwaitingItems;  }; -void LLAgentWearables::createStandardWearables(BOOL female) +void LLAgentWearables::createStandardWearables()  { -	llwarns << "Creating Standard " << (female ? "female" : "male") -			<< " Wearables" << llendl; +	llwarns << "Creating standard wearables" << llendl;  	if (!isAgentAvatarValid()) return; -	gAgentAvatarp->setSex(female ? SEX_FEMALE : SEX_MALE); -  	const BOOL create[LLWearableType::WT_COUNT] =   		{  			TRUE,  //LLWearableType::WT_SHAPE @@ -1692,37 +1689,6 @@ void LLAgentWearables::userRemoveWearablesOfType(const LLWearableType::EType &ty  	}  } -// static -void LLAgentWearables::userRemoveAllClothes() -{ -	// We have to do this up front to avoid having to deal with the case of multiple wearables being dirty. -	if (gAgentCamera.cameraCustomizeAvatar()) -	{ -		// switching to outfit editor should automagically save any currently edited wearable -		LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit")); -	} -	userRemoveAllClothesStep2(TRUE); -} - -// static -void LLAgentWearables::userRemoveAllClothesStep2(BOOL proceed) -{ -	if (proceed) -	{ -		gAgentWearables.removeWearable(LLWearableType::WT_SHIRT,true,0); -		gAgentWearables.removeWearable(LLWearableType::WT_PANTS,true,0); -		gAgentWearables.removeWearable(LLWearableType::WT_SHOES,true,0); -		gAgentWearables.removeWearable(LLWearableType::WT_SOCKS,true,0); -		gAgentWearables.removeWearable(LLWearableType::WT_JACKET,true,0); -		gAgentWearables.removeWearable(LLWearableType::WT_GLOVES,true,0); -		gAgentWearables.removeWearable(LLWearableType::WT_UNDERSHIRT,true,0); -		gAgentWearables.removeWearable(LLWearableType::WT_UNDERPANTS,true,0); -		gAgentWearables.removeWearable(LLWearableType::WT_SKIRT,true,0); -		gAgentWearables.removeWearable(LLWearableType::WT_ALPHA,true,0); -		gAgentWearables.removeWearable(LLWearableType::WT_TATTOO,true,0); -	} -} -  // Combines userRemoveAllAttachments() and userAttachMultipleAttachments() logic to  // get attachments into desired state with minimal number of adds/removes.  void LLAgentWearables::userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array) @@ -2046,7 +2012,7 @@ void LLAgentWearables::editWearable(const LLUUID& item_id)  	}  	const BOOL disable_camera_switch = LLWearableType::getDisableCameraSwitch(wearable->getType()); -	LLPanel* panel = LLSideTray::getInstance()->getPanel("sidepanel_appearance"); +	LLPanel* panel = LLFloaterSidePanelContainer::getPanel("appearance");  	LLSidepanelAppearance::editWearable(wearable, panel, disable_camera_switch);  } diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index 3ef50f14da..01cae3ffd8 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -56,7 +56,7 @@ public:  	LLAgentWearables();  	virtual ~LLAgentWearables();  	void 			setAvatarObject(LLVOAvatarSelf *avatar); -	void			createStandardWearables(BOOL female);  +	void			createStandardWearables();   	void			cleanup();  	void			dump(); @@ -165,7 +165,6 @@ private:  	void			removeWearableFinal(const LLWearableType::EType type, bool do_remove_all /*= false*/, U32 index /*= 0*/);  protected:  	static bool		onRemoveWearableDialog(const LLSD& notification, const LLSD& response); -	static void		userRemoveAllClothesStep2(BOOL proceed); // userdata is NULL  	//--------------------------------------------------------------------  	// Server Communication @@ -211,7 +210,6 @@ public:  public:  	static void		userRemoveWearable(const LLWearableType::EType &type, const U32 &index);  	static void		userRemoveWearablesOfType(const LLWearableType::EType &type); -	static void		userRemoveAllClothes();	  	typedef std::vector<LLViewerObject*> llvo_vec_t; diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 1388d9aee0..663257042e 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -34,6 +34,7 @@  #include "llattachmentsmgr.h"  #include "llcommandhandler.h"  #include "lleventtimer.h" +#include "llfloatersidepanelcontainer.h"  #include "llgesturemgr.h"  #include "llinventorybridge.h"  #include "llinventoryfunctions.h" @@ -43,7 +44,6 @@  #include "lloutfitslist.h"  #include "llselectmgr.h"  #include "llsidepanelappearance.h" -#include "llsidetray.h"  #include "llviewerobjectlist.h"  #include "llvoavatar.h"  #include "llvoavatarself.h" @@ -116,7 +116,7 @@ public:  			return true;  		} -		LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD()); +		LLFloaterSidePanelContainer::showPanel("appearance", LLSD());  		return true;  	}  }; @@ -1505,7 +1505,7 @@ void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)  void LLAppearanceMgr::updatePanelOutfitName(const std::string& name)  {  	LLSidepanelAppearance* panel_appearance = -		dynamic_cast<LLSidepanelAppearance *>(LLSideTray::getInstance()->getPanel("sidepanel_appearance")); +		dynamic_cast<LLSidepanelAppearance *>(LLFloaterSidePanelContainer::getPanel("appearance"));  	if (panel_appearance)  	{  		panel_appearance->refreshCurrentOutfitName(name); @@ -1943,7 +1943,7 @@ void LLAppearanceMgr::wearInventoryCategoryOnAvatar( LLInventoryCategory* catego  	if (gAgentCamera.cameraCustomizeAvatar())  	{  		// switching to outfit editor should automagically save any currently edited wearable -		LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit")); +		LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit"));  	}  	LLAppearanceMgr::changeOutfit(TRUE, category->getUUID(), append); @@ -2264,6 +2264,85 @@ void LLAppearanceMgr::updateIsDirty()  	}  } +// *HACK: Must match name in Library or agent inventory +const std::string ROOT_GESTURES_FOLDER = "Gestures"; +const std::string COMMON_GESTURES_FOLDER = "Common Gestures"; +const std::string MALE_GESTURES_FOLDER = "Male Gestures"; +const std::string FEMALE_GESTURES_FOLDER = "Female Gestures"; +const std::string SPEECH_GESTURES_FOLDER = "Speech Gestures"; +const std::string OTHER_GESTURES_FOLDER = "Other Gestures"; + +void LLAppearanceMgr::copyLibraryGestures() +{ +	llinfos << "Copying library gestures" << llendl; + +	// Copy gestures +	LLUUID lib_gesture_cat_id = +		gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE,false,true); +	if (lib_gesture_cat_id.isNull()) +	{ +		llwarns << "Unable to copy gestures, source category not found" << llendl; +	} +	LLUUID dst_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE); + +	std::vector<std::string> gesture_folders_to_copy; +	gesture_folders_to_copy.push_back(MALE_GESTURES_FOLDER); +	gesture_folders_to_copy.push_back(FEMALE_GESTURES_FOLDER); +	gesture_folders_to_copy.push_back(COMMON_GESTURES_FOLDER); +	gesture_folders_to_copy.push_back(SPEECH_GESTURES_FOLDER); +	gesture_folders_to_copy.push_back(OTHER_GESTURES_FOLDER); + +	for(std::vector<std::string>::iterator it = gesture_folders_to_copy.begin(); +		it != gesture_folders_to_copy.end(); +		++it) +	{ +		std::string& folder_name = *it; + +		LLPointer<LLInventoryCallback> cb(NULL); + +		// After copying gestures, activate Common, Other, plus +		// Male and/or Female, depending upon the initial outfit gender. +		ESex gender = gAgentAvatarp->getSex(); + +		std::string activate_male_gestures; +		std::string activate_female_gestures; +		switch (gender) { +			case SEX_MALE: +				activate_male_gestures = MALE_GESTURES_FOLDER; +				break; +			case SEX_FEMALE: +				activate_female_gestures = FEMALE_GESTURES_FOLDER; +				break; +			case SEX_BOTH: +				activate_male_gestures = MALE_GESTURES_FOLDER; +				activate_female_gestures = FEMALE_GESTURES_FOLDER; +				break; +		} + +		if (folder_name == activate_male_gestures || +			folder_name == activate_female_gestures || +			folder_name == COMMON_GESTURES_FOLDER || +			folder_name == OTHER_GESTURES_FOLDER) +		{ +			cb = new ActivateGestureCallback; +		} + +		LLUUID cat_id = findDescendentCategoryIDByName(lib_gesture_cat_id,folder_name); +		if (cat_id.isNull()) +		{ +			llwarns << "failed to find gesture folder for " << folder_name << llendl; +		} +		else +		{ +			llinfos << "initiating fetch and copy for " << folder_name << " cat_id " << cat_id << llendl; +			callAfterCategoryFetch(cat_id, +								   boost::bind(&LLAppearanceMgr::shallowCopyCategory, +											   &LLAppearanceMgr::instance(), +											   cat_id, dst_id, cb)); +		} +	} +} +  void LLAppearanceMgr::autopopulateOutfits()  {  	// If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account) @@ -2285,7 +2364,16 @@ void LLAppearanceMgr::autopopulateOutfits()  void LLAppearanceMgr::onFirstFullyVisible()  {  	gAgentAvatarp->debugAvatarVisible(); -	autopopulateOutfits(); + +	// The auto-populate is failing at the point of generating outfits +	// folders, so don't do the library copy until that is resolved. +	// autopopulateOutfits(); + +	// If this is the first time we've ever logged in, +	// then copy default gestures from the library. +	if (gAgent.isFirstLogin()) { +		copyLibraryGestures(); +	}  }  bool LLAppearanceMgr::updateBaseOutfit() @@ -2463,10 +2551,11 @@ public:  		// add may be processed after login process is finished  		if (mShowPanel)  		{ -			LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key); +			LLFloaterSidePanelContainer::showPanel("appearance", "panel_outfits_inventory", key); +  		}  		LLOutfitsList *outfits_list = -			dynamic_cast<LLOutfitsList*>(LLSideTray::getInstance()->getPanel("outfitslist_tab")); +			dynamic_cast<LLOutfitsList*>(LLFloaterSidePanelContainer::getPanel("appearance", "outfitslist_tab"));  		if (outfits_list)  		{  			outfits_list->setSelectedOutfitByUUID(mFolderID); diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 4b1d95cf25..c1d561781d 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -151,6 +151,9 @@ public:  	// Create initial outfits from library.  	void autopopulateOutfits(); + +	// Copy initial gestures from library. +	void copyLibraryGestures();  	void wearBaseOutfit(); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 80ac385e3b..e38f86d0fc 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -81,7 +81,6 @@  #include "llviewermenufile.h"  #include "llvoicechannel.h"  #include "llvoavatarself.h" -#include "llsidetray.h"  #include "llurlmatch.h"  #include "lltextutil.h"  #include "lllogininstance.h" @@ -110,6 +109,7 @@  // Third party library includes  #include <boost/bind.hpp> +#include <boost/foreach.hpp>  #if LL_WINDOWS @@ -137,6 +137,7 @@  #include "lltoolmgr.h"  #include "llassetstorage.h"  #include "llpolymesh.h" +#include "llproxy.h"  #include "llaudioengine.h"  #include "llstreamingaudio.h"  #include "llviewermenu.h" @@ -246,7 +247,6 @@ extern BOOL gDebugGL;  ////////////////////////////////////////////////////////////  // All from the last globals push... -const F32 DEFAULT_AFK_TIMEOUT = 5.f * 60.f; // time with no input before user flagged as Away From Keyboard  F32 gSimLastTime; // Used in LLAppViewer::init and send_stats()  F32 gSimFrames; @@ -321,6 +321,41 @@ static std::string gLaunchFileOnQuit;  // Used on Win32 for other apps to identify our window (eg, win_setup)  const char* const VIEWER_WINDOW_CLASSNAME = "Second Life"; +//-- LLDeferredTaskList ------------------------------------------------------ + +/** + * A list of deferred tasks. + * + * We sometimes need to defer execution of some code until the viewer gets idle, + * e.g. removing an inventory item from within notifyObservers() may not work out. + * + * Tasks added to this list will be executed in the next LLAppViewer::idle() iteration. + * All tasks are executed only once. + */ +class LLDeferredTaskList: public LLSingleton<LLDeferredTaskList> +{ +	LOG_CLASS(LLDeferredTaskList); + +	friend class LLAppViewer; +	typedef boost::signals2::signal<void()> signal_t; + +	void addTask(const signal_t::slot_type& cb) +	{ +		mSignal.connect(cb); +	} + +	void run() +	{ +		if (!mSignal.empty()) +		{ +			mSignal(); +			mSignal.disconnect_all_slots(); +		} +	} + +	signal_t mSignal; +}; +  //----------------------------------------------------------------------------  // List of entries from strings.xml to always replace @@ -394,8 +429,11 @@ static bool app_metrics_qa_mode = false;  void idle_afk_check()  {  	// check idle timers -	if (gSavedSettings.getS32("AFKTimeout") && (gAwayTriggerTimer.getElapsedTimeF32() > gSavedSettings.getS32("AFKTimeout"))) +	F32 current_idle = gAwayTriggerTimer.getElapsedTimeF32(); +	F32 afk_timeout  = gSavedSettings.getS32("AFKTimeout"); +	if (afk_timeout && (current_idle > afk_timeout) && ! gAgent.getAFK())  	{ +		LL_INFOS("IdleAway") << "Idle more than " << afk_timeout << " seconds: automatically changing to Away status" << LL_ENDL;  		gAgent.setAFK();  	}  } @@ -469,18 +507,6 @@ void request_initial_instant_messages()  	}  } -// A settings system callback for CrashSubmitBehavior -bool handleCrashSubmitBehaviorChanged(const LLSD& newvalue) -{ -	S32 cb = newvalue.asInteger(); -	const S32 NEVER_SUBMIT_REPORT = 2; -	if(cb == NEVER_SUBMIT_REPORT) -	{ -		LLAppViewer::instance()->destroyMainloopTimeout(); -	} -	return true; -} -  // Use these strictly for things that are constructed at startup,  // or for things that are performance critical.  JC  static void settings_to_globals() @@ -612,9 +638,6 @@ bool LLAppViewer::sendURLToOtherInstance(const std::string& url)  // Static members.  // The single viewer app.  LLAppViewer* LLAppViewer::sInstance = NULL; - -const std::string LLAppViewer::sGlobalSettingsName = "Global";  -  LLTextureCache* LLAppViewer::sTextureCache = NULL;   LLImageDecodeThread* LLAppViewer::sImageDecodeThread = NULL;   LLTextureFetch* LLAppViewer::sTextureFetch = NULL;  @@ -665,7 +688,7 @@ LLAppViewer::~LLAppViewer()  }  bool LLAppViewer::init() -{ +{	  	//  	// Start of the application  	// @@ -698,6 +721,11 @@ bool LLAppViewer::init()  	LL_INFOS("InitInfo") << "Configuration initialized." << LL_ENDL ; +	//set the max heap size. +	initMaxHeapSize() ; + +	LLPrivateMemoryPoolManager::initClass((BOOL)gSavedSettings.getBOOL("MemoryPrivatePoolEnabled"), (U32)gSavedSettings.getU32("MemoryPrivatePoolSize")) ; +  	// write Google Breakpad minidump files to our log directory  	std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "");  	logdir += gDirUtilp->getDirDelimiter(); @@ -723,7 +751,7 @@ bool LLAppViewer::init()      // *NOTE:Mani - LLCurl::initClass is not thread safe.       // Called before threads are created. -    LLCurl::initClass(); +    LLCurl::initClass(gSavedSettings.getBOOL("CurlUseMultipleThreads"));  	LL_INFOS("InitInfo") << "LLCurl initialized." << LL_ENDL ;      LLMachineID::init(); @@ -746,6 +774,29 @@ bool LLAppViewer::init()      initThreads();  	LL_INFOS("InitInfo") << "Threads initialized." << LL_ENDL ; +	// Initialize settings early so that the defaults for ignorable dialogs are +	// picked up and then correctly re-saved after launching the updater (STORM-1268). +	LLUI::settings_map_t settings_map; +	settings_map["config"] = &gSavedSettings; +	settings_map["ignores"] = &gWarningSettings; +	settings_map["floater"] = &gSavedSettings; // *TODO: New settings file +	settings_map["account"] = &gSavedPerAccountSettings; + +	LLUI::initClass(settings_map, +		LLUIImageList::getInstance(), +		ui_audio_callback, +		&LLUI::sGLScaleFactor); +	LL_INFOS("InitInfo") << "UI initialized." << LL_ENDL ; + +	// Setup paths and LLTrans after LLUI::initClass has been called. +	LLUI::setupPaths(); +	LLTransUtil::parseStrings("strings.xml", default_trans_args); +	LLTransUtil::parseLanguageStrings("language_settings.xml"); + +	// Setup notifications after LLUI::setupPaths() has been called. +	LLNotifications::instance(); +	LL_INFOS("InitInfo") << "Notifications initialized." << LL_ENDL ; +      writeSystemInfo();  	// Initialize updater service (now that we have an io pump) @@ -772,16 +823,6 @@ bool LLAppViewer::init()  	LL_INFOS("InitInfo") << "J2C Engine is: " << LLImageJ2C::getEngineInfo() << LL_ENDL;  	LL_INFOS("InitInfo") << "libcurl version is: " << LLCurl::getVersionString() << LL_ENDL; -	// Get the single value from the crash settings file, if it exists -	std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE); -	gCrashSettings.loadFromFile(crash_settings_filename); -	if(gSavedSettings.getBOOL("IgnoreAllNotifications")) -	{ -		gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, CRASH_BEHAVIOR_ALWAYS_SEND); -		gCrashSettings.saveToFile(crash_settings_filename, FALSE); -	} -	LL_INFOS("InitInfo") << "Crash settings done." << LL_ENDL ; -  	/////////////////////////////////////////////////  	// OS-specific login dialogs  	///////////////////////////////////////////////// @@ -797,24 +838,7 @@ bool LLAppViewer::init()  	{  		LLError::setPrintLocation(true);  	} -	 -	// Widget construction depends on LLUI being initialized -	LLUI::settings_map_t settings_map; -	settings_map["config"] = &gSavedSettings; -	settings_map["ignores"] = &gWarningSettings; -	settings_map["floater"] = &gSavedSettings; // *TODO: New settings file -	settings_map["account"] = &gSavedPerAccountSettings; -	LLUI::initClass(settings_map, -		LLUIImageList::getInstance(), -		ui_audio_callback, -		&LLUI::sGLScaleFactor); -	 -	// Setup paths and LLTrans after LLUI::initClass has been called -	LLUI::setupPaths(); -	LLTransUtil::parseStrings("strings.xml", default_trans_args);		 -	LLTransUtil::parseLanguageStrings("language_settings.xml"); -	  	// LLKeyboard relies on LLUI to know what some accelerator keys are called.  	LLKeyboard::setStringTranslatorFunc( LLTrans::getKeyboardString ); @@ -1056,7 +1080,7 @@ bool LLAppViewer::init()  	//EXT-7013 - On windows for some locale (Japanese) standard   	//datetime formatting functions didn't support some parameters such as "weekday".  	//Names for days and months localized in xml are also useful for Polish locale(STORM-107). -	std::string language = LLControlGroup::getInstance(sGlobalSettingsName)->getString("Language"); +	std::string language = gSavedSettings.getString("Language");  	if(language == "ja" || language == "pl")  	{  		LLStringOps::setupWeekDaysNames(LLTrans::getString("dateTimeWeekdaysNames")); @@ -1071,9 +1095,59 @@ bool LLAppViewer::init()  	LLAgentLanguage::init(); +	return true; +} +void LLAppViewer::initMaxHeapSize() +{ +	//set the max heap size. +	//here is some info regarding to the max heap size: +	//------------------------------------------------------------------------------------------ +	// OS       | setting | SL address bits | max manageable memory space | max heap size +	// Win 32   | default | 32-bit          | 2GB                         | < 1.7GB +	// Win 32   | /3G     | 32-bit          | 3GB                         | < 1.7GB or 2.7GB +	//Linux 32  | default | 32-bit          | 3GB                         | < 2.7GB +	//Linux 32  |HUGEMEM  | 32-bit          | 4GB                         | < 3.7GB +	//64-bit OS |default  | 32-bit          | 4GB                         | < 3.7GB +	//64-bit OS |default  | 64-bit          | N/A (> 4GB)                 | N/A (> 4GB) +	//------------------------------------------------------------------------------------------ +	//currently SL is built under 32-bit setting, we set its max heap size no more than 1.6 GB. + +	//F32 max_heap_size_gb = llmin(1.6f, (F32)gSavedSettings.getF32("MaxHeapSize")) ; +	F32 max_heap_size_gb = gSavedSettings.getF32("MaxHeapSize") ; +	BOOL enable_mem_failure_prevention = (BOOL)gSavedSettings.getBOOL("MemoryFailurePreventionEnabled") ; + +	LLMemory::initMaxHeapSizeGB(max_heap_size_gb, enable_mem_failure_prevention) ; +} -	return true; +void LLAppViewer::checkMemory() +{ +	const static F32 MEMORY_CHECK_INTERVAL = 1.0f ; //second +	//const static F32 MAX_QUIT_WAIT_TIME = 30.0f ; //seconds +	//static F32 force_quit_timer = MAX_QUIT_WAIT_TIME + MEMORY_CHECK_INTERVAL ; + +	if(!gGLManager.mDebugGPU) +	{ +		return ; +	} + +	if(MEMORY_CHECK_INTERVAL > mMemCheckTimer.getElapsedTimeF32()) +	{ +		return ; +	} +	mMemCheckTimer.reset() ; + +		//update the availability of memory +		LLMemory::updateMemoryInfo() ; + +	bool is_low = LLMemory::isMemoryPoolLow() ; + +	LLPipeline::throttleNewMemoryAllocation(is_low) ;		 +	 +	if(is_low) +	{ +		LLMemory::logMemoryInfo() ; +	}  }  static LLFastTimer::DeclareTimer FTM_MESSAGES("System Messages"); @@ -1111,7 +1185,6 @@ bool LLAppViewer::mainLoop()  	LLVoiceClient::getInstance()->init(gServicePump);  	LLTimer frameTimer,idleTimer;  	LLTimer debugTime; -	LLFrameTimer memCheckTimer;  	LLViewerJoystick* joystick(LLViewerJoystick::getInstance());  	joystick->setNeedsReset(true); @@ -1122,7 +1195,9 @@ bool LLAppViewer::mainLoop()      // point of posting.      LLSD newFrame; -	const F32 memory_check_interval = 1.0f ; //second +	//LLPrivateMemoryPoolTester::getInstance()->run(false) ; +	//LLPrivateMemoryPoolTester::getInstance()->run(true) ; +	//LLPrivateMemoryPoolTester::destroy() ;  	// Handle messages  	while (!LLApp::isExiting()) @@ -1133,18 +1208,8 @@ bool LLAppViewer::mainLoop()  		llclearcallstacks;  		//check memory availability information -		{ -			if(memory_check_interval < memCheckTimer.getElapsedTimeF32()) -			{ -				memCheckTimer.reset() ; - -				//update the availability of memory -				LLMemoryInfo::getAvailableMemoryKB(mAvailPhysicalMemInKB, mAvailVirtualMemInKB) ; -			} -			llcallstacks << "Available physical mem(KB): " << mAvailPhysicalMemInKB << llcallstacksendl ; -			llcallstacks << "Available virtual mem(KB): " << mAvailVirtualMemInKB << llcallstacksendl ; -		} - +		checkMemory() ; +		  		try  		{  			pingMainloopTimeout("Main:MiscNativeWindowEvents"); @@ -1152,7 +1217,7 @@ bool LLAppViewer::mainLoop()  			if (gViewerWindow)  			{  				LLFastTimer t2(FTM_MESSAGES); -				gViewerWindow->mWindow->processMiscNativeEvents(); +				gViewerWindow->getWindow()->processMiscNativeEvents();  			}  			pingMainloopTimeout("Main:GatherInput"); @@ -1165,7 +1230,7 @@ bool LLAppViewer::mainLoop()  					llwarns << " Someone took over my signal/exception handler (post messagehandling)!" << llendl;  				} -				gViewerWindow->mWindow->gatherInput(); +				gViewerWindow->getWindow()->gatherInput();  			}  #if 1 && !LL_RELEASE_FOR_DOWNLOAD @@ -1194,9 +1259,9 @@ bool LLAppViewer::mainLoop()  				// Scan keyboard for movement keys.  Command keys and typing  				// are handled by windows callbacks.  Don't do this until we're  				// done initializing.  JC -				if ((gHeadlessClient || gViewerWindow->mWindow->getVisible()) +				if ((gHeadlessClient || gViewerWindow->getWindow()->getVisible())  					&& gViewerWindow->getActive() -					&& !gViewerWindow->mWindow->getMinimized() +					&& !gViewerWindow->getWindow()->getMinimized()  					&& LLStartUp::getStartupState() == STATE_STARTED  					&& (gHeadlessClient || !gViewerWindow->getShowProgress())  					&& !gFocusMgr.focusLocked()) @@ -1275,7 +1340,7 @@ bool LLAppViewer::mainLoop()  				}  				// yield cooperatively when not running as foreground window -				if (   (gViewerWindow && !gViewerWindow->mWindow->getVisible()) +				if (   (gViewerWindow && !gViewerWindow->getWindow()->getVisible())  						|| !gFocusMgr.getAppHasFocus())  				{  					// Sleep if we're not rendering, or the window is minimized. @@ -1308,7 +1373,7 @@ bool LLAppViewer::mainLoop()  				idleTimer.reset();  				bool is_slow = (frameTimer.getElapsedTimeF64() > FRAME_SLOW_THRESHOLD) ;  				S32 total_work_pending = 0; -				S32 total_io_pending = 0;				 +				S32 total_io_pending = 0;	  				while(!is_slow)//do not unpause threads if the frame rates are very low.  				{  					S32 work_pending = 0; @@ -1376,15 +1441,7 @@ bool LLAppViewer::mainLoop()  		}  		catch(std::bad_alloc)  		{			 -			{ -				llinfos << "Availabe physical memory(KB) at the beginning of the frame: " << mAvailPhysicalMemInKB << llendl ; -				llinfos << "Availabe virtual memory(KB) at the beginning of the frame: " << mAvailVirtualMemInKB << llendl ; - -				LLMemoryInfo::getAvailableMemoryKB(mAvailPhysicalMemInKB, mAvailVirtualMemInKB) ; - -				llinfos << "Current availabe physical memory(KB): " << mAvailPhysicalMemInKB << llendl ; -				llinfos << "Current availabe virtual memory(KB): " << mAvailVirtualMemInKB << llendl ; -			} +			LLMemory::logMemoryInfo(TRUE) ;  			//stop memory leaking simulation  			LLFloaterMemLeak* mem_leak_instance = @@ -1709,10 +1766,6 @@ bool LLAppViewer::cleanup()  		llinfos << "Saved settings" << llendflush;  	} -	std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE); -	// save all settings, even if equals defaults -	gCrashSettings.saveToFile(crash_settings_filename, FALSE); -  	std::string warnings_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, getSettingsFilename("Default", "Warnings"));  	gWarningSettings.saveToFile(warnings_settings_filename, TRUE); @@ -1842,7 +1895,6 @@ bool LLAppViewer::cleanup()  	gSavedSettings.cleanup();  	LLUIColorTable::instance().clear(); -	gCrashSettings.cleanup();  	LLWatchdog::getInstance()->cleanup(); @@ -1870,9 +1922,14 @@ bool LLAppViewer::cleanup()  		LLWeb::loadURLExternal( gLaunchFileOnQuit, false );  		llinfos << "File launched." << llendflush;  	} +	llinfos << "Cleaning up LLProxy." << llendl; +	LLProxy::cleanupClass();  	LLMainLoopRepeater::instance().stop(); +	//release all private memory pools. +	LLPrivateMemoryPoolManager::destroyClass() ; +  	ll_close_fail_log();  	MEM_TRACK_RELEASE @@ -1985,44 +2042,42 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,  		llerrs << "Invalid settings location list" << llendl;  	} -	LLControlGroup* global_settings = LLControlGroup::getInstance(sGlobalSettingsName);   -	for(LLInitParam::ParamIterator<SettingsGroup>::const_iterator it = mSettingsLocationList->groups.begin(), end_it = mSettingsLocationList->groups.end(); -		it != end_it; -		++it) +	BOOST_FOREACH(const SettingsGroup& group, mSettingsLocationList->groups)  	{  		// skip settings groups that aren't the one we requested -		if (it->name() != location_key) continue; +		if (group.name() != location_key) continue; -		ELLPath path_index = (ELLPath)it->path_index(); +		ELLPath path_index = (ELLPath)group.path_index();  		if(path_index <= LL_PATH_NONE || path_index >= LL_PATH_LAST)  		{  			llerrs << "Out of range path index in app_settings/settings_files.xml" << llendl;  			return false;  		} -		LLInitParam::ParamIterator<SettingsFile>::const_iterator file_it, end_file_it; -		for (file_it = it->files.begin(), end_file_it = it->files.end(); -			file_it != end_file_it; -			++file_it) +		BOOST_FOREACH(const SettingsFile& file, group.files)  		{ -			llinfos << "Attempting to load settings for the group " << file_it->name() +			llinfos << "Attempting to load settings for the group " << file.name()  			    << " - from location " << location_key << llendl; -			LLControlGroup* settings_group = LLControlGroup::getInstance(file_it->name); +			LLControlGroup* settings_group = LLControlGroup::getInstance(file.name);  			if(!settings_group)  			{ -				llwarns << "No matching settings group for name " << file_it->name() << llendl; +				llwarns << "No matching settings group for name " << file.name() << llendl;  				continue;  			}  			std::string full_settings_path; -			if (file_it->file_name_setting.isProvided()  -				&& global_settings->controlExists(file_it->file_name_setting)) +			if (file.file_name_setting.isProvided()  +				&& gSavedSettings.controlExists(file.file_name_setting))  			{  				// try to find filename stored in file_name_setting control -				full_settings_path = global_settings->getString(file_it->file_name_setting); -				if (!gDirUtilp->fileExists(full_settings_path)) +				full_settings_path = gSavedSettings.getString(file.file_name_setting); +				if (full_settings_path.empty()) +				{ +					continue; +				} +				else if (!gDirUtilp->fileExists(full_settings_path))  				{  					// search in default path  					full_settings_path = gDirUtilp->getExpandedFilename((ELLPath)path_index, full_settings_path); @@ -2031,16 +2086,16 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,  			else  			{  				// by default, use specified file name -				full_settings_path = gDirUtilp->getExpandedFilename((ELLPath)path_index, file_it->file_name()); +				full_settings_path = gDirUtilp->getExpandedFilename((ELLPath)path_index, file.file_name());  			} -			if(settings_group->loadFromFile(full_settings_path, set_defaults, file_it->persistent)) +			if(settings_group->loadFromFile(full_settings_path, set_defaults, file.persistent))  			{	// success!  				llinfos << "Loaded settings file " << full_settings_path << llendl;  			}  			else  			{	// failed to load -				if(file_it->required) +				if(file.required)  				{  					llerrs << "Error: Cannot load required settings file from: " << full_settings_path << llendl;  					return false; @@ -2063,20 +2118,15 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,  std::string LLAppViewer::getSettingsFilename(const std::string& location_key,  											 const std::string& file)  { -	for(LLInitParam::ParamIterator<SettingsGroup>::const_iterator it = mSettingsLocationList->groups.begin(), end_it = mSettingsLocationList->groups.end(); -		it != end_it; -		++it) +	BOOST_FOREACH(const SettingsGroup& group, mSettingsLocationList->groups)  	{ -		if (it->name() == location_key) +		if (group.name() == location_key)  		{ -			LLInitParam::ParamIterator<SettingsFile>::const_iterator file_it, end_file_it; -			for (file_it = it->files.begin(), end_file_it = it->files.end(); -				file_it != end_file_it; -				++file_it) +			BOOST_FOREACH(const SettingsFile& settings_file, group.files)  			{ -				if (file_it->name() == file) +				if (settings_file.name() == file)  				{ -					return file_it->file_name; +					return settings_file.file_name;  				}  			}  		} @@ -2168,8 +2218,6 @@ bool LLAppViewer::initConfiguration()  	gSavedSettings.setS32("WatchdogEnabled", 0);  #endif -	gCrashSettings.getControl(CRASH_BEHAVIOR_SETTING)->getSignal()->connect(boost::bind(&handleCrashSubmitBehaviorChanged, _2));	 -  	// These are warnings that appear on the first experience of that condition.  	// They are already set in the settings_default.xml file, but still need to be added to LLFirstUse  	// for disable/reset ability @@ -2230,7 +2278,7 @@ bool LLAppViewer::initConfiguration()  	if (gSavedSettings.getBOOL("FirstRunThisInstall"))  	{ -		gSavedSettings.setString("SessionSettingsFile", "settings_minimal.xml"); +		// Note that the "FirstRunThisInstall" settings is currently unused.  		gSavedSettings.setBOOL("FirstRunThisInstall", FALSE);  	} @@ -2300,15 +2348,33 @@ bool LLAppViewer::initConfiguration()              {                  const std::string& name = *itr;                  const std::string& value = *(++itr); -				LLControlVariable* c = LLControlGroup::getInstance(sGlobalSettingsName)->getControl(name); -                if(c) +                std::string name_part; +                std::string group_part; +				LLControlVariable* control = NULL; + +				// Name can be further split into ControlGroup.Name, with the default control group being Global +				size_t pos = name.find('.'); +				if (pos != std::string::npos) +				{ +					group_part = name.substr(0, pos); +					name_part = name.substr(pos+1); +					llinfos << "Setting " << group_part << "." << name_part << " to " << value << llendl; +					LLControlGroup* g = LLControlGroup::getInstance(group_part); +					if (g) control = g->getControl(name_part); +				} +				else +				{ +					llinfos << "Setting Global." << name << " to " << value << llendl; +					control = gSavedSettings.getControl(name); +				} + +                if (control)                  { -                    c->setValue(value, false); +                    control->setValue(value, false);                  }                  else                  { -                    llwarns << "'--set' specified with unknown setting: '" -                        << name << "'." << llendl; +					llwarns << "Failed --set " << name << ": setting name unknown." << llendl;                  }              }          } @@ -2765,7 +2831,8 @@ void LLAppViewer::checkForCrash(void)          // Pop up a freeze or crash warning dialog          //          S32 choice; -        if(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) == CRASH_BEHAVIOR_ASK) +	const S32 cb = gCrashSettings.getS32("CrashSubmitBehavior"); +        if(cb == CRASH_BEHAVIOR_ASK)          {              std::ostringstream msg;  			msg << LLTrans::getString("MBFrozenCrashed"); @@ -2774,7 +2841,7 @@ void LLAppViewer::checkForCrash(void)                                    alert,                                    OSMB_YESNO);          }  -        else if(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) == CRASH_BEHAVIOR_NEVER_SEND) +        else if(cb == CRASH_BEHAVIOR_NEVER_SEND)          {              choice = OSBTN_NO;          } @@ -2831,10 +2898,9 @@ bool LLAppViewer::initWindow()  	LL_INFOS("AppInit") << "gViewerwindow created." << LL_ENDL;  	// Need to load feature table before cheking to start watchdog. -	const S32 NEVER_SUBMIT_REPORT = 2;  	bool use_watchdog = false;  	int watchdog_enabled_setting = gSavedSettings.getS32("WatchdogEnabled"); -	if(watchdog_enabled_setting == -1) +	if (watchdog_enabled_setting == -1)  	{  		use_watchdog = !LLFeatureManager::getInstance()->isFeatureAvailable("WatchdogDisabled");  	} @@ -2844,8 +2910,7 @@ bool LLAppViewer::initWindow()  		use_watchdog = bool(watchdog_enabled_setting);  	} -	bool send_reports = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) != NEVER_SUBMIT_REPORT; -	if(use_watchdog && send_reports) +	if (use_watchdog)  	{  		LLWatchdog::getInstance()->init(watchdog_killer_callback);  	} @@ -2855,7 +2920,7 @@ bool LLAppViewer::initWindow()  	if (gSavedSettings.getBOOL("WindowMaximized"))  	{ -		gViewerWindow->mWindow->maximize(); +		gViewerWindow->getWindow()->maximize();  	}  	// @@ -2898,7 +2963,7 @@ bool LLAppViewer::initWindow()  	if (gSavedSettings.getBOOL("WindowMaximized"))  	{ -		gViewerWindow->mWindow->maximize(); +		gViewerWindow->getWindow()->maximize();  	}  	LLUI::sWindow = gViewerWindow->getWindow(); @@ -2910,7 +2975,7 @@ bool LLAppViewer::initWindow()  	gViewerWindow->initBase();  	// show viewer window -	//gViewerWindow->mWindow->show(); +	//gViewerWindow->getWindow()->show();  	LL_INFOS("AppInit") << "Window initialization done." << LL_ENDL;  	return true; @@ -2944,12 +3009,12 @@ void LLAppViewer::cleanupSavedSettings()  	// as we don't track it in callbacks  	if(NULL != gViewerWindow)  	{ -		BOOL maximized = gViewerWindow->mWindow->getMaximized(); +		BOOL maximized = gViewerWindow->getWindow()->getMaximized();  		if (!maximized)  		{  			LLCoordScreen window_pos; -			if (gViewerWindow->mWindow->getPosition(&window_pos)) +			if (gViewerWindow->getWindow()->getPosition(&window_pos))  			{  				gSavedSettings.setS32("WindowX", window_pos.mX);  				gSavedSettings.setS32("WindowY", window_pos.mY); @@ -3391,8 +3456,6 @@ void LLAppViewer::requestQuit()  		gFloaterView->closeAllChildren(true);  	} -	LLSideTray::getInstance()->notifyChildren(LLSD().with("request","quit")); -  	send_stats();  	gLogoutTimer.reset(); @@ -3411,20 +3474,6 @@ static bool finish_quit(const LLSD& notification, const LLSD& response)  }  static LLNotificationFunctorRegistration finish_quit_reg("ConfirmQuit", finish_quit); -static bool switch_standard_skin_and_quit(const LLSD& notification, const LLSD& response) -{ -	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - -	if (option == 0) -	{ -		gSavedSettings.setString("SessionSettingsFile", ""); -		LLAppViewer::instance()->requestQuit(); -	} -	return false; -} - -static LLNotificationFunctorRegistration standard_skin_quit_reg("SwitchToStandardSkinAndQuit", switch_standard_skin_and_quit); -  void LLAppViewer::userQuit()  {  	if (gDisconnected || gViewerWindow->getProgressView()->getVisible()) @@ -3832,6 +3881,11 @@ bool LLAppViewer::initCache()  	}  } +void LLAppViewer::addOnIdleCallback(const boost::function<void()>& cb) +{ +	LLDeferredTaskList::instance().addTask(cb); +} +  void LLAppViewer::purgeCache()  {  	LL_INFOS("AppCache") << "Purging Cache and Texture Cache..." << LL_ENDL; @@ -4015,6 +4069,8 @@ public:  static LLFastTimer::DeclareTimer FTM_AUDIO_UPDATE("Update Audio");  static LLFastTimer::DeclareTimer FTM_CLEANUP("Cleanup"); +static LLFastTimer::DeclareTimer FTM_CLEANUP_DRAWABLES("Drawables"); +static LLFastTimer::DeclareTimer FTM_CLEANUP_OBJECTS("Objects");  static LLFastTimer::DeclareTimer FTM_IDLE_CB("Idle Callbacks");  static LLFastTimer::DeclareTimer FTM_LOD_UPDATE("Update LOD");  static LLFastTimer::DeclareTimer FTM_OBJECTLIST_UPDATE("Update Objectlist"); @@ -4070,18 +4126,6 @@ void LLAppViewer::idle()  		}  	} -	// debug setting to quit after N seconds of being AFK - 0 to never do this -	F32 qas_afk = gSavedSettings.getF32("QuitAfterSecondsOfAFK"); -	if (qas_afk > 0.f) -	{ -		// idle time is more than setting -		if ( gAwayTriggerTimer.getElapsedTimeF32() > qas_afk ) -		{ -			// go ahead and just quit gracefully -			LLAppViewer::instance()->requestQuit(); -		} -	} -  	// Must wait until both have avatar object and mute list, so poll  	// here.  	request_initial_instant_messages(); @@ -4256,7 +4300,7 @@ void LLAppViewer::idle()  	///////////////////////////////////////  	// Agent and camera movement  	// -		LLCoordGL current_mouse = gViewerWindow->getCurrentMouse(); +	LLCoordGL current_mouse = gViewerWindow->getCurrentMouse();  	{  		// After agent and camera moved, figure out if we need to @@ -4291,8 +4335,14 @@ void LLAppViewer::idle()  	{  		LLFastTimer t(FTM_CLEANUP); -		gObjectList.cleanDeadObjects(); -		LLDrawable::cleanupDeadDrawables(); +		{ +			LLFastTimer t(FTM_CLEANUP_OBJECTS); +			gObjectList.cleanDeadObjects(); +		} +		{ +			LLFastTimer t(FTM_CLEANUP_DRAWABLES); +			LLDrawable::cleanupDeadDrawables(); +		}  	}  	// @@ -4417,6 +4467,9 @@ void LLAppViewer::idle()  			gAudiop->idle(max_audio_decode_time);  		}  	} + +	// Execute deferred tasks. +	LLDeferredTaskList::instance().run();  	// Handle shutdown process, for example,   	// wait for floaters to close, send quit message, @@ -4449,10 +4502,6 @@ void LLAppViewer::idleShutdown()  		return;  	} -	if (LLSideTray::getInstance()->notifyChildren(LLSD().with("request","wait_quit"))) -	{ -		return; -	} @@ -4516,7 +4565,7 @@ void LLAppViewer::idleShutdown()  void LLAppViewer::sendLogoutRequest()  { -	if(!mLogoutRequestSent) +	if(!mLogoutRequestSent && gMessageSystem)  	{  		LLMessageSystem* msg = gMessageSystem;  		msg->newMessageFast(_PREHASH_LogoutRequest); diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 61ee6a7cf1..71a7868191 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -164,11 +164,13 @@ public:  	login_completed_signal_t mOnLoginCompleted;  	boost::signals2::connection setOnLoginCompletedCallback( const login_completed_signal_t::slot_type& cb ) { return mOnLoginCompleted.connect(cb); }  +	void addOnIdleCallback(const boost::function<void()>& cb); // add a callback to fire (once) when idle +  	void purgeCache(); // Clear the local cache.   	// mute/unmute the system's master audio  	virtual void setMasterSystemAudioMute(bool mute); -	virtual bool getMasterSystemAudioMute(); +	virtual bool getMasterSystemAudioMute();	  	// Metrics policy helper statics.  	static void metricsUpdateRegion(U64 region_handle); @@ -191,11 +193,12 @@ protected:  private: +	void initMaxHeapSize();  	bool initThreads(); // Initialize viewer threads, return false on failure.  	bool initConfiguration(); // Initialize settings from the command line/config file.  	void initUpdater(); // Initialize the updater service.  	bool initCache(); // Initialize local client cache. - +	void checkMemory() ;  	// We have switched locations of both Mac and Windows cache, make sure  	// files migrate and old cache is cleared out. @@ -269,8 +272,7 @@ private:  	std::set<struct apr_dso_handle_t*> mPlugins; -	U32 mAvailPhysicalMemInKB ; -	U32 mAvailVirtualMemInKB ; +	LLFrameTimer mMemCheckTimer;  	boost::scoped_ptr<LLUpdaterService> mUpdater; diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index 714e0e6163..48d02dfeaa 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -361,46 +361,35 @@ void LLAppViewerLinux::handleCrashReporting(bool reportFreeze)  	}  	else  	{ -		const S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING); - -		// Always generate the report, have the logger do the asking, and -		// don't wait for the logger before exiting (-> total cleanup). -		if (CRASH_BEHAVIOR_NEVER_SEND != cb) -		{	 -			// launch the actual crash logger -			const char* ask_dialog = "-dialog"; -			if (CRASH_BEHAVIOR_ASK != cb) -				ask_dialog = ""; // omit '-dialog' option -			const char * cmdargv[] = -				{cmd.c_str(), -				 ask_dialog, -				 "-user", -				 (char*)LLGridManager::getInstance()->getGridLabel().c_str(), -				 "-name", -				 LLAppViewer::instance()->getSecondLifeTitle().c_str(), -				 NULL}; -			fflush(NULL); -			pid_t pid = fork(); -			if (pid == 0) -			{ // child -				execv(cmd.c_str(), (char* const*) cmdargv);		/* Flawfinder: ignore */ -				llwarns << "execv failure when trying to start " << cmd << llendl; -				_exit(1); // avoid atexit() +		// launch the actual crash logger +		const char * cmdargv[] = +			{cmd.c_str(), +			 "-user", +			 (char*)LLGridManager::getInstance()->getGridLabel().c_str(), +			 "-name", +			 LLAppViewer::instance()->getSecondLifeTitle().c_str(), +			 NULL}; +		fflush(NULL); +		pid_t pid = fork(); +		if (pid == 0) +		{ // child +			execv(cmd.c_str(), (char* const*) cmdargv);		/* Flawfinder: ignore */ +			llwarns << "execv failure when trying to start " << cmd << llendl; +			_exit(1); // avoid atexit() +		}  +		else +		{ +			if (pid > 0) +			{ +				// DO NOT wait for child proc to die; we want +				// the logger to outlive us while we quit to +				// free up the screen/keyboard/etc. +				////int childExitStatus; +				////waitpid(pid, &childExitStatus, 0);  			}   			else  			{ -				if (pid > 0) -				{ -					// DO NOT wait for child proc to die; we want -					// the logger to outlive us while we quit to -					// free up the screen/keyboard/etc. -					////int childExitStatus; -					////waitpid(pid, &childExitStatus, 0); -				}  -				else -				{ -					llwarns << "fork failure." << llendl; -				} +				llwarns << "fork failure." << llendl;  			}  		}  		// Sometimes signals don't seem to quit the viewer.  Also, we may diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 445bd208ef..f94c843ad9 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -518,11 +518,7 @@ void LLAppViewerWin32::handleCrashReporting(bool reportFreeze)  	}  	else  	{ -		S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING); -		if(cb != CRASH_BEHAVIOR_NEVER_SEND) -		{ -			_spawnl(_P_NOWAIT, exe_path.c_str(), arg_str, NULL); -		} +		_spawnl(_P_NOWAIT, exe_path.c_str(), arg_str, NULL);  	}  } diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 5b9a449be1..966f5b941e 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -127,6 +127,15 @@ void on_new_single_inventory_upload_complete(  			group_perms,  			next_owner_perms); +		U32 inventory_item_flags = 0; +		if (server_response.has("inventory_flags")) +		{ +			inventory_item_flags = (U32) server_response["inventory_flags"].asInteger(); +			if (inventory_item_flags != 0) +			{ +				llinfos << "inventory_item_flags " << inventory_item_flags << llendl; +			} +		}  		S32 creation_date_now = time_corrected();  		LLPointer<LLViewerInventoryItem> item = new LLViewerInventoryItem(  			server_response["new_inventory_item"].asUUID(), @@ -138,7 +147,7 @@ void on_new_single_inventory_upload_complete(  			item_name,  			item_description,  			LLSaleInfo::DEFAULT, -			LLInventoryItemFlags::II_FLAGS_NONE, +			inventory_item_flags,  			creation_date_now);  		gInventory.updateItem(item); diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 8344b08bfb..10fd6b739e 100755 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -47,6 +47,7 @@  #include "llfloatergroups.h"  #include "llfloaterreg.h"  #include "llfloaterpay.h" +#include "llfloatersidepanelcontainer.h"  #include "llfloaterwebcontent.h"  #include "llfloaterworldmap.h"  #include "llfolderview.h" @@ -60,7 +61,6 @@  #include "llpaneloutfitedit.h"  #include "llpanelprofile.h"  #include "llrecentpeople.h" -#include "llsidetray.h"  #include "lltrans.h"  #include "llviewercontrol.h"  #include "llviewerobjectlist.h" @@ -316,7 +316,13 @@ static void on_avatar_name_show_profile(const LLUUID& agent_id, const LLAvatarNa  	// PROFILES: open in webkit window  	const bool show_chrome = false;  	static LLCachedControl<LLRect> profile_rect(gSavedSettings, "WebProfileRect"); -	LLFloaterWebContent::create(url, "", agent_id.asString(), show_chrome, profile_rect); +	LLFloaterWebContent::Params p; +	p.url(url). +		id(agent_id.asString()). +		show_chrome(show_chrome). +		window_class("profile"). +		preferred_media_size(profile_rect); +	LLFloaterReg::showInstance("profile", p);  }  // static @@ -331,15 +337,25 @@ void LLAvatarActions::showProfile(const LLUUID& id)  //static   bool LLAvatarActions::profileVisible(const LLUUID& id)  { -	LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::findInstance("web_content", id.asString())); +	LLSD sd; +	sd["id"] = id; +	LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::findInstance("profile", sd));  	return browser && browser->isShown();  } +//static +LLFloater* LLAvatarActions::getProfileFloater(const LLUUID& id) +{ +	LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::findInstance("profile", LLSD().with("id", id))); +	return browser; +}  //static   void LLAvatarActions::hideProfile(const LLUUID& id)  { -	LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::findInstance("web_content", id.asString())); +	LLSD sd; +	sd["id"] = id; +	LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::findInstance("profile", sd));  	if (browser)  	{  		browser->closeFloater(); @@ -429,8 +445,7 @@ void LLAvatarActions::csr(const LLUUID& id, std::string name)  void LLAvatarActions::share(const LLUUID& id)  {  	LLSD key; -	LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); - +	LLFloaterSidePanelContainer::showPanel("inventory", key);  	LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL,id); @@ -453,7 +468,7 @@ namespace action_give_inventory  	 */  	static LLInventoryPanel* get_outfit_editor_inventory_panel()  	{ -		LLPanelOutfitEdit* panel_outfit_edit = dynamic_cast<LLPanelOutfitEdit*>(LLSideTray::getInstance()->getPanel("panel_outfit_edit")); +		LLPanelOutfitEdit* panel_outfit_edit = dynamic_cast<LLPanelOutfitEdit*>(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfit_edit"));  		if (NULL == panel_outfit_edit) return NULL;  		LLInventoryPanel* inventory_panel = panel_outfit_edit->findChild<LLInventoryPanel>("folder_view"); @@ -687,13 +702,11 @@ std::set<LLUUID> LLAvatarActions::getInventorySelectedUUIDs()  	if (inventory_selected_uuids.empty())  	{ -		LLSidepanelInventory * sidepanel_inventory = LLSideTray::getInstance()->getPanel<LLSidepanelInventory>("sidepanel_inventory"); -		LLInventoryPanel * inbox = sidepanel_inventory->findChild<LLInventoryPanel>("inventory_inbox"); -		if (inbox) +		LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory"); +		if (sidepanel_inventory)  		{ -			inventory_selected_uuids = inbox->getRootFolder()->getSelectionList(); +			inventory_selected_uuids = sidepanel_inventory->getInboxOrOutboxSelectionList();  		} -  	}  	return inventory_selected_uuids; diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index fbfd815f41..748b7cb3d1 100644 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -35,7 +35,7 @@  #include <vector>  class LLInventoryPanel; - +class LLFloater;  /**   * Friend-related actions (add, remove, offer teleport, etc) @@ -96,6 +96,7 @@ public:  	static void showProfile(const LLUUID& id);  	static void hideProfile(const LLUUID& id);  	static bool profileVisible(const LLUUID& id); +	static LLFloater* getProfileFloater(const LLUUID& id);  	/**  	 * Show avatar on world map. diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp index d0f4d19f56..42e7decec1 100644 --- a/indra/newview/llavatariconctrl.cpp +++ b/indra/newview/llavatariconctrl.cpp @@ -141,7 +141,6 @@ LLAvatarIconCtrl::Params::Params()  	draw_tooltip("draw_tooltip", true),  	default_icon_name("default_icon_name")  { -	name = "avatar_icon";  } diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp deleted file mode 100644 index 79e6c7b66b..0000000000 --- a/indra/newview/llbottomtray.cpp +++ /dev/null @@ -1,1988 +0,0 @@ -/**  - * @file llbottomtray.cpp - * @brief LLBottomTray class implementation - * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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" // must be first include - -#define LLBOTTOMTRAY_CPP -#include "llbottomtray.h" - -// library includes -#include "llfloaterreg.h" -#include "llflyoutbutton.h" -#include "lllayoutstack.h" -#include "llnotifications.h" -#include "llnotificationsutil.h" -#include "lltexteditor.h" - -// newview includes -#include "llagent.h" -#include "llagentcamera.h" -#include "llavataractions.h" -#include "llchiclet.h" -#include "llfloatercamera.h" -#include "llhints.h" -#include "llimfloater.h" // for LLIMFloater -#include "llnearbychatbar.h" -#include "llnearbychatbarlistener.h" -#include "llsidetray.h" -#include "llspeakbutton.h" -#include "llsplitbutton.h" -#include "llsyswellwindow.h" -#include "lltoolmgr.h" -#include "llviewerparcelmgr.h" - -#include "llviewerwindow.h" -#include "llsdserialize.h" -#include "llfirstuse.h" - -// Distance from mouse down on which drag'n'drop should be started. -#define DRAG_START_DISTANCE 3 - -static const std::string SORTING_DATA_FILE_NAME = "bottomtray_buttons_order.xml"; - -LLDefaultChildRegistry::Register<LLBottomtrayButton> bottomtray_button("bottomtray_button"); - -// LLBottomtrayButton methods - -// virtual -BOOL LLBottomtrayButton::handleHover(S32 x, S32 y, MASK mask) -{ -	if (mCanDrag) -	{ -		// pass hover to bottomtray -		S32 screenX, screenY; -		localPointToScreen(x, y, &screenX, &screenY); -		LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY); - -		return TRUE; -	} -	else -	{ -		return LLButton::handleHover(x, y, mask); -	} -} -//virtual -BOOL LLBottomtrayButton::handleMouseUp(S32 x, S32 y, MASK mask) -{ -	if (mCanDrag) -	{ -	S32 screenX, screenY; -	localPointToScreen(x, y, &screenX, &screenY); -	// pass mouse up to bottomtray -	LLBottomTray::getInstance()->onDraggableButtonMouseUp(this, screenX, screenY); -	} -	return LLButton::handleMouseUp(x, y, mask); -} -//virtual -BOOL LLBottomtrayButton::handleMouseDown(S32 x, S32 y, MASK mask) -{ -	if (mCanDrag) -	{ -	S32 screenX, screenY; -	localPointToScreen(x, y, &screenX, &screenY); -	// pass mouse up to bottomtray -	LLBottomTray::getInstance()->onDraggableButtonMouseDown(this, screenX, screenY); -	} -	return LLButton::handleMouseDown(x, y, mask); -} - -static void update_build_button_enable_state() -{ -	bool can_edit = LLToolMgr::getInstance()->canEdit(); - -	LLBottomTray::getInstance()->getChildView("build_btn")->setEnabled(can_edit); -} - -// Build time optimization, generate extern template once in .cpp file -template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance(); - -namespace -{ -	const std::string& PANEL_CHICLET_NAME	= "chiclet_list_panel"; - -	S32 get_panel_min_width(LLLayoutStack* stack, LLView* panel) -	{ -		S32 minimal_width = 0; -		llassert(stack); -		if ( stack && panel && panel->getVisible() ) -		{ -			stack->getPanelMinSize(panel->getName(), &minimal_width); -		} -		return minimal_width; -	} - -	S32 get_panel_max_width(LLLayoutStack* stack, LLPanel* panel) -	{ -		S32 max_width = 0; -		llassert(stack); -		if ( stack && panel && panel->getVisible() ) -		{ -			stack->getPanelMaxSize(panel->getName(), &max_width); -		} -		return max_width; -	} - -	S32 get_curr_width(LLUICtrl* ctrl) -	{ -		S32 cur_width = 0; -		if ( ctrl && ctrl->getVisible() ) -		{ -			cur_width = ctrl->getRect().getWidth(); -		} -		return cur_width; -	} -} - -class LLBottomTrayLite -	: public LLPanel -{ -public: -	LLBottomTrayLite() -		: mNearbyChatBar(NULL), -		mChatBarContainer(NULL), -		  mGesturePanel(NULL) -	{ -		mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL); -		buildFromFile("panel_bottomtray_lite.xml"); -	} - -	BOOL postBuild() -	{ -		mNearbyChatBar = findChild<LLNearbyChatBar>("chat_bar"); -		mChatBarContainer = getChild<LLLayoutPanel>("chat_bar_layout_panel"); -		mGesturePanel = getChild<LLPanel>("gesture_panel"); - -		// Hide "show_nearby_chat" button  -		if (mNearbyChatBar) -		{ -			LLLineEditor* chat_box = mNearbyChatBar->getChatBox(); -			LLUICtrl* show_btn = mNearbyChatBar->getChild<LLUICtrl>("show_nearby_chat"); -			S32 delta_width = show_btn->getRect().getWidth(); -			show_btn->setVisible(FALSE); -			chat_box->reshape(chat_box->getRect().getWidth() + delta_width, chat_box->getRect().getHeight()); -		} -		return TRUE; -	} - -	void onFocusLost() -	{ -		if (gAgentCamera.cameraMouselook()) -		{ -			LLBottomTray::getInstance()->setVisible(FALSE); -		} -	} - -	LLNearbyChatBar*	mNearbyChatBar; -	LLLayoutPanel*		mChatBarContainer; -	LLPanel*			mGesturePanel; -}; - -LLBottomTray::LLBottomTray(const LLSD&) -:	mChicletPanel(NULL), -	mSpeakPanel(NULL), -	mSpeakBtn(NULL), -	mNearbyChatBar(NULL), -	mChatBarContainer(NULL), -	mNearbyCharResizeHandlePanel(NULL), -	mToolbarStack(NULL), -	mMovementButton(NULL), -	mResizeState(RS_NORESIZE), -	mBottomTrayContextMenu(NULL), -	mCamButton(NULL), -	mBottomTrayLite(NULL), -	mIsInLiteMode(false), -	mDragStarted(false), -	mDraggedItem(NULL), -	mLandingTab(NULL), -	mCheckForDrag(false) -{ -	// Firstly add our self to IMSession observers, so we catch session events -	// before chiclets do that. -	LLIMMgr::getInstance()->addSessionObserver(this); - -	mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL); - -	buildFromFile("panel_bottomtray.xml"); - -	LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2)); - -	//this is to fix a crash that occurs because LLBottomTray is a singleton -	//and thus is deleted at the end of the viewers lifetime, but to be cleanly -	//destroyed LLBottomTray requires some subsystems that are long gone -	//LLUI::getRootView()->addChild(this); - -	{ -		mBottomTrayLite = new LLBottomTrayLite(); -		mBottomTrayLite->setFollowsAll(); -		mBottomTrayLite->setVisible(FALSE); -	} - -	mImageDragIndication = LLUI::getUIImage(getString("DragIndicationImageName")); -	mDesiredNearbyChatWidth = mNearbyChatBar ? mNearbyChatBar->getRect().getWidth() : 0; -} - -LLBottomTray::~LLBottomTray() -{ -	if (!LLSingleton<LLIMMgr>::destroyed()) -	{ -		LLIMMgr::getInstance()->removeSessionObserver(this); -	} - -	if (mNearbyChatBar) -	{ -		// store custom width of chatbar panel. -		S32 custom_width = mChatBarContainer->getRect().getWidth(); -		gSavedSettings.setS32("ChatBarCustomWidth", custom_width); -	} - -	// emulate previous floater behavior to be hidden on startup. -	// override effect of save_visibility=true. -	// this attribute is necessary to button.initial_callback=Button.SetFloaterToggle works properly: -	//		i.g when floater changes its visibility - button changes its toggle state. -	getChild<LLUICtrl>("build_btn")->setControlValue(false); -	getChild<LLUICtrl>("search_btn")->setControlValue(false); -	getChild<LLUICtrl>("world_map_btn")->setControlValue(false); -} - -// *TODO Vadim: why void* ? -void* LLBottomTray::createNearbyChatBar(void* userdata) -{ -	return new LLNearbyChatBar(); -} - -LLNearbyChatBar* LLBottomTray::getNearbyChatBar() -{ -	return mIsInLiteMode ? mBottomTrayLite->mNearbyChatBar : mNearbyChatBar; -} - -LLIMChiclet* LLBottomTray::createIMChiclet(const LLUUID& session_id) -{ -	LLIMChiclet::EType im_chiclet_type = LLIMChiclet::getIMSessionType(session_id); - -	switch (im_chiclet_type) -	{ -	case LLIMChiclet::TYPE_IM: -		return getChicletPanel()->createChiclet<LLIMP2PChiclet>(session_id); -	case LLIMChiclet::TYPE_GROUP: -		return getChicletPanel()->createChiclet<LLIMGroupChiclet>(session_id); -	case LLIMChiclet::TYPE_AD_HOC: -		return getChicletPanel()->createChiclet<LLAdHocChiclet>(session_id); -	case LLIMChiclet::TYPE_UNKNOWN: -		break; -	} - -	return NULL; -} - -//virtual -void LLBottomTray::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) -{ -	if (!getChicletPanel()) return; - -	LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id); -	if (!session) return; - -	// no need to spawn chiclets for participants in P2P calls called through Avaline -	if (session->isP2P() && session->isOtherParticipantAvaline()) return; - -	if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return; - -	LLIMChiclet* chiclet = createIMChiclet(session_id); -	if(chiclet) -	{ -		chiclet->setIMSessionName(name); -		chiclet->setOtherParticipantId(other_participant_id); -		 -		LLIMFloater::onIMChicletCreated(session_id); - -	} -	else -	{ -		llerrs << "Could not create chiclet" << llendl; -	} -} - -//virtual -void LLBottomTray::sessionRemoved(const LLUUID& session_id) -{ -	if(getChicletPanel()) -	{ -		// IM floater should be closed when session removed and associated chiclet closed -		LLIMFloater* iMfloater = LLFloaterReg::findTypedInstance<LLIMFloater>( -				"impanel", session_id); -		if (iMfloater != NULL) -		{ -			iMfloater->closeFloater(); -		} - -		getChicletPanel()->removeChiclet(session_id); -	} -} - -void LLBottomTray::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id) -{ -	//this is only needed in case of outgoing ad-hoc/group chat sessions -	LLChicletPanel* chiclet_panel = getChicletPanel(); -	if (chiclet_panel) -	{ -		//it should be ad-hoc im chiclet or group im chiclet -		LLChiclet* chiclet = chiclet_panel->findChiclet<LLChiclet>(old_session_id); -		if (chiclet) chiclet->setSessionId(new_session_id); -	} -} - -S32 LLBottomTray::getTotalUnreadIMCount() -{ -	return getChicletPanel()->getTotalUnreadIMCount(); -} - -// virtual -void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, bool proximal) -{ -	// Time it takes to connect to voice channel might be pretty long, -	// so don't expect user login or STATUS_VOICE_ENABLED to be followed by STATUS_JOINED. -	BOOL enable = FALSE; - -	switch (status) -	{ -	// Do not add STATUS_VOICE_ENABLED because voice chat is  -	// inactive until STATUS_JOINED -	case STATUS_JOINED: -		enable = TRUE; -		break; -	default: -		enable = FALSE; -		break; -	} - -	// We have to enable/disable right and left parts of speak button separately (EXT-4648) -	getChild<LLButton>("speak_btn")->setEnabled(enable); - -	// skipped to avoid button blinking -	if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL) -	{ -		bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); -		getChild<LLButton>("speak_flyout_btn")->setEnabled(voice_status); -		gMenuBarView->getChild<LLView>("Nearby Voice")->setEnabled(voice_status); -		if (voice_status) -		{ -			LLFirstUse::speak(true); -		} -	} -} - -void LLBottomTray::onMouselookModeOut() -{ -	mIsInLiteMode = false; -	mBottomTrayLite->setVisible(FALSE); -	mNearbyChatBar->getChatBox()->setText(mBottomTrayLite->mNearbyChatBar->getChatBox()->getText()); -	setVisible(TRUE); -} - -void LLBottomTray::onMouselookModeIn() -{ -	setVisible(FALSE); - -	// Attach the lite bottom tray -	if (getParent() && mBottomTrayLite->getParent() != getParent()) -		getParent()->addChild(mBottomTrayLite); - -	mBottomTrayLite->setShape(getLocalRect()); -	mBottomTrayLite->mNearbyChatBar->getChatBox()->setText(mNearbyChatBar->getChatBox()->getText()); -	mBottomTrayLite->mGesturePanel->setVisible(gSavedSettings.getBOOL("ShowGestureButton")); - -	mIsInLiteMode = true; -} - -//virtual -// setVisible used instead of onVisibilityChange, since LLAgent calls it on entering/leaving mouselook mode. -// If bottom tray is already visible in mouselook mode, then onVisibilityChange will not be called from setVisible(true), -void LLBottomTray::setVisible(BOOL visible) -{ -	if (mIsInLiteMode) -	{ -		mBottomTrayLite->setVisible(visible); -	} -	else  -	{ -		LLPanel::setVisible(visible); -	} -} - -S32 LLBottomTray::notifyParent(const LLSD& info) -{ -	if(info.has("well_empty")) // implementation of EXT-3397 -	{ -		const std::string chiclet_name = info["well_name"]; - -		// only "im_well" or "notification_well" names are expected. -		// They are set in panel_bottomtray.xml in <chiclet_im_well> & <chiclet_notification> -		llassert("im_well" == chiclet_name || "notification_well" == chiclet_name); - -		BOOL should_be_visible = !info["well_empty"]; -		showWellButton("im_well" == chiclet_name ? RS_IM_WELL : RS_NOTIFICATION_WELL, should_be_visible); -		return 1; -	} - -	if (info.has("action") && info["action"] == "resize") -	{ -		const std::string& name = info["view_name"]; - -		// expected only resize of nearby chatbar -		if (mChatBarContainer->getName() != name) return LLPanel::notifyParent(info); - -		const S32 new_width = info["new_width"]; - -		processChatbarCustomization(new_width); - -		return 2; -	} -	return LLPanel::notifyParent(info); -} - -void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask) -{ -	// We should show BottomTrayContextMenu in last  turn -	if (mBottomTrayContextMenu && !LLMenuGL::sMenuContainer->getVisibleMenu()) -	{ -		    //there are no other context menu (IM chiclet etc ), so we can show BottomTrayContextMenu - -		    updateContextMenu(x, y, mask); -			mBottomTrayContextMenu->buildDrawLabels(); -			mBottomTrayContextMenu->updateParent(LLMenuGL::sMenuContainer); -			LLMenuGL::showPopup(this, mBottomTrayContextMenu, x, y); -		 -	} -} - -void LLBottomTray::updateContextMenu(S32 x, S32 y, MASK mask) -{ -	LLUICtrl* edit_box = mNearbyChatBar->getChild<LLUICtrl>("chat_box"); - -	S32 local_x = x - mChatBarContainer->getRect().mLeft - edit_box->getRect().mLeft; -	S32 local_y = y - mChatBarContainer->getRect().mBottom - edit_box->getRect().mBottom; - -	bool in_edit_box = edit_box->pointInView(local_x, local_y); - -	mBottomTrayContextMenu->setItemVisible("Separator", in_edit_box); -	mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Cut", in_edit_box); -	mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Copy", in_edit_box); -	mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Paste", in_edit_box); -	mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Delete", in_edit_box); -	mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Select_All", in_edit_box); -} - -void LLBottomTray::showSpeakButton(bool visible) -{ -	// Show/hide the button -	setTrayButtonVisible(RS_BUTTON_SPEAK, visible); - -	// and adjust other panels according to the occupied/freed space. -	const S32 panel_width = mSpeakPanel->getRect().getWidth(); -	if (visible) -	{ -		processWidthDecreased(-panel_width); -	} -	else -	{ -		processWidthIncreased(panel_width); -	} -} - -void LLBottomTray::toggleMovementControls() -{ -	if (mMovementButton) -		mMovementButton->onCommit(); -} - -void LLBottomTray::toggleCameraControls() -{ -	if (mCamButton) -		mCamButton->onCommit(); -} - -BOOL LLBottomTray::postBuild() -{ -	LLHints::registerHintTarget("bottom_tray", LLView::getHandle()); -	LLHints::registerHintTarget("dest_guide_btn", getChild<LLUICtrl>("destination_btn")->getHandle()); -	LLHints::registerHintTarget("avatar_picker_btn", getChild<LLUICtrl>("avatar_btn")->getHandle()); - -	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("NearbyChatBar.Action", boost::bind(&LLBottomTray::onContextMenuItemClicked, this, _2)); -	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("NearbyChatBar.EnableMenuItem", boost::bind(&LLBottomTray::onContextMenuItemEnabled, this, _2)); - -	mBottomTrayContextMenu =  LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_bottomtray.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); -	gMenuHolder->addChild(mBottomTrayContextMenu); - -	mNearbyChatBar = findChild<LLNearbyChatBar>("chat_bar"); -	LLHints::registerHintTarget("chat_bar", mNearbyChatBar->LLView::getHandle()); - -	mListener.reset(new LLNearbyChatBarListener(*mNearbyChatBar)); - -	mChatBarContainer = getChild<LLLayoutPanel>("chat_bar_layout_panel"); -	mNearbyCharResizeHandlePanel = getChild<LLPanel>("chat_bar_resize_handle_panel"); - -	mToolbarStack = getChild<LLLayoutStack>("toolbar_stack"); -	mMovementButton = getChild<LLButton>("movement_btn"); -	LLHints::registerHintTarget("move_btn", mMovementButton->getHandle()); -	mCamButton = getChild<LLButton>("camera_btn"); -	setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4)); - -	mSpeakPanel = getChild<LLPanel>("speak_panel"); -	mSpeakBtn = findChild<LLSpeakButton>("talk"); -	if (mSpeakBtn) -	{ -		LLHints::registerHintTarget("speak_btn", mSpeakBtn->getHandle()); - -		// Localization tool doesn't understand custom buttons like <talk_button> -		mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") ); -		mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") ); -	}	 -	else -	{ -		LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("speak_btn")); -		LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("flyout_btn")); -	} - - -	// Both parts of speak button should be initially disabled because -	// it takes some time between logging in to world and connecting to voice channel. -	getChild<LLButton>("speak_btn")->setEnabled(false); -	getChild<LLButton>("speak_flyout_btn")->setEnabled(false); -	gMenuBarView->getChild<LLView>("Nearby Voice")->setEnabled(false); - -	// Registering Chat Bar to receive Voice client status change notifications. -	LLVoiceClient::getInstance()->addObserver(this); - -	mNearbyChatBar->getChatBox()->setContextMenu(NULL); - -	mChicletPanel = getChild<LLChicletPanel>("chiclet_list"); - -	initResizeStateContainers(); - -	setButtonsControlsAndListeners(); - -	initButtonsVisibility(); - -	// update wells visibility: -	showWellButton(RS_IM_WELL, !LLIMWellWindow::getInstance()->isWindowEmpty()); -	showWellButton(RS_NOTIFICATION_WELL, !LLNotificationWellWindow::getInstance()->isWindowEmpty()); - -	loadButtonsOrder(); - -	LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&update_build_button_enable_state)); - -	return TRUE; -} - -//Drag-n-drop - -void LLBottomTray::onDraggableButtonMouseDown(LLUICtrl* ctrl, S32 x, S32 y) -{ -	if (ctrl == NULL) return; -	LLView* parent_view = ctrl->getParent(); -	if(parent_view != NULL) -	{ -		// we actually drag'n'drop panel (not button) in code, so have to find a parent -		// of button which called this method on mouse down. -		LLPanel* parent = dynamic_cast<LLPanel*>(parent_view); -		// It may happen that we clicked not usual button, but button inside widget(speak, gesture) -		// so we'll need to get a level higher to reach layout panel as a parent. -		if(parent == NULL) parent = dynamic_cast<LLPanel*>(parent_view->getParent()); -		if (parent && parent->getVisible()) -		{ -			mDraggedItem = parent; -			mCheckForDrag = true; -			mStartX = x; -			mStartY = y; -		} -	} -} - -LLPanel* LLBottomTray::findChildPanelByLocalCoords(S32 x, S32 y) -{ -	LLPanel* ctrl = 0; -	S32 screenX, screenY; -	const child_list_t* list = mToolbarStack->getChildList(); - -	localPointToScreen(x, y, &screenX, &screenY); - -	// look for a child panel which contains the point (screenX, screenY) in it's rectangle -	for (child_list_const_iter_t i = list->begin(); i != list->end(); ++i) -	{ -		LLRect rect; -		localRectToScreen((*i)->getRect(), &rect); - -		if (rect.pointInRect(screenX, screenY)) -		{ -			ctrl = dynamic_cast<LLPanel*>(*i); -			break; -		} -	} - -	return ctrl; -} - -void LLBottomTray::onDraggableButtonHover(S32 x, S32 y) -{ -	// if mouse down on draggable item was done, check whether we should start DnD -	if (mCheckForDrag) -	{ -		// Start drag'n'drop if mouse cursor was dragged away frome mouse down location enough -		if(sqrt((float)((mStartX-x)*(mStartX-x)+(mStartY-y)*(mStartY-y))) > DRAG_START_DISTANCE) -		{ -			mDragStarted = true; -			mCheckForDrag = false; -		} -	} -	if (mDragStarted) -	{ -		// Check whether the cursor is over draggable area, find which panel it is and set is as -		// landing tab for drag'n'drop -		if(isCursorOverDraggableArea(x, y)) -		{ -			LLPanel* panel = findChildPanelByLocalCoords(x,y); -			if (panel && panel != mDraggedItem) mLandingTab = panel; -			gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROWDRAG); -		} -		else -		{ -			gViewerWindow->getWindow()->setCursor(UI_CURSOR_NO); -		} -	} -	else -	{ -		// Reset cursor in case you move your mouse from the drag handle to a button. -		getWindow()->setCursor(UI_CURSOR_ARROW); - -	} -} - -bool LLBottomTray::isCursorOverDraggableArea(S32 x, S32 y) -{ -	// Draggable area lasts from the nearby chat input resize handle -	// to the chiclet area (exlusively). -	bool result = getRect().pointInRect(x, y); -	result = result && mNearbyCharResizeHandlePanel->calcScreenRect().mRight < x; -	result = result && mChicletPanel->calcScreenRect().mRight > x; -	return result; -} - -void LLBottomTray::updateButtonsOrdersAfterDnD() -{ -	// *TODO: change implementation of this method to support simplify it -	// (and according to future possible changes in the way button order is saved between sessions). -	state_object_map_t::const_iterator it = mStateProcessedObjectMap.begin(); -	state_object_map_t::const_iterator it_end = mStateProcessedObjectMap.end(); -	EResizeState dragged_state = RS_NORESIZE; -	EResizeState landing_state = RS_NORESIZE; -	bool landing_state_found = false; -	// Find states for dragged item and landing tab -	for (; it != it_end; ++it) -	{ -		if (it->second == mDraggedItem) -		{ -			dragged_state = it->first; -		} -		else if (it->second == mLandingTab) -		{ -			landing_state = it->first; -			landing_state_found = true; -		} -	} - -	if (dragged_state == RS_NORESIZE) -	{ -		llwarns << "Cannot determine what button is being dragged" << llendl; -		llassert(dragged_state != RS_NORESIZE); -		return; -	} - -	lldebugs << "Will place " << resizeStateToString(dragged_state) -		<< " before " << resizeStateToString(landing_state) << llendl; - -	// Update order of buttons according to drag'n'drop -	mButtonsOrder.erase(std::find(mButtonsOrder.begin(), mButtonsOrder.end(), dragged_state)); -	if (!landing_state_found && mLandingTab == getChild<LLPanel>(PANEL_CHICLET_NAME)) -	{ -		mButtonsOrder.push_back(dragged_state); -	} -	else -	{ -		if (!landing_state_found) landing_state = RS_BUTTON_SPEAK; // just a random fallback -		mButtonsOrder.insert(std::find(mButtonsOrder.begin(), mButtonsOrder.end(), landing_state), dragged_state); -	} - -	// Synchronize button process order with their order -	resize_state_vec_t::const_iterator it1 = mButtonsOrder.begin(); -	const resize_state_vec_t::const_iterator it_end1 = mButtonsOrder.end(); -	resize_state_vec_t::iterator it2 = mButtonsProcessOrder.begin(); -	for (; it1 != it_end1; ++it1) -	{ -		// Skip Speak because it is not in mButtonsProcessOrder(it's the reason why mButtonsOrder was introduced). -		// If any other draggable items will be added to bottomtray later, they should also be skipped here. -		if (*it1 != RS_BUTTON_SPEAK) -		{ -			*it2 = *it1; -			++it2; -		} -	} - -	saveButtonsOrder(); -} - -void LLBottomTray::saveButtonsOrder() -{ -	if (!gSavedSettings.getBOOL("AllowBottomTrayButtonReordering")) return; - -	std::string user_dir = gDirUtilp->getLindenUserDir(); -	if (user_dir.empty()) return; -	 -	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME); -	LLSD settings_llsd; -	int i = 0; -	const resize_state_vec_t::const_iterator it_end = mButtonsOrder.end(); -	// we use numbers as keys for map which is saved in file and contains resize states as its values -	for (resize_state_vec_t::const_iterator it = mButtonsOrder.begin(); it != it_end; ++it, i++) -	{ -		std::string str = llformat("%d", i); -		settings_llsd[str] = *it;		 -	} -	llofstream file; -	file.open(filename); -	LLSDSerialize::toPrettyXML(settings_llsd, file); -} - -void LLBottomTray::loadButtonsOrder() -{ -	if (!gSavedSettings.getBOOL("AllowBottomTrayButtonReordering")) return; - -	// load per-resident sorting information -	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME); - -	LLSD settings_llsd; -	llifstream file; -	file.open(filename); -	if (!file.is_open()) return; -	 -	LLSDSerialize::fromXML(settings_llsd, file); -	 - -	mButtonsOrder.clear(); -	mButtonsProcessOrder.clear(); -	int i = 0; -	// getting button order from file -	for (LLSD::map_const_iterator iter = settings_llsd.beginMap(); -		iter != settings_llsd.endMap(); ++iter, ++i) -	{ -		std::string str = llformat("%d", i); -		EResizeState state = (EResizeState)settings_llsd[str].asInteger(); -		mButtonsOrder.push_back(state); -		// RS_BUTTON_SPEAK is skipped, because it shouldn't be in mButtonsProcessOrder (it does not hide or shrink). -		if (state != RS_BUTTON_SPEAK) -		{ -			mButtonsProcessOrder.push_back(state); -		}		 -	} - -	// There are other panels in layout stack order of which is not saved. Also, panels order of which is saved, -	// are already in layout stack but in wrong order. The most convenient way to place them is moving them  -	// to front one by one (because in this case we don't have to pass the panel before which we want to insert our -	// panel to movePanel()). So panels are moved in order from the end of mButtonsOrder vector(reverse iterator is used). -	const resize_state_vec_t::const_reverse_iterator it_end = mButtonsOrder.rend(); -	// placing panels in layout stack according to button order which we loaded in previous for -	for (resize_state_vec_t::const_reverse_iterator it = mButtonsOrder.rbegin(); it != it_end; ++it, ++i) -	{ -		LLPanel* panel_to_move = getButtonPanel(*it); -		mToolbarStack->movePanel(panel_to_move, NULL, true); // prepend 		 -	} -	// Nearbychat is not stored in order settings file, but it must be the first of the panels, so moving it -	// (along with its drag handle) manually here. -	mToolbarStack->movePanel(getChild<LLLayoutPanel>("chat_bar_resize_handle_panel"), NULL, true); -	mToolbarStack->movePanel(mChatBarContainer, NULL, true); -} - -void LLBottomTray::onDraggableButtonMouseUp(LLUICtrl* ctrl, S32 x, S32 y) -{ -	//if mouse up happened over area where drop is possible, change order of buttons -	if (mLandingTab != NULL && mDraggedItem != NULL && mDragStarted) -	{ -		if(isCursorOverDraggableArea(x, y)) -		{ -			// change order of panels in layout stack -			mToolbarStack->movePanel(mDraggedItem, (LLPanel*)mLandingTab); -			// change order of buttons in order vectors -			updateButtonsOrdersAfterDnD(); -		} -	} -	gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW); -	mDragStarted = false; -	mDraggedItem = NULL; -	mLandingTab = NULL; -	mCheckForDrag = false; -} - -void LLBottomTray::draw() -{ -	LLPanel::draw(); -	if (mLandingTab) -	{ -		static S32 w = mImageDragIndication->getWidth(); -		static S32 h = mImageDragIndication->getHeight(); -		LLRect rect = mLandingTab->calcScreenRect(); -		mImageDragIndication->draw(rect.mLeft - w/2, rect.getHeight(), w, h); -	} -	getChild<LLButton>("show_profile_btn")->setToggleState(LLAvatarActions::profileVisible(gAgent.getID())); - -	LLPanel* panel = LLSideTray::getInstance()->getPanel("panel_people"); -	if (panel && panel->isInVisibleChain()) -	{ -		getChild<LLButton>("show_people_button")->setToggleState(true); -	} -	else -	{ -		getChild<LLButton>("show_people_button")->setToggleState(false); -	} - -	LLFloater* help_browser = (LLFloaterReg::findInstance("help_browser")); -	bool help_floater_visible = (help_browser && help_browser->isInVisibleChain()); - -	getChild<LLButton>("show_help_btn")->setToggleState(help_floater_visible); - -	bool openmic = LLVoiceClient::getInstance()->getUserPTTState(); -	bool voiceenabled = LLVoiceClient::getInstance()->voiceEnabled(); -	getChild<LLButton>("speak_btn")->setToggleState(openmic && voiceenabled); -	getChild<LLOutputMonitorCtrl>("chat_zone_indicator")->setIsMuted(!voiceenabled); - -} - -bool LLBottomTray::onContextMenuItemEnabled(const LLSD& userdata) -{ -	std::string item = userdata.asString(); -	LLLineEditor* edit_box = mNearbyChatBar->findChild<LLLineEditor>("chat_box"); -	 -	if (item == "can_cut") -	{ -		return edit_box->canCut(); -	} -	else if (item == "can_copy") -	{ -		return edit_box->canCopy(); -	} -	else if (item == "can_paste") -	{ -		return edit_box->canPaste(); -	} -	else if (item == "can_delete") -	{ -		return edit_box->canDoDelete(); -	} -	else if (item == "can_select_all") -	{ -		return edit_box->canSelectAll() && (edit_box->getLength()>0); -	} -	return true; -} - - -void LLBottomTray::onContextMenuItemClicked(const LLSD& userdata) -{ -	std::string item = userdata.asString(); -	LLLineEditor* edit_box = mNearbyChatBar->findChild<LLLineEditor>("chat_box"); - -	if (item == "cut") -	{ -		edit_box->cut(); -	} -	else if (item == "copy") -	{ -		edit_box->copy(); -	} -	else if (item == "paste") -	{ -		edit_box->paste(); -		edit_box->setFocus(TRUE); -	} -	else if (item == "delete") -	{ -		edit_box->doDelete(); -	} -	else if (item == "select_all") -	{ -		edit_box->selectAll(); -	} -} - -void LLBottomTray::log(LLView* panel, const std::string& descr) -{ -	if (NULL == panel) return; -	LLView* layout = panel->getParent(); -	LL_DEBUGS("Bottom Tray Rects") << descr << ": " -		<< "panel: " << panel->getName() -		<< ", rect: " << panel->getRect() -  -  -		<< " layout: " << layout->getName() -		<< ", rect: " << layout->getRect() -		<< LL_ENDL; -} - -void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent) -{ -	static S32 debug_calling_number = 0; -	lldebugs << "**************************************** " << ++debug_calling_number << llendl; - -	S32 current_width = getRect().getWidth(); -	S32 delta_width = width - current_width; -	lldebugs << "Reshaping: "  -		<< ", width: " << width -		<< ", cur width: " << current_width -		<< ", delta_width: " << delta_width -		<< ", called_from_parent: " << called_from_parent -		<< llendl; - -	if (mNearbyChatBar)			log(mNearbyChatBar, "before"); -	if (mChicletPanel)			log(mChicletPanel, "before"); - -	// Difference between bottom tray width required to fit its children and the actual width. (see EXT-991) -	// Positive value means that bottom tray is not wide enough. -	// Negative value means that there is free space. -	static S32 extra_shrink_width = 0; -	bool should_be_reshaped = true; - -	if (mChicletPanel && mToolbarStack && mNearbyChatBar) -	{ -		// Firstly, update layout stack to ensure we deal with correct panel sizes. -		{ -			BOOL saved_anim = mToolbarStack->getAnimate(); -			// Set chiclet panel to be autoresized by default. -			mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE); -			// Disable animation to prevent layout updating in several frames. -			mToolbarStack->setAnimate(FALSE); -			// Force the updating of layout to reset panels collapse factor. -			mToolbarStack->updateLayout(); -			// Restore animate state. -			mToolbarStack->setAnimate(saved_anim); -		} - -		// bottom tray is narrowed -		if (delta_width < 0) -		{ -			if (extra_shrink_width > 0) // not enough space -			{ -				extra_shrink_width += llabs(delta_width); -				should_be_reshaped = false; -			} -			else -			{ -				extra_shrink_width = processWidthDecreased(delta_width); - -				// increase new width to extra_shrink_width value to not reshape less than bottom tray minimum -				width += extra_shrink_width; -			} -		} -		// bottom tray is widened -		else -		{ -			if (extra_shrink_width > delta_width) -			{ -				// Still not enough space. -				// Only subtract the delta from the required delta and don't reshape. -				extra_shrink_width -= delta_width; -				should_be_reshaped = false; -			} -			else  -			{ -				if (extra_shrink_width > 0) -				{ -					// If we have some extra shrink width let's reduce delta_width & width -					delta_width -= extra_shrink_width; -					width -= extra_shrink_width; -					extra_shrink_width = 0; -				} -				processWidthIncreased(delta_width); -			} -		} -	} - -	if (should_be_reshaped) -	{ -		lldebugs << "Reshape all children with width: " << width << llendl; -		LLPanel::reshape(width, height, called_from_parent); -	} - -	if (mNearbyChatBar)			log(mNearbyChatBar, "after"); -	if (mChicletPanel)			log(mChicletPanel, "after"); - - -	// Restore width of the chatbar on first reshape. -	// we can not to do this from postBuild because reshape is called from parent view on startup -	// creation after it and reset width according to resize logic. -	static bool needs_restore_custom_state = true; -	if (mChatBarContainer && needs_restore_custom_state) -	{ -		// restore custom width of chatbar panel. -		S32 new_width = gSavedSettings.getS32("ChatBarCustomWidth"); -		if (new_width > 0) -		{ -			mDesiredNearbyChatWidth = new_width; -			processChatbarCustomization(new_width); -			lldebugs << "Setting nearby chat bar width to " << new_width << " px" << llendl; -			mChatBarContainer->reshape(new_width, mChatBarContainer->getRect().getHeight()); -		} -		needs_restore_custom_state = false; -	} - -} - -S32 LLBottomTray::processWidthDecreased(S32 delta_width) -{ -	bool still_should_be_processed = true; - -	const S32 chiclet_panel_shrink_headroom = getChicletPanelShrinkHeadroom(); - -	// There are four steps of processing width decrease. If in one of them required width was reached, -	// further are not needed. -	// 1. Decreasing width of chiclet panel. -	if (chiclet_panel_shrink_headroom > 0) -	{ -		// we have some space to decrease chiclet panel -		S32 shrink_by = llmin(-delta_width, chiclet_panel_shrink_headroom); - -		lldebugs << "delta_width: " << delta_width -			<< ", panel_delta_min: " << chiclet_panel_shrink_headroom -			<< ", shrink_by: " << shrink_by -			<< llendl; - -		// is chiclet panel wide enough to process resizing? -		delta_width += chiclet_panel_shrink_headroom; - -		still_should_be_processed = delta_width < 0; - -		lldebugs << "Shrinking chiclet panel by " << shrink_by << " px" << llendl; -		mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - shrink_by, mChicletPanel->getParent()->getRect().getHeight()); -		log(mChicletPanel, "after processing panel decreasing via chiclet panel"); - -		lldebugs << "RS_CHICLET_PANEL"  -			<< ", delta_width: " << delta_width -			<< llendl; -	} - -	S32 buttons_freed_width = 0; -	// 2. Decreasing width of buttons. -	if (still_should_be_processed) -	{ -		processShrinkButtons(delta_width, buttons_freed_width); -	} -	// 3. Decreasing width of nearby chat. -	const S32 chatbar_panel_min_width = get_panel_min_width(mToolbarStack, mChatBarContainer); -	const S32 chatbar_panel_width = mChatBarContainer->getRect().getWidth(); -	if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width) -	{ -		// we have some space to decrease chatbar panel -		S32 panel_delta_min = chatbar_panel_width - chatbar_panel_min_width; - -		S32 delta_panel = llmin(-delta_width, panel_delta_min); - -		// is chatbar panel wide enough to process resizing? -		delta_width += panel_delta_min; - -		still_should_be_processed = delta_width < 0; - -		// chatbar should only be shrunk here, not stretched -		if(delta_panel > 0) -		{ -			lldebugs << "Shrinking nearby chat bar by " << delta_panel << " px " << llendl; -			mChatBarContainer->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mChatBarContainer->getRect().getHeight()); -		} - -		log(mNearbyChatBar, "after processing panel decreasing via nearby chatbar panel"); - -		lldebugs << "RS_CHATBAR_INPUT" -			<< ", delta_panel: " << delta_panel -			<< ", delta_width: " << delta_width -			<< llendl; -	} - -	S32 extra_shrink_width = 0; -	// 4. Hiding buttons if needed. -	if (still_should_be_processed) -	{ -		processHideButtons(delta_width, buttons_freed_width); - -		if (delta_width < 0) -		{ -			extra_shrink_width = -delta_width; -			llwarns << "There is no enough width to reshape all children: "  -				<< extra_shrink_width << llendl; -		} - -		if (buttons_freed_width > 0) -		{ -			S32 nearby_needed_width = mDesiredNearbyChatWidth - mNearbyChatBar->getRect().getWidth(); -			if (nearby_needed_width > 0) -			{ -				S32 compensative_width = nearby_needed_width > buttons_freed_width ? buttons_freed_width : nearby_needed_width;  -				log(mNearbyChatBar, "before applying compensative width"); -				lldebugs << "Extending nearby chat bar by " << compensative_width << " px" << llendl; -				mChatBarContainer->reshape(mChatBarContainer->getRect().getWidth() + compensative_width, mChatBarContainer->getRect().getHeight() ); -				log(mNearbyChatBar, "after applying compensative width"); -				lldebugs << buttons_freed_width << llendl; -			} -		} -	} - -	return extra_shrink_width; -} - -void LLBottomTray::processWidthIncreased(S32 delta_width) -{ -	if (delta_width <= 0) return; - -	// how much room we have to show hidden buttons -	S32 available_width = delta_width + getChicletPanelShrinkHeadroom(); - -	lldebugs << "Distributing (" << getChicletPanelShrinkHeadroom() -		<< " + " << delta_width << ") = " << available_width << " px" << llendl; - -	// 1. Try showing buttons that have been auto-hidden. -	S32 processed_width = processShowButtons(available_width); -	lldebugs << "processed_width = " << processed_width << ", delta_width = " << delta_width << llendl; - -	lldebugs << "Available_width after showing buttons: " << available_width << llendl; - -	// If the newly shown buttons have consumed more than delta_width pixels, -	// shrink the chiclet panel. -	if (processed_width > delta_width) -	{ -		// 1. use delta width of resizing -		S32 shrink_by = processed_width - delta_width; - -		// 2. use width available via decreasing of chiclet panel -		if (shrink_by > 0) -		{ -			lldebugs << "Shrinking chiclet panel by " << shrink_by << " px" << llendl; -			mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - shrink_by, mChicletPanel->getParent()->getRect().getHeight()); -			log(mChicletPanel, "after applying compensative width for chiclets: "); -			lldebugs << shrink_by << llendl; -		} - -		// shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels -		delta_width -= processed_width; -	} - -	// 2. Expand the nearby chat bar if needed. -	S32 chatbar_panel_width = mChatBarContainer->getRect().getWidth(); -	lldebugs << "delta_width = " << delta_width -		<< ", chatbar_panel_width = " << chatbar_panel_width -		<< ", mDesiredNearbyChatWidth = " << mDesiredNearbyChatWidth << llendl; -	if (delta_width > 0 && chatbar_panel_width < mDesiredNearbyChatWidth) -	{ -		S32 delta_panel_max = mDesiredNearbyChatWidth - chatbar_panel_width; -		S32 delta_panel = llmin(delta_width, delta_panel_max); -		lldebugs << "Unprocesed delta width: " << delta_width -			<< ", can be applied to chatbar: " << delta_panel_max -			<< ", will be applied: " << delta_panel -			<< llendl; - -		delta_width -= delta_panel_max; -		lldebugs << "Extending nearby chat bar by " << delta_panel << " px " << llendl; -		mChatBarContainer->reshape(chatbar_panel_width + delta_panel, mChatBarContainer->getRect().getHeight()); -		log(mNearbyChatBar, "applied unprocessed delta width"); -	} - -	// 3. Expand buttons that have been auto-shrunk, -	// if we haven't yet consumed all the available headroom. -	if (delta_width > 0) -	{ -		S32 available_width = delta_width + getChicletPanelShrinkHeadroom(); -		processExtendButtons(available_width); -	} -} - -S32 LLBottomTray::processShowButtons(S32& available_width) -{ -	lldebugs << "Distributing " << available_width << " px" << llendl; -	S32 original_available_width = available_width; - -	// process buttons from left to right -	resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); -	const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); - -	for (; it != it_end; ++it) -	{ -		// is there available space? -		if (available_width <= 0) break; - -		// try to show next button -		processShowButton(*it, available_width); -	} - -	return original_available_width - available_width; -} - -bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32& available_width) -{ -	// Check if the button was previously auto-hidden (due to lack of space). -	if (!isAutoHidden(shown_object_type)) -	{ -		return false; -	} - -	// Ok. Try showing the button. -	return showButton(shown_object_type, available_width); -} - -void LLBottomTray::processHideButtons(S32& required_width, S32& buttons_freed_width) -{ -	// process buttons from right to left -	resize_state_vec_t::const_reverse_iterator it = mButtonsProcessOrder.rbegin(); -	const resize_state_vec_t::const_reverse_iterator it_end = mButtonsProcessOrder.rend(); - -	for (; it != it_end; ++it) -	{ -		// is it still necessary to hide a button? -		if (required_width >= 0) break; - -		// try to hide next button -		processHideButton(*it, required_width, buttons_freed_width); -	} -} - -void LLBottomTray::processHideButton(EResizeState processed_object_type, S32& required_width, S32& buttons_freed_width) -{ -	lldebugs << "Trying to hide object type: " << processed_object_type << llendl; -	LLPanel* panel = getButtonPanel(processed_object_type); -	if (NULL == panel) -	{ -		return; -	} - -	if (panel->getVisible()) -	{ -		required_width += panel->getRect().getWidth(); - -		if (required_width > 0) -		{ -			buttons_freed_width += required_width; -		} - -		setTrayButtonVisible(processed_object_type, false); - -		setAutoHidden(processed_object_type, true); - -		lldebugs << "processing object type: " << processed_object_type -			<< ", buttons_freed_width: " << buttons_freed_width -			<< llendl; -	} -} - -void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_width) -{ -	// process buttons from right to left -	resize_state_vec_t::const_reverse_iterator it = mButtonsProcessOrder.rbegin(); -	const resize_state_vec_t::const_reverse_iterator it_end = mButtonsProcessOrder.rend(); - -	// iterate through buttons in the mButtonsProcessOrder first -	for (; it != it_end; ++it) -	{ -		// is it still necessary to hide a button? -		if (required_width >= 0) break; - -		// try to shrink next button -		processShrinkButton(*it, required_width); -	} - -	// then shrink Speak button -	if (required_width < 0) -	{ -		S32 panel_min_width = 0; -		std::string panel_name = mSpeakPanel->getName(); -		bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width); -		if (!success) -		{ -			lldebugs << "Panel was not found to get its min width: " << panel_name << llendl; -		} -		else -		{ -			S32 panel_width = mSpeakPanel->getRect().getWidth(); -			S32 possible_shrink_width = panel_width - panel_min_width; - -			if (possible_shrink_width > 0) -			{ -				if (mSpeakBtn) -				{	 -					mSpeakBtn->setLabelVisible(false); -				} - -				mSpeakPanel->reshape(panel_width - possible_shrink_width, mSpeakPanel->getRect().getHeight()); - -				required_width += possible_shrink_width; - -				if (required_width > 0) -				{ -					buttons_freed_width += required_width; -				} - -				lldebugs << "Shrunk Speak button panel: " << panel_name -					<< ", shrunk width: " << possible_shrink_width -					<< ", rest width to process: " << required_width -					<< llendl; -			} -		} -	} -} - -void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32& required_width) -{ -	LLPanel* panel = getButtonPanel(processed_object_type); -	if (NULL == panel) -	{ -		return; -	} - -	if (panel->getVisible()) -	{ -		S32 panel_width = panel->getRect().getWidth(); -		S32 panel_min_width = 0; -		std::string panel_name = panel->getName(); -		bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width); -		S32 possible_shrink_width = panel_width - panel_min_width; - -		if (!success) -		{ -			lldebugs << "Panel was not found to get its min width: " << panel_name << llendl; -		} -		// we have some space to free by shrinking the button -		else if (possible_shrink_width > 0) -		{ -			// let calculate real width to shrink - -			// 1. apply all possible width -			required_width += possible_shrink_width; - -			// 2. it it is too much...  -			if (required_width > 0) -			{ -				// reduce applied shrunk width to the excessive value. -				possible_shrink_width -= required_width; -				required_width = 0; -			} -			panel->reshape(panel_width - possible_shrink_width, panel->getRect().getHeight()); - -			lldebugs << "Shrunk panel: " << panel_name -				<< ", shrunk width: " << possible_shrink_width -				<< ", rest width to process: " << required_width -				<< llendl; -		} -	} -} - - -void LLBottomTray::processExtendButtons(S32& available_width) -{ -	// do not allow extending any buttons if we have some buttons hidden via resize -	if (isAutoHidden(RS_BUTTONS_CAN_BE_HIDDEN)) return; - -	lldebugs << "Distributing " << available_width << " px" << llendl; - -	// First try extending the Speak button. -	if (available_width > 0) -	{ -		if (!processExtendSpeakButton(available_width)) -		{ -			// The Speak button needs extension but lacks some space. -			// Don't extend other buttons in this case: the Speak button -			// should consume the available headroom first. -			return; -		} -	} - -	// Then process the other buttons from left to right. -	if (available_width > 0) -	{ -		resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); -		const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); - -		// iterate through buttons in the mButtonsProcessOrder first -		for (; it != it_end; ++it) -		{ -			// is there available space? -			if (available_width <= 0) break; - -			// try to extend next button -			processExtendButton(*it, available_width); -		} -	} -} - -bool LLBottomTray::processExtendSpeakButton(S32& available_width) -{ -	if (available_width <= 0) -	{ -		llassert(available_width > 0); -		return true; -	} - -	const S32 panel_max_width = mObjectDefaultWidthMap[RS_BUTTON_SPEAK]; -	const S32 panel_width = mSpeakPanel->getRect().getWidth(); -	const S32 required_headroom = panel_max_width - panel_width; - -	if (panel_width < panel_max_width) // if the button isn't extended already -	{ -		if (available_width < required_headroom) // not enough space -		{ -			lldebugs << "Need (" << required_headroom << " - " << available_width << ") = " -				<< (required_headroom - available_width) << " more px" -				<< " to extend the Speak button"<< llendl; - -			return false; // Don't extend other buttons until we extend Speak. -		} - -		// Reshape the Speak button to its maximum width. -		if (mSpeakBtn) mSpeakBtn->setLabelVisible(true); -		mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight()); - -		available_width -= required_headroom; -		llassert(available_width >= 0); - -		lldebugs << "Extending Speak button panel: " << mSpeakPanel->getName() -			<< ", extended width: " << required_headroom -			<< ", rest width to process: " << available_width -			<< llendl; -	} - -	return true; -} - -void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32& available_width) -{ -	llassert(available_width >= 0); - -	LLPanel* panel = getButtonPanel(processed_object_type); -	if (NULL == panel) -	{ -		return; -	} - -	if (!panel->getVisible()) return; - -	// Widen the button up to its maximum width, but by not more than <available_width> px. -	S32 panel_max_width = mObjectDefaultWidthMap[processed_object_type]; -	S32 panel_width = panel->getRect().getWidth(); -	S32 required_headroom = panel_max_width - panel_width; - -	S32 extend_by = llmin(available_width, required_headroom); -	if (extend_by > 0) -	{ -		panel->reshape(panel_width + extend_by, panel->getRect().getHeight()); - -		// Decrease amount of headroom available for other panels. -		available_width -= extend_by; - -		lldebugs << "Extending " << panel->getName() -			<< " by " << extend_by -			<< " px; remaining available width: " << available_width -			<< llendl; -	} -} - -bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const -{ -	// Check that all buttons (that can be hidden on resize) -	// to the left of the given one are already shown. - -	// process buttons in direct order (from left to right) -	resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); -	const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); - -	MASK buttons_before_mask = RS_NORESIZE; -	for (; it != it_end; ++it) -	{ -		const EResizeState button_type = *it; -		if (button_type == processed_object_type) break; - -		buttons_before_mask |= button_type; -	} - -	return !isAutoHidden(buttons_before_mask); -} - -void LLBottomTray::initResizeStateContainers() -{ -	// init map with objects should be processed for each type -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPEAK, getChild<LLPanel>("speak_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLPanel>("gesture_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLPanel>("movement_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild<LLPanel>("cam_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_DESTINATIONS, getChild<LLPanel>("destinations_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_AVATARS, getChild<LLPanel>("avatar_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, getChild<LLPanel>("snapshot_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_BUILD, getChild<LLPanel>("build_btn_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SEARCH, getChild<LLPanel>("search_btn_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_WORLD_MAP, getChild<LLPanel>("world_map_btn_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MINI_MAP, getChild<LLPanel>("mini_map_btn_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPLITTER_1, getChild<LLPanel>("splitter_panel_1"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_PEOPLE, getChild<LLPanel>("people_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_PROFILE, getChild<LLPanel>("profile_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPLITTER_2, getChild<LLPanel>("splitter_panel_2"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_HOWTO, getChild<LLPanel>("howto_panel"))); - -	// init an order of processed buttons -	mButtonsProcessOrder.push_back(RS_BUTTON_DESTINATIONS); -	mButtonsProcessOrder.push_back(RS_BUTTON_AVATARS); -	mButtonsProcessOrder.push_back(RS_BUTTON_SNAPSHOT); -	mButtonsProcessOrder.push_back(RS_BUTTON_BUILD); -	mButtonsProcessOrder.push_back(RS_BUTTON_SEARCH); -	mButtonsProcessOrder.push_back(RS_BUTTON_WORLD_MAP); -	mButtonsProcessOrder.push_back(RS_BUTTON_MINI_MAP); -	mButtonsProcessOrder.push_back(RS_BUTTON_SPLITTER_1); -	mButtonsProcessOrder.push_back(RS_BUTTON_PEOPLE); -	mButtonsProcessOrder.push_back(RS_BUTTON_PROFILE); -	mButtonsProcessOrder.push_back(RS_BUTTON_SPLITTER_2); -	mButtonsProcessOrder.push_back(RS_BUTTON_HOWTO); -	mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT); -	mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA); -	mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES); - -	mButtonsOrder.push_back(RS_BUTTON_SPEAK); -	mButtonsOrder.insert(mButtonsOrder.end(), mButtonsProcessOrder.begin(), mButtonsProcessOrder.end()); - -	// init default widths - -	// process buttons that can be hidden on resize... -	resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); -	const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); - -	for (; it != it_end; ++it) -	{ -		const EResizeState button_type = *it; -		// is there an appropriate object? -		LLPanel* button_panel = getButtonPanel(button_type); -		if (!button_panel) continue; - -		// set default width for it. -		mObjectDefaultWidthMap[button_type] = button_panel->getRect().getWidth(); -	} - -	// ... and add Speak button because it also can be shrunk. -	mObjectDefaultWidthMap[RS_BUTTON_SPEAK]	   = mSpeakPanel->getRect().getWidth(); -} - -// this method must be called before restoring of the chat entry field on startup -// because it resets chatbar's width according to resize logic. -void LLBottomTray::initButtonsVisibility() -{ -	setVisibleAndFitWidths(RS_BUTTON_SPEAK, gSavedSettings.getBOOL("EnableVoiceChat") || !mSpeakBtn ); -	setVisibleAndFitWidths(RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton")); -	setVisibleAndFitWidths(RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton")); -	setVisibleAndFitWidths(RS_BUTTON_CAMERA, gSavedSettings.getBOOL("ShowCameraButton")); -	setVisibleAndFitWidths(RS_BUTTON_SNAPSHOT, gSavedSettings.getBOOL("ShowSnapshotButton")); -	setVisibleAndFitWidths(RS_BUTTON_BUILD, gSavedSettings.getBOOL("ShowBuildButton")); -	setVisibleAndFitWidths(RS_BUTTON_SEARCH, gSavedSettings.getBOOL("ShowSearchButton")); -	setVisibleAndFitWidths(RS_BUTTON_WORLD_MAP, gSavedSettings.getBOOL("ShowWorldMapButton")); -	setVisibleAndFitWidths(RS_BUTTON_MINI_MAP, gSavedSettings.getBOOL("ShowMiniMapButton")); -	lldebugs << "mResizeState = " << resizeStateMaskToString(mResizeState) << llendl; -} - -void LLBottomTray::setButtonsControlsAndListeners() -{ -	// always show the speak panel if using the basic skin -	if (mSpeakBtn) -	{ -		gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SPEAK, _2)); -	}	 - -	gSavedSettings.getControl("ShowGestureButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_GESTURES, _2)); -	gSavedSettings.getControl("ShowMoveButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MOVEMENT, _2)); -	gSavedSettings.getControl("ShowCameraButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_CAMERA, _2)); -	gSavedSettings.getControl("ShowSnapshotButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SNAPSHOT, _2)); -	gSavedSettings.getControl("ShowBuildButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_BUILD, _2)); -	gSavedSettings.getControl("ShowSearchButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SEARCH, _2)); -	gSavedSettings.getControl("ShowWorldMapButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_WORLD_MAP, _2)); -	gSavedSettings.getControl("ShowMiniMapButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MINI_MAP, _2)); - - -	LLButton* build_btn = getChild<LLButton>("build_btn"); -	// set control name for Build button. It is not enough to link it with Button.SetFloaterToggle in xml -	std::string vis_control_name = LLFloaterReg::declareVisibilityControl("build"); -	// Set the button control value (toggle state) to the floater visibility control (Sets the value as well) -	build_btn->setControlVariable(LLFloater::getControlGroup()->getControl(vis_control_name)); -} - -bool LLBottomTray::toggleShowButton(LLBottomTray::EResizeState button_type, const LLSD& new_visibility) -{ -	if (LLBottomTray::instanceExists()) -	{ -		LLBottomTray::getInstance()->setTrayButtonVisibleIfPossible(button_type, new_visibility.asBoolean()); -	} -	return true; -} - -bool LLBottomTray::showButton(EResizeState button_type, S32& available_width) -{ -	LLPanel* panel = getButtonPanel(button_type); -	if (NULL == panel) -	{ -		return false; -	} - -	if (panel->getVisible()) -	{ -		return false; -	} - -	// Check if none of the buttons to the left of the given one was auto-hidden. -	// (we auto-show the buttons left to right). -	if (!canButtonBeShown(button_type)) -	{ -		return false; -	} - -	// Make sure we have enough room to show this button. -	const S32 required_width = panel->getRect().getWidth(); -	if (available_width < required_width) -	{ -		lldebugs << "Need " << (required_width - available_width) << " more px to show " << resizeStateToString(button_type) << llendl; -		return false; -	} - -	// All good. Show the button. -	setTrayButtonVisible(button_type, true); - -	// Let the caller know that there is now less available space. -	available_width -= required_width; - -	lldebugs << "Showing button " << resizeStateToString(button_type) -		<< ", remaining available width: " << available_width -		<< llendl; -	setAutoHidden(button_type, false); - -	return true; -} - -void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible) -{ -	LLPanel* panel = getButtonPanel(shown_object_type); -	if (NULL == panel) -	{ -		return; -	} - -	panel->setVisible(visible); -} - -void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification) -{ -	if (!setVisibleAndFitWidths(shown_object_type, visible) && visible && raise_notification) -	{ -		LLNotificationsUtil::add("BottomTrayButtonCanNotBeShown", -								 LLSD(), -								 LLSD(), -								 LLNotificationFunctorRegistry::instance().DONOTHING); -	} -} - -bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible) -{ -	// The Speak button is treated specially: if voice is enabled, -	// the button should be displayed no matter how much space we've got. -	if (object_type == RS_BUTTON_SPEAK) -	{ -		showSpeakButton(visible); -		return true; -	} - -	LLPanel* cur_panel = getButtonPanel(object_type); -	if (NULL == cur_panel) -	{ -		return false; -	} - -	bool is_set = true; - -	if (visible) -	{ -		// Assume that only chiclet panel can be auto-resized -		const S32 available_width = getChicletPanelShrinkHeadroom(); - -		S32 preferred_width = mObjectDefaultWidthMap[object_type]; -		S32 current_width = cur_panel->getRect().getWidth(); -		S32 result_width = 0; -		bool decrease_width = false; - -		if (preferred_width > 0 && available_width >= preferred_width) -		{ -			result_width = preferred_width; -		} -		else if (available_width >= current_width) -		{ -			result_width = current_width; -		} -		else -		{ -			// Calculate the possible shrunk width as difference between current and minimal widths -			const S32 chatbar_shrunk_width = -				mChatBarContainer->getRect().getWidth() - get_panel_min_width(mToolbarStack, mChatBarContainer); - -			S32 sum_of_min_widths = get_panel_min_width(mToolbarStack, mSpeakPanel); -			S32 sum_of_curr_widths = get_curr_width(mSpeakPanel); - -			resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); -			const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); - -			for (; it != it_end; ++it) -			{ -				LLPanel* cur_panel = getButtonPanel(*it); -				sum_of_min_widths += get_panel_min_width(mToolbarStack, cur_panel); -				sum_of_curr_widths += get_curr_width(cur_panel); -			} - -			const S32 possible_shrunk_width = -				chatbar_shrunk_width + (sum_of_curr_widths - sum_of_min_widths); - -			// Minimal width of current panel -			S32 minimal_width = 0; -			mToolbarStack->getPanelMinSize(cur_panel->getName(), &minimal_width); - -			if ( (available_width + possible_shrunk_width) >= minimal_width) -			{ -				// There is enough space for minimal width, but set the result_width -				// to preferred_width so buttons widths decreasing will be done in predefined order -				result_width = (preferred_width > 0) ? preferred_width : current_width; -				decrease_width = true; -			} -			else -			{ -				lldebugs << "Need " << (minimal_width - available_width - possible_shrunk_width) -					<< " more px to show " << resizeStateToString(object_type) << llendl; - -				// Make the button uppear when we have more available space. -				setAutoHidden(object_type, true); -				return false; -			} -		} - -		if (result_width != current_width) -		{ -			cur_panel->reshape(result_width, cur_panel->getRect().getHeight()); -			current_width = result_width; -		} - -		is_set = showButton(object_type, current_width); - -		// Shrink buttons if needed -		if (is_set && decrease_width) -		{ -			processWidthDecreased( -result_width); -		} -	} -	else -	{ -		const S32 delta_width = get_curr_width(cur_panel); - -		setTrayButtonVisible(object_type, false); - -		// Mark button NOT to show while future bottom tray extending -		lldebugs << "Removing " << resizeStateToString(object_type) << " from mResizeState" << llendl; -		setAutoHidden(object_type, false); - -		// Extend other buttons if need -		if (delta_width) -		{ -			processWidthIncreased(delta_width); -		} -	} -	return is_set; -} - -LLPanel* LLBottomTray::getButtonPanel(EResizeState button_type) -{ -	// Don't use the operator[] because it inserts a NULL value if the key is not found. -	if (mStateProcessedObjectMap.count(button_type) == 0) -	{ -		llwarns << "Cannot find a panel for " << resizeStateToString(button_type) << llendl; -		llassert(mStateProcessedObjectMap.count(button_type) == 1); -		return NULL; -	} - -	return mStateProcessedObjectMap[button_type]; -} - -void LLBottomTray::showWellButton(EResizeState object_type, bool visible) -{ -	llassert( ((RS_NOTIFICATION_WELL | RS_IM_WELL) & object_type) == object_type ); - -	const std::string panel_name = RS_IM_WELL == object_type ? "im_well_panel" : "notification_well_panel"; - -	LLView * panel = getChild<LLView>(panel_name); - -	// if necessary visibility is set nothing to do here -	if (panel->getVisible() == (BOOL)visible) return; - -	S32 panel_width = panel->getRect().getWidth(); -	panel->setVisible(visible); - -	if (visible) -	{ -		// method assumes that input param is a negative value -		processWidthDecreased(-panel_width); -	} -	else -	{ -		processWidthIncreased(panel_width); -	} -} - -void LLBottomTray::processChatbarCustomization(S32 new_width) -{ -	if (NULL == mNearbyChatBar) return; - -	const S32 delta_width = mChatBarContainer->getRect().getWidth() - new_width; - -	if (delta_width == 0) return; - -	{ -		static unsigned dbg_cnt = 0; -		lldebugs << llformat("*** (%03d) ************************************* %d", delta_width, ++dbg_cnt) << llendl; -	} - -	mDesiredNearbyChatWidth = new_width; - -	const S32 available_chiclet_shrink_width = getChicletPanelShrinkHeadroom(); -	llassert(available_chiclet_shrink_width >= 0); - -	if (delta_width > 0) // panel gets narrowly -	{ -		S32 total_possible_width = delta_width + available_chiclet_shrink_width; -		processShowButtons(total_possible_width); -		processExtendButtons(total_possible_width); -	} -	// here (delta_width < 0) // panel gets wider -	else //if (-delta_width > available_chiclet_shrink_width) -	{ -		S32 required_width = delta_width + available_chiclet_shrink_width; -		S32 buttons_freed_width = 0; -		processShrinkButtons(required_width, buttons_freed_width); -		processHideButtons(required_width, buttons_freed_width); -	} -} - -S32 LLBottomTray::getChicletPanelShrinkHeadroom() const -{ -	static const S32 min_width = mChicletPanel->getMinWidth(); -	const S32 cur_width = mChicletPanel->getParent()->getRect().getWidth(); - -	S32 shrink_headroom = cur_width - min_width; -	llassert(shrink_headroom >= 0); // the panel cannot get narrower than the minimum -	return shrink_headroom; -} - -// static -std::string LLBottomTray::resizeStateToString(EResizeState state) -{ -	const char *rs_string = "UNKNOWN_BUTTON"; -	 -	switch (state) -	{ -		case RS_NORESIZE:               rs_string = "RS_NORESIZE";              break; -		case RS_CHICLET_PANEL:          rs_string = "RS_CHICLET_PANEL";         break; -		case RS_CHATBAR_INPUT:          rs_string = "RS_CHATBAR_INPUT";         break; -		case RS_BUTTON_SNAPSHOT:        rs_string = "RS_BUTTON_SNAPSHOT";       break; -		case RS_BUTTON_CAMERA:          rs_string = "RS_BUTTON_CAMERA";         break; -		case RS_BUTTON_MOVEMENT:        rs_string = "RS_BUTTON_MOVEMENT";       break; -		case RS_BUTTON_GESTURES:        rs_string = "RS_BUTTON_GESTURES";       break; -		case RS_BUTTON_SPEAK:           rs_string = "RS_BUTTON_SPEAK";          break; -		case RS_IM_WELL:                rs_string = "RS_IM_WELL";               break; -		case RS_NOTIFICATION_WELL:      rs_string = "RS_NOTIFICATION_WELL";     break; -		case RS_BUTTON_BUILD:           rs_string = "RS_BUTTON_BUILD";          break; -		case RS_BUTTON_SEARCH:          rs_string = "RS_BUTTON_SEARCH";         break; -		case RS_BUTTON_WORLD_MAP:       rs_string = "RS_BUTTON_WORLD_MAP";      break; -		case RS_BUTTON_MINI_MAP:        rs_string = "RS_BUTTON_MINI_MAP";       break; -		case RS_BUTTON_DESTINATIONS:    rs_string = "RS_BUTTON_DESTINATIONS";   break; -		case RS_BUTTON_AVATARS:         rs_string = "RS_BUTTON_AVATARS";        break; -		case RS_BUTTON_PEOPLE:          rs_string = "RS_BUTTON_PEOPLE";         break; -		case RS_BUTTON_PROFILE:         rs_string = "RS_BUTTON_PROFILE";        break; -		case RS_BUTTON_HOWTO:           rs_string = "RS_BUTTON_HOWTO";          break; -		case RS_BUTTON_SPLITTER_1:      rs_string = "RS_BUTTON_SPLITTER_1";     break; -		case RS_BUTTON_SPLITTER_2:      rs_string = "RS_BUTTON_SPLITTER_2";     break; -		case RS_BUTTONS_CAN_BE_HIDDEN:  rs_string = "RS_BUTTONS_CAN_BE_HIDDEN"; break; -		// No default to track additions. -	} - -	return rs_string; -} - -// static -std::string LLBottomTray::resizeStateMaskToString(MASK mask) -{ -	std::string res; - -	bool add_delimiter = false; -    for (U32 i = 0; i < 16; i++) -    { -    	EResizeState state = (EResizeState) (1 << i); -    	if (mask & state) -    	{ -    		if (!add_delimiter) -    		{ -    			add_delimiter = true; -    		} -    		else -    		{ -    			res += ", "; -    		} - -			res += resizeStateToString(state); -    	} -    } - -    if (res.empty()) -    { -    	res = resizeStateToString(RS_NORESIZE); -    } - -    res += llformat(" (0x%X)", mask); -    return res; -} - -bool LLBottomTray::isAutoHidden(MASK button_types) const -{ -	return (mResizeState & button_types) != 0; -} - -void LLBottomTray::setAutoHidden(MASK button_types, bool hide) -{ -	if (hide) -	{ -		mResizeState |= button_types; -	} -	else -	{ -		mResizeState &= ~button_types; -	} -} - -//EOF diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h deleted file mode 100644 index 62718531ef..0000000000 --- a/indra/newview/llbottomtray.h +++ /dev/null @@ -1,564 +0,0 @@ -/**  -* @file llbottomtray.h -* @brief LLBottomTray class header file -* -* $LicenseInfo:firstyear=2009&license=viewerlgpl$ -* Second Life Viewer Source Code -* Copyright (C) 2010, 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_LLBOTTOMPANEL_H -#define LL_LLBOTTOMPANEL_H - -#include "llpanel.h" -#include "llimview.h" -#include "llbutton.h" - -class LLChicletPanel; -class LLLayoutStack; -class LLSpeakButton; -class LLNearbyChatBar; -class LLIMChiclet; -class LLBottomTrayLite; -class LLLayoutPanel; -class LLMenuGL; -class LLNearbyChatBarListener; - -// Build time optimization, generate once in .cpp file -#ifndef LLBOTTOMTRAY_CPP -extern template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance(); -#endif - -/** - * Class for buttons that should have drag'n'drop ability in bottomtray. - * These buttons pass mouse events handling to bottomtray. - */ -class LLBottomtrayButton : public LLButton -{ -public: -	struct Params : public LLInitParam::Block<Params, LLButton::Params> -	{ -		Optional<bool> can_drag; -		Params() -		: can_drag("can_drag", true){} -	}; -	/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); -	/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask); -	/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); - -protected: -	LLBottomtrayButton(const Params& p) -	:	LLButton(p), -		mCanDrag(p.can_drag) -	{ - -	} -	friend class LLUICtrlFactory; - -	bool mCanDrag; -}; - -class LLBottomTray  -	: public LLSingleton<LLBottomTray> -	, public LLPanel -	, public LLIMSessionObserver -	, public LLVoiceClientStatusObserver -{ -	LOG_CLASS(LLBottomTray); -	friend class LLSingleton<LLBottomTray>; -	friend class LLBottomTrayLite; -public: -	~LLBottomTray(); - -	BOOL postBuild(); - -	LLChicletPanel*		getChicletPanel()	{return mChicletPanel;} -	LLNearbyChatBar*		getNearbyChatBar(); - -	void onCommitGesture(LLUICtrl* ctrl); - -	// LLIMSessionObserver observe triggers -	virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id); -	virtual void sessionRemoved(const LLUUID& session_id); -	void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id); - -	S32 getTotalUnreadIMCount(); - -	virtual void reshape(S32 width, S32 height, BOOL called_from_parent); - -	virtual void setVisible(BOOL visible); - -	/*virtual*/ S32 notifyParent(const LLSD& info); - -	// Implements LLVoiceClientStatusObserver::onChange() to enable the speak -	// button when voice is available -	/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal); - -	void showBottomTrayContextMenu(S32 x, S32 y, MASK mask); - -	void showSpeakButton(bool visible); - -	void toggleMovementControls(); -	void toggleCameraControls(); - -	void onMouselookModeIn(); -	void onMouselookModeOut(); - -	/** -	 * Creates IM Chiclet based on session type (IM chat or Group chat) -	 */ -	LLIMChiclet* createIMChiclet(const LLUUID& session_id); - -	// Below are methods that were introduced or overriden in bottomtray to handle drag'n'drop - -	virtual void draw(); - -	/** -	 * These three methods handle drag'n'drop, they may be called directly from child buttons. -	 * handleHover and other virtual handle* couldn't be used here, because we should call LLPanel::handle*, -	 * but x and y here are often outside of bottomtray. -	 */ -	void onDraggableButtonHover(S32 x, S32 y); -	void onDraggableButtonMouseDown(LLUICtrl* button, S32 x, S32 y); -	void onDraggableButtonMouseUp(LLUICtrl* button, S32 x, S32 y); - - -private: -	typedef enum e_resize_state -	{ -		RS_NORESIZE				= 0x0000, -		RS_CHICLET_PANEL		= 0x0001, -		RS_CHATBAR_INPUT		= 0x0002, -		RS_BUTTON_SNAPSHOT		= 0x0004, -		RS_BUTTON_CAMERA		= 0x0008, -		RS_BUTTON_MOVEMENT		= 0x0010, -		RS_BUTTON_GESTURES		= 0x0020, -		RS_BUTTON_SPEAK			= 0x0040, -		RS_IM_WELL				= 0x0080, -		RS_NOTIFICATION_WELL	= 0x0100, -		RS_BUTTON_BUILD			= 0x0200, -		RS_BUTTON_SEARCH		= 0x0400, -		RS_BUTTON_WORLD_MAP		= 0x0800, -		RS_BUTTON_MINI_MAP		= 0x1000, -		RS_BUTTON_DESTINATIONS	= 0x2000, -		RS_BUTTON_AVATARS		= 0x4000, -		RS_BUTTON_PEOPLE		= 0x8000, -		RS_BUTTON_PROFILE		= 0x10000, -		RS_BUTTON_HOWTO			= 0x20000, -		RS_BUTTON_SPLITTER_1	= 0x40000, -		RS_BUTTON_SPLITTER_2	= 0x80000, - -		/* -		Once new button that can be hidden on resize is added don't forget to update related places: -			- RS_BUTTONS_CAN_BE_HIDDEN enum value below. -			- initResizeStateContainers(): mStateProcessedObjectMap and mButtonsProcessOrder -		*/ - -		/** -		 * Specifies buttons which can be hidden when bottom tray is shrunk. -		 * They are: Gestures, Movement (Move), Camera (View), Snapshot -		 *		new: Build, Search, Map, World Map, Mini-Map, destinations, avatars -		 */ -		RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES -									| RS_BUTTON_BUILD | RS_BUTTON_SEARCH | RS_BUTTON_WORLD_MAP | RS_BUTTON_MINI_MAP -									| RS_BUTTON_DESTINATIONS | RS_BUTTON_AVATARS -	}EResizeState; - -	// Below are three methods that were introduced to handle drag'n'drop - -	/** -	 * finds a panel under the specified LOCAL point -	 */ -	LLPanel* findChildPanelByLocalCoords(S32 x, S32 y); - -	/** -	 * checks whether the cursor is over an area where the dragged button may be dropped -	 */ -	bool isCursorOverDraggableArea(S32 x, S32 y); - -	/** -	 * Updates process(shrink/show/hide) order of buttons and order in which they'll be stored for further save/load. -	 * It is called when dragged button is dropped -	 */ -	void updateButtonsOrdersAfterDnD(); - -	// saves order of buttons to file on disk -	void saveButtonsOrder(); -	// reads order of buttons from file on disk -	void loadButtonsOrder(); - -	/** -	 * Updates child controls size and visibility when it is necessary to reduce total width. -	 * -	 * Process order: -	 *	- reduce chiclet panel to its minimal width; -	 *  - reduce chatbar to its minimal width; -	 *  - reduce visible buttons from right to left to their minimal width; -	 *  - hide visible buttons from right to left; -	 * When button is hidden chatbar extended to fill released space if it is necessary. -	 * -	 * @param[in] delta_width - value by which bottom tray should be shrunk. It is a negative value. -	 * @return positive value which bottom tray can not process when it reaches its minimal width. -	 *		Zero if there was enough space to process delta_width. -	 */ -	S32 processWidthDecreased(S32 delta_width); - -	/** -	 * Updates child controls size and visibility when it is necessary to extend total width. -	 * -	 * Process order: -	 *  - show invisible buttons should be shown from left to right if possible; -	 *  - extend visible buttons from left to right to their default width; -	 *  - extend chatbar to its maximal width; -	 *	- extend chiclet panel to all available space; -	 * When chatbar & chiclet panels are wider then their minimal width they can be reduced to allow -	 * a button gets visible in case if passed delta_width is not enough (chatbar first). -	 * -	 * @param[in] delta_width - value by which bottom tray should be extended. It is a positive value. -	 */ -	void processWidthIncreased(S32 delta_width); - -	/** helper function to log debug messages */ -	void log(LLView* panel, const std::string& descr); - -	/** -	 * Tries to show hidden by resize buttons using available width. -	 * -	 * Gets buttons visible if there is enough space. Reduces available_width in this case. -	 * -	 * @params[in, out] available_width - reference to available width to be used to show buttons. -	 * @see processShowButton() -	 * @return consumed pixels (difference in available width). -	 */ -	S32 processShowButtons(S32& available_width); - -	/** -	 * Tries to show panel with specified button using available width. -	 * -	 * Shows button specified by type if there is enough space. Reduces available_width in this case. -	 * -	 * @params[in] shown_object_type - type of button to be shown. -	 * @params[in, out] available_width - reference to available width to be used to show button. -	 * -	 * @return true if button can be shown, false otherwise -	 */ -	bool processShowButton(EResizeState shown_object_type, S32& available_width); - -	/** -	 * Hides visible panels with all buttons that may be hidden by resize if it is necessary. -	 * -	 * When button gets hidden some space is released in bottom tray. -	 * This space is taken into account for several consecutive calls for several buttons. -	 * -	 * @params[in, out] required_width - reference to required width to be released. This is a negative value. -	 *			Its absolute value is decreased by shown panel width. -	 * @params[in, out] buttons_freed_width - reference to value released over required one. -	 *			If panel's width is more than required difference is added to buttons_freed_width. -	 * @see processHideButton() -	 */ -	void processHideButtons(S32& required_width, S32& buttons_freed_width); - -	/** -	 * Hides panel with specified button if it is visible. -	 * -	 * When button gets hidden some space is released in bottom tray. -	 * This space is taken into account for several consecutive calls for several buttons. -	 * -	 * @params[in] processed_object_type - type of button to be hide. -	 * @params[in, out] required_width - reference to required width to be released. This is a negative value. -	 *			Its absolute value is decreased by panel width. -	 * @params[in, out] buttons_freed_width - reference to value released over required one. -	 *			If panel's width is more than required difference is added to buttons_freed_width. -	 */ -	void processHideButton(EResizeState processed_object_type, S32& required_width, S32& buttons_freed_width); - -	/** -	 * Shrinks shown buttons to reduce total taken space. -	 * -	 * Shrinks buttons that may be shrunk smoothly first. Then shrinks Speak button. -	 * -	 * @param[in, out] required_width - reference to width value which should be released when buttons are shrunk. It is a negative value. -	 * It is increased on the value processed by buttons. -	 * @params[in, out] buttons_freed_width - reference to value released over required one. -	 *			If width of panel with Speak button is more than required that difference is added -	 *				to buttons_freed_width. -	 *			This is because Speak button shrinks discretely unlike other buttons which are changed smoothly. -	 */ -	void processShrinkButtons(S32& required_width, S32& buttons_freed_width); - -	/** -	 * Shrinks panel with specified button if it is visible. -	 * -	 * @params[in] processed_object_type - type of button to be shrunk. -	 * @param[in, out] required_width - reference to width value which should be released when button is shrunk. It is a negative value. -	 * It is increased on the value released by the button. -	 */ -	void processShrinkButton(EResizeState processed_object_type, S32& required_width); - -	/** -	 * Extends shown buttons to increase total taken space. -	 * -	 * Extends buttons that may be extended smoothly first. Then extends Speak button. -	 * -	 * @param[in, out] available_width - reference to width value which buttons can use to be extended. -	 *		It is a positive value. It is decreased on the value processed by buttons. -	 */ -	void processExtendButtons(S32& available_width); - -	/** -	 * Extends the Speak button if there is anough headroom. -	 * -	 * Unlike other buttons, the Speak buttons has only two possible widths: -	 * the minimal one (without label) and the maximal (default) one. -	 * -	 * If the button is at its minimum width there is not enough headroom to -	 * reshape it to the maximum width, the method does nothing. -	 * -	 * @param available_width Available headroom. -	 * @return false if the button requires extension but there's not enough headroom, true otherwise. -	 */ -	bool processExtendSpeakButton(S32& available_width); - -	/** -	 * Extends shown button to increase total taken space. -	 * -	 * @params[in] processed_object_type - type of button to be extended. -	 * @param[in, out] available_width - reference to width value which button can use to be extended. -	 *		It is a positive value. It is decreased on the value processed by buttons. -	 */ -	void processExtendButton(EResizeState processed_object_type, S32& available_width); - -	/** -	 * Determines if specified by type object can be shown. It should be hidden by shrink before. -	 * -	 * Processes buttons a such way to show buttons in constant order: -	 *   - Gestures, Move, View, Snapshot -	 */ -	bool canButtonBeShown(EResizeState processed_object_type) const; - -	/** -	 * Initializes all containers stored data related to children resize state. -	 * -	 * @see mStateProcessedObjectMap -	 * @see mObjectDefaultWidthMap -	 * @see mButtonsProcessOrder -	 */ -	void initResizeStateContainers(); - -	/** -	 * Initializes buttons' visibility depend on stored Control Settings. -	 */ -	void initButtonsVisibility(); - -	/** -	 * Initializes listeners of Control Settings to toggle appropriate buttons' visibility. -	 * -	 * @see toggleShowButton() -	 */ -	void setButtonsControlsAndListeners(); - -	/** -	 * Toggles visibility of specified button depend on passed value. -	 * -	 * @param button_type - type of button to be toggled -	 * @param new_visibility - new visibility of the button -	 * -	 * @see setButtonsControlsAndListeners() -	 */ -	static bool toggleShowButton(EResizeState button_type, const LLSD& new_visibility); - -	/** -	 * Show the button if there is enough space. -	 * -	 * @param[in]      button_type -    type of button to be shown. -	 * @param[in, out] available_width  amount of available space on the bottom bar. -	 * -	 * @return true if button was shown, false that's not possible (not enough space, etc) -	 */ -	bool showButton(EResizeState button_type, S32& available_width); - -	/** -	 * Sets passed visibility to object specified by resize type. -	 */ -	void setTrayButtonVisible(EResizeState shown_object_type, bool visible); - -	/** -	 * Sets passed visibility to object specified by resize type if it is possible. -	 * -	 * If it is impossible to show required button due to there is no enough room in bottom tray -	 * it will no be shown. Is called via context menu commands. -	 * In this case Alert Dialog will be shown to notify user about that. -	 * -	 * Method also stores resize state to be processed while future bottom tray extending: -	 *  - if hidden while resizing button should be hidden it will not be shown while extending; -	 *  - if hidden via context menu button should be shown but there is no enough room for now -	 *    it will be shown while extending. -	 */ -	void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification = true); - -	/** -	 * Sets passed visibility to required button and fit widths of shown -	 * buttons(notice that method can shrink widths to -	 * allocate needed room in bottom tray). -	 * Returns true if visibility of required button was set. -	 */ -	bool setVisibleAndFitWidths(EResizeState object_type, bool visible); - -	/** -	 * Get panel containing the given button. -	 * -	 * @see mStateProcessedObjectMap -	 */ -	LLPanel* getButtonPanel(EResizeState button_type); - -	/** -	 * Shows/hides panel with specified well button (IM or Notification) -	 * -	 * @param[in] object_type - type of well button to be processed. -	 *		Must be one of RS_IM_WELL or RS_NOTIFICATION_WELL. -	 * @param[in] visible - flag specified whether button should be shown or hidden. -	 */ -	void showWellButton(EResizeState object_type, bool visible); - -	/** -	 * Handles a customization of chatbar width. -	 * -	 * When chatbar gets wider layout stack will reduce chiclet panel (it is auto-resizable) -	 *	But once chiclet panel reaches its minimal width Stack will force to reduce buttons width. -	 *	including Speak button. The similar behavior is when chatbar gets narrowly. -	 * This methods force resize behavior to resize buttons properly in these cases. -	 */ -	void processChatbarCustomization(S32 new_width); - -	/** -	 * @return difference between current chiclet panel width and the minimum. -	 */ -	S32 getChicletPanelShrinkHeadroom() const; - -	/// Get button name for debugging. -	static std::string resizeStateToString(EResizeState state); - -	/// Dump a mask for debugging -	static std::string resizeStateMaskToString(MASK mask); - -	/// @return true if any of the the passed buttons have been auto-hidden due to lack of available space. -	bool isAutoHidden(MASK button_types) const; - -	/** -	 * (Un)Mark the buttons as hidden. -	 * -	 * Auto-hidden buttons are those that re-appear as soon as we have enough available space. -	 */ -	void setAutoHidden(MASK button_types, bool hide); - -	/// Buttons automatically hidden due to lack of space. -	MASK mResizeState; - -	/** -	 * Mapping of button types to the layout panels the buttons are wrapped in. -	 * -	 * Used by getButtonPanel(). -	 */ -	typedef std::map<EResizeState, LLPanel*> state_object_map_t; -	state_object_map_t mStateProcessedObjectMap; - -	/// Default (maximum) widths of the layout panels. -	typedef std::map<EResizeState, S32> state_object_width_map_t; -	state_object_width_map_t mObjectDefaultWidthMap; - -	typedef std::vector<EResizeState> resize_state_vec_t; - -	/** -	 * Contains order in which child buttons should be processed in show/hide, extend/shrink methods. -	 */ -	resize_state_vec_t mButtonsProcessOrder; - -	/** -	 * Contains order in which child buttons are shown. -	 * It traces order of all bottomtray buttons that may change place via drag'n'drop and should -	 * save and load it between sessions. mButtonsProcessOrder is not enough for it because it contains only -	 * buttons that may be hidden. -	 */ -	resize_state_vec_t mButtonsOrder; - -protected: - -	LLBottomTray(const LLSD& key = LLSD()); - -	static void* createNearbyChatBar(void* userdata); - -	void updateContextMenu(S32 x, S32 y, MASK mask); -	void onContextMenuItemClicked(const LLSD& userdata); -	bool onContextMenuItemEnabled(const LLSD& userdata); - -	// Either default or saved after user's manual resize width of nearby chat. -	// Nearby chat will not always have it, because sometimes it can be shrunk on resize, -	// but when possible it will be restored back to this value. -	S32					mDesiredNearbyChatWidth; -	LLChicletPanel* 	mChicletPanel; -	LLPanel*			mSpeakPanel; -	LLSpeakButton* 		mSpeakBtn; -	LLNearbyChatBar*	mNearbyChatBar; -	LLLayoutPanel*		mChatBarContainer; -	LLPanel*		mNearbyCharResizeHandlePanel; -	LLLayoutStack*		mToolbarStack; -	LLMenuGL*			mBottomTrayContextMenu; -	LLButton*			mCamButton; -	LLButton*			mMovementButton; -	LLBottomTrayLite*   mBottomTrayLite; -	bool                mIsInLiteMode; - -	// Drag'n'Drop - -	/** -	 * Is true if mouse down happened on draggable button. -	 * Set false whether on drag start or on mouse up. -	 */ -	bool mCheckForDrag; -	/** -	 * These two variables hold corrdinates of mouse down on draggable button. -	 * They are used to compare with current coordinates of cursor and determine whether drag'n'drop should start. -	 */ -	S32 mStartX; -	S32 mStartY; -	/** -	 * True if drag'n'drop is happening. -	 */ -	bool mDragStarted; - -	/** -	 * Pointer to panel which is currently dragged (though it seems to user that button is dragged, -	 * we are changing place of layout panel). -	 */ -	LLPanel* mDraggedItem; -	/** -	 * Panel before which the dragged button will be inserted. -	 */ -	LLPanel* mLandingTab; -	/** -	 * Image used to show position where dragged button will be dropped. -	 */ -	LLUIImage* mImageDragIndication; - -	// We want only one LLNearbyChatBarListener object, so it's tied to this singleton -	boost::shared_ptr<LLNearbyChatBarListener> mListener; -}; - -#endif // LL_LLBOTTOMPANEL_H diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp index 945a760d05..cc2a189b76 100644 --- a/indra/newview/llcallfloater.cpp +++ b/indra/newview/llcallfloater.cpp @@ -37,14 +37,13 @@  #include "llavatarnamecache.h"  #include "llavatariconctrl.h"  #include "llavatarlist.h" -#include "llbottomtray.h"  #include "lldraghandle.h"  #include "llimfloater.h" +#include "llimview.h"  #include "llfloaterreg.h"  #include "llparticipantlist.h"  #include "llspeakers.h"  #include "lltextutil.h" -#include "lltransientfloatermgr.h"  #include "llviewercontrol.h"  #include "llviewerdisplayname.h"  #include "llviewerwindow.h" @@ -97,7 +96,7 @@ static void* create_non_avatar_caller(void*)  LLVoiceChannel* LLCallFloater::sCurrentVoiceChannel = NULL;  LLCallFloater::LLCallFloater(const LLSD& key) -: LLTransientDockableFloater(NULL, false, key) +: LLFloater(key)  , mSpeakerManager(NULL)  , mParticipants(NULL)  , mAvatarList(NULL) @@ -113,10 +112,6 @@ LLCallFloater::LLCallFloater(const LLSD& key)  	mFactoryMap["non_avatar_caller"] = LLCallbackMap(create_non_avatar_caller, NULL);  	LLVoiceClient::instance().addObserver(this); -	LLTransientFloaterMgr::getInstance()->addControlView(this); - -	// force docked state since this floater doesn't save it between recreations -	setDocked(true);  	// update the agent's name if display name setting change  	LLAvatarNameCache::addUseDisplayNamesCallback(boost::bind(&LLCallFloater::updateAgentModeratorState, this)); @@ -139,13 +134,11 @@ LLCallFloater::~LLCallFloater()  	{  		LLVoiceClient::getInstance()->removeObserver(this);  	} -	LLTransientFloaterMgr::getInstance()->removeControlView(this);  }  // virtual  BOOL LLCallFloater::postBuild()  { -	LLTransientDockableFloater::postBuild();  	mAvatarList = getChild<LLAvatarList>("speakers_list");  	mAvatarListRefreshConnection = mAvatarList->setRefreshCompleteCallback(boost::bind(&LLCallFloater::onAvatarListRefreshed, this)); @@ -154,12 +147,6 @@ BOOL LLCallFloater::postBuild()  	mNonAvatarCaller = findChild<LLNonAvatarCaller>("non_avatar_caller");  	mNonAvatarCaller->setVisible(FALSE); -	LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_flyout_btn"); - -	setDockControl(new LLDockControl( -		anchor_panel, this, -		getDockTongue(), LLDockControl::TOP)); -  	initAgentData();  	connectToChannel(LLVoiceChannel::getCurrentVoiceChannel()); @@ -204,13 +191,13 @@ void LLCallFloater::draw()  	if (mParticipants)  		mParticipants->updateRecentSpeakersOrder(); -	LLTransientDockableFloater::draw(); +	LLFloater::draw();  }  // virtual  void LLCallFloater::setFocus( BOOL b )  { -	LLTransientDockableFloater::setFocus(b); +	LLFloater::setFocus(b);  	// Force using active floater transparency (STORM-730).  	// We have to override setFocus() for LLCallFloater because selecting an item diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h index 00a3f76e56..7282f7a8be 100644 --- a/indra/newview/llcallfloater.h +++ b/indra/newview/llcallfloater.h @@ -28,7 +28,7 @@  #ifndef LL_LLCALLFLOATER_H  #define LL_LLCALLFLOATER_H -#include "lltransientdockablefloater.h" +#include "llfloater.h"  #include "llvoicechannel.h"  #include "llvoiceclient.h" @@ -52,7 +52,7 @@ class LLSpeakersDelayActionsStorage;   * When the Resident is engaged in any chat except Nearby Chat, the Voice Control Panel   * also provides a 'Leave Call' button to allow the Resident to leave that voice channel.   */ -class LLCallFloater : public LLTransientDockableFloater, LLVoiceClientParticipantObserver +class LLCallFloater : public LLFloater, LLVoiceClientParticipantObserver  {  public: @@ -262,9 +262,6 @@ private:  	 */  	static LLVoiceChannel* sCurrentVoiceChannel; -	/* virtual */ -	LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; } -  	boost::signals2::connection mVoiceChannelStateChangeConnection;  }; diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp index 4ab3d8dc98..987651fc80 100644 --- a/indra/newview/llchannelmanager.cpp +++ b/indra/newview/llchannelmanager.cpp @@ -58,7 +58,10 @@ LLChannelManager::~LLChannelManager()  {  	for(std::vector<ChannelElem>::iterator it = mChannelList.begin(); it !=  mChannelList.end(); ++it)  	{ -		delete (*it).channel; +		LLScreenChannelBase* channel = it->channel.get(); +		if (!channel) continue; + +		delete channel;  	}  	mChannelList.clear(); @@ -68,9 +71,10 @@ LLChannelManager::~LLChannelManager()  LLScreenChannel* LLChannelManager::createNotificationChannel()  {  	//  creating params for a channel -	LLChannelManager::Params p; +	LLScreenChannelBase::Params p;  	p.id = LLUUID(gSavedSettings.getString("NotificationChannelUUID"));  	p.channel_align = CA_RIGHT; +	p.toast_align = NA_TOP;  	// Getting a Channel for our notifications  	return dynamic_cast<LLScreenChannel*> (LLChannelManager::getInstance()->getChannel(p)); @@ -84,16 +88,19 @@ void LLChannelManager::onLoginCompleted()  	// calc a number of all offline notifications  	for(std::vector<ChannelElem>::iterator it = mChannelList.begin(); it !=  mChannelList.end(); ++it)  	{ +		LLScreenChannelBase* channel = it->channel.get(); +		if (!channel) continue; +  		// don't calc notifications for Nearby Chat -		if((*it).channel->getChannelID() == LLUUID(gSavedSettings.getString("NearByChatChannelUUID"))) +		if(channel->getChannelID() == LLUUID(gSavedSettings.getString("NearByChatChannelUUID")))  		{  			continue;  		}  		// don't calc notifications for channels that always show their notifications -		if(!(*it).channel->getDisplayToastsAlways()) +		if(!channel->getDisplayToastsAlways())  		{ -			away_notifications +=(*it).channel->getNumberOfHiddenToasts(); +			away_notifications +=channel->getNumberOfHiddenToasts();  		}  	} @@ -106,7 +113,7 @@ void LLChannelManager::onLoginCompleted()  	else  	{  		// create a channel for the StartUp Toast -		LLChannelManager::Params p; +		LLScreenChannelBase::Params p;  		p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID"));  		p.channel_align = CA_RIGHT;  		mStartUpChannel = createChannel(p); @@ -157,33 +164,22 @@ LLScreenChannelBase*	LLChannelManager::addChannel(LLScreenChannelBase* channel)  	ChannelElem new_elem;  	new_elem.id = channel->getChannelID(); -	new_elem.channel = channel; +	new_elem.channel = channel->getHandle();  	mChannelList.push_back(new_elem);   	return channel;  } -LLScreenChannel* LLChannelManager::createChannel(LLChannelManager::Params& p) +LLScreenChannel* LLChannelManager::createChannel(LLScreenChannelBase::Params& p)  { -	LLScreenChannel* new_channel = new LLScreenChannel(p.id);  - -	if(!new_channel) -	{ -		llerrs << "LLChannelManager::getChannel(LLChannelManager::Params& p) - can't create a channel!" << llendl;		 -	} -	else -	{ -		new_channel->setToastAlignment(p.toast_align); -		new_channel->setChannelAlignment(p.channel_align); -		new_channel->setDisplayToastsAlways(p.display_toasts_always); +	LLScreenChannel* new_channel = new LLScreenChannel(p);  -		addChannel(new_channel); -	} +	addChannel(new_channel);  	return new_channel;  } -LLScreenChannelBase* LLChannelManager::getChannel(LLChannelManager::Params& p) +LLScreenChannelBase* LLChannelManager::getChannel(LLScreenChannelBase::Params& p)  {  	LLScreenChannelBase* new_channel = findChannelByID(p.id); @@ -195,19 +191,19 @@ LLScreenChannelBase* LLChannelManager::getChannel(LLChannelManager::Params& p)  }  //-------------------------------------------------------------------------- -LLScreenChannelBase* LLChannelManager::findChannelByID(const LLUUID id) +LLScreenChannelBase* LLChannelManager::findChannelByID(const LLUUID& id)  {  	std::vector<ChannelElem>::iterator it = find(mChannelList.begin(), mChannelList.end(), id);   	if(it != mChannelList.end())  	{ -		return (*it).channel; +		return (*it).channel.get();  	}  	return NULL;  }  //-------------------------------------------------------------------------- -void LLChannelManager::removeChannelByID(const LLUUID id) +void LLChannelManager::removeChannelByID(const LLUUID& id)  {  	std::vector<ChannelElem>::iterator it = find(mChannelList.begin(), mChannelList.end(), id);   	if(it != mChannelList.end()) @@ -222,7 +218,10 @@ void LLChannelManager::muteAllChannels(bool mute)  	for (std::vector<ChannelElem>::iterator it = mChannelList.begin();  			it != mChannelList.end(); it++)  	{ -		it->channel->setShowToasts(!mute); +		if (it->channel.get()) +		{ +			it->channel.get()->setShowToasts(!mute); +		}  	}  } diff --git a/indra/newview/llchannelmanager.h b/indra/newview/llchannelmanager.h index db936b28d9..a5de8a5327 100644 --- a/indra/newview/llchannelmanager.h +++ b/indra/newview/llchannelmanager.h @@ -43,24 +43,15 @@ namespace LLNotificationsUI   */  class LLChannelManager : public LLSingleton<LLChannelManager>  { -public:	 -	struct Params -	{ -		LLUUID				id; -		bool				display_toasts_always; -		EToastAlignment		toast_align; -		EChannelAlignment	channel_align; +public: -		Params():	id(LLUUID("")), display_toasts_always(false), toast_align(NA_BOTTOM), channel_align(CA_LEFT) -		{} -	};  	struct ChannelElem  	{ -		LLUUID				id; -		LLScreenChannelBase*	channel; +		LLUUID							id; +		LLHandle<LLScreenChannelBase>	channel; -		ChannelElem() : id(LLUUID("")), channel(NULL) { } +		ChannelElem() { }  		ChannelElem(const ChannelElem &elem)  		{ @@ -83,18 +74,18 @@ public:  	void onStartUpToastClose();  	// creates a new ScreenChannel according to the given parameters or returns existing if present -	LLScreenChannelBase*	getChannel(LLChannelManager::Params& p); +	LLScreenChannelBase*	getChannel(LLScreenChannelBase::Params& p);  	LLScreenChannelBase*	addChannel(LLScreenChannelBase* channel);  	// returns a channel by its ID -	LLScreenChannelBase*	findChannelByID(const LLUUID id); +	LLScreenChannelBase*	findChannelByID(const LLUUID& id);  	// creator of the Notification channel, that is used in more than one handler  	LLScreenChannel*		createNotificationChannel();  	// remove channel methods -	void	removeChannelByID(const LLUUID id); +	void	removeChannelByID(const LLUUID& id);  	/**  	 * Manages toasts showing for all channels. @@ -116,7 +107,7 @@ public:  	std::vector<ChannelElem>& getChannelList() { return mChannelList;}  private: -	LLScreenChannel* createChannel(LLChannelManager::Params& p); +	LLScreenChannel* createChannel(LLScreenChannelBase::Params& p);  	LLScreenChannel*			mStartUpChannel;  	std::vector<ChannelElem>	mChannelList; diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp index cf0374075a..d6095cce07 100644 --- a/indra/newview/llchatbar.cpp +++ b/indra/newview/llchatbar.cpp @@ -60,7 +60,6 @@  #include "llui.h"  #include "llviewermenu.h"  #include "lluictrlfactory.h" -#include "llbottomtray.h"  //  // Globals @@ -95,7 +94,7 @@ LLChatBar::LLChatBar()  	mGestureCombo(NULL),  	mObserver(NULL)  { -	setIsChrome(TRUE); +	//setIsChrome(TRUE);  } diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index c0c9ea1451..42de47e777 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -42,6 +42,7 @@  #include "llavataractions.h"  #include "lltrans.h"  #include "llfloaterreg.h" +#include "llfloatersidepanelcontainer.h"  #include "llmutelist.h"  #include "llstylemap.h"  #include "llslurl.h" @@ -58,8 +59,6 @@  #include "llviewercontrol.h" -#include "llsidetray.h"//for blocked objects panel -  static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history");  const static std::string NEW_LINE(rawstr_to_utf8("\n")); @@ -144,7 +143,7 @@ public:  		{  			LLMuteList::getInstance()->add(LLMute(getAvatarId(), mFrom, LLMute::OBJECT)); -			LLSideTray::getInstance()->showPanel("panel_block_list_sidetray", LLSD().with("blocked_to_select", getAvatarId())); +			LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD().with("blocked_to_select", getAvatarId()));  		}  	} @@ -255,7 +254,7 @@ public:  		mSourceType = chat.mSourceType;  		//*TODO overly defensive thing, source type should be maintained out there -		if((chat.mFromID.isNull() && chat.mFromName.empty()) || chat.mFromName == SYSTEM_FROM && chat.mFromID.isNull()) +		if((chat.mFromID.isNull() && chat.mFromName.empty()) || (chat.mFromName == SYSTEM_FROM && chat.mFromID.isNull()))  		{  			mSourceType = CHAT_SOURCE_SYSTEM;  		}   diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index 8584885bc9..9a84280f25 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -35,6 +35,7 @@  #include "llfloaterreg.h"  #include "lllocalcliprect.h"  #include "lltrans.h" +#include "llnearbychatbar.h"  #include "llviewercontrol.h"  #include "llagentdata.h" @@ -315,12 +316,12 @@ BOOL	LLNearbyChatToastPanel::handleMouseUp	(S32 x, S32 y, MASK mask)  			return TRUE;  		else  		{ -			LLFloaterReg::showInstance("nearby_chat",LLSD()); +			LLNearbyChatBar::getInstance()->showHistory();  			return FALSE;  		}  	} -	LLFloaterReg::showInstance("nearby_chat",LLSD()); +	LLNearbyChatBar::getInstance()->showHistory();  	return LLPanel::handleMouseUp(x,y,mask);  } diff --git a/indra/newview/llchatmsgbox.cpp b/indra/newview/llchatmsgbox.cpp index 024ccbcd0b..aa6c9c094c 100644 --- a/indra/newview/llchatmsgbox.cpp +++ b/indra/newview/llchatmsgbox.cpp @@ -70,7 +70,7 @@ private:  LLChatMsgBox::Params::Params() :  	block_spacing("block_spacing", 10)  { -	line_spacing.pixels = 4; +	changeDefault(line_spacing.pixels, 4);  }  LLChatMsgBox::LLChatMsgBox(const Params& p) : diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 3000209aad..a076374903 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -29,7 +29,7 @@  #include "llagent.h"  #include "llavataractions.h" -#include "llbottomtray.h" +#include "llchicletbar.h"  #include "lleventtimer.h"  #include "llgroupactions.h"  #include "lliconctrl.h" @@ -126,9 +126,9 @@ LLSysWellChiclet::Params::Params()  , unread_notifications("unread_notifications")  , max_displayed_count("max_displayed_count", 99)  { -	button.name("button"); -	button.tab_stop(FALSE); -	button.label(LLStringUtil::null); +	button.name = "button"; +	button.tab_stop = FALSE; +	button.label = LLStringUtil::null;  }  LLSysWellChiclet::LLSysWellChiclet(const Params& p) @@ -214,10 +214,10 @@ void LLSysWellChiclet::updateWidget(bool is_window_empty)  {  	mButton->setEnabled(!is_window_empty); -	LLSD params; -	params["well_empty"] = is_window_empty; -	params["well_name"] = getName(); -	notifyParent(params); +	if (LLChicletBar::instanceExists()) +	{ +		LLChicletBar::getInstance()->showWellButton(getName(), !is_window_empty); +	}  }  // virtual  BOOL LLSysWellChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) @@ -297,7 +297,7 @@ void LLIMWellChiclet::createMenu()  void LLIMWellChiclet::messageCountChanged(const LLSD& session_data)  {  	const LLUUID& session_id = session_data["session_id"]; -	const S32 counter = LLBottomTray::getInstance()->getTotalUnreadIMCount(); +	const S32 counter = LLChicletBar::getInstance()->getTotalUnreadIMCount();  	const bool im_not_visible = !LLFloaterReg::instanceVisible("im_container")  		&& !LLFloaterReg::instanceVisible("impanel", session_id); diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index a6e12006a1..1f1069dcb4 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -107,9 +107,9 @@ public:  	{  		Params()  		{ -			draw_tooltip(FALSE); -			mouse_opaque(FALSE); -			default_icon_name("Generic_Person"); +			changeDefault(draw_tooltip, FALSE); +			changeDefault(mouse_opaque, FALSE); +			changeDefault(default_icon_name, "Generic_Person");  		};  	}; @@ -131,9 +131,8 @@ public:  		Optional<std::string> default_icon;  		Params() -		 : default_icon("default_icon", "Generic_Group") -		{ -		}; +		:	default_icon("default_icon", "Generic_Group") +		{}  	};  	/** @@ -162,9 +161,9 @@ public:  		Optional<std::string> default_icon;  		Params() -		 : default_icon("default_icon", "Generic_Object_Small") +		:	default_icon("default_icon", "Generic_Object_Small")  		{ -			avatar_id = LLUUID::null; +			changeDefault(avatar_id, LLUUID::null);  		};  	}; @@ -314,9 +313,7 @@ public:  		TYPE_AD_HOC  	};  	struct Params : public LLInitParam::Block<Params, LLChiclet::Params> -	{ -		Params(){} -	}; +	{};  	virtual ~LLIMChiclet() {}; diff --git a/indra/newview/llchicletbar.cpp b/indra/newview/llchicletbar.cpp new file mode 100644 index 0000000000..a17e1d13f5 --- /dev/null +++ b/indra/newview/llchicletbar.cpp @@ -0,0 +1,340 @@ +/**  + * @file llchicletbar.cpp + * @brief LLChicletBar class implementation + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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" // must be first include + +#include "llchicletbar.h" + +// library includes +#include "llfloaterreg.h" +#include "lllayoutstack.h" + +// newview includes +#include "llchiclet.h" +#include "llimfloater.h" // for LLIMFloater +#include "llsyswellwindow.h" + +namespace +{ +	const std::string& PANEL_CHICLET_NAME	= "chiclet_list_panel"; + +	S32 get_panel_min_width(LLLayoutStack* stack, LLView* panel) +	{ +		S32 minimal_width = 0; +		llassert(stack); +		if ( stack && panel && panel->getVisible() ) +		{ +			stack->getPanelMinSize(panel->getName(), &minimal_width); +		} +		return minimal_width; +	} + +	S32 get_panel_max_width(LLLayoutStack* stack, LLPanel* panel) +	{ +		S32 max_width = 0; +		llassert(stack); +		if ( stack && panel && panel->getVisible() ) +		{ +			stack->getPanelMaxSize(panel->getName(), &max_width); +		} +		return max_width; +	} + +	S32 get_curr_width(LLUICtrl* ctrl) +	{ +		S32 cur_width = 0; +		if ( ctrl && ctrl->getVisible() ) +		{ +			cur_width = ctrl->getRect().getWidth(); +		} +		return cur_width; +	} +} + +LLChicletBar::LLChicletBar(const LLSD&) +:	mChicletPanel(NULL), +	mToolbarStack(NULL) +{ +	// Firstly add our self to IMSession observers, so we catch session events +	// before chiclets do that. +	LLIMMgr::getInstance()->addSessionObserver(this); + +	buildFromFile("panel_chiclet_bar.xml"); +} + +LLChicletBar::~LLChicletBar() +{ +	if (!LLSingleton<LLIMMgr>::destroyed()) +	{ +		LLIMMgr::getInstance()->removeSessionObserver(this); +	} +} + +LLIMChiclet* LLChicletBar::createIMChiclet(const LLUUID& session_id) +{ +	LLIMChiclet::EType im_chiclet_type = LLIMChiclet::getIMSessionType(session_id); + +	switch (im_chiclet_type) +	{ +	case LLIMChiclet::TYPE_IM: +		return getChicletPanel()->createChiclet<LLIMP2PChiclet>(session_id); +	case LLIMChiclet::TYPE_GROUP: +		return getChicletPanel()->createChiclet<LLIMGroupChiclet>(session_id); +	case LLIMChiclet::TYPE_AD_HOC: +		return getChicletPanel()->createChiclet<LLAdHocChiclet>(session_id); +	case LLIMChiclet::TYPE_UNKNOWN: +		break; +	} + +	return NULL; +} + +//virtual +void LLChicletBar::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) +{ +	if (!getChicletPanel()) return; + +	LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id); +	if (!session) return; + +	// no need to spawn chiclets for participants in P2P calls called through Avaline +	if (session->isP2P() && session->isOtherParticipantAvaline()) return; + +	if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return; + +	LLIMChiclet* chiclet = createIMChiclet(session_id); +	if(chiclet) +	{ +		chiclet->setIMSessionName(name); +		chiclet->setOtherParticipantId(other_participant_id); +		 +		LLIMFloater::onIMChicletCreated(session_id); + +	} +	else +	{ +		llwarns << "Could not create chiclet" << llendl; +	} +} + +//virtual +void LLChicletBar::sessionRemoved(const LLUUID& session_id) +{ +	if(getChicletPanel()) +	{ +		// IM floater should be closed when session removed and associated chiclet closed +		LLIMFloater* iMfloater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id); +		if (iMfloater != NULL) +		{ +			iMfloater->closeFloater(); +		} + +		getChicletPanel()->removeChiclet(session_id); +	} +} + +void LLChicletBar::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id) +{ +	//this is only needed in case of outgoing ad-hoc/group chat sessions +	LLChicletPanel* chiclet_panel = getChicletPanel(); +	if (chiclet_panel) +	{ +		//it should be ad-hoc im chiclet or group im chiclet +		LLChiclet* chiclet = chiclet_panel->findChiclet<LLChiclet>(old_session_id); +		if (chiclet) chiclet->setSessionId(new_session_id); +	} +} + +S32 LLChicletBar::getTotalUnreadIMCount() +{ +	return getChicletPanel()->getTotalUnreadIMCount(); +} + +BOOL LLChicletBar::postBuild() +{ +	mToolbarStack = getChild<LLLayoutStack>("toolbar_stack"); +	mChicletPanel = getChild<LLChicletPanel>("chiclet_list"); + +	showWellButton("im_well", !LLIMWellWindow::getInstance()->isWindowEmpty()); +	showWellButton("notification_well", !LLNotificationWellWindow::getInstance()->isWindowEmpty()); + +	return TRUE; +} + +void LLChicletBar::showWellButton(const std::string& well_name, bool visible) +{ +	LLView * panel = findChild<LLView>(well_name + "_panel"); +	if (!panel)	return; + +	panel->setVisible(visible); +} + +void LLChicletBar::log(LLView* panel, const std::string& descr) +{ +	if (NULL == panel) return; +	LLView* layout = panel->getParent(); +	LL_DEBUGS("Chiclet Bar Rects") << descr << ": " +		<< "panel: " << panel->getName() +		<< ", rect: " << panel->getRect() +		<< " layout: " << layout->getName() +		<< ", rect: " << layout->getRect() +		<< LL_ENDL; +} + +void LLChicletBar::reshape(S32 width, S32 height, BOOL called_from_parent) +{ +	static S32 debug_calling_number = 0; +	lldebugs << "**************************************** " << ++debug_calling_number << llendl; + +	S32 current_width = getRect().getWidth(); +	S32 delta_width = width - current_width; +	lldebugs << "Reshaping: " +		<< ", width: " << width +		<< ", cur width: " << current_width +		<< ", delta_width: " << delta_width +		<< ", called_from_parent: " << called_from_parent +		<< llendl; + +	if (mChicletPanel)			log(mChicletPanel, "before"); + +	// Difference between chiclet bar width required to fit its children and the actual width. (see EXT-991) +	// Positive value means that chiclet bar is not wide enough. +	// Negative value means that there is free space. +	static S32 extra_shrink_width = 0; +	bool should_be_reshaped = true; + +	if (mChicletPanel && mToolbarStack) +	{ +		// Firstly, update layout stack to ensure we deal with correct panel sizes. +		{ +			BOOL saved_anim = mToolbarStack->getAnimate(); +			// Set chiclet panel to be autoresized by default. +			mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE); +			// Disable animation to prevent layout updating in several frames. +			mToolbarStack->setAnimate(FALSE); +			// Force the updating of layout to reset panels collapse factor. +			mToolbarStack->updateLayout(); +			// Restore animate state. +			mToolbarStack->setAnimate(saved_anim); +		} + +		// chiclet bar is narrowed +		if (delta_width < 0) +		{ +			if (extra_shrink_width > 0) // not enough space +			{ +				extra_shrink_width += llabs(delta_width); +				should_be_reshaped = false; +			} +			else +			{ +				extra_shrink_width = processWidthDecreased(delta_width); + +				// increase new width to extra_shrink_width value to not reshape less than chiclet bar minimum +				width += extra_shrink_width; +			} +		} +		// chiclet bar is widened +		else +		{ +			if (extra_shrink_width > delta_width) +			{ +				// Still not enough space. +				// Only subtract the delta from the required delta and don't reshape. +				extra_shrink_width -= delta_width; +				should_be_reshaped = false; +			} +			else if (extra_shrink_width > 0) +			{ +				// If we have some extra shrink width let's reduce delta_width & width +				delta_width -= extra_shrink_width; +				width -= extra_shrink_width; +				extra_shrink_width = 0; +			} +		} +	} + +	if (should_be_reshaped) +	{ +		lldebugs << "Reshape all children with width: " << width << llendl; +		LLPanel::reshape(width, height, called_from_parent); +	} + +	if (mChicletPanel)			log(mChicletPanel, "after"); +} + +S32 LLChicletBar::processWidthDecreased(S32 delta_width) +{ +	bool still_should_be_processed = true; + +	const S32 chiclet_panel_shrink_headroom = getChicletPanelShrinkHeadroom(); + +	// Decreasing width of chiclet panel. +	if (chiclet_panel_shrink_headroom > 0) +	{ +		// we have some space to decrease chiclet panel +		S32 shrink_by = llmin(-delta_width, chiclet_panel_shrink_headroom); + +		lldebugs << "delta_width: " << delta_width +			<< ", panel_delta_min: " << chiclet_panel_shrink_headroom +			<< ", shrink_by: " << shrink_by +			<< llendl; + +		// is chiclet panel wide enough to process resizing? +		delta_width += chiclet_panel_shrink_headroom; + +		still_should_be_processed = delta_width < 0; + +		lldebugs << "Shrinking chiclet panel by " << shrink_by << " px" << llendl; +		mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - shrink_by, mChicletPanel->getParent()->getRect().getHeight()); +		log(mChicletPanel, "after processing panel decreasing via chiclet panel"); + +		lldebugs << "RS_CHICLET_PANEL" +			<< ", delta_width: " << delta_width +			<< llendl; +	} + +	S32 extra_shrink_width = 0; + +	if (still_should_be_processed) +	{ +		extra_shrink_width = -delta_width; +		llwarns << "There is no enough width to reshape all children: " +			<< extra_shrink_width << llendl; +	} + +	return extra_shrink_width; +} + +S32 LLChicletBar::getChicletPanelShrinkHeadroom() const +{ +	static const S32 min_width = mChicletPanel->getMinWidth(); +	const S32 cur_width = mChicletPanel->getParent()->getRect().getWidth(); + +	S32 shrink_headroom = cur_width - min_width; +	llassert(shrink_headroom >= 0); // the panel cannot get narrower than the minimum +	return shrink_headroom; +} diff --git a/indra/newview/llchicletbar.h b/indra/newview/llchicletbar.h new file mode 100644 index 0000000000..224dfbb647 --- /dev/null +++ b/indra/newview/llchicletbar.h @@ -0,0 +1,99 @@ +/**  +* @file llchicletbar.h +* @brief LLChicletBar class header file +* +* $LicenseInfo:firstyear=2011&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2011, 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_LLCHICLETBAR_H +#define LL_LLCHICLETBAR_H + +#include "llpanel.h" +#include "llimview.h" + +class LLChicletPanel; +class LLIMChiclet; +class LLLayoutPanel; +class LLLayoutStack; + +class LLChicletBar +	: public LLSingleton<LLChicletBar> +	, public LLPanel +	, public LLIMSessionObserver +{ +	LOG_CLASS(LLChicletBar); +	friend class LLSingleton<LLChicletBar>; +public: +	~LLChicletBar(); + +	BOOL postBuild(); + +	LLChicletPanel*	getChicletPanel() { return mChicletPanel; } + +	// LLIMSessionObserver observe triggers +	virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id); +	virtual void sessionRemoved(const LLUUID& session_id); +	void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id); + +	S32 getTotalUnreadIMCount(); + +	/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent); + +	/** +	 * Creates IM Chiclet based on session type (IM chat or Group chat) +	 */ +	LLIMChiclet* createIMChiclet(const LLUUID& session_id); + +	/** +	 * Shows/hides panel with specified well button (IM or Notification) +	 * +	 * @param well_name - name of the well panel to be processed. +	 * @param visible - a flag specifying whether a button should be shown or hidden. +	 */ +	void showWellButton(const std::string& well_name, bool visible); + +private: +	/** +	 * Updates child controls size and visibility when it is necessary to reduce total width. +	 * +	 * @param delta_width - value by which chiclet bar should be shrunk. It is a negative value. +	 * @returns positive value which chiclet bar can not process when it reaches its minimal width. +	 *		Zero if there was enough space to process delta_width. +	 */ +	S32 processWidthDecreased(S32 delta_width); + +	/** helper function to log debug messages */ +	void log(LLView* panel, const std::string& descr); + +	/** +	 * @return difference between current chiclet panel width and the minimum. +	 */ +	S32 getChicletPanelShrinkHeadroom() const; + +protected: +	LLChicletBar(const LLSD& key = LLSD()); + +	LLChicletPanel* 	mChicletPanel; +	LLLayoutStack*		mToolbarStack; +}; + +#endif // LL_LLCHICLETBAR_H diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index 254c0adef1..54598f90c8 100644 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -33,6 +33,7 @@  #include "llagentdata.h"  #include "llagentwearables.h"  #include "llappearancemgr.h" +#include "llfloatersidepanelcontainer.h"  #include "llinventory.h"  #include "llinventoryfunctions.h"  #include "lllistcontextmenu.h" @@ -40,7 +41,6 @@  #include "llviewermenu.h"  #include "llwearableitemslist.h"  #include "llpaneloutfitedit.h" -#include "llsidetray.h"  #include "lltrans.h"  static LLRegisterPanelClassWrapper<LLCOFWearables> t_cof_wearables("cof_wearables"); @@ -159,13 +159,8 @@ public:  protected:  	static void replaceWearable(const LLUUID& item_id)  	{ -		// *TODO: Most probable that accessing to LLPanelOutfitEdit instance should be: -		// LLSideTray::getInstance()->getSidepanelAppearance()->getPanelOutfitEdit() -		// without casting. Getter methods provides possibility to check and construct -		// absent instance. Explicit relations between components avoids situations -		// when we tries to construct instance with unsatisfied implicit input conditions.  		LLPanelOutfitEdit	* panel_outfit_edit = -						dynamic_cast<LLPanelOutfitEdit*> (LLSideTray::getInstance()->getPanel( +						dynamic_cast<LLPanelOutfitEdit*> (LLFloaterSidePanelContainer::getPanel("appearance",  								"panel_outfit_edit"));  		if (panel_outfit_edit != NULL)  		{ @@ -235,9 +230,7 @@ protected:  		LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;  		LLUUID selected_id = mUUIDs.back(); -		// *HACK* need to pass pointer to LLPanelOutfitEdit instead of LLSideTray::getInstance()->getPanel(). -		// LLSideTray::getInstance()->getPanel() is rather slow variant -		LLPanelOutfitEdit* panel_oe = dynamic_cast<LLPanelOutfitEdit*>(LLSideTray::getInstance()->getPanel("panel_outfit_edit")); +		LLPanelOutfitEdit* panel_oe = dynamic_cast<LLPanelOutfitEdit*>(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfit_edit"));  		registrar.add("BodyPart.Replace", boost::bind(&LLPanelOutfitEdit::onReplaceMenuItemClicked, panel_oe, selected_id));  		registrar.add("BodyPart.Edit", boost::bind(LLAgentWearables::editWearable, selected_id));  		registrar.add("BodyPart.Create", boost::bind(&CofBodyPartContextMenu::createNew, this, selected_id)); diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp index d77ebc5367..5b942f283a 100644 --- a/indra/newview/llcolorswatch.cpp +++ b/indra/newview/llcolorswatch.cpp @@ -57,7 +57,6 @@ LLColorSwatchCtrl::Params::Params()  	caption_text("caption_text"),  	border("border")  { -	name = "colorswatch";  }  LLColorSwatchCtrl::LLColorSwatchCtrl(const Params& p) diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp index 18ae6107e7..c7fc45f61e 100644 --- a/indra/newview/lldateutil.cpp +++ b/indra/newview/lldateutil.cpp @@ -27,10 +27,16 @@  #include "lldateutil.h" +#include <boost/date_time/gregorian/gregorian.hpp> +#include <boost/date_time/posix_time/ptime.hpp> +  // Linden libraries  #include "lltrans.h"  #include "llui.h" +using namespace boost::gregorian; +using namespace boost::posix_time; +  static S32 DAYS_PER_MONTH_NOLEAP[] =  	{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };  static S32 DAYS_PER_MONTH_LEAP[] = @@ -186,3 +192,24 @@ std::string LLDateUtil::ageFromDate(const std::string& date_string)  //{  //	return ageFromDateISO(date_string, LLDate::now());  //} + +S32 LLDateUtil::secondsSinceEpochFromString(const std::string& format, const std::string& str) +{ +	date_input_facet *facet = new date_input_facet(format); + +	std::stringstream ss; +	ss << str; +	ss.imbue(std::locale(ss.getloc(), facet)); + +	date d; +	ss >> d; + +	ptime time_t_date(d); +	ptime time_t_epoch(date(1970,1,1)); + +	// We assume that the date defined by str is in UTC, so the difference +	// is calculated with no time zone corrections. +	time_duration diff = time_t_date - time_t_epoch; + +	return diff.total_seconds(); +} diff --git a/indra/newview/lldateutil.h b/indra/newview/lldateutil.h index 2843a357c9..f027d360f7 100644 --- a/indra/newview/lldateutil.h +++ b/indra/newview/lldateutil.h @@ -69,6 +69,20 @@ namespace LLDateUtil  	//std::string ageFromDateISO(const std::string& date_string);  	//std::string ageFromDate(S32 born_year, S32 born_month, S32 born_day, const LLDate& now); + +	/** +	 * Convert a string of a specified date format into seconds since the Epoch. +	 * +	 * Many of the format flags are those used by strftime(...), but not all. +	 * For the full list of supported time format specifiers +	 * see http://www.boost.org/doc/libs/1_47_0/doc/html/date_time/date_time_io.html#date_time.format_flags +	 * +	 * @param format Format characters string. Example: "%A %b %d, %Y" +	 * @param str    Date string containing the time in specified format. +	 * +	 * @return Number of seconds since 01/01/1970 UTC. +	 */ +	S32 secondsSinceEpochFromString(const std::string& format, const std::string& str);  }  #endif diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp index 216cc66ef8..cc6ba05e7e 100644 --- a/indra/newview/lldebugview.cpp +++ b/indra/newview/lldebugview.cpp @@ -41,6 +41,7 @@  #include "llmemoryview.h"  #include "llsceneview.h"  #include "llviewertexture.h" +#include "llfloaterreg.h"  //  // Globals @@ -79,12 +80,7 @@ void LLDebugView::init()  	r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f),     									 (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f)); -	mFastTimerView = new LLFastTimerView(r); -	mFastTimerView->setFollowsTop(); -	mFastTimerView->setFollowsLeft(); -	mFastTimerView->setVisible(FALSE);			// start invisible -	addChild(mFastTimerView); -	mFastTimerView->setRect(rect); +	mFastTimerView = dynamic_cast<LLFastTimerView*>(LLFloaterReg::getInstance("fast_timers"));  	gSceneView = new LLSceneView(r);  	gSceneView->setFollowsTop(); diff --git a/indra/newview/lldebugview.h b/indra/newview/lldebugview.h index 5245f163c0..20262fc89e 100644 --- a/indra/newview/lldebugview.h +++ b/indra/newview/lldebugview.h @@ -48,7 +48,7 @@ public:  	{  		Params()  		{ -			mouse_opaque = false; +			changeDefault(mouse_opaque, false);  		}  	};  	LLDebugView(const Params&); diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp index dd243397a1..1e03582a29 100644 --- a/indra/newview/lldirpicker.cpp +++ b/indra/newview/lldirpicker.cpp @@ -217,12 +217,12 @@ OSStatus	LLDirPicker::doNavChooseDialog()  	error = NavCreateChooseFolderDialog(&mNavOptions, &doNavCallbackEvent, NULL, NULL, &navRef); -	gViewerWindow->mWindow->beforeDialog(); +	gViewerWindow->getWindow()->beforeDialog();  	if (error == noErr)  		error = NavDialogRun(navRef); -	gViewerWindow->mWindow->afterDialog(); +	gViewerWindow->getWindow()->afterDialog();  	if (error == noErr)  		error = NavDialogGetReply(navRef, &navReply); diff --git a/indra/newview/lldndbutton.cpp b/indra/newview/lldndbutton.cpp index 8a38c8a643..7c9dda6b1d 100644 --- a/indra/newview/lldndbutton.cpp +++ b/indra/newview/lldndbutton.cpp @@ -31,16 +31,9 @@  static LLDefaultChildRegistry::Register<LLDragAndDropButton> r("dnd_button"); -LLDragAndDropButton::Params::Params() -{ - -} -  LLDragAndDropButton::LLDragAndDropButton(const Params& params)  : LLButton(params) -{ - -} +{}  BOOL LLDragAndDropButton::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data, EAcceptance* accept, std::string& tooltip_msg)  { diff --git a/indra/newview/lldndbutton.h b/indra/newview/lldndbutton.h index 0642cbb7b9..53ea2f5ea7 100644 --- a/indra/newview/lldndbutton.h +++ b/indra/newview/lldndbutton.h @@ -43,10 +43,7 @@  class LLDragAndDropButton : public LLButton  {  public: -	struct Params : public LLInitParam::Block<Params, LLButton::Params> -	{ -		Params(); -	}; +	struct Params : public LLInitParam::Block<Params, LLButton::Params> {};  	LLDragAndDropButton(const Params& params); diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index fa7d6e2a40..286284f828 100644 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -190,15 +190,16 @@ void LLDrawPool::renderPostDeferred(S32 pass)  //virtual  void LLDrawPool::endRenderPass( S32 pass )  { -	for (U32 i = 0; i < gGLManager.mNumTextureImageUnits; i++) +	/*for (U32 i = 0; i < gGLManager.mNumTextureImageUnits; i++)  	{ //dummy cleanup of any currently bound textures  		if (gGL.getTexUnit(i)->getCurrType() != LLTexUnit::TT_NONE)  		{  			gGL.getTexUnit(i)->unbind(gGL.getTexUnit(i)->getCurrType());  			gGL.getTexUnit(i)->disable();  		} -	} +	}*/ +	//make sure channel 0 is active channel  	gGL.getTexUnit(0)->activate();  } diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index ad7e3ad593..9719140a37 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -88,16 +88,13 @@ void LLDrawPoolAlpha::endDeferredPass(S32 pass)  void LLDrawPoolAlpha::renderDeferred(S32 pass)  { -	gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f); -	{ -		LLFastTimer t(FTM_RENDER_GRASS); -		gDeferredTreeProgram.bind(); -		LLGLEnable test(GL_ALPHA_TEST); -		//render alpha masked objects -		LLRenderPass::renderTexture(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask()); -		gDeferredTreeProgram.unbind(); -	}			 -	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +	LLFastTimer t(FTM_RENDER_GRASS); +	gDeferredDiffuseAlphaMaskProgram.bind(); +	gDeferredDiffuseAlphaMaskProgram.setAlphaRange(0.33f, 1.f); + +	//render alpha masked objects +	LLRenderPass::pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); +	gDeferredDiffuseAlphaMaskProgram.unbind();			  } @@ -124,7 +121,7 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)  	if (pass == 0)  	{  		simple_shader = &gDeferredAlphaProgram; -		fullbright_shader = &gObjectFullbrightProgram; +		fullbright_shader = &gObjectFullbrightAlphaMaskProgram;  		//prime simple shader (loads shadow relevant uniforms)  		gPipeline.bindDeferredShader(*simple_shader); @@ -138,6 +135,8 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)  		gPipeline.mDeferredDepth.bindTarget();  		simple_shader = NULL;  		fullbright_shader = NULL; +		gObjectFullbrightAlphaMaskProgram.bind(); +		gObjectFullbrightAlphaMaskProgram.setAlphaRange(0.33f, 1.f);  	}  	deferred_render = TRUE; @@ -156,6 +155,7 @@ void LLDrawPoolAlpha::endPostDeferredPass(S32 pass)  	{  		gPipeline.mDeferredDepth.flush();  		gPipeline.mScreen.bindTarget(); +		gObjectFullbrightAlphaMaskProgram.unbind();  	}  	deferred_render = FALSE; @@ -173,13 +173,13 @@ void LLDrawPoolAlpha::beginRenderPass(S32 pass)  	if (LLPipeline::sUnderWaterRender)  	{ -		simple_shader = &gObjectSimpleWaterProgram; -		fullbright_shader = &gObjectFullbrightWaterProgram; +		simple_shader = &gObjectSimpleWaterAlphaMaskProgram; +		fullbright_shader = &gObjectFullbrightWaterAlphaMaskProgram;  	}  	else  	{ -		simple_shader = &gObjectSimpleProgram; -		fullbright_shader = &gObjectFullbrightProgram; +		simple_shader = &gObjectSimpleAlphaMaskProgram; +		fullbright_shader = &gObjectFullbrightAlphaMaskProgram;  	}  	if (mVertexShaderLevel > 0) @@ -225,29 +225,32 @@ void LLDrawPoolAlpha::render(S32 pass)  		mAlphaDFactor = LLRender::BF_ZERO; // block (zero-out) glow where the alpha test succeeds  		gGL.blendFunc(mColorSFactor, mColorDFactor, mAlphaSFactor, mAlphaDFactor); -		gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.33f);  		if (mVertexShaderLevel > 0)  		{ -			if (!LLPipeline::sRenderDeferred) +			if (!LLPipeline::sRenderDeferred || !deferred_render)  			{  				simple_shader->bind(); +				simple_shader->setAlphaRange(0.33f, 1.f); +  				pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);  			}  			if (fullbright_shader)  			{  				fullbright_shader->bind(); +				fullbright_shader->setAlphaRange(0.33f, 1.f);  			}  			pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); -			LLGLSLShader::bindNoShader(); +			//LLGLSLShader::bindNoShader();  		}  		else  		{ +			gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.33f); //OK  			gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));  			pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask());  			gPipeline.enableLightsDynamic();  			pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask()); +			gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); //OK  		} -		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  	}  	LLGLDepthTest depth(GL_TRUE, LLDrawPoolWater::sSkipScreenCopy ||  @@ -255,7 +258,6 @@ void LLDrawPoolAlpha::render(S32 pass)  	if (deferred_render && pass == 1)  	{ -		gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.33f);  		gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);  	}  	else @@ -266,13 +268,33 @@ void LLDrawPoolAlpha::render(S32 pass)  		mAlphaDFactor = LLRender::BF_ONE_MINUS_SOURCE_ALPHA;       // }  		gGL.blendFunc(mColorSFactor, mColorDFactor, mAlphaSFactor, mAlphaDFactor); -		if (LLPipeline::sImpostorRender) +		if (mVertexShaderLevel > 0)  		{ -			gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f); +			if (LLPipeline::sImpostorRender) +			{ +				fullbright_shader->bind(); +				fullbright_shader->setAlphaRange(0.5f, 1.f); +				simple_shader->bind(); +				simple_shader->setAlphaRange(0.5f, 1.f); +			}				 +			else +			{ +				fullbright_shader->bind(); +				fullbright_shader->setAlphaRange(0.f, 1.f); +				simple_shader->bind(); +				simple_shader->setAlphaRange(0.f, 1.f); +			}  		}  		else  		{ -			gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +			if (LLPipeline::sImpostorRender) +			{ +				gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f); //OK +			} +			else +			{ +				gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); //OK +			}  		}  	} @@ -289,7 +311,6 @@ void LLDrawPoolAlpha::render(S32 pass)  	if (deferred_render && pass == 1)  	{ -		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  		gGL.setSceneBlendType(LLRender::BT_ALPHA);  	} diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 9f790d03fe..37ee81aeb5 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -258,7 +258,6 @@ void LLDrawPoolAvatar::beginPostDeferredAlpha()  	sSkipOpaque = TRUE;  	sShaderLevel = mVertexShaderLevel;  	sVertexProgram = &gDeferredAvatarAlphaProgram; -  	sRenderingSkinned = TRUE;  	gPipeline.bindDeferredShader(*sVertexProgram); @@ -361,7 +360,7 @@ void LLDrawPoolAvatar::beginShadowPass(S32 pass)  		{  			gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];  		} -		gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.2f); +		//gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.2f);  		glColor4f(1,1,1,1); @@ -590,12 +589,22 @@ void LLDrawPoolAvatar::beginImpostor()  		LLVOAvatar::sNumVisibleAvatars = 0;  	} +	if (LLGLSLShader::sNoFixedFunction) +	{ +		gImpostorProgram.bind(); +		gImpostorProgram.setAlphaRange(0.01f, 1.f); +	} +  	gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));  	sDiffuseChannel = 0;  }  void LLDrawPoolAvatar::endImpostor()  { +	if (LLGLSLShader::sNoFixedFunction) +	{ +		gImpostorProgram.unbind(); +	}  	gPipeline.enableLightsDynamic();  } @@ -605,16 +614,17 @@ void LLDrawPoolAvatar::beginRigid()  	{  		if (LLPipeline::sUnderWaterRender)  		{ -			sVertexProgram = &gObjectSimpleNonIndexedWaterProgram; +			sVertexProgram = &gObjectAlphaMaskNonIndexedWaterProgram;  		}  		else  		{ -			sVertexProgram = &gObjectSimpleNonIndexedProgram; +			sVertexProgram = &gObjectAlphaMaskNonIndexedProgram;  		}  		if (sVertexProgram != NULL)  		{	//eyeballs render with the specular shader  			sVertexProgram->bind(); +			sVertexProgram->setAlphaRange(0.2f, 1.f);  		}  	}  	else @@ -647,6 +657,7 @@ void LLDrawPoolAvatar::beginDeferredImpostor()  	sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);  	sVertexProgram->bind(); +	sVertexProgram->setAlphaRange(0.01f, 1.f);  }  void LLDrawPoolAvatar::endDeferredImpostor() @@ -692,11 +703,11 @@ void LLDrawPoolAvatar::beginSkinned()  	{  		if (LLPipeline::sUnderWaterRender)  		{ -			sVertexProgram = &gObjectSimpleNonIndexedWaterProgram; +			sVertexProgram = &gObjectAlphaMaskNonIndexedWaterProgram;  		}  		else  		{ -			sVertexProgram = &gObjectSimpleNonIndexedProgram; +			sVertexProgram = &gObjectAlphaMaskNonIndexedProgram;  		}  	} @@ -728,6 +739,11 @@ void LLDrawPoolAvatar::beginSkinned()  			sVertexProgram->bind();  		}  	} + +	if (LLGLSLShader::sNoFixedFunction) +	{ +		sVertexProgram->setAlphaRange(0.2f, 1.f); +	}  }  void LLDrawPoolAvatar::endSkinned() @@ -1283,30 +1299,38 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*  		return;  	} -	LLVertexBuffer* buffer = face->getVertexBuffer(); +	LLPointer<LLVertexBuffer> buffer = face->getVertexBuffer(); +	LLDrawable* drawable = face->getDrawable();  	U32 data_mask = face->getRiggedVertexBufferDataMask(); -	if (!buffer ||  +	if (buffer.isNull() ||   		buffer->getTypeMask() != data_mask || -		buffer->getRequestedVerts() != vol_face.mNumVertices) +		buffer->getRequestedVerts() != vol_face.mNumVertices || +		buffer->getRequestedIndices() != vol_face.mNumIndices || +		(drawable && drawable->isState(LLDrawable::REBUILD_ALL)))  	{  		face->setGeomIndex(0);  		face->setIndicesIndex(0); -		face->setSize(vol_face.mNumVertices, vol_face.mNumIndices, true); - - -		if (sShaderLevel > 0) -		{ -			buffer = new LLVertexBuffer(data_mask, GL_DYNAMIC_DRAW_ARB); +		 +		if (buffer.isNull() || buffer->getTypeMask() != data_mask) +		{ //make a new buffer +			if (sShaderLevel > 0) +			{ +				buffer = new LLVertexBuffer(data_mask, GL_DYNAMIC_DRAW_ARB); +			} +			else +			{ +				buffer = new LLVertexBuffer(data_mask, GL_STREAM_DRAW_ARB); +			} +			buffer->allocateBuffer(vol_face.mNumVertices, vol_face.mNumIndices, true);  		}  		else -		{ -			buffer = new LLVertexBuffer(data_mask, GL_STREAM_DRAW_ARB); +		{ //resize existing buffer +			buffer->resizeBuffer(vol_face.mNumVertices, vol_face.mNumIndices);  		} -		buffer->allocateBuffer(face->getGeomCount(), face->getIndicesCount(), true); - +		face->setSize(vol_face.mNumVertices, vol_face.mNumIndices);  		face->setVertexBuffer(buffer);  		U16 offset = 0; @@ -1407,6 +1431,11 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*  			}  		}  	} + +	if (drawable && (face->getTEOffset() == drawable->getNumFaces()-1)) +	{ +		drawable->clearState(LLDrawable::REBUILD_ALL); +	}  }  void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow) @@ -1437,7 +1466,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)  		LLVolume* volume = vobj->getVolume();  		S32 te = face->getTEOffset(); -		if (!volume || volume->getNumVolumeFaces() <= te) +		if (!volume || volume->getNumVolumeFaces() <= te || !volume->isMeshAssetLoaded())  		{  			continue;  		} diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 813b3820ee..0742250b0b 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -155,6 +155,7 @@ void LLStandardBumpmap::addstandard()  			LLViewerTextureManager::getFetchedTexture(LLUUID(bump_image_id));	  		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setBoostLevel(LLViewerTexture::BOOST_BUMP) ;  		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setLoadedCallback(LLBumpImageList::onSourceStandardLoaded, 0, TRUE, FALSE, NULL, NULL ); +		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->forceToSaveRawImage(0) ;  		LLStandardBumpmap::sStandardBumpmapCount++;  	} @@ -464,11 +465,15 @@ void LLDrawPoolBump::unbindCubeMap(LLGLSLShader* shader, S32 shader_level, S32&  			}  		}  	} -	gGL.getTexUnit(diffuse_channel)->disable(); -	gGL.getTexUnit(cube_channel)->disable(); -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +	if (!LLGLSLShader::sNoFixedFunction) +	{ +		gGL.getTexUnit(diffuse_channel)->disable(); +		gGL.getTexUnit(cube_channel)->disable(); + +		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +	}  }  void LLDrawPoolBump::endShiny(bool invisible) @@ -583,19 +588,19 @@ void LLDrawPoolBump::endFullbrightShiny()  		cube_map->disable();  		cube_map->restoreMatrix(); -		if (diffuse_channel != 0) +		/*if (diffuse_channel != 0)  		{  			shader->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);  		}  		gGL.getTexUnit(0)->activate(); -		gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); +		gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);*/  		shader->unbind(); -		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +		//gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  	} -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +	//gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +	//gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  	diffuse_channel = -1;  	cube_channel = 0; @@ -706,36 +711,44 @@ void LLDrawPoolBump::beginBump(U32 pass)  	// Optional second pass: emboss bump map  	stop_glerror(); -	// TEXTURE UNIT 0 -	// Output.rgb = texture at texture coord 0 -	gGL.getTexUnit(0)->activate(); +	if (LLGLSLShader::sNoFixedFunction) +	{ +		gObjectBumpProgram.bind(); +	} +	else +	{ +		// TEXTURE UNIT 0 +		// Output.rgb = texture at texture coord 0 +		gGL.getTexUnit(0)->activate(); -	gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA); -	gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA); +		gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA); +		gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA); -	// TEXTURE UNIT 1 -	gGL.getTexUnit(1)->activate(); +		// TEXTURE UNIT 1 +		gGL.getTexUnit(1)->activate(); -	gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE); +		gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE); + +		gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD_SIGNED, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_ONE_MINUS_TEX_ALPHA); +		gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA); -	gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD_SIGNED, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_ONE_MINUS_TEX_ALPHA); -	gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA); +		// src	= tex0 + (1 - tex1) - 0.5 +		//		= (bump0/2 + 0.5) + (1 - (bump1/2 + 0.5)) - 0.5 +		//		= (1 + bump0 - bump1) / 2 -	// src	= tex0 + (1 - tex1) - 0.5 -	//		= (bump0/2 + 0.5) + (1 - (bump1/2 + 0.5)) - 0.5 -	//		= (1 + bump0 - bump1) / 2 +		// Blend: src * dst + dst * src +		//		= 2 * src * dst +		//		= 2 * ((1 + bump0 - bump1) / 2) * dst   [0 - 2 * dst] +		//		= (1 + bump0 - bump1) * dst.rgb +		//		= dst.rgb + dst.rgb * (bump0 - bump1) + +		gGL.getTexUnit(0)->activate(); +		gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE); +	} -	// Blend: src * dst + dst * src -	//		= 2 * src * dst -	//		= 2 * ((1 + bump0 - bump1) / 2) * dst   [0 - 2 * dst] -	//		= (1 + bump0 - bump1) * dst.rgb -	//		= dst.rgb + dst.rgb * (bump0 - bump1)  	gGL.setSceneBlendType(LLRender::BT_MULT_X2); -	gGL.getTexUnit(0)->activate();  	stop_glerror(); - -	gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);  }  //static @@ -765,14 +778,21 @@ void LLDrawPoolBump::endBump(U32 pass)  		return;  	} -	// Disable texture unit 1 -	gGL.getTexUnit(1)->activate(); -	gGL.getTexUnit(1)->disable(); -	gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT); +	if (LLGLSLShader::sNoFixedFunction) +	{ +		gObjectBumpProgram.unbind(); +	} +	else +	{ +		// Disable texture blending on unit 1 +		gGL.getTexUnit(1)->activate(); +		//gGL.getTexUnit(1)->disable(); +		gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT); -	// Disable texture unit 0 -	gGL.getTexUnit(0)->activate(); -	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +		// Disable texture blending on unit 0 +		gGL.getTexUnit(0)->activate(); +		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +	}  	gGL.setSceneBlendType(LLRender::BT_ALPHA);  } @@ -1054,11 +1074,12 @@ LLViewerTexture* LLBumpImageList::getBrightnessDarknessImage(LLViewerFetchedText  		if (!src_image->hasCallbacks())  		{ //if image has no callbacks but resolutions don't match, trigger raw image loaded callback again  			if (src_image->getWidth() != bump->getWidth() || -				src_image->getHeight() != bump->getHeight() || -				(LLPipeline::sRenderDeferred && bump->getComponents() != 4)) +				src_image->getHeight() != bump->getHeight())// || +				//(LLPipeline::sRenderDeferred && bump->getComponents() != 4))  			{  				src_image->setBoostLevel(LLViewerTexture::BOOST_BUMP) ;  				src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()), NULL ); +				src_image->forceToSaveRawImage(0) ;  			}  		}  	} @@ -1407,6 +1428,11 @@ void LLDrawPoolInvisible::render(S32 pass)  { //render invisiprims  	LLFastTimer t(FTM_RENDER_INVISIBLE); +	if (gPipeline.canUseVertexShaders()) +	{ +		gOcclusionProgram.bind(); +	} +  	U32 invisi_mask = LLVertexBuffer::MAP_VERTEX;  	glStencilMask(0);  	gGL.setColorMask(false, false); @@ -1414,6 +1440,11 @@ void LLDrawPoolInvisible::render(S32 pass)  	gGL.setColorMask(true, false);  	glStencilMask(0xFFFFFFFF); +	if (gPipeline.canUseVertexShaders()) +	{ +		gOcclusionProgram.unbind(); +	} +  	if (gPipeline.hasRenderBatches(LLRenderPass::PASS_INVISI_SHINY))  	{  		beginShiny(true); diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp index 5dbb27cabb..eec4ee6bac 100644 --- a/indra/newview/lldrawpoolsimple.cpp +++ b/indra/newview/lldrawpoolsimple.cpp @@ -49,6 +49,8 @@ void LLDrawPoolGlow::beginPostDeferredPass(S32 pass)  	gDeferredFullbrightProgram.bind();  } +static LLFastTimer::DeclareTimer FTM_RENDER_GLOW_PUSH("Glow Push"); +  void LLDrawPoolGlow::renderPostDeferred(S32 pass)  {  	LLFastTimer t(FTM_RENDER_GLOW); @@ -62,7 +64,11 @@ void LLDrawPoolGlow::renderPostDeferred(S32 pass)  	LLGLDepthTest depth(GL_TRUE, GL_FALSE);  	gGL.setColorMask(false, true); -	pushBatches(LLRenderPass::PASS_GLOW, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); + +	{ +		LLFastTimer t(FTM_RENDER_GLOW_PUSH); +		pushBatches(LLRenderPass::PASS_GLOW, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); +	}  	gGL.setColorMask(true, false);  	gGL.setSceneBlendType(LLRender::BT_ALPHA);	 @@ -176,7 +182,6 @@ void LLDrawPoolSimple::endRenderPass(S32 pass)  void LLDrawPoolSimple::render(S32 pass)  {  	LLGLDisable blend(GL_BLEND); -	LLGLDisable alpha_test(GL_ALPHA_TEST);  	{ //render simple  		LLFastTimer t(FTM_RENDER_SIMPLE); @@ -196,6 +201,7 @@ void LLDrawPoolSimple::render(S32 pass)  		}  		else  		{ +			LLGLDisable alpha_test(GL_ALPHA_TEST);  			renderTexture(LLRenderPass::PASS_SIMPLE, getVertexDataMask());  		} @@ -250,19 +256,21 @@ void LLDrawPoolGrass::beginRenderPass(S32 pass)  	if (LLPipeline::sUnderWaterRender)  	{ -		simple_shader = &gObjectSimpleNonIndexedWaterProgram; +		simple_shader = &gObjectAlphaMaskNonIndexedWaterProgram;  	}  	else  	{ -		simple_shader = &gObjectSimpleNonIndexedProgram; +		simple_shader = &gObjectAlphaMaskNonIndexedProgram;  	}  	if (mVertexShaderLevel > 0)  	{  		simple_shader->bind(); +		simple_shader->setAlphaRange(0.5f, 1.f);  	}  	else   	{ +		gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);  		// don't use shaders!  		if (gGLManager.mHasShaderObjects)  		{ @@ -280,22 +288,23 @@ void LLDrawPoolGrass::endRenderPass(S32 pass)  	{  		simple_shader->unbind();  	} +	else +	{ +		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +	}  }  void LLDrawPoolGrass::render(S32 pass)  {  	LLGLDisable blend(GL_BLEND); -	gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f); - +	  	{  		LLFastTimer t(FTM_RENDER_GRASS);  		LLGLEnable test(GL_ALPHA_TEST);  		gGL.setSceneBlendType(LLRender::BT_ALPHA);  		//render grass  		LLRenderPass::renderTexture(LLRenderPass::PASS_GRASS, getVertexDataMask()); -	}			 - -	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +	}  }  void LLDrawPoolGrass::beginDeferredPass(S32 pass) @@ -310,17 +319,13 @@ void LLDrawPoolGrass::endDeferredPass(S32 pass)  void LLDrawPoolGrass::renderDeferred(S32 pass)  { -	gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f); -  	{  		LLFastTimer t(FTM_RENDER_GRASS_DEFERRED); -		gDeferredTreeProgram.bind(); -		LLGLEnable test(GL_ALPHA_TEST); +		gDeferredNonIndexedDiffuseAlphaMaskProgram.bind(); +		gDeferredNonIndexedDiffuseAlphaMaskProgram.setAlphaRange(0.5f, 1.f);  		//render grass  		LLRenderPass::renderTexture(LLRenderPass::PASS_GRASS, getVertexDataMask());  	}			 - -	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  } @@ -374,10 +379,14 @@ void LLDrawPoolFullbright::endRenderPass(S32 pass)  	LLFastTimer t(FTM_RENDER_FULLBRIGHT);  	LLRenderPass::endRenderPass(pass); +	stop_glerror(); +  	if (mVertexShaderLevel > 0)  	{  		fullbright_shader->unbind();  	} + +	stop_glerror();  }  void LLDrawPoolFullbright::render(S32 pass) @@ -385,6 +394,8 @@ void LLDrawPoolFullbright::render(S32 pass)  	LLFastTimer t(FTM_RENDER_FULLBRIGHT);  	gGL.setSceneBlendType(LLRender::BT_ALPHA); +	stop_glerror(); +  	if (mVertexShaderLevel > 0)  	{  		fullbright_shader->bind(); @@ -398,6 +409,8 @@ void LLDrawPoolFullbright::render(S32 pass)  		U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR;  		renderTexture(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask);  	} + +	stop_glerror();  }  S32 LLDrawPoolFullbright::getNumPasses() diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp index 030d6e1110..efffb2df9e 100644 --- a/indra/newview/lldrawpoolsky.cpp +++ b/indra/newview/lldrawpoolsky.cpp @@ -82,6 +82,10 @@ void LLDrawPoolSky::render(S32 pass)  		mShader = &gObjectFullbrightWaterProgram;  		mShader->bind();  	} +	else if (LLGLSLShader::sNoFixedFunction) +	{ //just use the UI shader (generic single texture no lighting) +		gUIProgram.bind(); +	}  	else  	{  		// don't use shaders! @@ -139,6 +143,7 @@ void LLDrawPoolSky::renderSkyCubeFace(U8 side)  	if (LLSkyTex::doInterpolate())  	{ +		  		LLGLEnable blend(GL_BLEND);  		mSkyTex[side].bindTexture(FALSE);  		glColor4f(1, 1, 1, LLSkyTex::getInterpVal()); // lighting is disabled diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp index 81c796b146..a6e0151114 100644 --- a/indra/newview/lldrawpooltree.cpp +++ b/indra/newview/lldrawpooltree.cpp @@ -62,24 +62,25 @@ void LLDrawPoolTree::prerender()  void LLDrawPoolTree::beginRenderPass(S32 pass)  {  	LLFastTimer t(FTM_RENDER_TREES); -	gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f); -	 +		  	if (LLPipeline::sUnderWaterRender)  	{ -		shader = &gObjectSimpleNonIndexedWaterProgram; +		shader = &gObjectAlphaMaskNonIndexedWaterProgram;  	}  	else  	{ -		shader = &gObjectSimpleNonIndexedProgram; +		shader = &gObjectAlphaMaskNonIndexedProgram;  	} -	if (gPipeline.canUseWindLightShadersOnObjects()) +	if (gPipeline.canUseVertexShaders())  	{  		shader->bind(); +		shader->setAlphaRange(0.5f, 1.f);  	}  	else  	{  		gPipeline.enableLightsDynamic(); +		gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);  	}  } @@ -92,7 +93,7 @@ void LLDrawPoolTree::render(S32 pass)  		return;  	} -	LLGLEnable test(GL_ALPHA_TEST); +	LLGLState test(GL_ALPHA_TEST, LLGLSLShader::sNoFixedFunction ? 0 : 1);  	LLOverrideFaceColor color(this, 1.f, 1.f, 1.f, 1.f);  	if (gSavedSettings.getBOOL("RenderAnimateTrees")) @@ -121,12 +122,16 @@ void LLDrawPoolTree::render(S32 pass)  void LLDrawPoolTree::endRenderPass(S32 pass)  {  	LLFastTimer t(FTM_RENDER_TREES); -	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); -	 +		  	if (gPipeline.canUseWindLightShadersOnObjects())  	{  		shader->unbind();  	} +	 +	if (mVertexShaderLevel <= 0) +	{ +		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +	}  }  //============================================ @@ -135,10 +140,10 @@ void LLDrawPoolTree::endRenderPass(S32 pass)  void LLDrawPoolTree::beginDeferredPass(S32 pass)  {  	LLFastTimer t(FTM_RENDER_TREES); -	gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f); -	shader = &gDeferredTreeProgram; +	shader = &gDeferredNonIndexedDiffuseAlphaMaskProgram;  	shader->bind(); +	shader->setAlphaRange(0.5f, 1.f);  }  void LLDrawPoolTree::renderDeferred(S32 pass) @@ -149,8 +154,7 @@ void LLDrawPoolTree::renderDeferred(S32 pass)  void LLDrawPoolTree::endDeferredPass(S32 pass)  {  	LLFastTimer t(FTM_RENDER_TREES); -	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); -	 +		  	shader->unbind();  } @@ -160,11 +164,12 @@ void LLDrawPoolTree::endDeferredPass(S32 pass)  void LLDrawPoolTree::beginShadowPass(S32 pass)  {  	LLFastTimer t(FTM_SHADOW_TREE); -	gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f); +	  	glPolygonOffset(gSavedSettings.getF32("RenderDeferredTreeShadowOffset"),  					gSavedSettings.getF32("RenderDeferredTreeShadowBias")); -	gDeferredShadowProgram.bind(); +	gDeferredShadowAlphaMaskProgram.bind(); +	gDeferredShadowAlphaMaskProgram.setAlphaRange(0.5f, 1.f);  }  void LLDrawPoolTree::renderShadow(S32 pass) @@ -175,12 +180,9 @@ void LLDrawPoolTree::renderShadow(S32 pass)  void LLDrawPoolTree::endShadowPass(S32 pass)  {  	LLFastTimer t(FTM_SHADOW_TREE); -	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); - +	  	glPolygonOffset(gSavedSettings.getF32("RenderDeferredSpotShadowOffset"),  						gSavedSettings.getF32("RenderDeferredSpotShadowBias")); - -	//gDeferredShadowProgram.unbind();  } diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index bf79c2100c..79a835fd14 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -62,13 +62,24 @@ LLDrawPoolWLSky::LLDrawPoolWLSky(void) :  		llerrs << "Error: Failed to load cloud noise image " << cloudNoiseFilename << llendl;  	} -	cloudNoiseFile->load(cloudNoiseFilename); - -	sCloudNoiseRawImage = new LLImageRaw(); +	if(cloudNoiseFile->load(cloudNoiseFilename)) +	{ +		sCloudNoiseRawImage = new LLImageRaw(); -	cloudNoiseFile->decode(sCloudNoiseRawImage, 0.0f); +		if(cloudNoiseFile->decode(sCloudNoiseRawImage, 0.0f)) +		{ +			//debug use			 +			lldebugs << "cloud noise raw image width: " << sCloudNoiseRawImage->getWidth() << " : height: " << sCloudNoiseRawImage->getHeight() << " : components: " <<  +				(S32)sCloudNoiseRawImage->getComponents() << " : data size: " << sCloudNoiseRawImage->getDataSize() << llendl ; +			llassert_always(sCloudNoiseRawImage->getData()) ; -	sCloudNoiseTexture = LLViewerTextureManager::getLocalTexture(sCloudNoiseRawImage.get(), TRUE); +			sCloudNoiseTexture = LLViewerTextureManager::getLocalTexture(sCloudNoiseRawImage.get(), TRUE); +		} +		else +		{ +			sCloudNoiseRawImage = NULL ; +		} +	}  	LLWLParamManager::getInstance()->propagateParameters();  } @@ -189,26 +200,40 @@ void LLDrawPoolWLSky::renderStars(void) const  	glRotatef(gFrameTimeSeconds*0.01f, 0.f, 0.f, 1.f);  	// gl_FragColor.rgb = gl_Color.rgb;  	// gl_FragColor.a = gl_Color.a * star_alpha.a; -	gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR); -	gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT_X2, LLTexUnit::TBS_CONST_ALPHA, LLTexUnit::TBS_TEX_ALPHA); -	glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, star_alpha.mV); +	if (LLGLSLShader::sNoFixedFunction) +	{ +		gCustomAlphaProgram.bind(); +		gCustomAlphaProgram.uniform1f("custom_alpha", star_alpha.mV[3]); +	} +	else +	{ +		gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR); +		gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT_X2, LLTexUnit::TBS_CONST_ALPHA, LLTexUnit::TBS_TEX_ALPHA); +		glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, star_alpha.mV); +	}  	gSky.mVOWLSkyp->drawStars();  	gGL.popMatrix(); -	 -	// and disable the combiner states -	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); + +	if (LLGLSLShader::sNoFixedFunction) +	{ +		gCustomAlphaProgram.unbind(); +	} +	else +	{ +		// and disable the combiner states +		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +	}  }  void LLDrawPoolWLSky::renderSkyClouds(F32 camHeightLocal) const  { -	if (gPipeline.canUseWindLightShaders() && gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS)) +	if (gPipeline.canUseWindLightShaders() && gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS) && sCloudNoiseTexture.notNull())  	{  		LLGLEnable blend(GL_BLEND);  		gGL.setSceneBlendType(LLRender::BT_ALPHA); -		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); - +		  		gGL.getTexUnit(0)->bind(sCloudNoiseTexture);  		cloud_shader->bind(); @@ -242,6 +267,10 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()  	if (gSky.mVOSkyp->getMoon().getDraw() && face->getGeomCount())  	{ +		if (gPipeline.canUseVertexShaders()) +		{ +			gUIProgram.bind(); +		}  		// *NOTE: even though we already bound this texture above for the  		// stars register combiners, we bind again here for defensive reasons,  		// since LLImageGL::bind detects that it's a noop, and optimizes it out. @@ -257,6 +286,11 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()  		LLFacePool::LLOverrideFaceColor color_override(this, color);  		face->renderIndexed(); + +		if (gPipeline.canUseVertexShaders()) +		{ +			gUIProgram.unbind(); +		}  	}  } @@ -375,5 +409,8 @@ void LLDrawPoolWLSky::cleanupGL()  //static  void LLDrawPoolWLSky::restoreGL()  { -	sCloudNoiseTexture = LLViewerTextureManager::getLocalTexture(sCloudNoiseRawImage.get(), TRUE); +	if(sCloudNoiseRawImage.notNull()) +	{ +		sCloudNoiseTexture = LLViewerTextureManager::getLocalTexture(sCloudNoiseRawImage.get(), TRUE); +	}  } diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index f781d5f3ff..fb9958ee9d 100644 --- a/indra/newview/lldynamictexture.cpp +++ b/indra/newview/lldynamictexture.cpp @@ -40,6 +40,7 @@  #include "llvertexbuffer.h"  #include "llviewerdisplay.h"  #include "llrender.h" +#include "pipeline.h"  // static  LLViewerDynamicTexture::instance_list_t LLViewerDynamicTexture::sInstances[ LLViewerDynamicTexture::ORDER_COUNT ]; @@ -201,7 +202,7 @@ void LLViewerDynamicTexture::postRender(BOOL success)  BOOL LLViewerDynamicTexture::updateAllInstances()  {  	sNumRenders = 0; -	if (gGLManager.mIsDisabled) +	if (gGLManager.mIsDisabled || LLPipeline::sMemAllocationThrottled)  	{  		return TRUE;  	} diff --git a/indra/newview/llenvmanager.cpp b/indra/newview/llenvmanager.cpp index c2720eaf28..86fe6754dc 100644 --- a/indra/newview/llenvmanager.cpp +++ b/indra/newview/llenvmanager.cpp @@ -2,31 +2,25 @@   * @file llenvmanager.cpp   * @brief Implementation of classes managing WindLight and water settings.   * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - *  - * Copyright (c) 2009, Linden Research, Inc. - *  + * $LicenseInfo:firstyear=2009&license=viewerlgpl$   * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab.  Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * Copyright (C) 2011, 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.   *  - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * 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.   *  - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * 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   *  - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ diff --git a/indra/newview/llenvmanager.h b/indra/newview/llenvmanager.h index 96af102c1a..ad56761bc7 100644 --- a/indra/newview/llenvmanager.h +++ b/indra/newview/llenvmanager.h @@ -2,31 +2,25 @@   * @file llenvmanager.h   * @brief Declaration of classes managing WindLight and water settings.   * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - *  - * Copyright (c) 2009, Linden Research, Inc. - *  + * $LicenseInfo:firstyear=2009&license=viewerlgpl$   * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab.  Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * Copyright (C) 2011, 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.   *  - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * 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.   *  - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * 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   *  - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ diff --git a/indra/newview/llestateinfomodel.cpp b/indra/newview/llestateinfomodel.cpp new file mode 100644 index 0000000000..7ed22d68f6 --- /dev/null +++ b/indra/newview/llestateinfomodel.cpp @@ -0,0 +1,230 @@ +/**  + * @file llestateinfomodel.cpp + * @brief Estate info model + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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 "llestateinfomodel.h" + +// libs +#include "llhttpclient.h" +#include "llregionflags.h" +#include "message.h" + +// viewer +#include "llagent.h" +#include "llfloaterregioninfo.h" // for invoice id +#include "llviewerregion.h" + +LLEstateInfoModel::LLEstateInfoModel() +:	mID(0) +,	mFlags(0) +,	mSunHour(0) +{ +} + +boost::signals2::connection LLEstateInfoModel::setUpdateCallback(const update_signal_t::slot_type& cb) +{ +	return mUpdateSignal.connect(cb); +} + +boost::signals2::connection LLEstateInfoModel::setCommitCallback(const update_signal_t::slot_type& cb) +{ +	return mCommitSignal.connect(cb); +} + +void LLEstateInfoModel::sendEstateInfo() +{ +	if (!commitEstateInfoCaps()) +	{ +		// the caps method failed, try the old way +		LLFloaterRegionInfo::nextInvoice(); +		commitEstateInfoDataserver(); +	} +} + +bool LLEstateInfoModel::getUseFixedSun()			const {	return mFlags & REGION_FLAGS_SUN_FIXED;				} +bool LLEstateInfoModel::getIsExternallyVisible()	const {	return mFlags & REGION_FLAGS_EXTERNALLY_VISIBLE;	} +bool LLEstateInfoModel::getAllowDirectTeleport()	const {	return mFlags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT;	} +bool LLEstateInfoModel::getDenyAnonymous()			const {	return mFlags & REGION_FLAGS_DENY_ANONYMOUS; 		} +bool LLEstateInfoModel::getDenyAgeUnverified()		const {	return mFlags & REGION_FLAGS_DENY_AGEUNVERIFIED;	} +bool LLEstateInfoModel::getAllowVoiceChat()			const {	return mFlags & REGION_FLAGS_ALLOW_VOICE;			} + +void LLEstateInfoModel::setUseFixedSun(bool val)			{ setFlag(REGION_FLAGS_SUN_FIXED, 				val);	} +void LLEstateInfoModel::setIsExternallyVisible(bool val)	{ setFlag(REGION_FLAGS_EXTERNALLY_VISIBLE,		val);	} +void LLEstateInfoModel::setAllowDirectTeleport(bool val)	{ setFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT,	val);	} +void LLEstateInfoModel::setDenyAnonymous(bool val)			{ setFlag(REGION_FLAGS_DENY_ANONYMOUS,			val);	} +void LLEstateInfoModel::setDenyAgeUnverified(bool val)		{ setFlag(REGION_FLAGS_DENY_AGEUNVERIFIED,		val);	} +void LLEstateInfoModel::setAllowVoiceChat(bool val)			{ setFlag(REGION_FLAGS_ALLOW_VOICE,				val);	} + +void LLEstateInfoModel::update(const strings_t& strings) +{ +	// NOTE: LLDispatcher extracts strings with an extra \0 at the +	// end.  If we pass the std::string direct to the UI/renderer +	// it draws with a weird character at the end of the string. +	mName		= strings[0].c_str(); +	mOwnerID	= LLUUID(strings[1].c_str()); +	mID			= strtoul(strings[2].c_str(), NULL, 10); +	mFlags		= strtoul(strings[3].c_str(), NULL, 10); +	mSunHour	= ((F32)(strtod(strings[4].c_str(), NULL)))/1024.0f; + +	LL_DEBUGS("Windlight Sync") << "Received estate info: " +		<< "is_sun_fixed = " << getUseFixedSun() +		<< ", sun_hour = " << getSunHour() << LL_ENDL; +	lldebugs << getInfoDump() << llendl; + +	// Update region owner. +	LLViewerRegion* regionp = gAgent.getRegion(); +	regionp->setOwner(mOwnerID); + +	// Let interested parties know that estate info has been updated. +	mUpdateSignal(); +} + +void LLEstateInfoModel::notifyCommit() +{ +	mCommitSignal(); +} + +//== PRIVATE STUFF ============================================================ + +class LLEstateChangeInfoResponder : public LLHTTPClient::Responder +{ +public: + +	// if we get a normal response, handle it here +	virtual void result(const LLSD& content) +	{ +		llinfos << "Committed estate info" << llendl; +		LLEstateInfoModel::instance().notifyCommit(); +	} + +	// if we get an error response +	virtual void error(U32 status, const std::string& reason) +	{ +		llwarns << "Failed to commit estate info (" << status << "): " << reason << llendl; +	} +}; + +// tries to send estate info using a cap; returns true if it succeeded +bool LLEstateInfoModel::commitEstateInfoCaps() +{ +	std::string url = gAgent.getRegion()->getCapability("EstateChangeInfo"); + +	if (url.empty()) +	{ +		// whoops, couldn't find the cap, so bail out +		return false; +	} + +	LLSD body; +	body["estate_name"          ] = getName(); +	body["sun_hour"             ] = getSunHour(); + +	body["is_sun_fixed"         ] = getUseFixedSun(); +	body["is_externally_visible"] = getIsExternallyVisible(); +	body["allow_direct_teleport"] = getAllowDirectTeleport(); +	body["deny_anonymous"       ] = getDenyAnonymous(); +	body["deny_age_unverified"  ] = getDenyAgeUnverified(); +	body["allow_voice_chat"     ] = getAllowVoiceChat(); + +	body["invoice"              ] = LLFloaterRegionInfo::getLastInvoice(); + +	LL_DEBUGS("Windlight Sync") << "Sending estate caps: " +		<< "is_sun_fixed = " << getUseFixedSun() +		<< ", sun_hour = " << getSunHour() << LL_ENDL; +	lldebugs << body << LL_ENDL; + +	// we use a responder so that we can re-get the data after committing to the database +	LLHTTPClient::post(url, body, new LLEstateChangeInfoResponder); +    return true; +} + +/* This is the old way of doing things, is deprecated, and should be +   deleted when the dataserver model can be removed */ +// key = "estatechangeinfo" +// strings[0] = str(estate_id) (added by simulator before relay - not here) +// strings[1] = estate_name +// strings[2] = str(estate_flags) +// strings[3] = str((S32)(sun_hour * 1024.f)) +void LLEstateInfoModel::commitEstateInfoDataserver() +{ +	LL_DEBUGS("Windlight Sync") << "Sending estate info: " +		<< "is_sun_fixed = " << getUseFixedSun() +		<< ", sun_hour = " << getSunHour() << LL_ENDL; +	lldebugs << getInfoDump() << LL_ENDL; + +	LLMessageSystem* msg = gMessageSystem; +	msg->newMessage("EstateOwnerMessage"); +	msg->nextBlockFast(_PREHASH_AgentData); +	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); +	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); +	msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used + +	msg->nextBlock("MethodData"); +	msg->addString("Method", "estatechangeinfo"); +	msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice()); + +	msg->nextBlock("ParamList"); +	msg->addString("Parameter", getName()); + +	msg->nextBlock("ParamList"); +	msg->addString("Parameter", llformat("%u", getFlags())); + +	msg->nextBlock("ParamList"); +	msg->addString("Parameter", llformat("%d", (S32) (getSunHour() * 1024.0f))); + +	gAgent.sendMessage(); +} + +void LLEstateInfoModel::setFlag(U32 flag, bool val) +{ +	if (val) +	{ +		mFlags |= flag; +	} +	else +	{ +		mFlags &= ~flag; +	} +} + +std::string LLEstateInfoModel::getInfoDump() +{ +	LLSD dump; +	dump["estate_name"          ] = getName(); +	dump["sun_hour"             ] = getSunHour(); + +	dump["is_sun_fixed"         ] = getUseFixedSun(); +	dump["is_externally_visible"] = getIsExternallyVisible(); +	dump["allow_direct_teleport"] = getAllowDirectTeleport(); +	dump["deny_anonymous"       ] = getDenyAnonymous(); +	dump["deny_age_unverified"  ] = getDenyAgeUnverified(); +	dump["allow_voice_chat"     ] = getAllowVoiceChat(); + +	std::stringstream dump_str; +	dump_str << dump; +	return dump_str.str(); +} diff --git a/indra/newview/llestateinfomodel.h b/indra/newview/llestateinfomodel.h new file mode 100644 index 0000000000..56391eda91 --- /dev/null +++ b/indra/newview/llestateinfomodel.h @@ -0,0 +1,103 @@ +/**  + * @file llestateinfomodel.h + * @brief Estate info model + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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_LLESTATEINFOMODEL_H +#define LL_LLESTATEINFOMODEL_H + +class LLMessageSystem; + +#include "llsingleton.h" + +/** + * Contains estate info, notifies interested parties of its changes. + */ +class LLEstateInfoModel : public LLSingleton<LLEstateInfoModel> +{ +	LOG_CLASS(LLEstateInfoModel); + +public: +	typedef boost::signals2::signal<void()> update_signal_t; +	boost::signals2::connection setUpdateCallback(const update_signal_t::slot_type& cb); /// the model has been externally updated +	boost::signals2::connection setCommitCallback(const update_signal_t::slot_type& cb); /// our changes have been applied + +	void sendEstateInfo(); /// send estate info to the simulator + +	// getters +	bool				getUseFixedSun()			const; +	bool				getIsExternallyVisible()	const; +	bool				getAllowDirectTeleport()	const; +	bool				getDenyAnonymous()			const; +	bool				getDenyAgeUnverified()		const; +	bool				getAllowVoiceChat()			const; + +	const std::string&	getName()					const { return mName; } +	const LLUUID&		getOwnerID()				const { return mOwnerID; } +	U32					getID()						const { return mID; } +	F32					getSunHour()				const { return getUseFixedSun() ? mSunHour : 0.f; } + +	// setters +	void setUseFixedSun(bool val); +	void setIsExternallyVisible(bool val); +	void setAllowDirectTeleport(bool val); +	void setDenyAnonymous(bool val); +	void setDenyAgeUnverified(bool val); +	void setAllowVoiceChat(bool val); + +	void setSunHour(F32 sun_hour) { mSunHour = sun_hour; } + +protected: +	typedef std::vector<std::string> strings_t; + +	friend class LLSingleton<LLEstateInfoModel>; +	friend class LLDispatchEstateUpdateInfo; +	friend class LLEstateChangeInfoResponder; + +	LLEstateInfoModel(); + +	/// refresh model with data from the incoming server message +	void update(const strings_t& strings); + +	void notifyCommit(); + +private: +	bool commitEstateInfoCaps(); +	void commitEstateInfoDataserver(); +	U32  getFlags() const { return mFlags; } +	void setFlag(U32 flag, bool val); +	std::string getInfoDump(); + +	// estate info +	std::string	mName;			/// estate name +	LLUUID		mOwnerID;		/// estate owner id +	U32			mID;			/// estate id +	U32			mFlags;			/// estate flags +	F32			mSunHour;		/// estate sun hour + +	update_signal_t mUpdateSignal; /// emitted when we receive update from sim +	update_signal_t mCommitSignal; /// emitted when our update gets applied to sim +}; + +#endif // LL_LLESTATEINFOMODEL_H diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index 5501b8c2ac..2abfbf37ca 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -415,6 +415,15 @@ void LLExpandableTextBox::onTopLost()  	LLUICtrl::onTopLost();  } +void LLExpandableTextBox::updateTextShape() +{ +	// I guess this should be done on every reshape(), +	// but adding this code to reshape() currently triggers bug VWR-26455, +	// which makes the text virtually unreadable. +	llassert(!mExpanded); +	updateTextBoxRect(); +} +  void LLExpandableTextBox::setValue(const LLSD& value)  {  	collapseTextBox(); diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h index f75ef954ff..399e48bea2 100644 --- a/indra/newview/llexpandabletextbox.h +++ b/indra/newview/llexpandabletextbox.h @@ -143,6 +143,10 @@ public:  	 */  	/*virtual*/ void onTopLost(); +	/** +	 * *HACK: Update the inner textbox shape. +	 */ +	void updateTextShape();  	/**  	 * Draws text box, collapses text box if its expanded and its parent's position changed diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index b6566fcbd0..432e61f6d8 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1051,6 +1051,13 @@ bool LLFace::canRenderAsMask()  static LLFastTimer::DeclareTimer FTM_FACE_GET_GEOM("Face Geom"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_POSITION("Position"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_NORMAL("Normal"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_TEXTURE("Texture"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_COLOR("Color"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_WEIGHTS("Weights"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_BINORMAL("Binormal"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_INDEX("Index");  BOOL LLFace::getGeometryVolume(const LLVolume& volume,  							   const S32 &f, @@ -1064,6 +1071,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  	S32 num_vertices = (S32)vf.mNumVertices;  	S32 num_indices = (S32) vf.mNumIndices; +	bool map_range = gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange; +  	if (mVertexBuffer.notNull())  	{  		if (num_indices + (S32) mIndicesIndex > mVertexBuffer->getNumIndices()) @@ -1182,7 +1191,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  	// INDICES  	if (full_rebuild)  	{ -		mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount, true); +		LLFastTimer t(FTM_FACE_GEOM_INDEX); +		mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount, map_range);  		__m128i* dst = (__m128i*) indicesp.get();  		__m128i* src = (__m128i*) vf.mIndices; @@ -1201,7 +1211,10 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  			indicesp[i] = vf.mIndices[i]+index_offset;  		} -		mVertexBuffer->setBuffer(0); +		if (map_range) +		{ +			mVertexBuffer->setBuffer(0); +		}  	}  	LLMatrix4a mat_normal; @@ -1215,6 +1228,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  	if (rebuild_tcoord)  	{ +		LLFastTimer t(FTM_FACE_GEOM_TEXTURE);  		bool do_xform;  		if (tep) @@ -1422,11 +1436,14 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  				}  			} -			mVertexBuffer->setBuffer(0); +			if (map_range) +			{ +				mVertexBuffer->setBuffer(0); +			}  		}  		else  		{ //either bump mapped or in atlas, just do the whole expensive loop -			mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount, true); +			mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount, map_range);  			std::vector<LLVector2> bump_tc; @@ -1566,12 +1583,14 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  				}  			} -			mVertexBuffer->setBuffer(0); - +			if (map_range) +			{ +				mVertexBuffer->setBuffer(0); +			}  			if (do_bump)  			{ -				mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex, mGeomCount, true); +				mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex, mGeomCount, map_range);  				for (S32 i = 0; i < num_vertices; i++)  				{ @@ -1601,14 +1620,20 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  					*tex_coords2++ = tc;  				} -				mVertexBuffer->setBuffer(0); +				if (map_range) +				{ +					mVertexBuffer->setBuffer(0); +				}  			}  		}  	}  	if (rebuild_pos)  	{ -		mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, true); +		LLFastTimer t(FTM_FACE_GEOM_POSITION); +		llassert(num_vertices > 0); +		 +		mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, map_range);  		vertices = (LLVector4a*) vert.get();  		LLMatrix4a mat_vert; @@ -1636,13 +1661,25 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  			index_dst += 4;  		}  		while (index_dst < index_end); - -		mVertexBuffer->setBuffer(0); +		 +		S32 aligned_pad_vertices = mGeomCount - num_vertices; +		LLVector4a* last_vec = end - 1; +		while (aligned_pad_vertices > 0) +		{ +			--aligned_pad_vertices; +			*dst++ = *last_vec; +		} +		 +		if (map_range) +		{ +			mVertexBuffer->setBuffer(0); +		}  	}  	if (rebuild_normal)  	{ -		mVertexBuffer->getNormalStrider(norm, mGeomIndex, mGeomCount, true); +		LLFastTimer t(FTM_FACE_GEOM_NORMAL); +		mVertexBuffer->getNormalStrider(norm, mGeomIndex, mGeomCount, map_range);  		normals = (LLVector4a*) norm.get();  		for (S32 i = 0; i < num_vertices; i++) @@ -1653,12 +1690,16 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  			normals[i] = normal;  		} -		mVertexBuffer->setBuffer(0); +		if (map_range) +		{ +			mVertexBuffer->setBuffer(0); +		}  	}  	if (rebuild_binormal)  	{ -		mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, true); +		LLFastTimer t(FTM_FACE_GEOM_BINORMAL); +		mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, map_range);  		binormals = (LLVector4a*) binorm.get();  		for (S32 i = 0; i < num_vertices; i++) @@ -1669,20 +1710,28 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  			binormals[i] = binormal;  		} -		mVertexBuffer->setBuffer(0); +		if (map_range) +		{ +			mVertexBuffer->setBuffer(0); +		}  	}  	if (rebuild_weights && vf.mWeights)  	{ -		mVertexBuffer->getWeight4Strider(wght, mGeomIndex, mGeomCount, true); +		LLFastTimer t(FTM_FACE_GEOM_WEIGHTS); +		mVertexBuffer->getWeight4Strider(wght, mGeomIndex, mGeomCount, map_range);  		weights = (LLVector4a*) wght.get();  		LLVector4a::memcpyNonAliased16((F32*) weights, (F32*) vf.mWeights, num_vertices*4*sizeof(F32)); -		mVertexBuffer->setBuffer(0); +		if (map_range) +		{ +			mVertexBuffer->setBuffer(0); +		}  	}  	if (rebuild_color)  	{ -		mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount, true); +		LLFastTimer t(FTM_FACE_GEOM_COLOR); +		mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount, map_range);  		LLVector4a src; @@ -1703,7 +1752,10 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  			dst[i] = src;  		} -		mVertexBuffer->setBuffer(0); +		if (map_range) +		{ +			mVertexBuffer->setBuffer(0); +		}  	}  	if (rebuild_tcoord) diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 35712163eb..a161428c2b 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -80,12 +80,10 @@ static timer_tree_iterator_t end_timer_tree()  	return timer_tree_iterator_t();   } -LLFastTimerView::LLFastTimerView(const LLRect& rect) -:	LLFloater(LLSD()), +LLFastTimerView::LLFastTimerView(const LLSD& key) +:	LLFloater(key),  	mHoverTimer(NULL)  { -	setRect(rect); -	setVisible(FALSE);  	mDisplayMode = 0;  	mAvgCountTotal = 0;  	mMaxCountTotal = 0; @@ -98,10 +96,30 @@ LLFastTimerView::LLFastTimerView(const LLRect& rect)  	FTV_NUM_TIMERS = LLFastTimer::NamedTimer::instanceCount();  	mPrintStats = -1;	  	mAverageCyclesPerTimer = 0; -	setCanMinimize(false); -	setCanClose(true);  } +void LLFastTimerView::onPause() +{ +	LLFastTimer::sPauseHistory = !LLFastTimer::sPauseHistory; +	// reset scroll to bottom when unpausing +	if (!LLFastTimer::sPauseHistory) +	{ +		mScrollIndex = 0; +		getChild<LLButton>("pause_btn")->setLabel(getString("pause")); +	} +	else +	{ +		getChild<LLButton>("pause_btn")->setLabel(getString("run")); +	} +} + +BOOL LLFastTimerView::postBuild() +{ +	LLButton& pause_btn = getChildRef<LLButton>("pause_btn"); +	 +	pause_btn.setCommitCallback(boost::bind(&LLFastTimerView::onPause, this)); +	return TRUE; +}  BOOL LLFastTimerView::handleRightMouseDown(S32 x, S32 y, MASK mask)  { @@ -116,14 +134,16 @@ BOOL LLFastTimerView::handleRightMouseDown(S32 x, S32 y, MASK mask)  		{  			mHoverTimer->getParent()->setCollapsed(true);  		} +		return TRUE;  	}  	else if (mBarRect.pointInRect(x, y))  	{  		S32 bar_idx = MAX_VISIBLE_HISTORY - ((y - mBarRect.mBottom) * (MAX_VISIBLE_HISTORY + 2) / mBarRect.getHeight());  		bar_idx = llclamp(bar_idx, 0, MAX_VISIBLE_HISTORY);  		mPrintStats = LLFastTimer::NamedTimer::HISTORY_NUM - mScrollIndex - bar_idx; +		return TRUE;  	} -	return FALSE; +	return LLFloater::handleRightMouseDown(x, y, mask);  }  LLFastTimer::NamedTimer* LLFastTimerView::getLegendID(S32 y) @@ -151,18 +171,6 @@ BOOL LLFastTimerView::handleDoubleClick(S32 x, S32 y, MASK mask)  BOOL LLFastTimerView::handleMouseDown(S32 x, S32 y, MASK mask)  { - -	{ -		S32 local_x = x - mButtons[BUTTON_CLOSE]->getRect().mLeft; -		S32 local_y = y - mButtons[BUTTON_CLOSE]->getRect().mBottom; -		if(mButtons[BUTTON_CLOSE]->getVisible() -			&&  mButtons[BUTTON_CLOSE]->pointInView(local_x, local_y)  ) -		{ -			return LLFloater::handleMouseDown(x, y, mask);; -		} -	} -	 -  	if (x < mBarRect.mLeft)   	{  		LLFastTimer::NamedTimer* idp = getLegendID(y); @@ -196,36 +204,42 @@ BOOL LLFastTimerView::handleMouseDown(S32 x, S32 y, MASK mask)  	{  		mDisplayCenter = (ChildAlignment)((mDisplayCenter + 1) % ALIGN_COUNT);  	} -	else +	else if (mGraphRect.pointInRect(x, y))  	{ -		// pause/unpause -		LLFastTimer::sPauseHistory = !LLFastTimer::sPauseHistory; -		// reset scroll to bottom when unpausing -		if (!LLFastTimer::sPauseHistory) -		{ -			mScrollIndex = 0; -		} +		gFocusMgr.setMouseCapture(this); +		return TRUE;  	} -	// SJB: Don't pass mouse clicks through the display -	return TRUE; +	//else +	//{ +	//	// pause/unpause +	//	LLFastTimer::sPauseHistory = !LLFastTimer::sPauseHistory; +	//	// reset scroll to bottom when unpausing +	//	if (!LLFastTimer::sPauseHistory) +	//	{ +	//		mScrollIndex = 0; +	//	} +	//} +	return LLFloater::handleMouseDown(x, y, mask);  }  BOOL LLFastTimerView::handleMouseUp(S32 x, S32 y, MASK mask)  { +	if (hasMouseCapture())  	{ -		S32 local_x = x - mButtons[BUTTON_CLOSE]->getRect().mLeft; -		S32 local_y = y - mButtons[BUTTON_CLOSE]->getRect().mBottom; -		if(mButtons[BUTTON_CLOSE]->getVisible() -			&&  mButtons[BUTTON_CLOSE]->pointInView(local_x, local_y)  ) -		{ -			return LLFloater::handleMouseUp(x, y, mask);; -		} +		gFocusMgr.setMouseCapture(NULL);  	} -	return FALSE; +	return LLFloater::handleMouseUp(x, y, mask);;  }  BOOL LLFastTimerView::handleHover(S32 x, S32 y, MASK mask)  { +	if (hasMouseCapture()) +	{ +		F32 lerp = llclamp(1.f - (F32) (x - mGraphRect.mLeft) / (F32) mGraphRect.getWidth(), 0.f, 1.f); +		mScrollIndex = llround( lerp * (F32)(LLFastTimer::NamedTimer::HISTORY_NUM - MAX_VISIBLE_HISTORY)); +		mScrollIndex = llclamp(	mScrollIndex, 0, LLFastTimer::getLastFrameIndex()); +		return TRUE; +	}  	mHoverTimer = NULL;  	mHoverID = NULL; @@ -252,7 +266,15 @@ BOOL LLFastTimerView::handleHover(S32 x, S32 y, MASK mask)  				x < mBarEnd[mHoverBarIndex][i])  			{  				mHoverID = (*it); -				mHoverTimer = (*it);	 +				if (mHoverTimer != *it) +				{ +					// could be that existing tooltip is for a parent and is thus +					// covering region for this new timer, go ahead and unblock  +					// so we can create a new tooltip +					LLToolTipMgr::instance().unblockToolTips(); +					mHoverTimer = (*it); +				} +  				mToolTipRect.set(mBarStart[mHoverBarIndex][i],   					mBarRect.mBottom + llround(((F32)(MAX_VISIBLE_HISTORY - mHoverBarIndex + 1)) * ((F32)mBarRect.getHeight() / ((F32)MAX_VISIBLE_HISTORY + 2.f))),  					mBarEnd[mHoverBarIndex][i], @@ -274,7 +296,7 @@ BOOL LLFastTimerView::handleHover(S32 x, S32 y, MASK mask)  		}  	} -	return FALSE; +	return LLFloater::handleHover(x, y, mask);  } @@ -310,15 +332,15 @@ BOOL LLFastTimerView::handleToolTip(S32 x, S32 y, MASK mask)  			}  		}  	} -	 -	return FALSE; + +	return LLFloater::handleToolTip(x, y, mask);  }  BOOL LLFastTimerView::handleScrollWheel(S32 x, S32 y, S32 clicks)  {  	LLFastTimer::sPauseHistory = TRUE; -	mScrollIndex = llclamp(mScrollIndex - clicks,  -							0,  +	mScrollIndex = llclamp(	mScrollIndex + clicks, +							0,  							llmin(LLFastTimer::getLastFrameIndex(), (S32)LLFastTimer::NamedTimer::HISTORY_NUM - MAX_VISIBLE_HISTORY));  	return TRUE;  } @@ -337,8 +359,8 @@ void LLFastTimerView::draw()  	F64 iclock_freq = 1000.0 / clock_freq;  	S32 margin = 10; -	S32 height = (S32) (gViewerWindow->getWindowRectScaled().getHeight()*0.75f); -	S32 width = (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f); +	S32 height = getRect().getHeight(); +	S32 width = getRect().getWidth();  	LLRect new_rect;  	new_rect.setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height); @@ -622,7 +644,6 @@ void LLFastTimerView::draw()  										 LLFontGL::LEFT, LLFontGL::TOP);  		} -		LLRect graph_rect;  		// Draw borders  		{  			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); @@ -655,9 +676,9 @@ void LLFastTimerView::draw()  			by = LINE_GRAPH_HEIGHT-barh-dy-7;  			//line graph -			graph_rect = LLRect(xleft-5, by, getRect().getWidth()-5, 5); +			mGraphRect = LLRect(xleft-5, by, getRect().getWidth()-5, 5); -			gl_rect_2d(graph_rect, FALSE); +			gl_rect_2d(mGraphRect, FALSE);  		}  		mBarStart.clear(); @@ -805,7 +826,7 @@ void LLFastTimerView::draw()  		//draw line graph history  		{  			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -			LLLocalClipRect clip(graph_rect); +			LLLocalClipRect clip(mGraphRect);  			//normalize based on last frame's maximum  			static U64 last_max = 0; @@ -822,8 +843,8 @@ void LLFastTimerView::draw()  			else  				tdesc = llformat("%4.2f ms", ms); -			x = graph_rect.mRight - LLFontGL::getFontMonospace()->getWidth(tdesc)-5; -			y = graph_rect.mTop - ((S32)LLFontGL::getFontMonospace()->getLineHeight()); +			x = mGraphRect.mRight - LLFontGL::getFontMonospace()->getWidth(tdesc)-5; +			y = mGraphRect.mTop - ((S32)LLFontGL::getFontMonospace()->getLineHeight());  			LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white,  										 LLFontGL::LEFT, LLFontGL::TOP); @@ -833,24 +854,24 @@ void LLFastTimerView::draw()  				S32 first_frame = LLFastTimer::NamedTimer::HISTORY_NUM - mScrollIndex;  				S32 last_frame = first_frame - MAX_VISIBLE_HISTORY; -				F32 frame_delta = ((F32) (graph_rect.getWidth()))/(LLFastTimer::NamedTimer::HISTORY_NUM-1); +				F32 frame_delta = ((F32) (mGraphRect.getWidth()))/(LLFastTimer::NamedTimer::HISTORY_NUM-1); -				F32 right = (F32) graph_rect.mLeft + frame_delta*first_frame; -				F32 left = (F32) graph_rect.mLeft + frame_delta*last_frame; +				F32 right = (F32) mGraphRect.mLeft + frame_delta*first_frame; +				F32 left = (F32) mGraphRect.mLeft + frame_delta*last_frame;  				gGL.color4f(0.5f,0.5f,0.5f,0.3f); -				gl_rect_2d((S32) left, graph_rect.mTop, (S32) right, graph_rect.mBottom); +				gl_rect_2d((S32) left, mGraphRect.mTop, (S32) right, mGraphRect.mBottom);  				if (mHoverBarIndex >= 0)  				{  					S32 bar_frame = first_frame - mHoverBarIndex; -					F32 bar = (F32) graph_rect.mLeft + frame_delta*bar_frame; +					F32 bar = (F32) mGraphRect.mLeft + frame_delta*bar_frame;  					gGL.color4f(0.5f,0.5f,0.5f,1);  					gGL.begin(LLRender::LINES); -					gGL.vertex2i((S32)bar, graph_rect.mBottom); -					gGL.vertex2i((S32)bar, graph_rect.mTop); +					gGL.vertex2i((S32)bar, mGraphRect.mBottom); +					gGL.vertex2i((S32)bar, mGraphRect.mTop);  					gGL.end();  				}  			} @@ -875,7 +896,7 @@ void LLFastTimerView::draw()  				if (mHoverID != NULL &&  					idp != mHoverID) -				{	//fade out non-hihglighted timers +				{	//fade out non-highlighted timers  					if (idp->getParent() != mHoverID)  					{  						alpha = alpha_interp; @@ -883,8 +904,10 @@ void LLFastTimerView::draw()  				}  				gGL.color4f(col[0], col[1], col[2], alpha);				 -				gGL.begin(LLRender::LINE_STRIP); -				for (U32 j = 0; j < LLFastTimer::NamedTimer::HISTORY_NUM; j++) +				gGL.begin(LLRender::TRIANGLE_STRIP); +				for (U32 j = llmax(0, LLFastTimer::NamedTimer::HISTORY_NUM - LLFastTimer::getLastFrameIndex()); +					j < LLFastTimer::NamedTimer::HISTORY_NUM; +					j++)  				{  					U64 ticks = idp->getHistoricalCount(j); @@ -904,9 +927,10 @@ void LLFastTimerView::draw()  						//normalize to highlighted timer  						cur_max = llmax(cur_max, ticks);  					} -					F32 x = graph_rect.mLeft + ((F32) (graph_rect.getWidth()))/(LLFastTimer::NamedTimer::HISTORY_NUM-1)*j; -					F32 y = graph_rect.mBottom + (F32) graph_rect.getHeight()/max_ticks*ticks; +					F32 x = mGraphRect.mLeft + ((F32) (mGraphRect.getWidth()))/(LLFastTimer::NamedTimer::HISTORY_NUM-1)*j; +					F32 y = mGraphRect.mBottom + (F32) mGraphRect.getHeight()/max_ticks*ticks;  					gGL.vertex2f(x,y); +					gGL.vertex2f(x,mGraphRect.mBottom);  				}  				gGL.end(); @@ -924,18 +948,20 @@ void LLFastTimerView::draw()  			}  			//interpolate towards new maximum -			F32 dt = gFrameIntervalSeconds*3.f; -			last_max = (U64) ((F32) last_max + ((F32) cur_max- (F32) last_max) * dt); +			last_max = (U64) lerp((F32)last_max, (F32) cur_max, LLCriticalDamp::getInterpolant(0.1f)); +			if (last_max - cur_max <= 1 ||  cur_max - last_max  <= 1) +			{ +				last_max = cur_max; +			}  			F32 alpha_target = last_max > cur_max ?  								llmin((F32) last_max/ (F32) cur_max - 1.f,1.f) :  								llmin((F32) cur_max/ (F32) last_max - 1.f,1.f); -			 -			alpha_interp = alpha_interp + (alpha_target-alpha_interp) * dt; +			alpha_interp = lerp(alpha_interp, alpha_target, LLCriticalDamp::getInterpolant(0.1f));  			if (mHoverID != NULL)  			{ -				x = (graph_rect.mRight + graph_rect.mLeft)/2; -				y = graph_rect.mBottom + 8; +				x = (mGraphRect.mRight + mGraphRect.mLeft)/2; +				y = mGraphRect.mBottom + 8;  				LLFontGL::getFontMonospace()->renderUTF8(  					mHoverID->getName(),  diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h index ea8251191b..a349e7ad4c 100644 --- a/indra/newview/llfasttimerview.h +++ b/indra/newview/llfasttimerview.h @@ -33,8 +33,9 @@  class LLFastTimerView : public LLFloater  {  public: -	LLFastTimerView(const LLRect& rect); -	 +	LLFastTimerView(const LLSD&); +	BOOL postBuild(); +  	static BOOL sAnalyzePerformance;  	static void outputAllMetrics(); @@ -44,6 +45,7 @@ private:  	static void doAnalysisDefault(std::string baseline, std::string target, std::string output) ;  	static LLSD analyzePerformanceLogDefault(std::istream& is) ;  	static void exportCharts(const std::string& base, const std::string& target); +	void onPause();  public: @@ -89,6 +91,7 @@ private:  	LLFrameTimer mHighlightTimer;  	S32 mPrintStats;  	S32 mAverageCyclesPerTimer; +	LLRect mGraphRect;  };  #endif diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 0b17d64eb0..98de418878 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -31,6 +31,7 @@  #include "llfocusmgr.h"  #include "llinventory.h"  #include "lllandmarkactions.h" +#include "lltoolbarview.h"  #include "lltrans.h"  #include "lluictrlfactory.h"  #include "llmenugl.h" @@ -41,10 +42,10 @@  #include "llinventoryclipboard.h"  #include "llinventorybridge.h"  #include "llinventoryfunctions.h" +#include "llfloatersidepanelcontainer.h"  #include "llfloaterworldmap.h"  #include "lllandmarkactions.h"  #include "llnotificationsutil.h" -#include "llsidetray.h"  #include "lltoggleablemenu.h"  #include "llviewerinventory.h"  #include "llviewermenu.h" @@ -54,6 +55,7 @@  static LLDefaultChildRegistry::Register<LLFavoritesBarCtrl> r("favorites_bar");  const S32 DROP_DOWN_MENU_WIDTH = 250; +const S32 DROP_DOWN_MENU_TOP_PAD = 13;  /**   * Helper for LLFavoriteLandmarkButton and LLFavoriteLandmarkMenuItem. @@ -360,7 +362,7 @@ struct LLFavoritesSort  LLFavoritesBarCtrl::Params::Params()  : image_drag_indication("image_drag_indication"), -  chevron_button("chevron_button"), +  more_button("more_button"),    label("label")  {  } @@ -389,10 +391,10 @@ LLFavoritesBarCtrl::LLFavoritesBarCtrl(const LLFavoritesBarCtrl::Params& p)  	gInventory.addObserver(this);  	//make chevron button                                                                                                                                -	LLButton::Params chevron_button_params(p.chevron_button);                                          -	chevron_button_params.click_callback.function(boost::bind(&LLFavoritesBarCtrl::showDropDownMenu, this));      -	mChevronButton = LLUICtrlFactory::create<LLButton> (chevron_button_params); -	addChild(mChevronButton);  +	LLTextBox::Params more_button_params(p.more_button); +	mMoreTextBox = LLUICtrlFactory::create<LLTextBox> (more_button_params); +	mMoreTextBox->setClickedCallback(boost::bind(&LLFavoritesBarCtrl::showDropDownMenu, this)); +	addChild(mMoreTextBox);  	LLTextBox::Params label_param(p.label);  	mBarLabel = LLUICtrlFactory::create<LLTextBox> (label_param); @@ -403,8 +405,8 @@ LLFavoritesBarCtrl::~LLFavoritesBarCtrl()  {  	gInventory.removeObserver(this); -	LLView::deleteViewByHandle(mOverflowMenuHandle); -	LLView::deleteViewByHandle(mContextMenuHandle); +	delete mOverflowMenuHandle.get(); +	delete mContextMenuHandle.get();  }  BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, @@ -692,7 +694,7 @@ void LLFavoritesBarCtrl::updateButtons()  	const child_list_t* childs = getChildList();  	child_list_const_iter_t child_it = childs->begin();  	int first_changed_item_index = 0; -	int rightest_point = getRect().mRight - mChevronButton->getRect().getWidth(); +	int rightest_point = getRect().mRight - mMoreTextBox->getRect().getWidth();  	//lets find first changed button  	while (child_it != childs->end() && first_changed_item_index < mItems.count())  	{ @@ -735,9 +737,9 @@ void LLFavoritesBarCtrl::updateButtons()  		}  		// we have to remove ChevronButton to make sure that the last item will be LandmarkButton to get the right aligning  		// keep in mind that we are cutting all buttons in space between the last visible child of favbar and ChevronButton -		if (mChevronButton->getParent() == this) +		if (mMoreTextBox->getParent() == this)  		{ -			removeChild(mChevronButton); +			removeChild(mMoreTextBox);  		}  		int last_right_edge = 0;  		//calculate new buttons offset @@ -777,13 +779,13 @@ void LLFavoritesBarCtrl::updateButtons()  			S32 buttonHGap = button_params.rect.left; // default value  			LLRect rect;  			// Chevron button should stay right aligned -			rect.setOriginAndSize(getRect().mRight - mChevronButton->getRect().getWidth() - buttonHGap, 0, -					mChevronButton->getRect().getWidth(), -					mChevronButton->getRect().getHeight()); +			rect.setOriginAndSize(getRect().mRight - mMoreTextBox->getRect().getWidth() - buttonHGap, 0, +					mMoreTextBox->getRect().getWidth(), +					mMoreTextBox->getRect().getHeight()); -			addChild(mChevronButton); -			mChevronButton->setRect(rect); -			mChevronButton->setVisible(TRUE); +			addChild(mMoreTextBox); +			mMoreTextBox->setRect(rect); +			mMoreTextBox->setVisible(TRUE);  		}  		// Update overflow menu  		LLToggleableMenu* overflow_menu = static_cast <LLToggleableMenu*> (mOverflowMenuHandle.get()); @@ -816,8 +818,8 @@ LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem  	int width = required_width > def_button_width? def_button_width : required_width;  	LLFavoriteLandmarkButton* fav_btn = NULL; -	// do we have a place for next button + double buttonHGap + mChevronButton ?  -	if(curr_x + width + 2*button_x_delta +  mChevronButton->getRect().getWidth() > getRect().mRight ) +	// do we have a place for next button + double buttonHGap + mMoreTextBox ? +	if(curr_x + width + 2*button_x_delta +  mMoreTextBox->getRect().getWidth() > getRect().mRight )  	{  		return NULL;  	} @@ -893,84 +895,155 @@ void LLFavoritesBarCtrl::showDropDownMenu()  {  	if (mOverflowMenuHandle.isDead())  	{ -		LLToggleableMenu::Params menu_p; -		menu_p.name("favorites menu"); -		menu_p.can_tear_off(false); -		menu_p.visible(false); -		menu_p.scrollable(true); -		menu_p.max_scrollable_items = 10; -		menu_p.preferred_width = DROP_DOWN_MENU_WIDTH; - -		LLToggleableMenu* menu = LLUICtrlFactory::create<LLFavoriteLandmarkToggleableMenu>(menu_p); -		mOverflowMenuHandle = menu->getHandle(); +		createOverflowMenu();  	}  	LLToggleableMenu* menu = (LLToggleableMenu*)mOverflowMenuHandle.get(); +	if (menu && menu->toggleVisibility()) +	{ +		if (mUpdateDropDownItems) +		{ +			updateMenuItems(menu); +		} + +		menu->buildDrawLabels(); +		menu->updateParent(LLMenuGL::sMenuContainer); +		menu->setButtonRect(mMoreTextBox->getRect(), this); +		positionAndShowMenu(menu); +	} +} + +void LLFavoritesBarCtrl::createOverflowMenu() +{ +	LLToggleableMenu::Params menu_p; +	menu_p.name("favorites menu"); +	menu_p.can_tear_off(false); +	menu_p.visible(false); +	menu_p.scrollable(true); +	menu_p.max_scrollable_items = 10; +	menu_p.preferred_width = DROP_DOWN_MENU_WIDTH; + +	LLToggleableMenu* menu = LLUICtrlFactory::create<LLFavoriteLandmarkToggleableMenu>(menu_p); +	mOverflowMenuHandle = menu->getHandle(); +} -	if (menu) +void LLFavoritesBarCtrl::updateMenuItems(LLToggleableMenu* menu) +{ +	menu->empty(); + +	U32 widest_item = 0; + +	for (S32 i = mFirstDropDownItem; i < mItems.count(); i++)  	{ -		if (!menu->toggleVisibility()) -			return; +		LLViewerInventoryItem* item = mItems.get(i); +		const std::string& item_name = item->getName(); -		U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth()); -		if (mUpdateDropDownItems) +		LLFavoriteLandmarkMenuItem::Params item_params; +		item_params.name(item_name); +		item_params.label(item_name); +		item_params.on_click.function(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID())); + +		LLFavoriteLandmarkMenuItem *menu_item = LLUICtrlFactory::create<LLFavoriteLandmarkMenuItem>(item_params); +		menu_item->initFavoritesBarPointer(this); +		menu_item->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3, _4)); +		menu_item->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4)); +		menu_item->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4)); +		menu_item->setLandmarkID(item->getUUID()); + +		fitLabelWidth(menu_item); + +		widest_item = llmax(widest_item, menu_item->getNominalWidth()); + +		menu->addChild(menu_item); +	} + +	addOpenLandmarksMenuItem(menu); +	mUpdateDropDownItems = false; +} + +void LLFavoritesBarCtrl::fitLabelWidth(LLMenuItemCallGL* menu_item) +{ +	U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth()); +	std::string item_name = menu_item->getName(); + +	// Check whether item name wider than menu +	if (menu_item->getNominalWidth() > max_width) +	{ +		S32 chars_total = item_name.length(); +		S32 chars_fitted = 1; +		menu_item->setLabel(LLStringExplicit("")); +		S32 label_space = max_width - menu_item->getFont()->getWidth("...") - +				menu_item->getNominalWidth();// This returns width of menu item with empty label (pad pixels) + +		while (chars_fitted < chars_total +				&& menu_item->getFont()->getWidth(item_name, 0, chars_fitted) < label_space)  		{ -			menu->empty(); +			chars_fitted++; +		} +		chars_fitted--; // Rolling back one char, that doesn't fit -			U32 widest_item = 0; +		menu_item->setLabel(item_name.substr(0, chars_fitted) + "..."); +	} +} -			for (S32 i = mFirstDropDownItem; i < mItems.count(); i++) -			{ -				LLViewerInventoryItem* item = mItems.get(i); -				const std::string& item_name = item->getName(); - -				LLFavoriteLandmarkMenuItem::Params item_params; -				item_params.name(item_name); -				item_params.label(item_name); - -				item_params.on_click.function(boost::bind( -						&LLFavoritesBarCtrl::onButtonClick, this, -						item->getUUID())); -				LLFavoriteLandmarkMenuItem *menu_item = LLUICtrlFactory::create<LLFavoriteLandmarkMenuItem>(item_params); -				menu_item->initFavoritesBarPointer(this); -				menu_item->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3, _4)); -				menu_item->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4)); -				menu_item->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4)); -				menu_item->setLandmarkID(item->getUUID()); - -				// Check whether item name wider than menu -				if (menu_item->getNominalWidth() > max_width) -				{ -					S32 chars_total = item_name.length(); -					S32 chars_fitted = 1; -					menu_item->setLabel(LLStringExplicit("")); -					S32 label_space = max_width - menu_item->getFont()->getWidth("...") -  -							menu_item->getNominalWidth();// This returns width of menu item with empty label (pad pixels)  - -					while (chars_fitted < chars_total -							&& menu_item->getFont()->getWidth(item_name, 0, chars_fitted) < label_space) -					{ -						chars_fitted++; -					} -					chars_fitted--; // Rolling back one char, that doesn't fit +void LLFavoritesBarCtrl::addOpenLandmarksMenuItem(LLToggleableMenu* menu) +{ +	std::string label_untrans = "Open landmarks"; +	std::string	label_transl; +	bool translated = LLTrans::findString(label_transl, label_untrans); + +	LLMenuItemCallGL::Params item_params; +	item_params.name("open_my_landmarks"); +	item_params.label(translated ? label_transl: label_untrans); +	item_params.on_click.function(boost::bind(&LLFloaterSidePanelContainer::showPanel, "places", LLSD())); +	LLMenuItemCallGL* menu_item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params); + +	fitLabelWidth(menu_item); + +	LLMenuItemSeparatorGL::Params sep_params; +	sep_params.enabled_color=LLUIColorTable::instance().getColor("MenuItemEnabledColor"); +	sep_params.disabled_color=LLUIColorTable::instance().getColor("MenuItemDisabledColor"); +	sep_params.highlight_bg_color=LLUIColorTable::instance().getColor("MenuItemHighlightBgColor"); +	sep_params.highlight_fg_color=LLUIColorTable::instance().getColor("MenuItemHighlightFgColor"); +	LLMenuItemSeparatorGL* separator = LLUICtrlFactory::create<LLMenuItemSeparatorGL>(sep_params); + +	menu->addChild(separator); +	menu->addChild(menu_item); +} -					menu_item->setLabel(item_name.substr(0, chars_fitted) -							+ "..."); -				} -				widest_item = llmax(widest_item, menu_item->getNominalWidth()); +void LLFavoritesBarCtrl::positionAndShowMenu(LLToggleableMenu* menu) +{ +	U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth()); -				menu->addChild(menu_item); -			} -			mUpdateDropDownItems = false; +	S32 menu_x = getRect().getWidth() - max_width; +	S32 menu_y = getParent()->getRect().mBottom - DROP_DOWN_MENU_TOP_PAD; + +	// the menu should be offset of the right edge of the window +	// so it's no covered by buttons in the right-side toolbar. +	LLToolBar* right_toolbar = gToolBarView->getChild<LLToolBar>("toolbar_right"); +	if (right_toolbar && right_toolbar->hasButtons()) +	{ +		S32 toolbar_top = 0; + +		if (LLView* top_border_panel = right_toolbar->getChild<LLView>("button_panel")) +		{ +			toolbar_top = top_border_panel->calcScreenRect().mTop;  		} -		menu->buildDrawLabels(); -		menu->updateParent(LLMenuGL::sMenuContainer); +		// Calculating the bottom (in screen coord) of the drop down menu +		S32 menu_top = getParent()->getRect().mBottom - DROP_DOWN_MENU_TOP_PAD; +		S32 menu_bottom = menu_top - menu->getRect().getHeight(); +		S32 menu_bottom_screen = 0; -		menu->setButtonRect(mChevronButton->getRect(), this); +		localPointToScreen(0, menu_bottom, &menu_top, &menu_bottom_screen); -		LLMenuGL::showPopup(this, menu, getRect().getWidth() - max_width, 0); +		if (menu_bottom_screen < toolbar_top) +		{ +			menu_x -= right_toolbar->getRect().getWidth(); +		}  	} + +	LLMenuGL::showPopup(this, menu, menu_x, menu_y);  }  void LLFavoritesBarCtrl::onButtonClick(LLUUID item_id) @@ -1057,7 +1130,7 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata)  		key["type"] = "landmark";  		key["id"] = mSelectedItemID; -		LLSideTray::getInstance()->showPanel("panel_places", key); +		LLFloaterSidePanelContainer::showPanel("places", key);  	}  	else if (action == "copy_slurl")  	{ diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h index 1a28731c4f..1b11d6196e 100644 --- a/indra/newview/llfavoritesbar.h +++ b/indra/newview/llfavoritesbar.h @@ -34,13 +34,16 @@  #include "llinventoryobserver.h"  #include "llinventorymodel.h" +class LLMenuItemCallGL; +class LLToggleableMenu; +  class LLFavoritesBarCtrl : public LLUICtrl, public LLInventoryObserver  {  public:  	struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>  	{  		Optional<LLUIImage*> image_drag_indication; -		Optional<LLButton::Params> chevron_button; +		Optional<LLTextBox::Params> more_button;  		Optional<LLTextBox::Params> label;  		Params();  	}; @@ -132,10 +135,21 @@ private:  	// finds an item by it's UUID in the items array  	LLInventoryModel::item_array_t::iterator findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id); +	void createOverflowMenu(); + +	void updateMenuItems(LLToggleableMenu* menu); + +	// Fits menu item label width with favorites menu width +	void fitLabelWidth(LLMenuItemCallGL* menu_item); + +	void addOpenLandmarksMenuItem(LLToggleableMenu* menu); + +	void positionAndShowMenu(LLToggleableMenu* menu); +  	BOOL mShowDragMarker;  	LLUICtrl* mLandingTab;  	LLUICtrl* mLastTab; -	LLButton* mChevronButton; +	LLTextBox* mMoreTextBox;  	LLTextBox* mBarLabel;  	LLUUID mDragItemId; diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index 83844048d1..db9a0424c0 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -106,7 +106,7 @@ BOOL LLFeatureList::isFeatureAvailable(const std::string& name)  		return mFeatures[name].mAvailable;  	} -	LL_WARNS("RenderInit") << "Feature " << name << " not on feature list!" << LL_ENDL; +	LL_WARNS_ONCE("RenderInit") << "Feature " << name << " not on feature list!" << LL_ENDL;  	// changing this to TRUE so you have to explicitly disable   	// something for it to be disabled @@ -120,7 +120,7 @@ F32 LLFeatureList::getRecommendedValue(const std::string& name)  		return mFeatures[name].mRecommendedLevel;  	} -	LL_WARNS("RenderInit") << "Feature " << name << " not on feature list or not available!" << LL_ENDL; +	LL_WARNS_ONCE("RenderInit") << "Feature " << name << " not on feature list or not available!" << LL_ENDL;  	return 0;  } @@ -769,6 +769,10 @@ void LLFeatureManager::applyBaseMasks()  	{  		maskFeatures("TexUnit8orLess");  	} +	if (gGLManager.mHasMapBufferRange) +	{ +		maskFeatures("MapBufferRange"); +	}  	// now mask by gpu string  	// Replaces ' ' with '_' in mGPUString to deal with inability for parser to handle spaces diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index 8c0ed29855..4897cf1885 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -653,12 +653,12 @@ OSStatus	LLFilePicker::doNavChooseDialog(ELoadFilter filter)  	//   (It is destroyed by NavDialogDispose() below.)  	error = NavCreateChooseFileDialog(&mNavOptions, NULL, NULL, NULL, navOpenFilterProc, (void*)(&filter), &navRef); -	gViewerWindow->mWindow->beforeDialog(); +	gViewerWindow->getWindow()->beforeDialog();  	if (error == noErr)  		error = NavDialogRun(navRef); -	gViewerWindow->mWindow->afterDialog(); +	gViewerWindow->getWindow()->afterDialog();  	if (error == noErr)  		error = NavDialogGetReply(navRef, &navReply); @@ -808,13 +808,13 @@ OSStatus	LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& fi  		}  	} -	gViewerWindow->mWindow->beforeDialog(); +	gViewerWindow->getWindow()->beforeDialog();  	// Run the dialog  	if (error == noErr)  		error = NavDialogRun(navRef); -	gViewerWindow->mWindow->afterDialog(); +	gViewerWindow->getWindow()->afterDialog();  	if (error == noErr)  		error = NavDialogGetReply(navRef, &navReply); @@ -1204,7 +1204,7 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename  		return FALSE;  	} -	gViewerWindow->mWindow->beforeDialog(); +	gViewerWindow->getWindow()->beforeDialog();  	reset(); @@ -1284,7 +1284,7 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename  		rtn = (getFileCount() == 1);  	} -	gViewerWindow->mWindow->afterDialog(); +	gViewerWindow->getWindow()->afterDialog();  	return rtn;  } @@ -1299,7 +1299,7 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )  		return FALSE;  	} -	gViewerWindow->mWindow->beforeDialog(); +	gViewerWindow->getWindow()->beforeDialog();  	reset(); @@ -1337,7 +1337,7 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )  		rtn = (getFileCount() == 1);  	} -	gViewerWindow->mWindow->afterDialog(); +	gViewerWindow->getWindow()->afterDialog();  	return rtn;  } @@ -1352,7 +1352,7 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )  		return FALSE;  	} -	gViewerWindow->mWindow->beforeDialog(); +	gViewerWindow->getWindow()->beforeDialog();  	reset(); @@ -1370,7 +1370,7 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )  		rtn = !mFiles.empty();  	} -	gViewerWindow->mWindow->afterDialog(); +	gViewerWindow->getWindow()->afterDialog();  	return rtn;  } diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 2873bc0059..22f500ba15 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -26,6 +26,8 @@   */  #include "llviewerprecompiledheaders.h" +#include <iostream> +#include <fstream>  #include "llfloaterabout.h" @@ -68,6 +70,22 @@ extern U32 gPacketsIn;  static std::string get_viewer_release_notes_url(); +///---------------------------------------------------------------------------- +/// Class LLServerReleaseNotesURLFetcher +///---------------------------------------------------------------------------- +class LLServerReleaseNotesURLFetcher : public LLHTTPClient::Responder +{ +	LOG_CLASS(LLServerReleaseNotesURLFetcher); +public: + +	static void startFetch(); +	/*virtual*/ void completedHeader(U32 status, const std::string& reason, const LLSD& content); +	/*virtual*/ void completedRaw( +		U32 status, +		const std::string& reason, +		const LLChannelDescriptors& channels, +		const LLIOPipe::buffer_ptr_t& buffer); +};  ///----------------------------------------------------------------------------  /// Class LLFloaterAbout @@ -87,6 +105,11 @@ public:  	/// separated so that we can programmatically access the same info.  	static LLSD getInfo();  	void onClickCopyToClipboard(); + +	void updateServerReleaseNotesURL(const std::string& url); + +private: +	void setSupportText(const std::string& server_release_notes_url);  }; @@ -108,90 +131,88 @@ BOOL LLFloaterAbout::postBuild()  	LLViewerTextEditor *support_widget =   		getChild<LLViewerTextEditor>("support_editor", true); -	LLViewerTextEditor *credits_widget =  -		getChild<LLViewerTextEditor>("credits_editor", true); +	LLViewerTextEditor *linden_names_widget =  +		getChild<LLViewerTextEditor>("linden_names", true); + +	LLViewerTextEditor *contrib_names_widget =  +		getChild<LLViewerTextEditor>("contrib_names", true); + +	LLViewerTextEditor *trans_names_widget =  +		getChild<LLViewerTextEditor>("trans_names", true);  	getChild<LLUICtrl>("copy_btn")->setCommitCallback(  		boost::bind(&LLFloaterAbout::onClickCopyToClipboard, this)); -#if LL_WINDOWS -	getWindow()->incBusyCount(); -	getWindow()->setCursor(UI_CURSOR_ARROW); -#endif -	LLSD info(getInfo()); -#if LL_WINDOWS -	getWindow()->decBusyCount(); -	getWindow()->setCursor(UI_CURSOR_ARROW); -#endif - -	std::ostringstream support; +	if (gAgent.getRegion()) +	{ +		// start fetching server release notes URL +		setSupportText(LLTrans::getString("RetrievingData")); +		LLServerReleaseNotesURLFetcher::startFetch(); +	} +	else // not logged in +	{ +		setSupportText(LLStringUtil::null); +	} -	// Render the LLSD from getInfo() as a format_map_t -	LLStringUtil::format_map_t args; +	support_widget->blockUndo(); -	// allow the "Release Notes" URL label to be localized -	args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes"); +	// Fix views +	support_widget->setEnabled(FALSE); +	support_widget->startOfDoc(); -	for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap()); -		 ii != iend; ++ii) +	// Get the names of Lindens, added by viewer_manifest.py at build time +	std::string lindens_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"lindens.txt"); +	llifstream linden_file; +	std::string lindens; +	linden_file.open(lindens_path);		/* Flawfinder: ignore */ +	if (linden_file.is_open())  	{ -		if (! ii->second.isArray()) -		{ -			// Scalar value -			if (ii->second.isUndefined()) -			{ -				args[ii->first] = getString("none"); -			} -			else -			{ -				// don't forget to render value asString() -				args[ii->first] = ii->second.asString(); -			} -		} -		else -		{ -			// array value: build KEY_0, KEY_1 etc. entries -			for (LLSD::Integer n(0), size(ii->second.size()); n < size; ++n) -			{ -				args[STRINGIZE(ii->first << '_' << n)] = ii->second[n].asString(); -			} -		} +		std::getline(linden_file, lindens); // all names are on a single line +		linden_file.close(); +		linden_names_widget->setText(lindens);  	} - -	// Now build the various pieces -	support << getString("AboutHeader", args); -	if (info.has("REGION")) +	else  	{ -		support << "\n\n" << getString("AboutPosition", args); +		LL_INFOS("AboutInit") << "Could not read lindens file at " << lindens_path << LL_ENDL;  	} -	support << "\n\n" << getString("AboutSystem", args); -	support << "\n"; -	if (info.has("GRAPHICS_DRIVER_VERSION")) +	linden_names_widget->setEnabled(FALSE); +	linden_names_widget->startOfDoc(); + +	// Get the names of contributors, extracted from .../doc/contributions.txt by viewer_manifest.py at build time +	std::string contributors_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"contributors.txt"); +	llifstream contrib_file; +	std::string contributors; +	contrib_file.open(contributors_path);		/* Flawfinder: ignore */ +	if (contrib_file.is_open())  	{ -		support << "\n" << getString("AboutDriver", args); +		std::getline(contrib_file, contributors); // all names are on a single line +		contrib_file.close();  	} -	support << "\n" << getString("AboutLibs", args); -	if (info.has("COMPILER")) +	else  	{ -		support << "\n" << getString("AboutCompiler", args); +		LL_WARNS("AboutInit") << "Could not read contributors file at " << contributors_path << LL_ENDL;  	} -	if (info.has("PACKETS_IN")) +	contrib_names_widget->setText(contributors); +	contrib_names_widget->setEnabled(FALSE); +	contrib_names_widget->startOfDoc(); + +	// Get the names of translators, extracted from .../doc/tranlations.txt by viewer_manifest.py at build time +	std::string translators_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"translators.txt"); +	llifstream trans_file; +	std::string translators; +	trans_file.open(translators_path);		/* Flawfinder: ignore */ +	if (trans_file.is_open())  	{ -		support << '\n' << getString("AboutTraffic", args); +		std::getline(trans_file, translators); // all names are on a single line +		trans_file.close();  	} - -	support_widget->appendText(support.str(),  -								FALSE,  -								LLStyle::Params() -									.color(LLUIColorTable::instance().getColor("TextFgReadOnlyColor"))); -	support_widget->blockUndo(); - -	// Fix views -	support_widget->setEnabled(FALSE); -	support_widget->startOfDoc(); - -	credits_widget->setEnabled(FALSE); -	credits_widget->startOfDoc(); +	else +	{ +		LL_WARNS("AboutInit") << "Could not read translators file at " << translators_path << LL_ENDL; +	} +	trans_names_widget->setText(translators); +	trans_names_widget->setEnabled(FALSE); +	trans_names_widget->startOfDoc();  	return TRUE;  } @@ -235,7 +256,6 @@ LLSD LLFloaterAbout::getInfo()  		info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName();  		info["HOSTIP"] = gAgent.getRegion()->getHost().getString();  		info["SERVER_VERSION"] = gLastVersionChannel; -		info["SERVER_RELEASE_NOTES_URL"] = LLWeb::escapeURL(region->getCapability("ServerReleaseNotes"));  	}  	// CPU @@ -330,6 +350,95 @@ void LLFloaterAbout::onClickCopyToClipboard()  	support_widget->deselect();  } +void LLFloaterAbout::updateServerReleaseNotesURL(const std::string& url) +{ +	setSupportText(url); +} + +void LLFloaterAbout::setSupportText(const std::string& server_release_notes_url) +{ +#if LL_WINDOWS +	getWindow()->incBusyCount(); +	getWindow()->setCursor(UI_CURSOR_ARROW); +#endif +	LLSD info(getInfo()); +#if LL_WINDOWS +	getWindow()->decBusyCount(); +	getWindow()->setCursor(UI_CURSOR_ARROW); +#endif + +	if (LLStringUtil::startsWith(server_release_notes_url, "http")) // it's an URL +	{ +		info["SERVER_RELEASE_NOTES_URL"] = "[" + LLWeb::escapeURL(server_release_notes_url) + " " + LLTrans::getString("ReleaseNotes") + "]"; +	} +	else +	{ +		info["SERVER_RELEASE_NOTES_URL"] = server_release_notes_url; +	} + +	LLViewerTextEditor *support_widget = +		getChild<LLViewerTextEditor>("support_editor", true); + +	std::ostringstream support; + +	// Render the LLSD from getInfo() as a format_map_t +	LLStringUtil::format_map_t args; + +	for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap()); +		 ii != iend; ++ii) +	{ +		if (! ii->second.isArray()) +		{ +			// Scalar value +			if (ii->second.isUndefined()) +			{ +				args[ii->first] = getString("none"); +			} +			else +			{ +				// don't forget to render value asString() +				args[ii->first] = ii->second.asString(); +			} +		} +		else +		{ +			// array value: build KEY_0, KEY_1 etc. entries +			for (LLSD::Integer n(0), size(ii->second.size()); n < size; ++n) +			{ +				args[STRINGIZE(ii->first << '_' << n)] = ii->second[n].asString(); +			} +		} +	} + +	// Now build the various pieces +	support << getString("AboutHeader", args); +	if (info.has("REGION")) +	{ +		support << "\n\n" << getString("AboutPosition", args); +	} +	support << "\n\n" << getString("AboutSystem", args); +	support << "\n"; +	if (info.has("GRAPHICS_DRIVER_VERSION")) +	{ +		support << "\n" << getString("AboutDriver", args); +	} +	support << "\n" << getString("AboutLibs", args); +	if (info.has("COMPILER")) +	{ +		support << "\n" << getString("AboutCompiler", args); +	} +	if (info.has("PACKETS_IN")) +	{ +		support << '\n' << getString("AboutTraffic", args); +	} + +	support_widget->clear(); +	support_widget->appendText(support.str(), +								FALSE, +								LLStyle::Params() +									.color(LLUIColorTable::instance().getColor("TextFgReadOnlyColor"))); +} +  ///----------------------------------------------------------------------------  /// LLFloaterAboutUtil  ///---------------------------------------------------------------------------- @@ -339,3 +448,52 @@ void LLFloaterAboutUtil::registerFloater()  		&LLFloaterReg::build<LLFloaterAbout>);  } + +///---------------------------------------------------------------------------- +/// Class LLServerReleaseNotesURLFetcher implementation +///---------------------------------------------------------------------------- +// static +void LLServerReleaseNotesURLFetcher::startFetch() +{ +	LLViewerRegion* region = gAgent.getRegion(); +	if (!region) return; + +	// We cannot display the URL returned by the ServerReleaseNotes capability +	// because opening it in an external browser will trigger a warning about untrusted +	// SSL certificate. +	// So we query the URL ourselves, expecting to find +	// an URL suitable for external browsers in the "Location:" HTTP header. +	std::string cap_url = region->getCapability("ServerReleaseNotes"); +	LLHTTPClient::get(cap_url, new LLServerReleaseNotesURLFetcher); +} + +// virtual +void LLServerReleaseNotesURLFetcher::completedHeader(U32 status, const std::string& reason, const LLSD& content) +{ +	lldebugs << "Status: " << status << llendl; +	lldebugs << "Reason: " << reason << llendl; +	lldebugs << "Headers: " << content << llendl; + +	LLFloaterAbout* floater_about = LLFloaterReg::getTypedInstance<LLFloaterAbout>("sl_about"); +	if (floater_about) +	{ +		std::string location = content["location"].asString(); +		if (location.empty()) +		{ +			location = floater_about->getString("ErrorFetchingServerReleaseNotesURL"); +		} +		floater_about->updateServerReleaseNotesURL(location); +	} +} + +// virtual +void LLServerReleaseNotesURLFetcher::completedRaw( +	U32 status, +	const std::string& reason, +	const LLChannelDescriptors& channels, +	const LLIOPipe::buffer_ptr_t& buffer) +{ +	// Do nothing. +	// We're overriding just because the base implementation tries to +	// deserialize LLSD which triggers warnings. +} diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp index c6743ca13b..2939d31087 100644 --- a/indra/newview/llfloaterauction.cpp +++ b/indra/newview/llfloaterauction.cpp @@ -27,7 +27,6 @@  #include "llviewerprecompiledheaders.h"  #include "llfloaterauction.h" -#include "llfloaterregioninfo.h"  #include "llgl.h"  #include "llimagej2c.h" @@ -40,6 +39,7 @@  #include "llagent.h"  #include "llcombobox.h" +#include "llestateinfomodel.h"  #include "llmimetypes.h"  #include "llnotifications.h"  #include "llnotificationsutil.h" @@ -114,16 +114,9 @@ void LLFloaterAuction::initialize()  		getChildView("reset_parcel_btn")->setEnabled(TRUE);  		getChildView("start_auction_btn")->setEnabled(TRUE); -		LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate(); -		if (panel) -		{	// Only enable "Sell to Anyone" on Teen grid or if we don't know the ID yet -			U32 estate_id = panel->getEstateID(); -			getChildView("sell_to_anyone_btn")->setEnabled((estate_id == ESTATE_TEEN || estate_id == 0)); -		} -		else -		{	// Don't have the panel up, so don't know if we're on the teen grid or not.  Default to enabling it -			getChildView("sell_to_anyone_btn")->setEnabled(TRUE); -		} +		U32 estate_id = LLEstateInfoModel::instance().getID(); +		// Only enable "Sell to Anyone" on Teen grid or if we don't know the ID yet +		getChildView("sell_to_anyone_btn")->setEnabled(estate_id == ESTATE_TEEN || estate_id == 0);  	}  	else  	{ diff --git a/indra/newview/llfloateravatar.cpp b/indra/newview/llfloateravatar.cpp new file mode 100644 index 0000000000..bdc5b581a9 --- /dev/null +++ b/indra/newview/llfloateravatar.cpp @@ -0,0 +1,54 @@ +/**  + * @file llfloateravatar.h + * @author Leyla Farazha + * @brief floater for the avatar changer + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ + +/** + * Floater that appears when buying an object, giving a preview + * of its contents and their permissions. + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloateravatar.h" +#include "lluictrlfactory.h" + + +LLFloaterAvatar::LLFloaterAvatar(const LLSD& key) +	:	LLFloater(key) +{ +} + +LLFloaterAvatar::~LLFloaterAvatar() +{ +} + +BOOL LLFloaterAvatar::postBuild() +{ +	enableResizeCtrls(true, true, false); +	return TRUE; +} + + diff --git a/indra/newview/llsidetraylistener.h b/indra/newview/llfloateravatar.h index 51e2137762..cadc5e4028 100644 --- a/indra/newview/llsidetraylistener.h +++ b/indra/newview/llfloateravatar.h @@ -1,9 +1,8 @@ -/** - * @file   llsidetraylistener.h - * @author Nat Goodspeed - * @date   2011-02-15 - * @brief   - *  +/**  + * @file llfloateravatar.h + * @author Leyla Farazha + * @brief floater for the avatar changer + *   * $LicenseInfo:firstyear=2011&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2011, Linden Research, Inc. @@ -26,28 +25,19 @@   * $/LicenseInfo$   */ -#if ! defined(LL_LLSIDETRAYLISTENER_H) -#define LL_LLSIDETRAYLISTENER_H - -#include "lleventapi.h" -#include <boost/function.hpp> +#ifndef LL_FLOATER_AVATAR_H +#define LL_FLOATER_AVATAR_H -class LLSideTray; -class LLSD; +#include "llfloater.h" -class LLSideTrayListener: public LLEventAPI +class LLFloaterAvatar: +	public LLFloater  { -    typedef boost::function<LLSideTray*()> Getter; - -public: -    LLSideTrayListener(const Getter& getter); - +	friend class LLFloaterReg;  private: -    void getCollapsed(const LLSD& event) const; -    void getTabs(const LLSD& event) const; -    void getPanels(const LLSD& event) const; - -    Getter mGetter; +	LLFloaterAvatar(const LLSD& key); +	/*virtual*/	~LLFloaterAvatar(); +	/*virtual*/	BOOL postBuild();  }; -#endif /* ! defined(LL_LLSIDETRAYLISTENER_H) */ +#endif diff --git a/indra/newview/llfloaterbuildoptions.cpp b/indra/newview/llfloaterbuildoptions.cpp index 4b6fe4a115..86c1bf0534 100644 --- a/indra/newview/llfloaterbuildoptions.cpp +++ b/indra/newview/llfloaterbuildoptions.cpp @@ -34,15 +34,81 @@  #include "llfloaterbuildoptions.h"  #include "lluictrlfactory.h" +#include "llcombobox.h" +#include "llselectmgr.h" +  //  // Methods  // + +void commit_grid_mode(LLUICtrl *); +  LLFloaterBuildOptions::LLFloaterBuildOptions(const LLSD& key) -  : LLFloater(key) +  : LLFloater(key), +    mComboGridMode(NULL)  { +	mCommitCallbackRegistrar.add("GridOptions.gridMode", boost::bind(&commit_grid_mode,_1));  }  LLFloaterBuildOptions::~LLFloaterBuildOptions() +{} + +BOOL LLFloaterBuildOptions::postBuild() +{ +	mComboGridMode = getChild<LLComboBox>("combobox grid mode"); + +	return TRUE; +} + +void LLFloaterBuildOptions::setGridMode(EGridMode mode) +{ +	mComboGridMode->setCurrentByIndex((S32)mode); +} + +void LLFloaterBuildOptions::updateGridMode()  { +	if (mComboGridMode) +	{ +		S32 index = mComboGridMode->getCurrentIndex(); +		mComboGridMode->removeall(); + +		switch (mObjectSelection->getSelectType()) +		{ +		case SELECT_TYPE_HUD: +		  mComboGridMode->add(getString("grid_screen_text")); +		  mComboGridMode->add(getString("grid_local_text")); +		  break; +		case SELECT_TYPE_WORLD: +		  mComboGridMode->add(getString("grid_world_text")); +		  mComboGridMode->add(getString("grid_local_text")); +		  mComboGridMode->add(getString("grid_reference_text")); +		  break; +		case SELECT_TYPE_ATTACHMENT: +		  mComboGridMode->add(getString("grid_attachment_text")); +		  mComboGridMode->add(getString("grid_local_text")); +		  mComboGridMode->add(getString("grid_reference_text")); +		  break; +		} + +		mComboGridMode->setCurrentByIndex(index); +	} +} + +// virtual +void LLFloaterBuildOptions::onOpen(const LLSD& key) +{ +	mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();  } +// virtual +void LLFloaterBuildOptions::onClose(bool app_quitting) +{ +	mObjectSelection = NULL; +} + +void commit_grid_mode(LLUICtrl *ctrl) +{ +	LLComboBox* combo = (LLComboBox*)ctrl; + +	LLSelectMgr::getInstance()->setGridMode((EGridMode)combo->getCurrentIndex()); +} diff --git a/indra/newview/llfloaterbuildoptions.h b/indra/newview/llfloaterbuildoptions.h index 164944d7bc..7f3811bf1c 100644 --- a/indra/newview/llfloaterbuildoptions.h +++ b/indra/newview/llfloaterbuildoptions.h @@ -33,15 +33,34 @@  #define LL_LLFLOATERBUILDOPTIONS_H  #include "llfloater.h" +#include "llselectmgr.h" +class LLComboBox; +class LLObjectSelection; + +typedef LLSafeHandle<LLObjectSelection> LLObjectSelectionHandle;  class LLFloaterBuildOptions  	:	public LLFloater  { -	friend class LLFloaterReg; +public: + +	virtual BOOL postBuild(); + +	/*virtual*/ void onOpen(const LLSD& key); +	/*virtual*/	void onClose(bool app_quitting); + +	void setGridMode(EGridMode mode); +	void updateGridMode(); +  private: + +	friend class LLFloaterReg; +  	LLFloaterBuildOptions(const LLSD& key);  	~LLFloaterBuildOptions(); -}; +	LLComboBox*	mComboGridMode; +	LLObjectSelectionHandle	mObjectSelection; +};  #endif diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp index 610142b5a9..8223e89b64 100644 --- a/indra/newview/llfloaterbuyland.cpp +++ b/indra/newview/llfloaterbuyland.cpp @@ -508,7 +508,9 @@ void LLFloaterBuyLandUI::updateCovenantInfo()  		LLIconCtrl* rating_icon = getChild<LLIconCtrl>("rating_icon");  		LLRect rect = rating_icon->getRect(); -		S32 icon_left_pad = region_name->getRect().mLeft + region_name->getTextBoundingRect().getWidth() + ICON_PAD; +		S32 region_name_width = llmin(region_name->getRect().getWidth(), region_name->getTextBoundingRect().getWidth()); +		S32 icon_left_pad = region_name->getRect().mLeft + region_name_width + ICON_PAD; +		region_name->setToolTip(region_name->getText());  		rating_icon->setRect(rect.setOriginAndSize(icon_left_pad, rect.mBottom, rect.getWidth(), rect.getHeight()));  		switch(sim_access) @@ -529,7 +531,8 @@ void LLFloaterBuyLandUI::updateCovenantInfo()  	LLTextBox* region_type = getChild<LLTextBox>("region_type_text");  	if (region_type)  	{ -		region_type->setText(region->getSimProductName()); +		region_type->setText(region->getLocalizedSimProductName()); +		region_type->setToolTip(region->getLocalizedSimProductName());  	}  	LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause"); @@ -619,7 +622,8 @@ void LLFloaterBuyLandUI::updateFloaterCovenantText(const std::string &string, co  void LLFloaterBuyLandUI::updateFloaterEstateName(const std::string& name)  {  	LLTextBox* box = getChild<LLTextBox>("estate_name_text"); -	if (box) box->setText(name); +	box->setText(name); +	box->setToolTip(name);  }  void LLFloaterBuyLandUI::updateFloaterLastModified(const std::string& text) diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index 1dfa904a19..aa78bc4f29 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -36,7 +36,6 @@  #include "lljoystickbutton.h"  #include "llviewercontrol.h"  #include "llviewercamera.h" -#include "llbottomtray.h"  #include "lltoolmgr.h"  #include "lltoolfocus.h"  #include "llslider.h" @@ -314,12 +313,6 @@ void LLFloaterCamera::onOpen(const LLSD& key)  {  	LLFirstUse::viewPopup(); -	LLButton *anchor_panel = LLBottomTray::getInstance()->getChild<LLButton>("camera_btn"); - -	setDockControl(new LLDockControl( -		anchor_panel, this, -		getDockTongue(), LLDockControl::TOP)); -  	mZoom->onOpen(key);  	// Returns to previous mode, see EXT-2727(View tool should remember state). @@ -343,15 +336,12 @@ void LLFloaterCamera::onClose(bool app_quitting)  	if (mCurrMode == CAMERA_CTRL_MODE_PAN)  		mPrevMode = CAMERA_CTRL_MODE_PAN; -	// HACK: Should always close as docked to prevent toggleInstance without calling onOpen. -	if ( !isDocked() ) -		setDocked(true);  	switchMode(CAMERA_CTRL_MODE_PAN);  	mClosed = TRUE;  }  LLFloaterCamera::LLFloaterCamera(const LLSD& val) -:	LLTransientDockableFloater(NULL, true, val), +:	LLFloater(val),  	mClosed(FALSE),  	mCurrMode(CAMERA_CTRL_MODE_PAN),  	mPrevMode(CAMERA_CTRL_MODE_PAN) @@ -379,7 +369,7 @@ BOOL LLFloaterCamera::postBuild()  	// ensure that appearance mode is handled while building. See EXT-7796.  	handleAvatarEditingAppearance(sAppearanceEditing); -	return LLDockableFloater::postBuild(); +	return LLFloater::postBuild();  }  void LLFloaterCamera::fillFlatlistFromPanel (LLFlatListView* list, LLPanel* panel) diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h index 424191ef26..4572932853 100644 --- a/indra/newview/llfloatercamera.h +++ b/indra/newview/llfloatercamera.h @@ -27,7 +27,7 @@  #ifndef LLFLOATERCAMERA_H  #define LLFLOATERCAMERA_H -#include "lltransientdockablefloater.h" +#include "llfloater.h"  #include "lliconctrl.h"  #include "lltextbox.h"  #include "llflatlistview.h" @@ -45,8 +45,7 @@ enum ECameraControlMode  	CAMERA_CTRL_MODE_PRESETS  }; -class LLFloaterCamera -	:	public LLTransientDockableFloater +class LLFloaterCamera : public LLFloater  {  	friend class LLFloaterReg; diff --git a/indra/newview/llfloaterdestinations.cpp b/indra/newview/llfloaterdestinations.cpp new file mode 100644 index 0000000000..af21cb593f --- /dev/null +++ b/indra/newview/llfloaterdestinations.cpp @@ -0,0 +1,54 @@ +/**  + * @file llfloaterdestinations.h + * @author Leyla Farazha + * @brief floater for the destinations guide + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ + +/** + * Floater that appears when buying an object, giving a preview + * of its contents and their permissions. + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloaterdestinations.h" +#include "lluictrlfactory.h" + + +LLFloaterDestinations::LLFloaterDestinations(const LLSD& key) +	:	LLFloater(key) +{ +} + +LLFloaterDestinations::~LLFloaterDestinations() +{ +} + +BOOL LLFloaterDestinations::postBuild() +{ +	enableResizeCtrls(true, true, false); +	return TRUE; +} + + diff --git a/indra/newview/llfloaterdestinations.h b/indra/newview/llfloaterdestinations.h new file mode 100644 index 0000000000..85d9b3391e --- /dev/null +++ b/indra/newview/llfloaterdestinations.h @@ -0,0 +1,43 @@ +/**  + * @file llfloaterdestinations.h + * @author Leyla Farazha + * @brief floater for the destinations guide + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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_FLOATER_DESTINATIONS_H +#define LL_FLOATER_DESTINATIONS_H + +#include "llfloater.h" + +class LLFloaterDestinations: +	public LLFloater +{ +	friend class LLFloaterReg; +private: +	LLFloaterDestinations(const LLSD& key); +	/*virtual*/	~LLFloaterDestinations(); +	/*virtual*/	BOOL postBuild(); +}; + +#endif diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index ef3c8b764e..d495f20a9a 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -365,6 +365,8 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur  		element["columns"][3]["font"]["style"] = font_style;  	} +	LL_DEBUGS("Gesture") << "Added gesture [" << item_name << "]" << LL_ENDL; +  	LLScrollListItem* sl_item = list->addElement(element, ADD_BOTTOM);  	if(sl_item)  	{ diff --git a/indra/newview/llfloaterhelpbrowser.cpp b/indra/newview/llfloaterhelpbrowser.cpp index 3012638d44..fd9c37ae73 100644 --- a/indra/newview/llfloaterhelpbrowser.cpp +++ b/indra/newview/llfloaterhelpbrowser.cpp @@ -39,6 +39,7 @@  #include "llurlhistory.h"  #include "llmediactrl.h"  #include "llviewermedia.h" +#include "llviewerhelp.h"  LLFloaterHelpBrowser::LLFloaterHelpBrowser(const LLSD& key) @@ -74,6 +75,17 @@ void LLFloaterHelpBrowser::buildURLHistory()  void LLFloaterHelpBrowser::onOpen(const LLSD& key)  {  	gSavedSettings.setBOOL("HelpFloaterOpen", TRUE); + +	std::string topic = key.asString(); + +	if (topic == "__local") +	{ +		mBrowser->navigateToLocalPage( "help-offline" , "index.html" ); +	} +	else +	{ +		mBrowser->navigateTo(LLViewerHelp::instance().getURL(topic)); +	}  }  //virtual @@ -148,8 +160,3 @@ void LLFloaterHelpBrowser::openMedia(const std::string& media_url)  	mBrowser->navigateTo(media_url, "text/html");  	setCurrentURL(media_url);  } - -void LLFloaterHelpBrowser::navigateToLocalPage( const std::string& subdir, const std::string& filename_in ) -{ -	mBrowser->navigateToLocalPage(subdir, filename_in); -} diff --git a/indra/newview/llfloaterhelpbrowser.h b/indra/newview/llfloaterhelpbrowser.h index afe0f4df69..80b0ecc06b 100644 --- a/indra/newview/llfloaterhelpbrowser.h +++ b/indra/newview/llfloaterhelpbrowser.h @@ -48,8 +48,6 @@ class LLFloaterHelpBrowser :  	/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);  	void openMedia(const std::string& media_url); - -	void navigateToLocalPage( const std::string& subdir, const std::string& filename_in );   private:  	void buildURLHistory(); diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 9b7593ce61..4746f93009 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -566,10 +566,7 @@ void LLPanelLandGeneral::refresh()  		if (regionp)  		{  			insert_maturity_into_textbox(mContentRating, gFloaterView->getParentFloater(this), MATURITY); - -			std::string land_type; -			bool is_land_type_localized = LLTrans::findString(land_type, regionp->getSimProductName()); -			mLandType->setText(is_land_type_localized ? land_type : regionp->getSimProductName()); +			mLandType->setText(regionp->getLocalizedSimProductName());  		}  		// estate owner/manager cannot edit other parts of the parcel @@ -2883,13 +2880,7 @@ void LLPanelLandCovenant::refresh()  	}  	LLTextBox* region_landtype = getChild<LLTextBox>("region_landtype_text"); -	if (region_landtype) -	{ -		std::string land_type; -		bool is_land_type_localized = LLTrans::findString(land_type, region->getSimProductName()); - -		region_landtype->setText(is_land_type_localized ? land_type : region->getSimProductName()); -	} +	region_landtype->setText(region->getLocalizedSimProductName());  	LLTextBox* region_maturity = getChild<LLTextBox>("region_maturity_text");  	if (region_maturity) diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp index 641e64247b..8713513054 100644 --- a/indra/newview/llfloatermap.cpp +++ b/indra/newview/llfloatermap.cpp @@ -100,16 +100,13 @@ BOOL LLFloaterMap::postBuild()  	mTextBoxSouthWest = getChild<LLTextBox> ("floater_map_southwest");  	mTextBoxNorthWest = getChild<LLTextBox> ("floater_map_northwest"); -	stretchMiniMap(getRect().getWidth() - MAP_PADDING_LEFT - MAP_PADDING_RIGHT -		,getRect().getHeight() - MAP_PADDING_TOP - MAP_PADDING_BOTTOM); -  	updateMinorDirections();  	// Get the drag handle all the way in back  	sendChildToBack(getDragHandle()); -	setIsChrome(TRUE); -	getDragHandle()->setTitleVisible(TRUE); +	//setIsChrome(TRUE); +	//getDragHandle()->setTitleVisible(TRUE);  	// keep onscreen  	gFloaterView->adjustToFitScreen(this, FALSE); @@ -223,40 +220,10 @@ void LLFloaterMap::draw()  	LLFloater::draw();  } -// virtual -void LLFloaterMap::onFocusReceived() -{ -	setBackgroundOpaque(true); -	LLPanel::onFocusReceived(); -} - -// virtual -void LLFloaterMap::onFocusLost() -{ -	setBackgroundOpaque(false); -	LLPanel::onFocusLost(); -} - -void LLFloaterMap::stretchMiniMap(S32 width,S32 height) -{ -	//fix for ext-7112 -	//by default ctrl can't overlap caption area -	if(mMap) -	{ -		LLRect map_rect; -		map_rect.setLeftTopAndSize( MAP_PADDING_LEFT, getRect().getHeight() - MAP_PADDING_TOP, width, height); -		mMap->reshape( width, height, 1); -		mMap->setRect(map_rect); -	} -} -  void LLFloaterMap::reshape(S32 width, S32 height, BOOL called_from_parent)  {  	LLFloater::reshape(width, height, called_from_parent); -	stretchMiniMap(width - MAP_PADDING_LEFT - MAP_PADDING_RIGHT -		,height - MAP_PADDING_TOP - MAP_PADDING_BOTTOM); -  	updateMinorDirections();  } @@ -285,16 +252,3 @@ void LLFloaterMap::handleZoom(const LLSD& userdata)  		mMap->setScale(scale);  	}  } - -void	LLFloaterMap::setMinimized(BOOL b) -{ -	LLFloater::setMinimized(b); -	if(b) -	{ -		setTitle(getString("mini_map_caption")); -	} -	else -	{ -		setTitle(""); -	} -} diff --git a/indra/newview/llfloatermap.h b/indra/newview/llfloatermap.h index 5cf66a594b..8a1b965e62 100644 --- a/indra/newview/llfloatermap.h +++ b/indra/newview/llfloatermap.h @@ -45,18 +45,12 @@ public:  	/*virtual*/ BOOL	handleDoubleClick( S32 x, S32 y, MASK mask );  	/*virtual*/ void	reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);  	/*virtual*/ void	draw(); -	/*virtual*/ void	onFocusLost(); -	/*virtual*/ void	onFocusReceived(); -	/*virtual*/ void	setMinimized(BOOL b); -	  private:  	void handleZoom(const LLSD& userdata);  	void setDirectionPos( LLTextBox* text_box, F32 rotation );  	void updateMinorDirections(); -	void stretchMiniMap(S32 width,S32 height); -	  	LLTextBox*		mTextBoxEast;  	LLTextBox*		mTextBoxNorth;  	LLTextBox*		mTextBoxWest; diff --git a/indra/newview/llfloatermemleak.cpp b/indra/newview/llfloatermemleak.cpp index 58931d112e..9edfe1e354 100644 --- a/indra/newview/llfloatermemleak.cpp +++ b/indra/newview/llfloatermemleak.cpp @@ -90,6 +90,11 @@ LLFloaterMemLeak::~LLFloaterMemLeak()  void LLFloaterMemLeak::release()  { +	if(mLeakedMem.empty()) +	{ +		return ; +	} +  	for(S32 i = 0 ; i < (S32)mLeakedMem.size() ; i++)  	{  		delete[] mLeakedMem[i] ; diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index ab6753b4be..881f087d7b 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -71,6 +71,7 @@  #include "llmatrix4a.h"  #include "llmenubutton.h"  #include "llmeshrepository.h" +#include "llnotificationsutil.h"  #include "llsdutil_math.h"  #include "lltextbox.h"  #include "lltoolmgr.h" @@ -95,12 +96,18 @@  #include "llsliderctrl.h"  #include "llspinctrl.h"  #include "lltoggleablemenu.h" +#include "lltrans.h"  #include "llvfile.h"  #include "llvfs.h"  #include "llcallbacklist.h"  #include "llviewerobjectlist.h"  #include "llanimationstates.h" +#include "llviewernetwork.h"  #include "glod/glod.h" +#include <boost/algorithm/string.hpp> + + +const S32 SLM_SUPPORTED_VERSION = 3;  //static  S32 LLFloaterModelPreview::sUploadAmount = 10; @@ -113,6 +120,19 @@ const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE;  const S32 PREF_BUTTON_HEIGHT = 16 + 7 + 16;  const S32 PREVIEW_TEXTURE_HEIGHT = 300; +// "Retain%" decomp parameter has values from 0.0 to 1.0 by 0.01 +// But according to the UI spec for upload model floater, this parameter +// should be represented by Retain spinner with values from 1 to 100 by 1. +// To achieve this, RETAIN_COEFFICIENT is used while creating spinner +// and when value is requested from spinner. +const double RETAIN_COEFFICIENT = 100; + +// "Cosine%" decomp parameter has values from 0.9 to 1 by 0.001 +// But according to the UI spec for upload model floater, this parameter +// should be represented by Smooth combobox with only 10 values. +// So this const is used as a size of Smooth combobox list. +const S32 SMOOTH_VALUES_NUMBER = 10; +  void drawBoxOutline(const LLVector3& pos, const LLVector3& size); @@ -178,6 +198,13 @@ std::string lod_label_name[NUM_LOD+1] =  	"I went off the end of the lod_label_name array.  Me so smart."  }; +std::string colladaVersion[VERSIONTYPE_COUNT+1] =  +{ +	"1.4.0", +	"1.4.1", +	"Unsupported" +}; +  #define LL_DEGENERACY_TOLERANCE  1e-7f @@ -353,13 +380,16 @@ void LLMeshFilePicker::notify(const std::string& filename)  // LLFloaterModelPreview()  //-----------------------------------------------------------------------------  LLFloaterModelPreview::LLFloaterModelPreview(const LLSD& key) : -LLFloater(key) +LLFloaterModelUploadBase(key), +mUploadBtn(NULL), +mCalculateBtn(NULL)  {  	sInstance = this;  	mLastMouseX = 0;  	mLastMouseY = 0;  	mGLName = 0;  	mStatusLock = new LLMutex(NULL); +	mModelPreview = NULL;  	mLODMode[LLModel::LOD_HIGH] = 0;  	for (U32 i = 0; i < LLModel::LOD_HIGH; i++) @@ -378,32 +408,35 @@ BOOL LLFloaterModelPreview::postBuild()  		return FALSE;  	} -	childSetAction("lod_browse", onBrowseLOD, this); -  	childSetCommitCallback("cancel_btn", onCancel, this);  	childSetCommitCallback("crease_angle", onGenerateNormalsCommit, this); -	childSetCommitCallback("generate_normals", onGenerateNormalsCommit, this); +	getChild<LLCheckBoxCtrl>("gen_normals")->setCommitCallback(boost::bind(&LLFloaterModelPreview::toggleGenarateNormals, this));  	childSetCommitCallback("lod_generate", onAutoFillCommit, this); -	childSetCommitCallback("lod_mode", onLODParamCommit, this); -	childSetCommitCallback("lod_error_threshold", onLODParamCommit, this); -	childSetCommitCallback("lod_triangle_limit", onLODParamCommitTriangleLimit, this); -	childSetCommitCallback("build_operator", onLODParamCommit, this); -	childSetCommitCallback("queue_mode", onLODParamCommit, this); -	childSetCommitCallback("border_mode", onLODParamCommit, this); -	childSetCommitCallback("share_tolerance", onLODParamCommit, this); +	for (S32 lod = 0; lod <= LLModel::LOD_HIGH; ++lod) +	{ +		LLComboBox* lod_source_combo = getChild<LLComboBox>("lod_source_" + lod_name[lod]); +		lod_source_combo->setCommitCallback(boost::bind(&LLFloaterModelPreview::onLoDSourceCommit, this, lod)); +		lod_source_combo->setCurrentByIndex(mLODMode[lod]); + +		getChild<LLButton>("lod_browse_" + lod_name[lod])->setCommitCallback(boost::bind(&LLFloaterModelPreview::onBrowseLOD, this, lod)); +		getChild<LLComboBox>("lod_mode_" + lod_name[lod])->setCommitCallback(boost::bind(&LLFloaterModelPreview::onLODParamCommit, this, lod, false)); +		getChild<LLSpinCtrl>("lod_error_threshold_" + lod_name[lod])->setCommitCallback(boost::bind(&LLFloaterModelPreview::onLODParamCommit, this, lod, false)); +		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("upload_textures", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);  	childSetTextArg("status", "[STATUS]", getString("status_idle")); -	//childSetLabelArg("ok_btn", "[AMOUNT]", llformat("%d",sUploadAmount));  	childSetAction("ok_btn", onUpload, this);  	childDisable("ok_btn");  	childSetAction("reset_btn", onReset, this); -	childSetAction("clear_materials", onClearMaterials, this); -  	childSetCommitCallback("preview_lod_combo", onPreviewLODCommit, this);  	childSetCommitCallback("upload_skin", onUploadSkinCommit, this); @@ -412,28 +445,14 @@ BOOL LLFloaterModelPreview::postBuild()  	childSetCommitCallback("import_scale", onImportScaleCommit, this);  	childSetCommitCallback("pelvis_offset", onPelvisOffsetCommit, this); -	childSetCommitCallback("lod_file_or_limit", refresh, this); -	childSetCommitCallback("physics_load_radio", onPhysicsLoadRadioCommit, this); -	//childSetCommitCallback("physics_optimize", refresh, this); -	//childSetCommitCallback("physics_use_hull", refresh, this); +	getChild<LLCheckBoxCtrl>("show_edges")->setCommitCallback(boost::bind(&LLFloaterModelPreview::onViewOptionChecked, this, _1)); +	getChild<LLCheckBoxCtrl>("show_physics")->setCommitCallback(boost::bind(&LLFloaterModelPreview::onViewOptionChecked, this, _1)); +	getChild<LLCheckBoxCtrl>("show_textures")->setCommitCallback(boost::bind(&LLFloaterModelPreview::onViewOptionChecked, this, _1)); +	getChild<LLCheckBoxCtrl>("show_skin_weight")->setCommitCallback(boost::bind(&LLFloaterModelPreview::onViewOptionChecked, this, _1)); +	getChild<LLCheckBoxCtrl>("show_joint_positions")->setCommitCallback(boost::bind(&LLFloaterModelPreview::onViewOptionChecked, this, _1));  	childDisable("upload_skin");  	childDisable("upload_joints"); -	 -	childDisable("ok_btn"); - -	childSetCommitCallback("confirm_checkbox", refresh, this); - -	mViewOptionMenuButton = getChild<LLMenuButton>("options_gear_btn"); - -	mCommitCallbackRegistrar.add("ModelImport.ViewOption.Action", boost::bind(&LLFloaterModelPreview::onViewOptionChecked, this, _2)); -	mEnableCallbackRegistrar.add("ModelImport.ViewOption.Check", boost::bind(&LLFloaterModelPreview::isViewOptionChecked, this, _2)); -	mEnableCallbackRegistrar.add("ModelImport.ViewOption.Enabled", boost::bind(&LLFloaterModelPreview::isViewOptionEnabled, this, _2)); - - - -	mViewOptionMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_model_import_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); -	mViewOptionMenuButton->setMenu(mViewOptionMenu, LLMenuButton::MP_BOTTOM_LEFT);  	initDecompControls(); @@ -441,9 +460,7 @@ BOOL LLFloaterModelPreview::postBuild()  	mPreviewRect = preview_panel->getRect(); -	mModelPreview = new LLModelPreview(512, 512, this ); -	mModelPreview->setPreviewTarget(16.f); -	mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelPreview::setDetails, this, _1, _2, _3, _4, _5)); +	initModelPreview();  	//set callbacks for left click on line editor rows  	for (U32 i = 0; i <= LLModel::LOD_HIGH; i++) @@ -472,6 +489,25 @@ BOOL LLFloaterModelPreview::postBuild()  			text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));  		}  	} +	std::string current_grid = LLGridManager::getInstance()->getGridLabel(); +	std::transform(current_grid.begin(),current_grid.end(),current_grid.begin(),::tolower); +	std::string validate_url; +	if (current_grid == "agni") +	{ +		validate_url = "http://secondlife.com/my/account/mesh.php"; +	} +	else +	{ +		validate_url = llformat("http://secondlife.%s.lindenlab.com/my/account/mesh.php",current_grid.c_str()); +	} +	getChild<LLTextBox>("warning_message")->setTextArg("[VURL]", validate_url); + +	mUploadBtn = getChild<LLButton>("ok_btn"); +	mCalculateBtn = getChild<LLButton>("calculate_btn"); + +	mCalculateBtn->setClickedCallback(boost::bind(&LLFloaterModelPreview::onClickCalculateBtn, this)); + +	toggleCalculateButton(true);  	return TRUE;  } @@ -497,11 +533,24 @@ LLFloaterModelPreview::~LLFloaterModelPreview()  	mStatusLock = NULL;  } -void LLFloaterModelPreview::onViewOptionChecked(const LLSD& userdata) +void LLFloaterModelPreview::initModelPreview() +{ +	if (mModelPreview) +	{ +		delete mModelPreview; +	} + +	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)); +} + +void LLFloaterModelPreview::onViewOptionChecked(LLUICtrl* ctrl)  {  	if (mModelPreview)  	{ -		mModelPreview->mViewOption[userdata.asString()] = !mModelPreview->mViewOption[userdata.asString()]; +		mModelPreview->mViewOption[ctrl->getName()] = !mModelPreview->mViewOption[ctrl->getName()];  		mModelPreview->refresh();  	} @@ -519,12 +568,12 @@ bool LLFloaterModelPreview::isViewOptionChecked(const LLSD& userdata)  bool LLFloaterModelPreview::isViewOptionEnabled(const LLSD& userdata)  { -	return !mViewOptionDisabled[userdata.asString()]; +	return childIsEnabled(userdata.asString());  }  void LLFloaterModelPreview::setViewOptionEnabled(const std::string& option, bool enabled)  { -	mViewOptionDisabled[option] = !enabled; +	childSetEnabled(option, enabled);  }  void LLFloaterModelPreview::enableViewOption(const std::string& option) @@ -544,6 +593,30 @@ void LLFloaterModelPreview::loadModel(S32 lod)  	(new LLMeshFilePicker(mModelPreview, lod))->getFile();  } +void LLFloaterModelPreview::loadModel(S32 lod, const std::string& file_name, bool force_disable_slm) +{ +	mModelPreview->mLoading = true; + +	mModelPreview->loadModel(file_name, lod, force_disable_slm); +} + +void LLFloaterModelPreview::onClickCalculateBtn() +{ +	mModelPreview->rebuildUploadData(); + +	bool upload_skinweights = childGetValue("upload_skin").asBoolean(); +	bool upload_joint_positions = childGetValue("upload_joints").asBoolean(); + +	mUploadModelUrl.clear(); + +	gMeshRepo.uploadModel(mModelPreview->mUploadData, mModelPreview->mPreviewScale, +			childGetValue("upload_textures").asBoolean(), upload_skinweights, upload_joint_positions, mUploadModelUrl, false, +						  getWholeModelFeeObserverHandle()); + +	toggleCalculateButton(false); +	mUploadBtn->setEnabled(false); +} +  //static  void LLFloaterModelPreview::onImportScaleCommit(LLUICtrl*,void* userdata)  { @@ -554,7 +627,10 @@ void LLFloaterModelPreview::onImportScaleCommit(LLUICtrl*,void* userdata)  		return;  	} -	fp->mModelPreview->calcResourceCost(); +	fp->mModelPreview->mDirty = true; + +	fp->toggleCalculateButton(true); +  	fp->mModelPreview->refresh();  }  //static @@ -566,31 +642,12 @@ void LLFloaterModelPreview::onPelvisOffsetCommit( LLUICtrl*, void* userdata )  	{  		return;  	} -	fp->mModelPreview->calcResourceCost(); -	fp->mModelPreview->refresh(); -} -//static -void LLFloaterModelPreview::onPhysicsLoadRadioCommit( LLUICtrl*, void *userdata) -{ -	LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance; -	if (fmp) -	{ -		if (fmp->childGetValue("physics_use_lod").asBoolean()) -		{ -			onPhysicsUseLOD(NULL,NULL); -		} -		if (fmp->childGetValue("physics_load_from_file").asBoolean()) -		{ -			 -		} -		LLModelPreview *model_preview = fmp->mModelPreview; -		if (model_preview) -		{ -			model_preview->refresh(); -			model_preview->updateStatusMessages(); -		} -	} +	fp->mModelPreview->mDirty = true; + +	fp->toggleCalculateButton(true); + +	fp->mModelPreview->refresh();  }  //static @@ -615,8 +672,6 @@ void LLFloaterModelPreview::onUploadSkinCommit(LLUICtrl*,void* userdata)  	{  		return;  	} -	 -	fp->mModelPreview->calcResourceCost();  	fp->mModelPreview->refresh();  	fp->mModelPreview->resetPreviewTarget();  	fp->mModelPreview->clearBuffers(); @@ -649,6 +704,12 @@ void LLFloaterModelPreview::onGenerateNormalsCommit(LLUICtrl* ctrl, void* userda  	fp->mModelPreview->generateNormals();  } +void LLFloaterModelPreview::toggleGenarateNormals() +{ +	bool enabled = childGetValue("gen_normals").asBoolean(); +	childSetEnabled("crease_angle", enabled); +} +  //static  void LLFloaterModelPreview::onExplodeCommit(LLUICtrl* ctrl, void* userdata)  { @@ -665,18 +726,9 @@ void LLFloaterModelPreview::onAutoFillCommit(LLUICtrl* ctrl, void* userdata)  	fp->mModelPreview->genLODs();  } -//static -void LLFloaterModelPreview::onLODParamCommit(LLUICtrl* ctrl, void* userdata) -{ -	LLFloaterModelPreview* fp = (LLFloaterModelPreview*) userdata; -	fp->mModelPreview->onLODParamCommit(false); -} - -//static -void LLFloaterModelPreview::onLODParamCommitTriangleLimit(LLUICtrl* ctrl, void* userdata) +void LLFloaterModelPreview::onLODParamCommit(S32 lod, bool enforce_tri_limit)  { -	LLFloaterModelPreview* fp = (LLFloaterModelPreview*) userdata; -	fp->mModelPreview->onLODParamCommit(true); +	mModelPreview->onLODParamCommit(lod, enforce_tri_limit);  } @@ -700,6 +752,7 @@ void LLFloaterModelPreview::draw()  		if ( mModelPreview->getLoadState() == LLModelLoader::ERROR_PARSING )  		{  			childSetTextArg("status", "[STATUS]", getString("status_parse_error")); +			toggleCalculateButton(false);  		}  		else  		{ @@ -710,28 +763,6 @@ void LLFloaterModelPreview::draw()  	childSetTextArg("prim_cost", "[PRIM_COST]", llformat("%d", mModelPreview->mResourceCost));  	childSetTextArg("description_label", "[TEXTURES]", llformat("%d", mModelPreview->mTextureSet.size())); -	if (!mCurRequest.empty()) -	{ -		LLMutexLock lock(mStatusLock); -		childSetTextArg("status", "[STATUS]", mStatusMessage); -	} -	else -	{ -		childSetVisible("Simplify", true); -		childSetVisible("simplify_cancel", false); -		childSetVisible("Decompose", true); -		childSetVisible("decompose_cancel", false); -	} -	 -	U32 resource_cost = mModelPreview->mResourceCost*10; - -	if (childGetValue("upload_textures").asBoolean()) -	{ -		resource_cost += mModelPreview->mTextureSet.size()*10; -	} - -	childSetLabelArg("ok_btn", "[AMOUNT]", llformat("%d", resource_cost)); -  	if (mModelPreview)  	{  		gGL.color3f(1.f, 1.f, 1.f); @@ -864,6 +895,12 @@ BOOL LLFloaterModelPreview::handleScrollWheel(S32 x, S32 y, S32 clicks)  	return TRUE;  } +/*virtual*/ +void LLFloaterModelPreview::onOpen(const LLSD& key) +{ +	requestAgentUploadPermissions(); +} +  //static  void LLFloaterModelPreview::onPhysicsParamCommit(LLUICtrl* ctrl, void* data)  { @@ -877,20 +914,32 @@ void LLFloaterModelPreview::onPhysicsParamCommit(LLUICtrl* ctrl, void* data)  	{  		LLCDParam* param = (LLCDParam*) data;  		std::string name(param->mName); -		sInstance->mDecompParams[name] = ctrl->getValue(); + +		LLSD value = ctrl->getValue(); + +		if("Retain%" == name) +		{ +			value = ctrl->getValue().asReal() / RETAIN_COEFFICIENT; +		} + +		sInstance->mDecompParams[name] = value;  		if (name == "Simplify Method")  		{ -			 if (ctrl->getValue().asInteger() == 0) -			 { -				sInstance->childSetVisible("Retain%", true); -				sInstance->childSetVisible("Detail Scale", false); -			 } -			else +			bool show_retain = false; +			bool show_detail = true; + +			if (ctrl->getValue().asInteger() == 0)  			{ -				sInstance->childSetVisible("Retain%", false); -				sInstance->childSetVisible("Detail Scale", true); +				 show_retain = true; +				 show_detail = false;  			} + +			sInstance->childSetVisible("Retain%", show_retain); +			sInstance->childSetVisible("Retain%_label", show_retain); + +			sInstance->childSetVisible("Detail Scale", show_detail); +			sInstance->childSetVisible("Detail Scale label", show_detail);  		}  	}  } @@ -925,12 +974,14 @@ void LLFloaterModelPreview::onPhysicsStageExecute(LLUICtrl* ctrl, void* data)  			sInstance->setStatusMessage(sInstance->getString("decomposing"));  			sInstance->childSetVisible("Decompose", false);  			sInstance->childSetVisible("decompose_cancel", true); +			sInstance->childDisable("Simplify");  		}  		else if (stage == "Simplify")  		{  			sInstance->setStatusMessage(sInstance->getString("simplifying"));  			sInstance->childSetVisible("Simplify", false);  			sInstance->childSetVisible("simplify_cancel", true); +			sInstance->childDisable("Decompose");  		}  	}  } @@ -944,14 +995,38 @@ void LLFloaterModelPreview::onPhysicsBrowse(LLUICtrl* ctrl, void* userdata)  //static  void LLFloaterModelPreview::onPhysicsUseLOD(LLUICtrl* ctrl, void* userdata)  { +	S32 num_modes = 4;  	S32 which_mode = 3; +	static S32 previous_mode = which_mode; +  	LLCtrlSelectionInterface* iface = sInstance->childGetSelectionInterface("physics_lod_combo");  	if (iface)  	{  		which_mode = iface->getFirstSelectedIndex();  	} -	sInstance->mModelPreview->setPhysicsFromLOD(which_mode); +	S32 file_mode = iface->getItemCount() - 1; +	bool file_browse = which_mode == file_mode; +	bool lod_to_file = file_browse && (previous_mode != file_mode); +	bool file_to_lod = !file_browse && (previous_mode == file_mode); + +	if (!lod_to_file) +	{ +		which_mode = num_modes - which_mode; +		sInstance->mModelPreview->setPhysicsFromLOD(which_mode); +	} + +	if (lod_to_file || file_to_lod) +	{ +		LLModelPreview *model_preview = sInstance->mModelPreview; +		if (model_preview) +		{ +			model_preview->refresh(); +			model_preview->updateStatusMessages(); +		} +	} + +	previous_mode = which_mode;  }  //static  @@ -976,6 +1051,11 @@ void LLFloaterModelPreview::onPhysicsStageCancel(LLUICtrl* ctrl, void*data)  		}  		sInstance->mCurRequest.clear(); + +		if (sInstance->mModelPreview) +		{ +			sInstance->mModelPreview->updateStatusMessages(); +		}  	}  } @@ -1038,8 +1118,9 @@ void LLFloaterModelPreview::initDecompControls()  				mDecompParams[param[i].mName] = LLSD(param[i].mDefault.mFloat);  				//llinfos << "Type: float, Default: " << param[i].mDefault.mFloat << llendl; -				LLSliderCtrl* slider = getChild<LLSliderCtrl>(name); -				if (slider) + +				LLUICtrl* ctrl = getChild<LLUICtrl>(name); +				if (LLSliderCtrl* slider = dynamic_cast<LLSliderCtrl*>(ctrl))  				{  					slider->setMinValue(param[i].mDetails.mRange.mLow.mFloat);  					slider->setMaxValue(param[i].mDetails.mRange.mHigh.mFloat); @@ -1047,14 +1128,49 @@ void LLFloaterModelPreview::initDecompControls()  					slider->setValue(param[i].mDefault.mFloat);  					slider->setCommitCallback(onPhysicsParamCommit, (void*) ¶m[i]);  				} +				else if (LLSpinCtrl* spinner = dynamic_cast<LLSpinCtrl*>(ctrl)) +				{ +					bool is_retain_ctrl = "Retain%" == name; +					double coefficient = is_retain_ctrl ? RETAIN_COEFFICIENT : 1.f; + +					spinner->setMinValue(param[i].mDetails.mRange.mLow.mFloat * coefficient); +					spinner->setMaxValue(param[i].mDetails.mRange.mHigh.mFloat * coefficient); +					spinner->setIncrement(param[i].mDetails.mRange.mDelta.mFloat * coefficient); +					spinner->setValue(param[i].mDefault.mFloat * coefficient); +					spinner->setCommitCallback(onPhysicsParamCommit, (void*) ¶m[i]); +				} +				else if (LLComboBox* combo_box = dynamic_cast<LLComboBox*>(ctrl)) +				{ +					float min = param[i].mDetails.mRange.mLow.mFloat; +					float max = param[i].mDetails.mRange.mHigh.mFloat; +					float delta = param[i].mDetails.mRange.mDelta.mFloat; + +					if ("Cosine%" == name) +					{ +						createSmoothComboBox(combo_box, min, max); +					} +					else +					{ +						for(float value = min; value <= max; value += delta) +						{ +							std::string label = llformat("%.1f", value); +							combo_box->add(label, value, ADD_BOTTOM, true); +						} +						combo_box->setValue(param[i].mDefault.mFloat); + +					} + +					combo_box->setCommitCallback(onPhysicsParamCommit, (void*) ¶m[i]); +				}  			}  			else if (param[i].mType == LLCDParam::LLCD_INTEGER)  			{  				mDecompParams[param[i].mName] = LLSD(param[i].mDefault.mIntOrEnumValue);  				//llinfos << "Type: integer, Default: " << param[i].mDefault.mIntOrEnumValue << llendl; -				LLSliderCtrl* slider = getChild<LLSliderCtrl>(name); -				if (slider) + +				LLUICtrl* ctrl = getChild<LLUICtrl>(name); +				if (LLSliderCtrl* slider = dynamic_cast<LLSliderCtrl*>(ctrl))  				{  					slider->setMinValue(param[i].mDetails.mRange.mLow.mIntOrEnumValue);  					slider->setMaxValue(param[i].mDetails.mRange.mHigh.mIntOrEnumValue); @@ -1062,6 +1178,16 @@ void LLFloaterModelPreview::initDecompControls()  					slider->setValue(param[i].mDefault.mIntOrEnumValue);  					slider->setCommitCallback(onPhysicsParamCommit, (void*) ¶m[i]);  				} +				else if (LLComboBox* combo_box = dynamic_cast<LLComboBox*>(ctrl)) +				{ +					for(int k = param[i].mDetails.mRange.mLow.mIntOrEnumValue; k<=param[i].mDetails.mRange.mHigh.mIntOrEnumValue; k+=param[i].mDetails.mRange.mDelta.mIntOrEnumValue) +					{ +						std::string name = llformat("%.1d", k); +						combo_box->add(name, k, ADD_BOTTOM, true); +					} +					combo_box->setValue(param[i].mDefault.mIntOrEnumValue); +					combo_box->setCommitCallback(onPhysicsParamCommit, (void*) ¶m[i]); +				}  			}  			else if (param[i].mType == LLCDParam::LLCD_BOOLEAN)  			{ @@ -1089,7 +1215,11 @@ void LLFloaterModelPreview::initDecompControls()  						//llinfos << param[i].mDetails.mEnumValues.mEnumsArray[k].mValue  						//	<< " - " << param[i].mDetails.mEnumValues.mEnumsArray[k].mName << llendl; -						combo_box->add(param[i].mDetails.mEnumValues.mEnumsArray[k].mName, +						std::string name(param[i].mDetails.mEnumValues.mEnumsArray[k].mName); +						std::string localized_name; +						bool is_localized = LLTrans::findString(localized_name, name); + +						combo_box->add(is_localized ? localized_name : name,  							LLSD::Integer(param[i].mDetails.mEnumValues.mEnumsArray[k].mValue));  					}  					combo_box->setValue(param[i].mDefault.mIntOrEnumValue); @@ -1105,6 +1235,22 @@ void LLFloaterModelPreview::initDecompControls()  	childSetCommitCallback("physics_explode", LLFloaterModelPreview::onExplodeCommit, this);  } +void LLFloaterModelPreview::createSmoothComboBox(LLComboBox* combo_box, float min, float max) +{ +	float delta = (max - min) / SMOOTH_VALUES_NUMBER; +	int ilabel = 0; + +	combo_box->add("0 (none)", ADD_BOTTOM, true); + +	for(float value = min + delta; value < max; value += delta) +	{ +		std::string label = (++ilabel == SMOOTH_VALUES_NUMBER) ? "10 (max)" : llformat("%.1d", ilabel); +		combo_box->add(label, value, ADD_BOTTOM, true); +	} + + +} +  //-----------------------------------------------------------------------------  // onMouseCaptureLost()  //----------------------------------------------------------------------------- @@ -1329,9 +1475,26 @@ bool LLModelLoader::doLoadModel()  	if (!dom)  	{ +		llinfos<<" Error with dae - traditionally indicates a corrupt file."<<llendl; +		setLoadState( ERROR_PARSING );  		return false;  	} - +	//Dom version +	daeString domVersion = dae.getDomVersion(); +	std::string sldom(domVersion); +	llinfos<<"Collada Importer Version: "<<sldom<<llendl; +	//Dae version +	domVersionType docVersion = dom->getVersion(); +	//0=1.4 +	//1=1.4.1 +	//2=Currently unsupported, however may work +	if (docVersion > 1 )  +	{  +		docVersion = VERSIONTYPE_COUNT; +	} +	llinfos<<"Dae version "<<colladaVersion[docVersion]<<llendl; +	 +	  	daeDatabase* db = dae.getDatabase();  	daeInt count = db->getElementCount(NULL, COLLADA_TYPE_MESH); @@ -1480,8 +1643,7 @@ bool LLModelLoader::doLoadModel()  							LLMatrix4 trans = normalized_transformation;  							trans *= skin_info.mBindShapeMatrix; -							skin_info.mBindShapeMatrix = trans; -							 +							skin_info.mBindShapeMatrix = trans;							  						} @@ -1554,7 +1716,7 @@ bool LLModelLoader::doLoadModel()  								{  									//Build a joint for the resolver to work with  									char str[64]={0}; -									sprintf(str,"./%s",(*jointIt).second.c_str() ); +									sprintf(str,"./%s",(*jointIt).first.c_str() );  									//llwarns<<"Joint "<< str <<llendl;  									//Setup the resolver @@ -1565,15 +1727,22 @@ bool LLModelLoader::doLoadModel()                                      if ( pJoint )                                      {  										//Pull out the translate id and store it in the jointTranslations map -										daeSIDResolver jointResolver( pJoint, "./translate" ); -										domTranslate* pTranslate = daeSafeCast<domTranslate>( jointResolver.getElement() ); +										daeSIDResolver jointResolverA( pJoint, "./translate" ); +										domTranslate* pTranslateA = daeSafeCast<domTranslate>( jointResolverA.getElement() ); +										daeSIDResolver jointResolverB( pJoint, "./location" ); +										domTranslate* pTranslateB = daeSafeCast<domTranslate>( jointResolverB.getElement() );  										LLMatrix4 workingTransform;  										//Translation via SID -										if ( pTranslate ) +										if ( pTranslateA ) +										{ +											extractTranslation( pTranslateA, workingTransform ); +										} +										else +										if ( pTranslateB )  										{ -											extractTranslation( pTranslate, workingTransform ); +											extractTranslation( pTranslateB, workingTransform );  										}  										else  										{ @@ -1585,9 +1754,15 @@ bool LLModelLoader::doLoadModel()  												missingSkeletonOrScene = true;  											}  											else +											if ( pTranslateElement )  											{  												extractTranslationViaElement( pTranslateElement, workingTransform );  											} +											else +											{ +												extractTranslationViaSID( pJoint, workingTransform ); +											} +  										}  										//Store the joint transform w/respect to it's name. @@ -1684,7 +1859,7 @@ bool LLModelLoader::doLoadModel()  												}  											} -											model->mSkinInfo.mInvBindMatrix.push_back(mat); +											model->mSkinInfo.mInvBindMatrix.push_back(mat);											  										}  									}  								} @@ -1692,7 +1867,7 @@ bool LLModelLoader::doLoadModel()  						}  						//Now that we've parsed the joint array, let's determine if we have a full rig -						//(which means we have all the joints that are required for an avatar versus +						//(which means we have all the joint sthat are required for an avatar versus  						//a skinned asset attached to a node in a file that contains an entire skeleton,  						//but does not use the skeleton).						  						buildJointToNodeMappingFromScene( root ); @@ -1883,8 +2058,11 @@ bool LLModelLoader::doLoadModel()  								mesh_scale *= transformation;  								transformation = mesh_scale; -								std::vector<LLImportMaterial> materials; -								materials.resize(model->getNumVolumeFaces()); +								std::map<std::string, LLImportMaterial> materials; +								for (U32 i = 0; i < model->mMaterialList.size(); ++i) +								{ +									materials[model->mMaterialList[i]] = LLImportMaterial(); +								}  								mScene[transformation].push_back(LLModelInstance(model, model->mLabel, transformation, materials));  								stretch_extents(model, transformation, mExtents[0], mExtents[1], mFirstTransform);  							} @@ -1946,6 +2124,11 @@ bool LLModelLoader::loadFromSLM(const std::string& filename)  	//build model list for each LoD  	model_list model[LLModel::NUM_LODS]; +	if (data["version"].asInteger() != SLM_SUPPORTED_VERSION) +	{  //unsupported version +		return false; +	} +  	LLSD& mesh = data["mesh"];  	LLVolumeParams volume_params; @@ -1968,10 +2151,6 @@ bool LLModelLoader::loadFromSLM(const std::string& filename)  					mPreview->critiqueRigForUploadApplicability( loaded_model->mSkinInfo.mJointNames );					  				}  			} -			else -			{ -				llassert(model[lod].empty()); -			}  		}  	}	 @@ -1980,6 +2159,14 @@ bool LLModelLoader::loadFromSLM(const std::string& filename)  		return false;  	} +	// Set name. +	std::string name = data["name"]; +	if (!name.empty()) +	{ +		model[LLModel::LOD_HIGH][0]->mLabel = name; +	} +	 +  	//load instance list  	model_instance_list instance_list; @@ -2092,15 +2279,37 @@ void LLModelLoader::processJointToNodeMapping( domNode* pNode )  			mJointsFromNode.push_front( pNode->getName() );  		}  		//2. Handle the kiddo's -		daeTArray< daeSmartRef<daeElement> > childOfChild = pNode->getChildren(); -		S32 childOfChildCount = childOfChild.getCount(); -		for (S32 i = 0; i < childOfChildCount; ++i) +		processChildJoints( pNode ); +	} +	else +	{ +		//Determine if the're any children wrt to this failed node. +		//This occurs when an armature is exported and ends up being what essentially amounts to +		//as the root for the visual_scene +		if ( pNode )   		{ -			domNode* pChildNode = daeSafeCast<domNode>( childOfChild[i] ); -			if ( pChildNode ) -			{ -				processJointToNodeMapping( pChildNode ); -			} +			processChildJoints( pNode ); +		} +		else  +		{ +			llinfos<<"Node is NULL"<<llendl; +		} + +	} +} +//----------------------------------------------------------------------------- +// processChildJoint() +//----------------------------------------------------------------------------- +void LLModelLoader::processChildJoints( domNode* pParentNode ) +{	 +	daeTArray< daeSmartRef<daeElement> > childOfChild = pParentNode->getChildren(); +	S32 childOfChildCount = childOfChild.getCount(); +	for (S32 i = 0; i < childOfChildCount; ++i) +	{ +		domNode* pChildNode = daeSafeCast<domNode>( childOfChild[i] ); +		if ( pChildNode ) +		{ +			processJointToNodeMapping( pChildNode );  		}  	}  } @@ -2125,15 +2334,11 @@ void LLModelPreview::critiqueRigForUploadApplicability( const std::vector<std::s  		setRigValidForJointPositionUpload( true );  	} -	if ( isRigLegacyOK ) -	{ +	if ( isRigLegacyOK)  +	{	  		setLegacyRigValid( true );  	} -	if ( getRigWithSceneParity() && isJointPositionUploadOK ) -	{ -		setResetJointFlag( true ); -	}  }  //-----------------------------------------------------------------------------  // critiqueJointToNodeMappingFromScene() @@ -2173,12 +2378,7 @@ void LLModelPreview::critiqueJointToNodeMappingFromScene( void  )  	//2. Partial rig but w/o parity between the scene and joint array  	if ( result )  	{		 -		setResetJointFlag( true );  		setRigWithSceneParity( true ); -	} -	else -	{ -		setResetJointFlag( false );  	}	  }  //----------------------------------------------------------------------------- @@ -2267,14 +2467,17 @@ void LLModelLoader::loadTextures()  	{  		for(U32 i = 0 ; i < iter->second.size(); i++)  		{ -			for(U32 j = 0 ; j < iter->second[i].mMaterial.size() ; j++) +			for(std::map<std::string, LLImportMaterial>::iterator j = iter->second[i].mMaterial.begin(); +				j != iter->second[i].mMaterial.end(); ++j)  			{ -				if(!iter->second[i].mMaterial[j].mDiffuseMapFilename.empty()) +				LLImportMaterial& material = j->second; + +				if(!material.mDiffuseMapFilename.empty())  				{ -					iter->second[i].mMaterial[j].mDiffuseMap =  -						LLViewerTextureManager::getFetchedTextureFromUrl("file://" + iter->second[i].mMaterial[j].mDiffuseMapFilename, TRUE, LLViewerTexture::BOOST_PREVIEW); -					iter->second[i].mMaterial[j].mDiffuseMap->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, TRUE, FALSE, mPreview, NULL, FALSE); -					iter->second[i].mMaterial[j].mDiffuseMap->forceToSaveRawImage(0, F32_MAX); +					material.mDiffuseMap =  +						LLViewerTextureManager::getFetchedTextureFromUrl("file://" + material.mDiffuseMapFilename, TRUE, LLViewerTexture::BOOST_PREVIEW); +					material.mDiffuseMap->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, TRUE, FALSE, mPreview, NULL, FALSE); +					material.mDiffuseMap->forceToSaveRawImage(0, F32_MAX);  					mNumOfFetchingTextures++ ;  				}  			} @@ -2292,8 +2495,20 @@ void LLModelLoader::loadTextures()  //-----------------------------------------------------------------------------  bool LLModelLoader::isNodeAJoint( domNode* pNode )  { -	if ( !pNode || pNode->getName() == NULL) +	if ( !pNode )  	{ +		llinfos<<"Created node is NULL"<<llendl; +		return false; +	} +	 +	if ( pNode->getName() == NULL ) +	{ +		llinfos<<"Parsed node has no name "<<llendl; +		//Attempt to write the node id, if possible (aids in debugging the visual scene) +		if ( pNode->getId() ) +		{ +			llinfos<<"Parsed node ID: "<<pNode->getId()<<llendl; +		}  		return false;  	} @@ -2403,10 +2618,43 @@ void LLModelLoader::extractTranslation( domTranslate* pTranslate, LLMatrix4& tra  //-----------------------------------------------------------------------------  void LLModelLoader::extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform )  { -	domTranslate* pTranslateChild = dynamic_cast<domTranslate*>( pTranslateElement ); -	domFloat3 translateChild = pTranslateChild->getValue(); -	LLVector3 singleJointTranslation( translateChild[0], translateChild[1], translateChild[2] ); -	transform.setTranslation( singleJointTranslation ); +	if ( pTranslateElement ) +	{ +		domTranslate* pTranslateChild = dynamic_cast<domTranslate*>( pTranslateElement ); +		domFloat3 translateChild = pTranslateChild->getValue(); +		LLVector3 singleJointTranslation( translateChild[0], translateChild[1], translateChild[2] ); +		transform.setTranslation( singleJointTranslation ); +	}	 +} +//----------------------------------------------------------------------------- +// extractTranslationViaSID() +//----------------------------------------------------------------------------- +void LLModelLoader::extractTranslationViaSID( daeElement* pElement, LLMatrix4& transform ) +{ +	if ( pElement ) +	{	 +		daeSIDResolver resolver( pElement, "./transform" ); +		domMatrix* pMatrix = daeSafeCast<domMatrix>( resolver.getElement() ); +		//We are only extracting out the translational component atm +		LLMatrix4 workingTransform; +		if ( pMatrix ) +		{ +			domFloat4x4 domArray = pMatrix->getValue();									 +			for ( int i = 0; i < 4; i++ ) +			{ +				for( int j = 0; j < 4; j++ ) +				{ +					workingTransform.mMatrix[i][j] = domArray[i + j*4]; +				} +			} +			LLVector3 trans = workingTransform.getTranslation(); +			transform.setTranslation( trans );	 +		} +	} +	else +	{ +		llwarns<<"Element is nonexistent - empty/unsupported node."<<llendl; +	}  }  //-----------------------------------------------------------------------------  // processJointNode() @@ -2426,13 +2674,20 @@ void LLModelLoader::processJointNode( domNode* pNode, JointTransformMap& jointTr  	LLMatrix4 workingTransform;  	//Pull out the translate id and store it in the jointTranslations map -	daeSIDResolver jointResolver( pNode, "./translate" ); -	domTranslate* pTranslate = daeSafeCast<domTranslate>( jointResolver.getElement() ); +	daeSIDResolver jointResolverA( pNode, "./translate" ); +	domTranslate* pTranslateA = daeSafeCast<domTranslate>( jointResolverA.getElement() ); +	daeSIDResolver jointResolverB( pNode, "./location" ); +	domTranslate* pTranslateB = daeSafeCast<domTranslate>( jointResolverB.getElement() );  	//Translation via SID was successful -	if ( pTranslate ) +	if ( pTranslateA )  	{ -		extractTranslation( pTranslate, workingTransform ); +		extractTranslation( pTranslateA, workingTransform ); +	} +	else +	if ( pTranslateB ) +	{ +		extractTranslation( pTranslateB, workingTransform );  	}  	else  	{ @@ -2574,7 +2829,13 @@ void LLModelLoader::processElement( daeElement* element, bool& badElement )  				{  					LLMatrix4 transformation = mTransform; -					std::vector<LLImportMaterial> materials = getMaterials(model, instance_geo); +					if (mTransform.determinant() < 0) +					{ //negative scales are not supported +						llinfos << "Negative scale detected, unsupported transform.  domInstance_geometry: " << LLModel::getElementLabel(instance_geo) << llendl; +						badElement = true; +					} +					 +					std::map<std::string, LLImportMaterial> materials = getMaterials(model, instance_geo);  					// adjust the transformation to compensate for mesh normalization  					LLVector3 mesh_scale_vector; @@ -2618,7 +2879,8 @@ void LLModelLoader::processElement( daeElement* element, bool& badElement )  	//process children  	daeTArray< daeSmartRef<daeElement> > children = element->getChildren(); -	for (S32 i = 0; i < children.getCount(); i++) +	int childCount = children.getCount(); +	for (S32 i = 0; i < childCount; i++)  	{  		processElement(children[i],badElement);  	} @@ -2630,9 +2892,9 @@ void LLModelLoader::processElement( daeElement* element, bool& badElement )  	}  } -std::vector<LLImportMaterial> LLModelLoader::getMaterials(LLModel* model, domInstance_geometry* instance_geo) +std::map<std::string, LLImportMaterial> LLModelLoader::getMaterials(LLModel* model, domInstance_geometry* instance_geo)  { -	std::vector<LLImportMaterial> materials; +	std::map<std::string, LLImportMaterial> materials;  	for (int i = 0; i < model->mMaterialList.size(); i++)  	{  		LLImportMaterial import_material; @@ -2679,7 +2941,8 @@ std::vector<LLImportMaterial> LLModelLoader::getMaterials(LLModel* model, domIns  			}  		} -		materials.push_back(import_material); +		import_material.mBinding = model->mMaterialList[i]; +		materials[model->mMaterialList[i]] = import_material;  	}  	return materials; @@ -2917,15 +3180,6 @@ U32 LLModelPreview::calcResourceCost()  	rebuildUploadData(); -	if (mFMP && mModelLoader) -	{ -		const BOOL confirmed_checkbox = mFMP->getChild<LLCheckBoxCtrl>("confirm_checkbox")->getValue().asBoolean(); -		if ( getLoadState() < LLModelLoader::ERROR_PARSING && confirmed_checkbox ) -		{ -			mFMP->childEnable("ok_btn"); -		} -	} -  	//Upload skin is selected BUT check to see if the joints coming in from the asset were malformed.  	if ( mFMP && mFMP->childGetValue("upload_skin").asBoolean() )  	{ @@ -2933,16 +3187,9 @@ U32 LLModelPreview::calcResourceCost()  		if ( uploadingJointPositions && !isRigValidForJointPositionUpload() )  		{  			mFMP->childDisable("ok_btn");		 -		} -		else -		if ( !isLegacyRigValid() ) -		{ -			mFMP->childDisable("ok_btn"); -		} -		//ok_btn should not have been changed unless something was wrong with joint list +		}		  	} -	U32 cost = 0;  	std::set<LLModel*> accounted;  	U32 num_points = 0;  	U32 num_hulls = 0; @@ -2990,8 +3237,7 @@ U32 LLModelPreview::calcResourceCost()  					   mFMP->childGetValue("upload_skin").asBoolean(),  					   mFMP->childGetValue("upload_joints").asBoolean(),  					   TRUE); -			cost += gMeshRepo.calcResourceCost(ret); - +			  			num_hulls += decomp.mHull.size();  			for (U32 i = 0; i < decomp.mHull.size(); ++i)  			{ @@ -3011,7 +3257,7 @@ U32 LLModelPreview::calcResourceCost()  			F32 z_length = z_transformed.normalize();  			LLVector3 scale = LLVector3(x_length, y_length, z_length); -			F32 radius = scale.length()*debug_scale; +			F32 radius = scale.length()*0.5f*debug_scale;  			streaming_cost += LLMeshRepository::getStreamingCost(ret, radius);  		} @@ -3023,16 +3269,15 @@ U32 LLModelPreview::calcResourceCost()  	updateStatusMessages(); -	return cost; +	return (U32) streaming_cost;  }  void LLFloaterModelPreview::setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost)  { +	assert_main_thread();  	childSetTextArg("import_dimensions", "[X]", llformat("%.3f", x));  	childSetTextArg("import_dimensions", "[Y]", llformat("%.3f", y));  	childSetTextArg("import_dimensions", "[Z]", llformat("%.3f", z)); -	childSetTextArg("streaming cost", "[COST]", llformat("%.3f", streaming_cost)); -	childSetTextArg("physics cost", "[COST]", llformat("%.3f", physics_cost));	  } @@ -3047,14 +3292,10 @@ 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"); -	if (!scale_spinner) -	{ -		llerrs << "floater_model_preview.xml MUST contain import_scale spinner." << llendl; -	} -  	F32 scale = scale_spinner->getValue().asReal();  	LLMatrix4 scale_mat; @@ -3062,10 +3303,23 @@ void LLModelPreview::rebuildUploadData()  	F32 max_scale = 0.f; -	const BOOL confirmed_checkbox = mFMP->getChild<LLCheckBoxCtrl>("confirm_checkbox")->getValue().asBoolean(); -	if ( mBaseScene.size() > 0 && confirmed_checkbox ) +	//reorder materials to match mBaseModel +	for (U32 i = 0; i < LLModel::NUM_LODS; i++)  	{ -		mFMP->childEnable("ok_btn"); +		if (mBaseModel.size() == mModel[i].size()) +		{ +			for (U32 j = 0; j < mBaseModel.size(); ++j) +			{ +				 +				int refFaceCnt = 0; +				int modelFaceCnt = 0; +				 +				if ( !mModel[i][j]->matchMaterialOrder(mBaseModel[j], refFaceCnt, modelFaceCnt ) ) +				{ +					mFMP->childDisable( "calculate_btn" ); +				} +			} +		}  	}  	for (LLModelLoader::scene::iterator iter = mBaseScene.begin(); iter != mBaseScene.end(); ++iter) @@ -3096,6 +3350,7 @@ void LLModelPreview::rebuildUploadData()  			if (base_model)  			{  				base_model->mRequestedLabel = requested_name; +				base_model->mMetric = metric;  			}  			S32 idx = 0; @@ -3107,24 +3362,33 @@ void LLModelPreview::rebuildUploadData()  				}  			} -			for (U32 i = 0; i < LLModel::NUM_LODS; i++) -			{ //fill LOD slots based on reference model index -				if (!mModel[i].empty()) -				{ -					instance.mLOD[i] = mModel[i][idx]; -				} -				else -				{ -					instance.mLOD[i] = NULL; +			if(idx < mBaseModel.size()) +			{ +				for (U32 i = 0; i < LLModel::NUM_LODS; i++) +				{ //fill LOD slots based on reference model index +					if (mModel[i].size() > idx) +					{ +						instance.mLOD[i] = mModel[i][idx]; +					} +					else +					{ +						instance.mLOD[i] = NULL; +					}  				}  			} -  			instance.mTransform = mat;  			mUploadData.push_back(instance);  		}  	} -	F32 max_import_scale = DEFAULT_MAX_PRIM_SCALE/max_scale; +	F32 max_import_scale = (DEFAULT_MAX_PRIM_SCALE-0.1f)/max_scale; + +	F32 max_axis = llmax(mPreviewScale.mV[0], mPreviewScale.mV[1]); +	max_axis = llmax(max_axis, mPreviewScale.mV[2]); +	max_axis *= 2.f; + +	//clamp scale so that total imported model bounding box is smaller than 240m on a side +	max_import_scale = llmin(max_import_scale, 240.f/max_axis);  	scale_spinner->setMaxValue(max_import_scale); @@ -3164,6 +3428,12 @@ void LLModelPreview::saveUploadData(const std::string& filename, bool save_skinw  	LLSD data; +	data["version"] = SLM_SUPPORTED_VERSION; +	if (!mBaseModel.empty()) +	{ +		data["name"] = mBaseModel[0]->getName(); +	} +  	S32 mesh_id = 0;  	//build list of unique models and initialize local id @@ -3190,7 +3460,7 @@ void LLModelPreview::saveUploadData(const std::string& filename, bool save_skinw  				instance.mLOD[LLModel::LOD_LOW],   				instance.mLOD[LLModel::LOD_IMPOSTOR],   				decomp,  -				save_skinweights, save_joint_positions); +				save_skinweights, save_joint_positions, FALSE, TRUE);  			data["mesh"][instance.mModel->mLocalID] = str.str(); @@ -3217,12 +3487,19 @@ void LLModelPreview::clearModel(S32 lod)  	mScene[lod].clear();  } -void LLModelPreview::loadModel(std::string filename, S32 lod) +void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable_slm)  {  	assert_main_thread();  	LLMutexLock lock(this); +	if (lod < LLModel::LOD_IMPOSTOR || lod > LLModel::NUM_LODS - 1) +	{ +		llwarns << "Invalid level of detail: " << lod << llendl; +		assert(lod >= LLModel::LOD_IMPOSTOR && lod < LLModel::NUM_LODS); +		return; +	} +  	// This triggers if you bring up the file picker and then hit CANCEL.  	// Just use the previous model (if any) and ignore that you brought up  	// the file picker. @@ -3254,6 +3531,11 @@ void LLModelPreview::loadModel(std::string filename, S32 lod)  	mModelLoader = new LLModelLoader(filename, lod, this, mJointTransformMap, mJointsFromNode ); +	if (force_disable_slm) +	{ +		mModelLoader->mTrySLM = false; +	} +  	mModelLoader->start();  	mFMP->childSetTextArg("status", "[STATUS]", mFMP->getString("status_reading_file")); @@ -3263,11 +3545,12 @@ void LLModelPreview::loadModel(std::string filename, S32 lod)  	if ( getLoadState() >= LLModelLoader::ERROR_PARSING )  	{  		mFMP->childDisable("ok_btn"); +		mFMP->childDisable( "calculate_btn" );  	}  	if (lod == mPreviewLOD)  	{ -		mFMP->childSetText("lod_file", mLODFile[mPreviewLOD]); +		mFMP->childSetText("lod_file_" + lod_name[lod], mLODFile[lod]);  	}  	else if (lod == LLModel::LOD_PHYSICS)  	{ @@ -3296,6 +3579,12 @@ void LLModelPreview::setPhysicsFromLOD(S32 lod)  void LLModelPreview::clearIncompatible(S32 lod)  { +	//Don't discard models if specified model is the physic rep +	if ( lod == LLModel::LOD_PHYSICS ) +	{ +		return; +	} +  	for (U32 i = 0; i <= LLModel::LOD_HIGH; i++)  	{ //clear out any entries that aren't compatible with this model  		if (i != lod) @@ -3468,7 +3757,17 @@ void LLModelPreview::loadModelCallback(S32 lod)  	mLoading = false;  	if (mFMP) +	{  		mFMP->getChild<LLCheckBoxCtrl>("confirm_checkbox")->set(FALSE); +		if (!mBaseModel.empty()) +		{ +			if (mFMP->getChild<LLUICtrl>("description_form")->getValue().asString().empty()) +			{ +				const std::string& model_name = mBaseModel[0]->getName(); +				mFMP->getChild<LLUICtrl>("description_form")->setValue(model_name); +			} +		} +	}  	refresh();  	mModelLoadedSignal(); @@ -3524,45 +3823,16 @@ void LLModelPreview::generateNormals()  	updateStatusMessages();  } -void LLModelPreview::clearMaterials() +void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_limit)  { -	for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter) -	{ //for each transform in current scene -		for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter) -		{ //for each instance with that transform -			LLModelInstance& source_instance = *model_iter; -			LLModel* source = source_instance.mModel; - -			for (S32 i = 0; i < source->getNumVolumeFaces(); ++i) -			{ //for each face in instance -				LLImportMaterial& source_material = source_instance.mMaterial[i]; - -				//clear material info -				source_material.mDiffuseColor = LLColor4(1,1,1,1); -				source_material.mDiffuseMap = NULL; -				source_material.mDiffuseMapFilename.clear(); -				source_material.mDiffuseMapLabel.clear(); -				source_material.mFullbright = false; -			} -		} -	} - -	mVertexBuffer[mPreviewLOD].clear(); - -	if (mPreviewLOD == LLModel::LOD_HIGH) +	// Allow LoD from -1 to LLModel::LOD_PHYSICS +	if (which_lod < -1 || which_lod > LLModel::NUM_LODS - 1)  	{ -		mBaseScene = mScene[mPreviewLOD]; -		mBaseModel = mModel[mPreviewLOD]; -		clearGLODGroup(); -		mVertexBuffer[5].clear(); +		llwarns << "Invalid level of detail: " << which_lod << llendl; +		assert(which_lod >= -1 && which_lod < LLModel::NUM_LODS); +		return;  	} -	mResourceCost = calcResourceCost(); -	refresh(); -} - -void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_limit) -{  	if (mBaseModel.empty())  	{  		return; @@ -3592,111 +3862,41 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim  	U32 lod_mode = 0; -	LLCtrlSelectionInterface* iface = mFMP->childGetSelectionInterface("lod_mode"); -	if (iface) -	{ -		lod_mode = iface->getFirstSelectedIndex(); -	} -	mRequestedLoDMode[mPreviewLOD] = lod_mode; - -	F32 lod_error_threshold = mFMP->childGetValue("lod_error_threshold").asReal(); +	F32 lod_error_threshold = 0; -	if (lod_mode == 0) +	// The LoD should be in range from Lowest to High +	if (which_lod > -1 && which_lod < NUM_LOD)  	{ -		lod_mode = GLOD_TRIANGLE_BUDGET; -		if (which_lod != -1) +		LLCtrlSelectionInterface* iface = mFMP->childGetSelectionInterface("lod_mode_" + lod_name[which_lod]); +		if (iface)  		{ -			limit = mFMP->childGetValue("lod_triangle_limit").asInteger(); +			lod_mode = iface->getFirstSelectedIndex();  		} -	} -	else -	{ -		lod_mode = GLOD_ERROR_THRESHOLD; -	} - -	U32 build_operator = 0; -	iface = mFMP->childGetSelectionInterface("build_operator"); -	if (iface) -	{ -		build_operator = iface->getFirstSelectedIndex(); +		lod_error_threshold = mFMP->childGetValue("lod_error_threshold_" + lod_name[which_lod]).asReal();  	} -	mRequestedBuildOperator[mPreviewLOD] = build_operator;  -	if (build_operator == 0) -	{ -		build_operator = GLOD_OPERATOR_EDGE_COLLAPSE; -	} -	else -	{ -		build_operator = GLOD_OPERATOR_HALF_EDGE_COLLAPSE; -	} - -	U32 queue_mode=0; -	iface = mFMP->childGetSelectionInterface("queue_mode"); -	if (iface) -	{ -		queue_mode = iface->getFirstSelectedIndex(); -	} -	mRequestedQueueMode[mPreviewLOD] = queue_mode; - -	if (queue_mode == 0) -	{ -		queue_mode = GLOD_QUEUE_GREEDY; -	} -	else if (queue_mode == 1) -	{ -		queue_mode = GLOD_QUEUE_LAZY; -	} -	else +	if (which_lod != -1)  	{ -		queue_mode = GLOD_QUEUE_INDEPENDENT; +		mRequestedLoDMode[which_lod] = lod_mode;  	} -	U32 border_mode = 0; - -	iface = mFMP->childGetSelectionInterface("border_mode"); -	if (iface) +	if (lod_mode == 0)  	{ -		border_mode = iface->getFirstSelectedIndex(); -	} -	mRequestedBorderMode[mPreviewLOD] = border_mode; +		lod_mode = GLOD_TRIANGLE_BUDGET; -	if (border_mode == 0) -	{ -		border_mode = GLOD_BORDER_UNLOCK; +		// The LoD should be in range from Lowest to High +		if (which_lod > -1 && which_lod < NUM_LOD) +		{ +			limit = mFMP->childGetValue("lod_triangle_limit_" + lod_name[which_lod]).asInteger(); +		}  	}  	else  	{ -		border_mode = GLOD_BORDER_LOCK; +		lod_mode = GLOD_ERROR_THRESHOLD;  	}  	bool object_dirty = false; -	if (border_mode != mBuildBorderMode) -	{ -		mBuildBorderMode = border_mode; -		object_dirty = true; -	} - -	if (queue_mode != mBuildQueueMode) -	{ -		mBuildQueueMode = queue_mode; -		object_dirty = true; -	} - -	if (build_operator != mBuildOperator) -	{ -		mBuildOperator = build_operator; -		object_dirty = true; -	} - -	F32 share_tolerance = mFMP->childGetValue("share_tolerance").asReal(); -	if (share_tolerance != mBuildShareTolerance) -	{ -		mBuildShareTolerance = share_tolerance; -		object_dirty = true; -	} -	mRequestedShareTolerance[mPreviewLOD] = share_tolerance;  	if (mGroup == 0)  	{ @@ -3734,7 +3934,9 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim  			U32 tri_count = 0;  			for (U32 i = 0; i < mVertexBuffer[5][mdl].size(); ++i)  			{ -				mVertexBuffer[5][mdl][i]->setBuffer(type_mask); +				LLVertexBuffer* buff = mVertexBuffer[5][mdl][i]; +				buff->setBuffer(type_mask & buff->getTypeMask()); +				  				U32 num_indices = mVertexBuffer[5][mdl][i]->getNumIndices();  				if (num_indices > 2)  				{ @@ -3744,18 +3946,6 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim  				stop_gloderror();  			} -			glodObjectParameteri(mObject[mdl], GLOD_BUILD_OPERATOR, build_operator); -			stop_gloderror(); - -			glodObjectParameteri(mObject[mdl], GLOD_BUILD_QUEUE_MODE, queue_mode); -			stop_gloderror(); - -			glodObjectParameteri(mObject[mdl], GLOD_BUILD_BORDER_MODE, border_mode); -			stop_gloderror(); - -			glodObjectParameterf(mObject[mdl], GLOD_BUILD_SHARE_TOLERANCE, share_tolerance); -			stop_gloderror(); -  			glodBuildObject(mObject[mdl]);  			stop_gloderror();  		} @@ -3856,6 +4046,8 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim  			for (GLint i = 0; i < patch_count; ++i)  			{ +				type_mask = mVertexBuffer[5][base][i]->getTypeMask(); +  				LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(type_mask, 0);  				if (sizes[i*2+1] > 0 && sizes[i*2] > 0) @@ -3880,8 +4072,15 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim  				LLStrider<U16> index;  				buff->getVertexStrider(pos); -				buff->getNormalStrider(norm); -				buff->getTexCoord0Strider(tc); +				if (type_mask & LLVertexBuffer::MAP_NORMAL) +				{ +					buff->getNormalStrider(norm); +				} +				if (type_mask & LLVertexBuffer::MAP_TEXCOORD0) +				{ +					buff->getTexCoord0Strider(tc); +				} +  				buff->getIndexStrider(index);  				target_model->setVolumeFaceData(names[i], pos, norm, tc, index, buff->getNumVerts(), buff->getNumIndices()); @@ -4087,18 +4286,20 @@ void LLModelPreview::updateStatusMessages()  			}  			else if (!verts[lod].empty())  			{ +				S32 sum_verts_higher_lod = 0; +				S32 sum_verts_this_lod = 0;  				for (U32 i = 0; i < verts[lod].size(); ++i)  				{ -					S32 max_verts = i < verts[lod+1].size() ? verts[lod+1][i] : 0; +					sum_verts_higher_lod += ((i < verts[lod+1].size()) ? verts[lod+1][i] : 0); +					sum_verts_this_lod += verts[lod][i]; +				} -					if (max_verts > 0) -					{ -						if (verts[lod][i] > max_verts) -						{ //too many vertices in this lod -							message = "mesh_status_too_many_vertices"; -							upload_status[lod] = 2; -						} -					} +				if ((sum_verts_higher_lod > 0) && +					(sum_verts_this_lod > sum_verts_higher_lod)) +				{ +					//too many vertices in this lod +					message = "mesh_status_too_many_vertices"; +					upload_status[lod] = 2;  				}  			}  		} @@ -4119,6 +4320,8 @@ void LLModelPreview::updateStatusMessages()  			icon = mFMP->getChild<LLIconCtrl>("lod_status_message_icon");  			icon->setImage(img);  		} + +		updateLodControls(lod);  	} @@ -4147,11 +4350,11 @@ void LLModelPreview::updateStatusMessages()  		if ( uploadingJointPositions && !isRigValidForJointPositionUpload() )  		{  			skinAndRigOk = false; -		} +		}	  		else  		if ( !isLegacyRigValid() )  		{ -			skinAndRigOk = false; +			mFMP->childDisable("calculate_btn");  		}  	} @@ -4163,12 +4366,7 @@ void LLModelPreview::updateStatusMessages()  		}  	} -	const BOOL confirmed_checkbox = mFMP->getChild<LLCheckBoxCtrl>("confirm_checkbox")->getValue().asBoolean(); -	if ( upload_ok && !errorStateFromLoader && skinAndRigOk && !has_degenerate && confirmed_checkbox) -	{ -		mFMP->childEnable("ok_btn"); -	} -	else +	if (!upload_ok || errorStateFromLoader || !skinAndRigOk || has_degenerate)  	{  		mFMP->childDisable("ok_btn");  	} @@ -4235,12 +4433,14 @@ void LLModelPreview::updateStatusMessages()  			{  				fmp->enableViewOption("show_physics");  				mViewOption["show_physics"] = true; +				fmp->childSetValue("show_physics", true);  			}  		}  		else  		{  			fmp->disableViewOption("show_physics");  			mViewOption["show_physics"] = false; +			fmp->childSetValue("show_physics", false);  		} @@ -4248,7 +4448,7 @@ void LLModelPreview::updateStatusMessages()  		//fmp->childSetEnabled("physics_optimize", !use_hull); -		bool enable = phys_tris > 0 || phys_hulls > 0; +		bool enable = (phys_tris > 0 || phys_hulls > 0) && fmp->mCurRequest.empty();  		//enable = enable && !use_hull && fmp->childGetValue("physics_optimize").asBoolean();  		//enable/disable "analysis" UI @@ -4260,7 +4460,7 @@ void LLModelPreview::updateStatusMessages()  			child = panel->findNextSibling(child);  		} -		enable = phys_hulls > 0; +		enable = phys_hulls > 0 && fmp->mCurRequest.empty();  		//enable/disable "simplification" UI  		panel = fmp->getChild<LLPanel>("physics simplification");  		child = panel->getFirstChild(); @@ -4269,132 +4469,38 @@ void LLModelPreview::updateStatusMessages()  			child->setEnabled(enable);  			child = panel->findNextSibling(child);  		} -	} - -	const char* lod_controls[] = -	{ -		"lod_mode", -		"lod_triangle_limit", -		"lod_error_tolerance", -		"build_operator_text", -		"queue_mode_text", -		"border_mode_text", -		"share_tolerance_text", -		"build_operator", -		"queue_mode", -		"border_mode", -		"share_tolerance" -	}; -	const U32 num_lod_controls = sizeof(lod_controls)/sizeof(char*); - -	const char* file_controls[] = -	{ -		"lod_browse", -		"lod_file" -	}; -	const U32 num_file_controls = sizeof(file_controls)/sizeof(char*); -	if (fmp) -	{ -		//enable/disable controls based on radio groups -		if (mFMP->childGetValue("lod_from_file").asBoolean()) -		{  -			fmp->mLODMode[mPreviewLOD] = 0; -			for (U32 i = 0; i < num_file_controls; ++i) -			{ -				mFMP->childEnable(file_controls[i]); -			} - -			for (U32 i = 0; i < num_lod_controls; ++i) -			{ -				mFMP->childDisable(lod_controls[i]); -			} -		} -		else if (mFMP->childGetValue("lod_none").asBoolean()) +		if (fmp->mCurRequest.empty())  		{ -			fmp->mLODMode[mPreviewLOD] = 2; -			for (U32 i = 0; i < num_file_controls; ++i) -			{ -				mFMP->childDisable(file_controls[i]); -			} +			fmp->childSetVisible("Simplify", true); +			fmp->childSetVisible("simplify_cancel", false); +			fmp->childSetVisible("Decompose", true); +			fmp->childSetVisible("decompose_cancel", false); -			for (U32 i = 0; i < num_lod_controls; ++i) +			if (phys_hulls > 0)  			{ -				mFMP->childDisable(lod_controls[i]); +				fmp->childEnable("Simplify");  			} - -			if (!mModel[mPreviewLOD].empty()) +		 +			if (phys_tris || phys_hulls > 0)  			{ -				mModel[mPreviewLOD].clear(); -				mScene[mPreviewLOD].clear(); -				mVertexBuffer[mPreviewLOD].clear(); - -				//this can cause phasing issues with the UI, so reenter this function and return -				updateStatusMessages(); -				return; +				fmp->childEnable("Decompose");  			}  		}  		else -		{	// auto generate, also the default case for wizard which has no radio selection -			fmp->mLODMode[mPreviewLOD] = 1; - -			//don't actually regenerate lod when refreshing UI -			mLODFrozen = true; - -			for (U32 i = 0; i < num_file_controls; ++i) -			{ -				mFMP->childDisable(file_controls[i]); -			} - -			for (U32 i = 0; i < num_lod_controls; ++i) -			{ -				mFMP->childEnable(lod_controls[i]); -			} - -			//if (threshold) -			{	 -				LLSpinCtrl* threshold = mFMP->getChild<LLSpinCtrl>("lod_error_threshold"); -				LLSpinCtrl* limit = mFMP->getChild<LLSpinCtrl>("lod_triangle_limit"); - -				limit->setMaxValue(mMaxTriangleLimit); -				limit->forceSetValue(mRequestedTriangleCount[mPreviewLOD]); - -				threshold->forceSetValue(mRequestedErrorThreshold[mPreviewLOD]); - -				mFMP->getChild<LLComboBox>("lod_mode")->selectNthItem(mRequestedLoDMode[mPreviewLOD]); -				mFMP->getChild<LLComboBox>("build_operator")->selectNthItem(mRequestedBuildOperator[mPreviewLOD]); -				mFMP->getChild<LLComboBox>("queue_mode")->selectNthItem(mRequestedQueueMode[mPreviewLOD]); -				mFMP->getChild<LLComboBox>("border_mode")->selectNthItem(mRequestedBorderMode[mPreviewLOD]); -				mFMP->getChild<LLSpinCtrl>("share_tolerance")->setValue(mRequestedShareTolerance[mPreviewLOD]); - -				if (mRequestedLoDMode[mPreviewLOD] == 0) -				{ -					limit->setVisible(true); -					threshold->setVisible(false); - -					limit->setMaxValue(mMaxTriangleLimit); -					limit->setIncrement(mMaxTriangleLimit/32); -				} -				else -				{ -					limit->setVisible(false); -					threshold->setVisible(true); -				} -			} - -			mLODFrozen = false; +		{ +			fmp->childEnable("simplify_cancel"); +			fmp->childEnable("decompose_cancel");  		}  	} -	if (mFMP->childGetValue("physics_load_from_file").asBoolean()) +	if (mFMP->childGetValue("physics_lod_combo").asString() == "From file")  	{ -		mFMP->childDisable("physics_lod_combo");  		mFMP->childEnable("physics_file");  		mFMP->childEnable("physics_browse");  	}  	else  	{ -		mFMP->childEnable("physics_lod_combo");  		mFMP->childDisable("physics_file");  		mFMP->childDisable("physics_browse");  	} @@ -4412,6 +4518,124 @@ void LLModelPreview::updateStatusMessages()  		crease->forceSetValue(mRequestedCreaseAngle[mPreviewLOD]);  	} +	mModelUpdatedSignal(true); + +} + +void LLModelPreview::updateLodControls(S32 lod) +{ +	if (lod < LLModel::LOD_IMPOSTOR || lod > LLModel::LOD_HIGH) +	{ +		llwarns << "Invalid level of detail: " << lod << llendl; +		assert(lod >= LLModel::LOD_IMPOSTOR && lod <= LLModel::LOD_HIGH); +		return; +	} + +	const char* lod_controls[] = +	{ +		"lod_mode_", +		"lod_triangle_limit_", +		"lod_error_threshold_" +	}; +	const U32 num_lod_controls = sizeof(lod_controls)/sizeof(char*); + +	const char* file_controls[] = +	{ +		"lod_browse_", +		"lod_file_", +	}; +	const U32 num_file_controls = sizeof(file_controls)/sizeof(char*); + +	LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance; +	if (!fmp) return; + +	LLComboBox* lod_combo = mFMP->findChild<LLComboBox>("lod_source_" + lod_name[lod]); +	if (!lod_combo) return; + +	S32 lod_mode = lod_combo->getCurrentIndex(); +	if (lod_mode == 0) // LoD from file +	{ +		fmp->mLODMode[lod] = 0; +		for (U32 i = 0; i < num_file_controls; ++i) +		{ +			mFMP->childShow(file_controls[i] + lod_name[lod]); +		} + +		for (U32 i = 0; i < num_lod_controls; ++i) +		{ +			mFMP->childHide(lod_controls[i] + lod_name[lod]); +		} +	} +	else if (lod_mode == 2) // use LoD above +	{ +		fmp->mLODMode[lod] = 2; +		for (U32 i = 0; i < num_file_controls; ++i) +		{ +			mFMP->childHide(file_controls[i] + lod_name[lod]); +		} + +		for (U32 i = 0; i < num_lod_controls; ++i) +		{ +			mFMP->childHide(lod_controls[i] + lod_name[lod]); +		} + +		if (lod < LLModel::LOD_HIGH) +		{ +			mModel[lod] = mModel[lod + 1]; +			mScene[lod] = mScene[lod + 1]; +			mVertexBuffer[lod].clear(); + +			// Also update lower LoD +			if (lod > LLModel::LOD_IMPOSTOR) +			{ +				updateLodControls(lod - 1); +			} +		} +	} +	else // auto generate, the default case for all LoDs except High +	{ +		fmp->mLODMode[lod] = 1; + +		//don't actually regenerate lod when refreshing UI +		mLODFrozen = true; + +		for (U32 i = 0; i < num_file_controls; ++i) +		{ +			mFMP->childHide(file_controls[i] + lod_name[lod]); +		} + +		for (U32 i = 0; i < num_lod_controls; ++i) +		{ +			mFMP->childShow(lod_controls[i] + lod_name[lod]); +		} + + +		LLSpinCtrl* threshold = mFMP->getChild<LLSpinCtrl>("lod_error_threshold_" + lod_name[lod]); +		LLSpinCtrl* limit = mFMP->getChild<LLSpinCtrl>("lod_triangle_limit_" + lod_name[lod]); + +		limit->setMaxValue(mMaxTriangleLimit); +		limit->forceSetValue(mRequestedTriangleCount[lod]); + +		threshold->forceSetValue(mRequestedErrorThreshold[lod]); + +		mFMP->getChild<LLComboBox>("lod_mode_" + lod_name[lod])->selectNthItem(mRequestedLoDMode[lod]); + +		if (mRequestedLoDMode[lod] == 0) +		{ +			limit->setVisible(true); +			threshold->setVisible(false); + +			limit->setMaxValue(mMaxTriangleLimit); +			limit->setIncrement(mMaxTriangleLimit/32); +		} +		else +		{ +			limit->setVisible(false); +			threshold->setVisible(true); +		} + +		mLODFrozen = false; +	}  }  void LLModelPreview::setPreviewTarget(F32 distance) @@ -4485,7 +4709,7 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)  			bool skinned = include_skin_weights && !mdl->mSkinWeights.empty(); -			U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0; +			U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0 ;  			if (skinned)  			{ @@ -4503,8 +4727,6 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)  			LLStrider<LLVector4> weights_strider;  			vb->getVertexStrider(vertex_strider); -			vb->getNormalStrider(normal_strider); -			vb->getTexCoord0Strider(tc_strider);  			vb->getIndexStrider(index_strider);  			if (skinned) @@ -4513,8 +4735,18 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)  			}  			LLVector4a::memcpyNonAliased16((F32*) vertex_strider.get(), (F32*) vf.mPositions, num_vertices*4*sizeof(F32)); -			LLVector4a::memcpyNonAliased16((F32*) tc_strider.get(), (F32*) vf.mTexCoords, num_vertices*2*sizeof(F32)); -			LLVector4a::memcpyNonAliased16((F32*) normal_strider.get(), (F32*) vf.mNormals, num_vertices*4*sizeof(F32)); +			 +			if (vf.mTexCoords) +			{ +				vb->getTexCoord0Strider(tc_strider); +				LLVector4a::memcpyNonAliased16((F32*) tc_strider.get(), (F32*) vf.mTexCoords, num_vertices*2*sizeof(F32)); +			} +			 +			if (vf.mNormals) +			{ +				vb->getNormalStrider(normal_strider); +				LLVector4a::memcpyNonAliased16((F32*) normal_strider.get(), (F32*) vf.mNormals, num_vertices*4*sizeof(F32)); +			}  			if (skinned)  			{ @@ -4610,6 +4842,42 @@ void LLModelPreview::createPreviewAvatar( void )  	}  } +void LLModelPreview::addEmptyFace( LLModel* pTarget ) +{ +	U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0; +	 +	LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(type_mask, 0); +	 +	buff->allocateBuffer(1, 3, true); +	memset( buff->getMappedData(), 0, buff->getSize() ); +	memset( buff->getIndicesPointer(), 0, buff->getIndicesSize() ); +		 +	buff->validateRange( 0, buff->getNumVerts()-1, buff->getNumIndices(), 0 ); +		 +	LLStrider<LLVector3> pos; +	LLStrider<LLVector3> norm; +	LLStrider<LLVector2> tc; +	LLStrider<U16> index; +		 +	buff->getVertexStrider(pos); +		 +	if ( type_mask & LLVertexBuffer::MAP_NORMAL ) +	{ +		buff->getNormalStrider(norm); +	} +	if ( type_mask & LLVertexBuffer::MAP_TEXCOORD0 ) +	{ +		buff->getTexCoord0Strider(tc); +	} +		 +	buff->getIndexStrider(index); +		 +	//resize face array +	int faceCnt = pTarget->getNumVolumeFaces(); +	pTarget->setNumVolumeFaces( faceCnt+1 );	 +	pTarget->setVolumeFaceData( faceCnt+1, pos, norm, tc, index, buff->getNumVerts(), buff->getNumIndices() ); +	 +}	  //-----------------------------------------------------------------------------  // render()  //----------------------------------------------------------------------------- @@ -4691,12 +4959,12 @@ BOOL LLModelPreview::render()  	if (has_skin_weights)  	{ //model has skin weights, enable view options for skin weights and joint positions -		if (fmp) +		if (fmp && isLegacyRigValid() )  		{  			fmp->enableViewOption("show_skin_weight");  			fmp->setViewOptionEnabled("show_joint_positions", skin_weight);	 +			mFMP->childEnable("upload_skin");  		} -		mFMP->childEnable("upload_skin");  	}  	else  	{ @@ -4721,14 +4989,29 @@ BOOL LLModelPreview::render()  		mFMP->childSetValue("upload_joints", false);  		upload_joints = false;		  	}	 -	 -	mFMP->childSetEnabled("upload_joints", upload_skin); +		 +	//Only enable joint offsets if it passed the earlier critiquing +	if ( isRigValidForJointPositionUpload() )   +	{ +		mFMP->childSetEnabled("upload_joints", upload_skin); +	}  	F32 explode = mFMP->childGetValue("physics_explode").asReal();  	glClear(GL_DEPTH_BUFFER_BIT); -	LLRect preview_rect = mFMP->getChildView("preview_panel")->getRect(); +	LLRect preview_rect; + +	LLFloaterModelWizard* floater_wizard = dynamic_cast<LLFloaterModelWizard*>(mFMP); +	if (floater_wizard) +	{ +		preview_rect = floater_wizard->getPreviewRect(); +	} +	else +	{ +		preview_rect = mFMP->getChildView("preview_panel")->getRect(); +	} +  	F32 aspect = (F32) preview_rect.getWidth()/preview_rect.getHeight();  	LLViewerCamera::getInstance()->setAspect(aspect); @@ -4765,6 +5048,8 @@ BOOL LLModelPreview::render()  													  target_pos);											// point of interest +	z_near = llclamp(z_far * 0.001f, 0.001f, 0.1f); +  	LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, width, height, FALSE, z_near, z_far);  	stop_glerror(); @@ -4773,6 +5058,8 @@ BOOL LLModelPreview::render()  	const F32 BRIGHTNESS = 0.9f;  	gGL.color3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS); +	const U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0; +  	LLGLEnable normalize(GL_NORMALIZE);  	if (!mBaseModel.empty() && mVertexBuffer[5].empty()) @@ -4795,6 +5082,24 @@ BOOL LLModelPreview::render()  			}  		} +		//make sure material lists all match +		for (U32 i = 0; i < LLModel::NUM_LODS; i++) +		{ +			if (mBaseModel.size() == mModel[i].size()) +			{ +				for (U32 j = 0; j < mBaseModel.size(); ++j) +				{ +					int refFaceCnt = 0; +					int modelFaceCnt = 0; +										 +					if ( !mModel[i][j]->matchMaterialOrder(mBaseModel[j], refFaceCnt, modelFaceCnt ) ) +					{ +						mFMP->childDisable( "calculate_btn" ); +					} +				} +			} +		} +  		if (regen)  		{  			genBuffers(mPreviewLOD, skin_weight); @@ -4821,18 +5126,25 @@ BOOL LLModelPreview::render()  				for (U32 i = 0; i < mVertexBuffer[mPreviewLOD][model].size(); ++i)  				{  					LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i]; - -					buffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0); +				 +					buffer->setBuffer(type_mask & buffer->getTypeMask());  					if (textures)  					{ -						glColor4fv(instance.mMaterial[i].mDiffuseColor.mV); -						if (i < instance.mMaterial.size() && instance.mMaterial[i].mDiffuseMap.notNull()) +						int materialCnt = instance.mModel->mMaterialList.size(); +						if ( i < materialCnt )  						{ -							if (instance.mMaterial[i].mDiffuseMap->getDiscardLevel() > -1) +							const std::string& binding = instance.mModel->mMaterialList[i];						 +							const LLImportMaterial& material = instance.mMaterial[binding]; + +							glColor4fv(material.mDiffuseColor.mV); +							if (material.mDiffuseMap.notNull())  							{ -								gGL.getTexUnit(0)->bind(instance.mMaterial[i].mDiffuseMap, true); -								mTextureSet.insert(instance.mMaterial[i].mDiffuseMap.get()); +								if (material.mDiffuseMap->getDiscardLevel() > -1) +								{ +									gGL.getTexUnit(0)->bind(material.mDiffuseMap, true); +									mTextureSet.insert(material.mDiffuseMap.get()); +								}  							}  						}  					} @@ -4860,184 +5172,197 @@ BOOL LLModelPreview::render()  			if (physics)  			{  				glClear(GL_DEPTH_BUFFER_BIT); -				LLGLEnable blend(GL_BLEND); -				gGL.blendFunc(LLRender::BF_ONE, LLRender::BF_ZERO); - -				for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) +				 +				for (U32 i = 0; i < 2; i++)  				{ -					LLModelInstance& instance = *iter; +					if (i == 0) +					{ //depth only pass +						gGL.setColorMask(false, false); +					} +					else +					{ +						gGL.setColorMask(true, true); +					} -					LLModel* model = instance.mLOD[LLModel::LOD_PHYSICS]; +					//enable alpha blending on second pass but not first pass +					LLGLState blend(GL_BLEND, i);  +					 +					gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA); -					if (!model) +					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]; -					glMultMatrixf((GLfloat*) mat.mMatrix); +						if (!model) +						{ +							continue; +						} +						gGL.pushMatrix(); +						LLMatrix4 mat = instance.mTransform; -					bool render_mesh = true; +						glMultMatrixf((GLfloat*) mat.mMatrix); -					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.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) -								{ -									if (explode > 0.f) +								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, 255)); -									} +										if (i+1 >= hull_colors.size()) +										{ +											hull_colors.push_back(LLColor4U(rand()%128+127, rand()%128+127, rand()%128+127, 128)); +										}  										glColor4ubv(hull_colors[i].mV); -									LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals); +										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); -						} -						for (U32 i = 0; i < mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); ++i) -						{ -							LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i]; - -							buffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0); +							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]; -							buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0); -							gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -							glColor4f(0.4f, 0.4f, 0.0f, 0.4f); +								gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +								glColor4f(0.4f, 0.4f, 0.0f, 0.4f); -							buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0); +								buffer->setBuffer(type_mask & buffer->getTypeMask()); +								buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0); -							glColor3f(1.f, 1.f, 0.f); +								glColor3f(1.f, 1.f, 0.f); -							glLineWidth(2.f); -							glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); -							buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0); +								glLineWidth(2.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); -							glLineWidth(1.f); +								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); -				glColor4f(1.f,0.f,0.f,1.f); -				const LLVector4a scale(0.5f); - -				for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) -				{ -					LLModelInstance& instance = *iter; +						gGL.popMatrix(); +					} -					LLModel* model = instance.mLOD[LLModel::LOD_PHYSICS]; +					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); +					glColor4f(1.f,0.f,0.f,1.f); +					const LLVector4a scale(0.5f); -					if (!model) +					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]; -					glMultMatrixf((GLfloat*) mat.mMatrix); +						if (!model) +						{ +							continue; +						} +						gGL.pushMatrix(); +						LLMatrix4 mat = instance.mTransform; -					LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread; -					if (decomp) -					{ -						LLMutexLock(decomp->mMutex); +						glMultMatrixf((GLfloat*) mat.mMatrix); -						LLModel::Decomposition& physics = model->mPhysics; -						if (physics.mHull.empty()) +						LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread; +						if (decomp)  						{ -							if (mVertexBuffer[LLModel::LOD_PHYSICS].empty()) +							LLMutexLock(decomp->mMutex); + +							LLModel::Decomposition& physics = model->mPhysics; + +							if (physics.mHull.empty())  							{ -								genBuffers(LLModel::LOD_PHYSICS, false); -							} +								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]; +								for (U32 i = 0; i < mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); ++i) +								{ +									LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i]; -								buffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0); +									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); - -								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); +									LLStrider<U16> idx; +									buffer->getIndexStrider(idx, 0); -									if (ll_is_degenerate(v1,v2,v3)) +									for (U32 i = 0; i < buffer->getNumIndices(); i += 3)  									{ -										buffer->draw(LLRender::LINE_LOOP, 3, i); -										buffer->draw(LLRender::POINTS, 3, i); +										LLVector4a v1; v1.setMul(pos[*idx++], scale); +										LLVector4a v2; v2.setMul(pos[*idx++], scale); +										LLVector4a v3; v3.setMul(pos[*idx++], scale); + +										if (ll_is_degenerate(v1,v2,v3)) +										{ +											buffer->draw(LLRender::LINE_LOOP, 3, i); +											buffer->draw(LLRender::POINTS, 3, i); +										}  									}  								}  							}  						} -					} -					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);  			}  		}  		else @@ -5132,8 +5457,10 @@ BOOL LLModelPreview::render()  								position[j] = v;  							} -							buffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0); -							glColor4fv(instance.mMaterial[i].mDiffuseColor.mV); +							const std::string& binding = instance.mModel->mMaterialList[i]; +							const LLImportMaterial& material = instance.mMaterial[binding]; +							buffer->setBuffer(type_mask & buffer->getTypeMask()); +							glColor4fv(material.mDiffuseColor.mV);  							gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);  							buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);  							glColor3f(0.4f, 0.4f, 0.4f); @@ -5202,8 +5529,7 @@ void LLModelPreview::setPreviewLOD(S32 lod)  		LLComboBox* combo_box = mFMP->getChild<LLComboBox>("preview_lod_combo");  		combo_box->setCurrentByIndex((NUM_LOD-1)-mPreviewLOD); // combo box list of lods is in reverse order -		mFMP->childSetTextArg("lod_table_footer", "[DETAIL]", mFMP->getString(lod_name[mPreviewLOD])); -		mFMP->childSetText("lod_file", mLODFile[mPreviewLOD]); +		mFMP->childSetText("lod_file_" + lod_name[mPreviewLOD], mLODFile[mPreviewLOD]);  		// the wizard has three lod drop downs  		LLComboBox* combo_box2 = mFMP->getChild<LLComboBox>("preview_lod_combo2"); @@ -5224,25 +5550,16 @@ void LLModelPreview::setPreviewLOD(S32 lod)  			mFMP->childSetColor(lod_triangles_name[i], color);  			mFMP->childSetColor(lod_vertices_name[i], color);  		} - -		LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance; -		if (fmp) -		{ -			LLRadioGroup* radio = fmp->getChild<LLRadioGroup>("lod_file_or_limit"); -			radio->selectNthItem(fmp->mLODMode[mPreviewLOD]); -		}  	}  	refresh();  	updateStatusMessages();  } -//static -void LLFloaterModelPreview::onBrowseLOD(void* data) +void LLFloaterModelPreview::onBrowseLOD(S32 lod)  {  	assert_main_thread(); -	LLFloaterModelPreview* mp = (LLFloaterModelPreview*) data; -	mp->loadModel(mp->mModelPreview->mPreviewLOD); +	loadModel(lod);  }  //static @@ -5253,7 +5570,13 @@ void LLFloaterModelPreview::onReset(void* user_data)  	LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) user_data;  	LLModelPreview* mp = fmp->mModelPreview;  	std::string filename = mp->mLODFile[3];  -	mp->loadModel(filename,3); + +	fmp->resetDisplayOptions(); +	//reset model preview +	fmp->initModelPreview(); + +	mp = fmp->mModelPreview; +	mp->loadModel(filename,3,true);  }  //static @@ -5263,6 +5586,8 @@ void LLFloaterModelPreview::onUpload(void* user_data)  	LLFloaterModelPreview* mp = (LLFloaterModelPreview*) user_data; +	mp->mUploadBtn->setEnabled(false); +  	mp->mModelPreview->rebuildUploadData();  	bool upload_skinweights = mp->childGetValue("upload_skin").asBoolean(); @@ -5271,31 +5596,17 @@ void LLFloaterModelPreview::onUpload(void* user_data)  	mp->mModelPreview->saveUploadData(upload_skinweights, upload_joint_positions);  	gMeshRepo.uploadModel(mp->mModelPreview->mUploadData, mp->mModelPreview->mPreviewScale, -						  mp->childGetValue("upload_textures").asBoolean(), upload_skinweights, upload_joint_positions); - -	mp->closeFloater(false); +						  mp->childGetValue("upload_textures").asBoolean(), upload_skinweights, upload_joint_positions, mp->mUploadModelUrl, +						  true, LLHandle<LLWholeModelFeeObserver>(), mp->getWholeModelUploadObserverHandle());  } -//static -void LLFloaterModelPreview::onClearMaterials(void* user_data) -{ -	LLFloaterModelPreview* mp = (LLFloaterModelPreview*) user_data; -	mp->mModelPreview->clearMaterials(); -} - -//static -void LLFloaterModelPreview::refresh(LLUICtrl* ctrl, void* user_data) +void LLFloaterModelPreview::refresh()  { +	sInstance->toggleCalculateButton(true);  	sInstance->mModelPreview->mDirty = true;  } -void LLFloaterModelPreview::updateResourceCost() -{ -	U32 cost = mModelPreview->mResourceCost; -	childSetLabelArg("ok_btn", "[AMOUNT]", llformat("%d",cost)); -} -  //static  void LLModelPreview::textureLoadedCallback( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata )  { @@ -5311,12 +5622,11 @@ void LLModelPreview::textureLoadedCallback( BOOL success, LLViewerFetchedTexture  	}  } -void LLModelPreview::onLODParamCommit(bool enforce_tri_limit) +void LLModelPreview::onLODParamCommit(S32 lod, bool enforce_tri_limit)  {  	if (!mLODFrozen)  	{ -		genLODs(mPreviewLOD, 3, enforce_tri_limit); -		updateStatusMessages(); +		genLODs(lod, 3, enforce_tri_limit);  		refresh();  	}  } @@ -5339,6 +5649,111 @@ void LLFloaterModelPreview::setStatusMessage(const std::string& msg)  	mStatusMessage = msg;  } +void LLFloaterModelPreview::toggleCalculateButton() +{ +	toggleCalculateButton(true); +} + +void LLFloaterModelPreview::toggleCalculateButton(bool visible) +{ +	mCalculateBtn->setVisible(visible); + +	bool uploadingSkin		     = childGetValue("upload_skin").asBoolean(); +	bool uploadingJointPositions = childGetValue("upload_joints").asBoolean(); +	if ( uploadingSkin ) +	{ +		//Disable the calculate button *if* the rig is invalid - which is determined during the critiquing process +		if ( uploadingJointPositions && !mModelPreview->isRigValidForJointPositionUpload() ) +		{ +			mCalculateBtn->setVisible( false ); +		} +	} +	 +	mUploadBtn->setVisible(!visible); +	mUploadBtn->setEnabled(mHasUploadPerm && !mUploadModelUrl.empty()); + +	if (visible) +	{ +		std::string tbd = getString("tbd"); +		childSetTextArg("prim_weight", "[EQ]", tbd); +		childSetTextArg("download_weight", "[ST]", tbd); +		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); +	} +} + +void LLFloaterModelPreview::onLoDSourceCommit(S32 lod) +{ +	mModelPreview->updateLodControls(lod); +	refresh(); +} + +void LLFloaterModelPreview::resetDisplayOptions() +{ +	std::map<std::string,bool>::iterator option_it = mModelPreview->mViewOption.begin(); + +	for(;option_it != mModelPreview->mViewOption.end(); ++option_it) +	{ +		LLUICtrl* ctrl = getChild<LLUICtrl>(option_it->first); +		ctrl->setValue(false); +	} +} + +void LLFloaterModelPreview::onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url) +{ +	mModelPhysicsFee = result; +	mModelPhysicsFee["url"] = upload_url; + +	doOnIdleOneTime(boost::bind(&LLFloaterModelPreview::handleModelPhysicsFeeReceived,this)); +} + +void LLFloaterModelPreview::handleModelPhysicsFeeReceived() +{ +	const LLSD& result = mModelPhysicsFee; +	mUploadModelUrl = result["url"].asString(); + +	childSetTextArg("prim_weight", "[EQ]", llformat("%0.3f", result["resource_cost"].asReal())); +	childSetTextArg("download_weight", "[ST]", llformat("%0.3f", result["model_streaming_cost"].asReal())); +	childSetTextArg("server_weight", "[SIM]", llformat("%0.3f", result["simulation_cost"].asReal())); +	childSetTextArg("physics_weight", "[PH]", llformat("%0.3f", result["physics_cost"].asReal())); +	childSetTextArg("upload_fee", "[FEE]", llformat("%d", result["upload_price"].asInteger())); +	childSetTextArg("price_breakdown", "[STREAMING]", llformat("%d", result["upload_price_breakdown"]["mesh_streaming"].asInteger())); +	childSetTextArg("price_breakdown", "[PHYSICS]", llformat("%d", result["upload_price_breakdown"]["mesh_physics"].asInteger())); +	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())); +	childSetVisible("upload_fee", true); +	childSetVisible("price_breakdown", true); +	mUploadBtn->setEnabled(mHasUploadPerm && !mUploadModelUrl.empty()); +} + +void LLFloaterModelPreview::setModelPhysicsFeeErrorStatus(U32 status, const std::string& reason) +{ +	llwarns << "LLFloaterModelPreview::setModelPhysicsFeeErrorStatus(" << status << " : " << reason << ")" << llendl; +	doOnIdleOneTime(boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this, true)); +} + +/*virtual*/  +void LLFloaterModelPreview::onModelUploadSuccess() +{ +	assert_main_thread(); +	closeFloater(false); +} + +/*virtual*/  +void LLFloaterModelPreview::onModelUploadFailure() +{ +	assert_main_thread(); +	toggleCalculateButton(true); +	mUploadBtn->setEnabled(true); +} +  S32 LLFloaterModelPreview::DecompRequest::statusCallback(const char* status, S32 p1, S32 p2)  {  	if (mContinue) @@ -5378,3 +5793,25 @@ void LLFloaterModelPreview::DecompRequest::completed()  		llassert(sInstance->mCurRequest.find(this) == sInstance->mCurRequest.end());  	}  } + +void dump_llsd_to_file(const LLSD& content, std::string filename); + +void LLFloaterModelPreview::onPermissionsReceived(const LLSD& result) +{ +	dump_llsd_to_file(result,"perm_received.xml"); +	std::string upload_status = result["mesh_upload_status"].asString(); +	// BAP HACK: handle "" for case that  MeshUploadFlag cap is broken. +	mHasUploadPerm = (("" == upload_status) || ("valid" == upload_status)); + +	//mUploadBtn->setEnabled(mHasUploadPerm); +	mUploadBtn->setEnabled(mHasUploadPerm && !mUploadModelUrl.empty()); +	getChild<LLTextBox>("warning_title")->setVisible(!mHasUploadPerm); +	getChild<LLTextBox>("warning_message")->setVisible(!mHasUploadPerm); +} + +void LLFloaterModelPreview::setPermissonsErrorStatus(U32 status, const std::string& reason) +{ +	llwarns << "LLFloaterModelPreview::setPermissonsErrorStatus(" << status << " : " << reason << ")" << llendl; + +	LLNotificationsUtil::add("MeshUploadPermError"); +} diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index d4f6b4d293..47de99ce25 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -109,7 +109,7 @@ public:  	void loadTextures() ; //called in the main thread.  	void processElement(daeElement* element, bool& badElement); -	std::vector<LLImportMaterial> getMaterials(LLModel* model, domInstance_geometry* instance_geo); +	std::map<std::string, LLImportMaterial> getMaterials(LLModel* model, domInstance_geometry* instance_geo);  	LLImportMaterial profileToMaterial(domProfile_COMMON* material);  	std::string getElementLabel(daeElement *element);  	LLColor4 getDaeColor(daeElement* element); @@ -120,12 +120,13 @@ public:  	void processJointNode( domNode* pNode, std::map<std::string,LLMatrix4>& jointTransforms );  	void extractTranslation( domTranslate* pTranslate, LLMatrix4& transform );  	void extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform ); -	 +	void extractTranslationViaSID( daeElement* pElement, LLMatrix4& transform ); +  	void setLoadState(U32 state);  	void buildJointToNodeMappingFromScene( daeElement* pRoot );  	void processJointToNodeMapping( domNode* pNode ); - +	void processChildJoints( domNode* pParentNode );  	//map of avatar joints as named in COLLADA assets to internal joint names  	std::map<std::string, std::string> mJointMap; @@ -140,7 +141,7 @@ private:  	static bool isAlive(LLModelLoader* loader) ;  }; -class LLFloaterModelPreview : public LLFloater +class LLFloaterModelPreview : public LLFloaterModelUploadBase  {  public: @@ -162,37 +163,52 @@ public:  	virtual BOOL postBuild(); +	void initModelPreview(); +  	BOOL handleMouseDown(S32 x, S32 y, MASK mask);  	BOOL handleMouseUp(S32 x, S32 y, MASK mask);  	BOOL handleHover(S32 x, S32 y, MASK mask);  	BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);  +	/*virtual*/ void onOpen(const LLSD& key); +  	static void onMouseCaptureLostModelPreview(LLMouseHandler*);  	static void setUploadAmount(S32 amount) { sUploadAmount = amount; }  	void setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost); -	static void onBrowseLOD(void* data); +	void onBrowseLOD(S32 lod);  	static void onReset(void* data);  	static void onUpload(void* data); -	static void onClearMaterials(void* data); -	 -	static void refresh(LLUICtrl* ctrl, void* data); -	 -	void updateResourceCost(); +	void refresh();  	void			loadModel(S32 lod); +	void 			loadModel(S32 lod, const std::string& file_name, bool force_disable_slm = false); -	void onViewOptionChecked(const LLSD& userdata); +	void onViewOptionChecked(LLUICtrl* ctrl);  	bool isViewOptionChecked(const LLSD& userdata);  	bool isViewOptionEnabled(const LLSD& userdata);  	void setViewOptionEnabled(const std::string& option, bool enabled);  	void enableViewOption(const std::string& option);  	void disableViewOption(const std::string& option); +	// shows warning message if agent has no permissions to upload model +	/*virtual*/ void onPermissionsReceived(const LLSD& result); + +	// called when error occurs during permissions request +	/*virtual*/ void setPermissonsErrorStatus(U32 status, const std::string& reason); + +	/*virtual*/ void onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url); +				void handleModelPhysicsFeeReceived(); +	/*virtual*/ void setModelPhysicsFeeErrorStatus(U32 status, const std::string& reason); + +	/*virtual*/ void onModelUploadSuccess(); + +	/*virtual*/ void onModelUploadFailure(); +  protected:  	friend class LLModelPreview;  	friend class LLMeshFilePicker; @@ -202,17 +218,17 @@ protected:  	static void		onPelvisOffsetCommit(LLUICtrl*, void*);  	static void		onUploadJointsCommit(LLUICtrl*,void*);  	static void		onUploadSkinCommit(LLUICtrl*,void*); -	 -	static void		onPhysicsLoadRadioCommit(LLUICtrl*,void *data);  	static void		onPreviewLODCommit(LLUICtrl*,void*);  	static void		onGenerateNormalsCommit(LLUICtrl*,void*); +	void toggleGenarateNormals(); +  	static void		onAutoFillCommit(LLUICtrl*,void*); -	static void		onLODParamCommit(LLUICtrl*,void*); -	static void		onLODParamCommitTriangleLimit(LLUICtrl*,void*); +	void onLODParamCommit(S32 lod, bool enforce_tri_limit); +  	static void		onExplodeCommit(LLUICtrl*, void*);  	static void onPhysicsParamCommit(LLUICtrl* ctrl, void* userdata); @@ -251,13 +267,29 @@ protected:  	//store which lod mode each LOD is using  	// 0 - load from file  	// 1 - auto generate -	// 2 - None +	// 2 - use LoD above  	S32 mLODMode[4]; -	LLMenuButton* mViewOptionMenuButton; -	LLToggleableMenu* mViewOptionMenu;  	LLMutex* mStatusLock; +	LLSD mModelPhysicsFee; + +private: +	void onClickCalculateBtn(); +	void toggleCalculateButton(); + +	void onLoDSourceCommit(S32 lod); + +	// Toggles between "Calculate weights & fee" and "Upload" buttons. +	void toggleCalculateButton(bool visible); + +	// resets display options of model preview to their defaults. +	void resetDisplayOptions(); + +	void createSmoothComboBox(LLComboBox* combo_box, float min, float max); + +	LLButton* mUploadBtn; +	LLButton* mCalculateBtn;  };  class LLMeshFilePicker : public LLFilePickerThread @@ -276,6 +308,7 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex  {	  	typedef boost::signals2::signal<void (F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost)> details_signal_t;  	typedef boost::signals2::signal<void (void)> model_loaded_signal_t; +	typedef boost::signals2::signal<void (bool)> model_updated_signal_t;  public:  	LLModelPreview(S32 width, S32 height, LLFloater* fmp); @@ -297,20 +330,21 @@ public:  	virtual BOOL needsRender() { return mNeedsUpdate; }  	void setPreviewLOD(S32 lod);  	void clearModel(S32 lod); -	void loadModel(std::string filename, S32 lod); +	void loadModel(std::string filename, S32 lod, bool force_disable_slm = false);  	void loadModelCallback(S32 lod);  	void genLODs(S32 which_lod = -1, U32 decimation = 3, bool enforce_tri_limit = false);  	void generateNormals(); -	void clearMaterials();  	U32 calcResourceCost();  	void rebuildUploadData();  	void saveUploadData(bool save_skinweights, bool save_joint_poisitions);  	void saveUploadData(const std::string& filename, bool save_skinweights, bool save_joint_poisitions);  	void clearIncompatible(S32 lod);  	void updateStatusMessages(); +	void updateLodControls(S32 lod);  	void clearGLODGroup(); -	void onLODParamCommit(bool enforce_tri_limit); - +	void onLODParamCommit(S32 lod, bool enforce_tri_limit); +	void addEmptyFace( LLModel* pTarget ); +	  	const bool getModelPivot( void ) const { return mHasPivot; }  	void setHasPivot( bool val ) { mHasPivot = val; }  	void setModelPivot( const LLVector3& pivot ) { mModelPivot = pivot; } @@ -335,12 +369,10 @@ public:  	boost::signals2::connection setDetailsCallback( const details_signal_t::slot_type& cb ){  return mDetailsSignal.connect(cb);  }  	boost::signals2::connection setModelLoadedCallback( const model_loaded_signal_t::slot_type& cb ){  return mModelLoadedSignal.connect(cb);  } +	boost::signals2::connection setModelUpdatedCallback( const model_updated_signal_t::slot_type& cb ){  return mModelUpdatedSignal.connect(cb);  }  	void setLoadState( U32 state ) { mLoadState = state; }  	U32 getLoadState() { return mLoadState; } -	//setRestJointFlag: If an asset comes through that changes the joints, we want the reset to persist -	void setResetJointFlag( bool state ) { if ( !mResetJoints ) mResetJoints = state; } -	const bool getResetJointFlag( void ) const { return mResetJoints; }  	void setRigWithSceneParity( bool state ) { mRigParityWithScene = state; }  	const bool getRigWithSceneParity( void ) const { return mRigParityWithScene; } @@ -420,6 +452,7 @@ private:  	details_signal_t mDetailsSignal;  	model_loaded_signal_t mModelLoadedSignal; +	model_updated_signal_t mModelUpdatedSignal;  	LLVector3	mModelPivot;  	bool		mHasPivot; diff --git a/indra/newview/llfloatermodeluploadbase.cpp b/indra/newview/llfloatermodeluploadbase.cpp new file mode 100644 index 0000000000..6d3800bfa4 --- /dev/null +++ b/indra/newview/llfloatermodeluploadbase.cpp @@ -0,0 +1,58 @@ +/** + * @file llfloatermodeluploadbase.cpp + * @brief LLFloaterUploadModelBase class definition + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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 "llfloatermodeluploadbase.h" +#include "llagent.h" +#include "llviewerregion.h" +#include "llnotificationsutil.h" + +LLFloaterModelUploadBase::LLFloaterModelUploadBase(const LLSD& key) +:LLFloater(key), + mHasUploadPerm(false) +{ +} + +void LLFloaterModelUploadBase::requestAgentUploadPermissions() +{ +	std::string capability = "MeshUploadFlag"; +	std::string url = gAgent.getRegion()->getCapability(capability); + +	if (!url.empty()) +	{ +		llinfos<< typeid(*this).name() <<"::requestAgentUploadPermissions() requesting for upload model permissions from: "<< url <<llendl; +		LLHTTPClient::get(url, new LLUploadModelPremissionsResponder(getPermObserverHandle())); +	} +	else +	{ +		LLSD args; +		args["CAPABILITY"] = capability; +		LLNotificationsUtil::add("RegionCapabilityRequestError", args); +		// BAP HACK avoid being blocked by broken server side stuff +		mHasUploadPerm = true; +	} +} diff --git a/indra/newview/llfloatermodeluploadbase.h b/indra/newview/llfloatermodeluploadbase.h new file mode 100644 index 0000000000..a52bc28687 --- /dev/null +++ b/indra/newview/llfloatermodeluploadbase.h @@ -0,0 +1,61 @@ +/** + * @file llfloatermodeluploadbase.h + * @brief LLFloaterUploadModelBase class declaration + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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_LLFLOATERMODELUPLOADBASE_H +#define LL_LLFLOATERMODELUPLOADBASE_H + +#include "lluploadfloaterobservers.h" + +class LLFloaterModelUploadBase : public LLFloater, public LLUploadPermissionsObserver, public LLWholeModelFeeObserver, public LLWholeModelUploadObserver +{ +public: + +	LLFloaterModelUploadBase(const LLSD& key); + +	virtual ~LLFloaterModelUploadBase(){}; + +	virtual void setPermissonsErrorStatus(U32 status, const std::string& reason) = 0; + +	virtual void onPermissionsReceived(const LLSD& result) = 0; + +	virtual void onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url) = 0; + +	virtual void setModelPhysicsFeeErrorStatus(U32 status, const std::string& reason) = 0; + +	virtual void onModelUploadSuccess() {}; + +	virtual void onModelUploadFailure() {}; + +protected: + +	// requests agent's permissions to upload model +	void requestAgentUploadPermissions(); + +	std::string mUploadModelUrl; +	bool mHasUploadPerm; +}; + +#endif /* LL_LLFLOATERMODELUPLOADBASE_H */ diff --git a/indra/newview/llfloatermodelwizard.cpp b/indra/newview/llfloatermodelwizard.cpp index 707c8288df..b517b78e5a 100644 --- a/indra/newview/llfloatermodelwizard.cpp +++ b/indra/newview/llfloatermodelwizard.cpp @@ -46,12 +46,21 @@ static	const std::string stateNames[]={  	"choose_file",  	"optimize",  	"physics", -	"physics2",  	"review",  	"upload"}; +static void swap_controls(LLUICtrl* first_ctrl, LLUICtrl* second_ctrl, bool first_ctr_visible); +  LLFloaterModelWizard::LLFloaterModelWizard(const LLSD& key) -	: LLFloater(key) +	: LLFloaterModelUploadBase(key) +	 ,mRecalculateGeometryBtn(NULL) +	 ,mRecalculatePhysicsBtn(NULL) +	 ,mRecalculatingPhysicsBtn(NULL) +	 ,mCalculateWeightsBtn(NULL) +	 ,mCalculatingWeightsBtn(NULL) +	 ,mChooseFilePreviewPanel(NULL) +	 ,mOptimizePreviewPanel(NULL) +	 ,mPhysicsPreviewPanel(NULL)  {  	mLastEnabledState = CHOOSE_FILE;  	sInstance = this; @@ -59,7 +68,6 @@ LLFloaterModelWizard::LLFloaterModelWizard(const LLSD& key)  	mCommitCallbackRegistrar.add("Wizard.Choose", boost::bind(&LLFloaterModelWizard::setState, this, CHOOSE_FILE));  	mCommitCallbackRegistrar.add("Wizard.Optimize", boost::bind(&LLFloaterModelWizard::setState, this, OPTIMIZE));  	mCommitCallbackRegistrar.add("Wizard.Physics", boost::bind(&LLFloaterModelWizard::setState, this, PHYSICS)); -	mCommitCallbackRegistrar.add("Wizard.Physics2", boost::bind(&LLFloaterModelWizard::setState, this, PHYSICS2));  	mCommitCallbackRegistrar.add("Wizard.Review", boost::bind(&LLFloaterModelWizard::setState, this, REVIEW));  	mCommitCallbackRegistrar.add("Wizard.Upload", boost::bind(&LLFloaterModelWizard::setState, this, UPLOAD));  } @@ -81,16 +89,22 @@ void LLFloaterModelWizard::setState(int state)  		}  	} +	LLView* current_preview_panel = NULL; +  	if (state == CHOOSE_FILE)  	{  		mModelPreview->mViewOption["show_physics"] = false; +		current_preview_panel = mChooseFilePreviewPanel; +  		getChildView("close")->setVisible(false);  		getChildView("back")->setVisible(true);  		getChildView("back")->setEnabled(false);  		getChildView("next")->setVisible(true);  		getChildView("upload")->setVisible(false);  		getChildView("cancel")->setVisible(true); +		mCalculateWeightsBtn->setVisible(false); +		mCalculatingWeightsBtn->setVisible(false);  	}  	if (state == OPTIMIZE) @@ -102,12 +116,16 @@ void LLFloaterModelWizard::setState(int state)  		mModelPreview->mViewOption["show_physics"] = false; +		current_preview_panel = mOptimizePreviewPanel; +  		getChildView("back")->setVisible(true);  		getChildView("back")->setEnabled(true);  		getChildView("close")->setVisible(false);  		getChildView("next")->setVisible(true);  		getChildView("upload")->setVisible(false);  		getChildView("cancel")->setVisible(true); +		mCalculateWeightsBtn->setVisible(false); +		mCalculatingWeightsBtn->setVisible(false);  	}  	if (state == PHYSICS) @@ -115,34 +133,24 @@ void LLFloaterModelWizard::setState(int state)  		if (mLastEnabledState < state)  		{  			mModelPreview->setPhysicsFromLOD(1); -		} -		mModelPreview->mViewOption["show_physics"] = true; - -		getChildView("next")->setVisible(true); -		getChildView("upload")->setVisible(false); -		getChildView("close")->setVisible(false); -		getChildView("back")->setVisible(true); -		getChildView("back")->setEnabled(true); -		getChildView("cancel")->setVisible(true); -	} - -	if (state == PHYSICS2) -	{ -		if (mLastEnabledState < state) -		{ -			executePhysicsStage("Decompose"); +			// Trigger the recalculate physics when first entering +			// the Physics step. +			onClickRecalculatePhysics();  		}  		mModelPreview->mViewOption["show_physics"] = true; -		getChildView("next")->setVisible(true); -		getChildView("next")->setEnabled(true); +		current_preview_panel = mPhysicsPreviewPanel; + +		getChildView("next")->setVisible(false);  		getChildView("upload")->setVisible(false);  		getChildView("close")->setVisible(false);  		getChildView("back")->setVisible(true);  		getChildView("back")->setEnabled(true);  		getChildView("cancel")->setVisible(true); +		mCalculateWeightsBtn->setVisible(true); +		mCalculatingWeightsBtn->setVisible(false);  	}  	if (state == REVIEW) @@ -156,6 +164,8 @@ void LLFloaterModelWizard::setState(int state)  		getChildView("back")->setEnabled(true);  		getChildView("upload")->setVisible(true);  		getChildView("cancel")->setVisible(true); +		mCalculateWeightsBtn->setVisible(false); +		mCalculatingWeightsBtn->setVisible(false);  	}  	if (state == UPLOAD) @@ -165,8 +175,24 @@ void LLFloaterModelWizard::setState(int state)  		getChildView("back")->setVisible(false);  		getChildView("upload")->setVisible(false);  		getChildView("cancel")->setVisible(false); +		mCalculateWeightsBtn->setVisible(false); +		mCalculatingWeightsBtn->setVisible(false);  	} +	if (current_preview_panel) +	{ +		LLRect rect; +		current_preview_panel->localRectToOtherView(current_preview_panel->getLocalRect(), &rect, this); + +		// Reduce the preview rect by 1 px to fit the borders +		rect.stretch(-1); + +		if (rect != mPreviewRect) +		{ +			mPreviewRect = rect; +			mModelPreview->refresh(); +		} +	}  	updateButtons();  } @@ -198,18 +224,60 @@ void LLFloaterModelWizard::updateButtons()  			button->setEnabled(FALSE);  		}  	} +} -	LLButton *physics_button = getChild<LLButton>(stateNames[PHYSICS]+"_btn"); -	 -	if (mState == PHYSICS2) +void LLFloaterModelWizard::onClickSwitchToAdvanced() +{ +	LLFloaterModelPreview* floater_preview = LLFloaterReg::getTypedInstance<LLFloaterModelPreview>("upload_model"); +	if (!floater_preview)  	{ -		physics_button->setVisible(false); +		llwarns << "FLoater model preview not found." << llendl; +		return;  	} -	else + +	// Open floater model preview +	floater_preview->openFloater(); + +	// Close the wizard +	closeFloater(); + +	std::string filename = getChild<LLUICtrl>("lod_file")->getValue().asString(); +	if (!filename.empty())  	{ -		physics_button->setVisible(true); +		// Re-load the model to the floater model preview if it has been loaded +		// into the wizard. +		floater_preview->loadModel(3, filename);  	} +} + +void LLFloaterModelWizard::onClickRecalculateGeometry() +{ +	S32 val = getChild<LLUICtrl>("accuracy_slider")->getValue().asInteger(); + +	mModelPreview->genLODs(-1, NUM_LOD - val); + +	mModelPreview->refresh(); +} + +void LLFloaterModelWizard::onClickRecalculatePhysics() +{ +	// Hide the "Recalculate physics" button and show the "Recalculating..." +	// button instead. +	swap_controls(mRecalculatePhysicsBtn, mRecalculatingPhysicsBtn, false); + +	executePhysicsStage("Decompose"); +} +void LLFloaterModelWizard::onClickCalculateUploadFee() +{ +	swap_controls(mCalculateWeightsBtn, mCalculatingWeightsBtn, false); + +	mModelPreview->rebuildUploadData(); + +	mUploadModelUrl.clear(); + +	gMeshRepo.uploadModel(mModelPreview->mUploadData, mModelPreview->mPreviewScale, +			true, false, false, mUploadModelUrl, false, getWholeModelFeeObserverHandle());  }  void LLFloaterModelWizard::loadModel() @@ -344,6 +412,7 @@ BOOL LLFloaterModelWizard::handleScrollWheel(S32 x, S32 y, S32 clicks)  	return TRUE;  } +  void LLFloaterModelWizard::initDecompControls()  {  	LLSD key; @@ -401,12 +470,83 @@ void LLFloaterModelWizard::initDecompControls()  	mDecompParams["Simplify Method"] = 0; // set it to retain %  } +/*virtual*/ +void LLFloaterModelWizard::onPermissionsReceived(const LLSD& result) +{ +	std::string upload_status = result["mesh_upload_status"].asString(); +	// BAP HACK: handle "" for case that  MeshUploadFlag cap is broken. +	mHasUploadPerm = (("" == upload_status) || ("valid" == upload_status)); + +	getChildView("warning_label")->setVisible(!mHasUploadPerm); +	getChildView("warning_text")->setVisible(!mHasUploadPerm); +} + +/*virtual*/ +void LLFloaterModelWizard::setPermissonsErrorStatus(U32 status, const std::string& reason) +{ +	llwarns << "LLFloaterModelWizard::setPermissonsErrorStatus(" << status << " : " << reason << ")" << llendl; +} + +/*virtual*/ +void LLFloaterModelWizard::onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url) +{ +	swap_controls(mCalculateWeightsBtn, mCalculatingWeightsBtn, true); + +	// Enable the "Upload" buton if we have calculated the upload fee +	// and have the permission to upload. +	getChildView("upload")->setEnabled(mHasUploadPerm); + +	mUploadModelUrl = upload_url; + +	S32 fee = result["upload_price"].asInteger(); +	childSetTextArg("review_fee", "[FEE]", llformat("%d", fee)); +	childSetTextArg("charged_fee", "[FEE]", llformat("%d", fee)); + +	setState(REVIEW); +} + +/*virtual*/ +void LLFloaterModelWizard::setModelPhysicsFeeErrorStatus(U32 status, const std::string& reason) +{ +	swap_controls(mCalculateWeightsBtn, mCalculatingWeightsBtn, true); + +	// Disable the "Review" step if it has been previously enabled. +	modelChangedCallback(); + +	llwarns << "LLFloaterModelWizard::setModelPhysicsFeeErrorStatus(" << status << " : " << reason << ")" << llendl; + +	setState(PHYSICS); +} + +/*virtual*/  +void LLFloaterModelWizard::onModelUploadSuccess()  +{ +	// success! +	setState(UPLOAD); +} + +/*virtual*/ +void LLFloaterModelWizard::onModelUploadFailure() +{ +	// Failure. Make the user recalculate fees +	setState(PHYSICS); +	// Disable the "Review" step if it has been previously enabled. +	if (mLastEnabledState > PHYSICS) +	{ +		 mLastEnabledState = PHYSICS; +	} + +	updateButtons(); +} +  //static  void LLFloaterModelWizard::executePhysicsStage(std::string stage_name)  {  	if (sInstance)  	{ -		F64 physics_accuracy = sInstance->getChild<LLSliderCtrl>("physics_slider")->getValue().asReal(); +		// Invert the slider value so that "performance" end is giving the least detailed physics, +		// and the "accuracy" end is giving the most detailed physics +		F64 physics_accuracy = 1 - sInstance->getChild<LLSliderCtrl>("physics_slider")->getValue().asReal();  		sInstance->mDecompParams["Retain%"] = physics_accuracy; @@ -471,13 +611,16 @@ void LLFloaterModelWizard::DecompRequest::completed()  	{  		executePhysicsStage("Simplify");  	} +	else +	{ +		// Decomp request is complete so we can enable the "Recalculate physics" button again. +		swap_controls(sInstance->mRecalculatePhysicsBtn, sInstance->mRecalculatingPhysicsBtn, true); +	}  }  BOOL LLFloaterModelWizard::postBuild()  { -	LLView* preview_panel = getChildView("preview_panel"); -  	childSetValue("import_scale", (F32) 0.67335826);  	getChild<LLUICtrl>("browse")->setCommitCallback(boost::bind(&LLFloaterModelWizard::loadModel, this)); @@ -488,23 +631,36 @@ BOOL LLFloaterModelWizard::postBuild()  	getChild<LLUICtrl>("next")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickNext, this));  	getChild<LLUICtrl>("preview_lod_combo")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onPreviewLODCommit, this, _1));  	getChild<LLUICtrl>("preview_lod_combo2")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onPreviewLODCommit, this, _1)); -	getChild<LLUICtrl>("preview_lod_combo3")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onPreviewLODCommit, this, _1)); -	getChild<LLUICtrl>("accuracy_slider")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onAccuracyPerformance, this, _2));  	getChild<LLUICtrl>("upload")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onUpload, this)); -	getChild<LLUICtrl>("physics_slider")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onPhysicsChanged, this)); +	getChild<LLUICtrl>("switch_to_advanced")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickSwitchToAdvanced, this)); + +	mRecalculateGeometryBtn = getChild<LLButton>("recalculate_geometry_btn"); +	mRecalculateGeometryBtn->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickRecalculateGeometry, this)); + +	mRecalculatePhysicsBtn = getChild<LLButton>("recalculate_physics_btn"); +	mRecalculatePhysicsBtn->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickRecalculatePhysics, this)); + +	mRecalculatingPhysicsBtn = getChild<LLButton>("recalculating_physics_btn"); + +	mCalculateWeightsBtn = getChild<LLButton>("calculate"); +	mCalculateWeightsBtn->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickCalculateUploadFee, this)); + +	mCalculatingWeightsBtn = getChild<LLButton>("calculating"); + +	mChooseFilePreviewPanel = getChild<LLView>("choose_file_preview_panel"); +	mOptimizePreviewPanel = getChild<LLView>("optimize_preview_panel"); +	mPhysicsPreviewPanel = getChild<LLView>("physics_preview_panel");  	LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;  	enable_registrar.add("Next.OnEnable", boost::bind(&LLFloaterModelWizard::onEnableNext, this));  	enable_registrar.add("Back.OnEnable", boost::bind(&LLFloaterModelWizard::onEnableBack, this)); - - -	mPreviewRect = preview_panel->getRect();  	mModelPreview = new LLModelPreview(512, 512, this);  	mModelPreview->setPreviewTarget(16.f);  	mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelWizard::setDetails, this, _1, _2, _3, _4, _5));  	mModelPreview->setModelLoadedCallback(boost::bind(&LLFloaterModelWizard::modelLoadedCallback, this)); +	mModelPreview->setModelUpdatedCallback(boost::bind(&LLFloaterModelWizard::modelChangedCallback, this));  	mModelPreview->mViewOption["show_textures"] = true;  	center(); @@ -517,6 +673,8 @@ BOOL LLFloaterModelWizard::postBuild()  	initDecompControls(); +	requestAgentUploadPermissions(); +  	return TRUE;  } @@ -532,22 +690,29 @@ void LLFloaterModelWizard::setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F  			panel->childSetText("dimension_x", llformat("%.1f", x));  			panel->childSetText("dimension_y", llformat("%.1f", y));  			panel->childSetText("dimension_z", llformat("%.1f", z)); -			panel->childSetTextArg("streaming cost", "[COST]", llformat("%.3f", streaming_cost)); -			panel->childSetTextArg("physics cost", "[COST]", llformat("%.3f", physics_cost));	  		}  	} + +	childSetTextArg("review_prim_equiv", "[EQUIV]", llformat("%d", mModelPreview->mResourceCost));  }  void LLFloaterModelWizard::modelLoadedCallback()  {  	mLastEnabledState = CHOOSE_FILE; -	getChild<LLCheckBoxCtrl>("confirm_checkbox")->set(FALSE);  	updateButtons();  } -void LLFloaterModelWizard::onPhysicsChanged() +void LLFloaterModelWizard::modelChangedCallback()  { -	mLastEnabledState = PHYSICS; +	// Don't allow to proceed to the "Review" step if the model has changed +	// but the new upload fee hasn't been calculated yet. +	if (mLastEnabledState > PHYSICS) +	{ +		 mLastEnabledState = PHYSICS; +	} + +	getChildView("upload")->setEnabled(false); +  	updateButtons();  } @@ -556,22 +721,10 @@ void LLFloaterModelWizard::onUpload()  	mModelPreview->rebuildUploadData();  	gMeshRepo.uploadModel(mModelPreview->mUploadData, mModelPreview->mPreviewScale,  -						  true, false, false); -	 -	setState(UPLOAD); -	 -} - -void LLFloaterModelWizard::onAccuracyPerformance(const LLSD& data) -{ -	int val = (int) data.asInteger(); - -	mModelPreview->genLODs(-1, NUM_LOD-val); - -	mModelPreview->refresh(); +						  true, false, false, mUploadModelUrl, true, +						  LLHandle<LLWholeModelFeeObserver>(), getWholeModelUploadObserverHandle());  } -  void LLFloaterModelWizard::onPreviewLODCommit(LLUICtrl* ctrl)  {  	if (!mModelPreview) @@ -601,11 +754,6 @@ void LLFloaterModelWizard::refresh()  		getChildView("next")->setEnabled(model_loaded);  	} -	if (mState == REVIEW) -	{ -		getChildView("upload")->setEnabled(getChild<LLCheckBoxCtrl>("confirm_checkbox")->getValue().asBoolean()); -	} -  }  void LLFloaterModelWizard::draw() @@ -613,42 +761,35 @@ void LLFloaterModelWizard::draw()  	refresh();  	LLFloater::draw(); -	LLRect r = getRect(); -	 -	mModelPreview->update(); -	if (mModelPreview) +	if (mModelPreview && mState < REVIEW)  	{ +		mModelPreview->update(); +  		gGL.color3f(1.f, 1.f, 1.f);  		gGL.getTexUnit(0)->bind(mModelPreview); -		LLView *view = getChildView(stateNames[mState]+"_panel"); -		LLView* preview_panel = view->getChildView("preview_panel"); - -		LLRect rect = preview_panel->getRect(); -		if (rect != mPreviewRect) -		{ -			mModelPreview->refresh(); -			mPreviewRect = preview_panel->getRect(); -		} -		 -		LLRect item_rect; -		preview_panel->localRectToOtherView(preview_panel->getLocalRect(), &item_rect, this); -	  		gGL.begin( LLRender::QUADS );  		{  			gGL.texCoord2f(0.f, 1.f); -			gGL.vertex2i(item_rect.mLeft, item_rect.mTop-1); +			gGL.vertex2i(mPreviewRect.mLeft, mPreviewRect.mTop);  			gGL.texCoord2f(0.f, 0.f); -			gGL.vertex2i(item_rect.mLeft, item_rect.mBottom); +			gGL.vertex2i(mPreviewRect.mLeft, mPreviewRect.mBottom);  			gGL.texCoord2f(1.f, 0.f); -			gGL.vertex2i(item_rect.mRight-1, item_rect.mBottom); +			gGL.vertex2i(mPreviewRect.mRight, mPreviewRect.mBottom);  			gGL.texCoord2f(1.f, 1.f); -			gGL.vertex2i(item_rect.mRight-1, item_rect.mTop-1); +			gGL.vertex2i(mPreviewRect.mRight, mPreviewRect.mTop);  		}  		gGL.end();  		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);  	}  } + +// static +void swap_controls(LLUICtrl* first_ctrl, LLUICtrl* second_ctrl, bool first_ctr_visible) +{ +	first_ctrl->setVisible(first_ctr_visible); +	second_ctrl->setVisible(!first_ctr_visible); +} diff --git a/indra/newview/llfloatermodelwizard.h b/indra/newview/llfloatermodelwizard.h index b166d26295..db9b605777 100644 --- a/indra/newview/llfloatermodelwizard.h +++ b/indra/newview/llfloatermodelwizard.h @@ -30,12 +30,13 @@  #include "llmeshrepository.h"  #include "llmodel.h"  #include "llthread.h" +#include "llfloatermodeluploadbase.h"  class LLModelPreview; -class LLFloaterModelWizard : public LLFloater +class LLFloaterModelWizard : public LLFloaterModelUploadBase  {  public: @@ -62,13 +63,29 @@ public:  	BOOL handleMouseDown(S32 x, S32 y, MASK mask);  	BOOL handleMouseUp(S32 x, S32 y, MASK mask);  	BOOL handleHover(S32 x, S32 y, MASK mask); -	BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);  +	BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);  	void setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost);  	void modelLoadedCallback(); -	void onPhysicsChanged(); +	void modelChangedCallback();  	void initDecompControls(); +	// shows warning message if agent has no permissions to upload model +	/*virtual*/ void onPermissionsReceived(const LLSD& result); + +	// called when error occurs during permissions request +	/*virtual*/ void setPermissonsErrorStatus(U32 status, const std::string& reason); + +	/*virtual*/ void onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url); + +	/*virtual*/ void setModelPhysicsFeeErrorStatus(U32 status, const std::string& reason); + +	/*virtual*/ void onModelUploadSuccess(); + +	/*virtual*/ void onModelUploadFailure(); + +	const LLRect& getPreviewRect() const { return mPreviewRect; } +  	LLPhysicsDecomp::decomp_params mDecompParams;  	std::set<LLPointer<DecompRequest> > mCurRequest;  	std::string mStatusMessage; @@ -80,13 +97,16 @@ private:  		CHOOSE_FILE = 0,  		OPTIMIZE,  		PHYSICS, -		PHYSICS2,  		REVIEW,  		UPLOAD  	};  	void setState(int state);  	void updateButtons(); +	void onClickSwitchToAdvanced(); +	void onClickRecalculateGeometry(); +	void onClickRecalculatePhysics(); +	void onClickCalculateUploadFee();  	void onClickCancel();  	void onClickBack();  	void onClickNext(); @@ -94,7 +114,6 @@ private:  	bool onEnableBack();  	void loadModel();  	void onPreviewLODCommit(LLUICtrl*); -	void onAccuracyPerformance(const LLSD& data);  	void onUpload();  	LLModelPreview*	mModelPreview; @@ -106,7 +125,15 @@ private:  	U32			    mLastEnabledState; +	LLButton*		mRecalculateGeometryBtn; +	LLButton*		mRecalculatePhysicsBtn; +	LLButton*		mRecalculatingPhysicsBtn; +	LLButton*		mCalculateWeightsBtn; +	LLButton*		mCalculatingWeightsBtn; +	LLView*		mChooseFilePreviewPanel; +	LLView*		mOptimizePreviewPanel; +	LLView*		mPhysicsPreviewPanel;  }; diff --git a/indra/newview/llfloaterobjectweights.cpp b/indra/newview/llfloaterobjectweights.cpp new file mode 100644 index 0000000000..0862cd2897 --- /dev/null +++ b/indra/newview/llfloaterobjectweights.cpp @@ -0,0 +1,266 @@ +/** + * @file llfloaterobjectweights.cpp + * @brief Object weights advanced view floater + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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 "llfloaterobjectweights.h" + +#include "llparcel.h" + +#include "llfloaterreg.h" +#include "lltextbox.h" + +#include "llagent.h" +#include "llviewerparcelmgr.h" +#include "llviewerregion.h" + +// virtual +bool LLCrossParcelFunctor::apply(LLViewerObject* obj) +{ +	// Add the root object box. +	mBoundingBox.addBBoxAgent(LLBBox(obj->getPositionRegion(), obj->getRotationRegion(), obj->getScale() * -0.5f, obj->getScale() * 0.5f).getAxisAligned()); + +	// Extend the bounding box across all the children. +	LLViewerObject::const_child_list_t children = obj->getChildren(); +	for (LLViewerObject::const_child_list_t::const_iterator iter = children.begin(); +		 iter != children.end(); iter++) +	{ +		LLViewerObject* child = *iter; +		mBoundingBox.addBBoxAgent(LLBBox(child->getPositionRegion(), child->getRotationRegion(), child->getScale() * -0.5f, child->getScale() * 0.5f).getAxisAligned()); +	} + +	bool result = false; + +	LLViewerRegion* region = obj->getRegion(); +	if (region) +	{ +		std::vector<LLBBox> boxes; +		boxes.push_back(mBoundingBox); +		result = region->objectsCrossParcel(boxes); +	} + +	return result; +} + +LLFloaterObjectWeights::LLFloaterObjectWeights(const LLSD& key) +:	LLFloater(key), +	mSelectedObjects(NULL), +	mSelectedPrims(NULL), +	mSelectedDownloadWeight(NULL), +	mSelectedPhysicsWeight(NULL), +	mSelectedServerWeight(NULL), +	mSelectedDisplayWeight(NULL), +	mSelectedOnLand(NULL), +	mRezzedOnLand(NULL), +	mRemainingCapacity(NULL), +	mTotalCapacity(NULL) +{ +} + +LLFloaterObjectWeights::~LLFloaterObjectWeights() +{ +} + +// virtual +BOOL LLFloaterObjectWeights::postBuild() +{ +	mSelectedObjects = getChild<LLTextBox>("objects"); +	mSelectedPrims = getChild<LLTextBox>("prims"); + +	mSelectedDownloadWeight = getChild<LLTextBox>("download"); +	mSelectedPhysicsWeight = getChild<LLTextBox>("physics"); +	mSelectedServerWeight = getChild<LLTextBox>("server"); +	mSelectedDisplayWeight = getChild<LLTextBox>("display"); + +	mSelectedOnLand = getChild<LLTextBox>("selected"); +	mRezzedOnLand = getChild<LLTextBox>("rezzed_on_land"); +	mRemainingCapacity = getChild<LLTextBox>("remaining_capacity"); +	mTotalCapacity = getChild<LLTextBox>("total_capacity"); + +	return TRUE; +} + +// virtual +void LLFloaterObjectWeights::onOpen(const LLSD& key) +{ +	refresh(); +	updateLandImpacts(LLViewerParcelMgr::getInstance()->getFloatingParcelSelection()->getParcel()); +} + +// virtual +void LLFloaterObjectWeights::onWeightsUpdate(const SelectionCost& selection_cost) +{ +	mSelectedDownloadWeight->setText(llformat("%.1f", selection_cost.mNetworkCost)); +	mSelectedPhysicsWeight->setText(llformat("%.1f", selection_cost.mPhysicsCost)); +	mSelectedServerWeight->setText(llformat("%.1f", selection_cost.mSimulationCost)); + +	S32 render_cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectRenderCost(); +	mSelectedDisplayWeight->setText(llformat("%d", render_cost)); + +	toggleWeightsLoadingIndicators(false); +} + +//virtual +void LLFloaterObjectWeights::setErrorStatus(U32 status, const std::string& reason) +{ +	const std::string text = getString("nothing_selected"); + +	mSelectedDownloadWeight->setText(text); +	mSelectedPhysicsWeight->setText(text); +	mSelectedServerWeight->setText(text); +	mSelectedDisplayWeight->setText(text); + +	toggleWeightsLoadingIndicators(false); +} + +void LLFloaterObjectWeights::updateLandImpacts(const LLParcel* parcel) +{ +	if (!parcel || LLSelectMgr::getInstance()->getSelection()->isEmpty()) +	{ +		updateIfNothingSelected(); +	} +	else +	{ +		S32 rezzed_prims = parcel->getSimWidePrimCount(); +		S32 total_capacity = parcel->getSimWideMaxPrimCapacity(); + +		mRezzedOnLand->setText(llformat("%d", rezzed_prims)); +		mRemainingCapacity->setText(llformat("%d", total_capacity - rezzed_prims)); +		mTotalCapacity->setText(llformat("%d", total_capacity)); + +		toggleLandImpactsLoadingIndicators(false); +	} +} + +void LLFloaterObjectWeights::refresh() +{ +	LLSelectMgr* sel_mgr = LLSelectMgr::getInstance(); + +	if (sel_mgr->getSelection()->isEmpty()) +	{ +		updateIfNothingSelected(); +	} +	else +	{ +		S32 prim_count = sel_mgr->getSelection()->getObjectCount(); +		S32 link_count = sel_mgr->getSelection()->getRootObjectCount(); +		F32 prim_equiv = sel_mgr->getSelection()->getSelectedLinksetCost(); + +		mSelectedObjects->setText(llformat("%d", link_count)); +		mSelectedPrims->setText(llformat("%d", prim_count)); +		mSelectedOnLand->setText(llformat("%.1d", (S32)prim_equiv)); + +		LLCrossParcelFunctor func; +		if (sel_mgr->getSelection()->applyToRootObjects(&func, true)) +		{ +			// Some of the selected objects cross parcel bounds. +			// We don't display object weights and land impacts in this case. +			const std::string text = getString("nothing_selected"); + +			mRezzedOnLand->setText(text); +			mRemainingCapacity->setText(text); +			mTotalCapacity->setText(text); + +			toggleLandImpactsLoadingIndicators(false); +		} + +		LLViewerRegion* region = gAgent.getRegion(); +		if (region && region->capabilitiesReceived()) +		{ +			for (LLObjectSelection::valid_root_iterator iter = sel_mgr->getSelection()->valid_root_begin(); +					iter != sel_mgr->getSelection()->valid_root_end(); ++iter) +			{ +				LLAccountingCostManager::getInstance()->addObject((*iter)->getObject()->getID()); +			} + +			std::string url = region->getCapability("ResourceCostSelected"); +			if (!url.empty()) +			{ +				// Update the transaction id before the new fetch request +				generateTransactionID(); + +				LLAccountingCostManager::getInstance()->fetchCosts(Roots, url, getObserverHandle()); +				toggleWeightsLoadingIndicators(true); +			} +		} +		else +		{ +			llwarns << "Failed to get region capabilities" << llendl; +		} +	} +} + +// virtual +void LLFloaterObjectWeights::generateTransactionID() +{ +	mTransactionID.generate(); +} + +void LLFloaterObjectWeights::toggleWeightsLoadingIndicators(bool visible) +{ +	childSetVisible("download_loading_indicator", visible); +	childSetVisible("physics_loading_indicator", visible); +	childSetVisible("server_loading_indicator", visible); +	childSetVisible("display_loading_indicator", visible); + +	mSelectedDownloadWeight->setVisible(!visible); +	mSelectedPhysicsWeight->setVisible(!visible); +	mSelectedServerWeight->setVisible(!visible); +	mSelectedDisplayWeight->setVisible(!visible); +} + +void LLFloaterObjectWeights::toggleLandImpactsLoadingIndicators(bool visible) +{ +	childSetVisible("selected_loading_indicator", visible); +	childSetVisible("rezzed_on_land_loading_indicator", visible); +	childSetVisible("remaining_capacity_loading_indicator", visible); +	childSetVisible("total_capacity_loading_indicator", visible); + +	mSelectedOnLand->setVisible(!visible); +	mRezzedOnLand->setVisible(!visible); +	mRemainingCapacity->setVisible(!visible); +	mTotalCapacity->setVisible(!visible); +} + +void LLFloaterObjectWeights::updateIfNothingSelected() +{ +	const std::string text = getString("nothing_selected"); + +	mSelectedObjects->setText(text); +	mSelectedPrims->setText(text); + +	mSelectedDownloadWeight->setText(text); +	mSelectedPhysicsWeight->setText(text); +	mSelectedServerWeight->setText(text); +	mSelectedDisplayWeight->setText(text); + +	mSelectedOnLand->setText(text); +	mRezzedOnLand->setText(text); +	mRemainingCapacity->setText(text); +	mTotalCapacity->setText(text); + +	toggleWeightsLoadingIndicators(false); +	toggleLandImpactsLoadingIndicators(false); +} diff --git a/indra/newview/llfloaterobjectweights.h b/indra/newview/llfloaterobjectweights.h new file mode 100644 index 0000000000..9a244573be --- /dev/null +++ b/indra/newview/llfloaterobjectweights.h @@ -0,0 +1,93 @@ +/** + * @file llfloaterobjectweights.h + * @brief Object weights advanced view floater + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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_LLFLOATEROBJECTWEIGHTS_H +#define LL_LLFLOATEROBJECTWEIGHTS_H + +#include "llfloater.h" + +#include "llaccountingcostmanager.h" +#include "llselectmgr.h" + +class LLParcel; +class LLTextBox; + +/** + * struct LLCrossParcelFunctor + * + * A functor that checks whether a bounding box for all + * selected objects crosses a region or parcel bounds. + */ +struct LLCrossParcelFunctor : public LLSelectedObjectFunctor +{ +	/*virtual*/ bool apply(LLViewerObject* obj); + +private: +	LLBBox	mBoundingBox; +}; + + +class LLFloaterObjectWeights : public LLFloater, LLAccountingCostObserver +{ +public: +	LOG_CLASS(LLFloaterObjectWeights); + +	LLFloaterObjectWeights(const LLSD& key); +	~LLFloaterObjectWeights(); + +	/*virtual*/ BOOL postBuild(); + +	/*virtual*/ void onOpen(const LLSD& key); + +	/*virtual*/ void onWeightsUpdate(const SelectionCost& selection_cost); +	/*virtual*/ void setErrorStatus(U32 status, const std::string& reason); + +	void updateLandImpacts(const LLParcel* parcel); +	void refresh(); + +private: +	/*virtual*/ void generateTransactionID(); + +	void toggleWeightsLoadingIndicators(bool visible); +	void toggleLandImpactsLoadingIndicators(bool visible); + +	void updateIfNothingSelected(); + +	LLTextBox		*mSelectedObjects; +	LLTextBox		*mSelectedPrims; + +	LLTextBox		*mSelectedDownloadWeight; +	LLTextBox		*mSelectedPhysicsWeight; +	LLTextBox		*mSelectedServerWeight; +	LLTextBox		*mSelectedDisplayWeight; + +	LLTextBox		*mSelectedOnLand; +	LLTextBox		*mRezzedOnLand; +	LLTextBox		*mRemainingCapacity; +	LLTextBox		*mTotalCapacity; +}; + +#endif //LL_LLFLOATEROBJECTWEIGHTS_H diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp index dd0b1d999c..3bcbb987f7 100644 --- a/indra/newview/llfloaterpostcard.cpp +++ b/indra/newview/llfloaterpostcard.cpp @@ -137,9 +137,9 @@ void LLFloaterPostcard::draw()  		// first set the max extents of our preview  		rect.translate(-rect.mLeft, -rect.mBottom); -		rect.mLeft += 280; +		rect.mLeft += 320;  		rect.mRight -= 10; -		rect.mTop -= 20; +		rect.mTop -= 27;  		rect.mBottom = rect.mTop - 130;  		// then fix the aspect ratio diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 7848484ac6..5fdeb46daa 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -50,6 +50,7 @@  #include "llfloaterreg.h"  #include "llfloaterabout.h"  #include "llfloaterhardwaresettings.h" +#include "llfloatersidepanelcontainer.h"  #include "llimfloater.h"  #include "llkeyboard.h"  #include "llmodaldialog.h" @@ -66,7 +67,6 @@  #include "llscrolllistctrl.h"  #include "llscrolllistitem.h"  #include "llsliderctrl.h" -#include "llsidetray.h"  #include "lltabcontainer.h"  #include "lltrans.h"  #include "llviewercontrol.h" @@ -105,6 +105,7 @@  #include "llviewermedia.h"  #include "llpluginclassmedia.h"  #include "llteleporthistorystorage.h" +#include "llproxy.h"  #include "lllogininstance.h"        // to check if logged in yet  #include "llsdserialize.h" @@ -158,7 +159,7 @@ BOOL LLVoiceSetKeyDialog::handleKeyHere(KEY key, MASK mask)  {  	BOOL result = TRUE; -	if(key == 'Q' && mask == MASK_CONTROL) +	if (key == 'Q' && mask == MASK_CONTROL)  	{  		result = FALSE;  	} @@ -303,7 +304,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)  	mOriginalIMViaEmail(false),  	mLanguageChanged(false),  	mAvatarDataInitialized(false), -	mDoubleClickActionDirty(false) +	mClickActionDirty(false)  {  	//Build Floater is now Called from 	LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>); @@ -333,21 +334,21 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)  	mCommitCallbackRegistrar.add("Pref.ClickEnablePopup",		boost::bind(&LLFloaterPreference::onClickEnablePopup, this));  	mCommitCallbackRegistrar.add("Pref.ClickDisablePopup",		boost::bind(&LLFloaterPreference::onClickDisablePopup, this));	  	mCommitCallbackRegistrar.add("Pref.LogPath",				boost::bind(&LLFloaterPreference::onClickLogPath, this)); -	mCommitCallbackRegistrar.add("Pref.HardwareSettings",       boost::bind(&LLFloaterPreference::onOpenHardwareSettings, this));	 -	mCommitCallbackRegistrar.add("Pref.HardwareDefaults",       boost::bind(&LLFloaterPreference::setHardwareDefaults, this));	 -	mCommitCallbackRegistrar.add("Pref.VertexShaderEnable",     boost::bind(&LLFloaterPreference::onVertexShaderEnable, this));	 -	mCommitCallbackRegistrar.add("Pref.WindowedMod",            boost::bind(&LLFloaterPreference::onCommitWindowedMode, this));	 -	mCommitCallbackRegistrar.add("Pref.UpdateSliderText",       boost::bind(&LLFloaterPreference::onUpdateSliderText,this, _1,_2));	 -	mCommitCallbackRegistrar.add("Pref.QualityPerformance",     boost::bind(&LLFloaterPreference::onChangeQuality, this, _2));	 +	mCommitCallbackRegistrar.add("Pref.HardwareSettings",		boost::bind(&LLFloaterPreference::onOpenHardwareSettings, this)); +	mCommitCallbackRegistrar.add("Pref.HardwareDefaults",		boost::bind(&LLFloaterPreference::setHardwareDefaults, this)); +	mCommitCallbackRegistrar.add("Pref.VertexShaderEnable",		boost::bind(&LLFloaterPreference::onVertexShaderEnable, this)); +	mCommitCallbackRegistrar.add("Pref.WindowedMod",			boost::bind(&LLFloaterPreference::onCommitWindowedMode, this)); +	mCommitCallbackRegistrar.add("Pref.UpdateSliderText",		boost::bind(&LLFloaterPreference::onUpdateSliderText,this, _1,_2)); +	mCommitCallbackRegistrar.add("Pref.QualityPerformance",		boost::bind(&LLFloaterPreference::onChangeQuality, this, _2));  	mCommitCallbackRegistrar.add("Pref.applyUIColor",			boost::bind(&LLFloaterPreference::applyUIColor, this ,_1, _2));  	mCommitCallbackRegistrar.add("Pref.getUIColor",				boost::bind(&LLFloaterPreference::getUIColor, this ,_1, _2));  	mCommitCallbackRegistrar.add("Pref.MaturitySettings",		boost::bind(&LLFloaterPreference::onChangeMaturity, this));  	mCommitCallbackRegistrar.add("Pref.BlockList",				boost::bind(&LLFloaterPreference::onClickBlockList, this)); +	mCommitCallbackRegistrar.add("Pref.Proxy",					boost::bind(&LLFloaterPreference::onClickProxySettings, this));  	sSkin = gSavedSettings.getString("SkinCurrent"); -	mCommitCallbackRegistrar.add("Pref.CommitDoubleClickChekbox",	boost::bind(&LLFloaterPreference::onDoubleClickCheckBox, this, _1)); -	mCommitCallbackRegistrar.add("Pref.CommitRadioDoubleClick",	boost::bind(&LLFloaterPreference::onDoubleClickRadio, this)); +	mCommitCallbackRegistrar.add("Pref.ClickActionChange",				boost::bind(&LLFloaterPreference::onClickActionChange, this));  	gSavedSettings.getControl("NameTagShowUsernames")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged,  _2));	  	gSavedSettings.getControl("NameTagShowFriends")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged,  _2));	 @@ -437,8 +438,6 @@ BOOL LLFloaterPreference::postBuild()  	if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))  		tabcontainer->selectFirstTab(); -	updateDoubleClickControls(); -  	getChild<LLUICtrl>("cache_location")->setEnabled(FALSE); // make it read-only but selectable (STORM-227)  	std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");  	setCacheLocation(cache_location); @@ -457,7 +456,7 @@ BOOL LLFloaterPreference::postBuild()  void LLFloaterPreference::onBusyResponseChanged()  {  	// set "BusyResponseChanged" TRUE if user edited message differs from default, FALSE otherwise -	if(LLTrans::getString("BusyModeResponseDefault") != getChild<LLUICtrl>("busy_response")->getValue().asString()) +	if (LLTrans::getString("BusyModeResponseDefault") != getChild<LLUICtrl>("busy_response")->getValue().asString())  	{  		gSavedPerAccountSettings.setBOOL("BusyResponseChanged", TRUE );  	} @@ -539,7 +538,7 @@ void LLFloaterPreference::apply()  	LLViewerMedia::setCookiesEnabled(getChild<LLUICtrl>("cookies_enabled")->getValue()); -	if(hasChild("web_proxy_enabled") &&hasChild("web_proxy_editor") && hasChild("web_proxy_port")) +	if (hasChild("web_proxy_enabled") &&hasChild("web_proxy_editor") && hasChild("web_proxy_port"))  	{  		bool proxy_enable = getChild<LLUICtrl>("web_proxy_enabled")->getValue();  		std::string proxy_address = getChild<LLUICtrl>("web_proxy_editor")->getValue(); @@ -552,13 +551,13 @@ void LLFloaterPreference::apply()  	gSavedSettings.setBOOL("PlainTextChatHistory", getChild<LLUICtrl>("plain_text_chat_history")->getValue().asBoolean()); -	if(mGotPersonalInfo) +	if (mGotPersonalInfo)  	{   //		gSavedSettings.setString("BusyModeResponse2", std::string(wstring_to_utf8str(busy_response)));  		bool new_im_via_email = getChild<LLUICtrl>("send_im_to_email")->getValue().asBoolean();  		bool new_hide_online = getChild<LLUICtrl>("online_visibility")->getValue().asBoolean();		 -		if((new_im_via_email != mOriginalIMViaEmail) +		if ((new_im_via_email != mOriginalIMViaEmail)  			||(new_hide_online != mOriginalHideOnlineStatus))  		{  			// This hack is because we are representing several different 	  @@ -566,23 +565,23 @@ void LLFloaterPreference::apply()  			// can only select between 2 values, we represent it as a 	   			// checkbox. This breaks down a little bit for liaisons, but 	   			// works out in the end. 	  -			if(new_hide_online != mOriginalHideOnlineStatus) 	  -			{ 	  -				if(new_hide_online) mDirectoryVisibility = VISIBILITY_HIDDEN; +			if (new_hide_online != mOriginalHideOnlineStatus) +			{ +				if (new_hide_online) mDirectoryVisibility = VISIBILITY_HIDDEN;  				else mDirectoryVisibility = VISIBILITY_DEFAULT;  			 //Update showonline value, otherwise multiple applys won't work  				mOriginalHideOnlineStatus = new_hide_online; -			} 	  +			}  			gAgent.sendAgentUpdateUserInfo(new_im_via_email,mDirectoryVisibility);  		}  	}  	saveAvatarProperties(); -	if (mDoubleClickActionDirty) +	if (mClickActionDirty)  	{ -		updateDoubleClickSettings(); -		mDoubleClickActionDirty = false; +		updateClickActionSettings(); +		mClickActionDirty = false;  	}  } @@ -611,10 +610,16 @@ void LLFloaterPreference::cancel()  	// reverts any changes to current skin  	gSavedSettings.setString("SkinCurrent", sSkin); -	if (mDoubleClickActionDirty) +	if (mClickActionDirty)  	{ -		updateDoubleClickControls(); -		mDoubleClickActionDirty = false; +		updateClickActionControls(); +		mClickActionDirty = false; +	} + +	LLFloaterPreferenceProxy * advanced_proxy_settings = LLFloaterReg::findTypedInstance<LLFloaterPreferenceProxy>("prefs_proxy"); +	if (advanced_proxy_settings) +	{ +		advanced_proxy_settings->cancel();  	}  } @@ -675,6 +680,9 @@ void LLFloaterPreference::onOpen(const LLSD& key)  	// Display selected maturity icons.  	onChangeMaturity(); +	// Load (double-)click to walk/teleport settings. +	updateClickActionControls(); +	  	// Enabled/disabled popups, might have been changed by user actions  	// while preferences floater was closed.  	buildPopupLists(); @@ -751,10 +759,7 @@ void LLFloaterPreference::onBtnOK()  		closeFloater(false);  		LLUIColorTable::instance().saveUserSettings(); -		gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE ); -		std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE); -		// save all settings, even if equals defaults -		gCrashSettings.saveToFile(crash_settings_filename, FALSE); +		gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);  	}  	else  	{ @@ -802,7 +807,7 @@ void LLFloaterPreference::onBtnCancel()  void LLFloaterPreference::updateUserInfo(const std::string& visibility, bool im_via_email, const std::string& email)  {  	LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); -	if(instance) +	if (instance)  	{  		instance->setPersonalInfo(visibility, im_via_email, email);	  	} @@ -812,7 +817,7 @@ void LLFloaterPreference::updateUserInfo(const std::string& visibility, bool im_  void LLFloaterPreference::refreshEnabledGraphics()  {  	LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); -	if(instance) +	if (instance)  	{  		instance->refresh();  		//instance->refreshEnabledState(); @@ -1099,7 +1104,7 @@ void LLFloaterPreference::disableUnavailableSettings()  	LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");  	// if vertex shaders off, disable all shader related products -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable"))  	{  		ctrl_shader_enable->setEnabled(FALSE);  		ctrl_shader_enable->setValue(FALSE); @@ -1130,7 +1135,7 @@ void LLFloaterPreference::disableUnavailableSettings()  	}  	// disabled windlight -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders"))  	{  		ctrl_wind_light->setEnabled(FALSE);  		ctrl_wind_light->setValue(FALSE); @@ -1167,28 +1172,28 @@ void LLFloaterPreference::disableUnavailableSettings()  	}  	// disabled deferred SSAO -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO"))  	{  		ctrl_ssao->setEnabled(FALSE);  		ctrl_ssao->setValue(FALSE);  	}  	// disabled deferred shadows -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail"))  	{  		ctrl_shadows->setEnabled(FALSE);  		ctrl_shadows->setValue(0);  	}  	// disabled reflections -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionDetail")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionDetail"))  	{  		ctrl_reflections->setEnabled(FALSE);  		ctrl_reflections->setValue(FALSE);  	}  	// disabled av -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP"))  	{  		ctrl_avatar_vp->setEnabled(FALSE);  		ctrl_avatar_vp->setValue(FALSE); @@ -1211,14 +1216,14 @@ void LLFloaterPreference::disableUnavailableSettings()  	}  	// disabled cloth -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarCloth")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarCloth"))  	{  		ctrl_avatar_cloth->setEnabled(FALSE);  		ctrl_avatar_cloth->setValue(FALSE);  	}  	// disabled impostors -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderUseImpostors")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderUseImpostors"))  	{  		ctrl_avatar_impostors->setEnabled(FALSE);  		ctrl_avatar_impostors->setValue(FALSE); @@ -1384,12 +1389,12 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im  	mOriginalIMViaEmail = im_via_email;  	mDirectoryVisibility = visibility; -	if(visibility == VISIBILITY_DEFAULT) +	if (visibility == VISIBILITY_DEFAULT)  	{  		mOriginalHideOnlineStatus = false;  		getChildView("online_visibility")->setEnabled(TRUE); 	   	} -	else if(visibility == VISIBILITY_HIDDEN) +	else if (visibility == VISIBILITY_HIDDEN)  	{  		mOriginalHideOnlineStatus = true;  		getChildView("online_visibility")->setEnabled(TRUE); 	  @@ -1437,7 +1442,7 @@ void LLFloaterPreference::onUpdateSliderText(LLUICtrl* ctrl, const LLSD& name)  {  	std::string ctrl_name = name.asString(); -	if((ctrl_name =="" )|| !hasChild(ctrl_name, true)) +	if ((ctrl_name =="" )|| !hasChild(ctrl_name, true))  		return;  	LLTextBox* text_box = getChild<LLTextBox>(name.asString()); @@ -1447,7 +1452,7 @@ void LLFloaterPreference::onUpdateSliderText(LLUICtrl* ctrl, const LLSD& name)  void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box)  { -	if(text_box == NULL || ctrl== NULL) +	if (text_box == NULL || ctrl== NULL)  		return;  	// get range and points when text should change @@ -1460,7 +1465,7 @@ void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_b  	F32 highPoint = min + (2.0f * range / 3.0f);  	// choose the right text -	if(value < midPoint) +	if (value < midPoint)  	{  		text_box->setText(LLTrans::getString("GraphicsQualityLow"));  	}  @@ -1492,74 +1497,37 @@ void LLFloaterPreference::onChangeMaturity()  // but the UI for this will still be enabled  void LLFloaterPreference::onClickBlockList()  { -	// don't create side tray on demand -	if (LLSideTray::instanceCreated()) -	{ -		LLSideTray::getInstance()->showPanel("panel_block_list_sidetray"); -	} +	LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD());  } -void LLFloaterPreference::onDoubleClickCheckBox(LLUICtrl* ctrl) +void LLFloaterPreference::onClickProxySettings()  { -	if (!ctrl) return; -	mDoubleClickActionDirty = true; -	LLRadioGroup* radio_double_click_action = getChild<LLRadioGroup>("double_click_action"); -	if (!radio_double_click_action) return; -	// select default value("teleport") in radio-group. -	radio_double_click_action->setSelectedIndex(0); -	// set radio-group enabled depending on state of checkbox -	radio_double_click_action->setEnabled(ctrl->getValue()); +	LLFloaterReg::showInstance("prefs_proxy");  } -void LLFloaterPreference::onDoubleClickRadio() +void LLFloaterPreference::onClickActionChange()  { -	mDoubleClickActionDirty = true; +	mClickActionDirty = true;  } -void LLFloaterPreference::updateDoubleClickSettings() +void LLFloaterPreference::updateClickActionSettings()  { -	LLCheckBoxCtrl* double_click_action_cb = getChild<LLCheckBoxCtrl>("double_click_chkbox"); -	if (!double_click_action_cb) return; -	bool enable = double_click_action_cb->getValue().asBoolean(); +	const int single_clk_action = getChild<LLComboBox>("single_click_action_combo")->getValue().asInteger(); +	const int double_clk_action = getChild<LLComboBox>("double_click_action_combo")->getValue().asInteger(); -	LLRadioGroup* radio_double_click_action = getChild<LLRadioGroup>("double_click_action"); -	if (!radio_double_click_action) return; -	 -	// enable double click radio-group depending on state of checkbox -	radio_double_click_action->setEnabled(enable); -	 -	if (!enable) -	{ -		// set double click action settings values to false if checkbox was unchecked -		gSavedSettings.setBOOL("DoubleClickAutoPilot", false); -		gSavedSettings.setBOOL("DoubleClickTeleport", false); -	} -	else -	{ -		std::string selected = radio_double_click_action->getValue().asString(); -		bool teleport_selected = selected == "radio_teleport"; -		// set double click action settings values depending on chosen radio-button -		gSavedSettings.setBOOL( "DoubleClickTeleport", teleport_selected ); -		gSavedSettings.setBOOL( "DoubleClickAutoPilot", !teleport_selected ); -	} +	gSavedSettings.setBOOL("ClickToWalk",			single_clk_action == 1); +	gSavedSettings.setBOOL("DoubleClickAutoPilot",	double_clk_action == 1); +	gSavedSettings.setBOOL("DoubleClickTeleport",	double_clk_action == 2);  } -void LLFloaterPreference::updateDoubleClickControls() +void LLFloaterPreference::updateClickActionControls()  { -	// check is one of double-click actions settings enabled -	bool double_click_action_enabled = gSavedSettings.getBOOL("DoubleClickAutoPilot") || gSavedSettings.getBOOL("DoubleClickTeleport"); -	LLCheckBoxCtrl* double_click_action_cb = getChild<LLCheckBoxCtrl>("double_click_chkbox"); -	if (double_click_action_cb) -	{ -		// check checkbox if one of double-click actions settings enabled, uncheck otherwise -		double_click_action_cb->setValue(double_click_action_enabled); -	} -	LLRadioGroup* double_click_action_radio = getChild<LLRadioGroup>("double_click_action"); -	if (!double_click_action_radio) return; -	// set radio-group enabled if one of double-click actions settings enabled -	double_click_action_radio->setEnabled(double_click_action_enabled); -	// select button in radio-group depending on setting -	double_click_action_radio->setSelectedIndex(gSavedSettings.getBOOL("DoubleClickAutoPilot")); +	const bool click_to_walk = gSavedSettings.getBOOL("ClickToWalk"); +	const bool dbl_click_to_walk = gSavedSettings.getBOOL("DoubleClickAutoPilot"); +	const bool dbl_click_to_teleport = gSavedSettings.getBOOL("DoubleClickTeleport"); + +	getChild<LLComboBox>("single_click_action_combo")->setValue((int)click_to_walk); +	getChild<LLComboBox>("double_click_action_combo")->setValue(dbl_click_to_teleport ? 2 : (int)dbl_click_to_walk);  }  void LLFloaterPreference::applyUIColor(LLUICtrl* ctrl, const LLSD& param) @@ -1640,7 +1608,7 @@ BOOL LLPanelPreference::postBuild()  {  	////////////////////// PanelVoice /////////////////// -	if(hasChild("voice_unavailable")) +	if (hasChild("voice_unavailable"))  	{  		BOOL voice_disabled = gSavedSettings.getBOOL("CmdLineDisableVoice");  		getChildView("voice_unavailable")->setVisible( voice_disabled); @@ -1662,7 +1630,7 @@ BOOL LLPanelPreference::postBuild()  	} -	if(hasChild("online_visibility") && hasChild("send_im_to_email")) +	if (hasChild("online_visibility") && hasChild("send_im_to_email"))  	{  		getChild<LLUICtrl>("email_address")->setValue(getString("log_in_to_change") );  //		getChild<LLUICtrl>("busy_response")->setValue(getString("log_in_to_change"));		 @@ -1791,7 +1759,7 @@ void LLPanelPreference::cancel()  		 iter != mSavedColors.end(); ++iter)  	{  		LLColorSwatchCtrl* color_swatch = findChild<LLColorSwatchCtrl>(iter->first); -		if(color_swatch) +		if (color_swatch)  		{  			color_swatch->set(iter->second);  			color_swatch->onCommit(); @@ -1835,7 +1803,7 @@ void LLPanelPreferenceGraphics::draw()  	LLButton* button_apply = findChild<LLButton>("Apply"); -	if(button_apply && button_apply->getVisible()) +	if (button_apply && button_apply->getVisible())  	{  		bool enable = hasDirtyChilds(); @@ -1855,7 +1823,7 @@ bool LLPanelPreferenceGraphics::hasDirtyChilds()  		LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview);  		if (ctrl)  		{ -			if(ctrl->isDirty()) +			if (ctrl->isDirty())  				return true;  		}  		// Push children onto the end of the work stack @@ -1911,3 +1879,187 @@ void LLPanelPreferenceGraphics::setHardwareDefaults()  	resetDirtyChilds();  	LLPanelPreference::setHardwareDefaults();  } + +LLFloaterPreferenceProxy::LLFloaterPreferenceProxy(const LLSD& key) +	: LLFloater(key), +	  mSocksSettingsDirty(false) +{ +	mCommitCallbackRegistrar.add("Proxy.OK",                boost::bind(&LLFloaterPreferenceProxy::onBtnOk, this)); +	mCommitCallbackRegistrar.add("Proxy.Cancel",            boost::bind(&LLFloaterPreferenceProxy::onBtnCancel, this)); +	mCommitCallbackRegistrar.add("Proxy.Change",            boost::bind(&LLFloaterPreferenceProxy::onChangeSocksSettings, this)); +} + +LLFloaterPreferenceProxy::~LLFloaterPreferenceProxy() +{ +} + +BOOL LLFloaterPreferenceProxy::postBuild() +{ +	LLRadioGroup* socksAuth = getChild<LLRadioGroup>("socks5_auth_type"); +	if (!socksAuth) +	{ +		return FALSE; +	} +	if (socksAuth->getSelectedValue().asString() == "None") +	{ +		getChild<LLLineEditor>("socks5_username")->setEnabled(false); +		getChild<LLLineEditor>("socks5_password")->setEnabled(false); +	} +	else +	{ +		// Populate the SOCKS 5 credential fields with protected values. +		LLPointer<LLCredential> socks_cred = gSecAPIHandler->loadCredential("SOCKS5"); +		getChild<LLLineEditor>("socks5_username")->setValue(socks_cred->getIdentifier()["username"].asString()); +		getChild<LLLineEditor>("socks5_password")->setValue(socks_cred->getAuthenticator()["creds"].asString()); +	} + +	return TRUE; +} + +void LLFloaterPreferenceProxy::onOpen(const LLSD& key) +{ +	saveSettings(); +} + +void LLFloaterPreferenceProxy::onClose(bool app_quitting) +{ +	if (mSocksSettingsDirty) +	{ + +		// If the user plays with the Socks proxy settings after login, it's only fair we let them know +		// it will not be updated until next restart. +		if (LLStartUp::getStartupState()>STATE_LOGIN_WAIT) +		{ +			LLNotifications::instance().add("ChangeProxySettings", LLSD(), LLSD()); +			mSocksSettingsDirty = false; // we have notified the user now be quiet again +		} +	} +} + +void LLFloaterPreferenceProxy::saveSettings() +{ +	// Save the value of all controls in the hierarchy +	mSavedValues.clear(); +	std::list<LLView*> view_stack; +	view_stack.push_back(this); +	while(!view_stack.empty()) +	{ +		// Process view on top of the stack +		LLView* curview = view_stack.front(); +		view_stack.pop_front(); + +		LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview); +		if (ctrl) +		{ +			LLControlVariable* control = ctrl->getControlVariable(); +			if (control) +			{ +				mSavedValues[control] = control->getValue(); +			} +		} + +		// Push children onto the end of the work stack +		for (child_list_t::const_iterator iter = curview->getChildList()->begin(); +				iter != curview->getChildList()->end(); ++iter) +		{ +			view_stack.push_back(*iter); +		} +	} +} + +void LLFloaterPreferenceProxy::onBtnOk() +{ +	// commit any outstanding text entry +	if (hasFocus()) +	{ +		LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus()); +		if (cur_focus && cur_focus->acceptsTextInput()) +		{ +			cur_focus->onCommit(); +		} +	} + +	// Save SOCKS proxy credentials securely if password auth is enabled +	LLRadioGroup* socksAuth = getChild<LLRadioGroup>("socks5_auth_type"); +	if (socksAuth->getSelectedValue().asString() == "UserPass") +	{ +		LLSD socks_id = LLSD::emptyMap(); +		socks_id["type"] = "SOCKS5"; +		socks_id["username"] = getChild<LLLineEditor>("socks5_username")->getValue().asString(); + +		LLSD socks_authenticator = LLSD::emptyMap(); +		socks_authenticator["type"] = "SOCKS5"; +		socks_authenticator["creds"] = getChild<LLLineEditor>("socks5_password")->getValue().asString(); + +		// Using "SOCKS5" as the "grid" argument since the same proxy +		// settings will be used for all grids and because there is no +		// way to specify the type of credential. +		LLPointer<LLCredential> socks_cred = gSecAPIHandler->createCredential("SOCKS5", socks_id, socks_authenticator); +		gSecAPIHandler->saveCredential(socks_cred, true); +	} +	else +	{ +		// Clear SOCKS5 credentials since they are no longer needed. +		LLPointer<LLCredential> socks_cred = new LLCredential("SOCKS5"); +		gSecAPIHandler->deleteCredential(socks_cred); +	} + +	closeFloater(false); +} + +void LLFloaterPreferenceProxy::onBtnCancel() +{ +	if (hasFocus()) +	{ +		LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus()); +		if (cur_focus && cur_focus->acceptsTextInput()) +		{ +			cur_focus->onCommit(); +		} +		refresh(); +	} + +	cancel(); +} + +void LLFloaterPreferenceProxy::cancel() +{ + +	for (control_values_map_t::iterator iter =  mSavedValues.begin(); +			iter !=  mSavedValues.end(); ++iter) +	{ +		LLControlVariable* control = iter->first; +		LLSD ctrl_value = iter->second; +		control->set(ctrl_value); +	} + +	closeFloater(); +} + +void LLFloaterPreferenceProxy::onChangeSocksSettings()  +{ +	mSocksSettingsDirty = true; + +	LLRadioGroup* socksAuth = getChild<LLRadioGroup>("socks5_auth_type"); +	if (socksAuth->getSelectedValue().asString() == "None") +	{ +		getChild<LLLineEditor>("socks5_username")->setEnabled(false); +		getChild<LLLineEditor>("socks5_password")->setEnabled(false); +	} +	else +	{ +		getChild<LLLineEditor>("socks5_username")->setEnabled(true); +		getChild<LLLineEditor>("socks5_password")->setEnabled(true); +	} + +	// Check for invalid states for the other HTTP proxy radio +	LLRadioGroup* otherHttpProxy = getChild<LLRadioGroup>("other_http_proxy_type"); +	if ((otherHttpProxy->getSelectedValue().asString() == "Socks" && +			getChild<LLCheckBoxCtrl>("socks_proxy_enabled")->get() == FALSE )||( +					otherHttpProxy->getSelectedValue().asString() == "Web" && +					getChild<LLCheckBoxCtrl>("web_proxy_enabled")->get() == FALSE ) ) +	{ +		otherHttpProxy->selectFirstItem(); +	} + +}; diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 61f2c78640..5c74e9f60c 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -104,14 +104,13 @@ protected:  	void setHardwareDefaults();  	// callback for when client turns on shaders  	void onVertexShaderEnable(); -	// callback for changing double click action checkbox -	void onDoubleClickCheckBox(LLUICtrl* ctrl); -	// callback for selecting double click action radio-button -	void onDoubleClickRadio(); -	// updates double-click action settings depending on controls from preferences -	void updateDoubleClickSettings(); -	// updates double-click action controls depending on values from settings.xml -	void updateDoubleClickControls(); + +	// callback for commit in the "Single click on land" and "Double click on land" comboboxes. +	void onClickActionChange(); +	// updates click/double-click action settings depending on controls values +	void updateClickActionSettings(); +	// updates click/double-click action controls depending on values from settings.xml +	void updateClickActionControls();  	// This function squirrels away the current values of the controls so that  	// cancel() can restore them.	 @@ -156,6 +155,7 @@ public:  	void applyResolution();  	void onChangeMaturity();  	void onClickBlockList(); +	void onClickProxySettings();  	void applyUIColor(LLUICtrl* ctrl, const LLSD& param);  	void getUIColor(LLUICtrl* ctrl, const LLSD& param); @@ -163,9 +163,7 @@ public:  	static void refreshSkin(void* data);  private:  	static std::string sSkin; -	// set true if state of double-click action checkbox or radio-group was changed by user -	// (reset back to false on apply or cancel) -	bool mDoubleClickActionDirty; +	bool mClickActionDirty; ///< Set to true when the click/double-click options get changed by user.  	bool mGotPersonalInfo;  	bool mOriginalIMViaEmail;  	bool mLanguageChanged; @@ -229,4 +227,33 @@ protected:  }; +class LLFloaterPreferenceProxy : public LLFloater +{ +public:  +	LLFloaterPreferenceProxy(const LLSD& key); +	~LLFloaterPreferenceProxy(); + +	/// show off our menu +	static void show(); +	void cancel(); +	 +protected: +	BOOL postBuild(); +	void onOpen(const LLSD& key); +	void onClose(bool app_quitting); +	void saveSettings(); +	void onBtnOk(); +	void onBtnCancel(); + +	void onChangeSocksSettings(); + +private: +	 +	bool mSocksSettingsDirty; +	typedef std::map<LLControlVariable*, LLSD> control_values_map_t; +	control_values_map_t mSavedValues; + +}; + +  #endif  // LL_LLPREFERENCEFLOATER_H diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index dd12fa64d3..3f00ba39c7 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -887,18 +887,14 @@ void LLFloaterProperties::dirtyAll()  LLMultiProperties::LLMultiProperties()  	: LLMultiFloater(LLSD())  { -	// *TODO: There should be a .xml file for this -	const LLRect& nextrect = LLFloaterReg::getFloaterRect("properties"); // place where the next properties should show up -	if (nextrect.getWidth() > 0) -	{ -		setRect(nextrect); -	} -	else -	{ -		// start with a small rect in the top-left corner ; will get resized -		LLRect rect; -		rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 20, 20); -		setRect(rect); +	// start with a small rect in the top-left corner ; will get resized +	LLRect rect; +	rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 20, 20); +	setRect(rect); +	LLFloater* last_floater = LLFloaterReg::getLastFloaterInGroup("properties"); +	if (last_floater) +	{ +		stackWith(*last_floater);  	}  	setTitle(LLTrans::getString("MultiPropertiesTitle"));  	buildTabContainer(); diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index bedc7ef704..676059779c 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -54,6 +54,7 @@  #include "llcombobox.h"  #include "lldaycyclemanager.h"  #include "llenvmanager.h" +#include "llestateinfomodel.h"  #include "llfilepicker.h"  #include "llfloatergodtools.h"	// for send_sim_wide_deletes()  #include "llfloatertopobjects.h" // added to fix SL-32336 @@ -171,30 +172,9 @@ bool estate_dispatch_initialized = false;  LLUUID LLFloaterRegionInfo::sRequestInvoice; -void LLFloaterRegionInfo::onConsoleReplyReceived(const std::string& output) -{ -	llwarns << "here is what they're giving us:  " << output << llendl; - -	if (output.find("FALSE") != std::string::npos) -	{ -		getChild<LLUICtrl>("mesh_rez_enabled_check")->setValue(FALSE); -	} -	else -	{ -		getChild<LLUICtrl>("mesh_rez_enabled_check")->setValue(TRUE); -	} -} - -  LLFloaterRegionInfo::LLFloaterRegionInfo(const LLSD& seed)  	: LLFloater(seed) -{ -	mConsoleReplySignalConnection = LLFloaterRegionDebugConsole::setConsoleReplyCallback( -	boost::bind( -		&LLFloaterRegionInfo::onConsoleReplyReceived, -		this, -		_1)); -} +{}  BOOL LLFloaterRegionInfo::postBuild()  { @@ -245,9 +225,7 @@ BOOL LLFloaterRegionInfo::postBuild()  }  LLFloaterRegionInfo::~LLFloaterRegionInfo() -{ -	mConsoleReplySignalConnection.disconnect(); -} +{}  void LLFloaterRegionInfo::onOpen(const LLSD& key)  { @@ -335,7 +313,7 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)  	LLViewerRegion* region = gAgent.getRegion();  	BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate()); -	// *TODO: Replace parcing msg with accessing the region info model. +	// *TODO: Replace parsing msg with accessing the region info model.  	LLRegionInfoModel& region_info = LLRegionInfoModel::instance();  	// extract message @@ -367,6 +345,7 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)  		msg->getSize("RegionInfo2", "ProductName") > 0)  	{  		msg->getString("RegionInfo2", "ProductName", sim_type); +		LLTrans::findString(sim_type, sim_type); // try localizing sim product name  	}  	// GENERAL PANEL @@ -636,9 +615,6 @@ bool LLPanelRegionGeneralInfo::refreshFromRegion(LLViewerRegion* region)  	getChildView("im_btn")->setEnabled(allow_modify);  	getChildView("manage_telehub_btn")->setEnabled(allow_modify); -	const bool enable_mesh = gMeshRepo.meshRezEnabled(); -	getChildView("mesh_rez_enabled_check")->setVisible(enable_mesh); -	getChildView("mesh_rez_enabled_check")->setEnabled(getChildView("mesh_rez_enabled_check")->getEnabled() && enable_mesh);  	// Data gets filled in by processRegionInfo  	return LLPanelRegionInfo::refreshFromRegion(region); @@ -657,7 +633,6 @@ BOOL LLPanelRegionGeneralInfo::postBuild()  	initCtrl("access_combo");  	initCtrl("restrict_pushobject");  	initCtrl("block_parcel_search_check"); -	initCtrl("mesh_rez_enabled_check");  	childSetAction("kick_btn", boost::bind(&LLPanelRegionGeneralInfo::onClickKick, this));  	childSetAction("kick_all_btn", onClickKickAll, this); @@ -873,27 +848,6 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()  		sendEstateOwnerMessage(gMessageSystem, "setregioninfo", invoice, strings);  	} -	std::string sim_console_url = gAgent.getRegion()->getCapability("SimConsoleAsync"); - -	if (!sim_console_url.empty()) -	{ -		std::string update_str = "set mesh_rez_enabled "; -		if (getChild<LLUICtrl>("mesh_rez_enabled_check")->getValue().asBoolean()) -		{ -			update_str += "true"; -		} -		else -		{ -			update_str += "false"; -		} - -		LLHTTPClient::post( -			sim_console_url, -			LLSD(update_str), -			new ConsoleUpdateResponder); -	} - -  	// if we changed access levels, tell user about it  	LLViewerRegion* region = gAgent.getRegion();  	if (region && (getChild<LLUICtrl>("access_combo")->getValue().asInteger() != region->getSimAccess()) ) @@ -1363,6 +1317,9 @@ LLPanelEstateInfo::LLPanelEstateInfo()  :	LLPanelRegionInfo(),  	mEstateID(0)	// invalid  { +	LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); +	estate_info.setCommitCallback(boost::bind(&LLPanelEstateInfo::refreshFromEstate, this)); +	estate_info.setUpdateCallback(boost::bind(&LLPanelEstateInfo::refreshFromEstate, this));  }  // static @@ -1385,29 +1342,6 @@ void LLPanelEstateInfo::initDispatch(LLDispatcher& dispatch)  	estate_dispatch_initialized = true;  } -#ifndef TMP_DISABLE_WLES -// Disables the sun-hour slider and the use fixed time check if the use global time is check -void LLPanelEstateInfo::onChangeUseGlobalTime() -{ -	bool enabled = !getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean(); -	getChildView("sun_hour_slider")->setEnabled(enabled); -	getChildView("fixed_sun_check")->setEnabled(enabled); -	getChild<LLUICtrl>("fixed_sun_check")->setValue(LLSD(FALSE)); -	enableButton("apply_btn"); -} - -// Enables the sun-hour slider if the fixed-sun checkbox is set -void LLPanelEstateInfo::onChangeFixedSun() -{ -	bool enabled = !getChild<LLUICtrl>("fixed_sun_check")->getValue().asBoolean(); -	getChildView("use_global_time_check")->setEnabled(enabled); -	getChild<LLUICtrl>("use_global_time_check")->setValue(LLSD(FALSE)); -	enableButton("apply_btn"); -} -#endif // TMP_DISABLE_WLES - - -  //---------------------------------------------------------------------------  // Add/Remove estate access button callbacks  //--------------------------------------------------------------------------- @@ -1610,10 +1544,7 @@ std::string all_estates_text()  // static  bool LLPanelEstateInfo::isLindenEstate()  { -	LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate(); -	if (!panel) return false; - -	U32 estate_id = panel->getEstateID(); +	U32 estate_id = LLEstateInfoModel::instance().getID();  	return (estate_id <= ESTATE_LAST_LINDEN);  } @@ -1975,7 +1906,7 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)  	// Can't ban people from mainland, orientation islands, etc. because this  	// creates much network traffic and server load.  	// Disable their accounts in CSR tool instead. -	bool linden_estate = (getEstateID() <= ESTATE_LAST_LINDEN); +	bool linden_estate = isLindenEstate();  	bool enable_ban = (god || owner || manager) && !linden_estate;  	getChildView("add_banned_avatar_btn")->setEnabled(enable_ban);  	getChildView("remove_banned_avatar_btn")->setEnabled(enable_ban); @@ -1987,6 +1918,8 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)  	getChildView("add_estate_manager_btn")->setEnabled(god || owner);  	getChildView("remove_estate_manager_btn")->setEnabled(god || owner);  	getChildView("estate_manager_name_list")->setEnabled(god || owner); + +	refresh();  }  bool LLPanelEstateInfo::refreshFromRegion(LLViewerRegion* region) @@ -2093,10 +2026,13 @@ BOOL LLPanelEstateInfo::postBuild()  void LLPanelEstateInfo::refresh()  { +	// Disable access restriction controls if they make no sense.  	bool public_access = getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean(); +  	getChildView("Only Allow")->setEnabled(public_access);  	getChildView("limit_payment")->setEnabled(public_access);  	getChildView("limit_age_verified")->setEnabled(public_access); +  	// if this is set to false, then the limit fields are meaningless and should be turned off  	if (public_access == false)  	{ @@ -2105,6 +2041,39 @@ void LLPanelEstateInfo::refresh()  	}  } +void LLPanelEstateInfo::refreshFromEstate() +{ +	const LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); + +	getChild<LLUICtrl>("estate_name")->setValue(estate_info.getName()); +	setOwnerName(LLSLURL("agent", estate_info.getOwnerID(), "inspect").getSLURLString()); + +	getChild<LLUICtrl>("externally_visible_check")->setValue(estate_info.getIsExternallyVisible()); +	getChild<LLUICtrl>("voice_chat_check")->setValue(estate_info.getAllowVoiceChat()); +	getChild<LLUICtrl>("allow_direct_teleport")->setValue(estate_info.getAllowDirectTeleport()); +	getChild<LLUICtrl>("limit_payment")->setValue(estate_info.getDenyAnonymous()); +	getChild<LLUICtrl>("limit_age_verified")->setValue(estate_info.getDenyAgeUnverified()); + +	// If visible from mainland, disable the access allowed +	// UI, as anyone can teleport there. +	// However, gods need to be able to edit the access list for +	// linden estates, regardless of visibility, to allow object +	// and L$ transfers. +	{ +		bool visible_from_mainland = estate_info.getIsExternallyVisible(); +		bool god = gAgent.isGodlike(); +		bool linden_estate = isLindenEstate(); + +		bool enable_agent = (!visible_from_mainland || (god && linden_estate)); +		bool enable_group = enable_agent; +		bool enable_ban = !linden_estate; + +		setAccessAllowedEnabled(enable_agent, enable_group, enable_ban); +	} + +	refresh(); +} +  BOOL LLPanelEstateInfo::sendUpdate()  {  	llinfos << "LLPanelEsateInfo::sendUpdate()" << llendl; @@ -2112,7 +2081,7 @@ BOOL LLPanelEstateInfo::sendUpdate()  	LLNotification::Params params("ChangeLindenEstate");  	params.functor.function(boost::bind(&LLPanelEstateInfo::callbackChangeLindenEstate, this, _1, _2)); -	if (getEstateID() <= ESTATE_LAST_LINDEN) +	if (isLindenEstate())  	{  		// trying to change reserved estate, warn  		LLNotifications::instance().add(params); @@ -2131,13 +2100,21 @@ bool LLPanelEstateInfo::callbackChangeLindenEstate(const LLSD& notification, con  	switch(option)  	{  	case 0: -		// send the update -		if (!commitEstateInfoCaps())  		{ -			// the caps method failed, try the old way -			LLFloaterRegionInfo::nextInvoice(); -			commitEstateInfoDataserver(); +			LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); + +			// update model +			estate_info.setUseFixedSun(false); // we don't support fixed sun estates anymore +			estate_info.setIsExternallyVisible(getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean()); +			estate_info.setAllowDirectTeleport(getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean()); +			estate_info.setDenyAnonymous(getChild<LLUICtrl>("limit_payment")->getValue().asBoolean()); +			estate_info.setDenyAgeUnverified(getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean()); +			estate_info.setAllowVoiceChat(getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean()); + +			// send the update to sim +			estate_info.sendEstateInfo();  		} +  		// we don't want to do this because we'll get it automatically from the sim  		// after the spaceserver processes it  //		else @@ -2194,6 +2171,8 @@ public:  	// if we get a normal response, handle it here  	virtual void result(const LLSD& content)  	{ +		LL_INFOS("Windlight") << "Successfully committed estate info" << llendl; +  	    // refresh the panel from the database  		LLPanelEstateInfo* panel = dynamic_cast<LLPanelEstateInfo*>(mpPanel.get());  		if (panel) @@ -2210,178 +2189,6 @@ private:  	LLHandle<LLPanel> mpPanel;  }; -// tries to send estate info using a cap; returns true if it succeeded -bool LLPanelEstateInfo::commitEstateInfoCaps() -{ -	std::string url = gAgent.getRegion()->getCapability("EstateChangeInfo"); -	 -	if (url.empty()) -	{ -		// whoops, couldn't find the cap, so bail out -		return false; -	} -	 -	LLSD body; -	body["estate_name"] = getEstateName(); - -	body["is_externally_visible"] = getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean(); -	body["allow_direct_teleport"] = getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean(); -	body["deny_anonymous"       ] = getChild<LLUICtrl>("limit_payment")->getValue().asBoolean(); -	body["deny_age_unverified"  ] = getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean(); -	body["allow_voice_chat"     ] = getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean(); -	body["invoice"              ] = LLFloaterRegionInfo::getLastInvoice(); - -	// block fly is in estate database but not in estate UI, so we're not supporting it -	//body["block_fly"            ] = getChild<LLUICtrl>("")->getValue().asBoolean(); - -	F32 sun_hour = getSunHour(); -	if (getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean()) -	{ -		sun_hour = 0.f;			// 0 = global time -	} -	body["sun_hour"] = sun_hour; - -	// we use a responder so that we can re-get the data after committing to the database -	LLHTTPClient::post(url, body, new LLEstateChangeInfoResponder(this)); -    return true; -} - -/* This is the old way of doing things, is deprecated, and should be  -   deleted when the dataserver model can be removed */ -// key = "estatechangeinfo" -// strings[0] = str(estate_id) (added by simulator before relay - not here) -// strings[1] = estate_name -// strings[2] = str(estate_flags) -// strings[3] = str((S32)(sun_hour * 1024.f)) -void LLPanelEstateInfo::commitEstateInfoDataserver() -{ -	LLMessageSystem* msg = gMessageSystem; -	msg->newMessage("EstateOwnerMessage"); -	msg->nextBlockFast(_PREHASH_AgentData); -	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -	msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used - -	msg->nextBlock("MethodData"); -	msg->addString("Method", "estatechangeinfo"); -	msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice()); - -	msg->nextBlock("ParamList"); -	msg->addString("Parameter", getEstateName()); - -	std::string buffer; -	buffer = llformat("%u", computeEstateFlags()); -	msg->nextBlock("ParamList"); -	msg->addString("Parameter", buffer); - -	F32 sun_hour = getSunHour(); -	if (getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean()) -	{ -		sun_hour = 0.f;	// 0 = global time -	} - -	buffer = llformat("%d", (S32)(sun_hour*1024.0f)); -	msg->nextBlock("ParamList"); -	msg->addString("Parameter", buffer); - -	gAgent.sendMessage(); -} - -void LLPanelEstateInfo::setEstateFlags(U32 flags) -{ -	getChild<LLUICtrl>("externally_visible_check")->setValue(LLSD(flags & REGION_FLAGS_EXTERNALLY_VISIBLE ? TRUE : FALSE) ); -	getChild<LLUICtrl>("voice_chat_check")->setValue( -		LLSD(flags & REGION_FLAGS_ALLOW_VOICE ? TRUE : FALSE)); -	getChild<LLUICtrl>("allow_direct_teleport")->setValue(LLSD(flags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT ? TRUE : FALSE) ); -	getChild<LLUICtrl>("limit_payment")->setValue(LLSD(flags & REGION_FLAGS_DENY_ANONYMOUS ? TRUE : FALSE) ); -	getChild<LLUICtrl>("limit_age_verified")->setValue(LLSD(flags & REGION_FLAGS_DENY_AGEUNVERIFIED ? TRUE : FALSE) ); - -	refresh(); -} - -U32 LLPanelEstateInfo::computeEstateFlags() -{ -	U32 flags = 0; - -	if (getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean()) -	{ -		flags |= REGION_FLAGS_EXTERNALLY_VISIBLE; -	} - -	if ( getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean() ) -	{ -		flags |= REGION_FLAGS_ALLOW_VOICE; -	} -	 -	if (getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean()) -	{ -		flags |= REGION_FLAGS_ALLOW_DIRECT_TELEPORT; -	} - -	if (getChild<LLUICtrl>("limit_payment")->getValue().asBoolean()) -	{ -		flags |= REGION_FLAGS_DENY_ANONYMOUS; -	} -	 -	if (getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean()) -	{ -		flags |= REGION_FLAGS_DENY_AGEUNVERIFIED; -	} - -	 -	return flags; -} - -BOOL LLPanelEstateInfo::getGlobalTime() -{ -	return getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean(); -} - -void LLPanelEstateInfo::setGlobalTime(bool b) -{ -	getChild<LLUICtrl>("use_global_time_check")->setValue(LLSD(b)); -	getChildView("fixed_sun_check")->setEnabled(LLSD(!b)); -	getChildView("sun_hour_slider")->setEnabled(LLSD(!b)); -	if (b) -	{ -		getChild<LLUICtrl>("sun_hour_slider")->setValue(LLSD(0.f)); -	} -} - - -BOOL LLPanelEstateInfo::getFixedSun() -{ -	return getChild<LLUICtrl>("fixed_sun_check")->getValue().asBoolean(); -} - -void LLPanelEstateInfo::setSunHour(F32 sun_hour) -{ -	if(sun_hour < 6.0f) -	{ -		sun_hour = 24.0f + sun_hour; -	} -	getChild<LLUICtrl>("sun_hour_slider")->setValue(LLSD(sun_hour)); -} - -F32 LLPanelEstateInfo::getSunHour() -{ -	if (getChildView("sun_hour_slider")->getEnabled()) -	{ -		return (F32)getChild<LLUICtrl>("sun_hour_slider")->getValue().asReal(); -	} -	return 0.f; -} - -const std::string LLPanelEstateInfo::getEstateName() const -{ -	return getChild<LLUICtrl>("estate_name")->getValue().asString(); -} - -void LLPanelEstateInfo::setEstateName(const std::string& name) -{ -	getChild<LLUICtrl>("estate_name")->setValue(LLSD(name)); -} -  const std::string LLPanelEstateInfo::getOwnerName() const  {  	return getChild<LLUICtrl>("estate_owner")->getValue().asString(); @@ -2555,11 +2362,7 @@ bool LLPanelEstateCovenant::refreshFromRegion(LLViewerRegion* region)  	}  	LLTextBox* region_landtype = getChild<LLTextBox>("region_landtype_text"); -	if (region_landtype) -	{ -		region_landtype->setText(region->getSimProductName()); -	} -	 +	region_landtype->setText(region->getLocalizedSimProductName());  	// let the parent class handle the general data collection.   	bool rv = LLPanelRegionInfo::refreshFromRegion(region); @@ -2884,55 +2687,10 @@ bool LLDispatchEstateUpdateInfo::operator()(  {  	lldebugs << "Received estate update" << llendl; -	LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate(); -	if (!panel) return true; - -	// NOTE: LLDispatcher extracts strings with an extra \0 at the -	// end.  If we pass the std::string direct to the UI/renderer -	// it draws with a weird character at the end of the string. -	std::string estate_name = strings[0].c_str(); // preserve c_str() call! -	panel->setEstateName(estate_name); -	 -	LLViewerRegion* regionp = gAgent.getRegion(); - -	LLUUID owner_id(strings[1]); -	regionp->setOwner(owner_id); -	// Update estate owner name in UI -	std::string owner_name = LLSLURL("agent", owner_id, "inspect").getSLURLString(); -	panel->setOwnerName(owner_name); - -	U32 estate_id = strtoul(strings[2].c_str(), NULL, 10); -	panel->setEstateID(estate_id); - -	U32 flags = strtoul(strings[3].c_str(), NULL, 10); -	panel->setEstateFlags(flags); - -	F32 sun_hour = ((F32)(strtod(strings[4].c_str(), NULL)))/1024.0f; -	if(sun_hour == 0 && (flags & REGION_FLAGS_SUN_FIXED ? FALSE : TRUE)) -	{ -		lldebugs << "Estate uses global time" << llendl; -		panel->setGlobalTime(TRUE); -	}  -	else -	{ -		lldebugs << "Estate sun hour: " << sun_hour << llendl; -		panel->setGlobalTime(FALSE); -		panel->setSunHour(sun_hour); -	} - -	bool visible_from_mainland = (bool)(flags & REGION_FLAGS_EXTERNALLY_VISIBLE); -	bool god = gAgent.isGodlike(); -	bool linden_estate = (estate_id <= ESTATE_LAST_LINDEN); - -	// If visible from mainland, disable the access allowed -	// UI, as anyone can teleport there. -	// However, gods need to be able to edit the access list for -	// linden estates, regardless of visibility, to allow object -	// and L$ transfers. -	bool enable_agent = (!visible_from_mainland || (god && linden_estate)); -	bool enable_group = enable_agent; -	bool enable_ban = !linden_estate; -	panel->setAccessAllowedEnabled(enable_agent, enable_group, enable_ban); +	// Update estate info model. +	// This will call LLPanelEstateInfo::refreshFromEstate(). +	// *TODO: Move estate message handling stuff to llestateinfomodel.cpp. +	LLEstateInfoModel::instance().update(strings);  	return true;  } @@ -3275,6 +3033,20 @@ void LLPanelEnvironmentInfo::sendRegionSunUpdate()  	region_info.sendRegionTerrain(LLFloaterRegionInfo::getLastInvoice());  } +void LLPanelEnvironmentInfo::fixEstateSun() +{ +	// We don't support fixed sun estates anymore and need to fix +	// such estates for region day cycle to take effect. +	// *NOTE: Assuming that current estate settings have arrived already. +	LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); +	if (estate_info.getUseFixedSun()) +	{ +		llinfos << "Switching estate to global sun" << llendl; +		estate_info.setUseFixedSun(false); +		estate_info.sendEstateInfo(); +	} +} +  void LLPanelEnvironmentInfo::populateWaterPresetsList()  {  	mWaterPresetCombo->removeall(); @@ -3668,6 +3440,9 @@ void LLPanelEnvironmentInfo::onRegionSettingsApplied(bool ok)  		// That is caused by the simulator re-sending the region info, which in turn makes us  		// re-request and display old region environment settings while the new ones haven't been applied yet.  		sendRegionSunUpdate(); + +		// Switch estate to not using fixed sun for the region day cycle to work properly (STORM-1506). +		fixEstateSun();  	}  	else  	{ diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index e7917c382c..c402de66e8 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -100,10 +100,6 @@ private:  	LLFloaterRegionInfo(const LLSD& seed);  	~LLFloaterRegionInfo(); - -	void onConsoleReplyReceived(const std::string& output); - -	boost::signals2::connection mConsoleReplySignalConnection;;  protected:  	void onTabSelected(const LLSD& param); @@ -304,23 +300,9 @@ public:  	virtual BOOL postBuild();  	virtual void updateChild(LLUICtrl* child_ctrl);  	virtual void refresh(); -	 -	U32 computeEstateFlags(); -	void setEstateFlags(U32 flags); -	 -	BOOL getGlobalTime(); -	void setGlobalTime(bool b); -	BOOL getFixedSun();				// *TODO: deprecated - -	F32 getSunHour();				// *TODO: deprecated -	void setSunHour(F32 sun_hour);	// *TODO: deprecated +	void refreshFromEstate(); -	const std::string getEstateName() const; -	void setEstateName(const std::string& name); - -	U32 getEstateID() const { return mEstateID; } -	void setEstateID(U32 estate_id) { mEstateID = estate_id; }  	static bool isLindenEstate();  	const std::string getOwnerName() const; @@ -334,8 +316,6 @@ protected:  	// confirmation dialog callback  	bool callbackChangeLindenEstate(const LLSD& notification, const LLSD& response); -	void commitEstateInfoDataserver(); -	bool commitEstateInfoCaps();  	void commitEstateAccess();  	void commitEstateManagers(); @@ -434,6 +414,7 @@ private:  	void setDirty(bool dirty);  	void sendRegionSunUpdate(); +	void fixEstateSun();  	void populateWaterPresetsList();  	void populateSkyPresetsList(); diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index d5806e375c..2a946b1edf 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -70,21 +70,24 @@ public:  		}  		// create the LLSD arguments for the search floater -		LLSD args; -		args["category"] = category; -		args["id"] = LLURI::unescape(search_text); +		LLFloaterSearch::Params p; +		p.search.category = category; +		p.search.query = LLURI::unescape(search_text);  		// open the search floater and perform the requested search -		LLFloaterReg::showInstance("search", args); +		LLFloaterReg::showInstance("search", p);  		return true;  	}  };  LLSearchHandler gSearchHandler; -LLFloaterSearch::LLFloaterSearch(const LLSD& key) : -	LLFloater(key), -	LLViewerMediaObserver(), -	mBrowser(NULL), +LLFloaterSearch::SearchQuery::SearchQuery() +:	category("category", ""), +	query("query") +{} + +LLFloaterSearch::LLFloaterSearch(const Params& key) : +	LLFloaterWebContent(key),  	mSearchGodLevel(0)  {  	// declare a map that transforms a category name into @@ -102,53 +105,45 @@ LLFloaterSearch::LLFloaterSearch(const LLSD& key) :  BOOL LLFloaterSearch::postBuild()  { -	mBrowser = getChild<LLMediaCtrl>("browser"); -	mBrowser->addObserver(this); +	LLFloaterWebContent::postBuild(); +	mWebBrowser->addObserver(this);  	return TRUE;  }  void LLFloaterSearch::onOpen(const LLSD& key)  { -	search(key); +	Params p(key); +	p.trusted_content = true; +	p.allow_address_entry = false; + +	LLFloaterWebContent::onOpen(p); +	search(p.search);  }  void LLFloaterSearch::onClose(bool app_quitting)  { +	LLFloaterWebContent::onClose(app_quitting);  	// tear down the web view so we don't show the previous search  	// result when the floater is opened next time  	destroy();  } -void LLFloaterSearch::handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event) -{ -	switch (event)  -	{ -	case MEDIA_EVENT_NAVIGATE_BEGIN: -		getChild<LLUICtrl>("status_text")->setValue(getString("loading_text")); -		break; -		 -	case MEDIA_EVENT_NAVIGATE_COMPLETE: -		getChild<LLUICtrl>("status_text")->setValue(getString("done_text")); -		break; - -	default: -		break; -	} -} -  void LLFloaterSearch::godLevelChanged(U8 godlevel)  {  	// search results can change based upon god level - if the user  	// changes god level, then give them a warning (we don't refresh  	// the search as this might undo any page navigation or  	// AJAX-driven changes since the last search). -	getChildView("refresh_search")->setVisible( (godlevel != mSearchGodLevel)); +	 +	//FIXME: set status bar text + +	//getChildView("refresh_search")->setVisible( (godlevel != mSearchGodLevel));  } -void LLFloaterSearch::search(const LLSD &key) +void LLFloaterSearch::search(const SearchQuery &p)  { -	if (! mBrowser) +	if (! mWebBrowser || !p.validateBlock())  	{  		return;  	} @@ -159,10 +154,9 @@ void LLFloaterSearch::search(const LLSD &key)  	// work out the subdir to use based on the requested category  	LLSD subs; -	std::string category = key.has("category") ? key["category"].asString() : ""; -	if (mCategoryPaths.has(category)) +	if (mCategoryPaths.has(p.category))  	{ -		subs["CATEGORY"] = mCategoryPaths[category].asString(); +		subs["CATEGORY"] = mCategoryPaths[p.category].asString();  	}  	else  	{ @@ -170,8 +164,7 @@ void LLFloaterSearch::search(const LLSD &key)  	}  	// add the search query string -	std::string search_text = key.has("id") ? key["id"].asString() : ""; -	subs["QUERY"] = LLURI::escape(search_text); +	subs["QUERY"] = LLURI::escape(p.query);  	// add the permissions token that login.cgi gave us  	// We use "search_token", and fallback to "auth_token" if not present. @@ -207,5 +200,5 @@ void LLFloaterSearch::search(const LLSD &key)  	url = LLWeb::expandURLSubstitutions(url, subs);  	// and load the URL in the web view -	mBrowser->navigateTo(url, "text/html"); +	mWebBrowser->navigateTo(url, "text/html");  } diff --git a/indra/newview/llfloatersearch.h b/indra/newview/llfloatersearch.h index ba4dc4c0fa..35b268e1b2 100644 --- a/indra/newview/llfloatersearch.h +++ b/indra/newview/llfloatersearch.h @@ -28,7 +28,7 @@  #ifndef LL_LLFLOATERSEARCH_H  #define LL_LLFLOATERSEARCH_H -#include "llfloater.h" +#include "llfloaterwebcontent.h"  #include "llviewermediaobserver.h"  #include <string> @@ -43,11 +43,25 @@ class LLMediaCtrl;  /// so that the user can click on teleport links in search results.  ///  class LLFloaterSearch :  -	public LLFloater,  -	public LLViewerMediaObserver +	public LLFloaterWebContent  {  public: -	LLFloaterSearch(const LLSD& key); +	struct SearchQuery : public LLInitParam::Block<SearchQuery> +	{ +		Optional<std::string> category; +		Optional<std::string> query; + +		SearchQuery(); +	}; + +	struct _Params : public LLInitParam::Block<_Params, LLFloaterWebContent::Params> +	{ +		Optional<SearchQuery> search; +	}; + +	typedef LLSDParamAdapter<_Params> Params; + +	LLFloaterSearch(const Params& key);  	/// show the search floater with a new search  	/// see search() for details on the key parameter. @@ -60,7 +74,7 @@ public:  	///  - "id": specifies the text phrase to search for  	///  - "category": one of "all" (default), "people", "places",  	///    "events", "groups", "wiki", "destinations", "classifieds" -	void search(const LLSD &key); +	void search(const SearchQuery &query);  	/// changing godmode can affect the search results that are  	/// returned by the search website - use this method to tell the @@ -70,10 +84,6 @@ public:  private:  	/*virtual*/ BOOL postBuild(); -	// inherited from LLViewerMediaObserver -	/*virtual*/ void handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event); - -	LLMediaCtrl *mBrowser;  	LLSD        mCategoryPaths;  	U8          mSearchGodLevel;  }; diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp new file mode 100644 index 0000000000..be7a53491d --- /dev/null +++ b/indra/newview/llfloatersidepanelcontainer.cpp @@ -0,0 +1,111 @@ +/**  + * @file llfloatersidepanelcontainer.cpp + * @brief LLFloaterSidePanelContainer class definition + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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 "llfloaterreg.h" +#include "llfloatersidepanelcontainer.h" + +// newview includes +#include "llsidetraypanelcontainer.h" +#include "lltransientfloatermgr.h" + +//static +const std::string LLFloaterSidePanelContainer::sMainPanelName("main_panel"); + +LLFloaterSidePanelContainer::LLFloaterSidePanelContainer(const LLSD& key, const Params& params) +:	LLFloater(key, params) +{ +	// Prevent transient floaters (e.g. IM windows) from hiding +	// when this floater is clicked. +	LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::GLOBAL, this); +} + +LLFloaterSidePanelContainer::~LLFloaterSidePanelContainer() +{ +	LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::GLOBAL, this); +} + +void LLFloaterSidePanelContainer::onOpen(const LLSD& key) +{ +	getChild<LLPanel>(sMainPanelName)->onOpen(key); +} + +LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_name, const LLSD& params) +{ +	LLView* view = findChildView(panel_name, true); +	if (!view) return NULL; + +	openFloater(); + +	LLPanel* panel = NULL; + +	LLSideTrayPanelContainer* container = dynamic_cast<LLSideTrayPanelContainer*>(view->getParent()); +	if (container) +	{ +		LLSD new_params = params; +		new_params[LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME] = panel_name; +		container->onOpen(new_params); + +		panel = container->getCurrentPanel(); +	} +	else if ((panel = dynamic_cast<LLPanel*>(view)) != NULL) +	{ +		panel->onOpen(params); +	} + +	return panel; +} + +void LLFloaterSidePanelContainer::showPanel(const std::string& floater_name, const LLSD& key) +{ +	LLFloaterSidePanelContainer* floaterp = LLFloaterReg::getTypedInstance<LLFloaterSidePanelContainer>(floater_name); +	if (floaterp) +	{ +		floaterp->openChildPanel(sMainPanelName, key); +	} +} + +void LLFloaterSidePanelContainer::showPanel(const std::string& floater_name, const std::string& panel_name, const LLSD& key) +{ +	LLFloaterSidePanelContainer* floaterp = LLFloaterReg::getTypedInstance<LLFloaterSidePanelContainer>(floater_name); +	if (floaterp) +	{ +		floaterp->openChildPanel(panel_name, key); +	} +} + +LLPanel* LLFloaterSidePanelContainer::getPanel(const std::string& floater_name, const std::string& panel_name) +{ +	LLFloaterSidePanelContainer* floaterp = LLFloaterReg::getTypedInstance<LLFloaterSidePanelContainer>(floater_name); + +	if (floaterp) +	{ +		return floaterp->findChild<LLPanel>(panel_name, true); +	} + +	return NULL; +} diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h new file mode 100644 index 0000000000..10d85867ce --- /dev/null +++ b/indra/newview/llfloatersidepanelcontainer.h @@ -0,0 +1,81 @@ +/**  + * @file llfloatersidepanelcontainer.h + * @brief LLFloaterSidePanelContainer class + * + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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_LLFLOATERSIDEPANELCONTAINER_H +#define LL_LLFLOATERSIDEPANELCONTAINER_H + +#include "llfloater.h" + +/** + * Class LLFloaterSidePanelContainer + * + * Provides an interface for all former Side Tray panels. + * + * This class helps to make sure that clicking a floater containing the side panel + * doesn't make transient floaters (e.g. IM windows) hide, so that it's possible to + * drag an inventory item from My Inventory window to a docked IM window, + * i.e. share the item (see VWR-22891). + */ +class LLFloaterSidePanelContainer : public LLFloater +{ +private: +	static const std::string sMainPanelName; + +public: +	LLFloaterSidePanelContainer(const LLSD& key, const Params& params = getDefaultParams()); +	~LLFloaterSidePanelContainer(); + +	/*virtual*/ void onOpen(const LLSD& key); + +	LLPanel* openChildPanel(const std::string& panel_name, const LLSD& params); + +	static void showPanel(const std::string& floater_name, const LLSD& key); + +	static void showPanel(const std::string& floater_name, const std::string& panel_name, const LLSD& key); +	 +	static LLPanel* getPanel(const std::string& floater_name, const std::string& panel_name = sMainPanelName); +	 +	/** +	 * Gets the panel of given type T (doesn't show it or do anything else with it). +	 * +	 * @param floater_name a string specifying the floater to be searched for a child panel. +	 * @param panel_name a string specifying the child panel to get. +	 * @returns a pointer to the panel of given type T. +	 */ +	template <typename T> +	static T* getPanel(const std::string& floater_name, const std::string& panel_name = sMainPanelName) +	{ +		T* panel = dynamic_cast<T*>(getPanel(floater_name, panel_name)); +		if (!panel) +		{ +			llwarns << "Child named \"" << panel_name << "\" of type " << typeid(T*).name() << " not found" << llendl; +		} +		return panel; +	} +}; + +#endif // LL_LLFLOATERSIDEPANELCONTAINER_H diff --git a/indra/newview/llfloatersidetraytab.cpp b/indra/newview/llfloatersidetraytab.cpp deleted file mode 100644 index 9f15e62d84..0000000000 --- a/indra/newview/llfloatersidetraytab.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/**  - * @file llfloatersidetraytab.cpp - * @brief LLFloaterSideTrayTab class definition - * - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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 "llfloatersidetraytab.h" - -// newview includes -#include "lltransientfloatermgr.h" -#include "llsidetray.h" - -LLFloaterSideTrayTab::LLFloaterSideTrayTab(const LLSD& key, const Params& params) -:	LLFloater(key, params) -{ -	// Prevent transient floaters (e.g. IM windows) from hiding -	// when this floater is clicked. -	LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::GLOBAL, this); -} - -LLFloaterSideTrayTab::~LLFloaterSideTrayTab() -{ -	LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::GLOBAL, this); -} - -void LLFloaterSideTrayTab::onClose(bool app_quitting) -{ -	// The floater is already being closed, so don't toggle it once more (that may crash viewer). -	LLSideTray::getInstance()->setTabDocked(getName(), /* dock = */ true, /* toggle_floater = */ false); -} diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 00dc7b1627..8105844b0d 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -2112,7 +2112,7 @@ LLFloaterSnapshot::LLFloaterSnapshot(const LLSD& key)  // Destroys the object  LLFloaterSnapshot::~LLFloaterSnapshot()  { -	LLView::deleteViewByHandle(impl.mPreviewHandle); +	delete impl.mPreviewHandle.get();  	//unfreeze everything else  	gSavedSettings.setBOOL("FreezeTime", FALSE); @@ -2217,7 +2217,7 @@ void LLFloaterSnapshot::draw()  	LLFloater::draw(); -	if (previewp) +	if (previewp && !isMinimized())  	{		  		if(previewp->getThumbnailImage())  		{ diff --git a/indra/newview/llfloatersounddevices.cpp b/indra/newview/llfloatersounddevices.cpp index e692f1735a..56c0806546 100644 --- a/indra/newview/llfloatersounddevices.cpp +++ b/indra/newview/llfloatersounddevices.cpp @@ -28,7 +28,6 @@  #include "llfloatersounddevices.h" -#include "llbottomtray.h"  #include "lldraghandle.h"  #include "llpanelvoicedevicesettings.h" @@ -55,9 +54,6 @@ LLFloaterSoundDevices::~LLFloaterSoundDevices()  BOOL LLFloaterSoundDevices::postBuild()  {  	LLTransientDockableFloater::postBuild(); -		 -	LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("flyout_btn"); -	setDockControl(new LLDockControl(anchor_panel, this, getDockTongue(), LLDockControl::TOP));  	setIsChrome(TRUE);  	if (mDragHandle) diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 33b7777d2e..1008b4a6e4 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -36,12 +36,12 @@  #include "llagentcamera.h"  #include "llbutton.h"  #include "llcheckboxctrl.h" -#include "llcombobox.h"  #include "lldraghandle.h"  #include "llerror.h"  #include "llfloaterbuildoptions.h"  #include "llfloatermediasettings.h"  #include "llfloateropenobject.h" +#include "llfloaterobjectweights.h"  #include "llfloaterreg.h"  #include "llfocusmgr.h"  #include "llmediaentry.h" @@ -55,6 +55,7 @@  #include "llpanelobject.h"  #include "llpanelvolume.h"  #include "llpanelpermissions.h" +#include "llparcel.h"  #include "llradiogroup.h"  #include "llresmgr.h"  #include "llselectmgr.h" @@ -85,7 +86,6 @@  #include "llviewerwindow.h"  #include "llvovolume.h"  #include "lluictrlfactory.h" -#include "llaccountingquotamanager.h"  #include "llmeshrepository.h"  // Globals @@ -101,6 +101,7 @@ const std::string PANEL_NAMES[LLFloaterTools::PANEL_COUNT] =  	std::string("Content"),	// PANEL_CONTENTS,  }; +  // Local prototypes  void commit_select_component(void *data);  void click_show_more(void*); @@ -116,9 +117,26 @@ void commit_radio_group_focus(LLUICtrl* ctrl);  void commit_radio_group_move(LLUICtrl* ctrl);  void commit_radio_group_edit(LLUICtrl* ctrl);  void commit_radio_group_land(LLUICtrl* ctrl); -void commit_grid_mode(LLUICtrl *);  void commit_slider_zoom(LLUICtrl *ctrl); +/** + * Class LLLandImpactsObserver + * + * An observer class to monitor parcel selection and update + * the land impacts data from a parcel containing the selected object. + */ +class LLLandImpactsObserver : public LLParcelObserver +{ +public: +	virtual void changed() +	{ +		LLFloaterTools* tools_floater = LLFloaterReg::getTypedInstance<LLFloaterTools>("build"); +		if(tools_floater) +		{ +			tools_floater->updateLandImpacts(); +		} +	} +};  //static  void*	LLFloaterTools::createPanelPermissions(void* data) @@ -234,7 +252,6 @@ BOOL	LLFloaterTools::postBuild()  	getChild<LLUICtrl>("checkbox uniform")->setValue((BOOL)gSavedSettings.getBOOL("ScaleUniform"));  	mCheckStretchTexture	= getChild<LLCheckBoxCtrl>("checkbox stretch textures");  	getChild<LLUICtrl>("checkbox stretch textures")->setValue((BOOL)gSavedSettings.getBOOL("ScaleStretchTextures")); -	mComboGridMode			= getChild<LLComboBox>("combobox grid mode");  	mCheckStretchUniformLabel = getChild<LLTextBox>("checkbox uniform label");  	// @@ -269,6 +286,8 @@ BOOL	LLFloaterTools::postBuild()  	// the setting stores the actual force multiplier, but the slider is logarithmic, so we convert here  	getChild<LLUICtrl>("slider force")->setValue(log10(gSavedSettings.getF32("LandBrushForce"))); +	mCostTextBorder = getChild<LLViewBorder>("cost_text_border"); +  	mTab = getChild<LLTabContainer>("Object Info Tabs");  	if(mTab)  	{ @@ -311,7 +330,6 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)  	mCheckSnapToGrid(NULL),  	mBtnGridOptions(NULL),  	mTitleMedia(NULL), -	mComboGridMode(NULL),  	mCheckStretchUniform(NULL),  	mCheckStretchTexture(NULL),  	mCheckStretchUniformLabel(NULL), @@ -344,7 +362,11 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)  	mPanelFace(NULL),  	mPanelLandInfo(NULL), +	mCostTextBorder(NULL),  	mTabLand(NULL), + +	mLandImpactsObserver(NULL), +  	mDirty(TRUE),  	mNeedMediaTitle(TRUE)  { @@ -367,7 +389,6 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)  	mCommitCallbackRegistrar.add("BuildTool.selectComponent",	boost::bind(&commit_select_component, this));  	mCommitCallbackRegistrar.add("BuildTool.gridOptions",		boost::bind(&LLFloaterTools::onClickGridOptions,this));  	mCommitCallbackRegistrar.add("BuildTool.applyToSelection",	boost::bind(&click_apply_to_selection, this)); -	mCommitCallbackRegistrar.add("BuildTool.gridMode",			boost::bind(&commit_grid_mode,_1));  	mCommitCallbackRegistrar.add("BuildTool.commitRadioLand",	boost::bind(&commit_radio_group_land,_1));  	mCommitCallbackRegistrar.add("BuildTool.LandBrushForce",	boost::bind(&commit_slider_dozer_force,_1));  	mCommitCallbackRegistrar.add("BuildTool.AddMedia",			boost::bind(&LLFloaterTools::onClickBtnAddMedia,this)); @@ -377,12 +398,17 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)  	mCommitCallbackRegistrar.add("BuildTool.LinkObjects",		boost::bind(&LLSelectMgr::linkObjects, LLSelectMgr::getInstance()));  	mCommitCallbackRegistrar.add("BuildTool.UnlinkObjects",		boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance())); +	mLandImpactsObserver = new LLLandImpactsObserver(); +	LLViewerParcelMgr::getInstance()->addObserver(mLandImpactsObserver);  }  LLFloaterTools::~LLFloaterTools()  {  	// children automatically deleted  	gFloaterTools = NULL; + +	LLViewerParcelMgr::getInstance()->removeObserver(mLandImpactsObserver); +	delete mLandImpactsObserver;  }  void LLFloaterTools::setStatusText(const std::string& text) @@ -423,21 +449,22 @@ void LLFloaterTools::refresh()  	// Refresh object and prim count labels  	LLLocale locale(LLLocale::USER_LOCALE); - +#if 0  	if (!gMeshRepo.meshRezEnabled())  	{		  		std::string obj_count_string;  		LLResMgr::getInstance()->getIntegerString(obj_count_string, LLSelectMgr::getInstance()->getSelection()->getRootObjectCount()); -		getChild<LLUICtrl>("obj_count")->setTextArg("[COUNT]", obj_count_string);	 +		getChild<LLUICtrl>("selection_count")->setTextArg("[OBJ_COUNT]", obj_count_string);  		std::string prim_count_string;  		LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount()); -		getChild<LLUICtrl>("prim_count")->setTextArg("[COUNT]", prim_count_string); +		getChild<LLUICtrl>("selection_count")->setTextArg("[PRIM_COUNT]", prim_count_string);  		// calculate selection rendering cost  		if (sShowObjectCost)  		{  			std::string prim_cost_string; -			LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost()); +			S32 render_cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectRenderCost(); +			LLResMgr::getInstance()->getIntegerString(prim_cost_string, render_cost);  			getChild<LLUICtrl>("RenderingCost")->setTextArg("[COUNT]", prim_cost_string);  		} @@ -448,56 +475,47 @@ void LLFloaterTools::refresh()  		getChildView("RenderingCost")->setEnabled(have_selection && sShowObjectCost);  	}  	else +#endif  	{ -		// Get the number of objects selected -		std::string root_object_count_string; -		std::string object_count_string; - -		LLResMgr::getInstance()->getIntegerString( -			root_object_count_string, -			LLSelectMgr::getInstance()->getSelection()->getRootObjectCount()); -		LLResMgr::getInstance()->getIntegerString( -			object_count_string, -			LLSelectMgr::getInstance()->getSelection()->getObjectCount()); - -		F32 obj_cost = -			LLSelectMgr::getInstance()->getSelection()->getSelectedObjectCost(); -		F32 link_cost = -			LLSelectMgr::getInstance()->getSelection()->getSelectedLinksetCost(); -		F32 obj_physics_cost = -			LLSelectMgr::getInstance()->getSelection()->getSelectedPhysicsCost(); -		F32 link_physics_cost = -			LLSelectMgr::getInstance()->getSelection()->getSelectedLinksetPhysicsCost(); - -		// Update the text for the counts -		childSetTextArg( -			"linked_set_count", -			"[COUNT]", -			root_object_count_string); -		childSetTextArg("object_count", "[COUNT]", object_count_string); - -		// Update the text for the resource costs -		childSetTextArg("linked_set_cost","[COST]",llformat("%.1f", link_cost)); -		childSetTextArg("object_cost", "[COST]", llformat("%.1f", obj_cost)); -		childSetTextArg("linked_set_cost","[PHYSICS]",llformat("%.1f", link_physics_cost)); -		childSetTextArg("object_cost", "[PHYSICS]", llformat("%.1f", obj_physics_cost)); - -		// Display rendering cost if needed -		if (sShowObjectCost) +		F32 link_cost  = LLSelectMgr::getInstance()->getSelection()->getSelectedLinksetCost(); +		S32 link_count = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount(); + +		LLCrossParcelFunctor func; +		if (LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, true))  		{ -			std::string prim_cost_string; -			LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost()); -			getChild<LLUICtrl>("RenderingCost")->setTextArg("[COUNT]", prim_cost_string); +			// Selection crosses parcel bounds. +			// We don't display remaining land capacity in this case. +			const LLStringExplicit empty_str(""); +			childSetTextArg("remaining_capacity", "[CAPACITY_STRING]", empty_str); +		} +		else +		{ +			LLViewerObject* selected_object = mObjectSelection->getFirstObject(); +			if (selected_object) +			{ +				// Select a parcel at the currently selected object's position. +				LLViewerParcelMgr::getInstance()->selectParcelAt(selected_object->getPositionGlobal()); +			} +			else +			{ +				llwarns << "Failed to get selected object" << llendl; +			}  		} +		LLStringUtil::format_map_t selection_args; +		selection_args["OBJ_COUNT"] = llformat("%.1d", link_count); +		selection_args["LAND_IMPACT"] = llformat("%.1d", (S32)link_cost); -		// disable the object and prim counts if nothing selected -		bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty(); -		childSetEnabled("linked_set_count", have_selection); -		childSetEnabled("object_count", have_selection); -		childSetEnabled("linked_set_cost", have_selection); -		childSetEnabled("object_cost", have_selection); -		getChildView("RenderingCost")->setEnabled(have_selection && sShowObjectCost); +		std::ostringstream selection_info; + +		selection_info << getString("status_selectcount", selection_args); + +		getChild<LLTextBox>("selection_count")->setText(selection_info.str()); + +		bool have_selection = !LLSelectMgr::getInstance()->getSelection()->isEmpty(); +		childSetVisible("selection_count",  have_selection); +		childSetVisible("remaining_capacity", have_selection); +		childSetVisible("selection_empty", !have_selection);  	} @@ -509,6 +527,13 @@ void LLFloaterTools::refresh()  	refreshMedia();  	mPanelContents->refresh();  	mPanelLandInfo->refresh(); + +	// Refresh the advanced weights floater +	LLFloaterObjectWeights* object_weights_floater = LLFloaterReg::getTypedInstance<LLFloaterObjectWeights>("object_weights"); +	if(object_weights_floater && object_weights_floater->getVisible()) +	{ +		object_weights_floater->refresh(); +	}  }  void LLFloaterTools::draw() @@ -662,33 +687,6 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)  		mRadioGroupEdit->setValue("radio select face");  	} -	if (mComboGridMode)  -	{ -		mComboGridMode->setVisible( edit_visible ); -		S32 index = mComboGridMode->getCurrentIndex(); -		mComboGridMode->removeall(); - -		switch (mObjectSelection->getSelectType()) -		{ -		case SELECT_TYPE_HUD: -		  mComboGridMode->add(getString("grid_screen_text")); -		  mComboGridMode->add(getString("grid_local_text")); -		  //mComboGridMode->add(getString("grid_reference_text")); -		  break; -		case SELECT_TYPE_WORLD: -		  mComboGridMode->add(getString("grid_world_text")); -		  mComboGridMode->add(getString("grid_local_text")); -		  mComboGridMode->add(getString("grid_reference_text")); -		  break; -		case SELECT_TYPE_ATTACHMENT: -		  mComboGridMode->add(getString("grid_attachment_text")); -		  mComboGridMode->add(getString("grid_local_text")); -		  mComboGridMode->add(getString("grid_reference_text")); -		  break; -		} - -		mComboGridMode->setCurrentByIndex(index); -	}  	// Snap to grid disabled for grab tool - very confusing  	if (mCheckSnapToGrid) mCheckSnapToGrid->setVisible( edit_visible /* || tool == LLToolGrab::getInstance() */ );  	if (mBtnGridOptions) mBtnGridOptions->setVisible( edit_visible /* || tool == LLToolGrab::getInstance() */ ); @@ -737,6 +735,8 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)  	// Land buttons  	BOOL land_visible = (tool == LLToolBrushLand::getInstance() || tool == LLToolSelectLand::getInstance() ); +	mCostTextBorder->setVisible(!land_visible); +  	if (mBtnLand)	mBtnLand	->setToggleState( land_visible );  	mRadioGroupLand->setVisible( land_visible ); @@ -789,15 +789,11 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)  		getChildView("Strength:")->setVisible( land_visible);  	} -	bool show_mesh_cost = gMeshRepo.meshRezEnabled(); +	bool have_selection = !LLSelectMgr::getInstance()->getSelection()->isEmpty(); -	getChildView("obj_count")->setVisible( !land_visible && !show_mesh_cost); -	getChildView("prim_count")->setVisible( !land_visible && !show_mesh_cost); -	getChildView("linked_set_count")->setVisible( !land_visible && show_mesh_cost); -	getChildView("linked_set_cost")->setVisible( !land_visible && show_mesh_cost); -	getChildView("object_count")->setVisible( !land_visible && show_mesh_cost); -	getChildView("object_cost")->setVisible( !land_visible && show_mesh_cost); -	getChildView("RenderingCost")->setVisible( !land_visible && sShowObjectCost); +	getChildView("selection_count")->setVisible(!land_visible && have_selection); +	getChildView("remaining_capacity")->setVisible(!land_visible && have_selection); +	getChildView("selection_empty")->setVisible(!land_visible && !have_selection);  	mTab->setVisible(!land_visible);  	mPanelLandInfo->setVisible(land_visible); @@ -860,6 +856,9 @@ void LLFloaterTools::onClose(bool app_quitting)  	//gMenuBarView->setItemVisible("BuildTools", FALSE);  	LLFloaterReg::hideInstance("media_settings"); + +	// hide the advanced object weights floater +	LLFloaterReg::hideInstance("object_weights");  }  void click_popup_info(void*) @@ -1030,13 +1029,6 @@ void commit_select_component(void *data)  	}  } -void commit_grid_mode(LLUICtrl *ctrl)    -{    -	LLComboBox* combo = (LLComboBox*)ctrl;    -     -	LLSelectMgr::getInstance()->setGridMode((EGridMode)combo->getCurrentIndex()); -}  -  // static   void LLFloaterTools::setObjectType( LLPCode pcode )  { @@ -1053,35 +1045,6 @@ void LLFloaterTools::onClickGridOptions()  	//floaterp->addDependentFloater(LLFloaterBuildOptions::getInstance(), FALSE);  } -S32 LLFloaterTools::calcRenderCost() -{ -       S32 cost = 0; -       std::set<LLUUID> textures; - -       for (LLObjectSelection::iterator selection_iter = LLSelectMgr::getInstance()->getSelection()->begin(); -                 selection_iter != LLSelectMgr::getInstance()->getSelection()->end(); -                 ++selection_iter) -       { -               LLSelectNode *select_node = *selection_iter; -               if (select_node) -               { -                       LLViewerObject *vobj = select_node->getObject(); -                       if (vobj->getVolume()) -                       { -                               LLVOVolume* volume = (LLVOVolume*) vobj; - -                               cost += volume->getRenderCost(textures); -							   cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST; -							   textures.clear(); -                       } -               } -       } - - -       return cost; -} - -  // static  void LLFloaterTools::setEditTool(void* tool_pointer)  { @@ -1157,6 +1120,37 @@ bool LLFloaterTools::selectedMediaEditable()  	return selected_Media_editable;  } +void LLFloaterTools::updateLandImpacts() +{ +	LLParcel *parcel = mParcelSelection->getParcel(); +	if (!parcel) +	{ +		return; +	} + +	S32 rezzed_prims = parcel->getSimWidePrimCount(); +	S32 total_capacity = parcel->getSimWideMaxPrimCapacity(); + +	std::string remaining_capacity_str = ""; + +	bool show_mesh_cost = gMeshRepo.meshRezEnabled(); +	if (show_mesh_cost) +	{ +		LLStringUtil::format_map_t remaining_capacity_args; +		remaining_capacity_args["LAND_CAPACITY"] = llformat("%d", total_capacity - rezzed_prims); +		remaining_capacity_str = getString("status_remaining_capacity", remaining_capacity_args); +	} + +	childSetTextArg("remaining_capacity", "[CAPACITY_STRING]", remaining_capacity_str); + +	// Update land impacts info in the weights floater +	LLFloaterObjectWeights* object_weights_floater = LLFloaterReg::getTypedInstance<LLFloaterObjectWeights>("object_weights"); +	if(object_weights_floater) +	{ +		object_weights_floater->updateLandImpacts(parcel); +	} +} +  void LLFloaterTools::getMediaState()  {  	LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection(); diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h index fd81a75397..63ed9dc82b 100644 --- a/indra/newview/llfloatertools.h +++ b/indra/newview/llfloatertools.h @@ -32,7 +32,6 @@  #include "llparcelselection.h"  class LLButton; -class LLComboBox;  class LLCheckBoxCtrl;  class LLPanelPermissions;  class LLPanelObject; @@ -48,6 +47,7 @@ class LLMediaCtrl;  class LLTool;  class LLParcelSelection;  class LLObjectSelection; +class LLLandImpactsObserver;  typedef LLSafeHandle<LLObjectSelection> LLObjectSelectionHandle; @@ -104,6 +104,7 @@ public:  	void updateMediaTitle();  	void navigateToTitleMedia( const std::string url );  	bool selectedMediaEditable(); +	void updateLandImpacts();  private:  	void refresh(); @@ -114,7 +115,6 @@ private:  	static bool multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response);  	static void setObjectType( LLPCode pcode );  	void onClickGridOptions(); -	S32 calcRenderCost();  public:  	LLButton		*mBtnFocus; @@ -140,7 +140,6 @@ public:  	LLCheckBoxCtrl*	mCheckSnapToGrid;  	LLButton*		mBtnGridOptions; -	LLComboBox*		mComboGridMode;  	LLCheckBoxCtrl*	mCheckStretchUniform;  	LLCheckBoxCtrl*	mCheckStretchTexture; @@ -179,8 +178,12 @@ public:  	LLPanelFace				*mPanelFace;  	LLPanelLandInfo			*mPanelLandInfo; +	LLViewBorder*			mCostTextBorder; +  	LLTabContainer*			mTabLand; +	LLLandImpactsObserver*  mLandImpactsObserver; +  	LLParcelSelectionHandle	mParcelSelection;  	LLObjectSelectionHandle	mObjectSelection; diff --git a/indra/newview/llfloatertoybox.cpp b/indra/newview/llfloatertoybox.cpp new file mode 100644 index 0000000000..b4c9894271 --- /dev/null +++ b/indra/newview/llfloatertoybox.cpp @@ -0,0 +1,146 @@ +/**  + * @file llfloatertoybox.cpp + * @brief The toybox for flexibilizing the UI. + * + * $LicenseInfo:firstyear=2002&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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 "llfloatertoybox.h" + +#include "llbutton.h" +#include "llcommandmanager.h" +#include "llnotifications.h" +#include "llnotificationsutil.h" +#include "llpanel.h" +#include "lltoolbar.h" +#include "lltoolbarview.h" +#include "lltrans.h" + +LLFloaterToybox::LLFloaterToybox(const LLSD& key) +	: LLFloater(key) +	, mBtnRestoreDefaults(NULL) +	, mToolBar(NULL) +{ +	mCommitCallbackRegistrar.add("Toybox.RestoreDefaults", boost::bind(&LLFloaterToybox::onBtnRestoreDefaults, this)); +} + +LLFloaterToybox::~LLFloaterToybox() +{ +} + +bool compare_localized_command_labels(LLCommand * cmd1, LLCommand * cmd2) +{ +	std::string lab1 = LLTrans::getString(cmd1->labelRef()); +	std::string lab2 = LLTrans::getString(cmd2->labelRef()); + +	return (lab1 < lab2); +} + +BOOL LLFloaterToybox::postBuild() +{	 +	mBtnRestoreDefaults = getChild<LLButton>("btn_restore_defaults"); +	mToolBar = getChild<LLToolBar>("toybox_toolbar"); +	mToolBar->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3)); +	mToolBar->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4)); +	mToolBar->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4)); +	 +	LLCommandManager& cmdMgr = LLCommandManager::instance(); + +	// +	// Sort commands by localized labels so they will appear alphabetized in all languages +	// + +	std::list<LLCommand *> alphabetized_commands; + +	for (U32 i = 0; i < cmdMgr.commandCount(); i++) +	{ +		LLCommand * command = cmdMgr.getCommand(i); + +		if (command->availableInToybox()) +		{ +			alphabetized_commands.push_back(command); +		} +	} + +	alphabetized_commands.sort(compare_localized_command_labels); + +	// +	// Create Buttons +	// + +	for (std::list<LLCommand *>::iterator it = alphabetized_commands.begin(); it != alphabetized_commands.end(); ++it) +	{ +		mToolBar->addCommand((*it)->id()); +	} + +	return TRUE; +} + +void LLFloaterToybox::draw() +{ +	llassert(gToolBarView != NULL); + +	const command_id_list_t& command_list = mToolBar->getCommandsList(); + +	for (command_id_list_t::const_iterator it = command_list.begin(); it != command_list.end(); ++it) +	{ +		const LLCommandId& id = *it; + +		const bool commandOnToolbar = gToolBarView->hasCommand(id); +		mToolBar->enableCommand(id, !commandOnToolbar); +	} + +	LLFloater::draw(); +} + +static bool finish_restore_toybox(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + +	if (option == 0) +	{ +		LLToolBarView::loadDefaultToolbars(); +	} +	return false; +} +static LLNotificationFunctorRegistration finish_restore_toybox_reg("ConfirmRestoreToybox", finish_restore_toybox); + +void LLFloaterToybox::onBtnRestoreDefaults() +{ +	LLNotificationsUtil::add("ConfirmRestoreToybox"); +} + +BOOL LLFloaterToybox::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, +	EDragAndDropType cargo_type, +	void* cargo_data, +	EAcceptance* accept, +	std::string& tooltip_msg) +{ +	S32 local_x = x - mToolBar->getRect().mLeft; +	S32 local_y = y - mToolBar->getRect().mBottom; +	return mToolBar->handleDragAndDrop(local_x, local_y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); +} + + +// eof diff --git a/indra/newview/llfloatertoybox.h b/indra/newview/llfloatertoybox.h new file mode 100644 index 0000000000..f0a6cf1a8b --- /dev/null +++ b/indra/newview/llfloatertoybox.h @@ -0,0 +1,60 @@ +/**  + * @file llfloatertoybox.h + * @brief The toybox for flexibilizing the UI. + * + * $LicenseInfo:firstyear=2002&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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_LLFLOATERTOYBOX_H +#define LL_LLFLOATERTOYBOX_H + +#include "llfloater.h" + + +class LLButton; +class LLToolBar; + + +class LLFloaterToybox : public LLFloater +{ +public: +	LLFloaterToybox(const LLSD& key); +	virtual ~LLFloaterToybox(); + +	// virtuals +	BOOL postBuild(); +	void draw(); +	/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, +		EDragAndDropType cargo_type, +		void* cargo_data, +		EAcceptance* accept, +		std::string& tooltip_msg); + +protected: +	void onBtnRestoreDefaults(); + +public: +	LLButton *	mBtnRestoreDefaults; +	LLToolBar *	mToolBar; +}; + +#endif // LL_LLFLOATERTOYBOX_H diff --git a/indra/newview/llfloatervoiceeffect.cpp b/indra/newview/llfloatervoiceeffect.cpp index 2a3950f9b1..030fed0575 100644 --- a/indra/newview/llfloatervoiceeffect.cpp +++ b/indra/newview/llfloatervoiceeffect.cpp @@ -145,7 +145,7 @@ void LLFloaterVoiceEffect::refreshEffectList()  		for (voice_effect_list_t::const_iterator it = template_list.begin(); it != template_list.end(); ++it)  		{  			const LLUUID& effect_id = it->second; -			std::string effect_name = it->first; +			std::string effect_name = getString("effect_" + it->first); // will throw an error if the effect is not listed in the XML  			LLSD effect_properties = effect_interface->getVoiceEffectProperties(effect_id); diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp index 43eecbf048..f410c31f44 100644 --- a/indra/newview/llfloaterwebcontent.cpp +++ b/indra/newview/llfloaterwebcontent.cpp @@ -40,8 +40,23 @@  #include "llfloaterwebcontent.h" -LLFloaterWebContent::LLFloaterWebContent( const LLSD& key ) -	: LLFloater( key ) +LLFloaterWebContent::_Params::_Params() +:	url("url"), +	target("target"), +	id("id"), +	window_class("window_class", "web_content"), +	show_chrome("show_chrome", true), +	allow_address_entry("allow_address_entry", true), +	preferred_media_size("preferred_media_size"), +	trusted_content("trusted_content", false), +	show_page_title("show_page_title", true) +{} + +LLFloaterWebContent::LLFloaterWebContent( const Params& params ) +:	LLFloater( params ), +	LLInstanceTracker<LLFloaterWebContent, std::string>(params.id()), +	mUUID(params.id()), +	mShowPageTitle(params.show_page_title)  {  	mCommitCallbackRegistrar.add( "WebContent.Back", boost::bind( &LLFloaterWebContent::onClickBack, this ));  	mCommitCallbackRegistrar.add( "WebContent.Forward", boost::bind( &LLFloaterWebContent::onClickForward, this )); @@ -54,9 +69,9 @@ LLFloaterWebContent::LLFloaterWebContent( const LLSD& key )  BOOL LLFloaterWebContent::postBuild()  {  	// these are used in a bunch of places so cache them -	mWebBrowser = getChild< LLMediaCtrl >( "webbrowser" ); -	mAddressCombo = getChild< LLComboBox >( "address" ); -	mStatusBarText = getChild< LLTextBox >( "statusbartext" ); +	mWebBrowser        = getChild< LLMediaCtrl >( "webbrowser" ); +	mAddressCombo      = getChild< LLComboBox >( "address" ); +	mStatusBarText     = getChild< LLTextBox >( "statusbartext" );  	mStatusBarProgress = getChild<LLProgressBar>("statusbarprogress" );  	// observe browser events @@ -86,10 +101,8 @@ void LLFloaterWebContent::initializeURLHistory()  	// Get all of the entries in the "browser" collection  	LLSD browser_history = LLURLHistory::getURLHistory("browser"); -	LLSD::array_iterator iter_history = -		browser_history.beginArray(); -	LLSD::array_iterator end_history = -		browser_history.endArray(); +	LLSD::array_iterator iter_history = browser_history.beginArray(); +	LLSD::array_iterator end_history = browser_history.endArray();  	for(; iter_history != end_history; ++iter_history)  	{  		std::string url = (*iter_history).asString(); @@ -98,45 +111,47 @@ void LLFloaterWebContent::initializeURLHistory()  	}  } -//static -void LLFloaterWebContent::create( const std::string &url, const std::string& target, const std::string& uuid,  bool show_chrome, const LLRect& preferred_media_size) +bool LLFloaterWebContent::matchesKey(const LLSD& key)  { -	lldebugs << "url = " << url << ", target = " << target << ", uuid = " << uuid << llendl; +	Params p(mKey); +	Params other_p(key); +	if (!other_p.target().empty() && other_p.target() != "_blank") +	{ +		return other_p.target() == p.target(); +	} +	else +	{ +		return other_p.id() == p.id(); +	} +} -	std::string tag = target; +//static +LLFloater* LLFloaterWebContent::create( Params p) +{ +	lldebugs << "url = " << p.url() << ", target = " << p.target() << ", uuid = " << p.id() << llendl; -	if(target.empty() || target == "_blank") +	if (!p.id.isProvided())  	{ -		if(!uuid.empty()) -		{ -			tag = uuid; -		} -		else -		{ -			// create a unique tag for this instance -			LLUUID id; -			id.generate(); -			tag = id.asString(); -		} +		p.id = LLUUID::generateNewID().asString();  	} -	S32 browser_window_limit = gSavedSettings.getS32("WebContentWindowLimit"); - -	if(LLFloaterReg::findInstance("web_content", tag) != NULL) +	if(p.target().empty() || p.target() == "_blank")  	{ -		// There's already a web browser for this tag, so we won't be opening a new window. +		p.target = p.id();  	} -	else if(browser_window_limit != 0) + +	S32 browser_window_limit = gSavedSettings.getS32("WebContentWindowLimit"); +	if(browser_window_limit != 0)  	{  		// showInstance will open a new window.  Figure out how many web browsers are already open,  		// and close the least recently opened one if this will put us over the limit. -		LLFloaterReg::const_instance_list_t &instances = LLFloaterReg::getFloaterList("web_content"); +		LLFloaterReg::const_instance_list_t &instances = LLFloaterReg::getFloaterList(p.window_class);  		lldebugs << "total instance count is " << instances.size() << llendl;  		for(LLFloaterReg::const_instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); iter++)  		{ -			lldebugs << "    " << (*iter)->getKey() << llendl; +			lldebugs << "    " << (*iter)->getKey()["target"] << llendl;  		}  		if(instances.size() >= (size_t)browser_window_limit) @@ -146,63 +161,26 @@ void LLFloaterWebContent::create( const std::string &url, const std::string& tar  		}  	} -	LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::showInstance("web_content", tag)); -	llassert(browser); -	if(browser) -	{ -		browser->mUUID = uuid; - -		// tell the browser instance to load the specified URL -		browser->open_media(url, target); -		LLViewerMedia::proxyWindowOpened(target, uuid); - -		browser->getChild<LLLayoutPanel>("status_bar")->setVisible(show_chrome); -		browser->getChild<LLLayoutPanel>("nav_controls")->setVisible(show_chrome); - -		if (!show_chrome) -		{ -			browser->setResizeLimits(100, 100); -		} - -		if (!preferred_media_size.isEmpty()) -		{ -			//ignore x, y for now -			browser->geometryChanged(browser->getRect().mLeft, browser->getRect().mBottom, preferred_media_size.getWidth(), preferred_media_size.getHeight()); -		} -	} +	return new LLFloaterWebContent(p);  }  //static  void LLFloaterWebContent::closeRequest(const std::string &uuid)  { -	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("web_content"); -	lldebugs << "instance list size is " << inst_list.size() << ", incoming uuid is " << uuid << llendl; -	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) +	LLFloaterWebContent* floaterp = getInstance(uuid); +	if (floaterp)  	{ -		LLFloaterWebContent* i = dynamic_cast<LLFloaterWebContent*>(*iter); -		lldebugs << "    " << i->mUUID << llendl; -		if (i && i->mUUID == uuid) -		{ -			i->closeFloater(false); -			return; - 		} - 	} +		floaterp->closeFloater(false); +	}  }  //static  void LLFloaterWebContent::geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height)  { -	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("web_content"); -	lldebugs << "instance list size is " << inst_list.size() << ", incoming uuid is " << uuid << llendl; -	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) +	LLFloaterWebContent* floaterp = getInstance(uuid); +	if (floaterp)  	{ -		LLFloaterWebContent* i = dynamic_cast<LLFloaterWebContent*>(*iter); -		lldebugs << "    " << i->mUUID << llendl; -		if (i && i->mUUID == uuid) -		{ -			i->geometryChanged(x, y, width, height); -			return; -		} +		floaterp->geometryChanged(x, y, width, height);  	}  } @@ -216,24 +194,75 @@ void LLFloaterWebContent::geometryChanged(S32 x, S32 y, S32 width, S32 height)  	getWindow()->getSize(&window_size);  	// Adjust width and height for the size of the chrome on the web Browser window. -	width += getRect().getWidth() - mWebBrowser->getRect().getWidth(); -	height += getRect().getHeight() - mWebBrowser->getRect().getHeight(); +	LLRect browser_rect; +	mWebBrowser->localRectToOtherView(mWebBrowser->getLocalRect(), &browser_rect, this); +	S32 requested_browser_bottom = window_size.mY - (y + height);  	LLRect geom; -	geom.setOriginAndSize(x, window_size.mY - (y + height), width, height); +	geom.setOriginAndSize(x - browser_rect.mLeft,  +						requested_browser_bottom - browser_rect.mBottom,  +						width + getRect().getWidth() - browser_rect.getWidth(),  +						height + getRect().getHeight() - browser_rect.getHeight());  	lldebugs << "geometry change: " << geom << llendl; - -	setShape(geom); +	 +	LLRect new_rect; +	getParent()->screenRectToLocal(geom, &new_rect); +	setShape(new_rect);	  } -void LLFloaterWebContent::open_media(const std::string& web_url, const std::string& target) +void LLFloaterWebContent::open_media(const Params& p)  {  	// Specifying a mime type of text/html here causes the plugin system to skip the MIME type probe and just open a browser plugin. -	mWebBrowser->setHomePageUrl(web_url, "text/html"); -	mWebBrowser->setTarget(target); -	mWebBrowser->navigateTo(web_url, "text/html"); -	set_current_url(web_url); +	LLViewerMedia::proxyWindowOpened(p.target(), p.id()); +	mWebBrowser->setHomePageUrl(p.url, "text/html"); +	mWebBrowser->setTarget(p.target); +	mWebBrowser->navigateTo(p.url, "text/html"); +	 +	set_current_url(p.url); + +	getChild<LLLayoutPanel>("status_bar")->setVisible(p.show_chrome); +	getChild<LLLayoutPanel>("nav_controls")->setVisible(p.show_chrome); +	bool address_entry_enabled = p.allow_address_entry && !p.trusted_content; +	getChildView("address")->setEnabled(address_entry_enabled); +	getChildView("popexternal")->setEnabled(address_entry_enabled); + +	if (!address_entry_enabled) +	{ +		mWebBrowser->setFocus(TRUE); +	} + +	if (!p.show_chrome) +	{ +		setResizeLimits(100, 100); +	} + +	if (!p.preferred_media_size().isEmpty()) +	{ +		LLLayoutStack::updateClass(); +		LLRect browser_rect = mWebBrowser->calcScreenRect(); +		LLCoordWindow window_size; +		getWindow()->getSize(&window_size); +		 +		geometryChanged(browser_rect.mLeft, window_size.mY - browser_rect.mTop, p.preferred_media_size().getWidth(), p.preferred_media_size().getHeight()); +	} + +} + +void LLFloaterWebContent::onOpen(const LLSD& key) +{ +	Params params(key); + +	if (!params.validateBlock()) +	{ +		closeFloater(); +		return; +	} + +	mWebBrowser->setTrustedContent(params.trusted_content); + +	// tell the browser instance to load the specified URL +	open_media(params);  }  //virtual @@ -246,7 +275,7 @@ void LLFloaterWebContent::onClose(bool app_quitting)  // virtual  void LLFloaterWebContent::draw()  { -	// this is asychronous so we need to keep checking +	// this is asynchronous so we need to keep checking  	getChildView( "back" )->setEnabled( mWebBrowser->canNavigateBack() );  	getChildView( "forward" )->setEnabled( mWebBrowser->canNavigateForward() ); @@ -332,10 +361,13 @@ void LLFloaterWebContent::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent  	{  		std::string page_title = self->getMediaName();  		// simulate browser behavior - title is empty, use the current URL -		if ( page_title.length() > 0 ) -			setTitle( page_title ); -		else -			setTitle( mCurrentURL ); +		if (mShowPageTitle) +		{ +			if ( page_title.length() > 0 ) +				setTitle( page_title ); +			else +				setTitle( mCurrentURL ); +		}  	}  	else if(event == MEDIA_EVENT_LINK_HOVERED )  	{ @@ -388,7 +420,7 @@ void LLFloaterWebContent::onClickStop()  	// still should happen when we catch the navigate complete event  	// but sometimes (don't know why) that event isn't sent from Qt -	// and we getto a point where the stop button stays active. +	// and we ghetto a point where the stop button stays active.  	getChildView("reload")->setVisible( true );  	getChildView("stop")->setVisible( false );  } diff --git a/indra/newview/llfloaterwebcontent.h b/indra/newview/llfloaterwebcontent.h index 56b6ef12c8..6fc66d1ad8 100644 --- a/indra/newview/llfloaterwebcontent.h +++ b/indra/newview/llfloaterwebcontent.h @@ -29,6 +29,7 @@  #include "llfloater.h"  #include "llmediactrl.h" +#include "llsdparam.h"  class LLMediaCtrl;  class LLComboBox; @@ -38,24 +39,46 @@ class LLIconCtrl;  class LLFloaterWebContent :  	public LLFloater, -	public LLViewerMediaObserver +	public LLViewerMediaObserver, +	public LLInstanceTracker<LLFloaterWebContent, std::string>  {  public:      LOG_CLASS(LLFloaterWebContent); -	LLFloaterWebContent(const LLSD& key); + +	struct _Params : public LLInitParam::Block<_Params> +	{ +		Optional<std::string>	url, +								target, +								window_class, +								id; +		Optional<bool>			show_chrome, +								allow_address_entry, +								trusted_content, +								show_page_title; +		Optional<LLRect>		preferred_media_size; + +		_Params(); +	}; + +	typedef LLSDParamAdapter<_Params> Params; + +	LLFloaterWebContent(const Params& params);  	void initializeURLHistory(); -	static void create(const std::string &url, const std::string& target, const std::string& uuid = LLStringUtil::null, bool show_chrome = true, const LLRect& preferred_media_size = LLRect() ); +	static LLFloater* create(Params);  	static void closeRequest(const std::string &uuid);  	static void geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height);  	void geometryChanged(S32 x, S32 y, S32 width, S32 height);  	/* virtual */ BOOL postBuild(); +	/* virtual */ void onOpen(const LLSD& key); +	/* virtual */ bool matchesKey(const LLSD& key);  	/* virtual */ void onClose(bool app_quitting);  	/* virtual */ void draw(); +protected:  	// inherited from LLViewerMediaObserver  	/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event); @@ -66,17 +89,17 @@ public:  	void onEnterAddress();  	void onPopExternal(); -private: -	void open_media(const std::string& media_url, const std::string& target); +	void open_media(const Params& );  	void set_current_url(const std::string& url); -	LLMediaCtrl* mWebBrowser; -	LLComboBox* mAddressCombo; -	LLIconCtrl *mSecureLockIcon; -	LLTextBox* mStatusBarText; -	LLProgressBar* mStatusBarProgress; -	std::string mCurrentURL; -	std::string mUUID; +	LLMediaCtrl*	mWebBrowser; +	LLComboBox*		mAddressCombo; +	LLIconCtrl*		mSecureLockIcon; +	LLTextBox*		mStatusBarText; +	LLProgressBar*	mStatusBarProgress; +	std::string		mCurrentURL; +	std::string		mUUID; +	bool			mShowPageTitle;  };  #endif  // LL_LLFLOATERWEBCONTENT_H diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index eb3c7ee469..137b5446cf 100755 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -70,7 +70,7 @@  #include "llappviewer.h"  #include "llmapimagetype.h"  #include "llweb.h" -#include "llslider.h" +#include "llsliderctrl.h"  #include "message.h"  #include "llwindow.h"			// copyTextToClipboard()  #include <algorithm> @@ -237,16 +237,19 @@ const LLUUID LLFloaterWorldMap::sHomeID( "10000000-0000-0000-0000-000000000001"  LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key)  :	LLFloater(key), -mInventory(NULL), -mInventoryObserver(NULL), -mFriendObserver(NULL), -mCompletingRegionName(), -mCompletingRegionPos(), -mWaitingForTracker(FALSE), -mIsClosing(FALSE), -mSetToUserPosition(TRUE), -mTrackedLocation(0,0,0), -mTrackedStatus(LLTracker::TRACKING_NOTHING) +	mInventory(NULL), +	mInventoryObserver(NULL), +	mFriendObserver(NULL), +	mCompletingRegionName(), +	mCompletingRegionPos(), +	mWaitingForTracker(FALSE), +	mIsClosing(FALSE), +	mSetToUserPosition(TRUE), +	mTrackedLocation(0,0,0), +	mTrackedStatus(LLTracker::TRACKING_NOTHING), +	mListFriendCombo(NULL), +	mListLandmarkCombo(NULL), +	mListSearchResults(NULL)  {  	gFloaterWorldMap = this; @@ -281,17 +284,20 @@ BOOL LLFloaterWorldMap::postBuild()  	avatar_combo->selectFirstItem();  	avatar_combo->setPrearrangeCallback( boost::bind(&LLFloaterWorldMap::onAvatarComboPrearrange, this) );  	avatar_combo->setTextEntryCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) ); +	mListFriendCombo = dynamic_cast<LLCtrlListInterface *>(avatar_combo);  	LLSearchEditor *location_editor = getChild<LLSearchEditor>("location");  	location_editor->setFocusChangedCallback(boost::bind(&LLFloaterWorldMap::onLocationFocusChanged, this, _1));  	location_editor->setKeystrokeCallback( boost::bind(&LLFloaterWorldMap::onSearchTextEntry, this));  	getChild<LLScrollListCtrl>("search_results")->setDoubleClickCallback( boost::bind(&LLFloaterWorldMap::onClickTeleportBtn, this)); +	mListSearchResults = childGetListInterface("search_results");  	LLComboBox *landmark_combo = getChild<LLComboBox>( "landmark combo");  	landmark_combo->selectFirstItem();  	landmark_combo->setPrearrangeCallback( boost::bind(&LLFloaterWorldMap::onLandmarkComboPrearrange, this) );  	landmark_combo->setTextEntryCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) ); +	mListLandmarkCombo = dynamic_cast<LLCtrlListInterface *>(landmark_combo);  	mCurZoomVal = log(LLWorldMapView::sMapScale)/log(2.f);  	getChild<LLUICtrl>("zoom slider")->setValue(LLWorldMapView::sMapScale); @@ -864,7 +870,7 @@ void LLFloaterWorldMap::friendsChanged()  // No longer really builds a list.  Instead, just updates mAvatarCombo.  void LLFloaterWorldMap::buildAvatarIDList()  { -	LLCtrlListInterface *list = childGetListInterface("friend combo"); +	LLCtrlListInterface *list = mListFriendCombo;  	if (!list) return;      // Delete all but the "None" entry @@ -894,7 +900,7 @@ void LLFloaterWorldMap::buildAvatarIDList()  void LLFloaterWorldMap::buildLandmarkIDLists()  { -	LLCtrlListInterface *list = childGetListInterface("landmark combo"); +	LLCtrlListInterface *list = mListLandmarkCombo;  	if (!list) return;      // Delete all but the "None" entry @@ -955,7 +961,7 @@ F32 LLFloaterWorldMap::getDistanceToDestination(const LLVector3d &destination,  void LLFloaterWorldMap::clearLocationSelection(BOOL clear_ui)  { -	LLCtrlListInterface *list = childGetListInterface("search_results"); +	LLCtrlListInterface *list = mListSearchResults;  	if (list)  	{  		list->operateOnAll(LLCtrlListInterface::OP_DELETE); @@ -969,7 +975,7 @@ void LLFloaterWorldMap::clearLandmarkSelection(BOOL clear_ui)  {  	if (clear_ui || !childHasKeyboardFocus("landmark combo"))  	{ -		LLCtrlListInterface *list = childGetListInterface("landmark combo"); +		LLCtrlListInterface *list = mListLandmarkCombo;  		if (list)  		{  			list->selectByValue( "None" ); @@ -983,7 +989,7 @@ void LLFloaterWorldMap::clearAvatarSelection(BOOL clear_ui)  	if (clear_ui || !childHasKeyboardFocus("friend combo"))  	{  		mTrackedStatus = LLTracker::TRACKING_NOTHING; -		LLCtrlListInterface *list = childGetListInterface("friend combo"); +		LLCtrlListInterface *list = mListFriendCombo;  		if (list)  		{  			list->selectByValue( "None" ); @@ -1029,7 +1035,7 @@ void LLFloaterWorldMap::adjustZoomSliderBounds()  	F32 min_power = log(pixels_per_region/256.f)/log(2.f); -	getChild<LLSlider>("zoom slider")->setMinValue(min_power); +	getChild<LLSliderCtrl>("zoom slider")->setMinValue(min_power);  } @@ -1051,7 +1057,7 @@ void LLFloaterWorldMap::onLandmarkComboPrearrange( )  		return;  	} -	LLCtrlListInterface *list = childGetListInterface("landmark combo"); +	LLCtrlListInterface *list = mListLandmarkCombo;  	if (!list) return;  	LLUUID current_choice = list->getCurrentID(); @@ -1087,7 +1093,7 @@ void LLFloaterWorldMap::onLandmarkComboCommit()  		return;  	} -	LLCtrlListInterface *list = childGetListInterface("landmark combo"); +	LLCtrlListInterface *list = mListLandmarkCombo;  	if (!list) return;  	LLUUID asset_id; @@ -1134,7 +1140,7 @@ void LLFloaterWorldMap::onAvatarComboPrearrange( )  		return;  	} -	LLCtrlListInterface *list = childGetListInterface("friend combo"); +	LLCtrlListInterface *list = mListFriendCombo;  	if (!list) return;  	LLUUID current_choice; @@ -1159,7 +1165,7 @@ void LLFloaterWorldMap::onAvatarComboCommit()  		return;  	} -	LLCtrlListInterface *list = childGetListInterface("friend combo"); +	LLCtrlListInterface *list = mListFriendCombo;  	if (!list) return;  	const LLUUID& new_avatar_id = list->getCurrentID(); @@ -1221,6 +1227,12 @@ void LLFloaterWorldMap::onLocationCommit()  	{	// Set the value in the UI if any spaces were removed  		getChild<LLUICtrl>("location")->setValue(str);  	} + +	// Don't try completing empty name (STORM-1427). +	if (str.empty()) +	{ +		return; +	}  	LLStringUtil::toLower(str);  	mCompletingRegionName = str; @@ -1553,7 +1565,7 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim)  void LLFloaterWorldMap::onCommitSearchResult()  { -	LLCtrlListInterface *list = childGetListInterface("search_results"); +	LLCtrlListInterface *list = mListSearchResults;  	if (!list) return;  	LLSD selected_value = list->getSelectedValue(); diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h index 783d9f4819..e3b83b2579 100644 --- a/indra/newview/llfloaterworldmap.h +++ b/indra/newview/llfloaterworldmap.h @@ -39,6 +39,7 @@  #include "lltracker.h"  #include "llslurl.h" +class LLCtrlListInterface;  class LLFriendObserver;  class LLInventoryModel;  class LLInventoryObserver; @@ -190,6 +191,10 @@ private:  	std::string				mTrackedSimName;  	std::string				mTrackedAvatarName;  	LLSLURL  				mSLURL; + +	LLCtrlListInterface *	mListFriendCombo; +	LLCtrlListInterface *	mListLandmarkCombo; +	LLCtrlListInterface *	mListSearchResults;  };  extern LLFloaterWorldMap* gFloaterWorldMap; diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index e90b6c1c3d..6ec2598e44 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -181,6 +181,7 @@ LLFolderView::Params::Params()  // Default constructor  LLFolderView::LLFolderView(const Params& p)  :	LLFolderViewFolder(p), +	mRunningHeight(0),  	mScrollContainer( NULL ),  	mPopupMenuHandle(),  	mAllowMultiSelect(p.allow_multiselect), @@ -298,7 +299,7 @@ LLFolderView::~LLFolderView( void )  	mAutoOpenItems.removeAllNodes();  	gIdleCallbacks.deleteFunction(idle, this); -	LLView::deleteViewByHandle(mPopupMenuHandle); +	delete mPopupMenuHandle.get();  	mAutoOpenItems.removeAllNodes();  	clearSelection(); @@ -369,16 +370,6 @@ void LLFolderView::closeAllFolders()  	arrangeAll();  } -void LLFolderView::openFolder(const std::string& foldername) -{ -	LLFolderViewFolder* inv = findChild<LLFolderViewFolder>(foldername); -	if (inv) -	{ -		setSelection(inv, FALSE, FALSE); -		inv->setOpen(TRUE); -	} -} -  void LLFolderView::openTopLevelFolders()  {  	for (folders_t::iterator iter = mFolders.begin(); @@ -402,6 +393,16 @@ static LLFastTimer::DeclareTimer FTM_ARRANGE("Arrange");  // This view grows and shinks to enclose all of its children items and folders.  S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_generation )  { +	if (getListener()->getUUID().notNull()) +	{ +		if (mNeedsSort) +		{ +			mFolders.sort(mSortFunction); +			mItems.sort(mSortFunction); +			mNeedsSort = false; +		} +	} +  	LLFastTimer t2(FTM_ARRANGE);  	filter_generation = mFilter->getMinRequiredGeneration(); @@ -479,6 +480,7 @@ S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_gen  		target_height = running_height;  	} +	mRunningHeight = running_height;  	LLRect scroll_rect = mScrollContainer->getContentWindowRect();  	reshape( llmax(scroll_rect.getWidth(), total_width), running_height ); @@ -524,9 +526,11 @@ void LLFolderView::reshape(S32 width, S32 height, BOOL called_from_parent)  	LLRect scroll_rect;  	if (mScrollContainer)  	{ +		LLView::reshape(width, height, called_from_parent);  		scroll_rect = mScrollContainer->getContentWindowRect();  	}  	width = llmax(mMinWidth, scroll_rect.getWidth()); +	height = llmax(mRunningHeight, scroll_rect.getHeight());  	// restrict width with scroll container's width  	if (mUseEllipses) @@ -710,8 +714,10 @@ void LLFolderView::extendSelection(LLFolderViewItem* selection, LLFolderViewItem  	mSignalSelectCallback = SIGNAL_KEYBOARD_FOCUS;  } +static LLFastTimer::DeclareTimer FTM_SANITIZE_SELECTION("Sanitize Selection");  void LLFolderView::sanitizeSelection()  { +	LLFastTimer _(FTM_SANITIZE_SELECTION);  	// store off current item in case it is automatically deselected  	// and we want to preserve context  	LLFolderViewItem* original_selected_item = getCurSelectedItem(); @@ -1004,6 +1010,33 @@ void LLFolderView::removeSelectedItems( void )  	LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&LLFolderView::onItemsRemovalConfirmation, this, _1, _2));  } +bool isDescendantOfASelectedItem(LLFolderViewItem* item, const std::vector<LLFolderViewItem*>& selectedItems) +{ +	LLFolderViewItem* item_parent = dynamic_cast<LLFolderViewItem*>(item->getParent()); + +	if (item_parent) +	{ +		for(std::vector<LLFolderViewItem*>::const_iterator it = selectedItems.begin(); it != selectedItems.end(); ++it) +		{ +			const LLFolderViewItem* const selected_item = (*it); + +			LLFolderViewItem* parent = item_parent; + +			while (parent) +			{ +				if (selected_item == parent) +				{ +					return true; +				} + +				parent = dynamic_cast<LLFolderViewItem*>(parent->getParent()); +			} +		} +	} + +	return false; +} +  void LLFolderView::onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response)  {  	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); @@ -1078,7 +1111,7 @@ void LLFolderView::onItemsRemovalConfirmation(const LLSD& notification, const LL  			if (!new_selection)  			{  				new_selection = last_item->getPreviousOpenNode(FALSE); -				while (new_selection && new_selection->isSelected()) +				while (new_selection && (new_selection->isSelected() || isDescendantOfASelectedItem(new_selection, items)))  				{  					new_selection = new_selection->getPreviousOpenNode(FALSE);  				} @@ -1690,7 +1723,7 @@ BOOL LLFolderView::handleUnicodeCharHere(llwchar uni_char)  	}  	BOOL handled = FALSE; -	if (gFocusMgr.childHasKeyboardFocus(getRoot())) +	if (mParentPanel->hasFocus())  	{  		// SL-51858: Key presses are not being passed to the Popup menu.  		// A proper fix is non-trivial so instead just close the menu. @@ -1903,20 +1936,25 @@ BOOL LLFolderView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  									 std::string& tooltip_msg)  {  	mDragAndDropThisFrame = TRUE; +	// have children handle it first  	BOOL handled = LLView::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data,  											 accept, tooltip_msg); -	// When there are no visible children drag and drop is handled +	// when drop is not handled by child, it should be handled  	// by the folder which is the hierarchy root. -	if (!handled && !hasVisibleChildren()) +	if (!handled)  	{ -		if (mFolders.empty()) -		{ -			handled = handleDragAndDropFromChild(mask,drop,cargo_type,cargo_data,accept,tooltip_msg); -		} +		if (getListener()->getUUID().notNull()) +	{ +		handled = LLFolderViewFolder::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); +	}  		else  		{ -			handled = mFolders.front()->handleDragAndDropFromChild(mask,drop,cargo_type,cargo_data,accept,tooltip_msg); +			if (!mFolders.empty()) +			{ +				// dispatch to last folder as a hack to support "Contents" folder in object inventory +				handled = mFolders.back()->handleDragAndDropFromChild(mask,drop,cargo_type,cargo_data,accept,tooltip_msg); +			}  		}  	} @@ -1931,7 +1969,7 @@ BOOL LLFolderView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  void LLFolderView::deleteAllChildren()  {  	closeRenamer(); -	LLView::deleteViewByHandle(mPopupMenuHandle); +	delete mPopupMenuHandle.get();  	mPopupMenuHandle = LLHandle<LLView>();  	mScrollContainer = NULL;  	mRenameItem = NULL; @@ -2038,8 +2076,10 @@ void LLFolderView::removeItemID(const LLUUID& id)  	mItemMap.erase(id);  } +LLFastTimer::DeclareTimer FTM_GET_ITEM_BY_ID("Get FolderViewItem by ID");  LLFolderViewItem* LLFolderView::getItemByID(const LLUUID& id)  { +	LLFastTimer _(FTM_GET_ITEM_BY_ID);  	if (id == getListener()->getUUID())  	{  		return this; diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 0b92548fd0..8af01e9102 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -108,7 +108,6 @@ public:  	// Close all folders in the view  	void closeAllFolders(); -	void openFolder(const std::string& foldername);  	void openTopLevelFolders();  	virtual void toggleOpen() {}; @@ -315,6 +314,7 @@ protected:  	signal_t						mReshapeSignal;  	S32								mSignalSelectCallback;  	S32								mMinWidth; +	S32								mRunningHeight;  	std::map<LLUUID, LLFolderViewItem*> mItemMap;  	BOOL							mDragAndDropThisFrame; diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h index 3bfbf36110..aee31ca033 100644 --- a/indra/newview/llfoldervieweventlistener.h +++ b/indra/newview/llfoldervieweventlistener.h @@ -96,7 +96,8 @@ public:  	// otherwise FALSE.  	virtual BOOL dragOrDrop(MASK mask, BOOL drop,  							EDragAndDropType cargo_type, -							void* cargo_data) = 0; +							void* cargo_data, +							std::string& tooltip_msg) = 0;  };  #endif diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 6e4f55fb2f..622dcfe8dd 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -101,10 +101,7 @@ LLFolderViewItem::Params::Params()  	item_height("item_height"),  	item_top_pad("item_top_pad"),  	creation_date() -{ -	mouse_opaque(true); -	follows.flags(FOLLOWS_LEFT|FOLLOWS_TOP|FOLLOWS_RIGHT); -} +{}  // Default constructor  LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p) @@ -132,7 +129,8 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)  	mIconOpen(p.icon_open),  	mIconOverlay(p.icon_overlay),  	mListener(p.listener), -	mShowLoadStatus(false) +	mShowLoadStatus(false), +	mIsMouseOverTitle(false)  {  } @@ -284,9 +282,9 @@ void LLFolderViewItem::refreshFromListener()  		setToolTip(mLabel);  		setIcon(mListener->getIcon());  		time_t creation_date = mListener->getCreationDate(); -		if (mCreationDate != creation_date) +		if ((creation_date > 0) && (mCreationDate != creation_date))  		{ -			mCreationDate = mListener->getCreationDate(); +			setCreationDate(creation_date);  			dirtyFilter();  		}  		if (mRoot->useLabelSuffix()) @@ -724,6 +722,8 @@ BOOL LLFolderViewItem::handleMouseDown( S32 x, S32 y, MASK mask )  BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask )  { +	mIsMouseOverTitle = (y > (getRect().getHeight() - mItemHeight)); +  	if( hasMouseCapture() && isMovable() )  	{  		S32 screen_x; @@ -830,6 +830,11 @@ BOOL LLFolderViewItem::handleMouseUp( S32 x, S32 y, MASK mask )  	return TRUE;  } +void LLFolderViewItem::onMouseLeave(S32 x, S32 y, MASK mask) +{ +	mIsMouseOverTitle = false; +} +  BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  										 EDragAndDropType cargo_type,  										 void* cargo_data, @@ -840,7 +845,7 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  	BOOL handled = FALSE;  	if(mListener)  	{ -		accepted = mListener->dragOrDrop(mask,drop,cargo_type,cargo_data); +		accepted = mListener->dragOrDrop(mask,drop,cargo_type,cargo_data, tooltip_msg);  		handled = accepted;  		if (accepted)  		{ @@ -879,6 +884,7 @@ void LLFolderViewItem::draw()  	static LLUIColor sLibraryColor = LLUIColorTable::instance().getColor("InventoryItemLibraryColor", DEFAULT_WHITE);  	static LLUIColor sLinkColor = LLUIColorTable::instance().getColor("InventoryItemLinkColor", DEFAULT_WHITE);  	static LLUIColor sSearchStatusColor = LLUIColorTable::instance().getColor("InventorySearchStatusColor", DEFAULT_WHITE); +	static LLUIColor sMouseOverColor = LLUIColorTable::instance().getColor("InventoryMouseOverColor", DEFAULT_WHITE);  	const Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();  	const S32 TOP_PAD = default_params.item_top_pad; @@ -960,6 +966,14 @@ void LLFolderViewItem::draw()  			}  		}  	} +	else if (mIsMouseOverTitle) +	{ +		gl_rect_2d(FOCUS_LEFT, +			focus_top,  +			getRect().getWidth() - 2, +			focus_bottom, +			sMouseOverColor, FALSE); +	}  	//--------------------------------------------------------------------------------//  	// Draw DragNDrop highlight @@ -2040,23 +2054,42 @@ BOOL LLFolderViewFolder::isRemovable()  BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item)  {  	mItems.push_back(item); +	  	if (item->isSelected())  	{  		recursiveIncrementNumDescendantsSelected(1);  	} +	  	item->setRect(LLRect(0, 0, getRect().getWidth(), 0));  	item->setVisible(FALSE); -	addChild( item ); +	 +	addChild(item); +	  	item->dirtyFilter(); + +	// Update the folder creation date if the child is newer than our current date +	setCreationDate(llmax<time_t>(mCreationDate, item->getCreationDate())); + +	// Handle sorting  	requestArrange();  	requestSort(); + +	// Traverse parent folders and update creation date and resort, if necessary  	LLFolderViewFolder* parentp = getParentFolder(); -	while (parentp && parentp->mSortFunction.isByDate()) +	while (parentp)  	{ -		// parent folder doesn't have a time stamp yet, so get it from us -		parentp->requestSort(); +		// Update the folder creation date if the child is newer than our current date +		parentp->setCreationDate(llmax<time_t>(parentp->mCreationDate, item->getCreationDate())); + +		if (parentp->mSortFunction.isByDate()) +		{ +			// parent folder doesn't have a time stamp yet, so get it from us +			parentp->requestSort(); +		} +  		parentp = parentp->getParentFolder();  	} +  	return TRUE;  } @@ -2162,7 +2195,7 @@ BOOL LLFolderViewFolder::handleDragAndDropFromChild(MASK mask,  													EAcceptance* accept,  													std::string& tooltip_msg)  { -	BOOL accepted = mListener && mListener->dragOrDrop(mask,drop,c_type,cargo_data); +	BOOL accepted = mListener && mListener->dragOrDrop(mask,drop,c_type,cargo_data, tooltip_msg);  	if (accepted)   	{  		mDragAndDropTarget = TRUE; @@ -2254,7 +2287,7 @@ BOOL LLFolderViewFolder::handleDragAndDrop(S32 x, S32 y, MASK mask,  	if (!handled)  	{ -		BOOL accepted = mListener && mListener->dragOrDrop(mask, drop,cargo_type,cargo_data); +		BOOL accepted = mListener && mListener->dragOrDrop(mask, drop,cargo_type,cargo_data, tooltip_msg);  		if (accepted)   		{ @@ -2299,6 +2332,8 @@ BOOL LLFolderViewFolder::handleRightMouseDown( S32 x, S32 y, MASK mask )  BOOL LLFolderViewFolder::handleHover(S32 x, S32 y, MASK mask)  { +	mIsMouseOverTitle = (y > (getRect().getHeight() - mItemHeight)); +  	BOOL handled = LLView::handleHover(x, y, mask);  	if (!handled) @@ -2418,41 +2453,6 @@ void LLFolderViewFolder::draw()  time_t LLFolderViewFolder::getCreationDate() const  { -	// folders have no creation date try to create one from an item somewhere in our folder hierarchy -	if (!mCreationDate) -	{ -		for (items_t::const_iterator iit = mItems.begin(); -			 iit != mItems.end(); ++iit) -		{ -			LLFolderViewItem* itemp = (*iit); - -			const time_t item_creation_date = itemp->getCreationDate(); -			 -			if (item_creation_date) -			{ -				mCreationDate = item_creation_date; -				break; -			} -		} -		 -		if (!mCreationDate) -		{ -			for (folders_t::const_iterator fit = mFolders.begin(); -				 fit != mFolders.end(); ++fit) -			{ -				LLFolderViewFolder* folderp = (*fit); -				 -				const time_t folder_creation_date = folderp->getCreationDate(); -				 -				if (folder_creation_date) -				{ -					mCreationDate = folder_creation_date; -					break; -				} -			} -		} -	} -  	return llmax<time_t>(mCreationDate, mSubtreeCreationDate);  } diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index e2f94a2b63..676eaf825d 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -136,7 +136,7 @@ protected:  	std::string					mSearchableLabel;  	S32							mLabelWidth;  	bool						mLabelWidthDirty; -	mutable time_t				mCreationDate; +	time_t						mCreationDate;  	LLFolderViewFolder*			mParentFolder;  	LLFolderViewEventListener*	mListener;  	BOOL						mIsCurSelection; @@ -159,6 +159,7 @@ protected:  	BOOL                        mIsLoading;  	LLTimer                     mTimeSinceRequestStart;  	bool						mShowLoadStatus; +	bool						mIsMouseOverTitle;  	// helper function to change the selection from the root.  	void changeSelectionFromRoot(LLFolderViewItem* selection, BOOL selected); @@ -173,6 +174,8 @@ protected:  	static LLFontGL* getLabelFontForStyle(U8 style); +	virtual void setCreationDate(time_t creation_date_utc)	{ mCreationDate = creation_date_utc; } +  public:  	BOOL postBuild(); @@ -228,7 +231,7 @@ public:  	void deselectItem();  	// this method is used to select this element -	void selectItem(); +	virtual void selectItem();  	// gets multiple-element selection  	virtual std::set<LLUUID> getSelectionList() const; @@ -326,6 +329,10 @@ public:  	virtual BOOL handleMouseUp( S32 x, S32 y, MASK mask );  	virtual BOOL handleDoubleClick( S32 x, S32 y, MASK mask ); +	virtual void onMouseLeave(S32 x, S32 y, MASK mask); + +	virtual LLView* findChildView(const std::string& name, BOOL recurse) const { return NULL; } +  	//	virtual void handleDropped();  	virtual void draw();  	virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 842911ecc0..fa3f546157 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -620,7 +620,7 @@ void LLViewerParcelMgr::renderCollisionSegments(U8* segments, BOOL use_pass, LLV  	F32 pos_y = pos.mV[VY];  	LLGLSUIDefault gls_ui; -	LLGLDepthTest gls_depth(GL_TRUE); +	LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);  	LLGLDisable cull(GL_CULL_FACE);  	if (mCollisionBanned == BA_BANNED) diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index 97fa551441..623ebb76f2 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -34,10 +34,10 @@  #include "llagent.h"  #include "llcommandhandler.h"  #include "llfloaterreg.h" +#include "llfloatersidepanelcontainer.h"  #include "llgroupmgr.h"  #include "llimview.h" // for gIMMgr  #include "llnotificationsutil.h" -#include "llsidetray.h"  #include "llstatusbar.h"	// can_afford_transaction()  #include "llimfloater.h"  #include "groupchatlistener.h" @@ -83,7 +83,7 @@ public:  			{  				LLSD params;  				params["people_panel_tab_name"] = "groups_panel"; -				LLSideTray::getInstance()->showPanel("panel_people", params); +				LLFloaterSidePanelContainer::showPanel("people", "panel_people", params);  				return true;  			}              return false; @@ -243,7 +243,7 @@ static bool isGroupUIVisible()  {  	static LLPanel* panel = 0;  	if(!panel) -		panel = LLSideTray::getInstance()->getPanel("panel_group_info_sidetray"); +		panel = LLFloaterSidePanelContainer::getPanel("people", "panel_group_info_sidetray");  	if(!panel)  		return false;  	return panel->isInVisibleChain(); @@ -265,7 +265,7 @@ void LLGroupActions::show(const LLUUID& group_id)  	params["group_id"] = group_id;  	params["open_tab_name"] = "panel_group_info_sidetray"; -	LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params); +	LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);  }  void LLGroupActions::refresh_notices() @@ -278,7 +278,7 @@ void LLGroupActions::refresh_notices()  	params["open_tab_name"] = "panel_group_info_sidetray";  	params["action"] = "refresh_notices"; -	LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params); +	LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);  }  //static  @@ -292,7 +292,7 @@ void LLGroupActions::refresh(const LLUUID& group_id)  	params["open_tab_name"] = "panel_group_info_sidetray";  	params["action"] = "refresh"; -	LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params); +	LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);  }  //static  @@ -303,7 +303,7 @@ void LLGroupActions::createGroup()  	params["open_tab_name"] = "panel_group_info_sidetray";  	params["action"] = "create"; -	LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params); +	LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);  }  //static @@ -317,7 +317,7 @@ void LLGroupActions::closeGroup(const LLUUID& group_id)  	params["open_tab_name"] = "panel_group_info_sidetray";  	params["action"] = "close"; -	LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params); +	LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);  } diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp index c3e6e1c2dc..f7ed1116cb 100644 --- a/indra/newview/llgrouplist.cpp +++ b/indra/newview/llgrouplist.cpp @@ -95,7 +95,7 @@ LLGroupList::LLGroupList(const Params& p)  LLGroupList::~LLGroupList()  {  	gAgent.removeListener(this); -	LLView::deleteViewByHandle(mContextMenuHandle); +	delete mContextMenuHandle.get();  }  // virtual diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index ce936a9924..efffd0f98e 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -857,7 +857,7 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)  	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );  	if (gAgent.getID() != agent_id)  	{ -		llwarns << "Got group properties reply for another agent!" << llendl; +		llwarns << "Got group members reply for another agent!" << llendl;  		return;  	} @@ -867,10 +867,10 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)  	LLUUID request_id;  	msg->getUUIDFast(_PREHASH_GroupData, _PREHASH_RequestID, request_id); -	LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->createGroupData(group_id); -	if (group_datap->mMemberRequestID != request_id) +	LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id); +	if (!group_datap || (group_datap->mMemberRequestID != request_id))  	{ -		llwarns << "processGroupMembersReply: Received incorrect (stale?) request id" << llendl; +		llwarns << "processGroupMembersReply: Received incorrect (stale?) group or request id" << llendl;  		return;  	} @@ -1028,7 +1028,7 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)  	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );  	if (gAgent.getID() != agent_id)  	{ -		llwarns << "Got group properties reply for another agent!" << llendl; +		llwarns << "Got group role data reply for another agent!" << llendl;  		return;  	} @@ -1038,14 +1038,14 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)  	LLUUID request_id;  	msg->getUUIDFast(_PREHASH_GroupData, _PREHASH_RequestID, request_id); -	LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->createGroupData(group_id); -	if (group_data->mRoleDataRequestID != request_id) +	LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id); +	if (!group_datap || (group_datap->mRoleDataRequestID != request_id))  	{ -		llwarns << "processGroupRoleDataReply: Received incorrect (stale?) request id" << llendl; +		llwarns << "processGroupPropertiesReply: Received incorrect (stale?) group or request id" << llendl;  		return;  	} -	msg->getS32(_PREHASH_GroupData, "RoleCount", group_data->mRoleCount ); +	msg->getS32(_PREHASH_GroupData, "RoleCount", group_datap->mRoleCount );  	std::string	name;  	std::string	title; @@ -1086,22 +1086,22 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)  		lldebugs << "Adding role data: " << name << " {" << role_id << "}" << llendl;  		LLGroupRoleData* rd = new LLGroupRoleData(role_id,name,title,desc,powers,member_count); -		group_data->mRoles[role_id] = rd; +		group_datap->mRoles[role_id] = rd;  	} -	if (group_data->mRoles.size() == (U32)group_data->mRoleCount) +	if (group_datap->mRoles.size() == (U32)group_datap->mRoleCount)  	{ -		group_data->mRoleDataComplete = TRUE; -		group_data->mRoleDataRequestID.setNull(); +		group_datap->mRoleDataComplete = TRUE; +		group_datap->mRoleDataRequestID.setNull();  		// We don't want to make role-member data requests until we have all the role data -		if (group_data->mPendingRoleMemberRequest) +		if (group_datap->mPendingRoleMemberRequest)  		{ -			group_data->mPendingRoleMemberRequest = FALSE; -			LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(group_data->mID); +			group_datap->mPendingRoleMemberRequest = FALSE; +			LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(group_datap->mID);  		}  	} -	group_data->mChanged = TRUE; +	group_datap->mChanged = TRUE;  	LLGroupMgr::getInstance()->notifyObservers(GC_ROLE_DATA);  } @@ -1113,7 +1113,7 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)  	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );  	if (gAgent.getID() != agent_id)  	{ -		llwarns << "Got group properties reply for another agent!" << llendl; +		llwarns << "Got group role members reply for another agent!" << llendl;  		return;  	} @@ -1126,11 +1126,10 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)  	U32 total_pairs;  	msg->getU32(_PREHASH_AgentData, "TotalPairs", total_pairs); -	LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->createGroupData(group_id); - -	if (group_data->mRoleMembersRequestID != request_id) +	LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id); +	if (!group_datap || (group_datap->mRoleMembersRequestID != request_id))  	{ -		llwarns << "processGroupRoleMembersReply: Received incorrect (stale?) role member request id" << llendl; +		llwarns << "processGroupRoleMembersReply: Received incorrect (stale?) group or request id" << llendl;  		return;  	} @@ -1155,15 +1154,15 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)  			if (role_id.notNull() && member_id.notNull() )  			{  				rd = NULL; -				ri = group_data->mRoles.find(role_id); -				if (ri != group_data->mRoles.end()) +				ri = group_datap->mRoles.find(role_id); +				if (ri != group_datap->mRoles.end())  				{  					rd = ri->second;  				}  				md = NULL; -				mi = group_data->mMembers.find(member_id); -				if (mi != group_data->mMembers.end()) +				mi = group_datap->mMembers.find(member_id); +				if (mi != group_datap->mMembers.end())  				{  					md = mi->second;  				} @@ -1182,21 +1181,21 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)  			}  		} -		group_data->mReceivedRoleMemberPairs += num_blocks; +		group_datap->mReceivedRoleMemberPairs += num_blocks;  	} -	if (group_data->mReceivedRoleMemberPairs == total_pairs) +	if (group_datap->mReceivedRoleMemberPairs == total_pairs)  	{  		// Add role data for the 'everyone' role to all members -		LLGroupRoleData* everyone = group_data->mRoles[LLUUID::null]; +		LLGroupRoleData* everyone = group_datap->mRoles[LLUUID::null];  		if (!everyone)  		{  			llwarns << "Everyone role not found!" << llendl;  		}  		else  		{ -			for (LLGroupMgrGroupData::member_list_t::iterator mi = group_data->mMembers.begin(); -				 mi != group_data->mMembers.end(); ++mi) +			for (LLGroupMgrGroupData::member_list_t::iterator mi = group_datap->mMembers.begin(); +				 mi != group_datap->mMembers.end(); ++mi)  			{  				LLGroupMemberData* data = mi->second;  				if (data) @@ -1206,11 +1205,11 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)  			}  		} -        group_data->mRoleMemberDataComplete = TRUE; -		group_data->mRoleMembersRequestID.setNull(); +        group_datap->mRoleMemberDataComplete = TRUE; +		group_datap->mRoleMembersRequestID.setNull();  	} -	group_data->mChanged = TRUE; +	group_datap->mChanged = TRUE;  	LLGroupMgr::getInstance()->notifyObservers(GC_ROLE_MEMBER_DATA);  } @@ -1228,15 +1227,13 @@ void LLGroupMgr::processGroupTitlesReply(LLMessageSystem* msg, void** data)  	LLUUID group_id;  	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_GroupID, group_id ); - -	LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->createGroupData(group_id); -  	LLUUID request_id;  	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_RequestID, request_id); - -	if (group_data->mTitlesRequestID != request_id) +	 +	LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id); +	if (!group_datap || (group_datap->mTitlesRequestID != request_id))  	{ -		llwarns << "processGroupTitlesReply: Received incorrect (stale?) title request id" << llendl; +		llwarns << "processGroupTitlesReply: Received incorrect (stale?) group" << llendl;  		return;  	} @@ -1253,11 +1250,11 @@ void LLGroupMgr::processGroupTitlesReply(LLMessageSystem* msg, void** data)  		if (!title.mTitle.empty())  		{  			lldebugs << "LLGroupMgr adding title: " << title.mTitle << ", " << title.mRoleID << ", " << (title.mSelected ? 'Y' : 'N') << llendl; -			group_data->mTitles.push_back(title); +			group_datap->mTitles.push_back(title);  		}  	} -	group_data->mChanged = TRUE; +	group_datap->mChanged = TRUE;  	LLGroupMgr::getInstance()->notifyObservers(GC_TITLES);  } diff --git a/indra/newview/llhudnametag.cpp b/indra/newview/llhudnametag.cpp index 82e1f2dfb5..482294c8a6 100644 --- a/indra/newview/llhudnametag.cpp +++ b/indra/newview/llhudnametag.cpp @@ -477,7 +477,7 @@ void LLHUDNameTag::renderText(BOOL for_select)  	// Render label  	{ -		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +		//gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  		for(std::vector<LLHUDTextSegment>::iterator segment_iter = mLabelSegments.begin();  			segment_iter != mLabelSegments.end(); ++segment_iter ) diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 50a9c56518..f5cda52d44 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -34,9 +34,9 @@  #include "llappviewer.h"  #include "llavatarnamecache.h"  #include "llbutton.h" -#include "llbottomtray.h"  #include "llchannelmanager.h"  #include "llchiclet.h" +#include "llchicletbar.h"  #include "llfloaterreg.h"  #include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container  #include "llinventoryfunctions.h" @@ -55,15 +55,9 @@  #include "llinventorymodel.h"  #include "llrootview.h"  #include "llspeakers.h" -#include "llsidetray.h"  #include "llviewerchat.h" -static const S32 RECT_PADDING_NOT_INIT = -1; -static const S32 RECT_PADDING_NEED_RECALC = -2; - -S32 LLIMFloater::sAllowedRectRightPadding = RECT_PADDING_NOT_INIT; -  LLIMFloater::LLIMFloater(const LLUUID& session_id)    : LLTransientDockableFloater(NULL, true, session_id),  	mControlPanel(NULL), @@ -123,14 +117,14 @@ void LLIMFloater::onFocusLost()  {  	LLIMModel::getInstance()->resetActiveSessionID(); -	LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, false); +	LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, false);  }  void LLIMFloater::onFocusReceived()  {  	LLIMModel::getInstance()->setActiveSessionID(mSessionID); -	LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, true); +	LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, true);  	if (getVisible())  	{ @@ -450,7 +444,7 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)  		if (floater->getDockControl() == NULL)  		{  			LLChiclet* chiclet = -					LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>( +					LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(  							session_id);  			if (chiclet == NULL)  			{ @@ -458,11 +452,11 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)  			}  			else  			{ -				LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet); +				LLChicletBar::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);  			}  			floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(), -					LLDockControl::TOP,  boost::bind(&LLIMFloater::getAllowedRect, floater, _1))); +					LLDockControl::BOTTOM));  		}  		// window is positioned, now we can show it. @@ -472,43 +466,6 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)  	return floater;  } -//static -bool LLIMFloater::resetAllowedRectPadding() -{ -	//reset allowed rect right padding if "SidebarCameraMovement" option  -	//or sidebar state changed -	sAllowedRectRightPadding = RECT_PADDING_NEED_RECALC ; -	return true; -} - -void LLIMFloater::getAllowedRect(LLRect& rect) -{ -	if (sAllowedRectRightPadding == RECT_PADDING_NOT_INIT) //wasn't initialized -	{ -		gSavedSettings.getControl("SidebarCameraMovement")->getSignal()->connect(boost::bind(&LLIMFloater::resetAllowedRectPadding)); - -		LLSideTray*	side_bar = LLSideTray::getInstance(); -		side_bar->setVisibleWidthChangeCallback(boost::bind(&LLIMFloater::resetAllowedRectPadding)); -		sAllowedRectRightPadding = RECT_PADDING_NEED_RECALC; -	} - -	rect = gViewerWindow->getWorldViewRectScaled(); -	if (sAllowedRectRightPadding == RECT_PADDING_NEED_RECALC) //recalc allowed rect right padding -	{ -		LLPanel* side_bar_tabs = -				gViewerWindow->getRootView()->getChild<LLPanel> ( -						"side_bar_tabs"); -		sAllowedRectRightPadding = side_bar_tabs->getRect().getWidth(); -		LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs); - -		if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE) -		{ -			sAllowedRectRightPadding += LLSideTray::getInstance()->getVisibleWidth(); -		} -	} -	rect.mRight -= sAllowedRectRightPadding; -} -  void LLIMFloater::setDocked(bool docked, bool pop_on_undock)  {  	// update notification channel state @@ -560,7 +517,7 @@ void LLIMFloater::setVisible(BOOL visible)  	if(!visible)  	{ -		LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(mSessionID); +		LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(mSessionID);  		if(chiclet)  		{  			chiclet->setToggleState(false); diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h index 5158f6c1f7..f7cd35b5eb 100644 --- a/indra/newview/llimfloater.h +++ b/indra/newview/llimfloater.h @@ -145,8 +145,6 @@ private:  	static void*	createPanelIMControl(void* userdata);  	static void*	createPanelGroupControl(void* userdata);  	static void* 	createPanelAdHocControl(void* userdata); -	// gets a rect that bounds possible positions for the LLIMFloater on a screen (EXT-1111) -	void getAllowedRect(LLRect& rect);  	// Add the "User is typing..." indicator.  	void addTypingIndicator(const LLIMInfo* im_info); @@ -156,10 +154,6 @@ private:  	static void closeHiddenIMToasts(); -	static bool resetAllowedRectPadding(); -	//need to keep this static for performance issues -	static S32 sAllowedRectRightPadding; -  	static void confirmLeaveCallCallback(const LLSD& notification, const LLSD& response);  	LLPanelChatControlPanel* mControlPanel; diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index b3b0c93b99..0250af6a0e 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -41,7 +41,6 @@  #include "llagent.h"  #include "llbutton.h" -#include "llbottomtray.h"  #include "llcallingcard.h"  #include "llchannelmanager.h"  #include "llchat.h" diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 4de6976534..6e9baed5f2 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -46,7 +46,6 @@  #include "llagentui.h"  #include "llappviewer.h"  #include "llavatariconctrl.h" -#include "llbottomtray.h"  #include "llcallingcard.h"  #include "llchat.h"  #include "llimfloater.h" @@ -61,6 +60,7 @@  #include "llnearbychat.h"  #include "llspeakers.h" //for LLIMSpeakerMgr  #include "lltextbox.h" +#include "lltoolbarview.h"  #include "llviewercontrol.h"  #include "llviewerparcelmgr.h" @@ -1675,23 +1675,13 @@ LLCallDialog::~LLCallDialog()  	LLUI::removePopup(this);  } -void LLCallDialog::getAllowedRect(LLRect& rect) -{ -	rect = gViewerWindow->getWorldViewRectScaled(); -} -  BOOL LLCallDialog::postBuild()  { -	if (!LLDockableFloater::postBuild()) +	if (!LLDockableFloater::postBuild() || !gToolBarView)  		return FALSE; -	// dock the dialog to the Speak Button, where other sys messages appear -	LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_panel"); - -	setDockControl(new LLDockControl( -		anchor_panel, this, -		getDockTongue(), LLDockControl::TOP, -		boost::bind(&LLCallDialog::getAllowedRect, this, _1))); +	LLView *anchor_panel = gToolBarView->findChildView("speak"); +	setDockControl(new LLDockControl(anchor_panel, this, getDockTongue(), LLDockControl::TOP));  	return TRUE;  } @@ -2449,8 +2439,10 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess  		LLChat chat(message);  		chat.mSourceType = CHAT_SOURCE_SYSTEM; +		 +		LLFloater* chat_bar = LLFloaterReg::getInstance("chat_bar"); +		LLNearbyChat* nearby_chat = chat_bar->findChild<LLNearbyChat>("nearby_chat"); -		LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());  		if(nearby_chat)  		{  			nearby_chat->addMessage(chat); diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 0ee56c8070..93b604d36a 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -508,8 +508,6 @@ protected:  	virtual bool lifetimeHasExpired();  	virtual void onLifetimeExpired(); -	virtual void getAllowedRect(LLRect& rect); -  	/**  	 * Sets icon depend on session.  	 * diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp index ee076f68ea..acc139c569 100644 --- a/indra/newview/llinspectobject.cpp +++ b/indra/newview/llinspectobject.cpp @@ -28,6 +28,7 @@  #include "llinspectobject.h"  // Viewer +#include "llfloatersidepanelcontainer.h"  #include "llinspect.h"  #include "llmediaentry.h"  #include "llnotificationsutil.h"	// *TODO: Eliminate, add LLNotificationsUtil wrapper @@ -45,7 +46,6 @@  #include "llmenubutton.h"  #include "llresmgr.h"			// getMonetaryString  #include "llsafehandle.h" -#include "llsidetray.h"  #include "lltextbox.h"			// for description truncation  #include "lltoggleablemenu.h"  #include "lltrans.h" @@ -640,7 +640,7 @@ void LLInspectObject::onClickMoreInfo()  {  	LLSD key;  	key["task"] = "task"; -	LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);	 +	LLFloaterSidePanelContainer::showPanel("inventory", key);  	closeFloater();  } diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 75d4c4e80d..0e27bd81be 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -39,6 +39,7 @@  #include "llavataractions.h"   #include "llfloateropenobject.h"  #include "llfloaterreg.h" +#include "llfloatersidepanelcontainer.h"  #include "llfloaterworldmap.h"  #include "llfolderview.h"  #include "llfriendcard.h" @@ -59,7 +60,6 @@  #include "llpreviewtexture.h"  #include "llselectmgr.h"  #include "llsidepanelappearance.h" -#include "llsidetray.h"  #include "lltrans.h"  #include "llviewerassettype.h"  #include "llviewerfoldertype.h" @@ -70,6 +70,9 @@  #include "llvoavatarself.h"  #include "llwearablelist.h" +// Marketplace outbox current disabled +#define ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU	0	// keep in sync with ENABLE_INVENTORY_DISPLAY_OUTBOX, ENABLE_MERCHANT_OUTBOX_PANEL +  typedef std::pair<LLUUID, LLUUID> two_uuids_t;  typedef std::list<two_uuids_t> two_uuids_list_t; @@ -107,6 +110,23 @@ bool confirm_attachment_rez(const LLSD& notification, const LLSD& response);  void teleport_via_landmark(const LLUUID& asset_id);  static BOOL can_move_to_outfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit); +// Helper functions + +bool isAddAction(const std::string& action) +{ +	return ("wear" == action || "attach" == action || "activate" == action); +} + +bool isRemoveAction(const std::string& action) +{ +	return ("take_off" == action || "detach" == action || "deactivate" == action); +} + +bool isMarketplaceCopyAction(const std::string& action) +{ +	return (("copy_to_outbox" == action) || ("move_to_outbox" == action)); +} +  // +=================================================+  // |        LLInvFVBridge                            |  // +=================================================+ @@ -538,10 +558,14 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,  			{  				items.push_back(std::string("Find Links"));  			} -			items.push_back(std::string("Rename")); -			if (!isItemRenameable() || (flags & FIRST_SELECTED_ITEM) == 0) + +			if (!isInboxFolder())  			{ -				disabled_items.push_back(std::string("Rename")); +				items.push_back(std::string("Rename")); +				if (!isItemRenameable() || (flags & FIRST_SELECTED_ITEM) == 0) +				{ +					disabled_items.push_back(std::string("Rename")); +				}  			}  			if (show_asset_id) @@ -569,11 +593,31 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,  			{  				disabled_items.push_back(std::string("Copy"));  			} + +			if (canListOnMarketplace()) +			{ +				items.push_back(std::string("Marketplace Separator")); + +				bool copyable = true; +				LLViewerInventoryItem* inv_item = gInventory.getItem(mUUID); +				if (inv_item) +				{ +					copyable = inv_item->getPermissions().allowCopyBy(gAgent.getID()); +				} + +				const std::string merchant_action = ((copyable == true) ? "Merchant Copy" : "Merchant Move"); +				items.push_back(merchant_action); + +				if (!canListOnMarketplaceNow()) +				{ +					disabled_items.push_back(merchant_action); +				} +			}  		}  	}  	// Don't allow items to be pasted directly into the COF or the inbox -	if (!isCOFFolder() && !isInboxFolder()) +	if (!isCOFFolder() && !isInboxFolder() && !isOutboxFolder())  	{  		items.push_back(std::string("Paste"));  	} @@ -610,6 +654,10 @@ void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	if(isItemInTrash())  	{  		addTrashContextMenuOptions(items, disabled_items); +	}	 +	else if(isOutboxFolder()) +	{ +		items.push_back(std::string("Delete"));  	}  	else  	{ @@ -794,6 +842,25 @@ BOOL LLInvFVBridge::isInboxFolder() const  	return gInventory.isObjectDescendentOf(mUUID, inbox_id);  } +BOOL LLInvFVBridge::isOutboxFolder() const +{ +	const LLUUID outbox_id = getOutboxFolder(); + +	if (outbox_id.isNull()) +	{ +		return FALSE; +	} + +	return gInventory.isObjectDescendentOf(mUUID, outbox_id); +} + +const LLUUID LLInvFVBridge::getOutboxFolder() const +{ +	const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false); + +	return outbox_id; +} +  BOOL LLInvFVBridge::isItemPermissive() const  {  	return FALSE; @@ -938,9 +1005,14 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,  			new_listener = new LLMeshBridge(inventory, root, uuid);  			break; +		case LLAssetType::AT_IMAGE_TGA: +		case LLAssetType::AT_IMAGE_JPEG: +			//llwarns << LLAssetType::lookup(asset_type) << " asset type is unhandled for uuid " << uuid << llendl; +			break; +  		default:  			llinfos << "Unhandled asset type (llassetstorage.h): " -					<< (S32)asset_type << llendl; +					<< (S32)asset_type << " (" << LLAssetType::lookup(asset_type) << ")" << llendl;  			break;  	} @@ -989,6 +1061,65 @@ BOOL LLInvFVBridge::canShare() const  	return FALSE;  } +BOOL LLInvFVBridge::canListOnMarketplace() const +{ +#if ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU +	LLInventoryModel * model = getInventoryModel(); +	const LLViewerInventoryCategory * cat = model->getCategory(mUUID); +	if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType())) +	{ +		return FALSE; +	} + +	if (!isAgentInventory()) +	{ +		return FALSE; +	} +	 +	if (getOutboxFolder().isNull()) +	{ +		return FALSE; +	} + +	if (isInboxFolder() || isOutboxFolder()) +	{ +		return FALSE; +	} + +	LLViewerInventoryItem * item = model->getItem(mUUID); +	if (item && !item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID())) +	{ +		return FALSE; +	} + +	return TRUE; +#else +	return FALSE; +#endif +} + +BOOL LLInvFVBridge::canListOnMarketplaceNow() const +{ +#if ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU +	if (get_is_item_worn(mUUID)) +	{ +		return FALSE; +	} + +	// Loop through all items worn by avatar and check to see if they are descendants +	// of the item we are trying to list on the marketplace +	if (get_is_parent_to_worn_item(mUUID)) +	{ +		return FALSE; +	} + +	return TRUE; +#else +	return FALSE; +#endif +} + +  // +=================================================+  // |        InventoryFVBridgeBuilder                 |  // +=================================================+ @@ -1054,7 +1185,7 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)  		std::string buffer;  		asset_id.toString(buffer); -		gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(buffer)); +		gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(buffer));  		return;  	}  	else if ("copy" == action) @@ -1086,6 +1217,16 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)  		folder_view_itemp->getListener()->pasteLinkFromClipboard();  		return;  	} +	else if (isMarketplaceCopyAction(action)) +	{ +		llinfos << "Copy item to marketplace action!" << llendl; + +		LLInventoryItem* itemp = model->getItem(mUUID); +		if (!itemp) return; + +		const LLUUID outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false); +		copy_item_to_outbox(itemp, outbox_id, LLUUID::null); +	}  }  void LLItemBridge::selectItem() @@ -1226,7 +1367,7 @@ std::string LLItemBridge::getLabelSuffix() const  {  	// String table is loaded before login screen and inventory items are  	// loaded after login, so LLTrans should be ready. -	static std::string NO_COPY =LLTrans::getString("no_copy"); +	static std::string NO_COPY = LLTrans::getString("no_copy");  	static std::string NO_MOD = LLTrans::getString("no_modify");  	static std::string NO_XFER = LLTrans::getString("no_transfer");  	static std::string LINK = LLTrans::getString("link"); @@ -1235,16 +1376,17 @@ std::string LLItemBridge::getLabelSuffix() const  	LLInventoryItem* item = getItem();  	if(item)  	{ -		// it's a bit confusing to put nocopy/nomod/etc on calling cards. +		// Any type can have the link suffix... +		BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType()); +		if (broken_link) return BROKEN_LINK; + +		BOOL link = item->getIsLinkType(); +		if (link) return LINK; + +		// ...but it's a bit confusing to put nocopy/nomod/etc suffixes on calling cards.  		if(LLAssetType::AT_CALLINGCARD != item->getType()  		   && item->getPermissions().getOwner() == gAgent.getID())  		{ -			BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType()); -			if (broken_link) return BROKEN_LINK; - -			BOOL link = item->getIsLinkType(); -			if (link) return LINK; -  			BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID());  			if (!copy)  			{ @@ -1294,6 +1436,11 @@ BOOL LLItemBridge::isItemRenameable() const  			return FALSE;  		} +		if (isInboxFolder()) +		{ +			return FALSE; +		} +  		return (item->getPermissions().allowModifyBy(gAgent.getID()));  	}  	return FALSE; @@ -1457,16 +1604,6 @@ BOOL LLItemBridge::isItemPermissive() const  	return FALSE;  } -bool LLItemBridge::isAddAction(std::string action) const -{ -	return ("wear" == action || "attach" == action || "activate" == action); -} - -bool LLItemBridge::isRemoveAction(std::string action) const -{ -	return ("take_off" == action || "detach" == action || "deactivate" == action); -} -  // +=================================================+  // |        LLFolderBridge                           |  // +=================================================+ @@ -1648,8 +1785,77 @@ BOOL LLFolderBridge::isClipboardPasteableAsLink() const  } +static BOOL can_move_to_outbox(LLInventoryItem* inv_item, std::string& tooltip_msg) +{ +	bool worn = get_is_item_worn(inv_item->getUUID()); +	bool allow_transfer = inv_item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()); + +	if (!allow_transfer) +	{ +		tooltip_msg = LLTrans::getString("TooltipOutboxNoTransfer"); +	} +	else if(worn) +	{ +		tooltip_msg = LLTrans::getString("TooltipOutboxWorn"); +	} +	 +	return !worn && allow_transfer; +} + + + +void LLFolderBridge::dropFolderToOutbox(LLInventoryCategory* inv_cat) +{ +	copy_folder_to_outbox(inv_cat, getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false), inv_cat->getUUID());	 +} + + + +int get_folder_levels(LLInventoryCategory* inv_cat) +{ +	LLInventoryModel::cat_array_t* cats; +	LLInventoryModel::item_array_t* items; +	gInventory.getDirectDescendentsOf(inv_cat->getUUID(), cats, items); + +	int max_child_levels = 0; + +	for (S32 i=0; i < cats->count(); ++i) +	{ +		LLInventoryCategory* category = cats->get(i); +		max_child_levels = llmax(max_child_levels, get_folder_levels(category)); +	} + +	return 1 + max_child_levels; +} + +int get_folder_path_length(const LLUUID& ancestor_id, const LLUUID& descendant_id) +{ +	int depth = 0; + +	if (ancestor_id == descendant_id) return depth; + +	const LLInventoryCategory* category = gInventory.getCategory(descendant_id); + +	while(category) +	{ +		LLUUID parent_id = category->getParentUUID(); + +		if (parent_id.isNull()) break; + +		depth++; + +		if (parent_id == ancestor_id) return depth; + +		category = gInventory.getCategory(parent_id); +	} + +	llwarns << "get_folder_path_length() couldn't trace a path from the descendant to the ancestor" << llendl; +	return -1; +} +  BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, -											BOOL drop) +											BOOL drop, +											std::string& tooltip_msg)  {  	LLInventoryModel* model = getInventoryModel(); @@ -1674,10 +1880,13 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  		const LLUUID &cat_id = inv_cat->getUUID();  		const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH, false);  		const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false); -		 +		const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false); +  		const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);  		const BOOL move_is_into_outfit = getCategory() && (getCategory()->getPreferredType() == LLFolderType::FT_OUTFIT);  		const BOOL move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id); +		const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id);  +		const BOOL move_is_from_outbox = model->isObjectDescendentOf(inv_cat->getUUID(), outbox_id);  		//--------------------------------------------------------------------------------  		// Determine if folder can be moved. @@ -1730,6 +1939,27 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  				}  			}  		} +		if (move_is_into_outbox) +		{ +			for (S32 i=0; i < descendent_items.count(); ++i) +			{ +				LLInventoryItem* item = descendent_items[i]; +				if (!can_move_to_outbox(item, tooltip_msg)) +				{ +					is_movable = FALSE; +					break;  +				} +			} + +			int nested_folder_levels = get_folder_path_length(outbox_id, mUUID) + get_folder_levels(inv_cat); + +			if (nested_folder_levels > 4) +			{ +				tooltip_msg = LLTrans::getString("TooltipOutboxFolderLevels"); +				is_movable = FALSE; +			} +			 +		}  		//   		//-------------------------------------------------------------------------------- @@ -1797,6 +2027,10 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  #endif  				}  			} +			if (move_is_into_outbox && !move_is_from_outbox) +			{ +				dropFolderToOutbox(inv_cat); +			}  			else  			{  				if (gInventory.isObjectDescendentOf(inv_cat->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false))) @@ -2209,6 +2443,16 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)  		removeSystemFolder();  	}  #endif +	else if (isMarketplaceCopyAction(action)) +	{ +		llinfos << "Copy folder to marketplace action!" << llendl; + +		LLInventoryCategory * cat = gInventory.getCategory(mUUID); +		if (!cat) return; + +		const LLUUID outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false); +		copy_folder_to_outbox(cat, outbox_id, cat->getUUID()); +	}  }  void LLFolderBridge::openItem() @@ -2483,8 +2727,6 @@ void LLFolderBridge::staticFolderOptionsMenu()  void LLFolderBridge::folderOptionsMenu()  { -	menuentry_vec_t disabled_items; -  	LLInventoryModel* model = getInventoryModel();  	if(!model) return; @@ -2495,6 +2737,7 @@ void LLFolderBridge::folderOptionsMenu()  	if (trash_id == mUUID) return;  	if (isItemInTrash()) return;  	if (!isAgentInventory()) return; +	if (isOutboxFolder()) return;  	LLFolderType::EType type = category->getPreferredType();  	const bool is_system_folder = LLFolderType::lookupIsProtectedType(type); @@ -2514,6 +2757,11 @@ void LLFolderBridge::folderOptionsMenu()  		}  	} +	if (!isItemRemovable()) +	{ +		mDisabledItems.push_back(std::string("Delete")); +	} +  #ifndef LL_RELEASE_FOR_DOWNLOAD  	if (LLFolderType::lookupIsProtectedType(type))  	{ @@ -2552,18 +2800,18 @@ void LLFolderBridge::folderOptionsMenu()  		mItems.push_back(std::string("Remove From Outfit"));  		if (!LLAppearanceMgr::getCanRemoveFromCOF(mUUID))  		{ -			disabled_items.push_back(std::string("Remove From Outfit")); +			mDisabledItems.push_back(std::string("Remove From Outfit"));  		}  		if (!LLAppearanceMgr::instance().getCanReplaceCOF(mUUID))  		{ -			disabled_items.push_back(std::string("Replace Outfit")); +			mDisabledItems.push_back(std::string("Replace Outfit"));  		}  		mItems.push_back(std::string("Outfit Separator"));  	}  	LLMenuGL* menup = dynamic_cast<LLMenuGL*>(mMenu.get());  	if (menup)  	{ -		hide_context_entries(*menup, mItems, disabled_items, TRUE); +		hide_context_entries(*menup, mItems, mDisabledItems, TRUE);  		// Reposition the menu, in case we're adding items to an existing menu.  		menup->needsArrange(); @@ -2625,6 +2873,10 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		mItems.clear(); // clear any items that used to exist  		addTrashContextMenuOptions(mItems, mDisabledItems);  	} +	else if(isOutboxFolder()) +	{ +		mItems.push_back(std::string("Delete")); +	}  	else if(isAgentInventory()) // do not allow creating in library  	{  		LLViewerInventoryCategory *cat =  getCategory(); @@ -2632,7 +2884,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		// Not sure what the right thing is to do here.  		if (!isCOFFolder() && cat && (cat->getPreferredType() != LLFolderType::FT_OUTFIT))  		{ -			if (!isInboxFolder()) // don't allow creation in inbox +			if (!isInboxFolder() && !isOutboxFolder()) // don't allow creation in inbox  			{  				// Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694.  				if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat)) @@ -2699,10 +2951,13 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		mDisabledItems.push_back(std::string("Delete System Folder"));  	} -	mItems.push_back(std::string("Share")); -	if (!canShare()) +	if (!isOutboxFolder())  	{ -		mDisabledItems.push_back(std::string("Share")); +		mItems.push_back(std::string("Share")); +		if (!canShare()) +		{ +			mDisabledItems.push_back(std::string("Share")); +		}  	}  	hide_context_entries(menu, mItems, mDisabledItems); @@ -2743,7 +2998,8 @@ BOOL LLFolderBridge::hasChildren() const  BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,  								EDragAndDropType cargo_type, -								void* cargo_data) +								void* cargo_data, +								std::string& tooltip_msg)  {  	LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data; @@ -2763,7 +3019,7 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,  		case DAD_ANIMATION:  		case DAD_GESTURE:  		case DAD_MESH: -			accept = dragItemIntoFolder(inv_item, drop); +			accept = dragItemIntoFolder(inv_item, drop, tooltip_msg);  			break;  		case DAD_LINK:  			// DAD_LINK type might mean one of two asset types: AT_LINK or AT_LINK_FOLDER. @@ -2774,12 +3030,12 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,  				LLInventoryCategory* linked_category = gInventory.getCategory(inv_item->getLinkedUUID());  				if (linked_category)  				{ -					accept = dragCategoryIntoFolder((LLInventoryCategory*)linked_category, drop); +					accept = dragCategoryIntoFolder((LLInventoryCategory*)linked_category, drop, tooltip_msg);  				}  			}  			else  			{ -				accept = dragItemIntoFolder(inv_item, drop); +				accept = dragItemIntoFolder(inv_item, drop, tooltip_msg);  			}  			break;  		case DAD_CATEGORY: @@ -2789,7 +3045,7 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,  			}  			else  			{ -				accept = dragCategoryIntoFolder((LLInventoryCategory*)cargo_data, drop); +				accept = dragCategoryIntoFolder((LLInventoryCategory*)cargo_data, drop, tooltip_msg);  			}  			break;  		case DAD_ROOT_CATEGORY: @@ -3046,7 +3302,8 @@ void LLFolderBridge::dropToOutfit(LLInventoryItem* inv_item, BOOL move_is_into_c  // into the folder, as well as performing the actual drop, depending  // if drop == TRUE.  BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, -										BOOL drop) +										BOOL drop, +										std::string& tooltip_msg)  {  	LLInventoryModel* model = getInventoryModel(); @@ -3057,11 +3314,14 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  	const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);  	const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE, false);  	const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false); +	const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);  	const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);  	const BOOL move_is_into_favorites = (mUUID == favorites_id);  	const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);  	const BOOL move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id); +	const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id); //(mUUID == outbox_id); +	const BOOL move_is_from_outbox = model->isObjectDescendentOf(inv_item->getUUID(), outbox_id);  	LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();  	BOOL accept = FALSE; @@ -3127,6 +3387,10 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  		{  			accept = can_move_to_landmarks(inv_item);  		} +		else if (move_is_into_outbox) +		{ +			accept = can_move_to_outbox(inv_item, tooltip_msg); +		}  		if(accept && drop)  		{ @@ -3177,6 +3441,10 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			{  				dropToOutfit(inv_item, move_is_into_current_outfit);  			} +			else if (move_is_into_outbox && !move_is_from_outbox) +			{ +				copy_item_to_outbox(inv_item, outbox_id, LLUUID::null); +			}  			// NORMAL or TRASH folder  			// (move the item, restamp if into trash)  			else @@ -3377,6 +3645,10 @@ void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	if(isItemInTrash())  	{  		addTrashContextMenuOptions(items, disabled_items); +	}	 +	else if(isOutboxFolder()) +	{ +		items.push_back(std::string("Delete"));  	}  	else  	{ @@ -3453,6 +3725,10 @@ void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	if(isItemInTrash())  	{  		addTrashContextMenuOptions(items, disabled_items); +	}	 +	else if(isOutboxFolder()) +	{ +		items.push_back(std::string("Delete"));  	}  	else  	{ @@ -3467,8 +3743,11 @@ void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		getClipboardEntries(true, items, disabled_items, flags);  	} -	items.push_back(std::string("Sound Separator")); -	items.push_back(std::string("Sound Play")); +	if (!isOutboxFolder()) +	{ +		items.push_back(std::string("Sound Separator")); +		items.push_back(std::string("Sound Play")); +	}  	hide_context_entries(menu, items, disabled_items);  } @@ -3504,6 +3783,10 @@ void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	if(isItemInTrash())  	{  		addTrashContextMenuOptions(items, disabled_items); +	}	 +	else if(isOutboxFolder()) +	{ +		items.push_back(std::string("Delete"));  	}  	else  	{ @@ -3518,8 +3801,11 @@ void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		getClipboardEntries(true, items, disabled_items, flags);  	} -	items.push_back(std::string("Landmark Separator")); -	items.push_back(std::string("About Landmark")); +	if (!isOutboxFolder()) +	{ +		items.push_back(std::string("Landmark Separator")); +		items.push_back(std::string("About Landmark")); +	}  	// Disable "About Landmark" menu item for  	// multiple landmarks selected. Only one landmark @@ -3566,7 +3852,7 @@ void LLLandmarkBridge::performAction(LLInventoryModel* model, std::string action  			key["type"] = "landmark";  			key["id"] = item->getUUID(); -			LLSideTray::getInstance()->showPanel("panel_places", key); +			LLFloaterSidePanelContainer::showPanel("places", key);  		}  	}  	else @@ -3733,6 +4019,10 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	if(isItemInTrash())  	{  		addTrashContextMenuOptions(items, disabled_items); +	}	 +	else if(isOutboxFolder()) +	{ +		items.push_back(std::string("Delete"));  	}  	else  	{ @@ -3775,7 +4065,8 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,  									 EDragAndDropType cargo_type, -									 void* cargo_data) +									 void* cargo_data, +									 std::string& tooltip_msg)  {  	LLViewerInventoryItem* item = getItem();  	BOOL rv = FALSE; @@ -3990,6 +4281,10 @@ void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	{  		addTrashContextMenuOptions(items, disabled_items);  	} +	else if(isOutboxFolder()) +	{ +		items.push_back(std::string("Delete")); +	}  	else  	{  		items.push_back(std::string("Share")); @@ -4043,6 +4338,10 @@ void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	if(isItemInTrash())  	{  		addTrashContextMenuOptions(items, disabled_items); +	}	 +	else if(isOutboxFolder()) +	{ +		items.push_back(std::string("Delete"));  	}  	else  	{ @@ -4057,9 +4356,12 @@ void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		getClipboardEntries(true, items, disabled_items, flags);  	} -	items.push_back(std::string("Animation Separator")); -	items.push_back(std::string("Animation Play")); -	items.push_back(std::string("Animation Audition")); +	if (!isOutboxFolder()) +	{ +		items.push_back(std::string("Animation Separator")); +		items.push_back(std::string("Animation Play")); +		items.push_back(std::string("Animation Audition")); +	}  	hide_context_entries(menu, items, disabled_items); @@ -4316,6 +4618,10 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	if(isItemInTrash())  	{  		addTrashContextMenuOptions(items, disabled_items); +	}	 +	else if(isOutboxFolder()) +	{ +		items.push_back(std::string("Delete"));  	}  	else  	{ @@ -4475,7 +4781,7 @@ void remove_inventory_category_from_avatar( LLInventoryCategory* category )  	if (gAgentCamera.cameraCustomizeAvatar())  	{  		// switching to outfit editor should automagically save any currently edited wearable -		LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit")); +		LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit"));  	}  	remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() ); @@ -4649,6 +4955,10 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	{  		addTrashContextMenuOptions(items, disabled_items);  	} +	else if(isOutboxFolder()) +	{ +		items.push_back(std::string("Delete")); +	}  	else  	{	// FWIW, it looks like SUPPRESS_OPEN_ITEM is not set anywhere  		BOOL can_open = ((flags & SUPPRESS_OPEN_ITEM) != SUPPRESS_OPEN_ITEM); @@ -4922,31 +5232,22 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,  // static  void LLWearableBridge::removeAllClothesFromAvatar()  { -	// Remove COF links. -	for (S32 itype = LLWearableType::WT_SHAPE; itype < LLWearableType::WT_COUNT; ++itype) -	{ -		if (itype == LLWearableType::WT_SHAPE || itype == LLWearableType::WT_SKIN || itype == LLWearableType::WT_HAIR || itype == LLWearableType::WT_EYES) -			continue; +	// Fetch worn clothes (i.e. the ones in COF). +	LLInventoryModel::item_array_t clothing_items; +	LLInventoryModel::cat_array_t dummy; +	LLIsType is_clothing(LLAssetType::AT_CLOTHING); +	gInventory.collectDescendentsIf(LLAppearanceMgr::instance().getCOF(), +									dummy, +									clothing_items, +									LLInventoryModel::EXCLUDE_TRASH, +									is_clothing, +									false); -		for (S32 index = gAgentWearables.getWearableCount(itype)-1; index >= 0 ; --index) -		{ -			LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>( -				gAgentWearables.getWearableInventoryItem((LLWearableType::EType)itype, index)); -			if (!item) -				continue; -			const LLUUID &item_id = item->getUUID(); -			const LLWearable *wearable = gAgentWearables.getWearableFromItemID(item_id); -			if (!wearable) -				continue; -	 -			// Find and remove this item from the COF. -			LLAppearanceMgr::instance().removeCOFItemLinks(item_id,false); -		} +	// Take them off by removing from COF. +	for (LLInventoryModel::item_array_t::const_iterator it = clothing_items.begin(); it != clothing_items.end(); ++it) +	{ +		LLAppearanceMgr::instance().removeItemFromAvatar((*it)->getUUID());  	} -	gInventory.notifyObservers(); - -	// Remove wearables from gAgentWearables -	LLAgentWearables::userRemoveAllClothes();  }  // static @@ -5046,6 +5347,10 @@ void LLMeshBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		items.push_back(std::string("Restore Item"));  	} +	else if(isOutboxFolder()) +	{ +		items.push_back(std::string("Delete")); +	}  	else  	{  		items.push_back(std::string("Properties")); diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 15629c0c75..2d625befb4 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -52,7 +52,7 @@ typedef std::vector<std::string> menuentry_vec_t;  //  // You'll want to call LLInvItemFVELister::createBridge() to actually create  // an instance of this class. This helps encapsulate the -// funcationality a bit. (except for folders, you can create those +// functionality a bit. (except for folders, you can create those  // manually...)  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  class LLInvFVBridge : public LLFolderViewEventListener @@ -70,6 +70,8 @@ public:  	virtual ~LLInvFVBridge() {}  	BOOL canShare() const; +	BOOL canListOnMarketplace() const; +	BOOL canListOnMarketplaceNow() const;  	//--------------------------------------------------------------------  	// LLInvFVBridge functionality @@ -115,7 +117,8 @@ public:  	virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const;  	virtual BOOL dragOrDrop(MASK mask, BOOL drop,  							EDragAndDropType cargo_type, -							void* cargo_data) { return FALSE; } +							void* cargo_data, +							std::string& tooltip_msg) { return FALSE; }  	virtual LLInventoryType::EType getInventoryType() const { return mInvType; }  	virtual LLWearableType::EType getWearableType() const { return LLWearableType::WT_NONE; } @@ -140,6 +143,9 @@ protected:  	BOOL isAgentInventory() const; // false if lost or in the inventory library  	BOOL isCOFFolder() const; // true if COF or descendent of  	BOOL isInboxFolder() const; // true if COF or descendent of marketplace inbox +	BOOL isOutboxFolder() const; // true if COF or descendent of marketplace outbox +	const LLUUID getOutboxFolder() const; +  	virtual BOOL isItemPermissive() const;  	static void changeItemParent(LLInventoryModel* model,  								 LLViewerInventoryItem* item, @@ -208,8 +214,7 @@ public:  	/*virtual*/ void clearDisplayName() { mDisplayName.clear(); }  	LLViewerInventoryItem* getItem() const; -	bool isAddAction(std::string action) const; -	bool isRemoveAction(std::string action) const; +  protected:  	BOOL confirmRemoveItem(const LLSD& notification, const LLSD& response);  	virtual BOOL isItemPermissive() const; @@ -228,8 +233,9 @@ public:  		mCallingCards(FALSE),  		mWearables(FALSE)  	{} -	BOOL dragItemIntoFolder(LLInventoryItem* inv_item, BOOL drop); -	BOOL dragCategoryIntoFolder(LLInventoryCategory* inv_category, BOOL drop); +		 +	BOOL dragItemIntoFolder(LLInventoryItem* inv_item, BOOL drop, std::string& tooltip_msg); +	BOOL dragCategoryIntoFolder(LLInventoryCategory* inv_category, BOOL drop, std::string& tooltip_msg);  	virtual void performAction(LLInventoryModel* model, std::string action);  	virtual void openItem(); @@ -255,7 +261,8 @@ public:  	virtual BOOL hasChildren() const;  	virtual BOOL dragOrDrop(MASK mask, BOOL drop,  							EDragAndDropType cargo_type, -							void* cargo_data); +							void* cargo_data, +							std::string& tooltip_msg);  	virtual BOOL isItemRemovable() const;  	virtual BOOL isItemMovable() const ; @@ -299,6 +306,8 @@ protected:  	void dropToFavorites(LLInventoryItem* inv_item);  	void dropToOutfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit); +	void dropToOutbox(LLInventoryItem* inv_item); +	void dropFolderToOutbox(LLInventoryCategory* inv_cat);  	//--------------------------------------------------------------------  	// Messy hacks for handling folder options @@ -378,7 +387,8 @@ public:  	virtual void buildContextMenu(LLMenuGL& menu, U32 flags);  	virtual BOOL dragOrDrop(MASK mask, BOOL drop,  							EDragAndDropType cargo_type, -							void* cargo_data); +							void* cargo_data, +							std::string& tooltip_msg);  	void refreshFolderViewItem();  protected:  	LLCallingCardObserver* mObserver; diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index d6278a5fda..516b47e616 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -256,16 +256,20 @@ std::string::size_type LLInventoryFilter::getStringMatchOffset() const  // has user modified default filter params?  BOOL LLInventoryFilter::isNotDefault() const  { -	return mFilterOps.mFilterObjectTypes != mDefaultFilterOps.mFilterObjectTypes  -		|| mFilterOps.mFilterCategoryTypes != mDefaultFilterOps.mFilterCategoryTypes  -		|| mFilterOps.mFilterWearableTypes != mDefaultFilterOps.mFilterWearableTypes  -		|| mFilterOps.mFilterTypes != FILTERTYPE_OBJECT -		|| mFilterOps.mFilterLinks != FILTERLINK_INCLUDE_LINKS -		|| mFilterSubString.size()  -		|| mFilterOps.mPermissions != mDefaultFilterOps.mPermissions -		|| mFilterOps.mMinDate != mDefaultFilterOps.mMinDate  -		|| mFilterOps.mMaxDate != mDefaultFilterOps.mMaxDate -		|| mFilterOps.mHoursAgo != mDefaultFilterOps.mHoursAgo; +	BOOL not_default = FALSE; + +	not_default |= (mFilterOps.mFilterObjectTypes != mDefaultFilterOps.mFilterObjectTypes); +	not_default |= (mFilterOps.mFilterCategoryTypes != mDefaultFilterOps.mFilterCategoryTypes); +	not_default |= (mFilterOps.mFilterWearableTypes != mDefaultFilterOps.mFilterWearableTypes); +	not_default |= (mFilterOps.mFilterTypes != mDefaultFilterOps.mFilterTypes); +	not_default |= (mFilterOps.mFilterLinks != mDefaultFilterOps.mFilterLinks); +	not_default |= (mFilterSubString.size()); +	not_default |= (mFilterOps.mPermissions != mDefaultFilterOps.mPermissions); +	not_default |= (mFilterOps.mMinDate != mDefaultFilterOps.mMinDate); +	not_default |= (mFilterOps.mMaxDate != mDefaultFilterOps.mMaxDate); +	not_default |= (mFilterOps.mHoursAgo != mDefaultFilterOps.mHoursAgo); + +	return not_default;  }  BOOL LLInventoryFilter::isActive() const diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index db3b968730..5fb3f15cd5 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -47,6 +47,7 @@  #include "llappviewer.h"  //#include "llfirstuse.h"  #include "llfloaterinventory.h" +#include "llfloatersidepanelcontainer.h"  #include "llfocusmgr.h"  #include "llfolderview.h"  #include "llgesturemgr.h" @@ -58,6 +59,7 @@  #include "llinventorypanel.h"  #include "lllineeditor.h"  #include "llmenugl.h" +#include "llnotificationsutil.h"  #include "llpanelmaininventory.h"  #include "llpreviewanim.h"  #include "llpreviewgesture.h" @@ -69,7 +71,6 @@  #include "llscrollbar.h"  #include "llscrollcontainer.h"  #include "llselectmgr.h" -#include "llsidetray.h"  #include "llsidepanelinventory.h"  #include "lltabcontainer.h"  #include "lltooldraganddrop.h" @@ -210,6 +211,58 @@ void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::s  	model->notifyObservers();  } +class LLInventoryCollectAllItems : public LLInventoryCollectFunctor +{ +public: +	virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) +	{ +		return true; +	} +}; + +BOOL get_is_parent_to_worn_item(const LLUUID& id) +{ +	const LLViewerInventoryCategory* cat = gInventory.getCategory(id); +	if (!cat) +	{ +		return FALSE; +	} + +	LLInventoryModel::cat_array_t cats; +	LLInventoryModel::item_array_t items; +	LLInventoryCollectAllItems collect_all; +	gInventory.collectDescendentsIf(LLAppearanceMgr::instance().getCOF(), cats, items, LLInventoryModel::EXCLUDE_TRASH, collect_all); + +	for (LLInventoryModel::item_array_t::const_iterator it = items.begin(); it != items.end(); ++it) +	{ +		const LLViewerInventoryItem * const item = *it; + +		llassert(item->getIsLinkType()); + +		LLUUID linked_id = item->getLinkedUUID(); +		const LLViewerInventoryItem * const linked_item = gInventory.getItem(linked_id); + +		if (linked_item) +		{ +			LLUUID parent_id = linked_item->getParentUUID(); + +			while (!parent_id.isNull()) +			{ +				LLInventoryCategory * parent_cat = gInventory.getCategory(parent_id); + +				if (cat == parent_cat) +				{ +					return TRUE; +				} + +				parent_id = parent_cat->getParentUUID(); +			} +		} +	} + +	return FALSE; +} +  BOOL get_is_item_worn(const LLUUID& id)  {  	const LLViewerInventoryItem* item = gInventory.getItem(id); @@ -406,22 +459,28 @@ BOOL get_is_category_renameable(const LLInventoryModel* model, const LLUUID& id)  void show_task_item_profile(const LLUUID& item_uuid, const LLUUID& object_id)  { -	LLSideTray::getInstance()->showPanel("sidepanel_inventory", LLSD().with("id", item_uuid).with("object", object_id)); +	LLFloaterSidePanelContainer::showPanel("inventory", LLSD().with("id", item_uuid).with("object", object_id));  }  void show_item_profile(const LLUUID& item_uuid)  {  	LLUUID linked_uuid = gInventory.getLinkedItemID(item_uuid); -	LLSideTray::getInstance()->showPanel("sidepanel_inventory", LLSD().with("id", linked_uuid)); +	LLFloaterSidePanelContainer::showPanel("inventory", LLSD().with("id", linked_uuid));  }  void show_item_original(const LLUUID& item_uuid)  { +	LLFloater* floater_inventory = LLFloaterReg::getInstance("inventory"); +	if (!floater_inventory) +	{ +		llwarns << "Could not find My Inventory floater" << llendl; +		return; +	} +  	//sidetray inventory panel -	LLSidepanelInventory *sidepanel_inventory = -		dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory")); +	LLSidepanelInventory *sidepanel_inventory =	LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory"); -	bool reset_inventory_filter = !LLSideTray::getInstance()->isPanelActive("sidepanel_inventory"); +	bool reset_inventory_filter = !floater_inventory->isInVisibleChain();  	LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel();  	if (!active_panel)  @@ -471,6 +530,133 @@ void show_item_original(const LLUUID& item_uuid)  	}  } +void move_to_outbox_cb(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +	if (option != 0) return; // canceled + +	LLViewerInventoryItem * viitem = gInventory.getItem(notification["payload"]["item_id"].asUUID()); +	LLUUID dest_folder_id = notification["payload"]["dest_folder_id"].asUUID(); + +	if (viitem) +	{	 +		// when moving item directly into outbox create folder with that name +		if (dest_folder_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false)) +		{ +			dest_folder_id = gInventory.createNewCategory(dest_folder_id,  LLFolderType::FT_NONE, viitem->getName()); +			gInventory.notifyObservers(); +		} + +		LLUUID parent = viitem->getParentUUID(); + +		change_item_parent( +			&gInventory, +			viitem, +			dest_folder_id, +			false); + +		LLUUID top_level_folder = notification["payload"]["top_level_folder"].asUUID(); + +		if (top_level_folder != LLUUID::null) +		{ +			LLViewerInventoryCategory* category; +			 +			while (parent.notNull()) +			{ +				LLInventoryModel::cat_array_t* cat_array; +				LLInventoryModel::item_array_t* item_array; +				gInventory.getDirectDescendentsOf(parent,cat_array,item_array); + +				LLUUID next_parent; + +				category = gInventory.getCategory(parent); + +				if (!category) break; + +				next_parent = category->getParentUUID(); + +				if (cat_array->empty() && item_array->empty()) +				{ +					remove_category(&gInventory, parent); +				} + +				if (parent == top_level_folder) +				{ +					break; +				} + +				parent = next_parent; +			} +		} + +	} +} + + +void copy_item_to_outbox(LLInventoryItem* inv_item, LLUUID dest_folder, const LLUUID& top_level_folder) +{ +	if (inv_item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID())) +	{ +		// when moving item directly into outbox create folder with that name +		if (dest_folder == gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false)) +		{ +			dest_folder = gInventory.createNewCategory(dest_folder, LLFolderType::FT_NONE, inv_item->getName()); +			gInventory.notifyObservers(); +		} + +		copy_inventory_item( +			gAgent.getID(), +			inv_item->getPermissions().getOwner(), +			inv_item->getUUID(), +			dest_folder, +			inv_item->getName(), +			LLPointer<LLInventoryCallback>(NULL)); +	} +	else +	{	 +		LLSD args; +		args["ITEM_NAME"] = inv_item->getName(); +		LLSD payload; +		payload["item_id"] = inv_item->getUUID(); +		payload["dest_folder_id"] = dest_folder; +		payload["top_level_folder"] = top_level_folder; +		LLNotificationsUtil::add("ConfirmNoCopyToOutbox", args, payload, boost::bind(&move_to_outbox_cb, _1, _2)); +	} +} + +void copy_folder_to_outbox(LLInventoryCategory* inv_cat, const LLUUID& dest_folder, const LLUUID& top_level_folder) +{ +	LLUUID new_folder_id = gInventory.createNewCategory(dest_folder, LLFolderType::FT_NONE, inv_cat->getName()); +	gInventory.notifyObservers(); + +	LLInventoryModel::cat_array_t* cat_array; +	LLInventoryModel::item_array_t* item_array; +	gInventory.getDirectDescendentsOf(inv_cat->getUUID(),cat_array,item_array); + +	// copy the vector because otherwise the iterator won't be happy if we delete from it +	LLInventoryModel::item_array_t item_array_copy = *item_array; + +	for (LLInventoryModel::item_array_t::iterator iter = item_array_copy.begin(); iter != item_array_copy.end(); iter++) +	{ +		LLInventoryItem* item = *iter; +		copy_item_to_outbox(item, new_folder_id, top_level_folder); +	} + +	LLInventoryModel::cat_array_t cat_array_copy = *cat_array; + +	for (LLInventoryModel::cat_array_t::iterator iter = cat_array_copy.begin(); iter != cat_array_copy.end(); iter++) +	{ +		LLViewerInventoryCategory* category = *iter; +		copy_folder_to_outbox(category, new_folder_id, top_level_folder); +	} + +	// delete the folder if we have emptied it +	//if (cat_array->empty() && item_array->empty()) +	//{ +	//	remove_category(inventory_model, inv_cat->getUUID()); +	//} +} +  ///----------------------------------------------------------------------------  /// LLInventoryCollectFunctor implementations  ///---------------------------------------------------------------------------- diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index 2016b92666..7b452537f8 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -37,6 +37,9 @@   **                    MISCELLANEOUS GLOBAL FUNCTIONS   **/ +// Is this a parent folder to a worn item +BOOL get_is_parent_to_worn_item(const LLUUID& id); +  // Is this item or its baseitem is worn, attached, etc...  BOOL get_is_item_worn(const LLUUID& id); @@ -71,6 +74,10 @@ void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::s  // Generates a string containing the path to the item specified by item_id.  void append_path(const LLUUID& id, std::string& path); +void copy_item_to_outbox(LLInventoryItem* inv_item, LLUUID dest_folder, const LLUUID& top_level_folder); + +void copy_folder_to_outbox(LLInventoryCategory* inv_cat, const LLUUID& dest_folder, const LLUUID& top_level_folder); +  /**                    Miscellaneous global functions   **                                                                            **   *******************************************************************************/ diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 21d5de9a5b..e86c427ae2 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -2168,6 +2168,9 @@ void LLInventoryModel::registerCallbacks(LLMessageSystem* msg)  	msg->setHandlerFuncFast(_PREHASH_RemoveInventoryFolder,  						processRemoveInventoryFolder,  						NULL); +	msg->setHandlerFuncFast(_PREHASH_RemoveInventoryObjects, +							processRemoveInventoryObjects, +							NULL);	  	//msg->setHandlerFuncFast(_PREHASH_ExchangeCallingCard,  	//						processExchangeCallingcard,  	//						NULL); @@ -2284,26 +2287,21 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account)  }  // 	static -void LLInventoryModel::processRemoveInventoryItem(LLMessageSystem* msg, void**) +void LLInventoryModel::removeInventoryItem(LLUUID agent_id, LLMessageSystem* msg, const char* msg_label)  { -	lldebugs << "LLInventoryModel::processRemoveInventoryItem()" << llendl; -	LLUUID agent_id, item_id; -	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); -	if(agent_id != gAgent.getID()) -	{ -		llwarns << "Got a RemoveInventoryItem for the wrong agent." -				<< llendl; -		return; -	} -	S32 count = msg->getNumberOfBlocksFast(_PREHASH_InventoryData); +	LLUUID item_id; +	S32 count = msg->getNumberOfBlocksFast(msg_label); +	lldebugs << "Message has " << count << " item blocks" << llendl;  	uuid_vec_t item_ids;  	update_map_t update;  	for(S32 i = 0; i < count; ++i)  	{ -		msg->getUUIDFast(_PREHASH_InventoryData, _PREHASH_ItemID, item_id, i); +		msg->getUUIDFast(msg_label, _PREHASH_ItemID, item_id, i); +		lldebugs << "Checking for item-to-be-removed " << item_id << llendl;  		LLViewerInventoryItem* itemp = gInventory.getItem(item_id);  		if(itemp)  		{ +		lldebugs << "Item will be removed " << item_id << llendl;  			// we only bother with the delete and account if we found  			// the item - this is usually a back-up for permissions,  			// so frequently the item will already be gone. @@ -2314,8 +2312,24 @@ void LLInventoryModel::processRemoveInventoryItem(LLMessageSystem* msg, void**)  	gInventory.accountForUpdate(update);  	for(uuid_vec_t::iterator it = item_ids.begin(); it != item_ids.end(); ++it)  	{ +		lldebugs << "Calling deleteObject " << *it << llendl;  		gInventory.deleteObject(*it);  	} +} + +// 	static +void LLInventoryModel::processRemoveInventoryItem(LLMessageSystem* msg, void**) +{ +	lldebugs << "LLInventoryModel::processRemoveInventoryItem()" << llendl; +	LLUUID agent_id, item_id; +	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); +	if(agent_id != gAgent.getID()) +	{ +		llwarns << "Got a RemoveInventoryItem for the wrong agent." +				<< llendl; +		return; +	} +	LLInventoryModel::removeInventoryItem(agent_id, msg, _PREHASH_InventoryData);  	gInventory.notifyObservers();  } @@ -2380,18 +2394,10 @@ void LLInventoryModel::processUpdateInventoryFolder(LLMessageSystem* msg,  }  // 	static -void LLInventoryModel::processRemoveInventoryFolder(LLMessageSystem* msg, -													void**) +void LLInventoryModel::removeInventoryFolder(LLUUID agent_id, +											 LLMessageSystem* msg)  { -	lldebugs << "LLInventoryModel::processRemoveInventoryFolder()" << llendl; -	LLUUID agent_id, folder_id; -	msg->getUUIDFast(_PREHASH_FolderData, _PREHASH_AgentID, agent_id); -	if(agent_id != gAgent.getID()) -	{ -		llwarns << "Got a RemoveInventoryFolder for the wrong agent." -				<< llendl; -		return; -	} +	LLUUID folder_id;  	uuid_vec_t folder_ids;  	update_map_t update;  	S32 count = msg->getNumberOfBlocksFast(_PREHASH_FolderData); @@ -2410,6 +2416,42 @@ void LLInventoryModel::processRemoveInventoryFolder(LLMessageSystem* msg,  	{  		gInventory.deleteObject(*it);  	} +} + +// 	static +void LLInventoryModel::processRemoveInventoryFolder(LLMessageSystem* msg, +													void**) +{ +	lldebugs << "LLInventoryModel::processRemoveInventoryFolder()" << llendl; +	LLUUID agent_id, session_id; +	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); +	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_SessionID, session_id); +	if(agent_id != gAgent.getID()) +	{ +		llwarns << "Got a RemoveInventoryFolder for the wrong agent." +		<< llendl; +		return; +	} +	LLInventoryModel::removeInventoryFolder( agent_id, msg ); +	gInventory.notifyObservers(); +} + +// 	static +void LLInventoryModel::processRemoveInventoryObjects(LLMessageSystem* msg, +													void**) +{ +	lldebugs << "LLInventoryModel::processRemoveInventoryObjects()" << llendl; +	LLUUID agent_id, session_id; +	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); +	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_SessionID, session_id); +	if(agent_id != gAgent.getID()) +	{ +		llwarns << "Got a RemoveInventoryObjects for the wrong agent." +		<< llendl; +		return; +	} +	LLInventoryModel::removeInventoryFolder( agent_id, msg ); +	LLInventoryModel::removeInventoryItem( agent_id, msg, _PREHASH_ItemData );  	gInventory.notifyObservers();  } diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index 15da09990f..e0e81f1006 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -492,9 +492,12 @@ protected:  	//--------------------------------------------------------------------  public:  	static void processUpdateCreateInventoryItem(LLMessageSystem* msg, void**); +	static void removeInventoryItem(LLUUID agent_id, LLMessageSystem* msg, const char* msg_label);  	static void processRemoveInventoryItem(LLMessageSystem* msg, void**);  	static void processUpdateInventoryFolder(LLMessageSystem* msg, void**); +	static void removeInventoryFolder(LLUUID agent_id, LLMessageSystem* msg);  	static void processRemoveInventoryFolder(LLMessageSystem* msg, void**); +	static void processRemoveInventoryObjects(LLMessageSystem* msg, void**);  	static void processSaveAssetIntoInventory(LLMessageSystem* msg, void**);  	static void processBulkUpdateInventory(LLMessageSystem* msg, void**);  	static void processInventoryDescendents(LLMessageSystem* msg, void**); diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index afaf660cb7..91fdd67806 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -105,7 +105,7 @@ BOOL LLInventoryModelBackgroundFetch::backgroundFetchActive() const  void LLInventoryModelBackgroundFetch::start(const LLUUID& cat_id, BOOL recursive)  { -	if (!mAllFoldersFetched) +	if (!mAllFoldersFetched || cat_id.notNull())  	{  		LL_DEBUGS("InventoryFetch") << "Start fetching category: " << cat_id << ", recursive: " << recursive << LL_ENDL; @@ -211,7 +211,7 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()  			// Double timeouts on failure.  			mMinTimeBetweenFetches = llmin(mMinTimeBetweenFetches * 2.f, 10.f);  			mMaxTimeBetweenFetches = llmin(mMaxTimeBetweenFetches * 2.f, 120.f); -			llinfos << "Inventory fetch times grown to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl; +			lldebugs << "Inventory fetch times grown to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl;  			// fetch is no longer considered "timely" although we will wait for full time-out.  			mTimelyFetchPending = FALSE;  		} @@ -280,7 +280,7 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()  					// Shrink timeouts based on success.  					mMinTimeBetweenFetches = llmax(mMinTimeBetweenFetches * 0.8f, 0.3f);  					mMaxTimeBetweenFetches = llmax(mMaxTimeBetweenFetches * 0.8f, 10.f); -					//llinfos << "Inventory fetch times shrunk to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl; +					lldebugs << "Inventory fetch times shrunk to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl;  				}  				mTimelyFetchPending = FALSE; diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index ceba4a0191..9db175ec2e 100644 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -202,6 +202,7 @@ void LLInventoryFetchItemsObserver::changed(U32 mask)  void fetch_items_from_llsd(const LLSD& items_llsd)  {  	if (!items_llsd.size() || gDisconnected) return; +  	LLSD body;  	body[0]["cap_name"] = "FetchInventory2";  	body[1]["cap_name"] = "FetchLib2"; @@ -212,7 +213,7 @@ void fetch_items_from_llsd(const LLSD& items_llsd)  			body[0]["items"].append(items_llsd[i]);  			continue;  		} -		if (items_llsd[i]["owner_id"].asString() == ALEXANDRIA_LINDEN_ID.asString()) +		else if (items_llsd[i]["owner_id"].asString() == ALEXANDRIA_LINDEN_ID.asString())  		{  			body[1]["items"].append(items_llsd[i]);  			continue; @@ -221,19 +222,23 @@ void fetch_items_from_llsd(const LLSD& items_llsd)  	for (S32 i=0; i<body.size(); i++)  	{ -		if(!gAgent.getRegion()) +		if (!gAgent.getRegion())  		{ -			llwarns<<"Agent's region is null"<<llendl; +			llwarns << "Agent's region is null" << llendl;  			break;  		} -		if (0 >= body[i].size()) continue; -		std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString()); +		if (0 == body[i]["items"].size()) { +			lldebugs << "Skipping body with no items to fetch" << llendl; +			continue; +		} + +		std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString());  		if (!url.empty())  		{  			body[i]["agent_id"]	= gAgent.getID();  			LLHTTPClient::post(url, body[i], new LLInventoryModel::fetchInventoryResponder(body[i])); -			break; +			continue;  		}  		LLMessageSystem* msg = gMessageSystem; @@ -303,7 +308,7 @@ void LLInventoryFetchItemsObserver::startFetch()  		// It's incomplete, so put it on the incomplete container, and  		// pack this on the message.  		mIncomplete.push_back(*it); -		 +  		// Prepare the data to fetch  		LLSD item_entry;  		item_entry["owner_id"] = owner_id; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 702e8d5a1f..18c3f76826 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -35,6 +35,7 @@  #include "llavataractions.h"  #include "llfloaterinventory.h"  #include "llfloaterreg.h" +#include "llfloatersidepanelcontainer.h"  #include "llfolderview.h"  #include "llimfloater.h"  #include "llimview.h" @@ -42,7 +43,6 @@  #include "llinventoryfunctions.h"  #include "llinventorymodelbackgroundfetch.h"  #include "llsidepanelinventory.h" -#include "llsidetray.h"  #include "llviewerattachmenu.h"  #include "llviewerfoldertype.h"  #include "llvoavatarself.h" @@ -129,6 +129,7 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :  	mScroller(NULL),  	mSortOrderSetting(p.sort_order_setting),  	mInventory(p.inventory), +	mAcceptsDragAndDrop(p.accepts_drag_and_drop),  	mAllowMultiSelect(p.allow_multi_select),  	mShowItemLinkOverlays(p.show_item_link_overlays),  	mShowLoadStatus(p.show_load_status), @@ -163,49 +164,6 @@ void LLInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params)  	{  		root_id = gInventory.getLibraryRootFolderID();  	} -	// leslie -- temporary HACK to work around sim not creating inbox and outbox with proper system folder type -	else if (preferred_type == LLFolderType::FT_INBOX) -	{ -		LLInventoryModel::cat_array_t* cats; -		LLInventoryModel::item_array_t* items; -		 -		gInventory.getDirectDescendentsOf(gInventory.getRootFolderID(), cats, items); -		 -		if (cats) -		{ -			for (LLInventoryModel::cat_array_t::const_iterator cat_it = cats->begin(); cat_it != cats->end(); ++cat_it) -			{ -				LLInventoryCategory* cat = *cat_it; -				 -				if (cat->getName() == "Received Items") -				{ -					root_id = cat->getUUID(); -				} -			} -		} -	} -	// leslie -- temporary HACK to work around sim not creating inbox and outbox with proper system folder type -	else if (preferred_type == LLFolderType::FT_OUTBOX) -	{ -		LLInventoryModel::cat_array_t* cats; -		LLInventoryModel::item_array_t* items; -		 -		gInventory.getDirectDescendentsOf(gInventory.getRootFolderID(), cats, items); -		 -		if (cats) -		{ -			for (LLInventoryModel::cat_array_t::const_iterator cat_it = cats->begin(); cat_it != cats->end(); ++cat_it) -			{ -				LLInventoryCategory* cat = *cat_it; -				 -				if (cat->getName() == "Merchant Outbox") -				{ -					root_id = cat->getUUID(); -				} -			} -		} -	} -	// leslie -- end temporary HACK  	else  	{  		root_id = (preferred_type != LLFolderType::FT_NONE) @@ -277,10 +235,10 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)  	{  		setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER));  	} -	mFolderRoot->setSortOrder(getFilter()->getSortOrder());  	// hide inbox  	getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_INBOX)); +	getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_OUTBOX));  	// Initialize base class params.  	LLPanel::initFromParams(params); @@ -389,6 +347,10 @@ U32 LLInventoryPanel::getSortOrder() const  	return mFolderRoot->getSortOrder();   } +void LLInventoryPanel::requestSort() +{ +	mFolderRoot->requestSort(); +}  void LLInventoryPanel::setSinceLogoff(BOOL sl)  { @@ -812,9 +774,7 @@ void LLInventoryPanel::openStartFolderOrMyInventory()  			&& fchild->getListener()  				&& fchild->getListener()->getUUID() == gInventory.getRootFolderID())  		{ -			const std::string& child_name = child->getName(); -			mFolderRoot->openFolder(child_name); -			mFolderRoot->clearSelection();	// No need to keep it selected though! +			fchild->setOpen(TRUE);  			break;  		}  	} @@ -865,19 +825,24 @@ BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  								   EAcceptance* accept,  								   std::string& tooltip_msg)  { -	BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); +	BOOL handled = FALSE; -	// If folder view is empty the (x, y) point won't be in its rect -	// so the handler must be called explicitly. -	// but only if was not handled before. See EXT-6746. -	if (!handled && !mFolderRoot->hasVisibleChildren()) +	if (mAcceptsDragAndDrop)  	{ -		handled = mFolderRoot->handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); -	} +		handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); -	if (handled) -	{ -		mFolderRoot->setDragAndDropThisFrame(); +		// If folder view is empty the (x, y) point won't be in its rect +		// so the handler must be called explicitly. +		// but only if was not handled before. See EXT-6746. +		if (!handled && !mFolderRoot->hasVisibleChildren()) +		{ +			handled = mFolderRoot->handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); +		} + +		if (handled) +		{ +			mFolderRoot->setDragAndDropThisFrame(); +		}  	}  	return handled; @@ -902,6 +867,18 @@ void LLInventoryPanel::onFocusReceived()  	LLPanel::onFocusReceived();  } +bool LLInventoryPanel::addBadge(LLBadge * badge) +{ +	bool badge_added = false; + +	if (acceptsBadge()) +	{ +		badge_added = badge->addToView(mFolderRoot); +	} + +	return badge_added; +} +  void LLInventoryPanel::openAllFolders()  {  	mFolderRoot->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); @@ -1100,10 +1077,9 @@ void LLInventoryPanel::dumpSelectionInformation(void* user_data)  BOOL is_inventorysp_active()  { -	if (!LLSideTray::getInstance()->isPanelActive("sidepanel_inventory")) return FALSE; -	LLSidepanelInventory *inventorySP = dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory")); -	if (!inventorySP) return FALSE;  -	return inventorySP->isMainInventoryPanelActive(); +	LLSidepanelInventory *sidepanel_inventory =	LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory"); +	if (!sidepanel_inventory || !sidepanel_inventory->isInVisibleChain()) return FALSE; +	return sidepanel_inventory->isMainInventoryPanelActive();  }  // static @@ -1113,34 +1089,24 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)  	LLInventoryPanel* res = NULL;  	LLFloater* active_inv_floaterp = NULL; -	// A. If the inventory side panel is open, use that preferably. -	if (is_inventorysp_active()) +	LLFloater* floater_inventory = LLFloaterReg::getInstance("inventory"); +	if (!floater_inventory)  	{ -		LLSidepanelInventory *inventorySP = dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory")); -		if (inventorySP) -		{ -			return inventorySP->getActivePanel(); -		} +		llwarns << "Could not find My Inventory floater" << llendl; +		return FALSE;  	} -	// or if it is in floater undocked from sidetray get it and remember z order of floater to later compare it -	// with other inventory floaters order. -	else if (!LLSideTray::getInstance()->isTabAttached("sidebar_inventory")) + +	LLSidepanelInventory *sidepanel_inventory =	LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory"); + +	// A. If the inventory side panel floater is open, use that preferably. +	if (is_inventorysp_active())  	{ -		LLSidepanelInventory *inventorySP = -			dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory")); -		LLFloater* inv_floater = LLFloaterReg::findInstance("side_bar_tab", LLSD("sidebar_inventory")); -		if (inventorySP && inv_floater) -		{ -			res = inventorySP->getActivePanel(); -			z_min = gFloaterView->getZOrder(inv_floater); -			active_inv_floaterp = inv_floater; -		} -		else -		{ -			llwarns << "Inventory tab is detached from sidetray, but  either panel or floater were not found!" << llendl; -		} +		// Get the floater's z order to compare it to other inventory floaters' order later. +		res = sidepanel_inventory->getActivePanel(); +		z_min = gFloaterView->getZOrder(floater_inventory); +		active_inv_floaterp = floater_inventory;  	} -	 +  	// B. Iterate through the inventory floaters and return whichever is on top.  	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");  	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) @@ -1170,14 +1136,9 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)  	// C. If no panels are open and we don't want to force open a panel, then just abort out.  	if (!auto_open) return NULL; -	// D. Open the inventory side panel and use that. -    LLSD key; -	LLSidepanelInventory *sidepanel_inventory = -		dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->showPanel("sidepanel_inventory", key)); -	if (sidepanel_inventory) -	{ -		return sidepanel_inventory->getActivePanel(); -	} +	// D. Open the inventory side panel floater and use that. +	floater_inventory->openFloater(); +	return sidepanel_inventory->getActivePanel();  	return NULL;  } diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index a4287a438e..8635ebc5c8 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -86,6 +86,7 @@ public:  		Optional<bool>						use_label_suffix;  		Optional<bool>						show_load_status;  		Optional<LLScrollContainer::Params>	scroll; +		Optional<bool>						accepts_drag_and_drop;  		Params()  		:	sort_order_setting("sort_order_setting"), @@ -96,7 +97,8 @@ public:  			start_folder("start_folder"),  			use_label_suffix("use_label_suffix", true),  			show_load_status("show_load_status"), -			scroll("scroll") +			scroll("scroll"), +			accepts_drag_and_drop("accepts_drag_and_drop")  		{}  	}; @@ -125,6 +127,9 @@ public:  	 /*virtual*/ void onFocusLost();  	 /*virtual*/ void onFocusReceived(); +	// LLBadgeHolder methods +	bool addBadge(LLBadge * badge); +  	// Call this method to set the selection.  	void openAllFolders();  	void setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus); @@ -178,6 +183,7 @@ protected:  	LLInventoryModel*			mInventory;  	LLInventoryObserver*		mInventoryObserver;  	LLInvPanelComplObserver*	mCompletionObserver; +	BOOL						mAcceptsDragAndDrop;  	BOOL 						mAllowMultiSelect;  	BOOL 						mShowItemLinkOverlays; // Shows link graphic over inventory item icons  	BOOL						mShowLoadStatus; @@ -205,6 +211,8 @@ public:  	void setSortOrder(U32 order);  	U32 getSortOrder() const; +	void requestSort(); +  private:  	std::string					mSortOrderSetting; diff --git a/indra/newview/lljoystickbutton.h b/indra/newview/lljoystickbutton.h index 93e2e7128b..8d76aa9531 100644 --- a/indra/newview/lljoystickbutton.h +++ b/indra/newview/lljoystickbutton.h @@ -57,7 +57,7 @@ public:  		Params()  		:	quadrant("quadrant", JQ_ORIGIN)  		{ -			label = ""; +			changeDefault(label, "");  		}  	};  	LLJoystick(const Params&); @@ -137,7 +137,7 @@ public:  	{  		Params()  		{ -			held_down_delay.seconds(0.0); +			changeDefault(held_down_delay.seconds, 0.0);  		}  	}; diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp index f2aec20611..6625a194fb 100644 --- a/indra/newview/lllandmarkactions.cpp +++ b/indra/newview/lllandmarkactions.cpp @@ -413,7 +413,7 @@ void LLLandmarkActions::copySLURLtoClipboard(const LLUUID& landmarkInventoryItem  void copy_slurl_to_clipboard_callback(const std::string& slurl)  { -	gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(slurl)); +	gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(slurl));  	LLSD args;  	args["SLURL"] = slurl;  	LLNotificationsUtil::add("CopySLURL", args); diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 1c8f6b6c98..025181ead5 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -44,11 +44,11 @@  // newview includes  #include "llagent.h" +#include "llfloatersidepanelcontainer.h"  #include "llinventoryobserver.h"  #include "lllandmarkactions.h"  #include "lllandmarklist.h"  #include "llteleporthistory.h" -#include "llsidetray.h"  #include "llslurl.h"  #include "llstatusbar.h"			// getHealth()  #include "lltrans.h" @@ -600,7 +600,7 @@ void LLLocationInputCtrl::reshape(S32 width, S32 height, BOOL called_from_parent  void LLLocationInputCtrl::onInfoButtonClicked()  { -	LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent")); +	LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "agent"));  }  void LLLocationInputCtrl::onForSaleButtonClicked() @@ -618,11 +618,11 @@ void LLLocationInputCtrl::onAddLandmarkButtonClicked()  		key["type"] = "landmark";  		key["id"] = landmark->getUUID(); -		LLSideTray::getInstance()->showPanel("panel_places", key); +		LLFloaterSidePanelContainer::showPanel("places", key);  	}  	else  	{ -		LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark")); +		LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));  	}  } @@ -1087,12 +1087,12 @@ void LLLocationInputCtrl::onLocationContextMenuItemClicked(const LLSD& userdata)  		if(!landmark)  		{ -			LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark")); +			LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));  		}  		else  		{ -			LLSideTray::getInstance()->showPanel("panel_places",  -					LLSD().with("type", "landmark").with("id",landmark->getUUID())); +			LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "landmark").with("id",landmark->getUUID())); +  		}  	}  	else if (item == "cut") diff --git a/indra/newview/llloginhandler.cpp b/indra/newview/llloginhandler.cpp index 48be251611..9b4f146332 100644 --- a/indra/newview/llloginhandler.cpp +++ b/indra/newview/llloginhandler.cpp @@ -30,13 +30,13 @@  // viewer includes  #include "llsecapi.h" -#include "lllogininstance.h"        // to check if logged in yet -#include "llpanellogin.h"			// save_password_to_disk() +#include "lllogininstance.h"		// to check if logged in yet +#include "llpanellogin.h"  #include "llstartup.h"				// getStartupState()  #include "llslurl.h"  #include "llviewercontrol.h"		// gSavedSettings  #include "llviewernetwork.h"		// EGridInfo -#include "llviewerwindow.h"                    // getWindow() +#include "llviewerwindow.h"			// getWindow()  // library includes  #include "llmd5.h" diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 00de6a86e1..419641d23c 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -561,14 +561,7 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia  	//send this info to login.cgi for stats gathering   	//since viewerstats isn't reliable enough -	if (gSavedSettings.getString("SessionSettingsFile").empty()) -	{ -		requested_options.append("advanced-mode"); -	} -	else -	{ -		requested_options.append("basic-mode"); -	} +	requested_options.append("advanced-mode");  #endif  	requested_options.append("max-agent-groups");	 diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 03ccabc994..1f1e49726d 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -79,7 +79,6 @@ LLMediaCtrl::Params::Params()  	trusted_content("trusted_content", false),  	focus_on_click("focus_on_click", true)  { -	tab_stop(false);  }  LLMediaCtrl::LLMediaCtrl( const Params& p) : @@ -319,6 +318,11 @@ BOOL LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask )  	if (mContextMenu)  	{ +		// hide/show debugging options +		bool media_plugin_debugging_enabled = gSavedSettings.getBOOL("MediaPluginDebugging"); +		mContextMenu->setItemVisible("open_webinspector", media_plugin_debugging_enabled ); +		mContextMenu->setItemVisible("debug_separator", media_plugin_debugging_enabled ); +  		mContextMenu->show(x, y);  		LLMenuGL::showPopup(this, mContextMenu, x, y);  	} @@ -385,12 +389,22 @@ void LLMediaCtrl::onFocusLost()  //  BOOL LLMediaCtrl::postBuild ()  { +	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registar; +	registar.add("Open.WebInspector", boost::bind(&LLMediaCtrl::onOpenWebInspector, this)); +  	mContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(  		"menu_media_ctrl.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());  	setVisibleCallback(boost::bind(&LLMediaCtrl::onVisibilityChange, this, _2)); +  	return TRUE;  } +void LLMediaCtrl::onOpenWebInspector() +{ +	if (mMediaSource && mMediaSource->hasMedia()) +		mMediaSource->getMediaPlugin()->showWebInspector( true ); +} +  ////////////////////////////////////////////////////////////////////////////////  //  BOOL LLMediaCtrl::handleKeyHere( KEY key, MASK mask ) @@ -1065,6 +1079,12 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)  			mHoverTextChanged = true;  		};  		break; + +		case MEDIA_EVENT_DEBUG_MESSAGE: +		{ +			LL_INFOS("media") << self->getDebugMessageText() << LL_ENDL;  +		}; +		break;  	};  	// chain all events to any potential observers of this object. @@ -1102,16 +1122,7 @@ void LLMediaCtrl::onPopup(const LLSD& notification, const LLSD& response)  			lldebugs << "No gFloaterView for onPopuup()" << llendl;  		}; -		// (for now) open web content floater if that's our parent, otherwise, open the current media floater -		// (this will change soon) -		if ( floater_name == "web_content" ) -		{ -			LLWeb::loadWebURL(notification["payload"]["url"], notification["payload"]["target"], notification["payload"]["uuid"]); -		} -		else -		{ -			LLWeb::loadURL(notification["payload"]["url"], notification["payload"]["target"], notification["payload"]["uuid"]); -		} +		LLWeb::loadURL(notification["payload"]["url"], notification["payload"]["target"], notification["payload"]["uuid"]);  	}  	else  	{ @@ -1164,3 +1175,12 @@ void LLMediaCtrl::hideNotification()  		mWindowShade->hide();  	}  } + +void LLMediaCtrl::setTrustedContent(bool trusted) +{ +	mTrusted = trusted; +	if (mMediaSource) +	{ +		mMediaSource->setTrustedBrowser(trusted); +	} +} diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 28666e620f..3c0436e27a 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -149,6 +149,8 @@ public:  		void showNotification(boost::shared_ptr<class LLNotification> notify);  		void hideNotification(); +		void setTrustedContent(bool trusted); +  		// over-rides  		virtual BOOL handleKeyHere( KEY key, MASK mask);  		virtual void handleVisibilityChange ( BOOL new_visibility ); @@ -164,6 +166,11 @@ public:  		// Incoming media event dispatcher  		virtual void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event); +		// right click debugging item +		void onOpenWebInspector(); + +		LLUUID getTextureID() {return mMediaTextureID;} +  	protected:  		void convertInputCoords(S32& x, S32& y); @@ -176,7 +183,7 @@ public:  		LLViewBorder* mBorder;  		bool mFrequentUpdates;  		bool mForceUpdate; -		const bool mTrusted; +		bool mTrusted;  		std::string mHomePageUrl;  		std::string mHomePageMimeType;  		std::string mCurrentNavUrl; diff --git a/indra/newview/llmemoryview.h b/indra/newview/llmemoryview.h index 9bdc59ab10..dc4849a9c4 100644 --- a/indra/newview/llmemoryview.h +++ b/indra/newview/llmemoryview.h @@ -38,8 +38,8 @@ public:  	{  		Params()  		{ -			mouse_opaque = true; -			visible = false; +			changeDefault(mouse_opaque, true); +			changeDefault(visible, false);  		}  	};  	LLMemoryView(const LLMemoryView::Params&); diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 6e0722bcf9..a97e256c89 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -34,9 +34,9 @@  #include "llagent.h"  #include "llappviewer.h"  #include "llbufferstream.h" +#include "llcallbacklist.h"  #include "llcurl.h"  #include "lldatapacker.h" -#include "llfasttimer.h"  #include "llfloatermodelpreview.h"  #include "llfloaterperms.h"  #include "lleconomy.h" @@ -49,6 +49,7 @@  #include "llthread.h"  #include "llvfile.h"  #include "llviewercontrol.h" +#include "llviewerinventory.h"  #include "llviewermenufile.h"  #include "llviewerobjectlist.h"  #include "llviewerregion.h" @@ -62,6 +63,7 @@  #include "llinventorymodel.h"  #include "llfoldertype.h"  #include "llviewerparcelmgr.h" +#include "lluploadfloaterobservers.h"  #include "boost/lexical_cast.hpp" @@ -71,13 +73,18 @@  #include <queue> -LLFastTimer::DeclareTimer FTM_MESH_UPDATE("Mesh Update"); -LLFastTimer::DeclareTimer FTM_LOAD_MESH("Load Mesh"); -  LLMeshRepository gMeshRepo;  const U32 MAX_MESH_REQUESTS_PER_SECOND = 100; +// Maximum mesh version to support.  Three least significant digits are reserved for the minor version,  +// with major version changes indicating a format change that is not backwards compatible and should not +// be parsed by viewers that don't specifically support that version. For example, if the integer "1" is  +// present, the version is 0.001. A viewer that can parse version 0.001 can also parse versions up to 0.999,  +// but not 1.0 (integer 1000). +// See wiki at https://wiki.secondlife.com/wiki/Mesh/Mesh_Asset_Format +const S32 MAX_MESH_VERSION = 999; +  U32 LLMeshRepository::sBytesReceived = 0;  U32 LLMeshRepository::sHTTPRequestCount = 0;  U32 LLMeshRepository::sHTTPRetryCount = 0; @@ -190,196 +197,6 @@ S32 LLMeshRepoThread::sActiveHeaderRequests = 0;  S32 LLMeshRepoThread::sActiveLODRequests = 0;  U32	LLMeshRepoThread::sMaxConcurrentRequests = 1; - -class LLTextureCostResponder : public LLCurl::Responder -{ -public: -	LLTextureUploadData mData; -	LLMeshUploadThread* mThread; - -	LLTextureCostResponder(LLTextureUploadData data, LLMeshUploadThread* thread)  -		: mData(data), mThread(thread) -	{ - -	} - -	virtual void completed(U32 status, const std::string& reason, const LLSD& content) -	{ -		mThread->mPendingConfirmations--; -		if (isGoodStatus(status)) -		{ -			mThread->priceResult(mData, content);	 -		} -		else -		{ -			llwarns << status << ": " << reason << llendl; - -			if (mData.mRetries < MAX_TEXTURE_UPLOAD_RETRIES) -			{ -				llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl; -			 -				if (status == 499 || status == 500) -				{ -					mThread->uploadTexture(mData); -				} -				else -				{ -					llerrs << "Unhandled status " << status << llendl; -				} -			} -			else -			{  -				llwarns << "Giving up after " << mData.mRetries << " retries." << llendl; -			} -		} -	} -}; - -class LLTextureUploadResponder : public LLCurl::Responder -{ -public: -	LLTextureUploadData mData; -	LLMeshUploadThread* mThread; - -	LLTextureUploadResponder(LLTextureUploadData data, LLMeshUploadThread* thread) -		: mData(data), mThread(thread) -	{ -	} - -	virtual void completed(U32 status, const std::string& reason, const LLSD& content) -	{ -		mThread->mPendingUploads--; -		if (isGoodStatus(status)) -		{ -			mData.mUUID = content["new_asset"].asUUID(); -			gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mData.mPostData, content)); -			mThread->onTextureUploaded(mData); -		} -		else -		{ -			llwarns << status << ": " << reason << llendl; -			llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl; - -			if (status == 404) -			{ -				mThread->uploadTexture(mData); -			} -			else if (status == 499) -			{ -				mThread->mConfirmedTextureQ.push(mData); -			} -			else -			{ -				llerrs << "Unhandled status " << status << llendl; -			} -		} -	} -}; - -class LLMeshCostResponder : public LLCurl::Responder -{ -public: -	LLMeshUploadData mData; -	LLMeshUploadThread* mThread; - -	LLMeshCostResponder(LLMeshUploadData data, LLMeshUploadThread* thread)  -		: mData(data), mThread(thread) -	{ - -	} - -	virtual void completed(U32 status, const std::string& reason, const LLSD& content) -	{ -		mThread->mPendingConfirmations--; - -		if (isGoodStatus(status)) -		{ -			mThread->priceResult(mData, content);	 -		} -		else -		{ -			llwarns << status << ": " << reason << llendl;			 -			 -			if (status == HTTP_INTERNAL_ERROR) -			{ -				llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl; -				mThread->uploadModel(mData); -			} -			else if (status == HTTP_BAD_REQUEST) -			{ -				llwarns << "Status 400 received from server, giving up." << llendl; -			} -			else if (status == HTTP_NOT_FOUND) -			{ -				llwarns <<"Status 404 received, server is disconnected, giving up." << llendl ; -			} -			else -			{ -				llerrs << "Unhandled status " << status << llendl; -			} -		} -	} -}; - -class LLMeshUploadResponder : public LLCurl::Responder -{ -public: -	LLMeshUploadData mData; -	LLMeshUploadThread* mThread; - -	LLMeshUploadResponder(LLMeshUploadData data, LLMeshUploadThread* thread) -		: mData(data), mThread(thread) -	{ -	} - -	virtual void completed(U32 status, const std::string& reason, const LLSD& content) -	{ -		mThread->mPendingUploads--; -		if (isGoodStatus(status)) -		{ -			mData.mUUID = content["new_asset"].asUUID(); -			if (mData.mUUID.isNull()) -			{ -				LLSD args; -				std::string message = content["error"]["message"]; -				std::string identifier = content["error"]["identifier"]; -				std::string invalidity_identifier = content["error"]["invalidity_identifier"]; - -				args["MESSAGE"] = message; -				args["IDENTIFIER"] = identifier; -				args["INVALIDITY_IDENTIFIER"] = invalidity_identifier; -				args["LABEL"] = mData.mBaseModel->mLabel; - -				gMeshRepo.uploadError(args); -			} -			else -			{ -				gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mData.mPostData, content)); -				mThread->onModelUploaded(mData); -			} -		} -		else -		{ -			llwarns << status << ": " << reason << llendl; -			llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl; - -			if (status == 404) -			{ -				mThread->uploadModel(mData); -			} -			else if (status == 499) -			{ -				mThread->mConfirmedQ.push(mData); -			} -			else if (status != 500) -			{ //drop internal server errors on the floor, otherwise grab -				llerrs << "Unhandled status " << status << llendl; -			} -		} -	} -}; - -  class LLMeshHeaderResponder : public LLCurl::Responder  {  public: @@ -518,38 +335,16 @@ void log_upload_error(S32 status, const LLSD& content, std::string stage, std::s  	}  } -class LLModelObjectUploadResponder: public LLCurl::Responder -{ -	LLSD mObjectAsset; -	LLMeshUploadThread* mThread; - -public: -	LLModelObjectUploadResponder(LLMeshUploadThread* thread, const LLSD& object_asset): -		mThread(thread), -		mObjectAsset(object_asset) -	{ -	} - -	virtual void completedRaw(U32 status, const std::string& reason, -							  const LLChannelDescriptors& channels, -							  const LLIOPipe::buffer_ptr_t& buffer) -	{ -		assert_main_thread(); -		 -		llinfos << "completed" << llendl; -		mThread->mPendingUploads--; -		mThread->mFinished = true; -	} -}; -  class LLWholeModelFeeResponder: public LLCurl::Responder  {  	LLMeshUploadThread* mThread;  	LLSD mModelData; +	LLHandle<LLWholeModelFeeObserver> mObserverHandle;  public: -	LLWholeModelFeeResponder(LLMeshUploadThread* thread, LLSD& model_data): +	LLWholeModelFeeResponder(LLMeshUploadThread* thread, LLSD& model_data, LLHandle<LLWholeModelFeeObserver> observer_handle):  		mThread(thread), -		mModelData(model_data) +		mModelData(model_data), +		mObserverHandle(observer_handle)  	{  	}  	virtual void completed(U32 status, @@ -562,20 +357,32 @@ public:  			cc = llsd_from_file("fake_upload_error.xml");  		} -		llinfos << "completed" << llendl;  		mThread->mPendingUploads--;  		dump_llsd_to_file(cc,make_dump_name("whole_model_fee_response_",dump_num)); + +		LLWholeModelFeeObserver* observer = mObserverHandle.get(); +  		if (isGoodStatus(status) &&  			cc["state"].asString() == "upload")  		{ -			llinfos << "fee request succeeded" << llendl; -			mThread->mWholeModelUploadURL = cc["uploader"].asString();  +			mThread->mWholeModelUploadURL = cc["uploader"].asString(); + +			if (observer) +			{ +				cc["data"]["upload_price"] = cc["upload_price"]; +				observer->onModelPhysicsFeeReceived(cc["data"], mThread->mWholeModelUploadURL); +			}  		}  		else  		{  			llwarns << "fee request failed" << llendl;  			log_upload_error(status,cc,"fee",mModelData["name"]);  			mThread->mWholeModelUploadURL = ""; + +			if (observer) +			{ +				observer->setModelPhysicsFeeErrorStatus(status, reason); +			}  		}  	} @@ -585,11 +392,13 @@ class LLWholeModelUploadResponder: public LLCurl::Responder  {  	LLMeshUploadThread* mThread;  	LLSD mModelData; +	LLHandle<LLWholeModelUploadObserver> mObserverHandle;  public: -	LLWholeModelUploadResponder(LLMeshUploadThread* thread, LLSD& model_data): +	LLWholeModelUploadResponder(LLMeshUploadThread* thread, LLSD& model_data, LLHandle<LLWholeModelUploadObserver> observer_handle):  		mThread(thread), -		mModelData(model_data) +		mModelData(model_data), +		mObserverHandle(observer_handle)  	{  	}  	virtual void completed(U32 status, @@ -602,30 +411,40 @@ public:  			cc = llsd_from_file("fake_upload_error.xml");  		} -		//assert_main_thread();  		mThread->mPendingUploads--;  		dump_llsd_to_file(cc,make_dump_name("whole_model_upload_response_",dump_num)); -		llinfos << "LLWholeModelUploadResponder content: " << cc << llendl; +		 +		LLWholeModelUploadObserver* observer = mObserverHandle.get(); +  		// requested "mesh" asset type isn't actually the type  		// of the resultant object, fix it up here.  		if (isGoodStatus(status) &&  			cc["state"].asString() == "complete")  		{ -			llinfos << "upload succeeded" << llendl;  			mModelData["asset_type"] = "object";  			gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mModelData,cc)); + +			if (observer) +			{ +				doOnIdleOneTime(boost::bind(&LLWholeModelUploadObserver::onModelUploadSuccess, observer)); +			}  		}  		else  		{  			llwarns << "upload failed" << llendl;  			std::string model_name = mModelData["name"].asString();  			log_upload_error(status,cc,"upload",model_name); + +			if (observer) +			{ +				doOnIdleOneTime(boost::bind(&LLWholeModelUploadObserver::onModelUploadFailure, observer)); +			}  		}  	}  };  LLMeshRepoThread::LLMeshRepoThread() -: LLThread("mesh repo", NULL)  +: LLThread("mesh repo")   {   	mWaiting = false;  	mMutex = new LLMutex(NULL); @@ -840,15 +659,16 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)  	}  	U32 header_size = mMeshHeaderSize[mesh_id]; - +	  	if (header_size > 0)  	{ +		S32 version = mMeshHeader[mesh_id]["version"].asInteger();  		S32 offset = header_size + mMeshHeader[mesh_id]["skin"]["offset"].asInteger();  		S32 size = mMeshHeader[mesh_id]["skin"]["size"].asInteger();  		mHeaderMutex->unlock(); -		if (offset >= 0 && size > 0) +		if (version <= MAX_MESH_VERSION && offset >= 0 && size > 0)  		{  			//check VFS for mesh skin info  			LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH); @@ -859,7 +679,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)  				U8* buffer = new U8[size];  				file.read(buffer, size); -				//make sure buffer isn't all 0's (reserved block but not written) +				//make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written)  				bool zero = true;  				for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)  				{ @@ -915,12 +735,13 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)  	if (header_size > 0)  	{ +		S32 version = mMeshHeader[mesh_id]["version"].asInteger();  		S32 offset = header_size + mMeshHeader[mesh_id]["physics_convex"]["offset"].asInteger();  		S32 size = mMeshHeader[mesh_id]["physics_convex"]["size"].asInteger();  		mHeaderMutex->unlock(); -		if (offset >= 0 && size > 0) +		if (version <= MAX_MESH_VERSION && offset >= 0 && size > 0)  		{  			//check VFS for mesh skin info  			LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH); @@ -931,7 +752,7 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)  				U8* buffer = new U8[size];  				file.read(buffer, size); -				//make sure buffer isn't all 0's (reserved block but not written) +				//make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written)  				bool zero = true;  				for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)  				{ @@ -987,12 +808,13 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)  	if (header_size > 0)  	{ +		S32 version = mMeshHeader[mesh_id]["version"].asInteger();  		S32 offset = header_size + mMeshHeader[mesh_id]["physics_mesh"]["offset"].asInteger();  		S32 size = mMeshHeader[mesh_id]["physics_mesh"]["size"].asInteger();  		mHeaderMutex->unlock(); -		if (offset >= 0 && size > 0) +		if (version <= MAX_MESH_VERSION && offset >= 0 && size > 0)  		{  			//check VFS for mesh physics shape info  			LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH); @@ -1003,7 +825,7 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)  				U8* buffer = new U8[size];  				file.read(buffer, size); -				//make sure buffer isn't all 0's (reserved block but not written) +				//make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written)  				bool zero = true;  				for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)  				{ @@ -1060,9 +882,9 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params)  		S32 size = file.getSize();  		if (size > 0) -		{ -			U8 buffer[1024]; -			S32 bytes = llmin(size, 1024); +		{ //NOTE -- if the header size is ever more than 4KB, this will break +			U8 buffer[4096]; +			S32 bytes = llmin(size, 4096);  			LLMeshRepository::sCacheBytesRead += bytes;	  			file.read(buffer, bytes);  			if (headerReceived(mesh_params, buffer, bytes)) @@ -1084,6 +906,7 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params)  		retval = true;  		//grab first 4KB if we're going to bother with a fetch.  Cache will prevent future fetches if a full mesh fits  		//within the first 4KB +		//NOTE -- this will break of headers ever exceed 4KB  		LLMeshRepository::sHTTPRequestCount++;  		mCurlRequest->getByteRange(http_url, headers, 0, 4096, new LLMeshHeaderResponder(mesh_params));  	} @@ -1103,10 +926,12 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)  	if (header_size > 0)  	{ +		S32 version = mMeshHeader[mesh_id]["version"].asInteger();  		S32 offset = header_size + mMeshHeader[mesh_id][header_lod[lod]]["offset"].asInteger();  		S32 size = mMeshHeader[mesh_id][header_lod[lod]]["size"].asInteger();  		mHeaderMutex->unlock(); -		if (offset >= 0 && size > 0) +				 +		if (version <= MAX_MESH_VERSION && offset >= 0 && size > 0)  		{  			//check VFS for mesh asset @@ -1118,7 +943,7 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)  				U8* buffer = new U8[size];  				file.read(buffer, size); -				//make sure buffer isn't all 0's (reserved block but not written) +				//make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written)  				bool zero = true;  				for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)  				{ @@ -1204,14 +1029,11 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat  	}  	{ -		U32 cost = gMeshRepo.calcResourceCost(header); -  		LLUUID mesh_id = mesh_params.getSculptID();  		mHeaderMutex->lock();  		mMeshHeaderSize[mesh_id] = header_size;  		mMeshHeader[mesh_id] = header; -		mMeshResourceCost[mesh_id] = cost;  		mHeaderMutex->unlock();  		//check for pending requests @@ -1363,9 +1185,14 @@ bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32  }  LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, LLVector3& scale, bool upload_textures, -										bool upload_skin, bool upload_joints) +										bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload, +					   LLHandle<LLWholeModelFeeObserver> fee_observer, LLHandle<LLWholeModelUploadObserver> upload_observer)  : LLThread("mesh upload"), -	mDiscarded(FALSE) +	mDiscarded(FALSE), +	mDoUpload(do_upload), +	mWholeModelUploadURL(upload_url), +	mFeeObserverHandle(fee_observer), +	mUploadObserverHandle(upload_observer)  {  	mInstanceList = data;  	mUploadTextures = upload_textures; @@ -1373,9 +1200,7 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data,  	mUploadJoints = upload_joints;  	mMutex = new LLMutex(NULL);  	mCurlRequest = NULL; -	mPendingConfirmations = 0;  	mPendingUploads = 0; -	mPendingCost = 0;  	mFinished = false;  	mOrigin = gAgent.getPositionAgent();  	mHost = gAgent.getRegionHost(); @@ -1383,6 +1208,8 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data,  	mWholeModelFeeCapability = gAgent.getRegion()->getCapability("NewFileAgentInventory");  	mOrigin += gAgent.getAtAxis() * scale.magVec(); + +	mMeshUploadTimeOut = gSavedSettings.getS32("MeshUploadTimeOut") ;  }  LLMeshUploadThread::~LLMeshUploadThread() @@ -1441,7 +1268,14 @@ BOOL LLMeshUploadThread::isDiscarded()  void LLMeshUploadThread::run()  { -	doWholeModelUpload(); +	if (mDoUpload) +	{ +		doWholeModelUpload(); +	} +	else +	{ +		requestWholeModelFee(); +	}  }  void dump_llsd_to_file(const LLSD& content, std::string filename) @@ -1467,10 +1301,13 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)  	LLSD res;  	result["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT); +	result["texture_folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE);  	result["asset_type"] = "mesh";  	result["inventory_type"] = "object"; -	result["name"] = "mesh model"; -	result["description"] = "your description here"; +	result["description"] = "(No Description)"; +	result["next_owner_mask"] = LLSD::Integer(LLFloaterPerms::getNextOwnerPerms()); +	result["group_mask"] = LLSD::Integer(LLFloaterPerms::getGroupPerms()); +	result["everyone_mask"] = LLSD::Integer(LLFloaterPerms::getEveryonePerms());  	res["mesh_list"] = LLSD::emptyArray();  	res["texture_list"] = LLSD::emptyArray(); @@ -1482,6 +1319,8 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)  	std::map<LLViewerTexture*,S32> texture_index;  	std::map<LLModel*,S32> mesh_index; +	std::string model_name; +	std::string model_metric;  	S32 instance_num = 0; @@ -1498,10 +1337,14 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)  		if (mesh_index.find(data.mBaseModel) == mesh_index.end())  		{  			// Have not seen this model before - create a new mesh_list entry for it. -			std::string model_name = data.mBaseModel->getName(); -			if (!model_name.empty()) +			if (model_name.empty()) +			{ +				model_name = data.mBaseModel->getName(); +			} + +			if (model_metric.empty())  			{ -				result["name"] = model_name; +				model_metric = data.mBaseModel->getMetric();  			}  			std::stringstream ostr; @@ -1556,24 +1399,15 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)  			instance_entry["scale"] = ll_sd_from_vector3(scale);  			instance_entry["material"] = LL_MCODE_WOOD; -			LLPermissions perm; -			perm.setOwnerAndGroup(gAgent.getID(), gAgent.getID(), LLUUID::null, false); -			perm.setCreator(gAgent.getID()); -		 -			perm.initMasks(PERM_ITEM_UNRESTRICTED | PERM_MOVE, //base -						   PERM_ITEM_UNRESTRICTED | PERM_MOVE, //owner -						   LLFloaterPerms::getEveryonePerms(), -						   LLFloaterPerms::getGroupPerms(), -						   LLFloaterPerms::getNextOwnerPerms()); -			instance_entry["permissions"] = ll_create_sd_from_permissions(perm);  			instance_entry["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);  			instance_entry["mesh"] = mesh_index[data.mBaseModel];  			instance_entry["face_list"] = LLSD::emptyArray(); -			for (S32 face_num = 0; face_num < data.mBaseModel->getNumVolumeFaces(); face_num++) +			S32 end = llmin((S32)data.mBaseModel->mMaterialList.size(), data.mBaseModel->getNumVolumeFaces()) ; +			for (S32 face_num = 0; face_num < end; face_num++)  			{ -				LLImportMaterial& material = instance.mMaterial[face_num]; +				LLImportMaterial& material = instance.mMaterial[data.mBaseModel->mMaterialList[face_num]];  				LLSD face_entry = LLSD::emptyMap();  				LLViewerFetchedTexture *texture = material.mDiffuseMap.get(); @@ -1624,19 +1458,20 @@ 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));  	dest = result;  } -void LLMeshUploadThread::doWholeModelUpload() +void LLMeshUploadThread::generateHulls()  { -	dump_num++; -	 -	mCurlRequest = new LLCurlRequest();	 +	bool has_valid_requests = false ; -	// Queue up models for hull generation (viewer-side)  	for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)  	{  		LLMeshUploadData data; @@ -1656,6 +1491,10 @@ void LLMeshUploadThread::doWholeModelUpload()  		{  			physics = data.mModel[LLModel::LOD_PHYSICS];  		} +		else if (data.mModel[LLModel::LOD_LOW].notNull()) +		{ +			physics = data.mModel[LLModel::LOD_LOW]; +		}  		else if (data.mModel[LLModel::LOD_MEDIUM].notNull())  		{  			physics = data.mModel[LLModel::LOD_MEDIUM]; @@ -1666,33 +1505,27 @@ void LLMeshUploadThread::doWholeModelUpload()  		}  		llassert(physics != NULL); -		 +  		DecompRequest* request = new DecompRequest(physics, data.mBaseModel, this);  		if(request->isValid())  		{  			gMeshRepo.mDecompThread->submitRequest(request); -		}		 -	} - -	while (!mPhysicsComplete) -	{ -		apr_sleep(100); +			has_valid_requests = true ; +		}  	} - -	LLSD model_data; -	wholeModelToLLSD(model_data,false); -	dump_llsd_to_file(model_data,make_dump_name("whole_model_fee_request_",dump_num)); - -	mPendingUploads++; -	LLCurlRequest::headers_t headers; -	mCurlRequest->post(mWholeModelFeeCapability, headers, model_data, -					   new LLWholeModelFeeResponder(this,model_data)); - -	do +		 +	if(has_valid_requests)  	{ -		mCurlRequest->process(); -	} while (mCurlRequest->getQueued() > 0); +		while (!mPhysicsComplete) +		{ +			apr_sleep(100); +		} +	}	 +} +void LLMeshUploadThread::doWholeModelUpload() +{ +	mCurlRequest = new LLCurlRequest();  	if (mWholeModelUploadURL.empty())  	{ @@ -1700,15 +1533,20 @@ void LLMeshUploadThread::doWholeModelUpload()  	}  	else  	{ +		generateHulls(); +  		LLSD full_model_data;  		wholeModelToLLSD(full_model_data, true);  		LLSD body = full_model_data["asset_resources"];  		dump_llsd_to_file(body,make_dump_name("whole_model_body_",dump_num)); +		LLCurlRequest::headers_t headers;  		mCurlRequest->post(mWholeModelUploadURL, headers, body, -						   new LLWholeModelUploadResponder(this, model_data)); +						   new LLWholeModelUploadResponder(this, full_model_data, mUploadObserverHandle), mMeshUploadTimeOut);  		do  		{  			mCurlRequest->process(); +			//sleep for 10ms to prevent eating a whole core +			apr_sleep(10000);  		} while (mCurlRequest->getQueued() > 0);  	} @@ -1719,22 +1557,36 @@ void LLMeshUploadThread::doWholeModelUpload()  	mFinished = true;  } -void LLMeshUploadThread::uploadModel(LLMeshUploadData& data) -{ //called from arbitrary thread -	{ -		LLMutexLock lock(mMutex); -		mUploadQ.push(data); -	} -} +void LLMeshUploadThread::requestWholeModelFee() +{ +	dump_num++; -void LLMeshUploadThread::uploadTexture(LLTextureUploadData& data) -{ //called from mesh upload thread -	mTextureQ.push(data);	 -} +	mCurlRequest = new LLCurlRequest(); +	generateHulls(); + +	LLSD model_data; +	wholeModelToLLSD(model_data,false); +	dump_llsd_to_file(model_data,make_dump_name("whole_model_fee_request_",dump_num)); + +	mPendingUploads++; +	LLCurlRequest::headers_t headers; +	mCurlRequest->post(mWholeModelFeeCapability, headers, model_data, +					   new LLWholeModelFeeResponder(this,model_data, mFeeObserverHandle), mMeshUploadTimeOut); + +	do +	{ +		mCurlRequest->process(); +		//sleep for 10ms to prevent eating a whole core +		apr_sleep(10000); +	} while (mCurlRequest->getQueued() > 0); + +	delete mCurlRequest; +	mCurlRequest = NULL; -static LLFastTimer::DeclareTimer FTM_NOTIFY_MESH_LOADED("Notify Loaded"); -static LLFastTimer::DeclareTimer FTM_NOTIFY_MESH_UNAVAILABLE("Notify Unavailable"); +	// Currently a no-op. +	mFinished = true; +}  void LLMeshRepoThread::notifyLoadedMeshes()  { @@ -1799,7 +1651,9 @@ S32 LLMeshRepository::getActualMeshLOD(LLSD& header, S32 lod)  {  	lod = llclamp(lod, 0, 3); -	if (header.has("404")) +	S32 version = header["version"]; + +	if (header.has("404") || version > MAX_MESH_VERSION)  	{  		return -1;  	} @@ -1832,19 +1686,6 @@ S32 LLMeshRepository::getActualMeshLOD(LLSD& header, S32 lod)  	return -1;  } -U32 LLMeshRepoThread::getResourceCost(const LLUUID& mesh_id) -{ -	LLMutexLock lock(mHeaderMutex); -	 -	std::map<LLUUID, U32>::iterator iter = mMeshResourceCost.find(mesh_id); -	if (iter != mMeshResourceCost.end()) -	{ -		return iter->second; -	} - -	return 0; -} -  void LLMeshRepository::cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header)  {  	mThread->mMeshHeader[data.mUUID] = header; @@ -1860,6 +1701,7 @@ void LLMeshRepository::cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header)  		{  			LLPointer<LLVolume> volume = new LLVolume(volume_params, LLVolumeLODGroup::getVolumeScaleFromDetail(i));  			volume->copyVolumeFaces(data.mModel[i]); +			volume->setMeshAssetLoaded(TRUE);  		}  	} @@ -2135,54 +1977,54 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,  		LLUUID mesh_id = mMeshParams.getSculptID();  		LLSD header = gMeshRepo.mThread->mMeshHeader[mesh_id]; -		std::stringstream str; +		S32 version = header["version"].asInteger(); + +		if (version <= MAX_MESH_VERSION) +		{ +			std::stringstream str; -		S32 lod_bytes = 0; +			S32 lod_bytes = 0; -		for (U32 i = 0; i < LLModel::LOD_PHYSICS; ++i) -		{ //figure out how many bytes we'll need to reserve in the file -			std::string lod_name = header_lod[i]; -			lod_bytes = llmax(lod_bytes, header[lod_name]["offset"].asInteger()+header[lod_name]["size"].asInteger()); -		} +			for (U32 i = 0; i < LLModel::LOD_PHYSICS; ++i) +			{ //figure out how many bytes we'll need to reserve in the file +				std::string lod_name = header_lod[i]; +				lod_bytes = llmax(lod_bytes, header[lod_name]["offset"].asInteger()+header[lod_name]["size"].asInteger()); +			} -		//just in case skin info or decomposition is at the end of the file (which it shouldn't be) -		lod_bytes = llmax(lod_bytes, header["skin"]["offset"].asInteger() + header["skin"]["size"].asInteger()); -		lod_bytes = llmax(lod_bytes, header["physics_convex"]["offset"].asInteger() + header["physics_convex"]["size"].asInteger()); +			//just in case skin info or decomposition is at the end of the file (which it shouldn't be) +			lod_bytes = llmax(lod_bytes, header["skin"]["offset"].asInteger() + header["skin"]["size"].asInteger()); +			lod_bytes = llmax(lod_bytes, header["physics_convex"]["offset"].asInteger() + header["physics_convex"]["size"].asInteger()); -		S32 header_bytes = (S32) gMeshRepo.mThread->mMeshHeaderSize[mesh_id]; -		S32 bytes = lod_bytes + header_bytes;  +			S32 header_bytes = (S32) gMeshRepo.mThread->mMeshHeaderSize[mesh_id]; +			S32 bytes = lod_bytes + header_bytes;  -		//it's possible for the remote asset to have more data than is needed for the local cache -		//only allocate as much space in the VFS as is needed for the local cache -		data_size = llmin(data_size, bytes); +			//it's possible for the remote asset to have more data than is needed for the local cache +			//only allocate as much space in the VFS as is needed for the local cache +			data_size = llmin(data_size, bytes); -		LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH, LLVFile::WRITE); -		if (file.getMaxSize() >= bytes || file.setMaxSize(bytes)) -		{ -			LLMeshRepository::sCacheBytesWritten += data_size; +			LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH, LLVFile::WRITE); +			if (file.getMaxSize() >= bytes || file.setMaxSize(bytes)) +			{ +				LLMeshRepository::sCacheBytesWritten += data_size; -			file.write((const U8*) data, data_size); +				file.write((const U8*) data, data_size); -			//zero out the rest of the file  -			U8 block[4096]; -			memset(block, 0, 4096); +				//zero out the rest of the file  +				U8 block[4096]; +				memset(block, 0, 4096); -			while (bytes-file.tell() > 4096) -			{ -				file.write(block, 4096); -			} +				while (bytes-file.tell() > 4096) +				{ +					file.write(block, 4096); +				} -			S32 remaining = bytes-file.tell(); +				S32 remaining = bytes-file.tell(); -			if (remaining < 0 || remaining > 4096) -			{ -				llerrs << "Bad padding of mesh asset cache entry." << llendl; -			} - -			if (remaining > 0) -			{ -				file.write(block, remaining); +				if (remaining > 0) +				{ +					file.write(block, remaining); +				}  			}  		}  	} @@ -2292,8 +2134,6 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para  		return detail;  	} -	LLFastTimer t(FTM_LOAD_MESH);  -  	{  		LLMutexLock lock(mMeshMutex);  		//add volume to list of loading meshes @@ -2315,11 +2155,6 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para  	if (volume)  	{ -		if (volume->getNumVolumeFaces() == 0 && !volume->isTetrahedron()) -		{ -			volume->makeTetrahedron(); -		} -  		LLVolumeParams params = volume->getParams();  		LLVolumeLODGroup* group = LLPrimitive::getVolumeManager()->getGroup(params); @@ -2330,7 +2165,7 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para  			if (last_lod >= 0)  			{  				LLVolume* lod = group->refLOD(last_lod); -				if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0) +				if (lod && lod->isMeshAssetLoaded() && lod->getNumVolumeFaces() > 0)  				{  					group->derefLOD(lod);  					return last_lod; @@ -2342,7 +2177,7 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para  			for (S32 i = detail-1; i >= 0; --i)  			{  				LLVolume* lod = group->refLOD(i); -				if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0) +				if (lod && lod->isMeshAssetLoaded() && lod->getNumVolumeFaces() > 0)  				{  					group->derefLOD(lod);  					return i; @@ -2355,7 +2190,7 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para  			for (S32 i = detail+1; i < 4; ++i)  			{  				LLVolume* lod = group->refLOD(i); -				if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0) +				if (lod && lod->isMeshAssetLoaded() && lod->getNumVolumeFaces() > 0)  				{  					group->derefLOD(lod);  					return i; @@ -2369,11 +2204,6 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para  	return detail;  } -static LLFastTimer::DeclareTimer FTM_START_MESH_THREAD("Start Thread"); -static LLFastTimer::DeclareTimer FTM_LOAD_MESH_LOD("Load LOD"); -static LLFastTimer::DeclareTimer FTM_MESH_LOCK1("Lock 1"); -static LLFastTimer::DeclareTimer FTM_MESH_LOCK2("Lock 2"); -  void LLMeshRepository::notifyLoadedMeshes()  { //called from main thread @@ -2406,6 +2236,38 @@ void LLMeshRepository::notifyLoadedMeshes()  			LLAssetType::EType asset_type = LLAssetType::lookup(data.mPostData["asset_type"].asString());  			LLInventoryType::EType inventory_type = LLInventoryType::lookup(data.mPostData["inventory_type"].asString()); +			// Handle addition of texture, if any. +			if ( data.mResponse.has("new_texture_folder_id") ) +			{ +				const LLUUID& folder_id = data.mResponse["new_texture_folder_id"].asUUID(); + +				if ( folder_id.notNull() ) +				{ +					LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE); + +					std::string name; +					// Check if the server built a different name for the texture folder +					if ( data.mResponse.has("new_texture_folder_name") ) +					{ +						name = data.mResponse["new_texture_folder_name"].asString(); +					} +					else +					{ +						name = data.mPostData["name"].asString(); +					} + +					// Add the category to the internal representation +					LLPointer<LLViewerInventoryCategory> cat =  +						new LLViewerInventoryCategory(folder_id, parent_id,  +							LLFolderType::FT_NONE, name, gAgent.getID()); +					cat->setVersion(LLViewerInventoryCategory::VERSION_UNKNOWN); + +					LLInventoryModel::LLCategoryUpdate update(cat->getParentUUID(), 1); +					gInventory.accountForUpdate(update); +					gInventory.updateCategory(cat); +				} +			} +  			on_new_single_inventory_upload_complete(  				asset_type,  				inventory_type, @@ -2414,7 +2276,8 @@ void LLMeshRepository::notifyLoadedMeshes()  				data.mPostData["name"],  				data.mPostData["description"],  				data.mResponse, -				0); +				data.mResponse["upload_price"]); +			//}  			mInventoryQ.pop();  		} @@ -2439,18 +2302,9 @@ void LLMeshRepository::notifyLoadedMeshes()  		}  	} -	LLFastTimer t(FTM_MESH_UPDATE); - -	{ -		LLFastTimer t(FTM_MESH_LOCK1); -		mMeshMutex->lock();	 -	} - -	{ -		LLFastTimer t(FTM_MESH_LOCK2); -		mThread->mMutex->lock(); -	} -	 +	mMeshMutex->lock();	 +	mThread->mMutex->lock(); +		  	//popup queued error messages from background threads  	while (!mUploadErrorQ.empty())  	{ @@ -2502,7 +2356,6 @@ void LLMeshRepository::notifyLoadedMeshes()  		while (!mPendingRequests.empty() && push_count > 0)  		{ -			LLFastTimer t(FTM_LOAD_MESH_LOD);  			LLMeshRepoThread::LODRequest& request = mPendingRequests.front();  			mThread->loadMeshLOD(request.mMeshParams, request.mLOD);  			mPendingRequests.erase(mPendingRequests.begin()); @@ -2588,7 +2441,6 @@ void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVol  		if (volume->getNumVolumeFaces() <= 0)  		{  			llwarns << "Mesh loading returned empty volume." << llendl; -			volume->makeTetrahedron();  		}  		{ //update system volume @@ -2596,6 +2448,7 @@ void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVol  			if (sys_volume)  			{  				sys_volume->copyVolumeFaces(volume); +				sys_volume->setMeshAssetLoaded(TRUE);  				LLPrimitive::getVolumeManager()->unrefVolume(sys_volume);  			}  			else @@ -2652,26 +2505,7 @@ S32 LLMeshRepository::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lo  	return mThread->getActualMeshLOD(mesh_params, lod);  } -U32 LLMeshRepository::calcResourceCost(LLSD& header) -{ -	U32 bytes = 0; - -	for (U32 i = 0; i < 4; i++) -	{ -		bytes += header[header_lod[i]]["size"].asInteger(); -	} - -	bytes += header["skin"]["size"].asInteger(); - -	return bytes/4096 + 1; -} - -U32 LLMeshRepository::getResourceCost(const LLUUID& mesh_id) -{ -	return mThread->getResourceCost(mesh_id); -} - -const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id, LLVOVolume* requesting_obj) +const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id, const LLVOVolume* requesting_obj)  {  	if (mesh_id.notNull())  	{ @@ -2809,9 +2643,11 @@ LLSD& LLMeshRepoThread::getMeshHeader(const LLUUID& mesh_id)  void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures, -									bool upload_skin, bool upload_joints) +									bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload, +								   LLHandle<LLWholeModelFeeObserver> fee_observer, LLHandle<LLWholeModelUploadObserver> upload_observer)  { -	LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures, upload_skin, upload_joints); +	LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures, upload_skin, upload_joints, upload_url,  +														do_upload, fee_observer, upload_observer);  	mUploadWaitList.push_back(thread);  } @@ -2839,101 +2675,6 @@ S32 LLMeshRepository::getMeshSize(const LLUUID& mesh_id, S32 lod)  } - -void LLMeshUploadThread::doUploadModel(LLMeshUploadData& data) -{ -	if(isDiscarded()) -	{ -		return ; -	} - -	if (!data.mRSVP.empty()) -	{ -		std::stringstream ostr; - -		LLModel::Decomposition& decomp = -			data.mModel[LLModel::LOD_PHYSICS].notNull() ?  -			data.mModel[LLModel::LOD_PHYSICS]->mPhysics :  -			data.mBaseModel->mPhysics; - -		decomp.mBaseHull = mHullMap[data.mBaseModel]; - -		LLModel::writeModel( -			ostr,   -			data.mModel[LLModel::LOD_PHYSICS], -			data.mModel[LLModel::LOD_HIGH], -			data.mModel[LLModel::LOD_MEDIUM], -			data.mModel[LLModel::LOD_LOW], -			data.mModel[LLModel::LOD_IMPOSTOR],  -			decomp, -			mUploadSkin, -			mUploadJoints); - -		data.mAssetData = ostr.str(); - -		LLCurlRequest::headers_t headers; -		mPendingUploads++; - -		mCurlRequest->post(data.mRSVP, headers, data.mAssetData, new LLMeshUploadResponder(data, this)); -	} -} - -void LLMeshUploadThread::doUploadTexture(LLTextureUploadData& data) -{ -	if(isDiscarded()) -	{ -		return ; -	} - -	if (!data.mRSVP.empty()) -	{ -		std::stringstream ostr; -		 -		if (!data.mTexture->isRawImageValid()) -		{ -			data.mTexture->reloadRawImage(data.mTexture->getDiscardLevel()); -		} - -		if(data.mTexture->hasSavedRawImage()) -		{ -			LLPointer<LLImageJ2C> upload_file = LLViewerTextureList::convertToUploadFile(data.mTexture->getSavedRawImage()); -		 -			ostr.write((const char*) upload_file->getData(), upload_file->getDataSize()); -		} - -		data.mAssetData = ostr.str(); - -		LLCurlRequest::headers_t headers; -		mPendingUploads++; - -		mCurlRequest->post(data.mRSVP, headers, data.mAssetData, new LLTextureUploadResponder(data, this)); -	} -} - - -void LLMeshUploadThread::onModelUploaded(LLMeshUploadData& data) -{ -	createObjects(data); -} - -void LLMeshUploadThread::onTextureUploaded(LLTextureUploadData& data) -{ -	mTextureMap[data.mTexture] = data; -} - - -void LLMeshUploadThread::createObjects(LLMeshUploadData& data) -{ -	instance_list& instances = mInstance[data.mBaseModel]; - -	for (instance_list::iterator iter = instances.begin(); iter != instances.end(); ++iter) -	{ //create prims that reference given mesh -		LLModelInstance& instance = *iter; -		instance.mMeshID = data.mUUID; -		mInstanceQ.push(instance); -	} -} -  void LLMeshUploadThread::decomposeMeshMatrix(LLMatrix4& transformation,  											 LLVector3& result_pos,  											 LLQuaternion& result_rot, @@ -2974,147 +2715,6 @@ void LLMeshUploadThread::decomposeMeshMatrix(LLMatrix4& transformation,  	result_rot = quat_rotation;   } -										  -LLSD LLMeshUploadThread::createObject(LLModelInstance& instance) -{ -	LLMatrix4 transformation = instance.mTransform; - -	llassert(instance.mMeshID.notNull()); -	 -	// check for reflection -	BOOL reflected = (transformation.determinant() < 0); - -	// compute position -	LLVector3 position = LLVector3(0, 0, 0) * transformation; - -	// compute scale -	LLVector3 x_transformed = LLVector3(1, 0, 0) * transformation - position; -	LLVector3 y_transformed = LLVector3(0, 1, 0) * transformation - position; -	LLVector3 z_transformed = LLVector3(0, 0, 1) * transformation - position; -	F32 x_length = x_transformed.normalize(); -	F32 y_length = y_transformed.normalize(); -	F32 z_length = z_transformed.normalize(); -	LLVector3 scale = LLVector3(x_length, y_length, z_length); - -    // adjust for "reflected" geometry -	LLVector3 x_transformed_reflected = x_transformed; -	if (reflected) -	{ -		x_transformed_reflected *= -1.0; -	} -	 -	// compute rotation -	LLMatrix3 rotation_matrix; -	rotation_matrix.setRows(x_transformed_reflected, y_transformed, z_transformed); -	LLQuaternion quat_rotation = rotation_matrix.quaternion(); -	quat_rotation.normalize(); // the rotation_matrix might not have been orthoginal.  make it so here. -	LLVector3 euler_rotation; -	quat_rotation.getEulerAngles(&euler_rotation.mV[VX], &euler_rotation.mV[VY], &euler_rotation.mV[VZ]); - -	// -	// build parameter block to construct this prim -	// -	 -	LLSD object_params; - -	// create prim - -	// set volume params -	U8 sculpt_type = LL_SCULPT_TYPE_MESH; -	if (reflected) -	{ -		sculpt_type |= LL_SCULPT_FLAG_MIRROR; -	} -	LLVolumeParams  volume_params; -	volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE ); -	volume_params.setBeginAndEndS( 0.f, 1.f ); -	volume_params.setBeginAndEndT( 0.f, 1.f ); -	volume_params.setRatio  ( 1, 1 ); -	volume_params.setShear  ( 0, 0 ); -	volume_params.setSculptID(instance.mMeshID, sculpt_type); -	object_params["shape"] = volume_params.asLLSD(); - -	object_params["material"] = LL_MCODE_WOOD; - -	object_params["group-id"] = gAgent.getGroupID(); -	object_params["pos"] = ll_sd_from_vector3(position + mOrigin); -	object_params["rotation"] = ll_sd_from_quaternion(quat_rotation); -	object_params["scale"] = ll_sd_from_vector3(scale); -	object_params["name"] = instance.mLabel; - -	// load material from dae file -	object_params["facelist"] = LLSD::emptyArray(); -	for (S32 i = 0; i < instance.mMaterial.size(); i++) -	{ -		LLTextureEntry te; -		LLImportMaterial& mat = instance.mMaterial[i]; - -		te.setColor(mat.mDiffuseColor); - -		LLUUID diffuse_id = mTextureMap[mat.mDiffuseMap].mUUID; - -		if (diffuse_id.notNull()) -		{ -			te.setID(diffuse_id); -		} -		else -		{ -			te.setID(LLUUID("5748decc-f629-461c-9a36-a35a221fe21f")); // blank texture -		} - -		te.setFullbright(mat.mFullbright); - -		object_params["facelist"][i] = te.asLLSD(); -	} - -	// set extra parameters -	LLSculptParams sculpt_params; -	sculpt_params.setSculptTexture(instance.mMeshID); -	sculpt_params.setSculptType(sculpt_type); -	U8 buffer[MAX_OBJECT_PARAMS_SIZE+1]; -	LLDataPackerBinaryBuffer dp(buffer, MAX_OBJECT_PARAMS_SIZE); -	sculpt_params.pack(dp); -	std::vector<U8> v(dp.getCurrentSize()); -	memcpy(&v[0], buffer, dp.getCurrentSize()); -	LLSD extra_parameter; -	extra_parameter["extra_parameter"] = sculpt_params.mType; -	extra_parameter["param_data"] = v; -	object_params["extra_parameters"].append(extra_parameter); - -	LLPermissions perm; -	perm.setOwnerAndGroup(gAgent.getID(), gAgent.getID(), LLUUID::null, false); -	perm.setCreator(gAgent.getID()); - -	perm.initMasks(PERM_ITEM_UNRESTRICTED | PERM_MOVE, //base -				   PERM_ITEM_UNRESTRICTED | PERM_MOVE, //owner -				   LLFloaterPerms::getEveryonePerms(), -				   LLFloaterPerms::getGroupPerms(), -				   LLFloaterPerms::getNextOwnerPerms()); -		 -	object_params["permissions"] = ll_create_sd_from_permissions(perm); - -	object_params["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL); - -	return object_params; -} - -void LLMeshUploadThread::priceResult(LLMeshUploadData& data, const LLSD& content) -{ -	mPendingCost += content["upload_price"].asInteger(); -	data.mRSVP = content["rsvp"].asString(); - -	mConfirmedQ.push(data); -} - -void LLMeshUploadThread::priceResult(LLTextureUploadData& data, const LLSD& content) -{ -	mPendingCost += content["upload_price"].asInteger(); -	data.mRSVP = content["rsvp"].asString(); - -	mConfirmedTextureQ.push(data); -} - -  bool LLImportMaterial::operator<(const LLImportMaterial &rhs) const  {  	if (mDiffuseMap != rhs.mDiffuseMap) @@ -3137,6 +2737,11 @@ bool LLImportMaterial::operator<(const LLImportMaterial &rhs) const  		return mDiffuseColor < rhs.mDiffuseColor;  	} +	if (mBinding != rhs.mBinding) +	{ +		return mBinding < rhs.mBinding; +	} +  	return mFullbright < rhs.mFullbright;  } @@ -3156,57 +2761,68 @@ void LLMeshRepository::uploadError(LLSD& args)  }  //static -F32 LLMeshRepository::getStreamingCost(LLSD& header, F32 radius, S32* bytes, S32* bytes_visible, S32 lod) +F32 LLMeshRepository::getStreamingCost(LLSD& header, F32 radius, S32* bytes, S32* bytes_visible, S32 lod, F32 *unscaled_value)  { -	F32 dlowest = llmin(radius/0.03f, 256.f); -	F32 dlow = llmin(radius/0.06f, 256.f); -	F32 dmid = llmin(radius/0.24f, 256.f); +	F32 max_distance = 512.f; + +	F32 dlowest = llmin(radius/0.03f, max_distance); +	F32 dlow = llmin(radius/0.06f, max_distance); +	F32 dmid = llmin(radius/0.24f, max_distance); -	F32 bytes_lowest = header["lowest_lod"]["size"].asReal()/1024.f; -	F32 bytes_low = header["low_lod"]["size"].asReal()/1024.f; -	F32 bytes_mid = header["medium_lod"]["size"].asReal()/1024.f; -	F32 bytes_high = header["high_lod"]["size"].asReal()/1024.f; +	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" -	if (bytes) -	{ -		*bytes = 0; -		*bytes += header["lowest_lod"]["size"].asInteger(); -		*bytes += header["low_lod"]["size"].asInteger(); -		*bytes += header["medium_lod"]["size"].asInteger(); -		*bytes += header["high_lod"]["size"].asInteger(); -	} +	F32 bytes_per_triangle = (F32) gSavedSettings.getU32("MeshBytesPerTriangle"); +	S32 bytes_lowest = header["lowest_lod"]["size"].asInteger(); +	S32 bytes_low = header["low_lod"]["size"].asInteger(); +	S32 bytes_mid = header["medium_lod"]["size"].asInteger(); +	S32 bytes_high = header["high_lod"]["size"].asInteger(); -	if (bytes_visible) -	{ -		lod = LLMeshRepository::getActualMeshLOD(header, lod); -		if (lod >= 0 && lod <= 3) -		{ -			*bytes_visible = header[header_lod[lod]]["size"].asInteger(); -		} -	} - -	if (bytes_high == 0.f) +	if (bytes_high == 0)  	{  		return 0.f;  	} -	if (bytes_mid == 0.f) +	if (bytes_mid == 0)  	{  		bytes_mid = bytes_high;  	} -	if (bytes_low == 0.f) +	if (bytes_low == 0)  	{  		bytes_low = bytes_mid;  	} -	if (bytes_lowest == 0.f) +	if (bytes_lowest == 0)  	{  		bytes_lowest = bytes_low;  	} -	F32 max_area = 65536.f; +	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) +	{ +		*bytes = 0; +		*bytes += header["lowest_lod"]["size"].asInteger(); +		*bytes += header["low_lod"]["size"].asInteger(); +		*bytes += header["medium_lod"]["size"].asInteger(); +		*bytes += header["high_lod"]["size"].asInteger(); +	} + +	if (bytes_visible) +	{ +		lod = LLMeshRepository::getActualMeshLOD(header, lod); +		if (lod >= 0 && lod <= 3) +		{ +			*bytes_visible = header[header_lod[lod]]["size"].asInteger(); +		} +	} + +	F32 max_area = 102932.f; //area of circle that encompasses region  	F32 min_area = 1.f;  	F32 high_area = llmin(F_PI*dmid*dmid, max_area); @@ -3229,12 +2845,17 @@ F32 LLMeshRepository::getStreamingCost(LLSD& header, F32 radius, S32* bytes, S32  	low_area /= total_area;  	lowest_area /= total_area; -	F32 weighted_avg = bytes_high*high_area + -					   bytes_mid*mid_area + -					   bytes_low*low_area + -					  bytes_lowest*lowest_area; +	F32 weighted_avg = triangles_high*high_area + +					   triangles_mid*mid_area + +					   triangles_low*low_area + +					  triangles_lowest*lowest_area; + +	if (unscaled_value) +	{ +		*unscaled_value = weighted_avg; +	} -	return weighted_avg * gSavedSettings.getF32("MeshStreamingCostScaler"); +	return weighted_avg/gSavedSettings.getU32("MeshTriangleBudget")*15000.f;  } @@ -3291,24 +2912,27 @@ S32 LLPhysicsDecomp::llcdCallback(const char* status, S32 p1, S32 p2)  	return 1;  } -void LLPhysicsDecomp::setMeshData(LLCDMeshData& mesh) +void LLPhysicsDecomp::setMeshData(LLCDMeshData& mesh, bool vertex_based)  {  	mesh.mVertexBase = mCurRequest->mPositions[0].mV;  	mesh.mVertexStrideBytes = 12;  	mesh.mNumVertices = mCurRequest->mPositions.size(); -	mesh.mIndexType = LLCDMeshData::INT_16; -	mesh.mIndexBase = &(mCurRequest->mIndices[0]); -	mesh.mIndexStrideBytes = 6; +	if(!vertex_based) +	{ +		mesh.mIndexType = LLCDMeshData::INT_16; +		mesh.mIndexBase = &(mCurRequest->mIndices[0]); +		mesh.mIndexStrideBytes = 6; -	mesh.mNumTriangles = mCurRequest->mIndices.size()/3; +		mesh.mNumTriangles = mCurRequest->mIndices.size()/3; +	} -	if (mesh.mNumTriangles > 0 && mesh.mNumVertices > 2) +	if ((vertex_based || mesh.mNumTriangles > 0) && mesh.mNumVertices > 2)  	{  		LLCDResult ret = LLCD_OK;  		if (LLConvexDecomposition::getInstance() != NULL)  		{ -			ret  = LLConvexDecomposition::getInstance()->setMeshData(&mesh); +			ret  = LLConvexDecomposition::getInstance()->setMeshData(&mesh, vertex_based);  		}  		if (ret) @@ -3332,7 +2956,7 @@ void LLPhysicsDecomp::doDecomposition()  	//load data intoLLCD  	if (stage == 0)  	{ -		setMeshData(mesh); +		setMeshData(mesh, false);  	}  	//build parameter map @@ -3506,11 +3130,55 @@ void make_box(LLPhysicsDecomp::Request * request)  void LLPhysicsDecomp::doDecompositionSingleHull()  { -	LLCDMeshData mesh; -	 -	setMeshData(mesh); -			 +	LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance(); + +	if (decomp == NULL) +	{ +		//stub. do nothing. +		return; +	} +	LLCDMeshData mesh;	 + +#if 1 +	setMeshData(mesh, true); + +	LLCDResult ret = decomp->buildSingleHull() ; +	if(ret) +	{ +		llwarns << "Could not execute decomposition stage when attempting to create single hull." << llendl; +		make_box(mCurRequest); +	} +	else +	{ +		mMutex->lock(); +		mCurRequest->mHull.clear(); +		mCurRequest->mHull.resize(1); +		mCurRequest->mHullMesh.clear(); +		mMutex->unlock(); + +		std::vector<LLVector3> p; +		LLCDHull hull; +		 +		// if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code +		decomp->getSingleHull(&hull); + +		const F32* v = hull.mVertexBase; + +		for (S32 j = 0; j < hull.mNumVertices; ++j) +		{ +			LLVector3 vert(v[0], v[1], v[2]);  +			p.push_back(vert); +			v = (F32*) (((U8*) v) + hull.mVertexStrideBytes); +		} +						 +		mMutex->lock(); +		mCurRequest->mHull[0] = p; +		mMutex->unlock();	 +	}		 +#else +	setMeshData(mesh, false); +  	//set all parameters to default  	std::map<std::string, const LLCDParam*> param_map; @@ -3519,23 +3187,15 @@ void LLPhysicsDecomp::doDecompositionSingleHull()  	if (!params)  	{ -		param_count = LLConvexDecomposition::getInstance()->getParameters(¶ms); +		param_count = decomp->getParameters(¶ms);  	} -	LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance(); - -	if (decomp == NULL) -	{ -		//stub. do nothing. -		return; -	} -  	for (S32 i = 0; i < param_count; ++i)  	{  		decomp->setParam(params[i].mName, params[i].mDefault.mIntOrEnumValue);  	} -	const S32 STAGE_DECOMPOSE = mStageID["Decompose"]; +	const S32 STAGE_DECOMPOSE = mStageID["Decompose"];	  	const S32 STAGE_SIMPLIFY = mStageID["Simplify"];  	const S32 DECOMP_PREVIEW = 0;  	const S32 SIMPLIFY_RETAIN = 0; @@ -3597,7 +3257,7 @@ void LLPhysicsDecomp::doDecompositionSingleHull()  			}  		}  	} - +#endif  	{  		completeCurrent(); @@ -3760,7 +3420,8 @@ LLModelInstance::LLModelInstance(LLSD& data)  	for (U32 i = 0; i < data["material"].size(); ++i)  	{ -		mMaterial.push_back(LLImportMaterial(data["material"][i])); +		LLImportMaterial mat(data["material"][i]); +		mMaterial[mat.mBinding] = mat;  	}  } @@ -3773,9 +3434,10 @@ LLSD LLModelInstance::asLLSD()  	ret["label"] = mLabel;  	ret["transform"] = mTransform.getValue(); -	for (U32 i = 0; i < mMaterial.size(); ++i) +	U32 i = 0; +	for (std::map<std::string, LLImportMaterial>::iterator iter = mMaterial.begin(); iter != mMaterial.end(); ++iter)  	{ -		ret["material"][i] = mMaterial[i].asLLSD(); +		ret["material"][i++] = iter->second.asLLSD();  	}  	return ret; @@ -3787,6 +3449,7 @@ LLImportMaterial::LLImportMaterial(LLSD& data)  	mDiffuseMapLabel = data["diffuse"]["label"].asString();  	mDiffuseColor.setValue(data["diffuse"]["color"]);  	mFullbright = data["fullbright"].asBoolean(); +	mBinding = data["binding"].asString();  } @@ -3798,7 +3461,8 @@ LLSD LLImportMaterial::asLLSD()  	ret["diffuse"]["label"] = mDiffuseMapLabel;  	ret["diffuse"]["color"] = mDiffuseColor.getValue();  	ret["fullbright"] = mFullbright; -	 +	ret["binding"] = mBinding; +  	return ret;  } @@ -3849,8 +3513,7 @@ void LLMeshRepository::buildPhysicsMesh(LLModel::Decomposition& decomp)  bool LLMeshRepository::meshUploadEnabled()  {  	LLViewerRegion *region = gAgent.getRegion(); -	if(gSavedSettings.getBOOL("MeshEnabled") &&  -	   LLViewerParcelMgr::getInstance()->allowAgentBuild() && +	if(gSavedSettings.getBOOL("MeshEnabled") &&  	   region)  	{  		return region->meshUploadEnabled(); diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index f237c3a60e..31b84ea0d9 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -36,6 +36,7 @@  #define LLCONVEXDECOMPINTER_STATIC 1  #include "llconvexdecomposition.h" +#include "lluploadfloaterobservers.h"  class LLVOVolume;  class LLMeshResponder; @@ -91,6 +92,7 @@ public:  	LLPointer<LLViewerFetchedTexture> mDiffuseMap;  	std::string mDiffuseMapFilename;  	std::string mDiffuseMapLabel; +	std::string mBinding;  	LLColor4 mDiffuseColor;  	bool mFullbright; @@ -119,9 +121,9 @@ public:  	S32 mLocalMeshID;  	LLMatrix4 mTransform; -	std::vector<LLImportMaterial> mMaterial; +	std::map<std::string, LLImportMaterial> mMaterial; -	LLModelInstance(LLModel* model, const std::string& label, LLMatrix4& transform, std::vector<LLImportMaterial>& materials) +	LLModelInstance(LLModel* model, const std::string& label, LLMatrix4& transform, std::map<std::string, LLImportMaterial>& materials)  		: mModel(model), mLabel(label), mTransform(transform), mMaterial(materials)  	{  		mLocalMeshID = -1; @@ -189,7 +191,7 @@ public:  	static S32 llcdCallback(const char*, S32, S32);  	void cancel(); -	void setMeshData(LLCDMeshData& mesh); +	void setMeshData(LLCDMeshData& mesh, bool vertex_based);  	void doDecomposition();  	void doDecompositionSingleHull(); @@ -229,8 +231,7 @@ public:  	mesh_header_map mMeshHeader;  	std::map<LLUUID, U32> mMeshHeaderSize; -	std::map<LLUUID, U32> mMeshResourceCost; - +	  	class HeaderRequest  	{   	public: @@ -333,8 +334,7 @@ public:  	void notifyLoadedMeshes();  	S32 getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod); -	U32 getResourceCost(const LLUUID& mesh_params); - +	  	void loadMeshSkinInfo(const LLUUID& mesh_id);  	void loadMeshDecomposition(const LLUUID& mesh_id);  	void loadMeshPhysicsShape(const LLUUID& mesh_id); @@ -356,6 +356,9 @@ public:  class LLMeshUploadThread : public LLThread   { +private: +	S32 mMeshUploadTimeOut ; //maximum time in seconds to execute an uploading request. +  public:  	class DecompRequest : public LLPhysicsDecomp::Request  	{ @@ -385,9 +388,7 @@ public:  	LLMutex*					mMutex;  	LLCurlRequest* mCurlRequest; -	S32				mPendingConfirmations;  	S32				mPendingUploads; -	S32				mPendingCost;  	LLVector3		mOrigin;  	bool			mFinished;	  	bool			mUploadTextures; @@ -399,38 +400,21 @@ public:  	std::string		mWholeModelFeeCapability;  	std::string		mWholeModelUploadURL; -	std::queue<LLMeshUploadData> mUploadQ; -	std::queue<LLMeshUploadData> mConfirmedQ; -	std::queue<LLModelInstance> mInstanceQ; - -	std::queue<LLTextureUploadData> mTextureQ; -	std::queue<LLTextureUploadData> mConfirmedTextureQ; - -	std::map<LLViewerFetchedTexture*, LLTextureUploadData> mTextureMap; -  	LLMeshUploadThread(instance_list& data, LLVector3& scale, bool upload_textures, -			bool upload_skin, bool upload_joints); +			bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload = true, +					   LLHandle<LLWholeModelFeeObserver> fee_observer= (LLHandle<LLWholeModelFeeObserver>()), LLHandle<LLWholeModelUploadObserver> upload_observer = (LLHandle<LLWholeModelUploadObserver>()));  	~LLMeshUploadThread(); -	void uploadTexture(LLTextureUploadData& data); -	void doUploadTexture(LLTextureUploadData& data); -	void priceResult(LLTextureUploadData& data, const LLSD& content); -	void onTextureUploaded(LLTextureUploadData& data); - -	void uploadModel(LLMeshUploadData& data); -	void doUploadModel(LLMeshUploadData& data); -	void onModelUploaded(LLMeshUploadData& data); -	void createObjects(LLMeshUploadData& data); -	LLSD createObject(LLModelInstance& instance); -	void priceResult(LLMeshUploadData& data, const LLSD& content); -  	bool finished() { return mFinished; }  	virtual void run();  	void preStart();  	void discard() ;  	BOOL isDiscarded(); +	void generateHulls(); +  	void doWholeModelUpload(); +	void requestWholeModelFee();  	void wholeModelToLLSD(LLSD& dest, bool include_textures); @@ -438,6 +422,15 @@ public:  							 LLVector3& result_pos,  							 LLQuaternion& result_rot,  							 LLVector3& result_scale); + +	void setFeeObserverHandle(LLHandle<LLWholeModelFeeObserver> observer_handle) { mFeeObserverHandle = observer_handle; } +	void setUploadObserverHandle(LLHandle<LLWholeModelUploadObserver> observer_handle) { mUploadObserverHandle = observer_handle; } + +private: +	LLHandle<LLWholeModelFeeObserver> mFeeObserverHandle; +	LLHandle<LLWholeModelUploadObserver> mUploadObserverHandle; + +	bool mDoUpload; // if FALSE only model data will be requested, otherwise the model will be uploaded  };  class LLMeshRepository @@ -452,7 +445,7 @@ public:  	static U32 sCacheBytesWritten;  	static U32 sPeakKbps; -	static F32 getStreamingCost(LLSD& header, F32 radius, S32* bytes = NULL, S32* visible_bytes = NULL, S32 detail = -1); +	static F32 getStreamingCost(LLSD& header, F32 radius, S32* bytes = NULL, S32* visible_bytes = NULL, S32 detail = -1, F32 *unscaled_value = NULL);  	LLMeshRepository(); @@ -471,9 +464,7 @@ public:  	S32 getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod);  	static S32 getActualMeshLOD(LLSD& header, S32 lod); -	U32 calcResourceCost(LLSD& header); -	U32 getResourceCost(const LLUUID& mesh_params); -	const LLMeshSkinInfo* getSkinInfo(const LLUUID& mesh_id, LLVOVolume* requesting_obj); +	const LLMeshSkinInfo* getSkinInfo(const LLUUID& mesh_id, const LLVOVolume* requesting_obj);  	LLModel::Decomposition* getDecomposition(const LLUUID& mesh_id);  	void fetchPhysicsShape(const LLUUID& mesh_id);  	bool hasPhysicsShape(const LLUUID& mesh_id); @@ -488,7 +479,8 @@ public:  	LLSD& getMeshHeader(const LLUUID& mesh_id);  	void uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures, -			bool upload_skin, bool upload_joints); +			bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload = true, +					 LLHandle<LLWholeModelFeeObserver> fee_observer= (LLHandle<LLWholeModelFeeObserver>()), LLHandle<LLWholeModelUploadObserver> upload_observer = (LLHandle<LLWholeModelUploadObserver>()));  	S32 getMeshSize(const LLUUID& mesh_id, S32 lod); diff --git a/indra/newview/llmorphview.h b/indra/newview/llmorphview.h index 1d8ee8e944..318d49bba5 100644 --- a/indra/newview/llmorphview.h +++ b/indra/newview/llmorphview.h @@ -40,8 +40,8 @@ public:  	{  		Params()  		{ -			mouse_opaque(false); -			follows.flags(FOLLOWS_ALL); +			changeDefault(mouse_opaque, false); +			changeDefault(follows.flags, FOLLOWS_ALL);  		}  	};  	LLMorphView(const LLMorphView::Params&); diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index 142ee40cc8..c3d8b91d67 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -37,7 +37,6 @@  #include "llagent.h"  #include "llagentcamera.h"  #include "llvoavatarself.h" // to check gAgentAvatarp->isSitting() -#include "llbottomtray.h"  #include "llbutton.h"  #include "llfirstuse.h"  #include "llfloaterreg.h" @@ -46,7 +45,8 @@  #include "lluictrlfactory.h"  #include "llviewerwindow.h"  #include "llviewercontrol.h" -#include "llselectmgr.h"  +#include "llselectmgr.h" +#include "lltoolbarview.h"  #include "llviewerparcelmgr.h"  #include "llviewerregion.h"  #include "lltooltip.h" @@ -59,15 +59,13 @@ const F32 MOVE_BUTTON_DELAY = 0.0f;  const F32 YAW_NUDGE_RATE = 0.05f;	// fraction of normal speed  const F32 NUDGE_TIME = 0.25f;		// in seconds -const std::string BOTTOM_TRAY_BUTTON_NAME = "movement_btn"; -  //  // Member functions  //  // protected  LLFloaterMove::LLFloaterMove(const LLSD& key) -:	LLTransientDockableFloater(NULL, true, key), +:	LLFloater(key),  	mForwardButton(NULL),  	mBackwardButton(NULL),  	mTurnLeftButton(NULL),  @@ -92,12 +90,8 @@ LLFloaterMove::~LLFloaterMove()  // virtual  BOOL LLFloaterMove::postBuild()  { -	setIsChrome(TRUE); -	setTitleVisible(TRUE); // restore title visibility after chrome applying  	updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730) -	LLDockableFloater::postBuild(); -	  	// Code that implements floater buttons toggling when user moves via keyboard is located in LLAgent::propagate()  	mForwardButton = getChild<LLJoystickAgentTurn>("forward btn");  @@ -155,10 +149,10 @@ BOOL LLFloaterMove::postBuild()  // virtual  void LLFloaterMove::setVisible(BOOL visible)  { -	// Do nothing with Stand/Stop Flying panel in excessive calls of this method (from LLTransientFloaterMgr?). +	// Do nothing with Stand/Stop Flying panel in excessive calls of this method.  	if (getVisible() == visible)  	{ -		LLTransientDockableFloater::setVisible(visible); +		LLFloater::setVisible(visible);  		return;  	} @@ -177,7 +171,7 @@ void LLFloaterMove::setVisible(BOOL visible)  		LLPanelStandStopFlying::getInstance()->reparent(NULL);  	} -	LLTransientDockableFloater::setVisible(visible); +	LLFloater::setVisible(visible);  }  // static  @@ -441,30 +435,6 @@ void LLFloaterMove::setModeTitle(const EMovementMode mode)  	setTitle(title);  } -/** - * Updates position of the floater to be center aligned with Move button. - */ -void LLFloaterMove::updatePosition() -{ -	LLBottomTray* tray = LLBottomTray::getInstance(); -	if (!tray) return; - -	LLButton* movement_btn = tray->findChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME); - -	if (movement_btn) -	{ -		//align centers of a button and a floater -		S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2; - -		S32 y = 0; -		if (!mModeActionsPanel->getVisible()) -		{ -			y = mModeActionsPanel->getRect().getHeight(); -		} -		setOrigin(x, y); -	} -} -  //static  void LLFloaterMove::sUpdateFlyingStatus()  { @@ -499,8 +469,6 @@ void LLFloaterMove::enableInstance(BOOL bEnable)  void LLFloaterMove::onOpen(const LLSD& key)  { -	LLButton *anchor_panel = LLBottomTray::getInstance()->getChild<LLButton>("movement_btn"); -  	if (gAgent.getFlying())  	{  		setFlyingMode(TRUE); @@ -513,19 +481,9 @@ void LLFloaterMove::onOpen(const LLSD& key)  		showModeButtons(FALSE);  	} -	setDockControl(new LLDockControl( -		anchor_panel, this, -		getDockTongue(), LLDockControl::TOP)); -  	sUpdateFlyingStatus();  } -//virtual -void LLFloaterMove::setDocked(bool docked, bool pop_on_undock/* = true*/) -{ -	LLTransientDockableFloater::setDocked(docked, pop_on_undock); -} -  void LLFloaterMove::setModeButtonToggleState(const EMovementMode mode)  {  	llassert_always(mModeControlButtonMap.end() != mModeControlButtonMap.find(mode)); @@ -736,23 +694,30 @@ void LLPanelStandStopFlying::onStopFlyingButtonClick()   */  void LLPanelStandStopFlying::updatePosition()  { -	LLBottomTray* tray = LLBottomTray::getInstance(); -	if (!tray || mAttached) return; +	if (mAttached) return; -	LLButton* movement_btn = tray->findChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME); +	S32 y_pos = 0; +	S32 bottom_tb_center = 0; +	if (LLToolBar* toolbar_bottom = gToolBarView->getChild<LLToolBar>("toolbar_bottom")) +	{ +		y_pos = toolbar_bottom->getRect().getHeight(); +		bottom_tb_center = toolbar_bottom->getRect().getCenterX(); +	} -	S32 x = 0; -	if (movement_btn) +	S32 left_tb_width = 0; +	if (LLToolBar* toolbar_left = gToolBarView->getChild<LLToolBar>("toolbar_left"))  	{ -		// Align centers of the button and the panel. -		x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2; +		left_tb_width = toolbar_left->getRect().getWidth();  	} -	else + +	if(LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("stand_stop_flying_container"))  	{ -		x = tray->calcScreenRect().getCenterX() - getRect().getWidth()/2; +		panel_ssf_container->setOrigin(0, y_pos);  	} -	setOrigin(x, 0); -} +	S32 x_pos = bottom_tb_center-getRect().getWidth()/2 - left_tb_width; + +	setOrigin( x_pos, 0); +}  // EOF diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h index 1b87864651..744dd866d4 100644 --- a/indra/newview/llmoveview.h +++ b/indra/newview/llmoveview.h @@ -28,7 +28,7 @@  #define LL_LLMOVEVIEW_H  // Library includes -#include "lltransientdockablefloater.h" +#include "llfloater.h"  class LLButton;  class LLJoystickAgentTurn; @@ -38,7 +38,7 @@ class LLJoystickAgentSlide;  // Classes  //  class LLFloaterMove -:	public LLTransientDockableFloater +:	public LLFloater  {  	LOG_CLASS(LLFloaterMove);  	friend class LLFloaterReg; @@ -58,7 +58,6 @@ public:  	static void setSittingMode(BOOL bSitting);  	static void enableInstance(BOOL bEnable);  	/*virtual*/ void onOpen(const LLSD& key); -	/*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);  	static void sUpdateFlyingStatus(); @@ -87,7 +86,6 @@ private:  	void initModeButtonMap();  	void setModeButtonToggleState(const EMovementMode mode);  	void updateButtonsWithMovementMode(const EMovementMode newMode); -	void updatePosition();  	void showModeButtons(BOOL bShow);  public: diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index afceb58ccf..4e28d1f526 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -57,7 +57,6 @@ LLNameListCtrl::Params::Params()  	allow_calling_card_drop("allow_calling_card_drop", false),  	short_names("short_names", false)  { -	name = "name_list";  }  LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p) diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index d64fdbe6a5..ca9956dc53 100644 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -61,7 +61,7 @@ public:  		{}  	}; -	struct NameColumn : public LLInitParam::Choice<NameColumn> +	struct NameColumn : public LLInitParam::ChoiceBlock<NameColumn>  	{  		Alternative<S32>				column_index;  		Alternative<std::string>		column_name; diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index b8832dfd8e..fc264db5af 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -45,7 +45,6 @@  #include "llpaneltopinfobar.h"  #include "llteleporthistory.h"  #include "llsearchcombobox.h" -#include "llsidetray.h"  #include "llslurl.h"  #include "llurlregistry.h"  #include "llurldispatcher.h" @@ -269,7 +268,6 @@ LLNavigationBar::LLNavigationBar()  	mBtnForward(NULL),  	mBtnHome(NULL),  	mCmbLocation(NULL), -	mSearchComboBox(NULL),  	mPurgeTPHistoryItems(false),  	mSaveToLocationHistory(false)  { @@ -291,10 +289,7 @@ BOOL LLNavigationBar::postBuild()  	mBtnForward	= getChild<LLPullButton>("forward_btn");  	mBtnHome	= getChild<LLButton>("home_btn"); -	mCmbLocation= getChild<LLLocationInputCtrl>("location_combo");  -	mSearchComboBox	= getChild<LLSearchComboBox>("search_combo_box"); - -	fillSearchComboBox(); +	mCmbLocation= getChild<LLLocationInputCtrl>("location_combo");  	mBtnBack->setEnabled(FALSE);  	mBtnBack->setClickedCallback(boost::bind(&LLNavigationBar::onBackButtonClicked, this)); @@ -309,8 +304,6 @@ BOOL LLNavigationBar::postBuild()  	mBtnHome->setClickedCallback(boost::bind(&LLNavigationBar::onHomeButtonClicked, this));  	mCmbLocation->setCommitCallback(boost::bind(&LLNavigationBar::onLocationSelection, this)); -	 -	mSearchComboBox->setCommitCallback(boost::bind(&LLNavigationBar::onSearchCommit, this));  	mTeleportFinishConnection = LLViewerParcelMgr::getInstance()->  		setTeleportFinishedCallback(boost::bind(&LLNavigationBar::onTeleportFinished, this, _1)); @@ -344,26 +337,6 @@ void LLNavigationBar::setVisible(BOOL visible)  	}  } - -void LLNavigationBar::fillSearchComboBox() -{ -	if(!mSearchComboBox) -	{ -		return; -	} - -	LLSearchHistory::getInstance()->load(); - -	LLSearchHistory::search_history_list_t search_list =  -		LLSearchHistory::getInstance()->getSearchHistoryList(); -	LLSearchHistory::search_history_list_t::const_iterator it = search_list.begin(); -	for( ; search_list.end() != it; ++it) -	{ -		LLSearchHistory::LLSearchHistoryItem item = *it; -		mSearchComboBox->add(item.search_query); -	} -} -  void LLNavigationBar::draw()  {  	if(mPurgeTPHistoryItems) @@ -416,16 +389,6 @@ void LLNavigationBar::onHomeButtonClicked()  	gAgent.teleportHome();  } -void LLNavigationBar::onSearchCommit() -{ -	std::string search_query = mSearchComboBox->getSimple(); -	if(!search_query.empty()) -	{ -		LLSearchHistory::getInstance()->addEntry(search_query); -	} -	invokeSearch(search_query);	 -} -  void LLNavigationBar::onTeleportHistoryMenuItemClicked(const LLSD& userdata)  {  	int idx = userdata.asInteger(); @@ -716,7 +679,7 @@ void LLNavigationBar::handleLoginComplete()  void LLNavigationBar::invokeSearch(std::string search_text)  { -	LLFloaterReg::showInstance("search", LLSD().with("category", "all").with("id", LLSD(search_text))); +	LLFloaterReg::showInstance("search", LLSD().with("category", "all").with("query", LLSD(search_text)));  }  void LLNavigationBar::clearHistoryCache() @@ -736,151 +699,3 @@ int LLNavigationBar::getDefFavBarHeight()  {  	return mDefaultFpRect.getHeight();  } - -void LLNavigationBar::showNavigationPanel(BOOL visible) -{ -	bool fpVisible = gSavedSettings.getBOOL("ShowNavbarFavoritesPanel"); - -	LLFavoritesBarCtrl* fb = getChild<LLFavoritesBarCtrl>("favorite"); -	LLPanel* navPanel = getChild<LLPanel>("navigation_panel"); - -	LLRect nbRect(getRect()); -	LLRect fbRect(fb->getRect()); - -	navPanel->setVisible(visible); - -	if (visible) -	{ -		if (fpVisible) -		{ -			// Navigation Panel must be shown. Favorites Panel is visible. - -			nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), mDefaultNbRect.getHeight()); -			fbRect.setLeftTopAndSize(fbRect.mLeft, mDefaultFpRect.mTop, fbRect.getWidth(), fbRect.getHeight()); - -			// this is duplicated in 'else' section because it should be called BEFORE fb->reshape -			reshape(nbRect.getWidth(), nbRect.getHeight()); -			setRect(nbRect); -			// propagate size to parent container -			getParent()->reshape(nbRect.getWidth(), nbRect.getHeight()); - -			fb->reshape(fbRect.getWidth(), fbRect.getHeight()); -			fb->setRect(fbRect); -		} -		else -		{ -			// Navigation Panel must be shown. Favorites Panel is hidden. - -			S32 height = mDefaultNbRect.getHeight() - mDefaultFpRect.getHeight() - FAVBAR_TOP_PADDING; -			nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), height); - -			reshape(nbRect.getWidth(), nbRect.getHeight()); -			setRect(nbRect); -			getParent()->reshape(nbRect.getWidth(), nbRect.getHeight()); -		} -	} -	else -	{ -		if (fpVisible) -		{ -			// Navigation Panel must be hidden. Favorites Panel is visible. - -			S32 fpHeight = mDefaultFpRect.getHeight() + FAVBAR_TOP_PADDING; -			S32 fpTop = fpHeight - (mDefaultFpRect.getHeight() / 2) + 1; - -			nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), fpHeight); -			fbRect.setLeftTopAndSize(fbRect.mLeft, fpTop, fbRect.getWidth(), mDefaultFpRect.getHeight()); - -			// this is duplicated in 'else' section because it should be called BEFORE fb->reshape -			reshape(nbRect.getWidth(), nbRect.getHeight()); -			setRect(nbRect); -			getParent()->reshape(nbRect.getWidth(), nbRect.getHeight()); - -			fb->reshape(fbRect.getWidth(), fbRect.getHeight()); -			fb->setRect(fbRect); -		} -		else -		{ -			// Navigation Panel must be hidden. Favorites Panel is hidden. - -			nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), 0); - -			reshape(nbRect.getWidth(), nbRect.getHeight()); -			setRect(nbRect); -			getParent()->reshape(nbRect.getWidth(), nbRect.getHeight()); -		} -	} - -	getChildView("bg_icon")->setVisible( visible && fpVisible); -	getChildView("bg_icon_no_fav_bevel")->setVisible( visible && !fpVisible); -	getChildView("bg_icon_no_nav_bevel")->setVisible( !visible && fpVisible); -} - -void LLNavigationBar::showFavoritesPanel(BOOL visible) -{ -	bool npVisible = gSavedSettings.getBOOL("ShowNavbarNavigationPanel"); - -	LLFavoritesBarCtrl* fb = getChild<LLFavoritesBarCtrl>("favorite"); - -	LLRect nbRect(getRect()); -	LLRect fbRect(fb->getRect()); - -	if (visible) -	{ -		if (npVisible) -		{ -			// Favorites Panel must be shown. Navigation Panel is visible. - -			S32 fbHeight = fbRect.getHeight(); -			S32 newHeight = nbRect.getHeight() + fbHeight + FAVBAR_TOP_PADDING; - -			nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), newHeight); -			fbRect.setLeftTopAndSize(mDefaultFpRect.mLeft, mDefaultFpRect.mTop, fbRect.getWidth(), fbRect.getHeight()); -		} -		else -		{ -			// Favorites Panel must be shown. Navigation Panel is hidden. - -			S32 fpHeight = mDefaultFpRect.getHeight() + FAVBAR_TOP_PADDING; -			S32 fpTop = fpHeight - (mDefaultFpRect.getHeight() / 2) + 1; - -			nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), fpHeight); -			fbRect.setLeftTopAndSize(fbRect.mLeft, fpTop, fbRect.getWidth(), mDefaultFpRect.getHeight()); -		} - -		reshape(nbRect.getWidth(), nbRect.getHeight()); -		setRect(nbRect); -		getParent()->reshape(nbRect.getWidth(), nbRect.getHeight()); - -		fb->reshape(fbRect.getWidth(), fbRect.getHeight()); -		fb->setRect(fbRect); -	} -	else -	{ -		if (npVisible) -		{ -			// Favorites Panel must be hidden. Navigation Panel is visible. - -			S32 fbHeight = fbRect.getHeight(); -			S32 newHeight = nbRect.getHeight() - fbHeight - FAVBAR_TOP_PADDING; - -			nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), newHeight); -		} -		else -		{ -			// Favorites Panel must be hidden. Navigation Panel is hidden. - -			nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), 0); -		} - -		reshape(nbRect.getWidth(), nbRect.getHeight()); -		setRect(nbRect); -		getParent()->reshape(nbRect.getWidth(), nbRect.getHeight()); -	} - -	getChildView("bg_icon")->setVisible( npVisible && visible); -	getChildView("bg_icon_no_fav_bevel")->setVisible( npVisible && !visible); -	getChildView("bg_icon_no_nav_bevel")->setVisible( !npVisible && visible); - -	fb->setVisible(visible); -} diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h index 3c9f8a762d..e4ce9e3998 100644 --- a/indra/newview/llnavigationbar.h +++ b/indra/newview/llnavigationbar.h @@ -98,9 +98,6 @@ public:  	void handleLoginComplete();  	void clearHistoryCache(); -	void showNavigationPanel(BOOL visible); -	void showFavoritesPanel(BOOL visible); -  	int getDefNavBarHeight();  	int getDefFavBarHeight(); @@ -121,7 +118,6 @@ private:  	void onHomeButtonClicked();  	void onLocationSelection();  	void onLocationPrearrange(const LLSD& data); -	void onSearchCommit();  	void onTeleportFinished(const LLVector3d& global_agent_pos);  	void onTeleportFailed();  	void onRegionNameResponse( @@ -131,8 +127,6 @@ private:  			U64 region_handle, const std::string& url,  			const LLUUID& snapshot_id, bool teleport); -	void fillSearchComboBox(); -  	static void destroyClass()  	{  		if (LLNavigationBar::instanceExists()) @@ -145,7 +139,6 @@ private:  	LLPullButton*				mBtnBack;  	LLPullButton*				mBtnForward;  	LLButton*					mBtnHome; -	LLSearchComboBox*			mSearchComboBox;  	LLLocationInputCtrl*		mCmbLocation;  	LLRect						mDefaultNbRect;  	LLRect						mDefaultFpRect; diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 03ebc344f1..67d745248f 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -32,8 +32,9 @@  #include "llrootview.h"  //#include "llchatitemscontainerctrl.h"  #include "lliconctrl.h" -#include "llsidetray.h" +#include "llfloatersidepanelcontainer.h"  #include "llfocusmgr.h" +#include "lllogchat.h"  #include "llresizebar.h"  #include "llresizehandle.h"  #include "llmenugl.h" @@ -50,18 +51,19 @@  #include "lldraghandle.h" -#include "llbottomtray.h"  #include "llnearbychatbar.h"  #include "llfloaterreg.h"  #include "lltrans.h"  static const S32 RESIZE_BAR_THICKNESS = 3; -LLNearbyChat::LLNearbyChat(const LLSD& key)  -	: LLDockableFloater(NULL, false, false, key) + +static LLRegisterPanelClassWrapper<LLNearbyChat> t_panel_nearby_chat("panel_nearby_chat"); + +LLNearbyChat::LLNearbyChat()  +	: LLPanel()  	,mChatHistory(NULL)  { -	  }  LLNearbyChat::~LLNearbyChat() @@ -86,54 +88,12 @@ BOOL LLNearbyChat::postBuild()  	mChatHistory = getChild<LLChatHistory>("chat_history"); -	if(!LLDockableFloater::postBuild()) +	if(!LLPanel::postBuild())  		return false; - -	if (getDockControl() == NULL) -	{ -		setDockControl(new LLDockControl( -			LLBottomTray::getInstance()->getNearbyChatBar(), this, -			getDockTongue(), LLDockControl::TOP, boost::bind(&LLNearbyChat::getAllowedRect, this, _1))); -	} - -        //fix for EXT-4621  -        //chrome="true" prevents floater from stilling capture -        setIsChrome(true); -	//chrome="true" hides floater caption  -	if (mDragHandle) -		mDragHandle->setTitleVisible(TRUE); - +	  	return true;  } - -void    LLNearbyChat::applySavedVariables() -{ -	if (mRectControl.size() > 1) -	{ -		const LLRect& rect = LLFloater::getControlGroup()->getRect(mRectControl); -		if(!rect.isEmpty() && rect.isValid()) -		{ -			reshape(rect.getWidth(), rect.getHeight()); -			setRect(rect); -		} -	} - - -	if(!LLFloater::getControlGroup()->controlExists(mDocStateControl)) -	{ -		setDocked(true); -	} -	else -	{ -		if (mDocStateControl.size() > 1) -		{ -			bool dockState = LLFloater::getControlGroup()->getBOOL(mDocStateControl); -			setDocked(dockState); -		} -	} -} -  std::string appendTime()  {  	time_t utc_time; @@ -203,7 +163,7 @@ void LLNearbyChat::onNearbySpeakers()  {  	LLSD param;  	param["people_panel_tab_name"] = "nearby_panel"; -	LLSideTray::getInstance()->showPanel("panel_people",param); +	LLFloaterSidePanelContainer::showPanel("people", "panel_people", param);  } @@ -229,18 +189,9 @@ void	LLNearbyChat::setVisible(BOOL visible)  		}  	} -	LLDockableFloater::setVisible(visible); +	LLPanel::setVisible(visible);  } -void	LLNearbyChat::onOpen(const LLSD& key ) -{ -	LLDockableFloater::onOpen(key); -} - -void LLNearbyChat::setRect	(const LLRect &rect) -{ -	LLDockableFloater::setRect(rect); -}  void LLNearbyChat::getAllowedRect(LLRect& rect)  { @@ -263,9 +214,9 @@ void LLNearbyChat::updateChatHistoryStyle()  //static   void LLNearbyChat::processChatHistoryStyleUpdate(const LLSD& newvalue)  { -	LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); -	if(nearby_chat) -		nearby_chat->updateChatHistoryStyle(); +	//LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); +	//if(nearby_chat) +	//	nearby_chat->updateChatHistoryStyle();  }  bool isWordsName(const std::string& name) @@ -339,7 +290,8 @@ void LLNearbyChat::loadHistory()  //static  LLNearbyChat* LLNearbyChat::getInstance()  { -	return LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); +	LLFloater* chat_bar = LLFloaterReg::getInstance("chat_bar"); +	return chat_bar->findChild<LLNearbyChat>("nearby_chat");  }  //////////////////////////////////////////////////////////////////////////////// @@ -367,7 +319,7 @@ BOOL	LLNearbyChat::handleMouseDown(S32 x, S32 y, MASK mask)  	if(mChatHistory)  		mChatHistory->setFocus(TRUE); -	return LLDockableFloater::handleMouseDown(x, y, mask); +	return LLPanel::handleMouseDown(x, y, mask);  }  void LLNearbyChat::draw() @@ -380,5 +332,5 @@ void LLNearbyChat::draw()  		setTransparencyType(hasFocus() ? TT_ACTIVE : TT_INACTIVE);  	} -	LLDockableFloater::draw(); +	LLPanel::draw();  } diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index 2ea79797f8..5ef584c8ff 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -1,4 +1,4 @@ -/**  + /**    * @file llnearbychat.h   * @brief nearby chat history scrolling panel implementation   * @@ -27,17 +27,17 @@  #ifndef LL_LLNEARBYCHAT_H_  #define LL_LLNEARBYCHAT_H_ -#include "lldockablefloater.h"  #include "llscrollbar.h"  #include "llviewerchat.h" +#include "llfloater.h"  class LLResizeBar;  class LLChatHistory; -class LLNearbyChat: public LLDockableFloater +class LLNearbyChat: public LLPanel  {  public: -	LLNearbyChat(const LLSD& key); +	LLNearbyChat();  	~LLNearbyChat();  	BOOL	postBuild			(); @@ -54,12 +54,8 @@ public:  	/*virtual*/ void	onFocusLost();  	/*virtual*/ void	onFocusReceived(); -	/*virtual*/ void	onOpen	(const LLSD& key); -  	/*virtual*/ void	setVisible(BOOL visible); - -	virtual void setRect		(const LLRect &rect); - +	  	virtual void updateChatHistoryStyle();  	static void processChatHistoryStyleUpdate(const LLSD& newvalue); @@ -69,7 +65,6 @@ public:  	static LLNearbyChat* getInstance();  private: -	virtual void    applySavedVariables();  	void	getAllowedRect		(LLRect& rect); diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 4b961db5f9..3e4228cfb6 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -34,7 +34,6 @@  #include "llfirstuse.h"  #include "llnearbychatbar.h" -#include "llbottomtray.h"  #include "llagent.h"  #include "llgesturemgr.h"  #include "llmultigesture.h" @@ -49,13 +48,15 @@  #include "llrootview.h"  #include "llviewerchat.h" +#include "llresizehandle.h" +  S32 LLNearbyChatBar::sLastSpecialChatChannel = 0; +const S32 EXPANDED_HEIGHT = 300; +  // legacy callback glue  void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel); -static LLDefaultChildRegistry::Register<LLGestureComboList> r("gesture_combo_list"); -  struct LLChatTypeTrigger {  	std::string name;  	EChatType type; @@ -66,355 +67,10 @@ static LLChatTypeTrigger sChatTypeTriggers[] = {  	{ "/shout"	, CHAT_TYPE_SHOUT}  }; -//ext-7367 -//Problem: gesture list control (actually LLScrollListCtrl) didn't actually process mouse wheel message.  -// introduce new gesture list subclass to "eat" mouse wheel messages (and probably some other messages) -class LLGestureScrollListCtrl: public LLScrollListCtrl -{ -protected: -	friend class LLUICtrlFactory; -	LLGestureScrollListCtrl(const LLScrollListCtrl::Params& params) -		:LLScrollListCtrl(params) -	{ -	} -public: -	BOOL handleScrollWheel(S32 x, S32 y, S32 clicks) -	{ -		LLScrollListCtrl::handleScrollWheel( x, y, clicks ); -		return TRUE; -	} -	//See EXT-6598 -	//Mouse hover over separator will result in not processing tooltip message -	//So eat this message -	BOOL handleToolTip(S32 x, S32 y, MASK mask) -	{ -		LLScrollListCtrl::handleToolTip( x, y, mask ); -		return TRUE; -	} -}; - -LLGestureComboList::Params::Params() -:	combo_button("combo_button"), -	combo_list("combo_list"), -	get_more("get_more", true), -	view_all("view_all", true) -{ -} - -LLGestureComboList::LLGestureComboList(const LLGestureComboList::Params& p) -:	LLUICtrl(p), -	mLabel(p.label), -	mViewAllItemIndex(-1), -	mGetMoreItemIndex(-1), -	mShowViewAll(p.view_all), -	mShowGetMore(p.get_more) -{ -	LLBottomtrayButton::Params button_params = p.combo_button; -	button_params.follows.flags(FOLLOWS_LEFT|FOLLOWS_BOTTOM|FOLLOWS_RIGHT); - -	mButton = LLUICtrlFactory::create<LLBottomtrayButton>(button_params); -	mButton->reshape(getRect().getWidth(),getRect().getHeight()); -	mButton->setCommitCallback(boost::bind(&LLGestureComboList::onButtonCommit, this)); - -	addChild(mButton); - -	LLGestureScrollListCtrl::Params params(p.combo_list); -	 -	params.name("GestureComboList"); -	params.commit_callback.function(boost::bind(&LLGestureComboList::onItemSelected, this, _2)); -	params.visible(false); -	params.commit_on_keyboard_movement(false); - -	mList = LLUICtrlFactory::create<LLGestureScrollListCtrl>(params); -	addChild(mList); - -	//****************************Gesture Part********************************/ - -	setCommitCallback(boost::bind(&LLGestureComboList::onCommitGesture, this)); - -	// now register us as observer since we have a place to put the results -	LLGestureMgr::instance().addObserver(this); - -	// refresh list from current active gestures -	refreshGestures(); - -	setFocusLostCallback(boost::bind(&LLGestureComboList::hideList, this)); -} - -BOOL LLGestureComboList::handleKeyHere(KEY key, MASK mask) -{ -	BOOL handled = FALSE; -	 -	if (key == KEY_ESCAPE && mask == MASK_NONE ) -	{ -		hideList(); -		handled = TRUE; -	} -	else -	{ -		handled = mList->handleKeyHere(key, mask); -	} - -	return handled; 		 -} - -void LLGestureComboList::draw() -{ -	LLUICtrl::draw(); - -	if(mButton->getToggleState()) -	{ -		showList(); -	} -} - -void LLGestureComboList::showList() -{ -	LLRect rect = mList->getRect(); -	LLRect button_rect = mButton->getRect(); -	 -	// Calculating amount of space between the navigation bar and gestures combo -	LLNavigationBar* nb = LLNavigationBar::getInstance(); - -	S32 x, nb_bottom; -	nb->localPointToOtherView(0, 0, &x, &nb_bottom, this); - -	S32 max_height = nb_bottom - button_rect.mTop; -	mList->calcColumnWidths(); -	rect.setOriginAndSize(button_rect.mLeft, button_rect.mTop, llmax(mList->getMaxContentWidth(),mButton->getRect().getWidth()), max_height); - -	mList->setRect(rect); -	mList->fitContents( llmax(mList->getMaxContentWidth(),mButton->getRect().getWidth()), max_height); - -	gFocusMgr.setKeyboardFocus(this); - -	// Show the list and push the button down -	mButton->setToggleState(TRUE); -	mList->setVisible(TRUE); -	sendChildToFront(mList); -	LLUI::addPopup(mList); -} - -void LLGestureComboList::onButtonCommit() -{ -	if (!mList->getVisible()) -	{ -		// highlight the last selected item from the original selection before potentially selecting a new item -		// as visual cue to original value of combo box -		LLScrollListItem* last_selected_item = mList->getLastSelectedItem(); -		if (last_selected_item) -		{ -			mList->mouseOverHighlightNthItem(mList->getItemIndex(last_selected_item)); -		} - -		if (mList->getItemCount() != 0) -		{ -			showList(); -		} -	} -	else -	{ -		hideList(); -	}  -} - -void LLGestureComboList::hideList() -{ -	if (mList->getVisible()) -	{ -		mButton->setToggleState(FALSE); -		mList->setVisible(FALSE); -		mList->mouseOverHighlightNthItem(-1); -		LLUI::removePopup(mList); -		gFocusMgr.setKeyboardFocus(NULL); -	} -} - -S32 LLGestureComboList::getCurrentIndex() const -{ -	LLScrollListItem* item = mList->getFirstSelected(); -	if( item ) -	{ -		return mList->getItemIndex( item ); -	} -	return -1; -} - -void LLGestureComboList::onItemSelected(const LLSD& data) -{ -	const std::string name = mList->getSelectedItemLabel(); - -	S32 cur_id = getCurrentIndex(); -	mLastSelectedIndex = cur_id; -	if (cur_id != mList->getItemCount()-1 && cur_id != -1) -	{ -		mButton->setLabel(name); -	} - -	// hiding the list reasserts the old value stored in the text editor/dropdown button -	hideList(); - -	// commit does the reverse, asserting the value in the list -	onCommit(); -} - -void LLGestureComboList::sortByName(bool ascending) -{ -	mList->sortOnce(0, ascending); -} - -LLSD LLGestureComboList::getValue() const -{ -	LLScrollListItem* item = mList->getFirstSelected(); -	if( item ) -	{ -		return item->getValue(); -	} -	else -	{ -		return LLSD(); -	} -} - -void LLGestureComboList::refreshGestures() -{ -	//store current selection so we can maintain it -	LLSD cur_gesture = getValue(); -	 -	mList->selectFirstItem(); -	mList->clearRows(); -	mGestures.clear(); - -	LLGestureMgr::item_map_t::const_iterator it; -	const LLGestureMgr::item_map_t& active_gestures = LLGestureMgr::instance().getActiveGestures(); -	LLSD::Integer idx(0); -	for (it = active_gestures.begin(); it != active_gestures.end(); ++it) -	{ -		LLMultiGesture* gesture = (*it).second; -		if (gesture) -		{ -			mList->addSimpleElement(gesture->mName, ADD_BOTTOM, LLSD(idx)); -			mGestures.push_back(gesture); -			idx++; -		} -	} - -	sortByName(); - -	// store indices for Get More and View All items (idx is the index followed by the last added Gesture) -	if (mShowGetMore) -	{ -		mGetMoreItemIndex = idx; -		mList->addSimpleElement(LLTrans::getString("GetMoreGestures"), ADD_BOTTOM, LLSD(mGetMoreItemIndex)); -	} -	if (mShowViewAll) -	{ -		mViewAllItemIndex = idx + 1; -		mList->addSimpleElement(LLTrans::getString("ViewAllGestures"), ADD_BOTTOM, LLSD(mViewAllItemIndex)); -	} - -	// Insert label after sorting, at top, with separator below it -	mList->addSeparator(ADD_TOP);	 -	mList->addSimpleElement(mLabel, ADD_TOP); - -	if (cur_gesture.isDefined()) -	{  -		mList->selectByValue(cur_gesture); - -	} -	else -	{ -		mList->selectFirstItem(); -	} - -	LLCtrlListInterface* gestures = getListInterface(); -	LLMultiGesture* gesture = NULL; -	 -	if (gestures) -	{ -		S32 sel_index = gestures->getFirstSelectedIndex(); -		if (sel_index != 0) -		{ -			S32 index = gestures->getSelectedValue().asInteger(); -			if (index<0 || index >= (S32)mGestures.size()) -			{ -				llwarns << "out of range gesture access" << llendl; -			} -			else -			{ -				gesture = mGestures.at(index); -			} -		} -	} -	 -	if(gesture && LLGestureMgr::instance().isGesturePlaying(gesture)) -	{ -		return; -	} -	 -	mButton->setLabel(mLabel); -} - -void LLGestureComboList::onCommitGesture() -{ -	LLCtrlListInterface* gestures = getListInterface(); -	if (gestures) -	{ -		S32 sel_index = gestures->getFirstSelectedIndex(); -		if (sel_index == 0) -		{ -			return; -		} - -		S32 index = gestures->getSelectedValue().asInteger(); - -		if (mViewAllItemIndex == index) -		{ -			// The same behavior as Ctrl+G. EXT-823 -			LLFloaterReg::toggleInstance("gestures"); -			gestures->selectFirstItem(); -			return; -		} - -		if (mGetMoreItemIndex == index) -		{ -			LLWeb::loadURLExternal(gSavedSettings.getString("GesturesMarketplaceURL")); -			return; -		} - -		if (index<0 || index >= (S32)mGestures.size()) -		{ -			llwarns << "out of range gesture index" << llendl; -		} -		else -		{ -			LLMultiGesture* gesture = mGestures.at(index); -			if(gesture) -			{ -				LLGestureMgr::instance().playGesture(gesture); -				if(!gesture->mReplaceText.empty()) -				{ -					LLNearbyChatBar::sendChatFromViewer(gesture->mReplaceText, CHAT_TYPE_NORMAL, FALSE); -				} -			} -		} -	} -} - -LLGestureComboList::~LLGestureComboList() -{ -	LLGestureMgr::instance().removeObserver(this); -} - -LLCtrlListInterface* LLGestureComboList::getListInterface() -{ -	return mList; -} - -LLNearbyChatBar::LLNearbyChatBar()  -:	mChatBox(NULL) -{ -	mSpeakerMgr = LLLocalSpeakerMgr::getInstance(); +LLNearbyChatBar::LLNearbyChatBar(const LLSD& key) +	: LLFloater(key), +	mChatBox(NULL) +{	mSpeakerMgr = LLLocalSpeakerMgr::getInstance();  }  //virtual @@ -436,15 +92,37 @@ BOOL LLNearbyChatBar::postBuild()  	mChatBox->setEnableLineHistory(TRUE);  	mChatBox->setFont(LLViewerChat::getChatFont()); + +	LLUICtrl* show_btn = getChild<LLUICtrl>("show_nearby_chat"); +	show_btn->setCommitCallback(boost::bind(&LLNearbyChatBar::onToggleNearbyChatPanel, this)); +  	mOutputMonitor = getChild<LLOutputMonitorCtrl>("chat_zone_indicator");  	mOutputMonitor->setVisible(FALSE);  	// Register for font change notifications  	LLViewerChat::setFontChangedCallback(boost::bind(&LLNearbyChatBar::onChatFontChange, this, _1)); +	mExpandedHeight = getMinHeight() + EXPANDED_HEIGHT; + +	enableResizeCtrls(true, true, false); +  	return TRUE;  } +bool LLNearbyChatBar::applyRectControl() +{ +	bool rect_controlled = LLFloater::applyRectControl(); +	 +	if (getRect().getHeight() > getMinHeight()) +	{ +		getChildView("nearby_chat")->setVisible(true); +		mExpandedHeight = getRect().getHeight(); +		enableResizeCtrls(true); +	} + +	return rect_controlled; +} +  void LLNearbyChatBar::onChatFontChange(LLFontGL* fontp)  {  	// Update things with the new font whohoo @@ -457,19 +135,23 @@ void LLNearbyChatBar::onChatFontChange(LLFontGL* fontp)  //static  LLNearbyChatBar* LLNearbyChatBar::getInstance()  { -	return LLBottomTray::getInstance() ? LLBottomTray::getInstance()->getNearbyChatBar() : NULL; +	return LLFloaterReg::getTypedInstance<LLNearbyChatBar>("chat_bar");  } -//static -bool LLNearbyChatBar::instanceExists() +void LLNearbyChatBar::showHistory()  { -	return LLBottomTray::instanceExists() && LLBottomTray::getInstance()->getNearbyChatBar() != NULL; +	if (!getChildView("nearby_chat")->getVisible()) +	{ +		onToggleNearbyChatPanel(); +	} +	 +	openFloater();  }  void LLNearbyChatBar::draw()  {  	displaySpeakingIndicator(); -	LLPanel::draw(); +	LLFloater::draw();  }  std::string LLNearbyChatBar::getCurrentChat() @@ -683,6 +365,26 @@ void LLNearbyChatBar::sendChat( EChatType type )  	}  } + +void LLNearbyChatBar::onToggleNearbyChatPanel() +{ +	LLView* nearby_chat = getChildView("nearby_chat"); + +	if (nearby_chat->getVisible()) +	{ +		mExpandedHeight = getRect().getHeight(); +		nearby_chat->setVisible(FALSE); +		reshape(getRect().getWidth(), getMinHeight()); +		enableResizeCtrls(true, true, false); +	} +	else +	{ +		nearby_chat->setVisible(TRUE); +		reshape(getRect().getWidth(), mExpandedHeight); +		enableResizeCtrls(true); +	} +} +  void LLNearbyChatBar::onChatBoxCommit()  {  	if (mChatBox->getText().length() > 0) @@ -780,17 +482,13 @@ void LLNearbyChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type,  // static   void LLNearbyChatBar::startChat(const char* line)  { -	LLBottomTray *bt = LLBottomTray::getInstance(); - -	if (!bt) -		return; - -	LLNearbyChatBar* cb = bt->getNearbyChatBar(); +	LLNearbyChatBar* cb = LLNearbyChatBar::getInstance();  	if (!cb )  		return; -	bt->setVisible(TRUE); +	cb->setVisible(TRUE); +	cb->setFocus(TRUE);  	cb->mChatBox->setFocus(TRUE);  	if (line) @@ -806,12 +504,7 @@ void LLNearbyChatBar::startChat(const char* line)  // static  void LLNearbyChatBar::stopChat()  { -	LLBottomTray *bt = LLBottomTray::getInstance(); - -	if (!bt) -		return; - -	LLNearbyChatBar* cb = bt->getNearbyChatBar(); +	LLNearbyChatBar* cb = LLNearbyChatBar::getInstance();  	if (!cb)  		return; diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index efddec942f..bc00c1b9fc 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -27,85 +27,25 @@  #ifndef LL_LLNEARBYCHATBAR_H  #define LL_LLNEARBYCHATBAR_H -#include "llpanel.h" +#include "llfloater.h"  #include "llcombobox.h"  #include "llgesturemgr.h"  #include "llchat.h"  #include "llvoiceclient.h"  #include "lloutputmonitorctrl.h"  #include "llspeakers.h" -#include "llbottomtray.h" - -class LLGestureComboList -	: public LLGestureManagerObserver -	, public LLUICtrl -{ -public: -	struct Params :	public LLInitParam::Block<Params, LLUICtrl::Params> -	{ -		Optional<LLBottomtrayButton::Params>			combo_button; -		Optional<LLScrollListCtrl::Params>	combo_list; -		Optional<bool>						get_more, -											view_all; -		 -		Params(); -	}; - -protected: -	 -	friend class LLUICtrlFactory; -	LLGestureComboList(const Params&); -	std::vector<LLMultiGesture*> mGestures; -	std::string mLabel; -	bool			mShowViewAll; -	bool			mShowGetMore; -	LLSD::Integer mViewAllItemIndex; -	LLSD::Integer mGetMoreItemIndex; - -public: - -	~LLGestureComboList(); - -	LLCtrlListInterface* getListInterface(); -	virtual void	showList(); -	virtual void	hideList(); -	virtual BOOL	handleKeyHere(KEY key, MASK mask); - -	virtual void	draw(); - -	S32				getCurrentIndex() const; -	void			onItemSelected(const LLSD& data); -	void			sortByName(bool ascending = true); -	void refreshGestures(); -	void onCommitGesture(); -	void onButtonCommit(); -	virtual LLSD	getValue() const; - -	// LLGestureManagerObserver trigger -	virtual void changed() { refreshGestures(); } - -private: - -	LLButton*			mButton; -	LLScrollListCtrl*	mList; -	S32                 mLastSelectedIndex; -}; - -class LLNearbyChatBar -:	public LLPanel +class LLNearbyChatBar :	public LLFloater  {  public:  	// constructor for inline chat-bars (e.g. hosted in chat history window) -	LLNearbyChatBar(); +	LLNearbyChatBar(const LLSD& key);  	~LLNearbyChatBar() {}  	virtual BOOL postBuild();  	static LLNearbyChatBar* getInstance(); -	static bool instanceExists(); -  	LLLineEditor* getChatBox() { return mChatBox; }  	virtual void draw(); @@ -119,6 +59,8 @@ public:  	static void sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate);  	static void sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate); +	void showHistory(); +  protected:  	static BOOL matchChatTypeTrigger(const std::string& in_str, std::string* out_str);  	static void onChatBoxKeystroke(LLLineEditor* caller, void* userdata); @@ -129,6 +71,10 @@ protected:  	void onChatBoxCommit();  	void onChatFontChange(LLFontGL* fontp); +	/* virtual */ bool applyRectControl(); + +	void onToggleNearbyChatPanel(); +  	static LLWString stripChannelNumber(const LLWString &mesg, S32* channel);  	EChatType processChatTypeTriggers(EChatType type, std::string &str); @@ -140,6 +86,8 @@ protected:  	LLLineEditor*		mChatBox;  	LLOutputMonitorCtrl* mOutputMonitor;  	LLLocalSpeakerMgr*  mSpeakerMgr; + +	S32 mExpandedHeight;  };  #endif diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index 957b6d5f94..330a21ef65 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -29,7 +29,6 @@  #include "llagentdata.h" // for gAgentID  #include "llnearbychathandler.h" -#include "llbottomtray.h"  #include "llchatitemscontainerctrl.h"  #include "llfirstuse.h"  #include "llfloaterscriptdebug.h" @@ -41,6 +40,9 @@  #include "llfloaterreg.h"//for LLFloaterReg::getTypedInstance  #include "llviewerwindow.h"//for screen channel position +#include "llnearbychatbar.h" +#include "llrootview.h" +#include "lllayoutstack.h"  //add LLNearbyChatHandler to LLNotificationsUI namespace  using namespace LLNotificationsUI; @@ -61,7 +63,7 @@ public:  	typedef std::vector<LLHandle<LLToast> > toast_vec_t;  	typedef std::list<LLHandle<LLToast> > toast_list_t; -	LLNearbyChatScreenChannel(const LLUUID& id):LLScreenChannelBase(id)  +	LLNearbyChatScreenChannel(const Params& p):LLScreenChannelBase(p)  	{  		mStopProcessing = false; @@ -80,7 +82,6 @@ public:  	void addNotification	(LLSD& notification);  	void arrangeToasts		(); -	void showToastsBottom	();  	typedef boost::function<LLToastPanelBase* (void )> create_toast_panel_callback_t;  	void setCreatePanelCallback(create_toast_panel_callback_t value) { m_create_toast_panel_callback_t = value;} @@ -88,8 +89,6 @@ public:  	void onToastDestroyed	(LLToast* toast, bool app_quitting);  	void onToastFade		(LLToast* toast); -	void reshape			(S32 width, S32 height, BOOL called_from_parent); -  	void redrawToasts()  	{  		arrangeToasts(); @@ -149,6 +148,7 @@ protected:  	toast_list_t m_toast_pool;  	bool	mStopProcessing; +	bool	mChannelRect;  };  //----------------------------------------------------------------------------------------------- @@ -351,27 +351,6 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)  	arrangeToasts();  } -void LLNearbyChatScreenChannel::arrangeToasts() -{ -	if(!isHovering()) -	{ -		showToastsBottom(); -	} - -	if (m_active_toasts.empty()) -	{ -		LLHints::registerHintTarget("incoming_chat", LLHandle<LLView>()); -	} -	else -	{ -		LLToast* toast = m_active_toasts.front().get(); -		if (toast) -		{ -			LLHints::registerHintTarget("incoming_chat", m_active_toasts.front().get()->LLView::getHandle()); -		} -	} -} -  static bool sort_toasts_predicate(LLHandle<LLToast> first, LLHandle<LLToast> second)  {  	if (!first.get() || !second.get()) return false; // STORM-1352 @@ -381,16 +360,31 @@ static bool sort_toasts_predicate(LLHandle<LLToast> first, LLHandle<LLToast> sec  	return v1 > v2;  } -void LLNearbyChatScreenChannel::showToastsBottom() +void LLNearbyChatScreenChannel::arrangeToasts()  { -	if(mStopProcessing) +	if(mStopProcessing || isHovering())  		return; +	LLView* floater_snap_region = gViewerWindow->getRootView()->getChildView("floater_snap_region"); + +	if (!getParent()) +	{ +		// connect to floater snap region just to get resize events, we don't care about being a proper widget  +		floater_snap_region->addChild(this); +		setFollows(FOLLOWS_ALL); +	} +  	LLRect	toast_rect;	 -	updateBottom(); -	S32 channel_bottom = getRect().mBottom; +	updateRect(); + +	LLRect channel_rect; +	floater_snap_region->localRectToOtherView(floater_snap_region->getLocalRect(), &channel_rect, gFloaterView); +	channel_rect.mLeft += 10; +	channel_rect.mRight = channel_rect.mLeft + 300; + +	S32 channel_bottom = channel_rect.mBottom; -	S32		bottom = channel_bottom; +	S32		bottom = channel_bottom + 10;  	S32		margin = gSavedSettings.getS32("ToastGap");  	//sort active toasts @@ -409,7 +403,7 @@ void LLNearbyChatScreenChannel::showToastsBottom()  		S32 toast_top = bottom + toast->getRect().getHeight() + margin; -		if(toast_top > gFloaterView->getRect().getHeight()) +		if(toast_top > channel_rect.getHeight())  		{  			while(it!=m_active_toasts.end())  			{ @@ -420,7 +414,7 @@ void LLNearbyChatScreenChannel::showToastsBottom()  		}  		toast_rect = toast->getRect(); -		toast_rect.setLeftTopAndSize(getRect().mLeft , bottom + toast_rect.getHeight(), toast_rect.getWidth() ,toast_rect.getHeight()); +		toast_rect.setLeftTopAndSize(channel_rect.mLeft , bottom + toast_rect.getHeight(), toast_rect.getWidth() ,toast_rect.getHeight());  		toast->setRect(toast_rect);  		bottom += toast_rect.getHeight() - toast->getTopPad() + margin; @@ -438,15 +432,10 @@ void LLNearbyChatScreenChannel::showToastsBottom()  		}  	} -	} - -void LLNearbyChatScreenChannel::reshape			(S32 width, S32 height, BOOL called_from_parent) -{ -	LLScreenChannelBase::reshape(width, height, called_from_parent); -	arrangeToasts();  } +  //-----------------------------------------------------------------------------------------------  //LLNearbyChatHandler  //----------------------------------------------------------------------------------------------- @@ -457,7 +446,9 @@ LLNearbyChatHandler::LLNearbyChatHandler(e_notification_type type, const LLSD& i  	mType = type;  	// Getting a Channel for our notifications -	LLNearbyChatScreenChannel* channel = new LLNearbyChatScreenChannel(LLUUID(gSavedSettings.getString("NearByChatChannelUUID"))); +	LLNearbyChatScreenChannel::Params p; +	p.id = LLUUID(gSavedSettings.getString("NearByChatChannelUUID")); +	LLNearbyChatScreenChannel* channel = new LLNearbyChatScreenChannel(p);  	LLNearbyChatScreenChannel::create_toast_panel_callback_t callback = createToastPanel; @@ -473,10 +464,8 @@ LLNearbyChatHandler::~LLNearbyChatHandler()  void LLNearbyChatHandler::initChannel()  { -	LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); -	LLView* chat_box = LLBottomTray::getInstance()->getChildView("chat_box"); -	S32 channel_right_bound = nearby_chat->getRect().mRight; -	mChannel->init(chat_box->getRect().mLeft, channel_right_bound); +	//LLRect snap_rect = gFloaterView->getSnapRect(); +	//mChannel->init(snap_rect.mLeft, snap_rect.mLeft + 200);  } @@ -502,7 +491,10 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg,		// WARNING - not  			tmp_chat.mText = tmp_chat.mText.substr(3);  	} -	LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); +	LLFloater* chat_bar = LLFloaterReg::getInstance("chat_bar"); + +	LLNearbyChat* nearby_chat = chat_bar->findChild<LLNearbyChat>("nearby_chat"); +  	{  		//sometimes its usefull to have no name at all...  		//if(tmp_chat.mFromName.empty() && tmp_chat.mFromID!= LLUUID::null) @@ -576,7 +568,7 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg,		// WARNING - not  	sChatWatcher->post(notification); -	if( nearby_chat->getVisible() +	if( chat_bar->getVisible() && nearby_chat->getVisible()   		|| ( chat_msg.mSourceType == CHAT_SOURCE_AGENT  			&& gSavedSettings.getBOOL("UseChatBubbles") )  		|| !mChannel->getShowToasts() ) // to prevent toasts in Busy mode diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp index 9d824dcd59..cae7d02fed 100644 --- a/indra/newview/llnotificationalerthandler.cpp +++ b/indra/newview/llnotificationalerthandler.cpp @@ -44,7 +44,7 @@ LLAlertHandler::LLAlertHandler(e_notification_type type, const LLSD& id) : mIsMo  {  	mType = type; -	LLChannelManager::Params p; +	LLScreenChannelBase::Params p;  	p.id = LLUUID(gSavedSettings.getString("AlertChannelUUID"));  	p.display_toasts_always = true;  	p.toast_align = NA_CENTRE; @@ -114,7 +114,7 @@ bool LLAlertHandler::processNotification(const LLSD& notify)  		// Show alert in middle of progress view (during teleport) (EXT-1093)  		LLProgressView* progress = gViewerWindow->getProgressView();  		LLRect rc = progress && progress->getVisible() ? progress->getRect() : gViewerWindow->getWorldViewRectScaled(); -		mChannel->updatePositionAndSize(rc, rc); +		mChannel->updatePositionAndSize(rc);  		LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);  		if(channel) diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp index de90023f3b..1b767e80d4 100644 --- a/indra/newview/llnotificationhandlerutil.cpp +++ b/indra/newview/llnotificationhandlerutil.cpp @@ -385,7 +385,7 @@ void LLHandlerUtil::logGroupNoticeToIMGroup(  // static  void LLHandlerUtil::logToNearbyChat(const LLNotificationPtr& notification, EChatSourceType type)  { -	LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); +	LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();  	if(nearby_chat)  	{  		LLChat chat_msg(notification->getMessage()); diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp index 02b217fc94..2a08a29842 100644 --- a/indra/newview/llnotificationtiphandler.cpp +++ b/indra/newview/llnotificationtiphandler.cpp @@ -92,8 +92,7 @@ bool LLTipHandler::processNotification(const LLSD& notify)  			LLHandlerUtil::logToNearbyChat(notification, CHAT_SOURCE_SYSTEM);  			// don't show toast if Nearby Chat is opened -			LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance< -					LLNearbyChat>("nearby_chat", LLSD()); +			LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();  			if (nearby_chat->getVisible())  			{  				return false; diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 10887aa53a..1dc4d796ab 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -35,13 +35,13 @@  #include "llaccordionctrltab.h"  #include "llagentwearables.h"  #include "llappearancemgr.h" +#include "llfloatersidepanelcontainer.h"  #include "llinventoryfunctions.h"  #include "llinventorymodel.h"  #include "lllistcontextmenu.h"  #include "llmenubutton.h"  #include "llnotificationsutil.h"  #include "lloutfitobserver.h" -#include "llsidetray.h"  #include "lltoggleablemenu.h"  #include "lltransutil.h"  #include "llviewermenu.h" @@ -327,7 +327,7 @@ protected:  	static void editOutfit()  	{ -		LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit")); +		LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit"));  	}  	static void renameOutfit(const LLUUID& outfit_cat_id) diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index d58a1cb663..988e801b61 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -66,8 +66,8 @@ public:  		Params()  		:	agent_id("agent_id")  		{ -			mouse_opaque(false); -			follows.flags(FOLLOWS_ALL); +			changeDefault(mouse_opaque, false); +			changeDefault(follows.flags, FOLLOWS_ALL);  		}  	}; diff --git a/indra/newview/llpanelblockedlist.cpp b/indra/newview/llpanelblockedlist.cpp index 81e199d85b..5c85ec438c 100644 --- a/indra/newview/llpanelblockedlist.cpp +++ b/indra/newview/llpanelblockedlist.cpp @@ -37,7 +37,7 @@  // project include  #include "llfloateravatarpicker.h" -#include "llsidetray.h" +#include "llfloatersidepanelcontainer.h"  #include "llsidetraypanelcontainer.h"  static LLRegisterPanelClassWrapper<LLPanelBlockedList> t_panel_blocked_list("panel_block_list_sidetray"); @@ -99,7 +99,7 @@ void LLPanelBlockedList::selectBlocked(const LLUUID& mute_id)  void LLPanelBlockedList::showPanelAndSelect(const LLUUID& idToSelect)  { -	LLSideTray::getInstance()->showPanel("panel_block_list_sidetray", LLSD().with(BLOCKED_PARAM_NAME, idToSelect)); +	LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD().with(BLOCKED_PARAM_NAME, idToSelect));  } diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index bf3bf38863..a64b4ec94d 100644 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -172,7 +172,7 @@ void LLPanelContents::onClickNewScript(void *userdata)  				LLUUID::null,  				LLAssetType::AT_LSL_TEXT,  				LLInventoryType::IT_LSL, -				LLTrans::getString("PanelContentsNewScript"), +				"New Script",  				desc,  				LLSaleInfo::DEFAULT,  				LLInventoryItemFlags::II_FLAGS_NONE, diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index 76b85d5bec..ae217958f0 100644 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -29,6 +29,7 @@  // Library includes  #include "llbutton.h" +#include "llfloatersidepanelcontainer.h"  #include "lltabcontainer.h"  #include "lltextbox.h"  #include "lluictrlfactory.h" @@ -49,7 +50,6 @@  #include "llpanelgroupnotices.h"  #include "llpanelgroupgeneral.h" -#include "llsidetray.h"  #include "llaccordionctrltab.h"  #include "llaccordionctrl.h" @@ -597,7 +597,7 @@ void LLPanelGroup::showNotice(const std::string& subject,  //static  void LLPanelGroup::refreshCreatedGroup(const LLUUID& group_id)  { -	LLPanelGroup* panel = LLSideTray::getInstance()->getPanel<LLPanelGroup>("panel_group_info_sidetray"); +	LLPanelGroup* panel = LLFloaterSidePanelContainer::getPanel<LLPanelGroup>("people", "panel_group_info_sidetray");  	if(!panel)  		return;  	panel->setGroupID(group_id); @@ -612,7 +612,7 @@ void LLPanelGroup::showNotice(const std::string& subject,  					   const std::string& inventory_name,  					   LLOfferInfo* inventory_offer)  { -	LLPanelGroup* panel = LLSideTray::getInstance()->getPanel<LLPanelGroup>("panel_group_info_sidetray"); +	LLPanelGroup* panel = LLFloaterSidePanelContainer::getPanel<LLPanelGroup>("people", "panel_group_info_sidetray");  	if(!panel)  		return; diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index 1576ccccdf..bc594b5517 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -579,6 +579,11 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)  	} +	// After role member data was changed in Roles->Members +	// need to update role titles. See STORM-918. +	if (gc == GC_ROLE_MEMBER_DATA) +		LLGroupMgr::getInstance()->sendGroupTitlesRequest(mGroupID); +  	// If this was just a titles update, we are done.  	if (gc == GC_TITLES) return; diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp index 8d8d9bc1c4..eddd6e554d 100644 --- a/indra/newview/llpanelgrouplandmoney.cpp +++ b/indra/newview/llpanelgrouplandmoney.cpp @@ -35,6 +35,7 @@  #include "llqueryflags.h"  #include "llagent.h" +#include "lldateutil.h"  #include "lliconctrl.h"  #include "llfloaterreg.h"  #include "lllineeditor.h" @@ -1056,6 +1057,14 @@ void LLGroupMoneyDetailsTabEventHandler::processReply(LLMessageSystem* msg,  	msg->getS32Fast(_PREHASH_MoneyData, _PREHASH_CurrentInterval, current_interval );  	msg->getStringFast(_PREHASH_MoneyData, _PREHASH_StartDate, start_date); +	std::string time_str = LLTrans::getString("GroupMoneyDate"); +	LLSD substitution; + +	// We don't do time zone corrections of the calculated number of seconds +	// because we don't have a full time stamp, only a date. +	substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%A %b %d, %Y", start_date); +	LLStringUtil::format (time_str, substitution); +  	if ( interval_days != mImplementationp->mIntervalLength ||   		 current_interval != mImplementationp->mCurrentInterval )  	{ @@ -1064,7 +1073,7 @@ void LLGroupMoneyDetailsTabEventHandler::processReply(LLMessageSystem* msg,  		return;  	} -	std::string text = start_date; +	std::string text = time_str;  	text.append("\n\n");  	S32 total_amount = 0; @@ -1203,7 +1212,15 @@ void LLGroupMoneySalesTabEventHandler::processReply(LLMessageSystem* msg,  	// Start with the date.  	if (text == mImplementationp->mLoadingText)  	{ -		text = start_date + "\n\n"; +		std::string time_str = LLTrans::getString("GroupMoneyDate"); +		LLSD substitution; + +		// We don't do time zone corrections of the calculated number of seconds +		// because we don't have a full time stamp, only a date. +		substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%A %b %d, %Y", start_date); +		LLStringUtil::format (time_str, substitution); + +		text = time_str + "\n\n";  	}  	S32 transactions = msg->getNumberOfBlocksFast(_PREHASH_HistoryData); @@ -1408,12 +1425,26 @@ void LLGroupMoneyPlanningTabEventHandler::processReply(LLMessageSystem* msg,  	}  	text.append(LLTrans::getString("SummaryForTheWeek")); -	text.append(start_date); + +	std::string date_format_str = LLTrans::getString("GroupPlanningDate"); +	std::string time_str = date_format_str; +	LLSD substitution; +	// We don't do time zone corrections of the calculated number of seconds +	// because we don't have a full time stamp, only a date. +	substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%m/%d/%Y", start_date); +	LLStringUtil::format (time_str, substitution); + +	text.append(time_str);  	if (current_interval == 0)  	{  		text.append(LLTrans::getString("NextStipendDay")); -		text.append(next_stipend_date); + +		time_str = date_format_str; +		substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%m/%d/%Y", next_stipend_date); +		LLStringUtil::format (time_str, substitution); + +		text.append(time_str);  		text.append("\n\n");  		text.append(llformat("%-24sL$%6d\n", LLTrans::getString("GroupMoneyBalance").c_str(), balance ));  		text.append(1, '\n'); diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index e64192c2ae..31c0e3d01a 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -82,8 +82,8 @@ public:  		:	panel("panel"),  			group_id("group_id")  		{ -			mouse_opaque(false); -			follows.flags(FOLLOWS_ALL); +			changeDefault(mouse_opaque, false); +			changeDefault(follows.flags, FOLLOWS_ALL);  		}  	};  	LLGroupDropTarget(const Params&); diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index e370f2f622..0295ad151f 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -40,7 +40,6 @@  #include "llparticipantlist.h"  #include "llimview.h"  #include "llvoicechannel.h" -#include "llsidetray.h"  #include "llspeakers.h"  #include "lltrans.h" diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index a9cc247d1b..a65631b8d8 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -42,6 +42,7 @@  #include "llagentui.h"  #include "llcallbacklist.h"  #include "lldndbutton.h" +#include "llfloatersidepanelcontainer.h"  #include "llfloaterworldmap.h"  #include "llfolderviewitem.h"  #include "llinventorymodelbackgroundfetch.h" @@ -51,7 +52,6 @@  #include "llmenubutton.h"  #include "llplacesinventorybridge.h"  #include "llplacesinventorypanel.h" -#include "llsidetray.h"  #include "lltoggleablemenu.h"  #include "llviewermenu.h"  #include "llviewerregion.h" @@ -367,7 +367,7 @@ void LLLandmarksPanel::onSelectorButtonClicked()  		key["type"] = "landmark";  		key["id"] = listenerp->getUUID(); -		LLSideTray::getInstance()->showPanel("panel_places", key); +		LLFloaterSidePanelContainer::showPanel("places", key);  	}  } @@ -786,7 +786,7 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const  		}  		else  		{ -			LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark")); +			LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));  		}  	}   	else if ("category" == command_name) @@ -1309,7 +1309,13 @@ void LLLandmarksPanel::doProcessParcelInfo(LLLandmark* landmark,  	landmark->getGlobalPos(landmark_global_pos);  	// let's toggle pick panel into  panel places -	LLPanel* panel_places =  LLSideTray::getInstance()->getPanel("panel_places");//-> sidebar_places +	LLPanel* panel_places = NULL; +	LLFloaterSidePanelContainer* floaterp = LLFloaterReg::getTypedInstance<LLFloaterSidePanelContainer>("places"); +	if (floaterp) +	{ +		panel_places = floaterp->findChild<LLPanel>("main_panel"); +	} +  	if (!panel_places)  	{  		llassert(NULL != panel_places); diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 27f341b4f6..bef809f3a7 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -154,10 +154,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  	}  	updateLocationCombo(false); -	LLUICtrl& mode_combo = getChildRef<LLUICtrl>("mode_combo"); -	mode_combo.setValue(gSavedSettings.getString("SessionSettingsFile")); -	mode_combo.setCommitCallback(boost::bind(&LLPanelLogin::onModeChange, this, getChild<LLUICtrl>("mode_combo")->getValue(), _2)); -  	LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");  	server_choice_combo->setCommitCallback(onSelectServer, NULL);  	server_choice_combo->setFocusLostCallback(boost::bind(onServerComboLostFocus, _1)); @@ -1025,32 +1021,6 @@ void LLPanelLogin::updateLoginPanelLinks()  	sInstance->getChildView("forgot_password_text")->setVisible( system_grid);  } -void LLPanelLogin::onModeChange(const LLSD& original_value, const LLSD& new_value) -{ -	if (original_value.asString() != new_value.asString()) -	{ -		LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(&LLPanelLogin::onModeChangeConfirm, this, original_value, new_value, _1, _2)); -	} -} - -void LLPanelLogin::onModeChangeConfirm(const LLSD& original_value, const LLSD& new_value, const LLSD& notification, const LLSD& response) -{ -	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); -	switch (option) -	{ -	case 0: -		gSavedSettings.getControl("SessionSettingsFile")->set(new_value); -		LLAppViewer::instance()->forceQuit(); -		break; -	case 1: -		// revert to original value -		getChild<LLUICtrl>("mode_combo")->setValue(original_value); -		break; -	default: -		break; -	} -} -  std::string canonicalize_username(const std::string& name)  {  	std::string cname = name; diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index 11273453ba..a439c4ff6b 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -97,9 +97,6 @@ private:  	static void onServerComboLostFocus(LLFocusableElement*);  	static void updateServerCombo();  	static void updateStartSLURL(); -	void onModeChange(const LLSD& original_value, const LLSD& new_value); -	void onModeChangeConfirm(const LLSD& original_value, const LLSD& new_value, const LLSD& notification, const LLSD& response); -	  	static void updateLoginPanelLinks();  private: @@ -115,7 +112,4 @@ private:  	static BOOL		sCapslockDidNotification;  }; -std::string load_password_from_disk(void); -void save_password_to_disk(const char* hashed_password); -  #endif diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 1920cc2940..d6c407d548 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -38,6 +38,7 @@  #include "llinventorymodelbackgroundfetch.h"  #include "llinventorypanel.h"  #include "llfiltereditor.h" +#include "llfloatersidepanelcontainer.h"  #include "llfloaterreg.h"  #include "llmenubutton.h"  #include "lloutfitobserver.h" @@ -51,7 +52,6 @@  #include "llviewermenu.h"  #include "llviewertexturelist.h"  #include "llsidepanelinventory.h" -#include "llsidetray.h"  const std::string FILTERS_FILENAME("filters.xml"); @@ -572,28 +572,21 @@ void LLPanelMainInventory::updateItemcountText()  	{  		text = getString("ItemcountUnknown");  	} +	 +	// *TODO: Cache the LLUICtrl* for the ItemcountText control  	getChild<LLUICtrl>("ItemcountText")->setValue(text);  }  void LLPanelMainInventory::onFocusReceived()  { -	LLSidepanelInventory * sidepanel_inventory = LLSideTray::getInstance()->getPanel<LLSidepanelInventory>("sidepanel_inventory"); - -	LLInventoryPanel * inbox_panel = sidepanel_inventory->findChild<LLInventoryPanel>("inventory_inbox"); - -	if (inbox_panel) -	{ -		inbox_panel->clearSelection(); -	} - -	LLInventoryPanel * outbox_panel = sidepanel_inventory->findChild<LLInventoryPanel>("inventory_outbox"); - -	if (outbox_panel) +	LLSidepanelInventory *sidepanel_inventory =	LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory"); +	if (!sidepanel_inventory)  	{ -		outbox_panel->clearSelection(); +		llwarns << "Could not find Inventory Panel in My Inventory floater" << llendl; +		return;  	} -	sidepanel_inventory->updateVerbs(); +	sidepanel_inventory->clearSelections(false, true, true);  }  void LLPanelMainInventory::setFilterTextFromFilter()  @@ -1176,7 +1169,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)  	if (command_name == "share")  	{ -		LLSidepanelInventory* parent = dynamic_cast<LLSidepanelInventory*>(LLSideTray::getInstance()->getPanel("sidepanel_inventory")); +		LLSidepanelInventory* parent = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");  		return parent ? parent->canShare() : FALSE;  	} diff --git a/indra/newview/llpanelmarketplaceinbox.cpp b/indra/newview/llpanelmarketplaceinbox.cpp index af74f8f261..ac528947a4 100644 --- a/indra/newview/llpanelmarketplaceinbox.cpp +++ b/indra/newview/llpanelmarketplaceinbox.cpp @@ -1,248 +1,235 @@ -/** 
 - * @file llpanelmarketplaceinbox.cpp
 - * @brief Panel for marketplace inbox
 - *
 -* $LicenseInfo:firstyear=2011&license=viewerlgpl$
 - * Second Life Viewer Source Code
 - * Copyright (C) 2010, 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 "llpanelmarketplaceinbox.h"
 -
 -#include "llappviewer.h"
 -#include "llbutton.h"
 -#include "llinventorypanel.h"
 -#include "llfolderview.h"
 -#include "llsidepanelinventory.h"
 -
 -
 -#define SUPPORTING_FRESH_ITEM_COUNT	0
 -
 -
 -static LLRegisterPanelClassWrapper<LLPanelMarketplaceInbox> t_panel_marketplace_inbox("panel_marketplace_inbox");
 -
 -const LLPanelMarketplaceInbox::Params& LLPanelMarketplaceInbox::getDefaultParams() 
 -{ 
 -	return LLUICtrlFactory::getDefaultParams<LLPanelMarketplaceInbox>(); 
 -}
 -
 -// protected
 -LLPanelMarketplaceInbox::LLPanelMarketplaceInbox(const Params& p)
 -	: LLPanel(p)
 -	, mInventoryPanel(NULL)
 -{
 -}
 -
 -LLPanelMarketplaceInbox::~LLPanelMarketplaceInbox()
 -{
 -}
 -
 -// virtual
 -BOOL LLPanelMarketplaceInbox::postBuild()
 -{
 -	LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLPanelMarketplaceInbox::handleLoginComplete, this));
 -
 -	LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLPanelMarketplaceInbox::onFocusReceived, this));
 -	
 -	return TRUE;
 -}
 -
 -void LLPanelMarketplaceInbox::onSelectionChange()
 -{
 -	LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
 -		
 -	sidepanel_inventory->updateVerbs();
 -}
 -
 -
 -void LLPanelMarketplaceInbox::handleLoginComplete()
 -{
 -	// Set us up as the class to drive the badge value for the sidebar_inventory button
 -	LLSideTray::getInstance()->setTabButtonBadgeDriver("sidebar_inventory", this);
 -}
 -
 -void LLPanelMarketplaceInbox::setupInventoryPanel()
 -{
 -	LLView * inbox_inventory_placeholder = getChild<LLView>("inbox_inventory_placeholder");
 -	LLView * inbox_inventory_parent = inbox_inventory_placeholder->getParent();
 -
 -	mInventoryPanel = 
 -		LLUICtrlFactory::createFromFile<LLInventoryPanel>("panel_inbox_inventory.xml",
 -														  inbox_inventory_parent,
 -														  LLInventoryPanel::child_registry_t::instance());
 -	
 -	// Reshape the inventory to the proper size
 -	LLRect inventory_placeholder_rect = inbox_inventory_placeholder->getRect();
 -	mInventoryPanel->setShape(inventory_placeholder_rect);
 -	
 -	// Set the sort order newest to oldest, and a selection change callback
 -	mInventoryPanel->setSortOrder(LLInventoryFilter::SO_DATE);	
 -	mInventoryPanel->setSelectCallback(boost::bind(&LLPanelMarketplaceInbox::onSelectionChange, this));
 -
 -	// Set up the note to display when the inbox is empty
 -	mInventoryPanel->getFilter()->setEmptyLookupMessage("InventoryInboxNoItems");
 -	
 -	// Hide the placeholder text
 -	inbox_inventory_placeholder->setVisible(FALSE);
 -}
 -
 -void LLPanelMarketplaceInbox::onFocusReceived()
 -{
 -	LLSidepanelInventory * sidepanel_inventory = LLSideTray::getInstance()->getPanel<LLSidepanelInventory>("sidepanel_inventory");
 -
 -	if (sidepanel_inventory)
 -	{
 -		LLInventoryPanel * inv_panel = sidepanel_inventory->getActivePanel();
 -
 -		if (inv_panel)
 -		{
 -			inv_panel->clearSelection();
 -		}
 -	
 -		LLInventoryPanel * outbox_panel = sidepanel_inventory->findChild<LLInventoryPanel>("inventory_outbox");
 -
 -		if (outbox_panel)
 -		{
 -			outbox_panel->clearSelection();
 -		}
 -		
 -		sidepanel_inventory->updateVerbs();
 -	}
 -}
 -
 -BOOL LLPanelMarketplaceInbox::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string& tooltip_msg)
 -{
 -	*accept = ACCEPT_NO;
 -	return TRUE;
 -}
 -
 -U32 LLPanelMarketplaceInbox::getFreshItemCount() const
 -{
 -#if SUPPORTING_FRESH_ITEM_COUNT
 -	
 -	//
 -	// NOTE: When turning this on, be sure to test the no inbox/outbox case because this code probably
 -	//       will return "2" for the Inventory and LIBRARY top-levels when that happens.
 -	//
 -	
 -	U32 fresh_item_count = 0;
 -
 -	if (mInventoryPanel)
 -	{
 -		const LLFolderViewFolder * inbox_folder = mInventoryPanel->getRootFolder();
 -		
 -		if (inbox_folder)
 -		{
 -			LLFolderViewFolder::folders_t::const_iterator folders_it = inbox_folder->getFoldersBegin();
 -			LLFolderViewFolder::folders_t::const_iterator folders_end = inbox_folder->getFoldersEnd();
 -
 -			for (; folders_it != folders_end; ++folders_it)
 -			{
 -				const LLFolderViewFolder * folder = *folders_it;
 -
 -				// TODO: Replace this check with new "fresh" flag
 -				if (folder->getCreationDate() > 1500)
 -				{
 -					fresh_item_count++;
 -				}
 -			}
 -		}
 -	}
 -
 -	return fresh_item_count;
 -#else
 -	return getTotalItemCount();
 -#endif
 -}
 -
 -U32 LLPanelMarketplaceInbox::getTotalItemCount() const
 -{
 -	U32 item_count = 0;
 -	
 -	if (mInventoryPanel)
 -	{
 -		const LLFolderViewFolder * inbox_folder = mInventoryPanel->getRootFolder();
 -		
 -		if (inbox_folder)
 -		{
 -			item_count += inbox_folder->getFoldersCount();
 -		}
 -	}
 -	
 -	return item_count;
 -}
 -
 -std::string LLPanelMarketplaceInbox::getBadgeString() const
 -{
 -	std::string item_count_str("");
 -
 -	// If the inbox is visible, and the side panel is collapsed or expanded and not the inventory panel
 -	if (getParent()->getVisible() &&
 -		(LLSideTray::getInstance()->getCollapsed() || !LLSideTray::getInstance()->isPanelActive("sidepanel_inventory")))
 -	{
 -		U32 item_count = getFreshItemCount();
 -
 -		if (item_count)
 -		{
 -			item_count_str = llformat("%d", item_count);
 -		}
 -	}
 -
 -	return item_count_str;
 -}
 -
 -void LLPanelMarketplaceInbox::draw()
 -{
 -	U32 item_count = getTotalItemCount();
 -
 -	LLView * fresh_new_count_view = getChildView("inbox_fresh_new_count");
 -
 -	if (item_count > 0)
 -	{
 -		std::string item_count_str = llformat("%d", item_count);
 -
 -		LLStringUtil::format_map_t args;
 -		args["[NUM]"] = item_count_str;
 -		getChild<LLButton>("inbox_btn")->setLabel(getString("InboxLabelWithArg", args));
 -
 -#if SUPPORTING_FRESH_ITEM_COUNT
 -		// set green text to fresh item count
 -		U32 fresh_item_count = getFreshItemCount();
 -		fresh_new_count_view->setVisible((fresh_item_count > 0));
 -
 -		if (fresh_item_count > 0)
 -		{
 -			getChild<LLUICtrl>("inbox_fresh_new_count")->setTextArg("[NUM]", llformat("%d", fresh_item_count));
 -		}
 -#else
 -		fresh_new_count_view->setVisible(FALSE);
 -#endif
 -	}
 -	else
 -	{
 -		getChild<LLButton>("inbox_btn")->setLabel(getString("InboxLabelNoArg"));
 -
 -		fresh_new_count_view->setVisible(FALSE);
 -	}
 -		
 -	LLPanel::draw();
 -}
 +/**  + * @file llpanelmarketplaceinbox.cpp + * @brief Panel for marketplace inbox + * +* $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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 "llpanelmarketplaceinbox.h" +#include "llpanelmarketplaceinboxinventory.h" + +#include "llappviewer.h" +#include "llbutton.h" +#include "llinventorypanel.h" +#include "llfloatersidepanelcontainer.h" +#include "llfolderview.h" +#include "llsidepanelinventory.h" +#include "llviewercontrol.h" + + +static LLRegisterPanelClassWrapper<LLPanelMarketplaceInbox> t_panel_marketplace_inbox("panel_marketplace_inbox"); + +const LLPanelMarketplaceInbox::Params& LLPanelMarketplaceInbox::getDefaultParams()  +{  +	return LLUICtrlFactory::getDefaultParams<LLPanelMarketplaceInbox>();  +} + +// protected +LLPanelMarketplaceInbox::LLPanelMarketplaceInbox(const Params& p) +	: LLPanel(p) +	, mInventoryPanel(NULL) +{ +} + +LLPanelMarketplaceInbox::~LLPanelMarketplaceInbox() +{ +} + +// virtual +BOOL LLPanelMarketplaceInbox::postBuild() +{ +	LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLPanelMarketplaceInbox::onFocusReceived, this)); +	 +	return TRUE; +} + +void LLPanelMarketplaceInbox::onSelectionChange() +{ +	LLSidepanelInventory* sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory"); +		 +	sidepanel_inventory->updateVerbs(); +} + + +LLInventoryPanel * LLPanelMarketplaceInbox::setupInventoryPanel() +{ +	LLView * inbox_inventory_placeholder = getChild<LLView>("inbox_inventory_placeholder"); +	LLView * inbox_inventory_parent = inbox_inventory_placeholder->getParent(); + +	mInventoryPanel =  +		LLUICtrlFactory::createFromFile<LLInventoryPanel>("panel_inbox_inventory.xml", +														  inbox_inventory_parent, +														  LLInventoryPanel::child_registry_t::instance()); +	 +	llassert(mInventoryPanel); +	 +	// Reshape the inventory to the proper size +	LLRect inventory_placeholder_rect = inbox_inventory_placeholder->getRect(); +	mInventoryPanel->setShape(inventory_placeholder_rect); +	 +	// Set the sort order newest to oldest +	mInventoryPanel->setSortOrder(LLInventoryFilter::SO_DATE);	 +	mInventoryPanel->getFilter()->markDefault(); + +	// Set selection callback for proper update of inventory status buttons +	mInventoryPanel->setSelectCallback(boost::bind(&LLPanelMarketplaceInbox::onSelectionChange, this)); + +	// Set up the note to display when the inbox is empty +	mInventoryPanel->getFilter()->setEmptyLookupMessage("InventoryInboxNoItems"); +	 +	// Hide the placeholder text +	inbox_inventory_placeholder->setVisible(FALSE); +	 +	return mInventoryPanel; +} + +void LLPanelMarketplaceInbox::onFocusReceived() +{ +	LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory"); +	if (sidepanel_inventory) +	{ +		sidepanel_inventory->clearSelections(true, false, true); +	} + +	gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected()); +} + +BOOL LLPanelMarketplaceInbox::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string& tooltip_msg) +{ +	*accept = ACCEPT_NO; +	return TRUE; +} + +U32 LLPanelMarketplaceInbox::getFreshItemCount() const +{ +#if SUPPORTING_FRESH_ITEM_COUNT +	 +	// +	// NOTE: When turning this on, be sure to test the no inbox/outbox case because this code probably +	//       will return "2" for the Inventory and LIBRARY top-levels when that happens. +	// +	 +	U32 fresh_item_count = 0; + +	if (mInventoryPanel) +	{ +		const LLFolderViewFolder * inbox_folder = mInventoryPanel->getRootFolder(); +		 +		if (inbox_folder) +		{ +			LLFolderViewFolder::folders_t::const_iterator folders_it = inbox_folder->getFoldersBegin(); +			LLFolderViewFolder::folders_t::const_iterator folders_end = inbox_folder->getFoldersEnd(); + +			for (; folders_it != folders_end; ++folders_it) +			{ +				const LLFolderViewFolder * folder_view = *folders_it; +				const LLInboxFolderViewFolder * inbox_folder_view = dynamic_cast<const LLInboxFolderViewFolder*>(folder_view); + +				if (inbox_folder_view && inbox_folder_view->isFresh()) +				{ +					fresh_item_count++; +				} +			} +		} +	} + +	return fresh_item_count; +#else +	return getTotalItemCount(); +#endif +} + +U32 LLPanelMarketplaceInbox::getTotalItemCount() const +{ +	U32 item_count = 0; +	 +	if (mInventoryPanel) +	{ +		const LLFolderViewFolder * inbox_folder = mInventoryPanel->getRootFolder(); +		 +		if (inbox_folder) +		{ +			item_count += inbox_folder->getFoldersCount(); +		} +	} +	 +	return item_count; +} + +std::string LLPanelMarketplaceInbox::getBadgeString() const +{ +	std::string item_count_str(""); + +	LLPanel *inventory_panel = LLFloaterSidePanelContainer::getPanel("inventory"); + +	// If the inbox is visible, and the side panel is collapsed or expanded and not the inventory panel +	if (getParent()->getVisible() && inventory_panel && !inventory_panel->isInVisibleChain()) +	{ +		U32 item_count = getFreshItemCount(); + +		if (item_count) +		{ +			item_count_str = llformat("%d", item_count); +		} +	} + +	return item_count_str; +} + +void LLPanelMarketplaceInbox::draw() +{ +	U32 item_count = getTotalItemCount(); + +	LLView * fresh_new_count_view = getChildView("inbox_fresh_new_count"); + +	if (item_count > 0) +	{ +		std::string item_count_str = llformat("%d", item_count); + +		LLStringUtil::format_map_t args; +		args["[NUM]"] = item_count_str; +		getChild<LLButton>("inbox_btn")->setLabel(getString("InboxLabelWithArg", args)); + +#if SUPPORTING_FRESH_ITEM_COUNT +		// set green text to fresh item count +		U32 fresh_item_count = getFreshItemCount(); +		fresh_new_count_view->setVisible((fresh_item_count > 0)); + +		if (fresh_item_count > 0) +		{ +			getChild<LLUICtrl>("inbox_fresh_new_count")->setTextArg("[NUM]", llformat("%d", fresh_item_count)); +		} +#else +		fresh_new_count_view->setVisible(FALSE); +#endif +	} +	else +	{ +		getChild<LLButton>("inbox_btn")->setLabel(getString("InboxLabelNoArg")); + +		fresh_new_count_view->setVisible(FALSE); +	} +		 +	LLPanel::draw(); +} diff --git a/indra/newview/llpanelmarketplaceinbox.h b/indra/newview/llpanelmarketplaceinbox.h index 4ecea29304..3531518e51 100644 --- a/indra/newview/llpanelmarketplaceinbox.h +++ b/indra/newview/llpanelmarketplaceinbox.h @@ -28,18 +28,15 @@  #define LL_LLPANELMARKETPLACEINBOX_H  #include "llpanel.h" -#include "llsidetray.h"  class LLInventoryPanel; -class LLPanelMarketplaceInbox : public LLPanel, public LLSideTrayTabBadgeDriver +class LLPanelMarketplaceInbox : public LLPanel  {  public:  	struct Params :	public LLInitParam::Block<Params, LLPanel::Params> -	{ -		Params() {} -	}; +	{};  	LOG_CLASS(LLPanelMarketplaceInbox); @@ -55,7 +52,7 @@ public:  	/*virtual*/ void draw(); -	void setupInventoryPanel(); +	LLInventoryPanel * setupInventoryPanel();  	U32 getFreshItemCount() const;  	U32 getTotalItemCount() const; @@ -63,7 +60,6 @@ public:  	std::string getBadgeString() const;  private: -	void handleLoginComplete();  	void onSelectionChange(); diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp index b644f0e5cb..2e4bf55d51 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.cpp +++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp @@ -37,6 +37,8 @@  #include "llviewerfoldertype.h" +#define DEBUGGING_FRESHNESS	0 +  //  // statics  // @@ -66,7 +68,7 @@ void LLInboxInventoryPanel::buildFolderView(const LLInventoryPanel::Params& para  	LLUUID root_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false); -	// leslie -- temporary HACK to work around sim not creating inbox and outbox with proper system folder type +	// leslie -- temporary HACK to work around sim not creating inbox with proper system folder type  	if (root_id.isNull())  	{  		std::string start_folder_name(params.start_folder()); @@ -133,6 +135,27 @@ LLFolderViewFolder * LLInboxInventoryPanel::createFolderViewFolder(LLInvFVBridge  	return LLUICtrlFactory::create<LLInboxFolderViewFolder>(params);  } +LLFolderViewItem * LLInboxInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge) +{ +	LLFolderViewItem::Params params; + +	params.name = bridge->getDisplayName(); +	params.icon = bridge->getIcon(); +	params.icon_open = bridge->getOpenIcon(); + +	if (mShowItemLinkOverlays) // if false, then links show up just like normal items +	{ +		params.icon_overlay = LLUI::getUIImage("Inv_Link"); +	} + +	params.creation_date = bridge->getCreationDate(); +	params.root = mFolderRoot; +	params.listener = bridge; +	params.rect = LLRect (0, 0, 0, 0); +	params.tool_tip = params.name; + +	return LLUICtrlFactory::create<LLInboxFolderViewItem>(params); +}  //  // LLInboxFolderViewFolder Implementation @@ -143,7 +166,9 @@ LLInboxFolderViewFolder::LLInboxFolderViewFolder(const Params& p)  	, LLBadgeOwner(getHandle())  	, mFresh(false)  { +#if SUPPORTING_FRESH_ITEM_COUNT  	initBadgeParams(p.new_badge()); +#endif  }  LLInboxFolderViewFolder::~LLInboxFolderViewFolder() @@ -153,15 +178,77 @@ LLInboxFolderViewFolder::~LLInboxFolderViewFolder()  // virtual  void LLInboxFolderViewFolder::draw()  { +#if SUPPORTING_FRESH_ITEM_COUNT  	if (!badgeHasParent())  	{  		addBadgeToParentPanel();  	}  	setBadgeVisibility(mFresh); +#endif  	LLFolderViewFolder::draw();  } +void LLInboxFolderViewFolder::computeFreshness() +{ +	const U32 last_expansion_utc = gSavedPerAccountSettings.getU32("LastInventoryInboxActivity"); + +	if (last_expansion_utc > 0) +	{ +		mFresh = (mCreationDate > last_expansion_utc); + +#if DEBUGGING_FRESHNESS +		if (mFresh) +		{ +			llinfos << "Item is fresh! -- creation " << mCreationDate << ", saved_freshness_date " << last_expansion_utc << llendl; +		} +#endif +	} +	else +	{ +		mFresh = true; +	} +} + +void LLInboxFolderViewFolder::deFreshify() +{ +	mFresh = false; + +	gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected()); +} + +void LLInboxFolderViewFolder::selectItem() +{ +	LLFolderViewFolder::selectItem(); + +	deFreshify(); +} + +void LLInboxFolderViewFolder::toggleOpen() +{ +	LLFolderViewFolder::toggleOpen(); + +	deFreshify(); +} + +void LLInboxFolderViewFolder::setCreationDate(time_t creation_date_utc) +{  +	mCreationDate = creation_date_utc;  + +	if (mParentFolder == mRoot) +	{ +		computeFreshness(); +	} +} + +// +// LLInboxFolderViewItem Implementation +// + +BOOL LLInboxFolderViewItem::handleDoubleClick(S32 x, S32 y, MASK mask) +{ +	return TRUE; +}  // eof diff --git a/indra/newview/llpanelmarketplaceinboxinventory.h b/indra/newview/llpanelmarketplaceinboxinventory.h index 8f198c41c1..46eeb9ea7f 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.h +++ b/indra/newview/llpanelmarketplaceinboxinventory.h @@ -32,13 +32,16 @@  #include "llinventorypanel.h"  #include "llfolderviewitem.h" + +#define SUPPORTING_FRESH_ITEM_COUNT	1 + + +  class LLInboxInventoryPanel : public LLInventoryPanel  {  public:  	struct Params : public LLInitParam::Block<Params, LLInventoryPanel::Params> -	{ -		Params() {} -	}; +	{};  	LLInboxInventoryPanel(const Params& p);  	~LLInboxInventoryPanel(); @@ -47,7 +50,8 @@ public:  	void buildFolderView(const LLInventoryPanel::Params& params);  	// virtual -	class LLFolderViewFolder*	createFolderViewFolder(LLInvFVBridge * bridge); +	LLFolderViewFolder * createFolderViewFolder(LLInvFVBridge * bridge); +	LLFolderViewItem * createFolderViewItem(LLInvFVBridge * bridge);  }; @@ -66,12 +70,33 @@ public:  	LLInboxFolderViewFolder(const Params& p);  	~LLInboxFolderViewFolder(); -	 +  	void draw(); +	void computeFreshness(); +	void deFreshify(); + +	void selectItem(); +	void toggleOpen(); + +	bool isFresh() const { return mFresh; } +	  protected: -	bool	mFresh; +	void setCreationDate(time_t creation_date_utc); + +	bool mFresh;  }; +class LLInboxFolderViewItem : public LLFolderViewItem +{ +public: +	LLInboxFolderViewItem(const Params& p) +		: LLFolderViewItem(p) +	{ +	} + +	BOOL handleDoubleClick(S32 x, S32 y, MASK mask); +}; +  #endif //LL_INBOXINVENTORYPANEL_H diff --git a/indra/newview/llpanelmarketplaceoutbox.cpp b/indra/newview/llpanelmarketplaceoutbox.cpp index 74d0de3b30..12960fd0d6 100644 --- a/indra/newview/llpanelmarketplaceoutbox.cpp +++ b/indra/newview/llpanelmarketplaceoutbox.cpp @@ -27,18 +27,25 @@  #include "llviewerprecompiledheaders.h"  #include "llpanelmarketplaceoutbox.h" +#include "llpanelmarketplaceoutboxinventory.h"  #include "llappviewer.h"  #include "llbutton.h"  #include "llcoros.h"  #include "lleventcoro.h" +#include "llfloatersidepanelcontainer.h"  #include "llinventorypanel.h"  #include "llloadingindicator.h" +#include "llnotificationsutil.h"  #include "llpanelmarketplaceinbox.h" +#include "llsdutil.h"  #include "llsidepanelinventory.h" -#include "llsidetray.h"  #include "lltimer.h" - +#include "llviewernetwork.h" +#include "llagent.h" +#include "llviewermedia.h" +#include "llfolderview.h" +#include "llinventoryfunctions.h"  static LLRegisterPanelClassWrapper<LLPanelMarketplaceOutbox> t_panel_marketplace_outbox("panel_marketplace_outbox"); @@ -82,38 +89,25 @@ void LLPanelMarketplaceOutbox::handleLoginComplete()  void LLPanelMarketplaceOutbox::onFocusReceived()  { -	LLSidepanelInventory * sidepanel_inventory = LLSideTray::getInstance()->getPanel<LLSidepanelInventory>("sidepanel_inventory"); - +	LLSidepanelInventory * sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");  	if (sidepanel_inventory)  	{ -		LLInventoryPanel * inv_panel = sidepanel_inventory->getActivePanel(); - -		if (inv_panel) -		{ -			inv_panel->clearSelection(); -		} - -		LLInventoryPanel * inbox_panel = sidepanel_inventory->findChild<LLInventoryPanel>("inventory_inbox"); - -		if (inbox_panel) -		{ -			inbox_panel->clearSelection(); -		} -		 -		sidepanel_inventory->updateVerbs(); +		sidepanel_inventory->clearSelections(true, true, false);  	}  }  void LLPanelMarketplaceOutbox::onSelectionChange()  { -	LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(LLSideTray::getInstance()->getPanel("sidepanel_inventory")); -	 -	sidepanel_inventory->updateVerbs(); +	LLSidepanelInventory* sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory"); +	if (sidepanel_inventory) +	{ +		sidepanel_inventory->updateVerbs(); +	}  } -void LLPanelMarketplaceOutbox::setupInventoryPanel() +LLInventoryPanel * LLPanelMarketplaceOutbox::setupInventoryPanel()  { -	LLView * outbox_inventory_placeholder = getChild<LLView>("outbox_inventory_placeholder"); +	LLView * outbox_inventory_placeholder = getChild<LLView>("outbox_inventory_placeholder_panel");  	LLView * outbox_inventory_parent = outbox_inventory_placeholder->getParent();  	mInventoryPanel =  @@ -121,12 +115,17 @@ void LLPanelMarketplaceOutbox::setupInventoryPanel()  														  outbox_inventory_parent,  														  LLInventoryPanel::child_registry_t::instance()); +	llassert(mInventoryPanel); +	  	// Reshape the inventory to the proper size  	LLRect inventory_placeholder_rect = outbox_inventory_placeholder->getRect();  	mInventoryPanel->setShape(inventory_placeholder_rect); -	// Set the sort order newest to oldest, and a selection change callback +	// Set the sort order newest to oldest  	mInventoryPanel->setSortOrder(LLInventoryFilter::SO_DATE);	 +	mInventoryPanel->getFilter()->markDefault(); + +	// Set selection callback for proper update of inventory status buttons  	mInventoryPanel->setSelectCallback(boost::bind(&LLPanelMarketplaceOutbox::onSelectionChange, this));  	// Set up the note to display when the outbox is empty @@ -134,13 +133,34 @@ void LLPanelMarketplaceOutbox::setupInventoryPanel()  	// Hide the placeholder text  	outbox_inventory_placeholder->setVisible(FALSE); +	 +	return mInventoryPanel;  } -bool LLPanelMarketplaceOutbox::isOutboxEmpty() const +BOOL LLPanelMarketplaceOutbox::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, +								   EDragAndDropType cargo_type, +								   void* cargo_data, +								   EAcceptance* accept, +								   std::string& tooltip_msg)  { -	// TODO: Check for contents of outbox +	BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); + +	if (!handled && mInventoryPanel && mInventoryPanel->getRootFolder()) +	{ +		handled = mInventoryPanel->getRootFolder()->handleDragAndDropFromChild(mask,drop,cargo_type,cargo_data,accept,tooltip_msg); -	return false; +		if (handled) +		{ +			mInventoryPanel->getRootFolder()->setDragAndDropThisFrame(); +		} +	} + +	return handled; +} + +bool LLPanelMarketplaceOutbox::isOutboxEmpty() const +{ +	return (getTotalItemCount() == 0);  }  bool LLPanelMarketplaceOutbox::isSyncInProgress() const @@ -164,28 +184,119 @@ void timeDelay(LLCoros::self& self, LLPanelMarketplaceOutbox* outboxPanel)  		waitForEventOn(self, "mainloop");  	} -	outboxPanel->onSyncComplete(); +	outboxPanel->onSyncComplete(true, LLSD::emptyMap());  	gTimeDelayDebugFunc = "";  } -void LLPanelMarketplaceOutbox::onSyncButtonClicked() + +class LLInventorySyncResponder : public LLHTTPClient::Responder  { -	// TODO: Actually trigger sync to marketplace +public: +	LLInventorySyncResponder(LLPanelMarketplaceOutbox * outboxPanel) +		: LLCurl::Responder() +		, mOutboxPanel(outboxPanel) +	{ +	} + +	void completed(U32 status, const std::string& reason, const LLSD& content) +	{ +		llinfos << "inventory_import complete status: " << status << ", reason: " << reason << llendl; + +		if (isGoodStatus(status)) +		{ +			// Complete success +			llinfos << "success" << llendl; +		}	 +		else +		{ +			llwarns << "failed" << llendl; +		} + +		mOutboxPanel->onSyncComplete(isGoodStatus(status), content); +	} + +private: +	LLPanelMarketplaceOutbox *	mOutboxPanel; +}; +void LLPanelMarketplaceOutbox::onSyncButtonClicked() +{ +	// Get the sync animation going  	mSyncInProgress = true;  	updateSyncButtonStatus(); -	// Set a timer (for testing only) +	// Make the url for the inventory import request +	std::string url = "https://marketplace.secondlife.com/"; -    gTimeDelayDebugFunc = LLCoros::instance().launch("LLPanelMarketplaceOutbox timeDelay", boost::bind(&timeDelay, _1, this)); +	if (!LLGridManager::getInstance()->isInProductionGrid()) +	{ +		std::string gridLabel = LLGridManager::getInstance()->getGridLabel(); +		url = llformat("https://marketplace.%s.lindenlab.com/", utf8str_tolower(gridLabel).c_str()); + +		// TEMP for Jim's pdp +		//url = "http://pdp24.lindenlab.com:3000/"; +	} +	 +	url += "api/1/users/"; +	url += gAgent.getID().getString(); +	url += "/inventory_import"; + +	llinfos << "http get:  " << url << llendl; +	LLHTTPClient::get(url, new LLInventorySyncResponder(this), LLViewerMedia::getHeaders()); + +	// Set a timer (for testing only) +    //gTimeDelayDebugFunc = LLCoros::instance().launch("LLPanelMarketplaceOutbox timeDelay", boost::bind(&timeDelay, _1, this));  } -void LLPanelMarketplaceOutbox::onSyncComplete() +void LLPanelMarketplaceOutbox::onSyncComplete(bool goodStatus, const LLSD& content)  {  	mSyncInProgress = false; -  	updateSyncButtonStatus(); +	 +	const LLSD& errors_list = content["errors"]; + +	if (goodStatus && (errors_list.size() == 0)) +	{ +		LLNotificationsUtil::add("OutboxUploadComplete", LLSD::emptyMap(), LLSD::emptyMap()); +	} +	else +	{ +		LLNotificationsUtil::add("OutboxUploadHadErrors", LLSD::emptyMap(), LLSD::emptyMap()); +	} + +	llinfos << "Marketplace upload llsd:" << llendl; +	llinfos << ll_pretty_print_sd(content) << llendl; +	llinfos << llendl; + +	const LLSD& imported_list = content["imported"]; +	LLSD::array_const_iterator it = imported_list.beginArray(); +	for ( ; it != imported_list.endArray(); ++it) +	{ +		LLUUID imported_folder = (*it).asUUID(); +		llinfos << "Successfully uploaded folder " << imported_folder.asString() << " to marketplace." << llendl; +	} + +	for (it = errors_list.beginArray(); it != errors_list.endArray(); ++it) +	{ +		const LLSD& item_error_map = (*it); + +		LLUUID error_folder = item_error_map["folder_id"].asUUID(); +		const std::string& error_string = item_error_map["identifier"].asString(); +		LLUUID error_item = item_error_map["item_id"].asUUID(); +		const std::string& error_item_name = item_error_map["item_name"].asString(); +		const std::string& error_message = item_error_map["message"].asString(); + +		llinfos << "Error item " << error_folder.asString() << ", " << error_string << ", " +				<< error_item.asString() << ", " << error_item_name << ", " << error_message << llendl; +		 +		LLFolderViewFolder * item_folder = mInventoryPanel->getRootFolder()->getFolderByID(error_folder); +		LLOutboxFolderViewFolder * outbox_item_folder = dynamic_cast<LLOutboxFolderViewFolder *>(item_folder); + +		llassert(outbox_item_folder); + +		outbox_item_folder->setErrorString(error_string); +	}  }  void LLPanelMarketplaceOutbox::updateSyncButtonStatus() @@ -207,3 +318,46 @@ void LLPanelMarketplaceOutbox::updateSyncButtonStatus()  		mSyncButton->setEnabled(!isOutboxEmpty());  	}  } + +U32 LLPanelMarketplaceOutbox::getTotalItemCount() const +{ +	U32 item_count = 0; + +	if (mInventoryPanel) +	{ +		const LLFolderViewFolder * outbox_folder = mInventoryPanel->getRootFolder(); + +		if (outbox_folder) +		{ +			item_count += outbox_folder->getFoldersCount(); +		} +	} + +	return item_count; +} + +void LLPanelMarketplaceOutbox::draw() +{ +	const U32 item_count = getTotalItemCount(); +	const bool not_empty = (item_count > 0); + +	if (not_empty) +	{ +		std::string item_count_str = llformat("%d", item_count); + +		LLStringUtil::format_map_t args; +		args["[NUM]"] = item_count_str; +		getChild<LLButton>("outbox_btn")->setLabel(getString("OutboxLabelWithArg", args)); +	} +	else +	{ +		getChild<LLButton>("outbox_btn")->setLabel(getString("OutboxLabelNoArg")); +	} +	 +	if (!isSyncInProgress()) +	{ +		mSyncButton->setEnabled(not_empty); +	} +	 +	LLPanel::draw(); +} diff --git a/indra/newview/llpanelmarketplaceoutbox.h b/indra/newview/llpanelmarketplaceoutbox.h index 1b502127ef..c6b4a5abe2 100644 --- a/indra/newview/llpanelmarketplaceoutbox.h +++ b/indra/newview/llpanelmarketplaceoutbox.h @@ -40,9 +40,7 @@ class LLPanelMarketplaceOutbox : public LLPanel  public:  	struct Params :	public LLInitParam::Block<Params, LLPanel::Params> -	{ -		Params() {} -	}; +	{};  	LOG_CLASS(LLPanelMarketplaceOutbox); @@ -54,12 +52,22 @@ public:  	/*virtual*/ BOOL postBuild(); -	void setupInventoryPanel(); +	/*virtual*/ void draw(); + +	LLInventoryPanel * setupInventoryPanel(); + +	U32 getTotalItemCount() const;  	bool isOutboxEmpty() const;  	bool isSyncInProgress() const; -	void onSyncComplete(); +	void onSyncComplete(bool goodStatus, const LLSD& content); + +	/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, +								   EDragAndDropType cargo_type, +								   void* cargo_data, +								   EAcceptance* accept, +								   std::string& tooltip_msg);  protected:  	void onSyncButtonClicked(); diff --git a/indra/newview/llpanelmarketplaceoutboxinventory.cpp b/indra/newview/llpanelmarketplaceoutboxinventory.cpp new file mode 100644 index 0000000000..ed1206aec8 --- /dev/null +++ b/indra/newview/llpanelmarketplaceoutboxinventory.cpp @@ -0,0 +1,271 @@ +/**  + * @file llpanelmarketplaceoutboxinventory.cpp + * @brief LLOutboxInventoryPanel  class definition + * + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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 "llpanelmarketplaceoutboxinventory.h" + +#include "llfolderview.h" +#include "llfoldervieweventlistener.h" +#include "llinventorybridge.h" +#include "llinventoryfunctions.h" +#include "llpanellandmarks.h" +#include "llplacesinventorybridge.h" +#include "lltrans.h" +#include "llviewerfoldertype.h" + + +// +// statics +// + +static LLDefaultChildRegistry::Register<LLOutboxInventoryPanel> r1("outbox_inventory_panel"); +static LLDefaultChildRegistry::Register<LLOutboxFolderViewFolder> r2("outbox_folder_view_folder"); + + +// +// Marketplace errors +// + +enum +{ +	MKTERR_NONE = 0, + +	MKTERR_NOT_MERCHANT, +	MKTERR_FOLDER_EMPTY, +	MKTERR_UNASSOCIATED_PRODUCTS, +	MKTERR_OBJECT_LIMIT, +	MKTERR_FOLDER_DEPTH, +	MKTERR_UNSELLABLE_ITEM, +	MKTERR_INTERNAL_IMPORT, + +	MKTERR_COUNT +}; + +static const std::string MARKETPLACE_ERROR_STRINGS[MKTERR_COUNT] = +{ +	"NO_ERROR", +	"NOT_MERCHANT_ERROR", +	"FOLDER_EMPTY_ERROR", +	"UNASSOCIATED_PRODUCTS_ERROR", +	"OBJECT_LIMIT_ERROR", +	"FOLDER_DEPTH_ERROR", +	"UNSELLABLE_ITEM_FOUND", +	"INTERNAL_IMPORT_ERROR", +}; + +static const std::string MARKETPLACE_ERROR_NAMES[MKTERR_COUNT] = +{ +	"Marketplace Error None", +	"Marketplace Error Not Merchant", +	"Marketplace Error Empty Folder", +	"Marketplace Error Unassociated Products", +	"Marketplace Error Object Limit", +	"Marketplace Error Folder Depth", +	"Marketplace Error Unsellable Item", +	"Marketplace Error Internal Import", +}; + + +// +// LLOutboxInventoryPanel Implementation +// + +LLOutboxInventoryPanel::LLOutboxInventoryPanel(const LLOutboxInventoryPanel::Params& p) +	: LLInventoryPanel(p) +{ +} + +LLOutboxInventoryPanel::~LLOutboxInventoryPanel() +{ +} + +// virtual +void LLOutboxInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params) +{ +	// Determine the root folder in case specified, and +	// build the views starting with that folder. +	 +	LLUUID root_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false); +	 +	// leslie -- temporary HACK to work around sim not creating outbox with proper system folder type +	if (root_id.isNull()) +	{ +		std::string start_folder_name(params.start_folder()); +		 +		LLInventoryModel::cat_array_t* cats; +		LLInventoryModel::item_array_t* items; +		 +		gInventory.getDirectDescendentsOf(gInventory.getRootFolderID(), cats, items); +		 +		if (cats) +		{ +			for (LLInventoryModel::cat_array_t::const_iterator cat_it = cats->begin(); cat_it != cats->end(); ++cat_it) +			{ +				LLInventoryCategory* cat = *cat_it; +				 +				if (cat->getName() == start_folder_name) +				{ +					root_id = cat->getUUID(); +					break; +				} +			} +		} +		 +		if (root_id == LLUUID::null) +		{ +			llwarns << "No category found that matches outbox inventory panel start_folder: " << start_folder_name << llendl; +		} +	} +	// leslie -- end temporary HACK +	 +	if (root_id == LLUUID::null) +	{ +		llwarns << "Outbox inventory panel has no root folder!" << llendl; +		root_id = LLUUID::generateNewID(); +	} +	 +	LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_CATEGORY, +																	LLAssetType::AT_CATEGORY, +																	LLInventoryType::IT_CATEGORY, +																	this, +																	NULL, +																	root_id); +	 +	mFolderRoot = createFolderView(new_listener, params.use_label_suffix()); +} + +LLFolderViewFolder * LLOutboxInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge) +{ +	LLOutboxFolderViewFolder::Params params; +	 +	params.name = bridge->getDisplayName(); +	params.icon = bridge->getIcon(); +	params.icon_open = bridge->getOpenIcon(); +	 +	if (mShowItemLinkOverlays) // if false, then links show up just like normal items +	{ +		params.icon_overlay = LLUI::getUIImage("Inv_Link"); +	} +	 +	params.root = mFolderRoot; +	params.listener = bridge; +	params.tool_tip = params.name; +	 +	return LLUICtrlFactory::create<LLOutboxFolderViewFolder>(params); +} + +LLFolderViewItem * LLOutboxInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge) +{ +	LLFolderViewItem::Params params; + +	params.name = bridge->getDisplayName(); +	params.icon = bridge->getIcon(); +	params.icon_open = bridge->getOpenIcon(); + +	if (mShowItemLinkOverlays) // if false, then links show up just like normal items +	{ +		params.icon_overlay = LLUI::getUIImage("Inv_Link"); +	} + +	params.creation_date = bridge->getCreationDate(); +	params.root = mFolderRoot; +	params.listener = bridge; +	params.rect = LLRect (0, 0, 0, 0); +	params.tool_tip = params.name; + +	return LLUICtrlFactory::create<LLOutboxFolderViewItem>(params); +} + +// +// LLOutboxFolderViewFolder Implementation +// + +LLOutboxFolderViewFolder::LLOutboxFolderViewFolder(const Params& p) +	: LLFolderViewFolder(p) +	, LLBadgeOwner(getHandle()) +	, mError(0) +{ +	initBadgeParams(p.error_badge()); +} + +LLOutboxFolderViewFolder::~LLOutboxFolderViewFolder() +{ +} + +// virtual +void LLOutboxFolderViewFolder::draw() +{ +	if (!badgeHasParent()) +	{ +		addBadgeToParentPanel(); +	} +	 +	setBadgeVisibility(hasError()); + +	LLFolderViewFolder::draw(); +} + +void LLOutboxFolderViewFolder::setErrorString(const std::string& errorString) +{ +	S32 error_code = MKTERR_NONE; + +	for (S32 i = 1; i < MKTERR_COUNT; ++i) +	{ +		if (MARKETPLACE_ERROR_STRINGS[i] == errorString) +		{ +			error_code = i; +			break; +		} +	} + +	setError(error_code); +} + +void LLOutboxFolderViewFolder::setError(S32 errorCode) +{ +	mError = errorCode; + +	if (hasError()) +	{ +		setToolTip(LLTrans::getString(MARKETPLACE_ERROR_NAMES[mError])); +	} +	else +	{ +		setToolTip(LLStringExplicit("")); +	} +} + +// +// LLOutboxFolderViewItem Implementation +// + +BOOL LLOutboxFolderViewItem::handleDoubleClick(S32 x, S32 y, MASK mask) +{ +	return TRUE; +} + +// eof diff --git a/indra/newview/llpanelmarketplaceoutboxinventory.h b/indra/newview/llpanelmarketplaceoutboxinventory.h new file mode 100644 index 0000000000..346680a79d --- /dev/null +++ b/indra/newview/llpanelmarketplaceoutboxinventory.h @@ -0,0 +1,97 @@ +/**  + * @file llpanelmarketplaceoutboxinventory.h + * @brief LLOutboxInventoryPanel class declaration + * + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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_OUTBOXINVENTORYPANEL_H +#define LL_OUTBOXINVENTORYPANEL_H + + +#include "llbadgeowner.h" +#include "llinventorypanel.h" +#include "llfolderviewitem.h" + + +class LLOutboxInventoryPanel : public LLInventoryPanel +{ +public: +	struct Params : public LLInitParam::Block<Params, LLInventoryPanel::Params> +	{ +		Params() {} +	}; +	 +	LLOutboxInventoryPanel(const Params& p); +	~LLOutboxInventoryPanel(); + +	// virtual +	void buildFolderView(const LLInventoryPanel::Params& params); + +	// virtual +	LLFolderViewFolder *	createFolderViewFolder(LLInvFVBridge * bridge); +	LLFolderViewItem *		createFolderViewItem(LLInvFVBridge * bridge); +}; + + +class LLOutboxFolderViewFolder : public LLFolderViewFolder, public LLBadgeOwner +{ +public: +	struct Params : public LLInitParam::Block<Params, LLFolderViewFolder::Params> +	{ +		Optional<LLBadge::Params>	error_badge; +		 +		Params() +			: error_badge("error_badge") +		{ +		} +	}; +	 +	LLOutboxFolderViewFolder(const Params& p); +	~LLOutboxFolderViewFolder(); + +	void draw(); + +	void setErrorString(const std::string& errorString); +	void setError(S32 errorCode); +	 +	bool hasError() const { return (mError != 0); } + +protected: +	S32 mError; +}; + + +class LLOutboxFolderViewItem : public LLFolderViewItem +{ +public: +	LLOutboxFolderViewItem(const Params& p) +		: LLFolderViewItem(p) +	{ +	} + +	// virtual +	BOOL handleDoubleClick(S32 x, S32 y, MASK mask); +}; + + +#endif //LL_OUTBOXINVENTORYPANEL_H diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp index 1347a02a52..7e47a96f44 100644 --- a/indra/newview/llpanelme.cpp +++ b/indra/newview/llpanelme.cpp @@ -37,7 +37,6 @@  #include "llfirstuse.h"  #include "llfloaterreg.h"  #include "llhints.h" -#include "llsidetray.h"  #include "llviewercontrol.h"  #include "llviewerdisplayname.h" @@ -73,59 +72,6 @@ BOOL LLPanelMe::postBuild()  void LLPanelMe::onOpen(const LLSD& key)  {  	LLPanelProfile::onOpen(key); - -	// Removed this action as per SOCIAL-431 The first time a new resident opens the profile tab  -	//                                       in the sidebar, they see the old profile editing panel -	// -	//// Force Edit My Profile if this is the first time when user is opening Me Panel (EXT-5068) -	//bool opened = gSavedSettings.getBOOL("MePanelOpened"); -	//// In some cases Side Tray my call onOpen() twice, check getCollapsed() to be sure this -	//// is the last time onOpen() is called -	//if( !opened && !LLSideTray::getInstance()->getCollapsed() ) -	//{ -	//	buildEditPanel(); -	//	openPanel(mEditPanel, getAvatarId()); -	//	gSavedSettings.setBOOL("MePanelOpened", true); -	//} -} - -bool LLPanelMe::notifyChildren(const LLSD& info) -{ -	if (info.has("task-panel-action") && info["task-panel-action"].asString() == "handle-tri-state") -	{ -		// Implement task panel tri-state behavior. -		// -		// When the button of an active open task panel is clicked, side tray -		// calls notifyChildren() on the panel, passing task-panel-action=>handle-tri-state as an argument. -		// The task panel is supposed to handle this by reverting to the default view, -		// i.e. closing any dependent panels like "pick info" or "profile edit". - -		bool on_default_view = true; - -		const LLRect& task_panel_rect = getRect(); -		for (LLView* child = getFirstChild(); child; child = findNextSibling(child)) -		{ -			LLPanel* panel = dynamic_cast<LLPanel*>(child); -			if (!panel) -				continue; - -			// *HACK: implement panel stack instead (e.g. me->pick_info->pick_edit). -			if (panel->getRect().getWidth()  == task_panel_rect.getWidth()  && -				panel->getRect().getHeight() == task_panel_rect.getHeight() && -				panel->getVisible()) -			{ -				panel->setVisible(FALSE); -				on_default_view = false; -			} -		} -		 -		if (on_default_view) -			LLSideTray::getInstance()->collapseSideBar(); - -		return true; // this notification is only supposed to be handled by task panels  -	} - -	return LLPanel::notifyChildren(info);  }  void LLPanelMe::buildEditPanel() @@ -138,7 +84,7 @@ void LLPanelMe::buildEditPanel()  		//       All profile editing should go through the web.  		//mEditPanel->childSetAction("save_btn", boost::bind(&LLPanelMe::onSaveChangesClicked, this), this); -		mEditPanel->childSetAction("cancel_btn", boost::bind(&LLPanelMe::onCancelClicked, this), this); +		//mEditPanel->childSetAction("cancel_btn", boost::bind(&LLPanelMe::onCancelClicked, this), this);  	}  } @@ -146,12 +92,6 @@ void LLPanelMe::buildEditPanel()  void LLPanelMe::onEditProfileClicked()  {  	buildEditPanel(); -	togglePanel(mEditPanel, getAvatarId()); // open -} - -void LLPanelMe::onCancelClicked() -{ -	togglePanel(mEditPanel); // close  }  ////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelme.h b/indra/newview/llpanelme.h index f27f5a268e..b0f5d184cc 100644 --- a/indra/newview/llpanelme.h +++ b/indra/newview/llpanelme.h @@ -49,7 +49,6 @@ public:  	LLPanelMe();  	/*virtual*/ void onOpen(const LLSD& key); -	/*virtual*/ bool notifyChildren(const LLSD& info);  	/*virtual*/ BOOL postBuild(); @@ -58,7 +57,6 @@ private:  	void buildEditPanel();  	void onEditProfileClicked(); -	void onCancelClicked();  	LLPanelMyProfileEdit *  mEditPanel; diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index c222bbb191..1f77e7a602 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -1112,7 +1112,16 @@ void LLPanelObject::getState( )  			if (mCtrlSculptType)  			{ -				mCtrlSculptType->setCurrentByIndex(sculpt_stitching); +				if (sculpt_stitching == LL_SCULPT_TYPE_NONE) +				{ +					// since 'None' is no longer an option in the combo box +					// use 'Plane' as an equivalent sculpt type +					mCtrlSculptType->setSelectedByValue(LLSD(LL_SCULPT_TYPE_PLANE), true); +				} +				else +				{ +					mCtrlSculptType->setSelectedByValue(LLSD(sculpt_stitching), true); +				}  				mCtrlSculptType->setEnabled(editable && !isMesh);  			} @@ -1749,7 +1758,7 @@ void LLPanelObject::sendSculpt()  	U8 sculpt_type = 0;  	if (mCtrlSculptType) -		sculpt_type |= mCtrlSculptType->getCurrentIndex(); +		sculpt_type |= mCtrlSculptType->getValue().asInteger();  	bool enabled = sculpt_type != LL_SCULPT_TYPE_MESH; diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index e3b61f695a..98ea680504 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -57,7 +57,6 @@  #include "llpreviewtexture.h"  #include "llscrollcontainer.h"  #include "llselectmgr.h" -#include "llsidetray.h"  #include "llstatusbar.h"  #include "lltooldraganddrop.h"  #include "lltrans.h" @@ -83,6 +82,7 @@ protected:  	LLAssetType::EType mAssetType;	  	LLInventoryType::EType mInventoryType; +	LLInventoryObject* findInvObject() const;  	LLInventoryItem* findItem() const;  public: @@ -139,7 +139,8 @@ public:  	virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const;  	virtual BOOL dragOrDrop(MASK mask, BOOL drop,  							EDragAndDropType cargo_type, -							void* cargo_data); +							void* cargo_data, +							std::string& tooltip_msg);  };  LLTaskInvFVBridge::LLTaskInvFVBridge( @@ -162,16 +163,22 @@ LLTaskInvFVBridge::LLTaskInvFVBridge(  	}  } -LLInventoryItem* LLTaskInvFVBridge::findItem() const +LLInventoryObject* LLTaskInvFVBridge::findInvObject() const  {  	LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); -	if(object) +	if (object)  	{ -		return dynamic_cast<LLInventoryItem*>(object->getInventoryObject(mUUID)); +		return object->getInventoryObject(mUUID);  	}  	return NULL;  } + +LLInventoryItem* LLTaskInvFVBridge::findItem() const +{ +	return dynamic_cast<LLInventoryItem*>(findInvObject()); +} +  void LLTaskInvFVBridge::showProperties()  {  	show_task_item_profile(mUUID, mPanel->getTaskUUID()); @@ -295,21 +302,15 @@ const std::string& LLTaskInvFVBridge::getDisplayName() const  	if(item)  	{ -		if(item->getParentUUID().isNull()) -		{ -			if(item->getName() == "Contents") -			{ -				mDisplayName.assign(LLTrans::getString("ViewerObjectContents")); -			} -			else -			{ -				mDisplayName.assign(item->getName()); -			} -		} -		else +		mDisplayName.assign(item->getName()); + +		// Localize "New Script", "New Script 1", "New Script 2", etc. +		if (item->getType() == LLAssetType::AT_LSL_TEXT && +			LLStringUtil::startsWith(item->getName(), "New Script"))  		{ -			mDisplayName.assign(item->getName()); +			LLStringUtil::replaceString(mDisplayName, "New Script", LLTrans::getString("PanelContentsNewScript"));  		} +  		const LLPermissions& perm(item->getPermissions());  		BOOL copy = gAgent.allowOperation(PERM_COPY, perm, GP_OBJECT_MANIPULATE);  		BOOL mod  = gAgent.allowOperation(PERM_MODIFY, perm, GP_OBJECT_MANIPULATE); @@ -580,7 +581,8 @@ BOOL LLTaskInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const  BOOL LLTaskInvFVBridge::dragOrDrop(MASK mask, BOOL drop,  								   EDragAndDropType cargo_type, -								   void* cargo_data) +								   void* cargo_data, +								   std::string& tooltip_msg)  {  	//llinfos << "LLTaskInvFVBridge::dragOrDrop()" << llendl;  	return FALSE; @@ -700,7 +702,7 @@ public:  		const std::string& name);  	virtual LLUIImagePtr getIcon() const; -	virtual const std::string& getDisplayName() const { return getName(); } +	virtual const std::string& getDisplayName() const;  	virtual BOOL isItemRenameable() const;  	// virtual BOOL isItemCopyable() const { return FALSE; }  	virtual BOOL renameItem(const std::string& new_name); @@ -710,7 +712,8 @@ public:  	virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const;  	virtual BOOL dragOrDrop(MASK mask, BOOL drop,  							EDragAndDropType cargo_type, -							void* cargo_data); +							void* cargo_data, +							std::string& tooltip_msg);  	virtual BOOL canOpenItem() const { return TRUE; }  	virtual void openItem();  }; @@ -728,6 +731,27 @@ LLUIImagePtr LLTaskCategoryBridge::getIcon() const  	return LLUI::getUIImage("Inv_FolderClosed");  } +// virtual +const std::string& LLTaskCategoryBridge::getDisplayName() const +{ +	LLInventoryObject* cat = findInvObject(); + +	if (cat) +	{ +		// Localize "Contents" folder. +		if (cat->getParentUUID().isNull() && cat->getName() == "Contents") +		{ +			mDisplayName.assign(LLTrans::getString("ViewerObjectContents")); +		} +		else +		{ +			mDisplayName.assign(cat->getName()); +		} +	} + +	return mDisplayName; +} +  BOOL LLTaskCategoryBridge::isItemRenameable() const  {  	return FALSE; @@ -783,7 +807,8 @@ BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id) const  BOOL LLTaskCategoryBridge::dragOrDrop(MASK mask, BOOL drop,  									  EDragAndDropType cargo_type, -									  void* cargo_data) +									  void* cargo_data, +									  std::string& tooltip_msg)  {  	//llinfos << "LLTaskCategoryBridge::dragOrDrop()" << llendl;  	BOOL accept = FALSE; diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index a90f864ae2..f90236f6f2 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -31,6 +31,7 @@  #include "llnotificationsutil.h"  #include "lltabcontainer.h" +#include "llfloatersidepanelcontainer.h"  #include "llinventoryfunctions.h"  #include "llinventorymodelbackgroundfetch.h"  #include "llagentwearables.h" @@ -40,7 +41,6 @@  #include "llpanelwearing.h"  #include "llsaveoutfitcombobtn.h"  #include "llsidepanelappearance.h" -#include "llsidetray.h"  #include "llviewerfoldertype.h"  static const std::string OUTFITS_TAB_NAME = "outfitslist_tab"; @@ -222,7 +222,7 @@ void LLPanelOutfitsInventory::onSave()  //static  LLPanelOutfitsInventory* LLPanelOutfitsInventory::findInstance()  { -	return dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory")); +	return dynamic_cast<LLPanelOutfitsInventory*>(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfits_inventory"));  }  ////////////////////////////////////////////////////////////////////////////////// @@ -319,8 +319,7 @@ void LLPanelOutfitsInventory::onWearablesLoading()  // static  LLSidepanelAppearance* LLPanelOutfitsInventory::getAppearanceSP()  { -	static LLSidepanelAppearance* panel_appearance = -		dynamic_cast<LLSidepanelAppearance*> -		(LLSideTray::getInstance()->getPanel("sidepanel_appearance")); +	LLSidepanelAppearance* panel_appearance = +		dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance"));  	return panel_appearance;  } diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index e3a7b749ea..d5e289e6e6 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -29,6 +29,7 @@  // libs  #include "llavatarname.h"  #include "llfloaterreg.h" +#include "llfloatersidepanelcontainer.h"  #include "llmenubutton.h"  #include "llmenugl.h"  #include "llnotificationsutil.h" @@ -56,7 +57,6 @@  #include "llinventoryobserver.h"  #include "llnetmap.h"  #include "llpanelpeoplemenus.h" -#include "llsidetray.h"  #include "llsidetraypanelcontainer.h"  #include "llrecentpeople.h"  #include "llviewercontrol.h"		// for gSavedSettings @@ -526,11 +526,11 @@ LLPanelPeople::~LLPanelPeople()  		LLVoiceClient::getInstance()->removeObserver(this);  	} -	LLView::deleteViewByHandle(mGroupPlusMenuHandle); -	LLView::deleteViewByHandle(mNearbyViewSortMenuHandle); -	LLView::deleteViewByHandle(mFriendsViewSortMenuHandle); -	LLView::deleteViewByHandle(mGroupsViewSortMenuHandle); -	LLView::deleteViewByHandle(mRecentViewSortMenuHandle); +	delete mGroupPlusMenuHandle.get(); +	delete mNearbyViewSortMenuHandle.get(); +	delete mFriendsViewSortMenuHandle.get(); +	delete mGroupsViewSortMenuHandle.get(); +	delete mRecentViewSortMenuHandle.get();  } @@ -1283,6 +1283,10 @@ void LLPanelPeople::onFriendsViewSortMenuItemClicked(const LLSD& userdata)  		mAllFriendList->showPermissions(show_permissions);  		mOnlineFriendList->showPermissions(show_permissions);  	} +	else if (chosen_item == "panel_block_list_sidetray") +	{ +		LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD()); +	}  }  void LLPanelPeople::onGroupsViewSortMenuItemClicked(const LLSD& userdata) @@ -1315,6 +1319,10 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata)  	{  		setSortOrder(mNearbyList, E_SORT_BY_DISTANCE);  	} +	else if (chosen_item == "panel_block_list_sidetray") +	{ +		LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD()); +	}  }  bool LLPanelPeople::onNearbyViewSortMenuItemCheck(const LLSD& userdata) @@ -1348,6 +1356,10 @@ void LLPanelPeople::onRecentViewSortMenuItemClicked(const LLSD& userdata)  	{  		mRecentList->toggleIcons();  	} +	else if (chosen_item == "panel_block_list_sidetray") +	{ +		LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD()); +	}  }  bool LLPanelPeople::onFriendsViewSortMenuItemCheck(const LLSD& userdata)  @@ -1439,7 +1451,7 @@ bool LLPanelPeople::notifyChildren(const LLSD& info)  			container->onOpen(LLSD().with(LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME, getName()));  		}  		else -			LLSideTray::getInstance()->collapseSideBar(); +			LLFloaterReg::hideInstance("people");  		return true; // this notification is only supposed to be handled by task panels  	} diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index ddce83c616..72c6be4c79 100755 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -35,6 +35,7 @@  #include "lldispatcher.h"  #include "llflatlistview.h"  #include "llfloaterreg.h" +#include "llfloatersidepanelcontainer.h"  #include "llfloaterworldmap.h"  #include "llnotificationsutil.h"  #include "lltexturectrl.h" @@ -48,11 +49,11 @@  #include "llaccordionctrl.h"  #include "llaccordionctrltab.h"  #include "llavatarpropertiesprocessor.h" +#include "llfloatersidepanelcontainer.h"  #include "llpanelavatar.h"  #include "llpanelprofile.h"  #include "llpanelpick.h"  #include "llpanelclassified.h" -#include "llsidetray.h"  static const std::string XML_BTN_NEW = "new_btn";  static const std::string XML_BTN_DELETE = "trash_btn"; @@ -133,7 +134,7 @@ public:  		params["id"] = gAgent.getID();  		params["open_tab_name"] = "panel_picks";  		params["show_tab_panel"] = "create_pick"; -		LLSideTray::getInstance()->showPanel("panel_me", params); +		LLFloaterSidePanelContainer::showPanel("my_profile", params);  	}  	void editPick(LLPickData* pick_info) @@ -146,8 +147,7 @@ public:  		params["snapshot_id"] = pick_info->snapshot_id;  		params["pick_name"] = pick_info->name;  		params["pick_desc"] = pick_info->desc; -		 -		LLSideTray::getInstance()->showPanel("panel_me", params); +		LLFloaterSidePanelContainer::showPanel("my_profile", params);  	}  	/*virtual*/ void processProperties(void* data, EAvatarProcessorType type) @@ -252,7 +252,7 @@ public:  		params["id"] = gAgent.getID();  		params["open_tab_name"] = "panel_picks";  		params["show_tab_panel"] = "create_classified"; -		LLSideTray::getInstance()->showPanel("panel_me", params); +		LLFloaterSidePanelContainer::showPanel("my_profile", params);  	}  	void openClassified(LLAvatarClassifiedInfo* c_info) @@ -270,7 +270,7 @@ public:  			params["classified_name"] = c_info->name;  			params["classified_desc"] = c_info->description;  			params["from_search"] = true; -			LLSideTray::getInstance()->showPanel("panel_profile_view", params); +			LLFloaterSidePanelContainer::showPanel("people", "panel_profile_view", params);  		}  		else if (mRequestVerb == "edit")  		{ @@ -283,7 +283,7 @@ public:  				params["open_tab_name"] = "panel_picks";  				params["show_tab_panel"] = "edit_classified";  				params["classified_id"] = c_info->classified_id; -				LLSideTray::getInstance()->showPanel("panel_me", params); +				LLFloaterSidePanelContainer::showPanel("my_profile", params);  			}  			else  			{ diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index 1e9ce58237..ce8057eead 100644 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -32,6 +32,7 @@  #include "llparcel.h"  #include "message.h" +#include "llexpandabletextbox.h"  #include "lliconctrl.h"  #include "lllineeditor.h"  #include "lltextbox.h" @@ -227,6 +228,34 @@ void LLPanelPlaceProfile::setInfoType(EInfoType type)  	getChild<LLAccordionCtrl>("advanced_info_accordion")->setVisible(is_info_type_agent); +	// If we came from search we want larger description area, approx. 10 lines (see STORM-1311). +	// Don't use the maximum available space because that leads to nasty artifacts +	// in text editor and expandable text box. +	{ +		const S32 SEARCH_DESC_HEIGHT = 150; + +		// Remember original geometry (once). +		static const S32 sOrigDescVPad = getChildView("parcel_title")->getRect().mBottom - mDescEditor->getRect().mTop; +		static const S32 sOrigDescHeight = mDescEditor->getRect().getHeight(); +		static const S32 sOrigMRIconVPad = mDescEditor->getRect().mBottom - mMaturityRatingIcon->getRect().mTop; +		static const S32 sOrigMRTextVPad = mDescEditor->getRect().mBottom - mMaturityRatingText->getRect().mTop; + +		// Resize the description. +		const S32 desc_height = is_info_type_agent ? sOrigDescHeight : SEARCH_DESC_HEIGHT; +		const S32 desc_top = getChildView("parcel_title")->getRect().mBottom - sOrigDescVPad; +		LLRect desc_rect = mDescEditor->getRect(); +		desc_rect.setOriginAndSize(desc_rect.mLeft, desc_top - desc_height, desc_rect.getWidth(), desc_height); +		mDescEditor->reshape(desc_rect.getWidth(), desc_rect.getHeight()); +		mDescEditor->setRect(desc_rect); +		mDescEditor->updateTextShape(); + +		// Move the maturity rating icon/text accordingly. +		const S32 mr_icon_bottom = mDescEditor->getRect().mBottom - sOrigMRIconVPad - mMaturityRatingIcon->getRect().getHeight(); +		const S32 mr_text_bottom = mDescEditor->getRect().mBottom - sOrigMRTextVPad - mMaturityRatingText->getRect().getHeight(); +		mMaturityRatingIcon->setOrigin(mMaturityRatingIcon->getRect().mLeft, mr_icon_bottom); +		mMaturityRatingText->setOrigin(mMaturityRatingText->getRect().mLeft, mr_text_bottom); +	} +  	switch(type)  	{  		case AGENT: @@ -434,7 +463,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,  	}  	mRegionNameText->setText(region->getName()); -	mRegionTypeText->setText(region->getSimProductName()); +	mRegionTypeText->setText(region->getLocalizedSimProductName());  	// Determine parcel owner  	if (parcel->isPublic()) diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 1e510a2d7b..7f8f9b29af 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -39,6 +39,7 @@  #include "llfiltereditor.h"  #include "llfirstuse.h"  #include "llfloaterreg.h" +#include "llfloatersidepanelcontainer.h"  #include "llmenubutton.h"  #include "llnotificationsutil.h"  #include "lltabcontainer.h" @@ -64,7 +65,6 @@  #include "llpanelplaceprofile.h"  #include "llpanelteleporthistory.h"  #include "llremoteparcelrequest.h" -#include "llsidetray.h"  #include "llteleporthistorystorage.h"  #include "lltoggleablemenu.h"  #include "llviewerinventory.h" @@ -115,7 +115,7 @@ public:  				LLSD key;  				key["type"] = "remote_place";  				key["id"] = parcel_id; -				LLSideTray::getInstance()->showPanel("panel_places", key); +				LLFloaterSidePanelContainer::showPanel("places", key);  				return true;  			}  		} @@ -151,18 +151,16 @@ class LLPlacesInventoryObserver : public LLInventoryAddedObserver  {  public:  	LLPlacesInventoryObserver(LLPanelPlaces* places_panel) : -		mPlaces(places_panel), -		mTabsCreated(false) +		mPlaces(places_panel)  	{}  	/*virtual*/ void changed(U32 mask)  	{  		LLInventoryAddedObserver::changed(mask); -		if (!mTabsCreated && mPlaces) +		if (mPlaces && !mPlaces->tabsCreated())  		{  			mPlaces->createTabs(); -			mTabsCreated = true;  		}  	} @@ -175,7 +173,6 @@ protected:  private:  	LLPanelPlaces*		mPlaces; -	bool				mTabsCreated;  };  class LLPlacesRemoteParcelInfoObserver : public LLRemoteParcelInfoObserver @@ -244,7 +241,8 @@ LLPanelPlaces::LLPanelPlaces()  		mPlaceMenu(NULL),  		mLandmarkMenu(NULL),  		mPosGlobal(), -		isLandmarkEditModeOn(false) +		isLandmarkEditModeOn(false), +		mTabsCreated(false)  {  	mParcelObserver = new LLPlacesParcelObserver(this);  	mInventoryObserver = new LLPlacesInventoryObserver(this); @@ -252,7 +250,7 @@ LLPanelPlaces::LLPanelPlaces()  	gInventory.addObserver(mInventoryObserver); -	LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback( +	mAgentParcelChangedConnection = LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(  			boost::bind(&LLPanelPlaces::updateVerbs, this));  	//buildFromFile( "panel_places.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() @@ -268,6 +266,11 @@ LLPanelPlaces::~LLPanelPlaces()  	delete mInventoryObserver;  	delete mParcelObserver;  	delete mRemoteParcelObserver; + +	if (mAgentParcelChangedConnection.connected()) +	{ +		mAgentParcelChangedConnection.disconnect(); +	}  }  BOOL LLPanelPlaces::postBuild() @@ -349,6 +352,9 @@ BOOL LLPanelPlaces::postBuild()  	LLComboBox* folder_combo = mLandmarkInfo->getChild<LLComboBox>("folder_combo");  	folder_combo->setCommitCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this)); +	createTabs(); +	updateVerbs(); +  	return TRUE;  } @@ -1025,7 +1031,7 @@ void LLPanelPlaces::changedParcelSelection()  void LLPanelPlaces::createTabs()  { -	if (!(gInventory.isInventoryUsable() && LLTeleportHistory::getInstance())) +	if (!(gInventory.isInventoryUsable() && LLTeleportHistory::getInstance() && !mTabsCreated))  		return;  	LLLandmarksPanel* landmarks_panel = new LLLandmarksPanel(); @@ -1059,6 +1065,8 @@ void LLPanelPlaces::createTabs()  	// Filter applied to show all items.  	if (mActivePanel)  		mActivePanel->onSearchEdit(mActivePanel->getFilterSubString()); + +	mTabsCreated = true;  }  void LLPanelPlaces::changedGlobalPos(const LLVector3d &global_pos) diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h index b335f88a48..85bdc2c4e1 100644 --- a/indra/newview/llpanelplaces.h +++ b/indra/newview/llpanelplaces.h @@ -77,6 +77,8 @@ public:  	std::string getPlaceInfoType() { return mPlaceInfoType; } +	bool tabsCreated() { return mTabsCreated;} +  	/*virtual*/ S32 notifyParent(const LLSD& info);  private: @@ -146,7 +148,12 @@ private:  	bool						isLandmarkEditModeOn; +	// Holds info whether "My Landmarks" and "Teleport History" tabs have been created. +	bool						mTabsCreated; +  	LLSafeHandle<LLParcelSelection>	mParcel; + +	boost::signals2::connection mAgentParcelChangedConnection;  };  #endif //LL_LLPANELPLACES_H diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index fd5c3362bb..5ce59d8959 100755 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -72,7 +72,7 @@ public:  		std::string agent_name = params[0];  		llinfos << "Profile, agent_name " << agent_name << llendl;  		std::string url = getProfileURL(agent_name); -		LLWeb::loadWebURLInternal(url); +		LLWeb::loadURLInternal(url);  		return true;  	} @@ -261,7 +261,6 @@ void LLPanelProfile::ChildStack::dump()  LLPanelProfile::LLPanelProfile()   : LLPanel() - , mTabCtrl(NULL)   , mAvatarId(LLUUID::null)  {  	mChildStack.setParent(this); @@ -269,10 +268,6 @@ LLPanelProfile::LLPanelProfile()  BOOL LLPanelProfile::postBuild()  { -	mTabCtrl = getChild<LLTabContainer>("tabs"); - -	getTabCtrl()->setCommitCallback(boost::bind(&LLPanelProfile::onTabSelected, this, _2)); -  	LLPanelPicks* panel_picks = findChild<LLPanelPicks>(PANEL_PICKS);  	panel_picks->setProfilePanel(this); @@ -293,18 +288,7 @@ void LLPanelProfile::reshape(S32 width, S32 height, BOOL called_from_parent)  void LLPanelProfile::onOpen(const LLSD& key)  { -	// open the desired panel -	if (key.has("open_tab_name")) -	{ -		getTabContainer()[PANEL_PICKS]->onClosePanel(); - -		// onOpen from selected panel will be called from onTabSelected callback -		getTabCtrl()->selectTabByName(key["open_tab_name"]); -	} -	else -	{ -		getTabCtrl()->getCurrentPanel()->onOpen(getAvatarId()); -	} +	getTabContainer()[PANEL_PICKS]->onOpen(getAvatarId());  	// support commands to open further pieces of UI  	if (key.has("show_tab_panel")) @@ -362,23 +346,6 @@ void LLPanelProfile::onOpen(const LLSD& key)  	}  } -void LLPanelProfile::togglePanel(LLPanel* panel, const LLSD& key) -{ -	// TRUE - we need to open/expand "panel" -	bool expand = getChildList()->front() != panel;  // mTabCtrl->getVisible(); - -	if (expand) -	{ -		openPanel(panel, key); -	} -	else  -	{ -		closePanel(panel); - -		getTabCtrl()->getCurrentPanel()->onOpen(getAvatarId()); -	} -} -  void LLPanelProfile::onTabSelected(const LLSD& param)  {  	std::string tab_name = param.asString(); diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h index fca359f51e..bd4457c240 100755 --- a/indra/newview/llpanelprofile.h +++ b/indra/newview/llpanelprofile.h @@ -46,8 +46,6 @@ public:  	/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);  	/*virtual*/ void onOpen(const LLSD& key); -	virtual void togglePanel(LLPanel*, const LLSD& key = LLSD()); -  	virtual void openPanel(LLPanel* panel, const LLSD& params);  	virtual void closePanel(LLPanel* panel); @@ -60,8 +58,6 @@ protected:  	virtual void onTabSelected(const LLSD& param); -	LLTabContainer* getTabCtrl() { return mTabCtrl; } -  	const LLUUID& getAvatarId() { return mAvatarId; }  	void setAvatarId(const LLUUID& avatar_id) { mAvatarId = avatar_id; } @@ -97,7 +93,6 @@ private:  	};  	//-- ChildStack ends ------------------------------------------------------ -	LLTabContainer* mTabCtrl;	  	profile_tabs_t mTabContainer;  	ChildStack		mChildStack;  	LLUUID mAvatarId; diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 9b35e78134..79171dbcb9 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -31,7 +31,6 @@  #include "llfloaterworldmap.h"  #include "llpanelteleporthistory.h" -#include "llsidetray.h"  #include "llworldmap.h"  #include "llteleporthistorystorage.h"  #include "lltextutil.h" @@ -39,6 +38,7 @@  #include "llaccordionctrl.h"  #include "llaccordionctrltab.h"  #include "llflatlistview.h" +#include "llfloatersidepanelcontainer.h"  #include "llnotificationsutil.h"  #include "lltextbox.h"  #include "lltoggleablemenu.h" @@ -221,7 +221,7 @@ void LLTeleportHistoryFlatItem::showPlaceInfoPanel(S32 index)  	params["id"] = index;  	params["type"] = "teleport_history"; -	LLSideTray::getInstance()->showPanel("panel_places", params); +	LLFloaterSidePanelContainer::showPanel("places", params);  }  void LLTeleportHistoryFlatItem::onProfileBtnClick() @@ -388,7 +388,7 @@ LLTeleportHistoryPanel::LLTeleportHistoryPanel()  LLTeleportHistoryPanel::~LLTeleportHistoryPanel()  {  	LLTeleportHistoryFlatItemStorage::instance().purge(); -	LLView::deleteViewByHandle(mGearMenuHandle); +	delete mGearMenuHandle.get();  }  BOOL LLTeleportHistoryPanel::postBuild() @@ -396,7 +396,7 @@ BOOL LLTeleportHistoryPanel::postBuild()  	mTeleportHistory = LLTeleportHistoryStorage::getInstance();  	if (mTeleportHistory)  	{ -		mTeleportHistory->setHistoryChangedCallback(boost::bind(&LLTeleportHistoryPanel::onTeleportHistoryChange, this, _1)); +		mTeleportHistoryChangedConnection = mTeleportHistory->setHistoryChangedCallback(boost::bind(&LLTeleportHistoryPanel::onTeleportHistoryChange, this, _1));  	}  	mHistoryAccordion = getChild<LLAccordionCtrl>("history_accordion"); diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h index 3d29454d15..47b607a2f4 100644 --- a/indra/newview/llpanelteleporthistory.h +++ b/indra/newview/llpanelteleporthistory.h @@ -119,6 +119,8 @@ private:  	LLContextMenu*			mAccordionTabMenu;  	LLHandle<LLView>		mGearMenuHandle;  	LLMenuButton*			mMenuGearButton; + +	boost::signals2::connection mTeleportHistoryChangedConnection;  }; diff --git a/indra/newview/llpaneltopinfobar.cpp b/indra/newview/llpaneltopinfobar.cpp index 7087541fc8..5ed23d2f42 100644 --- a/indra/newview/llpaneltopinfobar.cpp +++ b/indra/newview/llpaneltopinfobar.cpp @@ -31,11 +31,11 @@  #include "llagent.h"  #include "llagentui.h"  #include "llclipboard.h" +#include "llfloatersidepanelcontainer.h"  #include "lllandmarkactions.h"  #include "lllocationinputctrl.h"  #include "llnotificationsutil.h"  #include "llparcel.h" -#include "llsidetray.h"  #include "llslurl.h"  #include "llstatusbar.h"  #include "lltrans.h" @@ -436,12 +436,11 @@ void LLPanelTopInfoBar::onContextMenuItemClicked(const LLSD::String& item)  		if(landmark == NULL)  		{ -			LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark")); +			LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));  		}  		else  		{ -			LLSideTray::getInstance()->showPanel("panel_places", -					LLSD().with("type", "landmark").with("id",landmark->getUUID())); +			LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "landmark").with("id",landmark->getUUID()));  		}  	}  	else if (item == "copy") @@ -456,5 +455,5 @@ void LLPanelTopInfoBar::onContextMenuItemClicked(const LLSD::String& item)  void LLPanelTopInfoBar::onInfoButtonClicked()  { -	LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent")); +	LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "agent"));  } diff --git a/indra/newview/llpaneltopinfobar.h b/indra/newview/llpaneltopinfobar.h index 583e91d15e..e934b522be 100644 --- a/indra/newview/llpaneltopinfobar.h +++ b/indra/newview/llpaneltopinfobar.h @@ -148,7 +148,7 @@ private:  	void setParcelInfoText(const std::string& new_text);  	/** -	 *  Implementation of LLDestroyClass<LLSideTray> +	 *  Implementation of LLDestroyClass<T>  	 */  	static void destroyClass()  	{ diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp index 4a80bbbe5e..6be2ea6481 100644 --- a/indra/newview/llpanelvoicedevicesettings.cpp +++ b/indra/newview/llpanelvoicedevicesettings.cpp @@ -41,6 +41,7 @@  static LLRegisterPanelClassWrapper<LLPanelVoiceDeviceSettings> t_panel_group_general("panel_voice_device_settings"); +static const std::string DEFAULT_DEVICE("Default");  LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings() @@ -68,10 +69,17 @@ BOOL LLPanelVoiceDeviceSettings::postBuild()  	// set mic volume tuning slider based on last mic volume setting  	volume_slider->setValue(mMicVolume); -	getChild<LLComboBox>("voice_input_device")->setCommitCallback( +	mCtrlInputDevices = getChild<LLComboBox>("voice_input_device"); +	mCtrlOutputDevices = getChild<LLComboBox>("voice_output_device"); + +	mCtrlInputDevices->setCommitCallback(  		boost::bind(&LLPanelVoiceDeviceSettings::onCommitInputDevice, this)); -	getChild<LLComboBox>("voice_output_device")->setCommitCallback( +	mCtrlOutputDevices->setCommitCallback(  		boost::bind(&LLPanelVoiceDeviceSettings::onCommitOutputDevice, this)); + +	mLocalizedDeviceNames[DEFAULT_DEVICE]				= getString("default_text"); +	mLocalizedDeviceNames["No Device"]					= getString("name_no_device"); +	mLocalizedDeviceNames["Default System Device"]		= getString("name_default_system_device");  	return TRUE;  } @@ -138,14 +146,14 @@ void LLPanelVoiceDeviceSettings::apply()  	std::string s;  	if(mCtrlInputDevices)  	{ -		s = mCtrlInputDevices->getSimple(); +		s = mCtrlInputDevices->getValue().asString();  		gSavedSettings.setString("VoiceInputAudioDevice", s);  		mInputDevice = s;  	}  	if(mCtrlOutputDevices)  	{ -		s = mCtrlOutputDevices->getSimple(); +		s = mCtrlOutputDevices->getValue().asString();  		gSavedSettings.setString("VoiceOutputAudioDevice", s);  		mOutputDevice = s;  	} @@ -166,10 +174,10 @@ void LLPanelVoiceDeviceSettings::cancel()  	gSavedSettings.setString("VoiceOutputAudioDevice", mOutputDevice);  	if(mCtrlInputDevices) -		mCtrlInputDevices->setSimple(mInputDevice); +		mCtrlInputDevices->setValue(mInputDevice);  	if(mCtrlOutputDevices) -		mCtrlOutputDevices->setSimple(mOutputDevice); +		mCtrlOutputDevices->setValue(mOutputDevice);  	gSavedSettings.setF32("AudioLevelMic", mMicVolume);  	LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider"); @@ -188,9 +196,6 @@ void LLPanelVoiceDeviceSettings::refresh()  	LLVoiceClient::getInstance()->tuningSetMicVolume(current_volume);  	// Fill in popup menus -	mCtrlInputDevices = getChild<LLComboBox>("voice_input_device"); -	mCtrlOutputDevices = getChild<LLComboBox>("voice_output_device"); -  	bool device_settings_available = LLVoiceClient::getInstance()->deviceSettingsAvailable();  	if (mCtrlInputDevices) @@ -212,14 +217,14 @@ void LLPanelVoiceDeviceSettings::refresh()  		if(mCtrlInputDevices)  		{  			mCtrlInputDevices->removeall(); -			mCtrlInputDevices->add( mInputDevice, ADD_BOTTOM ); -			mCtrlInputDevices->setSimple(mInputDevice); +			mCtrlInputDevices->add(getLocalizedDeviceName(mInputDevice), mInputDevice, ADD_BOTTOM); +			mCtrlInputDevices->setValue(mInputDevice);  		}  		if(mCtrlOutputDevices)  		{  			mCtrlOutputDevices->removeall(); -			mCtrlOutputDevices->add( mOutputDevice, ADD_BOTTOM ); -			mCtrlOutputDevices->setSimple(mOutputDevice); +			mCtrlOutputDevices->add(getLocalizedDeviceName(mOutputDevice), mOutputDevice, ADD_BOTTOM); +			mCtrlOutputDevices->setValue(mOutputDevice);  		}  		mDevicesUpdated = FALSE;  	} @@ -230,35 +235,41 @@ void LLPanelVoiceDeviceSettings::refresh()  		if(mCtrlInputDevices)  		{  			mCtrlInputDevices->removeall(); -			mCtrlInputDevices->add( getString("default_text"), ADD_BOTTOM ); +			mCtrlInputDevices->add(getLocalizedDeviceName(DEFAULT_DEVICE), DEFAULT_DEVICE, ADD_BOTTOM);  			for(iter=LLVoiceClient::getInstance()->getCaptureDevices().begin();   				iter != LLVoiceClient::getInstance()->getCaptureDevices().end();  				iter++)  			{ -				mCtrlInputDevices->add( *iter, ADD_BOTTOM ); +				mCtrlInputDevices->add(getLocalizedDeviceName(*iter), *iter, ADD_BOTTOM);  			} -			if(!mCtrlInputDevices->setSimple(mInputDevice)) +			// Fix invalid input audio device preference. +			if (!mCtrlInputDevices->setSelectedByValue(mInputDevice, TRUE))  			{ -				mCtrlInputDevices->setSimple(getString("default_text")); +				mCtrlInputDevices->setValue(DEFAULT_DEVICE); +				gSavedSettings.setString("VoiceInputAudioDevice", DEFAULT_DEVICE); +				mInputDevice = DEFAULT_DEVICE;  			}  		}  		if(mCtrlOutputDevices)  		{  			mCtrlOutputDevices->removeall(); -			mCtrlOutputDevices->add( getString("default_text"), ADD_BOTTOM ); +			mCtrlOutputDevices->add(getLocalizedDeviceName(DEFAULT_DEVICE), DEFAULT_DEVICE, ADD_BOTTOM);  			for(iter= LLVoiceClient::getInstance()->getRenderDevices().begin();   				iter !=  LLVoiceClient::getInstance()->getRenderDevices().end(); iter++)  			{ -				mCtrlOutputDevices->add( *iter, ADD_BOTTOM ); +				mCtrlOutputDevices->add(getLocalizedDeviceName(*iter), *iter, ADD_BOTTOM);  			} -			if(!mCtrlOutputDevices->setSimple(mOutputDevice)) +			// Fix invalid output audio device preference. +			if (!mCtrlOutputDevices->setSelectedByValue(mOutputDevice, TRUE))  			{ -				mCtrlOutputDevices->setSimple(getString("default_text")); +				mCtrlOutputDevices->setValue(DEFAULT_DEVICE); +				gSavedSettings.setString("VoiceOutputAudioDevice", DEFAULT_DEVICE); +				mOutputDevice = DEFAULT_DEVICE;  			}  		}  		mDevicesUpdated = TRUE; @@ -292,12 +303,19 @@ void LLPanelVoiceDeviceSettings::cleanup()  	}  } +// returns English name if no translation found +std::string LLPanelVoiceDeviceSettings::getLocalizedDeviceName(const std::string& en_dev_name) +{ +	std::map<std::string, std::string>::const_iterator it = mLocalizedDeviceNames.find(en_dev_name); +	return it != mLocalizedDeviceNames.end() ? it->second : en_dev_name; +} +  void LLPanelVoiceDeviceSettings::onCommitInputDevice()  {  	if(LLVoiceClient::getInstance())  	{  		LLVoiceClient::getInstance()->setCaptureDevice( -			getChild<LLComboBox>("voice_input_device")->getValue().asString()); +			mCtrlInputDevices->getValue().asString());  	}  } @@ -306,6 +324,6 @@ void LLPanelVoiceDeviceSettings::onCommitOutputDevice()  	if(LLVoiceClient::getInstance())  	{  		LLVoiceClient::getInstance()->setRenderDevice( -			getChild<LLComboBox>("voice_output_device")->getValue().asString()); +			mCtrlInputDevices->getValue().asString());  	}  } diff --git a/indra/newview/llpanelvoicedevicesettings.h b/indra/newview/llpanelvoicedevicesettings.h index d09476d469..ba3bcad0dc 100644 --- a/indra/newview/llpanelvoicedevicesettings.h +++ b/indra/newview/llpanelvoicedevicesettings.h @@ -49,6 +49,8 @@ public:  	void setUseTuningMode(bool use) { mUseTuningMode = use; };  protected: +	std::string getLocalizedDeviceName(const std::string& en_dev_name); +  	void onCommitInputDevice();  	void onCommitOutputDevice(); @@ -59,6 +61,7 @@ protected:  	class LLComboBox		*mCtrlOutputDevices;  	BOOL mDevicesUpdated;  	bool mUseTuningMode; +	std::map<std::string, std::string> mLocalizedDeviceNames;  };  #endif // LL_LLPANELVOICEDEVICESETTINGS_H diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index bb87601d20..12eea7844d 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -351,7 +351,7 @@ void LLPanelVolume::getState( )  	getChild<LLUICtrl>("Flexible1D Checkbox Ctrl")->setValue(is_flexible);  	if (is_flexible || (volobjp && volobjp->canBeFlexible()))  	{ -		getChildView("Flexible1D Checkbox Ctrl")->setEnabled(editable && single_volume && volobjp); +		getChildView("Flexible1D Checkbox Ctrl")->setEnabled(editable && single_volume && volobjp && !volobjp->isMesh());  	}  	else  	{ diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp index f19b54c1d4..e2801c09bd 100644 --- a/indra/newview/llpanelwearing.cpp +++ b/indra/newview/llpanelwearing.cpp @@ -31,11 +31,11 @@  #include "lltoggleablemenu.h"  #include "llappearancemgr.h" +#include "llfloatersidepanelcontainer.h"  #include "llinventoryfunctions.h"  #include "llinventorymodel.h"  #include "llinventoryobserver.h"  #include "llmenubutton.h" -#include "llsidetray.h"  #include "llviewermenu.h"  #include "llwearableitemslist.h"  #include "llsdserialize.h" @@ -44,7 +44,7 @@  // Context menu and Gear menu helper.  static void edit_outfit()  { -	LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit")); +	LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit"));  }  ////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 54053cf89f..fb1153980a 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -798,11 +798,19 @@ void LLParticipantList::LLParticipantListMenu::toggleMuteVoice(const LLSD& userd  bool LLParticipantList::LLParticipantListMenu::isGroupModerator()  { -	// Agent is in Group Call +	if (!mParent.mSpeakerMgr) +	{ +		llwarns << "Speaker manager is missing" << llendl; +		return false; +	} + +	// Is session a group call/chat?  	if(gAgent.isInGroup(mParent.mSpeakerMgr->getSessionID()))  	{ -		// Agent is Moderator -		return mParent.mSpeakerMgr->findSpeaker(gAgentID)->mIsModerator; +		LLSpeaker* speaker = mParent.mSpeakerMgr->findSpeaker(gAgentID).get(); + +		// Is agent a moderator? +		return speaker && speaker->mIsModerator;  	}  	return false;  } diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp index a90f23d637..119fc95cf0 100644 --- a/indra/newview/llpreview.cpp +++ b/indra/newview/llpreview.cpp @@ -444,18 +444,15 @@ void LLPreview::handleReshape(const LLRect& new_rect, bool by_user)  LLMultiPreview::LLMultiPreview()  	: LLMultiFloater(LLSD())  { -	// *TODO: There should be a .xml file for this -	const LLRect& nextrect = LLFloaterReg::getFloaterRect("preview"); // place where the next preview should show up -	if (nextrect.getWidth() > 0) -	{ -		setRect(nextrect); -	} -	else +	// start with a rect in the top-left corner ; will get resized +	LLRect rect; +	rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 200, 400); +	setRect(rect); + +	LLFloater* last_floater = LLFloaterReg::getLastFloaterInGroup("preview"); +	if (last_floater)  	{ -		// start with a rect in the top-left corner ; will get resized -		LLRect rect; -		rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 200, 400); -		setRect(rect); +		stackWith(*last_floater);  	}  	setTitle(LLTrans::getString("MultiPreviewTitle"));  	buildTabContainer(); diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index 028891a90e..a1f38f1854 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -50,6 +50,7 @@  #include "llappviewer.h"  #include "llweb.h"  #include "lluictrlfactory.h" +#include "llpanellogin.h"  LLProgressView* LLProgressView::sInstance = NULL; @@ -66,7 +67,9 @@ LLProgressView::LLProgressView()  	mMediaCtrl( NULL ),  	mMouseDownInActiveArea( false ),  	mUpdateEvents("LLProgressView"), -	mFadeToWorldTimer() +	mFadeToWorldTimer(), +	mFadeFromLoginTimer(), +	mStartupComplete(false)  {  	mUpdateEvents.listen("self", boost::bind(&LLProgressView::handleUpdate, this, _1));  } @@ -79,10 +82,13 @@ BOOL LLProgressView::postBuild()  	mMediaCtrl = getChild<LLMediaCtrl>("login_media_panel");  	mMediaCtrl->setVisible( false );		// hidden initially  	mMediaCtrl->addObserver( this );		// watch events +	 +	LLViewerMedia::setOnlyAudibleMediaTextureID(mMediaCtrl->getTextureID());  	mCancelBtn = getChild<LLButton>("cancel_btn");  	mCancelBtn->setClickedCallback(  LLProgressView::onCancelButtonClicked, NULL );  	mFadeToWorldTimer.stop(); +	mFadeFromLoginTimer.stop();  	getChild<LLTextBox>("title_text")->setText(LLStringExplicit(LLAppViewer::instance()->getSecondLifeTitle())); @@ -130,18 +136,34 @@ void LLProgressView::revealIntroPanel()  	// if user hasn't yet seen intro video  	std::string intro_url = gSavedSettings.getString("PostFirstLoginIntroURL");  	if ( intro_url.length() > 0 &&  +			gSavedSettings.getBOOL("BrowserJavascriptEnabled") &&  			gSavedSettings.getBOOL("PostFirstLoginIntroViewed" ) == FALSE )  	{ +		// hide the progress bar +		getChild<LLView>("stack1")->setVisible(false); +		  		// navigate to intro URL and reveal widget   		mMediaCtrl->navigateTo( intro_url );	  		mMediaCtrl->setVisible( TRUE ); +  		// flag as having seen the new user post login intro  		gSavedSettings.setBOOL("PostFirstLoginIntroViewed", TRUE ); + +		mMediaCtrl->setFocus(TRUE);  	} -	else + +	mFadeFromLoginTimer.start(); +} + +void LLProgressView::setStartupComplete() +{ +	mStartupComplete = true; + +	// if we are not showing a video, fade into world +	if (!mMediaCtrl->getVisible())  	{ -		// start the timer that will control the fade through to the world view  +		mFadeFromLoginTimer.stop();  		mFadeToWorldTimer.start();  	}  } @@ -162,17 +184,15 @@ void LLProgressView::setVisible(BOOL visible)  	}   } -void LLProgressView::draw() -{ -	static LLTimer timer; -	// Paint bitmap if we've got one +void LLProgressView::drawStartTexture(F32 alpha) +{  	glPushMatrix();	  	if (gStartTexture)  	{  		LLGLSUIDefault gls_ui;  		gGL.getTexUnit(0)->bind(gStartTexture.get()); -		gGL.color4f(1.f, 1.f, 1.f, 1.f); +		gGL.color4f(1.f, 1.f, 1.f, alpha);  		F32 image_aspect = (F32)gStartImageWidth / (F32)gStartImageHeight;  		S32 width = getRect().getWidth();  		S32 height = getRect().getHeight(); @@ -198,6 +218,33 @@ void LLProgressView::draw()  		gl_rect_2d(getRect());  	}  	glPopMatrix(); +} + + +void LLProgressView::draw() +{ +	static LLTimer timer; + +	if (mFadeFromLoginTimer.getStarted()) +	{ +		F32 alpha = clamp_rescale(mFadeFromLoginTimer.getElapsedTimeF32(), 0.f, FADE_TO_WORLD_TIME, 0.f, 1.f); +		LLViewDrawContext context(alpha); + +		if (!mMediaCtrl->getVisible()) +		{ +			drawStartTexture(alpha); +		} +		 +		LLPanel::draw(); + +		if (mFadeFromLoginTimer.getElapsedTimeF32() > FADE_TO_WORLD_TIME ) +		{ +			mFadeFromLoginTimer.stop(); +			LLPanelLogin::closePanel(); +		} + +		return; +	}  	// handle fade out to world view when we're asked to  	if (mFadeToWorldTimer.getStarted()) @@ -205,6 +252,8 @@ void LLProgressView::draw()  		// draw fading panel  		F32 alpha = clamp_rescale(mFadeToWorldTimer.getElapsedTimeF32(), 0.f, FADE_TO_WORLD_TIME, 1.f, 0.f);  		LLViewDrawContext context(alpha); +				 +		drawStartTexture(alpha);  		LLPanel::draw();  		// faded out completely - remove panel and reveal world @@ -212,6 +261,8 @@ void LLProgressView::draw()  		{  			mFadeToWorldTimer.stop(); +			LLViewerMedia::setOnlyAudibleMediaTextureID(LLUUID::null); +  			// Fade is complete, release focus  			gFocusMgr.releaseFocusIfNeeded( this ); @@ -235,6 +286,7 @@ void LLProgressView::draw()  		return;  	} +	drawStartTexture(1.0f);  	// draw children  	LLPanel::draw();  } @@ -349,9 +401,26 @@ bool LLProgressView::onAlertModal(const LLSD& notify)  void LLProgressView::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)  { +	// the intro web content calls javascript::window.close() when it's done  	if( event == MEDIA_EVENT_CLOSE_REQUEST )  	{ -		// the intro web content calls javascript::window.close() when it's done -		mFadeToWorldTimer.start(); +		if (mStartupComplete) +		{ +			//make sure other timer has stopped +			mFadeFromLoginTimer.stop(); +			mFadeToWorldTimer.start(); +		} +		else +		{ +			// hide the media ctrl and wait for startup to be completed before fading to world +			mMediaCtrl->setVisible(false); +			if (mMediaCtrl->getMediaPlugin()) +			{ +				mMediaCtrl->getMediaPlugin()->stop(); +			} + +			// show the progress bar +			getChild<LLView>("stack1")->setVisible(true); +		}  	}  } diff --git a/indra/newview/llprogressview.h b/indra/newview/llprogressview.h index 73dd478e98..fac00ad04d 100644 --- a/indra/newview/llprogressview.h +++ b/indra/newview/llprogressview.h @@ -48,6 +48,7 @@ public:  	BOOL postBuild();  	/*virtual*/ void draw(); +	void drawStartTexture(F32 alpha);  	/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);  	/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask); @@ -65,6 +66,8 @@ public:  	// turns on (under certain circumstances) the into video after login  	void revealIntroPanel(); +	void setStartupComplete(); +  	void setCancelButtonVisible(BOOL b, const std::string& label);  	static void onCancelButtonClicked( void* ); @@ -82,8 +85,10 @@ protected:  	std::string mMessage;  	LLButton*	mCancelBtn;  	LLFrameTimer mFadeToWorldTimer; +	LLFrameTimer mFadeFromLoginTimer;  	LLRect mOutlineRect;  	bool mMouseDownInActiveArea; +	bool mStartupComplete;  	// The LLEventStream mUpdateEvents depends upon this class being a singleton  	// to avoid pump name conflicts. diff --git a/indra/newview/llsceneview.cpp b/indra/newview/llsceneview.cpp index 8e8fc9dd25..09e799e4f7 100644 --- a/indra/newview/llsceneview.cpp +++ b/indra/newview/llsceneview.cpp @@ -83,6 +83,9 @@ void LLSceneView::draw()  	S32 total_visible_triangles[] = {0, 0};  	S32 total_triangles[] = {0, 0}; +	S32 total_visible_bytes[] = {0, 0}; +	S32 total_bytes[] = {0, 0}; +  	//streaming cost  	std::vector<F32> streaming_cost[2];  	F32 total_streaming[] = { 0.f, 0.f }; @@ -122,13 +125,19 @@ void LLSceneView::draw()  				visible_triangles[idx].push_back(visible);  				triangles[idx].push_back(high_triangles); -				F32 streaming = object->getStreamingCost(); +				S32 bytes = 0; +				S32 visible_bytes = 0; + +				F32 streaming = object->getStreamingCost(&bytes, &visible_bytes);  				total_streaming[idx] += streaming;  				streaming_cost[idx].push_back(streaming);  				F32 physics = object->getPhysicsCost();  				total_physics[idx] += physics;  				physics_cost[idx].push_back(physics); + +				total_bytes[idx] += bytes; +				total_visible_bytes[idx] += visible_bytes;  			}  		}  	} @@ -279,8 +288,8 @@ void LLSceneView::draw()  				total_visible += tri_count;	  			} -			std::string label = llformat("%s Object Triangle Counts (Ktris) -- [%.2f, %.2f] Mean: %.2f  Median: %.2f  Visible: %.2f/%.2f", -											category[idx], tri_domain[0]/1024.f, tri_domain[1]/1024.f, (total/count)/1024.f, triangles[idx][count/2]/1024.f, total_visible_triangles[idx]/1024.f, total_triangles[idx]/1024.f); +			std::string label = llformat("%s Object Triangle Counts (Ktris) -- Visible: %.2f/%.2f (%.2f KB Visible)", +				category[idx], total_visible_triangles[idx]/1024.f, total_triangles[idx]/1024.f, total_visible_bytes[idx]/1024.f);  			LLFontGL::getFontMonospace()->renderUTF8(label,  											0 , tri_rect.mLeft, tri_rect.mTop+margin, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP); diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index e3bc67a414..45cf81751b 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -41,7 +41,7 @@  #include "llsyswellwindow.h"  #include "llimfloater.h"  #include "llscriptfloater.h" -#include "llsidetray.h" +#include "llrootview.h"  #include <algorithm> @@ -49,28 +49,49 @@ using namespace LLNotificationsUI;  bool LLScreenChannel::mWasStartUpToastShown = false; +LLFastTimer::DeclareTimer FTM_GET_CHANNEL_RECT("Calculate Notification Channel Region"); +LLRect LLScreenChannelBase::getChannelRect() +{ +	LLFastTimer _(FTM_GET_CHANNEL_RECT); +	LLRect channel_rect; +	LLRect chiclet_rect; +	LLView* floater_snap_region = gViewerWindow->getRootView()->getChildView("floater_snap_region"); +	floater_snap_region->localRectToScreen(floater_snap_region->getLocalRect(), &channel_rect); + +	LLView* chiclet_region = gViewerWindow->getRootView()->getChildView("chiclet_container"); +	chiclet_region->localRectToScreen(chiclet_region->getLocalRect(), &chiclet_rect); + +	channel_rect.mTop = chiclet_rect.mBottom; +	return channel_rect; +} + +  //--------------------------------------------------------------------------  //////////////////////  // LLScreenChannelBase  ////////////////////// -LLScreenChannelBase::LLScreenChannelBase(const LLUUID& id) : -												mToastAlignment(NA_BOTTOM) -												,mCanStoreToasts(true) -												,mHiddenToastsNum(0) -												,mHoveredToast(NULL) -												,mControlHovering(false) -												,mShowToasts(true) +LLScreenChannelBase::LLScreenChannelBase(const Params& p)  +:	LLUICtrl(p), +	mToastAlignment(p.toast_align), +	mCanStoreToasts(true), +	mHiddenToastsNum(0), +	mHoveredToast(NULL), +	mControlHovering(false), +	mShowToasts(true), +	mID(p.id), +	mDisplayToastsAlways(p.display_toasts_always), +	mChannelAlignment(p.channel_align)  {	 -	mID = id; -	mWorldViewRectConnection = gViewerWindow->setOnWorldViewRectUpdated(boost::bind(&LLScreenChannelBase::updatePositionAndSize, this, _1, _2)); +	mID = p.id;  	setMouseOpaque( false );  	setVisible(FALSE);  } -LLScreenChannelBase::~LLScreenChannelBase() + +void LLScreenChannelBase::reshape(S32 width, S32 height, BOOL called_from_parent)  { -	mWorldViewRectConnection.disconnect(); +	redrawToasts();  }  bool  LLScreenChannelBase::isHovering() @@ -83,38 +104,20 @@ bool  LLScreenChannelBase::isHovering()  	return mHoveredToast->isHovered();  } -void LLScreenChannelBase::resetPositionAndSize() -{ -	LLRect rc = gViewerWindow->getWorldViewRectScaled(); -	updatePositionAndSize(rc, rc); -} - -void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect) +void LLScreenChannelBase::updatePositionAndSize(LLRect rect)  { -	/* -	take sidetray into account - screenchannel should not overlap sidetray -	*/ -	S32 world_rect_padding = 0; -	if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE -		&& LLSideTray::instanceCreated	()) -	{ -		world_rect_padding += LLSideTray::getInstance()->getVisibleWidth(); -	} - - -	S32 top_delta = old_world_rect.mTop - new_world_rect.mTop;  	LLRect this_rect = getRect(); -	this_rect.mTop -= top_delta; +	this_rect.mTop = rect.mTop;  	switch(mChannelAlignment)  	{  	case CA_LEFT :  		break;  	case CA_CENTRE : -		this_rect.setCenterAndSize( (new_world_rect.getWidth() - world_rect_padding) / 2, new_world_rect.getHeight() / 2, this_rect.getWidth(), this_rect.getHeight()); +		this_rect.setCenterAndSize( (rect.getWidth()) / 2, rect.getHeight() / 2, this_rect.getWidth(), this_rect.getHeight());  		break;  	case CA_RIGHT : -		this_rect.setLeftTopAndSize(new_world_rect.mRight - world_rect_padding - this_rect.getWidth(), +		this_rect.setLeftTopAndSize(rect.mRight - this_rect.getWidth(),  			this_rect.mTop,  			this_rect.getWidth(),  			this_rect.getHeight()); @@ -126,45 +129,38 @@ void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect ne  void LLScreenChannelBase::init(S32 channel_left, S32 channel_right)  { -	if(LLSideTray::instanceCreated()) -	{ -		LLSideTray*	side_bar = LLSideTray::getInstance(); -		side_bar->setVisibleWidthChangeCallback(boost::bind(&LLScreenChannelBase::resetPositionAndSize, this)); -	} - -	// top and bottom set by updateBottom() +	// top and bottom set by updateRect()  	setRect(LLRect(channel_left, 0, channel_right, 0)); -	updateBottom(); +	updateRect();  	setVisible(TRUE);  } -void	LLScreenChannelBase::updateBottom() +void	LLScreenChannelBase::updateRect()  { -	S32 channel_top = gViewerWindow->getWorldViewRectScaled().getHeight(); -	S32 channel_bottom = gSavedSettings.getS32("ChannelBottomPanelMargin"); +	S32 channel_top = getChannelRect().mTop; +	S32 channel_bottom = getChannelRect().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");  	S32 channel_left = getRect().mLeft;  	S32 channel_right = getRect().mRight;  	setRect(LLRect(channel_left, channel_top, channel_right, channel_bottom));  } -  //--------------------------------------------------------------------------  //////////////////////  // LLScreenChannel  //////////////////////  //-------------------------------------------------------------------------- -LLScreenChannel::LLScreenChannel(LLUUID& id):	 -LLScreenChannelBase(id) -,mStartUpToastPanel(NULL) -{	 +LLScreenChannel::LLScreenChannel(const Params& p) +:	LLScreenChannelBase(p), +	mStartUpToastPanel(NULL) +{  }  //--------------------------------------------------------------------------  void LLScreenChannel::init(S32 channel_left, S32 channel_right)  {  	LLScreenChannelBase::init(channel_left, channel_right); -	LLRect world_rect = gViewerWindow->getWorldViewRectScaled(); -	updatePositionAndSize(world_rect, world_rect); +	LLRect channel_rect = getChannelRect(); +	updatePositionAndSize(channel_rect);  }  //-------------------------------------------------------------------------- @@ -201,19 +197,8 @@ std::list<LLToast*> LLScreenChannel::findToasts(const Matcher& matcher)  }  //-------------------------------------------------------------------------- -void LLScreenChannel::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect) +void LLScreenChannel::updatePositionAndSize(LLRect new_world_rect)  { -	/* -	take sidetray into account - screenchannel should not overlap sidetray -	*/ -	S32 world_rect_padding = 0; -	if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE  -		&& LLSideTray::instanceCreated	()) -	{ -		world_rect_padding += LLSideTray::getInstance()->getVisibleWidth(); -	} - -  	LLRect this_rect = getRect();  	switch(mChannelAlignment) @@ -222,11 +207,11 @@ void LLScreenChannel::updatePositionAndSize(LLRect old_world_rect, LLRect new_wo  		this_rect.mTop = (S32) (new_world_rect.getHeight() * getHeightRatio());  		break;  	case CA_CENTRE : -		LLScreenChannelBase::updatePositionAndSize(old_world_rect, new_world_rect); +		LLScreenChannelBase::updatePositionAndSize(new_world_rect);  		return;  	case CA_RIGHT :  		this_rect.mTop = (S32) (new_world_rect.getHeight() * getHeightRatio()); -		this_rect.setLeftTopAndSize(new_world_rect.mRight - world_rect_padding - this_rect.getWidth(), +		this_rect.setLeftTopAndSize(new_world_rect.mRight - this_rect.getWidth(),  			this_rect.mTop,  			this_rect.getWidth(),  			this_rect.getHeight()); @@ -488,6 +473,15 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)  //--------------------------------------------------------------------------  void LLScreenChannel::redrawToasts()  { +	LLView* floater_snap_region = gViewerWindow->getRootView()->getChildView("floater_snap_region"); + +	if (!getParent()) +	{ +		// connect to floater snap region just to get resize events, we don't care about being a proper widget  +		floater_snap_region->addChild(this); +		setFollows(FOLLOWS_ALL); +	} +  	if(mToastList.size() == 0)  		return; @@ -514,7 +508,7 @@ void LLScreenChannel::showToastsBottom()  	S32		toast_margin = 0;  	std::vector<ToastElem>::reverse_iterator it; -	updateBottom(); +	updateRect();  	LLDockableFloater* floater = dynamic_cast<LLDockableFloater*>(LLDockableFloater::getInstanceHandle().get()); @@ -546,9 +540,9 @@ void LLScreenChannel::showToastsBottom()  				(*it).toast->translate(0, shift);  			} -			LLRect world_rect = gViewerWindow->getWorldViewRectScaled(); +			LLRect channel_rect = getChannelRect();  			// don't show toasts if there is not enough space -			if(toast_rect.mTop > world_rect.mTop) +			if(toast_rect.mTop > channel_rect.mTop)  			{  				break;  			} @@ -619,6 +613,96 @@ void LLScreenChannel::showToastsCentre()  //--------------------------------------------------------------------------  void LLScreenChannel::showToastsTop()  { +	LLRect channel_rect = getChannelRect(); + +	LLRect	toast_rect;	 +	S32		top = channel_rect.mTop; +	S32		toast_margin = 0; +	std::vector<ToastElem>::reverse_iterator it; + +	updateRect(); + +	LLDockableFloater* floater = dynamic_cast<LLDockableFloater*>(LLDockableFloater::getInstanceHandle().get()); + +	for(it = mToastList.rbegin(); it != mToastList.rend(); ++it) +	{ +		if(it != mToastList.rbegin()) +		{ +			LLToast* toast = (*(it-1)).toast; +			top = toast->getRect().mBottom - toast->getTopPad(); +			toast_margin = gSavedSettings.getS32("ToastGap"); +		} + +		toast_rect = (*it).toast->getRect(); +		toast_rect.setLeftTopAndSize(channel_rect.mRight - toast_rect.getWidth(), +			top, toast_rect.getWidth(), +			toast_rect.getHeight()); +		(*it).toast->setRect(toast_rect); + +		if(floater && floater->overlapsScreenChannel()) +		{ +			if(it == mToastList.rbegin()) +			{ +				// move first toast above docked floater +				S32 shift = -floater->getRect().getHeight(); +				if(floater->getDockControl()) +				{ +					shift -= floater->getDockControl()->getTongueHeight(); +				} +				(*it).toast->translate(0, shift); +			} + +			LLRect channel_rect = getChannelRect(); +			// don't show toasts if there is not enough space +			if(toast_rect.mBottom < channel_rect.mBottom) +			{ +				break; +			} +		} + +		bool stop_showing_toasts = (*it).toast->getRect().mBottom < channel_rect.mBottom; + +		if(!stop_showing_toasts) +		{ +			if( it != mToastList.rend()-1) +			{ +				S32 toast_bottom = (*it).toast->getRect().mBottom - gSavedSettings.getS32("ToastGap"); +				stop_showing_toasts = toast_bottom < channel_rect.mBottom; +			} +		}  + +		// at least one toast should be visible +		if(it == mToastList.rbegin()) +		{ +			stop_showing_toasts = false; +		} + +		if(stop_showing_toasts) +			break; + +		if( !(*it).toast->getVisible() ) +		{ +			// HACK +			// EXT-2653: it is necessary to prevent overlapping for secondary showed toasts +			(*it).toast->setVisible(TRUE); +		}		 +		if(!(*it).toast->hasFocus()) +		{ +			// Fixing Z-order of toasts (EXT-4862) +			// Next toast will be positioned under this one. +			gFloaterView->sendChildToBack((*it).toast); +		} +	} + +	// Dismiss toasts we don't have space for (STORM-391). +	if(it != mToastList.rend()) +	{ +		mHiddenToastsNum = 0; +		for(; it != mToastList.rend(); it++) +		{ +			(*it).toast->hide(); +		} +	}  }  //-------------------------------------------------------------------------- @@ -848,7 +932,7 @@ void LLScreenChannel::updateShowToastsState()  		return;  	} -	updateBottom(); +	updateRect();  }  //-------------------------------------------------------------------------- diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h index d207d13981..2f23552828 100644 --- a/indra/newview/llscreenchannel.h +++ b/indra/newview/llscreenchannel.h @@ -53,22 +53,32 @@ class LLScreenChannelBase : public LLUICtrl  {  	friend class LLChannelManager;  public: -	LLScreenChannelBase(const LLUUID& id); -	~LLScreenChannelBase(); +	struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> +	{ +		Mandatory<LLUUID>			id; +		Optional<bool>				display_toasts_always; +		Optional<EToastAlignment>	toast_align; +		Optional<EChannelAlignment>	channel_align; + +		Params() +		:	id("id", LLUUID("")),  +			display_toasts_always("display_toasts_always", false),  +			toast_align("toast_align", NA_BOTTOM),  +			channel_align("channel_align", CA_LEFT) +		{} +	}; + +	LLScreenChannelBase(const Params&); + +	void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);  	// Channel's outfit-functions  	// update channel's size and position in the World View -	virtual void		updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect); -	void				resetPositionAndSize(); +	virtual void		updatePositionAndSize(LLRect rect);  	// initialization of channel's shape and position  	virtual void		init(S32 channel_left, S32 channel_right); - -	virtual void		setToastAlignment(EToastAlignment align) {mToastAlignment = align;} -	 -	virtual void		setChannelAlignment(EChannelAlignment align) {mChannelAlignment = align;} -  	// kill or modify a toast by its ID  	virtual void		killToastByNotificationID(LLUUID id) {};  	virtual void		modifyToastNotificationByID(LLUUID id, LLSD data) {}; @@ -91,7 +101,6 @@ public:  	void setCanStoreToasts(bool store) { mCanStoreToasts = store; } -	void setDisplayToastsAlways(bool display_toasts) { mDisplayToastsAlways = display_toasts; }  	bool getDisplayToastsAlways() { return mDisplayToastsAlways; }  	// get number of hidden notifications from a channel @@ -106,9 +115,11 @@ public:  	// get ID of a channel  	LLUUID	getChannelID() { return mID; } +	LLHandle<LLScreenChannelBase> getHandle() { mRootHandle.bind(this); return mRootHandle; }  protected: -	void	updateBottom(); +	void	updateRect(); +	LLRect	getChannelRect();  	// Channel's flags  	bool		mControlHovering; @@ -117,6 +128,7 @@ protected:  	bool		mDisplayToastsAlways;  	// controls whether a channel shows toasts or not  	bool		mShowToasts; +	LLRootHandle<LLScreenChannelBase> mRootHandle;  	//   	EToastAlignment		mToastAlignment;  	EChannelAlignment	mChannelAlignment; @@ -125,9 +137,6 @@ protected:  	// channel's ID  	LLUUID	mID; - -	// store a connection to prevent futher crash that is caused by sending a signal to a destroyed channel -	boost::signals2::connection mWorldViewRectConnection;  }; @@ -138,7 +147,7 @@ class LLScreenChannel : public LLScreenChannelBase  {  	friend class LLChannelManager;  public: -	LLScreenChannel(LLUUID& id); +	LLScreenChannel(const Params&);  	virtual ~LLScreenChannel();  	class Matcher @@ -153,7 +162,7 @@ public:  	// Channel's outfit-functions  	// update channel's size and position in the World View -	void		updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect); +	void		updatePositionAndSize(LLRect new_rect);  	// initialization of channel's shape and position  	void		init(S32 channel_left, S32 channel_right); diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index 170e23e4c5..85a7e75271 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -28,9 +28,9 @@  #include "llscriptfloater.h"  #include "llagentcamera.h" -#include "llbottomtray.h"  #include "llchannelmanager.h"  #include "llchiclet.h" +#include "llchicletbar.h"  #include "llfloaterreg.h"  #include "lllslconstants.h"  #include "llnotifications.h" @@ -95,7 +95,7 @@ bool LLScriptFloater::toggle(const LLUUID& notification_id)  		show(notification_id);  	} -	LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(notification_id, true); +	LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(notification_id, true);  	return true;  } @@ -131,11 +131,6 @@ void LLScriptFloater::setNotificationId(const LLUUID& id)  	mObjectId = notification_id_to_object_id(id);  } -void LLScriptFloater::getAllowedRect(LLRect& rect) -{ -	rect = gViewerWindow->getWorldViewRectScaled(); -} -  void LLScriptFloater::createForm(const LLUUID& notification_id)  {  	// delete old form @@ -211,7 +206,7 @@ void LLScriptFloater::setVisible(BOOL visible)  	if(!visible)  	{ -		LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId()); +		LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());  		if(chiclet)  		{  			chiclet->setToggleState(false); @@ -224,7 +219,7 @@ void LLScriptFloater::onMouseDown()  	if(getNotificationId().notNull())  	{  		// Remove new message icon -		LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId()); +		LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());  		if (chiclet == NULL)  		{  			llerror("Dock chiclet for LLScriptFloater doesn't exist", 0); @@ -267,7 +262,7 @@ void LLScriptFloater::onFocusLost()  {  	if(getNotificationId().notNull())  	{ -		LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), false); +		LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), false);  	}  } @@ -276,7 +271,7 @@ void LLScriptFloater::onFocusReceived()  	// first focus will be received before setObjectId() call - don't toggle chiclet  	if(getNotificationId().notNull())  	{ -		LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), true); +		LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), true);  	}  } @@ -284,7 +279,7 @@ void LLScriptFloater::dockToChiclet(bool dock)  {  	if (getDockControl() == NULL)  	{ -		LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(getNotificationId()); +		LLChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(getNotificationId());  		if (chiclet == NULL)  		{  			llwarns << "Dock chiclet for LLScriptFloater doesn't exist" << llendl; @@ -292,7 +287,7 @@ void LLScriptFloater::dockToChiclet(bool dock)  		}  		else  		{ -			LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet); +			LLChicletBar::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);  		}  		// Stop saving position while we dock floater @@ -300,7 +295,7 @@ void LLScriptFloater::dockToChiclet(bool dock)  		setSavePosition(false);  		setDockControl(new LLDockControl(chiclet, this, getDockTongue(), -			LLDockControl::TOP,  boost::bind(&LLScriptFloater::getAllowedRect, this, _1))); +			LLDockControl::BOTTOM));  		setDocked(dock); @@ -352,7 +347,7 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)  		script_notification_map_t::const_iterator it = findUsingObjectId(object_id);  		if(it != mNotifications.end())  		{ -			LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(it->first); +			LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(it->first);  			if(chiclet)  			{  				// Pass the new_message icon state further. @@ -375,11 +370,11 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)  	// Create inventory offer chiclet for offer type notifications  	if( OBJ_GIVE_INVENTORY == obj_type )  	{ -		LLBottomTray::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(notification_id); +		LLChicletBar::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(notification_id);  	}  	else  	{ -		LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(notification_id); +		LLChicletBar::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(notification_id);  	}  	LLIMWellWindow::getInstance()->addObjectRow(notification_id, set_new_message); @@ -413,7 +408,7 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)  	}  	// remove related chiclet -	LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(notification_id); +	LLChicletBar::getInstance()->getChicletPanel()->removeChiclet(notification_id);  	LLIMWellWindow::getInstance()->removeObjectRow(notification_id); diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h index 8e959a3d0e..70451194b3 100644 --- a/indra/newview/llscriptfloater.h +++ b/indra/newview/llscriptfloater.h @@ -185,8 +185,6 @@ protected:  	 */  	void createForm(const LLUUID& object_id); -	/*virtual*/ void getAllowedRect(LLRect& rect); -  	/**  	 * Hide all notification toasts.  	 */ diff --git a/indra/newview/llsearchcombobox.cpp b/indra/newview/llsearchcombobox.cpp index 6558c9a7fa..2824c70582 100644 --- a/indra/newview/llsearchcombobox.cpp +++ b/indra/newview/llsearchcombobox.cpp @@ -52,10 +52,9 @@ protected:  };  LLSearchComboBox::Params::Params() -: search_button("search_button") -, dropdown_button_visible("dropdown_button_visible", false) -{ -} +:	search_button("search_button"), +	dropdown_button_visible("dropdown_button_visible", false) +{}  LLSearchComboBox::LLSearchComboBox(const Params&p)  : LLComboBox(p) diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h index b65cf37e7f..db57848320 100644 --- a/indra/newview/llsecapi.h +++ b/indra/newview/llsecapi.h @@ -132,7 +132,7 @@ protected:  // LLCertificates are considered unmodifiable  // Certificates are pulled out of stores, or created via  // factory calls -class LLCertificate : public LLRefCount +class LLCertificate : public LLThreadSafeRefCount  {  	LOG_CLASS(LLCertificate);  public: @@ -160,7 +160,7 @@ public:  // base class for a list of certificates. -class LLCertificateVector : public LLRefCount +class LLCertificateVector : public LLThreadSafeRefCount  {  public: @@ -170,7 +170,7 @@ public:  	// base iterator implementation class, providing  	// the functionality needed for the iterator class. -	class iterator_impl : public LLRefCount +	class iterator_impl : public LLThreadSafeRefCount  	{  	public:  		iterator_impl() {}; @@ -286,10 +286,10 @@ bool operator!=(const LLCertificateVector::iterator& _lhs, const LLCertificateVe  #define CRED_AUTHENTICATOR_TYPE_HASH   "hash"  //  // LLCredential - interface for credentials providing the following functionality: -// * persistance of credential information based on grid (for saving username/password) -// * serialization to an OGP identifier/authenticator pair +// * Persistence of credential information based on grid (for saving username/password) +// * Serialization to an OGP identifier/authenticator pair  //  -class LLCredential  : public LLRefCount +class LLCredential  : public LLThreadSafeRefCount  {  public: @@ -424,7 +424,7 @@ protected:  // LLSecAPIHandler Class  // Interface handler class for the various security storage handlers. -class LLSecAPIHandler : public LLRefCount +class LLSecAPIHandler : public LLThreadSafeRefCount  {  public: diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp index 90e8ff0aae..8d64c8c04f 100644 --- a/indra/newview/llsechandler_basic.cpp +++ b/indra/newview/llsechandler_basic.cpp @@ -1005,6 +1005,8 @@ void LLBasicCertificateStore::validate(int validation_policy,  									   LLPointer<LLCertificateChain> cert_chain,  									   const LLSD& validation_params)  { +	// If --no-verify-ssl-cert was passed on the command line, stop right now. +	if (gSavedSettings.getBOOL("NoVerifySSLCert")) return;  	if(cert_chain->size() < 1)  	{ @@ -1209,12 +1211,12 @@ void LLSecAPIBasicHandler::init()  		// with the product  		std::string ca_file_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem");  		llinfos << "app path " << ca_file_path << llendl; -		LLBasicCertificateStore app_ca_store = LLBasicCertificateStore(ca_file_path);	 +		LLPointer<LLBasicCertificateStore> app_ca_store = new LLBasicCertificateStore(ca_file_path);  		// push the applicate CA files into the store, therefore adding any new CA certs that   		// updated -		for(LLCertificateVector::iterator i = app_ca_store.begin(); -			i != app_ca_store.end(); +		for(LLCertificateVector::iterator i = app_ca_store->begin(); +			i != app_ca_store->end();  			i++)  		{  			mStore->add(*i); diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 8fa4065fa6..733902ad30 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -5123,7 +5123,6 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)  	gGL.getTexUnit(0)->bind(mSilhouetteImagep);  	LLGLSPipelineSelection gls_select; -	gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f);  	LLGLEnable blend(GL_BLEND);  	LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); @@ -5250,7 +5249,6 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)  	}  	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  }  void LLSelectMgr::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_point) @@ -6522,32 +6520,75 @@ U32 LLObjectSelection::getSelectedObjectTriangleCount()  	return count;  } -/*S32 LLObjectSelection::getSelectedObjectRenderCost() +S32 LLObjectSelection::getSelectedObjectRenderCost()  {         S32 cost = 0;         LLVOVolume::texture_cost_t textures; +       typedef std::set<LLUUID> uuid_list_t; +       uuid_list_t computed_objects; + +	   typedef std::list<LLPointer<LLViewerObject> > child_list_t; +	   typedef const child_list_t const_child_list_t; + +	   // add render cost of complete linksets first, to get accurate texture counts         for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)         {                 LLSelectNode* node = *iter; +			                    LLVOVolume* object = (LLVOVolume*)node->getObject(); -               if (object) -               { -                       cost += object->getRenderCost(textures); -               } - -               for (LLVOVolume::texture_cost_t::iterator iter = textures.begin(); iter != textures.end(); ++iter) +               if (object && object->isRootEdit())                 { -                       // add the cost of each individual texture in the linkset -                       cost += iter->second; +				   cost += object->getRenderCost(textures); +				   computed_objects.insert(object->getID()); + +				   const_child_list_t children = object->getChildren(); +				   for (const_child_list_t::const_iterator child_iter = children.begin(); +						 child_iter != children.end(); +						 ++child_iter) +				   { +					   LLViewerObject* child_obj = *child_iter; +					   LLVOVolume *child = dynamic_cast<LLVOVolume*>( child_obj ); +					   if (child) +					   { +						   cost += child->getRenderCost(textures); +						   computed_objects.insert(child->getID()); +					   } +				   } + +				   for (LLVOVolume::texture_cost_t::iterator iter = textures.begin(); iter != textures.end(); ++iter) +				   { +					   // add the cost of each individual texture in the linkset +					   cost += iter->second; +				   } + +				   textures.clear();                 } -               textures.clear();         } +	 +	   // add any partial linkset objects, texture cost may be slightly misleading +		for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter) +		{ +			LLSelectNode* node = *iter; +			LLVOVolume* object = (LLVOVolume*)node->getObject(); + +			if (object && computed_objects.find(object->getID()) == computed_objects.end()  ) +			{ +					cost += object->getRenderCost(textures); +					computed_objects.insert(object->getID()); +			} +			for (LLVOVolume::texture_cost_t::iterator iter = textures.begin(); iter != textures.end(); ++iter) +			{ +				// add the cost of each individual texture in the linkset +				cost += iter->second; +			} -       return cost; -}*/ +			textures.clear(); +		} +       return cost; +}  //-----------------------------------------------------------------------------  // getTECount() diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 28ec11d1c7..853656905c 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -32,6 +32,7 @@  #include "llagentcamera.h"  #include "llagentwearables.h"  #include "llappearancemgr.h" +#include "llfloatersidepanelcontainer.h"  #include "llfolderview.h"  #include "llinventorypanel.h"  #include "llfiltereditor.h" @@ -41,7 +42,6 @@  #include "lloutfitobserver.h"  #include "llpaneleditwearable.h"  #include "llpaneloutfitsinventory.h" -#include "llsidetray.h"  #include "lltextbox.h"  #include "lluictrlfactory.h"  #include "llviewercontrol.h" @@ -163,7 +163,6 @@ void LLSidepanelAppearance::onOpen(const LLSD& key)  	else  	{  		// Switch to the requested panel. -		// *TODO: replace this crap with LLSideTrayPanelContainer  		std::string type = key["type"].asString();  		if (type == "my_outfits")  		{ @@ -456,7 +455,7 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name)  //static  void LLSidepanelAppearance::editWearable(LLWearable *wearable, LLView *data, BOOL disable_camera_switch)  { -	LLSideTray::getInstance()->showPanel("sidepanel_appearance"); +	LLFloaterSidePanelContainer::showPanel("appearance", LLSD());  	LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(data);  	if (panel) diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 65655f82cd..a24f6b24f0 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -34,6 +34,7 @@  #include "llbutton.h"  #include "lldate.h"  #include "llfirstuse.h" +#include "llfloatersidepanelcontainer.h"  #include "llfoldertype.h"  #include "llhttpclient.h"  #include "llinventorybridge.h" @@ -52,7 +53,10 @@  #include "llsidepaneltaskinfo.h"  #include "llstring.h"  #include "lltabcontainer.h" +#include "lltextbox.h" +#include "lltrans.h"  #include "llviewermedia.h" +#include "llviewernetwork.h"  #include "llweb.h"  static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory"); @@ -61,18 +65,25 @@ static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_  // Constants  // -static const char * const INBOX_EXPAND_TIME_SETTING = "LastInventoryInboxExpand"; +// No longer want the inbox panel to auto-expand since it creates issues with the "new" tag time stamp +#define AUTO_EXPAND_INBOX	0 + +// Temporarily disabling the outbox until we straighten out the API +#define ENABLE_MERCHANT_OUTBOX_PANEL		0	// keep in sync with ENABLE_INVENTORY_DISPLAY_OUTBOX, ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU  static const char * const INBOX_BUTTON_NAME = "inbox_btn";  static const char * const OUTBOX_BUTTON_NAME = "outbox_btn";  static const char * const INBOX_LAYOUT_PANEL_NAME = "inbox_layout_panel";  static const char * const OUTBOX_LAYOUT_PANEL_NAME = "outbox_layout_panel"; + +static const char * const INBOX_OUTBOX_LAYOUT_PANEL_NAME = "inbox_outbox_layout_panel";  static const char * const MAIN_INVENTORY_LAYOUT_PANEL_NAME = "main_inventory_layout_panel";  static const char * const INBOX_INVENTORY_PANEL = "inventory_inbox";  static const char * const OUTBOX_INVENTORY_PANEL = "inventory_outbox"; +static const char * const INBOX_OUTBOX_LAYOUT_STACK_NAME = "inbox_outbox_layout_stack";  static const char * const INVENTORY_LAYOUT_STACK_NAME = "inventory_layout_stack";  static const char * const MARKETPLACE_INBOX_PANEL = "marketplace_inbox"; @@ -134,6 +145,8 @@ private:  LLSidepanelInventory::LLSidepanelInventory()  	: LLPanel()  	, mItemPanel(NULL) +	, mInventoryPanelInbox(NULL) +	, mInventoryPanelOutbox(NULL)  	, mPanelMainInventory(NULL)  	, mInboxEnabled(false)  	, mOutboxEnabled(false) @@ -160,16 +173,20 @@ LLSidepanelInventory::~LLSidepanelInventory()  void handleInventoryDisplayInboxChanged()  { -	LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(LLSideTray::getInstance()->getPanel("sidepanel_inventory")); - -	sidepanel_inventory->enableInbox(gSavedSettings.getBOOL("InventoryDisplayInbox")); +	LLSidepanelInventory* sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory"); +	if (sidepanel_inventory) +	{ +		sidepanel_inventory->enableInbox(gSavedSettings.getBOOL("InventoryDisplayInbox")); +	}  }  void handleInventoryDisplayOutboxChanged()  { -	LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(LLSideTray::getInstance()->getPanel("sidepanel_inventory")); - -	sidepanel_inventory->enableOutbox(gSavedSettings.getBOOL("InventoryDisplayOutbox")); +	LLSidepanelInventory* sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory"); +	if (sidepanel_inventory) +	{ +		sidepanel_inventory->enableOutbox(gSavedSettings.getBOOL("InventoryDisplayOutbox")); +	}  }  BOOL LLSidepanelInventory::postBuild() @@ -235,16 +252,20 @@ BOOL LLSidepanelInventory::postBuild()  	// Marketplace inbox/outbox setup  	{ -		LLLayoutStack* stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME); +		LLLayoutStack* inv_stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME);  		// Disable user_resize on main inventory panel by default -		stack->setPanelUserResize(MAIN_INVENTORY_LAYOUT_PANEL_NAME, false); -		stack->setPanelUserResize(INBOX_LAYOUT_PANEL_NAME, false); -		stack->setPanelUserResize(OUTBOX_LAYOUT_PANEL_NAME, false); +		inv_stack->setPanelUserResize(MAIN_INVENTORY_LAYOUT_PANEL_NAME, false); +		inv_stack->setPanelUserResize(INBOX_OUTBOX_LAYOUT_PANEL_NAME, false); + +		// Collapse marketplace panel by default +		inv_stack->collapsePanel(getChild<LLLayoutPanel>(INBOX_OUTBOX_LAYOUT_PANEL_NAME), true); +		 +		LLLayoutStack* inout_stack = getChild<LLLayoutStack>(INBOX_OUTBOX_LAYOUT_STACK_NAME);  		// Collapse both inbox and outbox panels -		stack->collapsePanel(getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME), true); -		stack->collapsePanel(getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME), true); +		inout_stack->collapsePanel(getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME), true); +		inout_stack->collapsePanel(getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME), true);  		// Set up button states and callbacks  		LLButton * inbox_button = getChild<LLButton>(INBOX_BUTTON_NAME); @@ -261,16 +282,20 @@ BOOL LLSidepanelInventory::postBuild()  		enableOutbox(gSavedSettings.getBOOL("InventoryDisplayOutbox"));  		// Trigger callback for after login so we can setup to track inbox and outbox changes after initial inventory load -		LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLSidepanelInventory::handleLoginComplete, this)); +		LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLSidepanelInventory::updateInboxOutbox, this));  	}  	gSavedSettings.getControl("InventoryDisplayInbox")->getCommitSignal()->connect(boost::bind(&handleInventoryDisplayInboxChanged));  	gSavedSettings.getControl("InventoryDisplayOutbox")->getCommitSignal()->connect(boost::bind(&handleInventoryDisplayOutboxChanged)); +	updateInboxOutbox(); +	// Update the verbs buttons state. +	updateVerbs(); +  	return TRUE;  } -void LLSidepanelInventory::handleLoginComplete() +void LLSidepanelInventory::updateInboxOutbox()  {  	//  	// Track inbox and outbox folder changes @@ -297,15 +322,16 @@ void LLSidepanelInventory::handleLoginComplete()  		enableInbox(true);  	} +#if ENABLE_MERCHANT_OUTBOX_PANEL  	// Set up observer for outbox changes, if we have an outbox already  	if (!outbox_id.isNull())  	{  		observeOutboxModifications(outbox_id);  		// Enable the display of the outbox if it exists -		//enableOutbox(true); -		// leslie NOTE: Disabling outbox until we support it officially. +		enableOutbox(true);  	} +#endif  }  void LLSidepanelInventory::observeInboxOutboxCreation() @@ -353,7 +379,7 @@ void LLSidepanelInventory::observeInboxModifications(const LLUUID& inboxID)  	//  	LLPanelMarketplaceInbox * inbox = getChild<LLPanelMarketplaceInbox>(MARKETPLACE_INBOX_PANEL); -	inbox->setupInventoryPanel(); +	mInventoryPanelInbox = inbox->setupInventoryPanel();  } @@ -382,106 +408,165 @@ void LLSidepanelInventory::observeOutboxModifications(const LLUUID& outboxID)  	//  	LLPanelMarketplaceOutbox * outbox = getChild<LLPanelMarketplaceOutbox>(MARKETPLACE_OUTBOX_PANEL); -	outbox->setupInventoryPanel(); +	mInventoryPanelOutbox = outbox->setupInventoryPanel();  }  void LLSidepanelInventory::enableInbox(bool enabled)  {  	mInboxEnabled = enabled; -	getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME)->setVisible(enabled); +	 +	LLLayoutPanel * inbox_layout_panel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME); +	inbox_layout_panel->setVisible(enabled); + +	if (mInboxEnabled) +	{ +		LLLayoutPanel * inout_layout_panel = getChild<LLLayoutPanel>(INBOX_OUTBOX_LAYOUT_PANEL_NAME); + +		inout_layout_panel->setVisible(TRUE); +		 +		if (mOutboxEnabled) +		{ +			S32 inbox_min_dim = inbox_layout_panel->getMinDim(); +			S32 outbox_min_dim = getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME)->getMinDim(); +			 +			inout_layout_panel->setMinDim(inbox_min_dim + outbox_min_dim); +		} +	}  }  void LLSidepanelInventory::enableOutbox(bool enabled)  {  	mOutboxEnabled = enabled; -	getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME)->setVisible(enabled); +	 +	LLLayoutPanel * outbox_layout_panel = getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME); +	outbox_layout_panel->setVisible(enabled); + +	if (mOutboxEnabled) +	{ +		LLLayoutPanel * inout_layout_panel = getChild<LLLayoutPanel>(INBOX_OUTBOX_LAYOUT_PANEL_NAME); +		 +		inout_layout_panel->setVisible(TRUE); +		 +		if (mInboxEnabled) +		{ +			S32 inbox_min_dim = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME)->getMinDim(); +			S32 outbox_min_dim = outbox_layout_panel->getMinDim(); +			 +			inout_layout_panel->setMinDim(inbox_min_dim + outbox_min_dim); +		} +		 +		updateOutboxUserStatus(); +	}  }  void LLSidepanelInventory::onInboxChanged(const LLUUID& inbox_id)  {  	// Trigger a load of the entire inbox so we always know the contents and their creation dates for sorting  	LLInventoryModelBackgroundFetch::instance().start(inbox_id); -	 -	// Expand the inbox since we have fresh items -	LLPanelMarketplaceInbox * inbox = findChild<LLPanelMarketplaceInbox>(MARKETPLACE_INBOX_PANEL); -	if (inbox && (inbox->getFreshItemCount() > 0)) + +#if AUTO_EXPAND_INBOX +	// If the outbox is expanded, don't auto-expand the inbox +	if (mOutboxEnabled) +	{ +		if (getChild<LLButton>(OUTBOX_BUTTON_NAME)->getToggleState()) +		{ +			return; +		} +	} + +	// Expand the inbox since we have fresh items and the outbox is not expanded +	if (mInboxEnabled)  	{  		getChild<LLButton>(INBOX_BUTTON_NAME)->setToggleState(true);  		onToggleInboxBtn(); -	}	 +	} +#endif  }  void LLSidepanelInventory::onOutboxChanged(const LLUUID& outbox_id)  { -	// Perhaps use this to track outbox changes? +	// Expand the outbox since we have new items in it +	if (mOutboxEnabled) +	{ +		getChild<LLButton>(OUTBOX_BUTTON_NAME)->setToggleState(true); +		onToggleOutboxBtn(); +	}	  } -bool manageInboxOutboxPanels(LLLayoutStack * stack, -							 LLButton * pressedButton, LLLayoutPanel * pressedPanel, +bool LLSidepanelInventory::manageInboxOutboxPanels(LLButton * pressedButton, LLLayoutPanel * pressedPanel,  							 LLButton * otherButton, LLLayoutPanel * otherPanel)  {  	bool expand = pressedButton->getToggleState();  	bool otherExpanded = otherButton->getToggleState(); -	// -	// NOTE: Ideally we could have two panel sizes stored for a collapsed and expanded minimum size. -	//       For now, leave this code disabled because it creates some bad artifacts when expanding -	//       and collapsing the inbox/outbox. -	// -	//S32 smallMinSize = (expand ? pressedPanel->getMinDim() : otherPanel->getMinDim()); -	//S32 pressedMinSize = (expand ? 2 * smallMinSize : smallMinSize); -	//otherPanel->setMinDim(smallMinSize); -	//pressedPanel->setMinDim(pressedMinSize); +	LLLayoutStack* inv_stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME); +	LLLayoutStack* inout_stack = getChild<LLLayoutStack>(INBOX_OUTBOX_LAYOUT_STACK_NAME); +	LLLayoutPanel* inout_panel = getChild<LLLayoutPanel>(INBOX_OUTBOX_LAYOUT_PANEL_NAME); + +	// Enable user_resize on main inventory panel only when a marketplace box is expanded +	inv_stack->setPanelUserResize(MAIN_INVENTORY_LAYOUT_PANEL_NAME, expand); +	inv_stack->collapsePanel(inout_panel, !expand); +	// Collapse other marketplace panel if it is expanded  	if (expand && otherExpanded)  	{  		// Reshape pressedPanel to the otherPanel's height so we preserve the marketplace panel size  		pressedPanel->reshape(pressedPanel->getRect().getWidth(), otherPanel->getRect().getHeight()); -		stack->collapsePanel(otherPanel, true); +		inout_stack->collapsePanel(otherPanel, true);  		otherButton->setToggleState(false);  	} +	else +	{ +		// NOTE: This is an attempt to reshape the inventory panel to the proper size but it doesn't seem to propagate +		// properly to the child panels. -	stack->collapsePanel(pressedPanel, !expand); +		S32 new_height = inout_panel->getRect().getHeight(); -	// Enable user_resize on main inventory panel only when a marketplace box is expanded -	stack->setPanelUserResize(MAIN_INVENTORY_LAYOUT_PANEL_NAME, expand); +		if (otherPanel->getVisible()) +		{ +			new_height -= otherPanel->getMinDim(); +		} + +		pressedPanel->reshape(pressedPanel->getRect().getWidth(), new_height); +	} + +	// Expand/collapse the indicated panel +	inout_stack->collapsePanel(pressedPanel, !expand);  	return expand;  }  void LLSidepanelInventory::onToggleInboxBtn()  { -	LLLayoutStack* stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME); -	LLButton* pressedButton = getChild<LLButton>(INBOX_BUTTON_NAME); -	LLLayoutPanel* pressedPanel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME); -	LLButton* otherButton = getChild<LLButton>(OUTBOX_BUTTON_NAME); -	LLLayoutPanel* otherPanel = getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME); +	LLButton* inboxButton = getChild<LLButton>(INBOX_BUTTON_NAME); +	LLLayoutPanel* inboxPanel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME); +	LLButton* outboxButton = getChild<LLButton>(OUTBOX_BUTTON_NAME); +	LLLayoutPanel* outboxPanel = getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME); -	bool inboxExpanded = manageInboxOutboxPanels(stack, pressedButton, pressedPanel, otherButton, otherPanel); +	const bool inbox_expanded = manageInboxOutboxPanels(inboxButton, inboxPanel, outboxButton, outboxPanel); -	if (inboxExpanded) +	if (inbox_expanded && inboxPanel->isInVisibleChain())  	{ -		// Save current time as a setting for future new-ness tests -		gSavedSettings.setString(INBOX_EXPAND_TIME_SETTING, LLDate::now().asString()); +		gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());  	}  }  void LLSidepanelInventory::onToggleOutboxBtn()  { -	LLLayoutStack* stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME); -	LLButton* pressedButton = getChild<LLButton>(OUTBOX_BUTTON_NAME); -	LLLayoutPanel* pressedPanel = getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME); -	LLButton* otherButton = getChild<LLButton>(INBOX_BUTTON_NAME); -	LLLayoutPanel* otherPanel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME); +	LLButton* inboxButton = getChild<LLButton>(INBOX_BUTTON_NAME); +	LLLayoutPanel* inboxPanel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME); +	LLButton* outboxButton = getChild<LLButton>(OUTBOX_BUTTON_NAME); +	LLLayoutPanel* outboxPanel = getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME); -	manageInboxOutboxPanels(stack, pressedButton, pressedPanel, otherButton, otherPanel); +	manageInboxOutboxPanels(outboxButton, outboxPanel, inboxButton, inboxPanel);  }  void LLSidepanelInventory::onOpen(const LLSD& key)  {  	LLFirstUse::newInventory(false); +#if AUTO_EXPAND_INBOX  	// Expand the inbox if we have fresh items  	LLPanelMarketplaceInbox * inbox = findChild<LLPanelMarketplaceInbox>(MARKETPLACE_INBOX_PANEL);  	if (inbox && (inbox->getFreshItemCount() > 0)) @@ -489,6 +574,12 @@ void LLSidepanelInventory::onOpen(const LLSD& key)  		getChild<LLButton>(INBOX_BUTTON_NAME)->setToggleState(true);  		onToggleInboxBtn();  	} +#else +	if (mInboxEnabled && getChild<LLButton>(INBOX_BUTTON_NAME)->getToggleState()) +	{ +		gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected()); +	} +#endif  	if(key.size() == 0)  		return; @@ -535,14 +626,12 @@ void LLSidepanelInventory::onShopButtonClicked()  void LLSidepanelInventory::performActionOnSelection(const std::string &action)  { -	LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); -	LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); +	LLFolderViewItem* current_item = mPanelMainInventory->getActivePanel()->getRootFolder()->getCurSelectedItem();  	if (!current_item)  	{ -		LLInventoryPanel* inbox = findChild<LLInventoryPanel>("inventory_inbox"); -		if (inbox) +		if (mInventoryPanelInbox)  		{ -			current_item = inbox->getRootFolder()->getCurSelectedItem(); +			current_item = mInventoryPanelInbox->getRootFolder()->getCurSelectedItem();  		}  		if (!current_item) @@ -551,7 +640,7 @@ void LLSidepanelInventory::performActionOnSelection(const std::string &action)  		}  	} -	current_item->getListener()->performAction(panel_main_inventory->getActivePanel()->getModel(), action); +	current_item->getListener()->performAction(mPanelMainInventory->getActivePanel()->getModel(), action);  }  void LLSidepanelInventory::onWearButtonClicked() @@ -642,6 +731,77 @@ void LLSidepanelInventory::showInventoryPanel()  	updateVerbs();  } +void LLSidepanelInventory::updateOutboxUserStatus() +{ +	const bool isMerchant = (gSavedSettings.getString("InventoryMarketplaceUserStatus") == "merchant"); +	const bool hasOutbox = !gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false).isNull(); +	 +	LLView * outbox_placeholder = getChild<LLView>("outbox_inventory_placeholder_panel"); +	LLView * outbox_placeholder_parent = outbox_placeholder->getParent(); +	 +	LLTextBox * outbox_title_box = outbox_placeholder->getChild<LLTextBox>("outbox_inventory_placeholder_title"); +	LLTextBox * outbox_text_box = outbox_placeholder->getChild<LLTextBox>("outbox_inventory_placeholder_text"); + +	std::string outbox_text; +	std::string outbox_title; +	std::string outbox_tooltip; + +	if (isMerchant) +	{ +		if (hasOutbox) +		{ +			outbox_text = LLTrans::getString("InventoryOutboxNoItems"); +			outbox_title = LLTrans::getString("InventoryOutboxNoItemsTitle"); +			outbox_tooltip = LLTrans::getString("InventoryOutboxNoItemsTooltip"); +		} +		else +		{ +			outbox_text = LLTrans::getString("InventoryOutboxCreationError"); +			outbox_title = LLTrans::getString("InventoryOutboxCreationErrorTitle"); +			outbox_tooltip = LLTrans::getString("InventoryOutboxCreationErrorTooltip"); +		} +	} +	else +	{ +		// +		// The string to become a merchant contains 3 URL's which need the domain name patched in. +		// +		 +		std::string domain = "secondlife.com"; +		 +		if (!LLGridManager::getInstance()->isInProductionGrid()) +		{ +			std::string gridLabel = LLGridManager::getInstance()->getGridLabel(); +			domain = llformat("%s.lindenlab.com", utf8str_tolower(gridLabel).c_str()); +		} +		 +		LLStringUtil::format_map_t domain_arg; +		domain_arg["[DOMAIN_NAME]"] = domain; + +		std::string marketplace_url = LLTrans::getString("MarketplaceURL", domain_arg); +		std::string marketplace_url_create = LLTrans::getString("MarketplaceURL_CreateStore", domain_arg); +		std::string marketplace_url_info = LLTrans::getString("MarketplaceURL_LearnMore", domain_arg); +		 +		LLStringUtil::format_map_t args1, args2, args3; +		args1["[MARKETPLACE_URL]"] = marketplace_url; +		args2["[LEARN_MORE_URL]"] = marketplace_url_info; +		args3["[CREATE_STORE_URL]"] = marketplace_url_create; +		 +		// NOTE: This is dumb, ridiculous and very finicky.  The order of these is very important +		//       to have these three string substitutions work properly. +		outbox_text = LLTrans::getString("InventoryOutboxNotMerchant", args1); +		LLStringUtil::format(outbox_text, args2); +		LLStringUtil::format(outbox_text, args3); + +		outbox_title = LLTrans::getString("InventoryOutboxNotMerchantTitle"); +		outbox_tooltip = LLTrans::getString("InventoryOutboxNotMerchantTooltip"); +	} +	 +	outbox_text_box->setValue(outbox_text); +	outbox_title_box->setValue(outbox_title); +	outbox_placeholder_parent->setToolTip(outbox_tooltip); +} +  void LLSidepanelInventory::updateVerbs()  {  	mInfoBtn->setEnabled(FALSE); @@ -693,19 +853,16 @@ void LLSidepanelInventory::updateVerbs()  bool LLSidepanelInventory::canShare()  { -	LLPanelMainInventory* panel_main_inventory = -		mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory"); - -	LLInventoryPanel* inbox = findChild<LLInventoryPanel>("inventory_inbox"); +	LLInventoryPanel* inbox = mInventoryPanelInbox;  	// Avoid flicker in the Recent tab while inventory is being loaded.  	if ( (!inbox || inbox->getRootFolder()->getSelectionList().empty()) -		&& (panel_main_inventory && !panel_main_inventory->getActivePanel()->getRootFolder()->hasVisibleChildren()) ) +		&& (mPanelMainInventory && !mPanelMainInventory->getActivePanel()->getRootFolder()->hasVisibleChildren()) )  	{  		return false;  	} -	return ( (panel_main_inventory ? LLAvatarActions::canShareSelectedItems(panel_main_inventory->getActivePanel()) : false) +	return ( (mPanelMainInventory ? LLAvatarActions::canShareSelectedItems(mPanelMainInventory->getActivePanel()) : false)  			|| (inbox ? LLAvatarActions::canShareSelectedItems(inbox) : false) );  } @@ -730,14 +887,13 @@ bool LLSidepanelInventory::canWearSelected()  LLInventoryItem *LLSidepanelInventory::getSelectedItem()  { -	LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); -	LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); +	LLFolderViewItem* current_item = mPanelMainInventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); +	  	if (!current_item)  	{ -		LLInventoryPanel* inbox = findChild<LLInventoryPanel>("inventory_inbox"); -		if (inbox) +		if (mInventoryPanelInbox)  		{ -			current_item = inbox->getRootFolder()->getCurSelectedItem(); +			current_item = mInventoryPanelInbox->getRootFolder()->getCurSelectedItem();  		}  		if (!current_item) @@ -754,14 +910,20 @@ U32 LLSidepanelInventory::getSelectedCount()  {  	int count = 0; -	LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); -	std::set<LLUUID> selection_list = panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList(); +	std::set<LLUUID> selection_list = mPanelMainInventory->getActivePanel()->getRootFolder()->getSelectionList(); +	count += selection_list.size(); + +	if ((count == 0) && mInboxEnabled && (mInventoryPanelInbox != NULL)) +	{ +		selection_list = mInventoryPanelInbox->getRootFolder()->getSelectionList(); +  	count += selection_list.size(); +	} -	LLInventoryPanel* inbox = findChild<LLInventoryPanel>("inventory_inbox"); -	if (inbox) +	if ((count == 0) && mOutboxEnabled && (mInventoryPanelOutbox != NULL))  	{ -		selection_list = inbox->getRootFolder()->getSelectionList(); +		selection_list = mInventoryPanelOutbox->getRootFolder()->getSelectionList(); +		  		count += selection_list.size();  	} @@ -785,3 +947,45 @@ BOOL LLSidepanelInventory::isMainInventoryPanelActive() const  {  	return mInventoryPanel->getVisible();  } + +void LLSidepanelInventory::clearSelections(bool clearMain, bool clearInbox, bool clearOutbox) +{ +	if (clearMain) +	{ +		LLInventoryPanel * inv_panel = getActivePanel(); +		 +		if (inv_panel) +		{ +			inv_panel->clearSelection(); +		} +	} +	 +	if (clearInbox && mInboxEnabled && (mInventoryPanelInbox != NULL)) +	{ +		mInventoryPanelInbox->clearSelection(); +	} +	 +	if (clearOutbox && mOutboxEnabled && (mInventoryPanelOutbox != NULL)) +	{ +		mInventoryPanelOutbox->clearSelection(); +	} +	 +	updateVerbs(); +} + +std::set<LLUUID> LLSidepanelInventory::getInboxOrOutboxSelectionList() +{ +	std::set<LLUUID> inventory_selected_uuids; +	 +	if (mInboxEnabled && (mInventoryPanelInbox != NULL)) +	{ +		inventory_selected_uuids = mInventoryPanelInbox->getRootFolder()->getSelectionList(); +	} +	 +	if (inventory_selected_uuids.empty() && mOutboxEnabled && (mInventoryPanelOutbox != NULL)) +	{ +		inventory_selected_uuids = mInventoryPanelOutbox->getRootFolder()->getSelectionList(); +	} +	 +	return inventory_selected_uuids; +} diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h index 9117e3bf27..4e34926a4b 100644 --- a/indra/newview/llsidepanelinventory.h +++ b/indra/newview/llsidepanelinventory.h @@ -29,11 +29,13 @@  #include "llpanel.h" +class LLButton;  class LLFolderViewItem;  class LLInboxOutboxAddedObserver;  class LLInventoryCategoriesObserver;  class LLInventoryItem;  class LLInventoryPanel; +class LLLayoutPanel;  class LLPanelMainInventory;  class LLSidepanelItemInfo;  class LLSidepanelTaskInfo; @@ -45,7 +47,7 @@ public:  	virtual ~LLSidepanelInventory();  private: -	void handleLoginComplete(); +	void updateInboxOutbox();  public:  	void observeInboxOutboxCreation(); @@ -59,6 +61,9 @@ public:  	LLPanelMainInventory* getMainInventoryPanel() const { return mPanelMainInventory; }  	BOOL isMainInventoryPanelActive() const; +	void clearSelections(bool clearMain, bool clearInbox, bool clearOutbox); +	std::set<LLUUID> getInboxOrOutboxSelectionList(); +  	void showItemInfoPanel();  	void showTaskInfoPanel();  	void showInventoryPanel(); @@ -71,10 +76,11 @@ public:  	void enableInbox(bool enabled);  	void enableOutbox(bool enabled); - +	  	bool isInboxEnabled() const { return mInboxEnabled; }  	bool isOutboxEnabled() const { return mOutboxEnabled; } +	void updateOutboxUserStatus();  	void updateVerbs();  protected: @@ -90,11 +96,15 @@ protected:  	void onInboxChanged(const LLUUID& inbox_id);  	void onOutboxChanged(const LLUUID& outbox_id); +	bool manageInboxOutboxPanels(LLButton * pressedButton, LLLayoutPanel * pressedPanel, LLButton * otherButton, LLLayoutPanel * otherPanel); +  	//  	// UI Elements  	//  private:  	LLPanel*					mInventoryPanel; // Main inventory view +	LLInventoryPanel*			mInventoryPanelInbox; +	LLInventoryPanel*			mInventoryPanelOutbox;  	LLSidepanelItemInfo*		mItemPanel; // Individual item view  	LLSidepanelTaskInfo*		mTaskPanel; // Individual in-world object view  	LLPanelMainInventory*		mPanelMainInventory; diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp deleted file mode 100644 index 651897a217..0000000000 --- a/indra/newview/llsidetray.cpp +++ /dev/null @@ -1,1459 +0,0 @@ -/**  - * @file llsidetray.cpp - * @brief SideBar implementation - * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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 "lltextbox.h" - -#include "llagentcamera.h" -#include "llappviewer.h" -#include "llbadge.h" -#include "llbottomtray.h" -#include "llfloaterreg.h" -#include "llfirstuse.h" -#include "llhints.h" -#include "llsidetray.h" -#include "llviewerwindow.h" -#include "llaccordionctrl.h" -#include "llfocusmgr.h" -#include "llrootview.h" -#include "llnavigationbar.h" -#include "llpanelmarketplaceinbox.h" - -#include "llaccordionctrltab.h" - -#include "llfloater.h" //for gFloaterView -#include "lliconctrl.h"//for OpenClose tab icon -#include "llsidetraypanelcontainer.h" -#include "llscreenchannel.h" -#include "llchannelmanager.h" -#include "llwindow.h"//for SetCursor -#include "lltransientfloatermgr.h" - -#include "llsidepanelappearance.h" - -#include "llsidetraylistener.h" - -//#include "llscrollcontainer.h" - -using namespace std; -using namespace LLNotificationsUI; - -static LLRootViewRegistry::Register<LLSideTray>	t1("side_tray"); -static LLDefaultChildRegistry::Register<LLSideTrayTab>	t2("sidetray_tab"); - -static const S32 BOTTOM_BAR_PAD = 5; - -static const std::string COLLAPSED_NAME = "<<"; -static const std::string EXPANDED_NAME  = ">>"; - -static const std::string TAB_PANEL_CAPTION_NAME = "sidetray_tab_panel"; -static const std::string TAB_PANEL_CAPTION_TITLE_BOX = "sidetray_tab_title"; - -LLSideTray* LLSideTray::sInstance = 0; - -static LLSideTrayListener sSideTrayListener(LLSideTray::getInstance); - -// static -LLSideTray* LLSideTray::getInstance() -{ -	if (!sInstance) -	{ -		sInstance = LLUICtrlFactory::createFromFile<LLSideTray>("panel_side_tray.xml",NULL, LLRootView::child_registry_t::instance()); -		sInstance->setXMLFilename("panel_side_tray.xml"); -	} - -	return sInstance; -} - -// static -bool	LLSideTray::instanceCreated	() -{ -	return sInstance!=0; -} - -////////////////////////////////////////////////////////////////////////////// -// LLSideTrayTab -// Represents a single tab in the side tray, only used by LLSideTray -////////////////////////////////////////////////////////////////////////////// - -class LLSideTrayTab: public LLPanel -{ -	LOG_CLASS(LLSideTrayTab); -	friend class LLUICtrlFactory; -	friend class LLSideTray; -public: -	 -	struct Params  -	:	public LLInitParam::Block<Params, LLPanel::Params> -	{ -		// image name -		Optional<std::string>		image; -		Optional<std::string>		image_selected; -		Optional<std::string>		tab_title; -		Optional<std::string>		description; -		Optional<LLBadge::Params>	badge; -		 -		Params() -		:	image("image"), -			image_selected("image_selected"), -			tab_title("tab_title","no title"), -			description("description","no description"), -			badge("badge") -		{}; -	}; -protected: -	LLSideTrayTab(const Params& params); -	 -	void			dock(LLFloater* floater_tab); -	void			undock(LLFloater* floater_tab); - -	LLSideTray*		getSideTray(); -	 -public: -	virtual ~LLSideTrayTab(); -	 -    /*virtual*/ BOOL	postBuild	(); -	/*virtual*/ bool	addChild	(LLView* view, S32 tab_group); -	 -	 -	void			reshape		(S32 width, S32 height, BOOL called_from_parent = TRUE); -	 -	static LLSideTrayTab*  createInstance	(); -	 -	const std::string& getDescription () const { return mDescription;} -	 -	void			onOpen		(const LLSD& key); -	 -	void			toggleTabDocked(bool toggle_floater = true); -	void			setDocked(bool dock); -	bool			isDocked() const; - -	BOOL			handleScrollWheel(S32 x, S32 y, S32 clicks); - -	LLPanel*		getPanel(); - -	LLButton*		createButton(bool allowTearOff, LLUICtrl::commit_callback_t callback); - -private: -	std::string mTabTitle; -	std::string mImage; -	std::string mImageSelected; -	std::string	mDescription; -	 -	LLView*	mMainPanel; - -	bool			mHasBadge; -	LLBadge::Params	mBadgeParams; -}; - -LLSideTrayTab::LLSideTrayTab(const Params& p) -:	LLPanel(), -	mTabTitle(p.tab_title), -	mImage(p.image), -	mImageSelected(p.image_selected), -	mDescription(p.description), -	mMainPanel(NULL), -	mBadgeParams(p.badge) -{ -	mHasBadge = p.badge.isProvided(); -} - -LLSideTrayTab::~LLSideTrayTab() -{ -} - -bool LLSideTrayTab::addChild(LLView* view, S32 tab_group) -{ -	if(mMainPanel == 0 && TAB_PANEL_CAPTION_NAME != view->getName())//skip our caption panel -		mMainPanel = view; -	return LLPanel::addChild(view,tab_group); -	//return res; -} - -//virtual  -BOOL LLSideTrayTab::postBuild() -{ -	LLPanel* title_panel = LLUICtrlFactory::getInstance()->createFromFile<LLPanel>("panel_side_tray_tab_caption.xml",this, child_registry_t::instance()); -	string name = title_panel->getName(); -	LLPanel::addChild(title_panel); -	 -	title_panel->getChild<LLTextBox>(TAB_PANEL_CAPTION_TITLE_BOX)->setValue(mTabTitle); - -	getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, false)); -	getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, true)); - -	return LLPanel::postBuild(); -} - -static const S32 splitter_margin = 1; - -void LLSideTrayTab::reshape		(S32 width, S32 height, BOOL called_from_parent ) -{ -	LLPanel::reshape(width, height, called_from_parent); -	LLView* title_panel = findChildView(TAB_PANEL_CAPTION_NAME, true); -	if (!title_panel) -	{ -		// not fully constructed yet -		return; -	} - -	S32 title_height = title_panel->getRect().getHeight(); -	title_panel->setOrigin( 0, height - title_height ); -	title_panel->reshape(width,title_height); - -	LLRect sRect; -	sRect.setLeftTopAndSize( splitter_margin, height - title_height - splitter_margin,  -							width - 2*splitter_margin, height - title_height - 2*splitter_margin); -	mMainPanel->setShape(sRect); -} - -void	LLSideTrayTab::onOpen		(const LLSD& key) -{ -	LLPanel *panel = getPanel(); -	if(panel) -		panel->onOpen(key); -} - -// Attempts to get the existing side tray instance. -// Needed to avoid recursive calls of LLSideTray::getInstance(). -LLSideTray* LLSideTrayTab::getSideTray() -{ -	// First, check if the side tray is our parent (i.e. we're attached). -	LLSideTray* side_tray = dynamic_cast<LLSideTray*>(getParent()); -	if (!side_tray) -	{ -		// Detached? Ok, check if the instance exists at all/ -		if (LLSideTray::instanceCreated()) -		{ -			side_tray = LLSideTray::getInstance(); -		} -		else -		{ -			llerrs << "No safe way to get the side tray instance" << llendl; -		} -	} - -	return side_tray; -} - -void LLSideTrayTab::toggleTabDocked(bool toggle_floater /* = true */) -{ -	// *FIX: Calling this method twice per frame would crash the viewer. - -	std::string tab_name = getName(); - -	LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name); -	if (!floater_tab) return; - -	bool docking = !isDocked(); - -	// Hide the "Tear Off" button when a tab gets undocked -	// and show "Dock" button instead. -	getChild<LLButton>("undock")->setVisible(docking); -	getChild<LLButton>("dock")->setVisible(!docking); - -	if (docking) -	{ -		dock(floater_tab); -	} -	else -	{ -		undock(floater_tab); -	} - -	// Open/close the floater *after* we reparent the tab panel, -	// so that it doesn't receive redundant visibility change notifications. -	if (toggle_floater) -	{ -		LLFloaterReg::toggleInstance("side_bar_tab", tab_name); -	} -} - -// Same as toggleTabDocked() apart from making sure that we do exactly what we want. -void LLSideTrayTab::setDocked(bool dock) -{ -	if (isDocked() == dock) -	{ -		llwarns << "Tab " << getName() << " is already " << (dock ? "docked" : "undocked") << llendl; -		return; -	} - -	toggleTabDocked(); -} - -bool LLSideTrayTab::isDocked() const -{ -	return dynamic_cast<LLSideTray*>(getParent()) != NULL; -} - -BOOL LLSideTrayTab::handleScrollWheel(S32 x, S32 y, S32 clicks) -{ -	// Let children handle the event -	LLUICtrl::handleScrollWheel(x, y, clicks); - -	// and then eat it to prevent in-world scrolling (STORM-351). -	return TRUE; -} - -void LLSideTrayTab::dock(LLFloater* floater_tab) -{ -	LLSideTray* side_tray = getSideTray(); -	if (!side_tray) return; - -	// Before docking the tab, reset its (and its children's) transparency to default (STORM-688). -	floater_tab->updateTransparency(TT_DEFAULT); - -	if (!side_tray->addTab(this)) -	{ -		llwarns << "Failed to add tab " << getName() << " to side tray" << llendl; -		return; -	} - -	setRect(side_tray->getLocalRect()); -	reshape(getRect().getWidth(), getRect().getHeight()); - -	// Select the re-docked tab. -	side_tray->selectTabByName(getName()); - -	if (side_tray->getCollapsed()) -	{ -		side_tray->expandSideBar(false); -	} -} - -static void on_minimize(LLSidepanelAppearance* panel, LLSD minimized) -{ -	if (!panel) return; -	bool visible = !minimized.asBoolean(); -	LLSD visibility; -	visibility["visible"] = visible; -	// Do not reset accordion state on minimize (STORM-375) -	visibility["reset_accordion"] = false; -	panel->updateToVisibility(visibility); -} - -void LLSideTrayTab::undock(LLFloater* floater_tab) -{ -	LLSideTray* side_tray = getSideTray(); -	if (!side_tray) return; - -	// Remember whether the tab have been active before detaching -	// because removeTab() will change active tab. -	bool was_active = side_tray->getActiveTab() == this; - -	// Remove the tab from Side Tray's tabs list. -	// We have to do it despite removing the tab from Side Tray's child view tree -	// by addChild(). Otherwise the tab could be accessed by the pointer in LLSideTray::mTabs. -	if (!side_tray->removeTab(this)) -	{ -		llwarns << "Failed to remove tab " << getName() << " from side tray" << llendl; -		return; -	} - -	// If we're undocking while side tray is collapsed we need to explicitly show the panel. -	if (!getVisible()) -	{ -		setVisible(true); -	} - -	floater_tab->addChild(this); -	floater_tab->setTitle(mTabTitle); -	floater_tab->setName(getName()); - -	// Resize handles get obscured by added panel so move them to front. -	floater_tab->moveResizeHandlesToFront(); - -	// Reshape the floater if needed. -	LLRect floater_rect; -	if (floater_tab->hasSavedRect()) -	{ -		// We've got saved rect for the floater, hence no need to reshape it. -		floater_rect = floater_tab->getLocalRect(); -	} -	else -	{ -		// Detaching for the first time. Reshape the floater. -		floater_rect = side_tray->getLocalRect(); - -		// Reduce detached floater height by small BOTTOM_BAR_PAD not to make it flush with the bottom bar. -		floater_rect.mBottom += LLBottomTray::getInstance()->getRect().getHeight() + BOTTOM_BAR_PAD; -		floater_rect.makeValid(); -		floater_tab->reshape(floater_rect.getWidth(), floater_rect.getHeight()); -	} - -	// Reshape the panel. -	{ -		LLRect panel_rect = floater_tab->getLocalRect(); -		panel_rect.mTop -= floater_tab->getHeaderHeight(); -		panel_rect.makeValid(); -		setRect(panel_rect); -		reshape(panel_rect.getWidth(), panel_rect.getHeight()); -	} - -	// Set FOLLOWS_ALL flag for the tab to follow floater dimensions upon resizing. -	setFollowsAll(); - -	// Camera view may need to be changed for appearance panel(STORM-301) on minimize of floater, -	// so setting callback here.  -	if (getName() == "sidebar_appearance") -	{ -		LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance*>(getPanel()); -		if(panel_appearance) -		{ -			floater_tab->setMinimizeCallback(boost::bind(&on_minimize, panel_appearance, _2)); -		} -	} - -	if (!side_tray->getCollapsed()) -	{ -		side_tray->collapseSideBar(); -	} - -	if (!was_active) -	{ -		// When a tab other then current active tab is detached from Side Tray -		// onOpen() should be called as tab visibility is changed. -		onOpen(LLSD()); -	} -} - -LLPanel*	LLSideTrayTab::getPanel() -{ -	LLPanel* panel = dynamic_cast<LLPanel*>(mMainPanel); -	return panel; -} - -LLSideTrayTab*  LLSideTrayTab::createInstance	() -{ -	LLSideTrayTab::Params tab_params;  -	tab_params.tab_title("openclose"); - -	LLSideTrayTab* tab = LLUICtrlFactory::create<LLSideTrayTab>(tab_params); -	return tab; -} - -// Now that we know the definition of LLSideTrayTab, we can implement -// tab_cast. -template <> -LLPanel* tab_cast<LLPanel*>(LLSideTrayTab* tab) { return tab; } - -////////////////////////////////////////////////////////////////////////////// -// LLSideTrayButton -// Side Tray tab button with "tear off" handling. -////////////////////////////////////////////////////////////////////////////// - -class LLSideTrayButton : public LLButton -{ -public: -	/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask) -	{ -		// Route future Mouse messages here preemptively.  (Release on mouse up.) -		// No handler needed for focus lost since this class has no state that depends on it. -		gFocusMgr.setMouseCapture(this); - -		localPointToScreen(x, y, &mDragLastScreenX, &mDragLastScreenY); - -		// Note: don't pass on to children -		return TRUE; -	} - -	/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask) -	{ -		// We only handle the click if the click both started and ended within us -		if( !hasMouseCapture() ) return FALSE; - -		S32 screen_x; -		S32 screen_y; -		localPointToScreen(x, y, &screen_x, &screen_y); - -		S32 delta_x = screen_x - mDragLastScreenX; -		S32 delta_y = screen_y - mDragLastScreenY; - -		LLSideTray* side_tray = LLSideTray::getInstance(); - -		// Check if the tab we are dragging is docked. -		if (!side_tray->isTabAttached(getName())) return FALSE; - -		// Same value is hardcoded in LLDragHandle::handleHover(). -		const S32 undock_threshold = 12; - -		// Detach a tab if it has been pulled further than undock_threshold. -		if (delta_x <= -undock_threshold ||	delta_x >= undock_threshold	|| -			delta_y <= -undock_threshold ||	delta_y >= undock_threshold) -		{ -			LLSideTrayTab* tab = side_tray->getTab(getName()); -			if (!tab) return FALSE; - -			tab->setDocked(false); - -			LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab->getName()); -			if (!floater_tab) return FALSE; - -			LLRect original_rect = floater_tab->getRect(); -			S32 header_snap_y = floater_tab->getHeaderHeight() / 2; -			S32 snap_x = screen_x - original_rect.mLeft - original_rect.getWidth() / 2; -			S32 snap_y = screen_y - original_rect.mTop + header_snap_y; - -			// Move the floater to appear "under" the mouse pointer. -			floater_tab->setRect(original_rect.translate(snap_x, snap_y)); - -			// Snap the mouse pointer to the center of the floater header -			// and call 'mouse down' event handler to begin dragging. -			floater_tab->handleMouseDown(original_rect.getWidth() / 2, -										 original_rect.getHeight() - header_snap_y, -										 mask); - -			return TRUE; -		} - -		return FALSE; -	} - -	void setBadgeDriver(LLSideTrayTabBadgeDriver* driver) -	{ -		mBadgeDriver = driver; -	} - -protected: -	LLSideTrayButton(const LLButton::Params& p) -		: LLButton(p) -		, mDragLastScreenX(0) -		, mDragLastScreenY(0) -		, mBadgeDriver(NULL) -	{} - -	friend class LLUICtrlFactory; - -	void draw() -	{ -		if (mBadgeDriver) -		{ -			setBadgeLabel(mBadgeDriver->getBadgeString()); -		} - -		LLButton::draw(); -	} - -private: -	S32		mDragLastScreenX; -	S32		mDragLastScreenY; - -	LLSideTrayTabBadgeDriver*	mBadgeDriver; -}; - -////////////////////////////////////////////////////////////////////////////// -// LLSideTray -////////////////////////////////////////////////////////////////////////////// - -LLSideTray::Params::Params() -:	collapsed("collapsed",false), -	tab_btn_image_normal("tab_btn_image",LLUI::getUIImage("taskpanel/TaskPanel_Tab_Off.png")), -	tab_btn_image_selected("tab_btn_image_selected",LLUI::getUIImage("taskpanel/TaskPanel_Tab_Selected.png")), -	default_button_width("tab_btn_width",32), -	default_button_height("tab_btn_height",32), -	default_button_margin("tab_btn_margin",0) -{} - -//virtual  -LLSideTray::LLSideTray(const Params& params) -	   : LLPanel(params) -	    ,mActiveTab(0) -		,mCollapsed(false) -		,mCollapseButton(0) -{ -	mCollapsed=params.collapsed; - -	LLUICtrl::CommitCallbackRegistry::Registrar& commit = LLUICtrl::CommitCallbackRegistry::currentRegistrar(); - -	// register handler function to process data from the xml.  -	// panel_name should be specified via "parameter" attribute. -	commit.add("SideTray.ShowPanel", boost::bind(&LLSideTray::showPanel, this, _2, LLUUID::null)); -	commit.add("SideTray.Toggle", boost::bind(&LLSideTray::onToggleCollapse, this)); -	commit.add("SideTray.Collapse", boost::bind(&LLSideTray::collapseSideBar, this)); -	LLTransientFloaterMgr::getInstance()->addControlView(this); -	LLView* side_bar_tabs  = gViewerWindow->getRootView()->getChildView("side_bar_tabs"); -	if (side_bar_tabs != NULL) -	{ -		LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs); -	} - -	LLPanel::Params p; -	p.name = "buttons_panel"; -	p.mouse_opaque = false; -	mButtonsPanel = LLUICtrlFactory::create<LLPanel>(p); -} - - -BOOL LLSideTray::postBuild() -{ -	createButtons(); - -	arrange(); -	selectTabByName("sidebar_home"); - -	if(mCollapsed) -		collapseSideBar(); - -	setMouseOpaque(false); - -	LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLSideTray::handleLoginComplete, this)); - -	// Remember original tabs order, so that we can restore it if user detaches and then re-attaches a tab. -	for (child_vector_const_iter_t it = mTabs.begin(); it != mTabs.end(); ++it) -	{ -		std::string tab_name = (*it)->getName(); -		mOriginalTabOrder.push_back(tab_name); -	} - -	//EXT-8045 -	//connect all already created channels to reflect sidetray collapse/expand -	std::vector<LLChannelManager::ChannelElem>& channels = LLChannelManager::getInstance()->getChannelList(); -	for(std::vector<LLChannelManager::ChannelElem>::iterator it = channels.begin();it!=channels.end();++it) -	{ -		if ((*it).channel) -		{ -			setVisibleWidthChangeCallback(boost::bind(&LLScreenChannelBase::resetPositionAndSize, (*it).channel)); -		} -	} - -	return true; -} - -void LLSideTray::setTabButtonBadgeDriver(std::string tabName, LLSideTrayTabBadgeDriver* driver) -{ -	mTabButtonBadgeDrivers[tabName] = driver; -} - -void LLSideTray::handleLoginComplete() -{ -	//reset tab to "home" tab if it was changesd during login process -	selectTabByName("sidebar_home"); - -	for (badge_map_t::iterator it = mTabButtonBadgeDrivers.begin(); it != mTabButtonBadgeDrivers.end(); ++it) -	{ -		LLButton* button = mTabButtons[it->first]; -		LLSideTrayButton* side_button = dynamic_cast<LLSideTrayButton*>(button); - -		if (side_button) -		{ -			side_button->setBadgeDriver(it->second); -		} -		else -		{ -			llwarns << "Unable to find button " << it->first << " to set the badge driver. " << llendl; -		} -	} - -	detachTabs(); -} - -LLSideTrayTab* LLSideTray::getTab(const std::string& name) -{ -	return findChild<LLSideTrayTab>(name,false); -} - -bool LLSideTray::isTabAttached(const std::string& name) -{ -	LLSideTrayTab* tab = getTab(name); -	if (!tab) return false; - -	return std::find(mTabs.begin(), mTabs.end(), tab) != mTabs.end(); -} - -bool LLSideTray::hasTabs() -{ -	// The open/close tab doesn't count. -	return mTabs.size() > 1; -} - -void LLSideTray::toggleTabButton(LLSideTrayTab* tab) -{ -	if(tab == NULL) -		return; -	std::string name = tab->getName(); -	std::map<std::string,LLButton*>::iterator it = mTabButtons.find(name); -	if(it != mTabButtons.end()) -	{ -		LLButton* btn = it->second; -		bool new_state = !btn->getToggleState(); -		btn->setToggleState(new_state);  -		// Only highlight the tab if side tray is expanded (STORM-157). -		btn->setImageOverlay( new_state && !getCollapsed() ? tab->mImageSelected : tab->mImage ); -	} -} - -LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel_name, const LLSD& params) -{ -	LLView* view = tab->findChildView(panel_name, true); -	if (!view) return NULL; - -	std::string tab_name = tab->getName(); - -	bool tab_attached = isTabAttached(tab_name); - -	if (tab_attached && LLUI::sSettingGroups["config"]->getBOOL("OpenSidePanelsInFloaters")) -	{ -		tab->setDocked(false); -		tab_attached = false; -	} - -	// Select tab and expand Side Tray only when a tab is attached. -	if (tab_attached) -	{ -		selectTabByName(tab_name); -		if (mCollapsed) -			expandSideBar(); -	} -	else -	{ -		LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name); -		if (!floater_tab) return NULL; - -		floater_tab->openFloater(tab_name); -	} - -	LLSideTrayPanelContainer* container = dynamic_cast<LLSideTrayPanelContainer*>(view->getParent()); -	if (container) -	{ -		LLSD new_params = params; -		new_params[LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME] = panel_name; -		container->onOpen(new_params); - -		return container->getCurrentPanel(); -	} - -	LLPanel* panel = dynamic_cast<LLPanel*>(view); -	if (panel) -	{ -		panel->onOpen(params); -	} - -	return panel; -} - -bool LLSideTray::selectTabByIndex(size_t index) -{ -	if(index>=mTabs.size()) -		return false; - -	LLSideTrayTab* sidebar_tab = mTabs[index]; -	return selectTabByName(sidebar_tab->getName()); -} - -bool LLSideTray::selectTabByName(const std::string& name, bool keep_prev_visible) -{ -	LLSideTrayTab* tab_to_keep_visible = NULL; -	LLSideTrayTab* new_tab = getTab(name); -	if (!new_tab) return false; - -	// Bail out if already selected. -	if (new_tab == mActiveTab) -		return false; - -	//deselect old tab -	if (mActiveTab) -	{ -		// Keep previously active tab visible if requested. -		if (keep_prev_visible) tab_to_keep_visible = mActiveTab; -	toggleTabButton(mActiveTab); -	} - -	//select new tab -	mActiveTab = new_tab; - -	if (mActiveTab) -	{ -	toggleTabButton(mActiveTab); -	LLSD key;//empty -	mActiveTab->onOpen(key); -	} - -	//arrange(); -	 -	//hide all tabs - show active tab -	child_vector_const_iter_t child_it; -	for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) -	{ -		LLSideTrayTab* sidebar_tab = *child_it; - -		bool vis = sidebar_tab == mActiveTab; - -		// Force keeping the tab visible if requested. -		vis |= sidebar_tab == tab_to_keep_visible; - -		// When the last tab gets detached, for a short moment the "Toggle Sidebar" pseudo-tab -		// is shown. So, to avoid the flicker we make sure it never gets visible. -		vis &= (*child_it)->getName() != "sidebar_openclose"; - -		sidebar_tab->setVisible(vis); -	} -	return true; -} - -bool LLSideTray::addChild(LLView* view, S32 tab_group) -{ -	LLSideTrayTab* tab_panel = dynamic_cast<LLSideTrayTab*>(view); - -	if (tab_panel) -	{ -		mTabs.push_back(tab_panel); -	} -	 -	return LLUICtrl::addChild(view, tab_group); -} - -bool LLSideTray::removeTab(LLSideTrayTab* tab) -{ -	if (!tab) return false; -	std::string tab_name = tab->getName(); - -	// Look up the tab in the list of known tabs. -	child_vector_iter_t tab_it = std::find(mTabs.begin(), mTabs.end(), tab); -	if (tab_it == mTabs.end()) -	{ -		llwarns << "Cannot find tab named " << tab_name << llendl; -		return false; -	} - -	// Find the button corresponding to the tab. -	button_map_t::iterator btn_it = mTabButtons.find(tab_name); -	if (btn_it == mTabButtons.end()) -	{ -		llwarns << "Cannot find button for tab named " << tab_name << llendl; -		return false; -	} -	LLButton* btn = btn_it->second; - -	// Deselect the tab. -	if (mActiveTab == tab) -	{ -		// Select the next tab (or first one, if we're removing the last tab), -		// skipping the fake open/close tab (STORM-155). -		child_vector_iter_t next_tab_it = tab_it; -		do -		{ -			next_tab_it = (next_tab_it < (mTabs.end() - 1)) ? next_tab_it + 1 : mTabs.begin(); -		} -		while ((*next_tab_it)->getName() == "sidebar_openclose"); - -		selectTabByName((*next_tab_it)->getName(), true); // Don't hide the tab being removed. -	} - -	// Remove the tab. -	removeChild(tab); -	mTabs.erase(tab_it); - -	// Add the tab to detached tabs list. -	mDetachedTabs.push_back(tab); - -	// Remove the button from the buttons panel so that it isn't drawn anymore. -	mButtonsPanel->removeChild(btn); - -	// Re-arrange remaining tabs. -	arrange(); - -	return true; -} - -bool LLSideTray::addTab(LLSideTrayTab* tab) -{ -	if (tab == NULL) return false; - -	std::string tab_name = tab->getName(); - -	// Make sure the tab isn't already in the list. -	if (std::find(mTabs.begin(), mTabs.end(), tab) != mTabs.end()) -	{ -		llwarns << "Attempt to re-add existing tab " << tab_name << llendl; -		return false; -	} - -	// Look up the corresponding button. -	button_map_t::const_iterator btn_it = mTabButtons.find(tab_name); -	if (btn_it == mTabButtons.end()) -	{ -		llwarns << "Tab " << tab_name << " has no associated button" << llendl; -		return false; -	} -	LLButton* btn = btn_it->second; - -	// Insert the tab at its original position. -	LLUICtrl::addChild(tab); -	{ -		tab_order_vector_const_iter_t new_tab_orig_pos = -			std::find(mOriginalTabOrder.begin(), mOriginalTabOrder.end(), tab_name); -		llassert(new_tab_orig_pos != mOriginalTabOrder.end()); -		child_vector_iter_t insert_pos = mTabs.end(); - -		for (child_vector_iter_t tab_it = mTabs.begin(); tab_it != mTabs.end(); ++tab_it) -		{ -			tab_order_vector_const_iter_t cur_tab_orig_pos = -				std::find(mOriginalTabOrder.begin(), mOriginalTabOrder.end(), (*tab_it)->getName()); -			llassert(cur_tab_orig_pos != mOriginalTabOrder.end()); - -			if (new_tab_orig_pos < cur_tab_orig_pos) -			{ -				insert_pos = tab_it; -				break; -			} -		} - -		mTabs.insert(insert_pos, tab); -	} - -	// Add the button to the buttons panel so that it's drawn again. -	mButtonsPanel->addChildInBack(btn); - -	// Arrange tabs after inserting a new one. -	arrange(); - -	// Remove the tab from the list of detached tabs. -	child_vector_iter_t tab_it = std::find(mDetachedTabs.begin(), mDetachedTabs.end(), tab); -	if (tab_it != mDetachedTabs.end()) -	{ -		mDetachedTabs.erase(tab_it); -	} - -	return true; -} - -LLButton* LLSideTrayTab::createButton(bool allowTearOff, LLUICtrl::commit_callback_t callback) -{ -	static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>());	 - -	LLRect rect; -	rect.setOriginAndSize(0, 0, sidetray_params.default_button_width, sidetray_params.default_button_height);  - -	LLButton::Params bparams; - -	// Append "_button" to the side tray tab name -	std::string button_name = getName() + "_button"; -	bparams.name(button_name); -	bparams.follows.flags (FOLLOWS_LEFT | FOLLOWS_TOP); -	bparams.rect (rect); -	bparams.tab_stop(false); -	bparams.image_unselected(sidetray_params.tab_btn_image_normal); -	bparams.image_selected(sidetray_params.tab_btn_image_selected); -	bparams.image_disabled(sidetray_params.tab_btn_image_normal); -	bparams.image_disabled_selected(sidetray_params.tab_btn_image_selected); - -	if (mHasBadge) -	{ -		bparams.badge = mBadgeParams; -	} - -	LLButton* button; -	if (allowTearOff) -	{ -		button = LLUICtrlFactory::create<LLSideTrayButton>(bparams); -	} -	else -	{ -		// "Open/Close" button shouldn't allow "tear off" -		// hence it is created as LLButton instance. -		button = LLUICtrlFactory::create<LLButton>(bparams); -	} - -	button->setClickedCallback(callback); - -	button->setToolTip(mTabTitle); - -	if(mImage.length()) -	{ -		button->setImageOverlay(mImage); -	} - -	return button; -} - -void LLSideTray::createButtons() -{ -	//create buttons for tabs -	child_vector_const_iter_t child_it = mTabs.begin(); -	for ( ; child_it != mTabs.end(); ++child_it) -	{ -		LLSideTrayTab* sidebar_tab = *child_it; - -		std::string name = sidebar_tab->getName(); -		 -		// The "OpenClose" button will open/close the whole panel -		if (name == "sidebar_openclose") -		{ -			mCollapseButton = sidebar_tab->createButton(false, boost::bind(&LLSideTray::onToggleCollapse, this)); - -			mButtonsPanel->addChildInBack(mCollapseButton); - -			LLHints::registerHintTarget("side_panel_btn", mCollapseButton->getHandle()); -		} -		else -		{ -			LLButton* button = sidebar_tab->createButton(true, boost::bind(&LLSideTray::onTabButtonClick, this, name)); - -			mButtonsPanel->addChildInBack(button); - -			mTabButtons[name] = button; -		} -	} - -	LLHints::registerHintTarget("inventory_btn", mTabButtons["sidebar_inventory"]->getHandle()); -} - -void		LLSideTray::processTriState () -{ -	if(mCollapsed) -		expandSideBar(); -	else -	{ -#if 0 // *TODO: EXT-2092 -		 -		// Tell the active task panel to switch to its default view -		// or collapse side tray if already on the default view. -		LLSD info; -		info["task-panel-action"] = "handle-tri-state"; -		mActiveTab->notifyChildren(info); -#else -		collapseSideBar(); -#endif -	} -} - -void		LLSideTray::onTabButtonClick(string name) -{ -	LLSideTrayTab* tab = getTab(name); -	if (!tab) return; - -	if(tab == mActiveTab) -	{ -		processTriState (); -		return; -	} -	selectTabByName	(name); -	if(mCollapsed) -		expandSideBar(); -} - -void		LLSideTray::onToggleCollapse() -{ -	LLFirstUse::notUsingSidePanel(false); -	if(mCollapsed) -	{ -		expandSideBar(); -		//selectTabByName("sidebar_openclose"); -	} -	else -		collapseSideBar(); -} - - -void LLSideTray::reflectCollapseChange() -{ -	updateSidetrayVisibility(); - -	setFocus(!mCollapsed); - -	gFloaterView->refresh(); -} - -void LLSideTray::arrange() -{ -	static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>());	 - -	updateSidetrayVisibility(); -	 -	LLRect ctrl_rect; -	ctrl_rect.setLeftTopAndSize(0, -								mButtonsPanel->getRect().getHeight() - sidetray_params.default_button_width, -								sidetray_params.default_button_width, -								sidetray_params.default_button_height); - -	mCollapseButton->setRect(ctrl_rect); - -	//arrange tab buttons -	//arrange tab buttons -	child_vector_const_iter_t child_it; -	int offset = (sidetray_params.default_button_height+sidetray_params.default_button_margin)*2; -	for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)	 -	{ -		LLSideTrayTab* sidebar_tab = *child_it; -		 -		ctrl_rect.setLeftTopAndSize(0, -									mButtonsPanel->getRect().getHeight()-offset, -									sidetray_params.default_button_width, -									sidetray_params.default_button_height); - -		if(mTabButtons.find(sidebar_tab->getName()) == mTabButtons.end()) -			continue; - -		LLButton* btn = mTabButtons[sidebar_tab->getName()]; - -		btn->setRect(ctrl_rect); -		offset+=sidetray_params.default_button_height; -		offset+=sidetray_params.default_button_margin; - -		btn->setVisible(ctrl_rect.mBottom > 0); -	} - -	//arrange tabs -	for ( child_vector_t::iterator child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) -	{ -		LLSideTrayTab* sidebar_tab = *child_it; -		sidebar_tab->setShape(getLocalRect()); -	} - -	// The tab buttons should be shown only if there is at least one non-detached tab. -	// Also hide them in mouse-look mode. -	mButtonsPanel->setVisible(hasTabs() && !gAgentCamera.cameraMouselook()); -} - -// Detach those tabs that were detached when the viewer exited last time. -void LLSideTray::detachTabs() -{ -	// copy mTabs because LLSideTray::toggleTabDocked() modifies it. -	child_vector_t tabs = mTabs; - -	for (child_vector_const_iter_t it = tabs.begin(); it != tabs.end(); ++it) -	{ -		LLSideTrayTab* tab = *it; - -		std::string floater_ctrl_name = LLFloater::getControlName("side_bar_tab", LLSD(tab->getName())); -		std::string vis_ctrl_name = LLFloaterReg::getVisibilityControlName(floater_ctrl_name); -		if (!LLFloater::getControlGroup()->controlExists(vis_ctrl_name)) continue; - -		bool is_visible = LLFloater::getControlGroup()->getBOOL(vis_ctrl_name); -		if (!is_visible) continue; - -		llassert(isTabAttached(tab->getName())); -		tab->setDocked(false); -	} -} - -void LLSideTray::collapseSideBar() -{ -	mCollapsed = true; -	// Reset all overlay images, because there is no "selected" tab when the -	// whole side tray is hidden. -	child_vector_const_iter_t it = mTabs.begin(); -	for ( ; it != mTabs.end(); ++it ) -	{ -		LLSideTrayTab* tab = *it; -		std::string name = tab->getName(); -		std::map<std::string,LLButton*>::const_iterator btn_it = -			mTabButtons.find(name); -		if (btn_it != mTabButtons.end()) -		{ -			LLButton* btn = btn_it->second; -			btn->setImageOverlay( tab->mImage ); -		} -	} -		 -	// OpenClose tab doesn't put its button in mTabButtons -	LLSideTrayTab* openclose_tab = getTab("sidebar_openclose"); -	if (openclose_tab) -	{ -		mCollapseButton->setImageOverlay( openclose_tab->mImage ); -	} -	//mActiveTab->setVisible(FALSE); -	reflectCollapseChange(); -	setFocus( FALSE ); -} - -void LLSideTray::expandSideBar(bool open_active) -{ -	mCollapsed = false; -	LLSideTrayTab* openclose_tab = getTab("sidebar_openclose"); -	if (openclose_tab) -	{ -		mCollapseButton->setImageOverlay( openclose_tab->mImageSelected ); -	} - -	if (open_active) -	{ -		mActiveTab->onOpen(LLSD()); -	} - -	reflectCollapseChange(); - - -	std::string name = mActiveTab->getName(); -	std::map<std::string,LLButton*>::const_iterator btn_it = -		mTabButtons.find(name); -	if (btn_it != mTabButtons.end()) -	{ -		LLButton* btn = btn_it->second; -		btn->setImageOverlay( mActiveTab->mImageSelected  ); -	} -} - -void LLSideTray::highlightFocused() -{ -	/* uncomment in case something change -	if(!mActiveTab) -		return; -	BOOL dependent_has_focus = gFocusMgr.childHasKeyboardFocus(this); -	setBackgroundOpaque( dependent_has_focus );  -	mActiveTab->setBackgroundOpaque( dependent_has_focus );  -	*/ -} - -//virtual -BOOL		LLSideTray::handleMouseDown	(S32 x, S32 y, MASK mask) -{ -	BOOL ret = LLPanel::handleMouseDown(x,y,mask); -	if(ret) -		setFocus(true);	 -	return ret; -} - -void LLSideTray::reshape(S32 width, S32 height, BOOL called_from_parent) -{ -	LLPanel::reshape(width, height, called_from_parent); -	if(!mActiveTab) -		return; -	 -	arrange(); -} - -// This is just LLView::findChildView specialized to restrict the search to LLPanels. -// Optimization for EXT-4068 to avoid searching down to the individual item level -// when inventories are large. -LLPanel *findChildPanel(LLPanel *panel, const std::string& name, bool recurse) -{ -	for (LLView::child_list_const_iter_t child_it = panel->beginChild(); -		 child_it != panel->endChild(); ++child_it) -	{ -		LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it); -		if (!child_panel) -			continue; -		if (child_panel->getName() == name) -			return child_panel; -	} -	if (recurse) -	{ -		for (LLView::child_list_const_iter_t child_it = panel->beginChild(); -			 child_it != panel->endChild(); ++child_it) -		{ -			LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it); -			if (!child_panel) -				continue; -			LLPanel *found_panel = findChildPanel(child_panel,name,recurse); -			if (found_panel) -			{ -				return found_panel; -			} -		} -	} -	return NULL; -} - -/** - * Activate tab with "panel_name" panel - * if no such tab - return false, otherwise true. - * TODO* In some cases a pointer to a panel of - * a specific class may be needed so this method - * would need to use templates. - */ -LLPanel*	LLSideTray::showPanel		(const std::string& panel_name, const LLSD& params) -{ -	LLPanel* new_panel = NULL; - -	// Look up the tab in the list of detached tabs. -	child_vector_const_iter_t child_it; -	for ( child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it) -	{ -		new_panel = openChildPanel(*child_it, panel_name, params); -		if (new_panel) break; -	} - -	// Look up the tab in the list of attached tabs. -	for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) -	{ -		new_panel = openChildPanel(*child_it, panel_name, params); -		if (new_panel) break; -	} - -	return new_panel; -} - -bool LLSideTray::hidePanel(const std::string& panel_name) -{ -	bool panelHidden = false; -	 -	LLPanel* panelp = getPanel(panel_name); - -	if (panelp) -	{ -		LLView* parentp = panelp->getParent(); -		 -		// Collapse the side bar if the panel or the panel's parent is an attached tab -		if (isTabAttached(panel_name) || (parentp && isTabAttached(parentp->getName()))) -		{ -			collapseSideBar(); -			panelHidden = true; -		} -		else -		{ -			panelHidden = LLFloaterReg::hideInstance("side_bar_tab", panel_name); -			 -			if (!panelHidden) -			{ -				// Look up the panel in the list of detached tabs. -				for (child_vector_const_iter_t child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it) -				{ -					LLPanel *detached_panel = dynamic_cast<LLPanel*>(*child_it); -					 -					if (detached_panel) -					{ -						// Hide this detached panel if it is a parent of our panel -						if (findChildPanel(detached_panel, panel_name, true) != NULL) -						{ -							panelHidden = LLFloaterReg::hideInstance("side_bar_tab", detached_panel->getName()); -							break; -						} -					} -				} -			} -		} -	} -	 -	return panelHidden; -} - -void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params) -{ -	if(!sub_panel) -		return; - -	// If a panel is visible and attached to Side Tray (has LLSideTray among its ancestors) -	// it should be toggled off by collapsing Side Tray. -	if (sub_panel->isInVisibleChain() && sub_panel->hasAncestor(this)) -	{ -		LLSideTray::getInstance()->collapseSideBar(); -	} -	else -	{ -		LLSideTray::getInstance()->showPanel(panel_name, params); -	} -} - -LLPanel* LLSideTray::getPanel(const std::string& panel_name) -{ -	// Look up the panel in the list of detached tabs. -	for ( child_vector_const_iter_t child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it) -	{ -		LLPanel *panel = findChildPanel(*child_it,panel_name,true); -		if(panel) -		{ -			return panel; -		} -	} - -	// Look up the panel in the list of attached tabs. -	for ( child_vector_const_iter_t child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) -	{ -		LLPanel *panel = findChildPanel(*child_it,panel_name,true); -		if(panel) -		{ -			return panel; -		} -	} -	return NULL; -} - -LLPanel*	LLSideTray::getActivePanel() -{ -	if (mActiveTab && !mCollapsed) -	{ -		return mActiveTab->getPanel(); -	} -	return NULL; -} - -bool		LLSideTray::isPanelActive(const std::string& panel_name) -{ -	LLPanel *panel = getActivePanel(); -	if (!panel) return false; -	return (panel->getName() == panel_name); -} - -void LLSideTray::setTabDocked(const std::string& tab_name, bool dock, bool toggle_floater /* = true*/) -{ -	// Lookup tab by name. -	LLSideTrayTab* tab = getTab(tab_name); -	if (!tab) -	{	// not a docked tab, look through detached tabs -		for(child_vector_iter_t tab_it = mDetachedTabs.begin(), tab_end_it = mDetachedTabs.end(); -			tab_it != tab_end_it; -			++tab_it) -		{ -			if ((*tab_it)->getName() == tab_name) -			{ -				tab = *tab_it; -				break; -			} -		} - -	} - -	llassert(tab != NULL); - -	// Toggle its dock state. -	if (tab && tab->isDocked() != dock) -	{ -		tab->toggleTabDocked(toggle_floater); -	} -} - - -void	LLSideTray::updateSidetrayVisibility() -{ -	// set visibility of parent container based on collapsed state -	LLView* parent = getParent(); -	if (parent) -	{ -		bool old_visibility = parent->getVisible(); -		bool new_visibility = !mCollapsed && !gAgentCamera.cameraMouselook(); - -		if (old_visibility != new_visibility) -		{ -			parent->setVisible(new_visibility); - -			// Signal change of visible width. -			llinfos << "Visible: " << new_visibility << llendl; -			mVisibleWidthChangeSignal(this, new_visibility); -		} -	} -} - -S32 LLSideTray::getVisibleWidth() -{ -	return (isInVisibleChain() && !mCollapsed) ? getRect().getWidth() : 0; -} - -void LLSideTray::setVisibleWidthChangeCallback(const commit_signal_t::slot_type& cb) -{ -	mVisibleWidthChangeSignal.connect(cb); -} diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h deleted file mode 100644 index 17158329dc..0000000000 --- a/indra/newview/llsidetray.h +++ /dev/null @@ -1,260 +0,0 @@ -/**  - * @file LLSideTray.h - * @brief SideBar header file - * - * $LicenseInfo:firstyear=2004&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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_LLSIDETRAY_H_ -#define LL_LLSIDETRAY_H_ - -#include "llpanel.h" -#include "string" - -class LLAccordionCtrl; -class LLSideTrayTab; - -// Define an interface for side tab button badge values -class LLSideTrayTabBadgeDriver -{ -public: -	virtual std::string getBadgeString() const = 0; -}; - -// Deal with LLSideTrayTab being opaque. Generic do-nothing cast... -template <class T> -T tab_cast(LLSideTrayTab* tab) { return tab; } -// specialized for implementation in presence of LLSideTrayTab definition -template <> -LLPanel* tab_cast<LLPanel*>(LLSideTrayTab* tab); - -// added inheritance from LLDestroyClass<LLSideTray> to enable Side Tray perform necessary actions  -// while disconnecting viewer in LLAppViewer::disconnectViewer(). -// LLDestroyClassList::instance().fireCallbacks() calls destroyClass method. See EXT-245. -class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray> -{ -	friend class LLUICtrlFactory; -	friend class LLDestroyClass<LLSideTray>; -	friend class LLSideTrayTab; -	friend class LLSideTrayButton; -public: - -	LOG_CLASS(LLSideTray); - -	struct Params  -	:	public LLInitParam::Block<Params, LLPanel::Params> -	{ -		// initial state -		Optional<bool>				collapsed; -		Optional<LLUIImage*>		tab_btn_image_normal, -									tab_btn_image_selected; -		 -		Optional<S32>				default_button_width, -									default_button_height, -									default_button_margin; -		 -		Params(); -	}; - -	static LLSideTray*	getInstance		(); -	static bool			instanceCreated	(); -protected: -	LLSideTray(const Params& params); -	typedef std::vector<LLSideTrayTab*> child_vector_t; -	typedef child_vector_t::iterator					child_vector_iter_t; -	typedef child_vector_t::const_iterator  			child_vector_const_iter_t; -	typedef child_vector_t::reverse_iterator 			child_vector_reverse_iter_t; -	typedef child_vector_t::const_reverse_iterator 		child_vector_const_reverse_iter_t; -	typedef std::vector<std::string>					tab_order_vector_t; -	typedef tab_order_vector_t::const_iterator			tab_order_vector_const_iter_t; - -public: - -	// interface functions -	     -	/** -	 * Select tab with specific name and set it active -	 * -	 * @param name				Tab to switch to. -	 * @param keep_prev_visible	Whether to keep the previously selected tab visible. -	 */ -	bool 		selectTabByName	(const std::string& name, bool keep_prev_visible = false); -	 -	/** -     * Select tab with specific index and set it active     -     */ -	bool		selectTabByIndex(size_t index); - -	/** -	 * Activate tab with "panel_name" panel -	 * if no such tab - return NULL, otherwise a pointer to the panel -	 * Pass params as array, or they may be overwritten(example - params["name"]="nearby") -	 */ -	LLPanel*	showPanel		(const std::string& panel_name, const LLSD& params = LLSD()); - -	bool		hidePanel		(const std::string& panel_name); - -	/** -	 * Toggling Side Tray tab which contains "sub_panel" child of "panel_name" panel. -	 * If "sub_panel" is not visible Side Tray is opened to display it, -	 * otherwise Side Tray is collapsed. -	 * params are passed to "panel_name" panel onOpen(). -	 */ -	void		togglePanel		(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params = LLSD()); - -	/* -	 * get the panel (don't show it or do anything else with it) -	 */ -    LLPanel*	getPanel		(const std::string& panel_name); -    LLPanel*	getActivePanel	(); -    bool		isPanelActive	(const std::string& panel_name); - -	void		setTabDocked(const std::string& tab_name, bool dock, bool toggle_floater = true); - -	/* -	 * get the panel of given type T (don't show it or do anything else with it) -	 */ -	template <typename T> -	T* getPanel(const std::string& panel_name) -	{ -		T* panel = dynamic_cast<T*>(getPanel(panel_name)); -		if (!panel) -		{ -			llwarns << "Child named \"" << panel_name << "\" of type " << typeid(T*).name() << " not found" << llendl; -			return NULL; -		} -		return panel; -	} - -	/* -     * collapse SideBar, hiding visible tab and moving tab buttons -     * to the right corner of the screen -     */ -	void		collapseSideBar	(); -     -	/* -     * expand SideBar -     * -     * @param open_active Whether to call onOpen() for the active tab. -     */ -	void		expandSideBar(bool open_active = true); - - -	/** -	 *hightlight if focused. manly copypaste from highlightFocusedFloater -	 */ -	void		highlightFocused(); - -	void		setVisible(BOOL visible) -	{ -		if (getParent()) getParent()->setVisible(visible); -	} - -	LLPanel*	getButtonsPanel() { return mButtonsPanel; } - -	bool		getCollapsed() { return mCollapsed; } - -	void		setTabButtonBadgeDriver(std::string tabName, LLSideTrayTabBadgeDriver* driver); - -public: -	virtual ~LLSideTray(){}; - -    virtual BOOL postBuild(); - -	BOOL		handleMouseDown	(S32 x, S32 y, MASK mask); -	 -	void		reshape			(S32 width, S32 height, BOOL called_from_parent = TRUE); - - -	/** -	 * @return side tray width if it's visible and expanded, 0 otherwise. -	 * -	 * Not that width of the tab buttons is not included. -	 * -	 * @see setVisibleWidthChangeCallback() -	 */ -	S32			getVisibleWidth(); - -	void		setVisibleWidthChangeCallback(const commit_signal_t::slot_type& cb); - -	void		updateSidetrayVisibility(); - -	void		handleLoginComplete(); - -	bool 		isTabAttached	(const std::string& name); - -protected: -	bool		addChild		(LLView* view, S32 tab_group); -	bool		removeTab		(LLSideTrayTab* tab); // Used to detach tabs temporarily -	bool		addTab			(LLSideTrayTab* tab); // Used to re-attach tabs -	bool		hasTabs			(); - -	const LLSideTrayTab*	getActiveTab() const { return mActiveTab; } -	LLSideTrayTab* 			getTab(const std::string& name); - -	void		createButtons	(); - -	void		arrange			(); -	void		detachTabs		(); -	void		reflectCollapseChange(); -	void		processTriState (); - -	void		toggleTabButton	(LLSideTrayTab* tab); - -	LLPanel*	openChildPanel	(LLSideTrayTab* tab, const std::string& panel_name, const LLSD& params); - -	void		onTabButtonClick(std::string name); -	void		onToggleCollapse(); - -private: -	// Implementation of LLDestroyClass<LLSideTray> -	static void destroyClass() -	{ -		// Disable SideTray to avoid crashes. EXT-245 -		if (LLSideTray::instanceCreated()) -			LLSideTray::getInstance()->setEnabled(FALSE); -	} - -private: -	// Since we provide no public way to query mTabs and mDetachedTabs, give -	// LLSideTrayListener friend access. -	friend class LLSideTrayListener; -	LLPanel*						mButtonsPanel; -	typedef std::map<std::string,LLButton*> button_map_t; -	button_map_t					mTabButtons; -	typedef std::map<std::string,LLSideTrayTabBadgeDriver*> badge_map_t; -	badge_map_t						mTabButtonBadgeDrivers; -	child_vector_t					mTabs; -	child_vector_t					mDetachedTabs; -	tab_order_vector_t				mOriginalTabOrder; -	LLSideTrayTab*					mActiveTab;	 -	 -	commit_signal_t					mVisibleWidthChangeSignal; - -	LLButton*						mCollapseButton; -	bool							mCollapsed; -	 -	static LLSideTray*				sInstance; -}; - -#endif - diff --git a/indra/newview/llsidetraylistener.cpp b/indra/newview/llsidetraylistener.cpp deleted file mode 100644 index cd6fa28948..0000000000 --- a/indra/newview/llsidetraylistener.cpp +++ /dev/null @@ -1,179 +0,0 @@ -/** - * @file   llsidetraylistener.cpp - * @author Nat Goodspeed - * @date   2011-02-15 - * @brief  Implementation for llsidetraylistener. - *  - * $LicenseInfo:firstyear=2011&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, 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$ - */ - -// Precompiled header -#include "llviewerprecompiledheaders.h" -// associated header -#include "llsidetraylistener.h" -// STL headers -// std headers -// external library headers -// other Linden headers -#include "llsidetray.h" -#include "llsdutil.h" - -LLSideTrayListener::LLSideTrayListener(const Getter& getter): -    LLEventAPI("LLSideTray", -               "Operations on side tray (e.g. query state, query tabs)"), -    mGetter(getter) -{ -    add("getCollapsed", "Send on [\"reply\"] an [\"open\"] Boolean", -        &LLSideTrayListener::getCollapsed, LLSDMap("reply", LLSD())); -    add("getTabs", -        "Send on [\"reply\"] a map of tab names and info about them", -        &LLSideTrayListener::getTabs, LLSDMap("reply", LLSD())); -    add("getPanels", -        "Send on [\"reply\"] data about panels available with SideTray.ShowPanel", -        &LLSideTrayListener::getPanels, LLSDMap("reply", LLSD())); -} - -void LLSideTrayListener::getCollapsed(const LLSD& event) const -{ -    sendReply(LLSDMap("open", ! mGetter()->getCollapsed()), event); -} - -void LLSideTrayListener::getTabs(const LLSD& event) const -{ -    LLSD reply; - -    LLSideTray* tray = mGetter(); -    LLSD::Integer ord(0); -    for (LLSideTray::child_list_const_iter_t chi(tray->beginChild()), chend(tray->endChild()); -         chi != chend; ++chi, ++ord) -    { -        LLView* child = *chi; -        // How much info is important? Toss in as much as seems reasonable for -        // each tab. But to me, at least for the moment, the most important -        // item is the tab name. -        LLSD info; -        // I like the idea of returning a map keyed by tab name. But as -        // compared to an array of maps, that loses sequence information. -        // Address that by indicating the original order in each map entry. -        info["ord"] = ord; -        info["visible"] = bool(child->getVisible()); -        info["enabled"] = bool(child->getEnabled()); -        info["available"] = child->isAvailable(); -        reply[child->getName()] = info; -    } - -    sendReply(reply, event); -} - -static LLSD getTabInfo(LLPanel* tab) -{ -    LLSD panels; -    for (LLPanel::tree_iterator_t ti(tab->beginTreeDFS()), tend(tab->endTreeDFS()); -         ti != tend; ++ti) -    { -        // *ti is actually an LLView*, which had better not be NULL -        LLView* view(*ti); -        if (! view) -        { -            LL_ERRS("LLSideTrayListener") << "LLSideTrayTab '" << tab->getName() -                                          << "' has a NULL child LLView*" << LL_ENDL; -        } - -        // The logic we use to decide what "panel" names to return is heavily -        // based on LLSideTray::showPanel(): the function that actually -        // implements the "SideTray.ShowPanel" operation. showPanel(), in -        // turn, depends on LLSideTray::openChildPanel(): when -        // openChildPanel() returns non-NULL, showPanel() stops searching -        // attached and detached LLSideTrayTab tabs. - -        // For each LLSideTrayTab, openChildPanel() first calls -        // findChildView(panel_name, true). In other words, panel_name need -        // not be a direct LLSideTrayTab child, it's sought recursively. -        // That's why we use (begin|end)TreeDFS() in this loop. - -        // But this tree_iterator_t loop will actually traverse every widget -        // in every panel. Returning all those names will not help our caller: -        // passing most such names to openChildPanel() would not do what we -        // want. Even though the code suggests that passing ANY valid -        // side-panel widget name to openChildPanel() will open the tab -        // containing that widget, results could get confusing since followup -        // (onOpen()) logic wouldn't be invoked, and showPanel() wouldn't stop -        // searching because openChildPanel() would return NULL. - -        // We must filter these LLView items, using logic that (sigh!) mirrors -        // openChildPanel()'s own. - -        // openChildPanel() returns a non-NULL LLPanel* when either: -        // - the LLView is a direct child of an LLSideTrayPanelContainer -        // - the LLView is itself an LLPanel. -        // But as LLSideTrayPanelContainer can directly contain LLView items -        // that are NOT themselves LLPanels (e.g. "sidebar_me" contains an -        // LLButton called "Jump Right Arrow"), we'd better focus only on -        // LLSideTrayPanelContainer children that are themselves LLPanel -        // items. Which means that the second test completely subsumes the -        // first. -        LLPanel* panel(dynamic_cast<LLPanel*>(view)); -        if (panel) -        { -            // Maybe it's overkill to construct an LLSD::Map for each panel, but -            // the possibility remains that we might want to deliver more info -            // about each panel than just its name. -            panels.append(LLSDMap("name", panel->getName())); -        } -    } - -    return LLSDMap("panels", panels); -} - -void LLSideTrayListener::getPanels(const LLSD& event) const -{ -    LLSD reply; - -    LLSideTray* tray = mGetter(); -    // Iterate through the attached tabs. -    LLSD::Integer ord(0); -    for (LLSideTray::child_vector_t::const_iterator -             ati(tray->mTabs.begin()), atend(tray->mTabs.end()); -         ati != atend; ++ati) -    { -        // We don't have access to LLSideTrayTab: the class definition is -        // hidden in llsidetray.cpp. But as LLSideTrayTab isa LLPanel, use the -        // LLPanel API. Unfortunately, without the LLSideTrayTab definition, -        // the compiler doesn't even know this LLSideTrayTab* is an LLPanel*. -        // Persuade it. -        LLPanel* tab(tab_cast<LLPanel*>(*ati)); -        reply[tab->getName()] = getTabInfo(tab).with("attached", true).with("ord", ord); -    } - -    // Now iterate over the detached tabs. These can also be opened via -    // SideTray.ShowPanel. -    ord = 0; -    for (LLSideTray::child_vector_t::const_iterator -             dti(tray->mDetachedTabs.begin()), dtend(tray->mDetachedTabs.end()); -         dti != dtend; ++dti) -    { -        LLPanel* tab(tab_cast<LLPanel*>(*dti)); -        reply[tab->getName()] = getTabInfo(tab).with("attached", false).with("ord", ord); -    } - -    sendReply(reply, event); -} diff --git a/indra/newview/llsidetraypanelcontainer.cpp b/indra/newview/llsidetraypanelcontainer.cpp index 214f595772..95a12c7c23 100644 --- a/indra/newview/llsidetraypanelcontainer.cpp +++ b/indra/newview/llsidetraypanelcontainer.cpp @@ -32,10 +32,10 @@ static LLDefaultChildRegistry::Register<LLSideTrayPanelContainer> r2("panel_cont  std::string LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME = "sub_panel_name";  LLSideTrayPanelContainer::Params::Params() - : default_panel_name("default_panel_name") +:	default_panel_name("default_panel_name")  {  	// Always hide tabs. -	hide_tabs(true); +	changeDefault(hide_tabs, true);  }  LLSideTrayPanelContainer::LLSideTrayPanelContainer(const Params& p) diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp index 4cf1df1655..a853726dea 100644 --- a/indra/newview/llslurl.cpp +++ b/indra/newview/llslurl.cpp @@ -273,11 +273,11 @@ LLSLURL::LLSLURL(const std::string& slurl)  			mRegion = LLURI::unescape(path_array[0].asString());  			path_array.erase(0); -			// parse the x, y, z -			if(path_array.size() >= 3) +			// parse the x, y, and optionally z +			if(path_array.size() >= 2)  			{	 -			  mPosition = LLVector3(path_array); +			  mPosition = LLVector3(path_array); // this construction handles LLSD without all components (values default to 0.f)  			  if((F32(mPosition[VX]) < 0.f) ||                                (mPosition[VX] > REGION_WIDTH_METERS) ||  			     (F32(mPosition[VY]) < 0.f) ||  diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index f99afa923b..6c2b71dd0a 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -47,6 +47,7 @@  #include "llvoavatar.h"  #include "llvolumemgr.h"  #include "lltextureatlas.h" +#include "llglslshader.h"  static LLFastTimer::DeclareTimer FTM_FRUSTUM_CULL("Frustum Culling");  static LLFastTimer::DeclareTimer FTM_CULL_REBOUND("Cull Rebound"); @@ -522,6 +523,11 @@ void LLSpatialGroup::clearDrawMap()  	mDrawMap.clear();  } +BOOL LLSpatialGroup::isHUDGroup()  +{ +	return mSpatialPartition && mSpatialPartition->isHUDPartition() ;  +} +  BOOL LLSpatialGroup::isRecentlyVisible() const  {  	return (LLDrawable::getCurrentFrame() - mVisible[LLViewerCamera::sCurCameraID]) < LLDrawable::getMinVisFrameRange() ; @@ -2757,6 +2763,115 @@ void renderUpdateType(LLDrawable* drawablep)  	}  } +void renderComplexityDisplay(LLDrawable* drawablep) +{ +	LLViewerObject* vobj = drawablep->getVObj(); +	if (!vobj) +	{ +		return; +	} + +	LLVOVolume *voVol = dynamic_cast<LLVOVolume*>(vobj); + +	if (!voVol) +	{ +		return; +	} + +	if (!voVol->isRoot()) +	{ +		return; +	} + +	LLVOVolume::texture_cost_t textures; +	F32 cost = (F32) voVol->getRenderCost(textures); + +	// add any child volumes +	LLViewerObject::const_child_list_t children = voVol->getChildren(); +	for (LLViewerObject::const_child_list_t::const_iterator iter = children.begin(); iter != children.end(); ++iter) +	{ +		const LLViewerObject *child = *iter; +		const LLVOVolume *child_volume = dynamic_cast<const LLVOVolume*>(child); +		if (child_volume) +		{ +			cost += child_volume->getRenderCost(textures); +		} +	} + +	// add texture cost +	for (LLVOVolume::texture_cost_t::iterator iter = textures.begin(); iter != textures.end(); ++iter) +	{ +		// add the cost of each individual texture in the linkset +		cost += iter->second; +	} + +	F32 cost_max = (F32) LLVOVolume::getRenderComplexityMax(); + + + +	// allow user to set a static color scale +	if (gSavedSettings.getS32("RenderComplexityStaticMax") > 0) +	{ +		cost_max = gSavedSettings.getS32("RenderComplexityStaticMax"); +	} + +	F32 cost_ratio = cost / cost_max; +	 +	// cap cost ratio at 1.0f in case cost_max is at a low threshold +	cost_ratio = cost_ratio > 1.0f ? 1.0f : cost_ratio; +	 +	LLGLEnable blend(GL_BLEND); + +	LLColor4 color; +	const LLColor4 color_min = gSavedSettings.getColor4("RenderComplexityColorMin"); +	const LLColor4 color_mid = gSavedSettings.getColor4("RenderComplexityColorMid"); +	const LLColor4 color_max = gSavedSettings.getColor4("RenderComplexityColorMax"); + +	if (cost_ratio < 0.5f) +	{ +		color = color_min * (1 - cost_ratio * 2) + color_mid * (cost_ratio * 2); +	} +	else +	{ +		color = color_mid * (1 - (cost_ratio - 0.5) * 2) + color_max * ((cost_ratio - 0.5) * 2); +	} + +	LLSD color_val = color.getValue(); + +	// don't highlight objects below the threshold +	if (cost > gSavedSettings.getS32("RenderComplexityThreshold")) +	{ +		glColor4f(color[0],color[1],color[2],0.5f); + + +		S32 num_faces = drawablep->getNumFaces(); +		if (num_faces) +		{ +			for (S32 i = 0; i < num_faces; ++i) +			{ +				pushVerts(drawablep->getFace(i), LLVertexBuffer::MAP_VERTEX); +			} +		} +		LLViewerObject::const_child_list_t children = voVol->getChildren(); +		for (LLViewerObject::const_child_list_t::const_iterator iter = children.begin(); iter != children.end(); ++iter) +		{ +			const LLViewerObject *child = *iter; +			if (child) +			{ +				num_faces = child->getNumFaces(); +				if (num_faces) +				{ +					for (S32 i = 0; i < num_faces; ++i) +					{ +						pushVerts(child->mDrawable->getFace(i), LLVertexBuffer::MAP_VERTEX); +					} +				} +			} +		} +	} +	 +	voVol->setDebugText(llformat("%4.0f", cost));	 +}  void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE)  { @@ -3176,6 +3291,8 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)  				glColor4fv(line_color.mV);  				LLVertexBuffer::unbind(); +				llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShader != 0); +  				glVertexPointer(3, GL_FLOAT, 16, phys_volume->mHullPoints);  				glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices); @@ -3257,7 +3374,7 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)  		if (phys_volume->mHullPoints && phys_volume->mHullIndices)  		{  			glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); -			 +			llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShader != 0);  			LLVertexBuffer::unbind();  			glVertexPointer(3, GL_FLOAT, 16, phys_volume->mHullPoints);  			glColor4fv(line_color.mV); @@ -3859,6 +3976,10 @@ public:  			{  				renderUpdateType(drawable);  			} +			if(gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RENDER_COMPLEXITY)) +			{ +				renderComplexityDisplay(drawable); +			}  			LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(drawable->getVObj().get()); @@ -4107,7 +4228,8 @@ void LLSpatialPartition::renderDebug()  									  LLPipeline::RENDER_DEBUG_AVATAR_VOLUME |  									  LLPipeline::RENDER_DEBUG_AGENT_TARGET |  									  //LLPipeline::RENDER_DEBUG_BUILD_QUEUE | -									  LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))  +									  LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA | +									  LLPipeline::RENDER_DEBUG_RENDER_COMPLEXITY))   	{  		return;  	} @@ -4152,6 +4274,10 @@ void LLSpatialGroup::drawObjectBox(LLColor4 col)  	drawBox(mObjectBounds[0], size);  } +bool LLSpatialPartition::isHUDPartition()  +{  +	return mPartitionType == LLViewerRegion::PARTITION_HUD ; +}   BOOL LLSpatialPartition::isVisible(const LLVector3& v)  { diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 54d5d36f6e..11955540c6 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -282,6 +282,7 @@ public:  	LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part); +	BOOL isHUDGroup() ;  	BOOL isDead()							{ return isState(DEAD); }  	BOOL isState(U32 state) const;	  	BOOL isOcclusionState(U32 state) const	{ return mOcclusionState[LLViewerCamera::sCurCameraID] & state ? TRUE : FALSE; } @@ -470,6 +471,7 @@ public:  	S32 cull(LLCamera &camera, std::vector<LLDrawable *>* results = NULL, BOOL for_select = FALSE); // Cull on arbitrary frustum  	BOOL isVisible(const LLVector3& v); +	bool isHUDPartition() ;  	virtual LLSpatialBridge* asBridge() { return NULL; }  	virtual BOOL isBridge() { return asBridge() != NULL; } diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp deleted file mode 100644 index d3e96f8dfb..0000000000 --- a/indra/newview/llspeakbutton.cpp +++ /dev/null @@ -1,167 +0,0 @@ -/**  -* @file llspeakbutton.cpp -* @brief LLSpeakButton class implementation -* -* $LicenseInfo:firstyear=2002&license=viewerlgpl$ -* Second Life Viewer Source Code -* Copyright (C) 2010, 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" // must be first include - -#include "llbutton.h" -#include "llfloaterreg.h" - -#include "llagent.h" -#include "llbottomtray.h" -#include "llcallfloater.h" -#include "lloutputmonitorctrl.h" -#include "lltransientfloatermgr.h" - -#include "llspeakbutton.h" - -#include "llbottomtray.h" -#include "llfirstuse.h" - -static LLDefaultChildRegistry::Register<LLSpeakButton> t1("talk_button"); - -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// - -LLSpeakButton::Params::Params() - : speak_button("speak_button") - , show_button("show_button") - , monitor("monitor") -{ -	// See widgets/talk_button.xml -} - -LLSpeakButton::LLSpeakButton(const Params& p) -: LLUICtrl(p) -, mOutputMonitor(NULL) -, mSpeakBtn(NULL) -, mShowBtn(NULL) -{ -	LLRect rect = p.rect(); -	LLRect speak_rect(0, rect.getHeight(), rect.getWidth(), 0); -	LLRect show_rect = p.show_button.rect(); -	show_rect.set(0, rect.getHeight(), show_rect.getWidth(), 0); - -	speak_rect.mRight -= show_rect.getWidth(); -	show_rect.mLeft = speak_rect.getWidth(); -	show_rect.mRight = rect.getWidth(); - -	LLButton::Params speak_params = p.speak_button; -	speak_params.rect(speak_rect); -	mSpeakBtn = LLUICtrlFactory::create<LLButton>(speak_params); -	addChild(mSpeakBtn); -	LLTransientFloaterMgr::getInstance()->addControlView(mSpeakBtn); - -	mSpeakBtn->setMouseDownCallback(boost::bind(&LLSpeakButton::onMouseDown_SpeakBtn, this)); -	mSpeakBtn->setMouseUpCallback(boost::bind(&LLSpeakButton::onMouseUp_SpeakBtn, this)); -	mSpeakBtn->setToggleState(FALSE); - -	LLBottomtrayButton::Params show_params = p.show_button; -	show_params.rect(show_rect); -	mShowBtn = LLUICtrlFactory::create<LLBottomtrayButton>(show_params); -	addChild(mShowBtn); -	LLTransientFloaterMgr::getInstance()->addControlView(mShowBtn); - -// 	mShowBtn->setClickedCallback(boost::bind(&LLSpeakButton::onClick_ShowBtn, this)); -// 	mShowBtn->setToggleState(FALSE); - -	static const S32 MONITOR_RIGHT_PAD = 2; - -	LLRect monitor_rect = p.monitor.rect(); -	S32 monitor_height = monitor_rect.getHeight(); -	monitor_rect.mLeft = speak_rect.getWidth() - monitor_rect.getWidth() - MONITOR_RIGHT_PAD; -	monitor_rect.mRight = speak_rect.getWidth() - MONITOR_RIGHT_PAD; -	monitor_rect.mBottom = (rect.getHeight() / 2) - (monitor_height / 2); -	monitor_rect.mTop = monitor_rect.mBottom + monitor_height; - -	LLOutputMonitorCtrl::Params monitor_params = p.monitor; -	monitor_params.draw_border(false); -	monitor_params.rect(monitor_rect); -	monitor_params.auto_update(true); -	monitor_params.speaker_id(gAgentID); -	mOutputMonitor = LLUICtrlFactory::create<LLOutputMonitorCtrl>(monitor_params); -	mSpeakBtn->addChild(mOutputMonitor); - -	// never show "muted" because you can't mute yourself -	mOutputMonitor->setIsMuted(false); -	mOutputMonitor->setIsAgentControl(true); - -	//*TODO find a better place to do that -	LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::sOnCurrentChannelChanged, _1), true); -} - -LLSpeakButton::~LLSpeakButton() -{ -	if(LLTransientFloaterMgr::instanceExists()) -	{ -		LLTransientFloaterMgr::getInstance()->removeControlView(mSpeakBtn); -		LLTransientFloaterMgr::getInstance()->removeControlView(mShowBtn); -	} -} - -void LLSpeakButton::setSpeakToolTip(const std::string& msg) -{ -	mSpeakBtn->setToolTip(msg); -} - -void LLSpeakButton::setShowToolTip(const std::string& msg) -{ -	mShowBtn->setToolTip(msg); -} - -void LLSpeakButton::setLabelVisible(bool visible) -{ -	static std::string label_selected = mSpeakBtn->getLabelSelected(); -	static std::string label_unselected = mSpeakBtn->getLabelUnselected(); - -	if (visible) -	{ -		mSpeakBtn->setLabelSelected(label_selected); -		mSpeakBtn->setLabelUnselected(label_unselected); -	} -	else -	{ -		static LLStringExplicit empty_string(""); -		mSpeakBtn->setLabelSelected(empty_string); -		mSpeakBtn->setLabelUnselected(empty_string); -	} -} - -////////////////////////////////////////////////////////////////////////// -/// PROTECTED SECTION -////////////////////////////////////////////////////////////////////////// -void LLSpeakButton::onMouseDown_SpeakBtn() -{ -	bool down = true; -	LLVoiceClient::getInstance()->inputUserControlState(down); // this method knows/care about whether this translates into a toggle-to-talk or down-to-talk -	LLFirstUse::speak(false); -} -void LLSpeakButton::onMouseUp_SpeakBtn() -{ -	bool down = false; -	LLVoiceClient::getInstance()->inputUserControlState(down); -} - diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h deleted file mode 100644 index 7db01112ef..0000000000 --- a/indra/newview/llspeakbutton.h +++ /dev/null @@ -1,88 +0,0 @@ -/**  -* @file llspeakbutton.h -* @brief LLSpeakButton class header file -* -* $LicenseInfo:firstyear=2002&license=viewerlgpl$ -* Second Life Viewer Source Code -* Copyright (C) 2010, 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_LLSPEAKBUTTON_H -#define LL_LLSPEAKBUTTON_H - -#include "llinitparam.h" -#include "lluictrl.h" - -class LLCallFloater; -class LLButton; -class LLOutputMonitorCtrl; -class LLBottomtrayButton; - -/* - * Button displaying voice chat status. Displays voice chat options when - * clicked. -*/ -class LLSpeakButton : public LLUICtrl -{ -public: - -	struct Params :	public LLInitParam::Block<Params, LLUICtrl::Params> -	{ -		Optional<LLButton::Params> speak_button; -		Optional<LLBottomtrayButton::Params> show_button; -		Optional<LLOutputMonitorCtrl::Params> monitor; - -		Params(); -	}; - -	/*virtual*/ ~LLSpeakButton(); -	 -	// *HACK: Need to put tooltips in a translatable location, -	// the panel that contains this button. -	void setSpeakToolTip(const std::string& msg); -	void setShowToolTip(const std::string& msg); - -	/** -	 * Sets visibility of speak button's label according to passed parameter. -	 * -	 * It removes label/selected label if "visible" is false and restores otherwise. -	 * -	 * @param visible if true - show label and selected label. -	 *  -	 * @see mSpeakBtn -	 * @see LLBottomTray::processShrinkButtons() -	 */ -	void setLabelVisible(bool visible); - -protected: -	friend class LLUICtrlFactory; -	LLSpeakButton(const Params& p); - -	void onMouseDown_SpeakBtn(); -	void onMouseUp_SpeakBtn(); - -private: -	LLButton*	mSpeakBtn; -	LLBottomtrayButton*	mShowBtn; -	LLHandle<LLFloater> mPrivateCallPanel; -	LLOutputMonitorCtrl* mOutputMonitor; -}; - -#endif // LL_LLSPEAKBUTTON_H diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 4dfcb85295..e03ad2db94 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -126,11 +126,11 @@  #include "llpanelgroupnotices.h"  #include "llpreview.h"  #include "llpreviewscript.h" +#include "llproxy.h"  #include "llproductinforequest.h"  #include "llsecondlifeurls.h"  #include "llselectmgr.h"  #include "llsky.h" -#include "llsidetray.h"  #include "llstatview.h"  #include "llstatusbar.h"		// sendMoneyBalanceRequest(), owns L$ balance  #include "llsurface.h" @@ -386,6 +386,14 @@ bool idle_startup()  			LLNotificationsUtil::add(gViewerWindow->getInitAlert());  		} +		//------------------------------------------------- +		// Init the SOCKS 5 proxy if the user has configured +		// one. We need to do this early in case the user +		// is using SOCKS for HTTP so we get the login +		// screen and HTTP tables via SOCKS. +		//------------------------------------------------- +		LLStartUp::startLLProxy(); +  		gSavedSettings.setS32("LastFeatureVersion", LLFeatureManager::getInstance()->getVersion());  		gSavedSettings.setS32("LastGPUClass", LLFeatureManager::getInstance()->getGPUClass()); @@ -591,7 +599,7 @@ bool idle_startup()  		}  		LL_INFOS("AppInit") << "Message System Initialized." << LL_ENDL; -		 +  		//-------------------------------------------------  		// Init audio, which may be needed for prefs dialog  		// or audio cues in connection UI. @@ -720,7 +728,13 @@ bool idle_startup()  		timeout_count = 0; +		// Login screen needs menus for preferences, but we can enter +		// this startup phase more than once. +		if (gLoginMenuBarView == NULL) +		{  		initialize_edit_menu(); +			init_menus(); +		}  		if (show_connect_box)  		{ @@ -755,19 +769,6 @@ bool idle_startup()  			LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );  		} -		// *NOTE: This is where LLViewerParcelMgr::getInstance() used to get allocated before becoming LLViewerParcelMgr::getInstance(). - -		// *NOTE: This is where gHUDManager used to bet allocated before becoming LLHUDManager::getInstance(). - -		// *NOTE: This is where gMuteList used to get allocated before becoming LLMuteList::getInstance(). - -		// Login screen needs menus for preferences, but we can enter -		// this startup phase more than once. -		if (gLoginMenuBarView == NULL) -		{ -			init_menus(); -		} -		  		gViewerWindow->setNormalControlsVisible( FALSE );	  		gLoginMenuBarView->setVisible( TRUE );  		gLoginMenuBarView->setEnabled( TRUE ); @@ -807,7 +808,21 @@ bool idle_startup()  	if (STATE_LOGIN_CLEANUP == LLStartUp::getStartupState())  	{ -		//reset the values that could have come in from a slurl +		// Post login screen, we should see if any settings have changed that may +		// require us to either start/stop or change the socks proxy. As various communications +		// past this point may require the proxy to be up. +		if (!LLStartUp::startLLProxy()) +		{ +			// Proxy start up failed, we should now bail the state machine +			// startLLProxy() will have reported an error to the user +			// already, so we just go back to the login screen. The user +			// could then change the preferences to fix the issue. + +			LLStartUp::setStartupState(STATE_LOGIN_SHOW); +			return FALSE; +		} + +		// reset the values that could have come in from a slurl  		// DEV-42215: Make sure they're not empty -- gUserCredential  		// might already have been set from gSavedSettings, and it's too bad  		// to overwrite valid values with empty strings. @@ -897,7 +912,7 @@ bool idle_startup()  		if (show_connect_box)  		{  			LLSLURL slurl; -			LLPanelLogin::closePanel(); +			//LLPanelLogin::closePanel();  		} @@ -944,6 +959,8 @@ bool idle_startup()  		gViewerWindow->setShowProgress(TRUE);  		gViewerWindow->setProgressCancelButtonVisible(TRUE, LLTrans::getString("Quit")); +		gViewerWindow->revealIntroPanel(); +  		// Poke the VFS, which could potentially block for a while if  		// Windows XP is acting up  		set_startup_status(0.07f, LLTrans::getString("LoginVerifyingCache"), LLStringUtil::null); @@ -1242,6 +1259,25 @@ bool idle_startup()  	//---------------------------------------------------------------------  	if(STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())  	{ +		LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(gFirstSimHandle); +		if (regionp->capabilitiesReceived()) +		{ +			LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED ); +		} +		else +		{ +			U32 num_retries = regionp->getNumSeedCapRetries(); +			if (num_retries > 0) +			{ +				LLStringUtil::format_map_t args; +				args["[NUMBER]"] = llformat("%d", num_retries + 1); +				set_startup_status(0.4f, LLTrans::getString("LoginRetrySeedCapGrant", args), gAgent.mMOTD); +			} +			else +			{ +				set_startup_status(0.4f, LLTrans::getString("LoginRequestSeedCapGrant"), gAgent.mMOTD); +			} +		}  		return FALSE;  	} @@ -1541,6 +1577,12 @@ bool idle_startup()   			}   		} +		LLSD inv_basic = response["inventory-basic"]; + 		if(inv_basic.isDefined()) + 		{ +			llinfos << "Basic inventory root folder id is " << inv_basic["folder_id"] << llendl; + 		} +  		LLSD buddy_list = response["buddy-list"];   		if(buddy_list.isDefined())   		{ @@ -1962,8 +2004,8 @@ bool idle_startup()  		gViewerWindow->getWindow()->resetBusyCount();  		gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);  		LL_DEBUGS("AppInit") << "Done releasing bitmap" << LL_ENDL; -		gViewerWindow->revealIntroPanel(); -		//gViewerWindow->setShowProgress(FALSE);  // reveal intro video now handles this +		//gViewerWindow->revealIntroPanel(); +		gViewerWindow->setStartupComplete();   		gViewerWindow->setProgressCancelButtonVisible(FALSE);  		// We're not away from keyboard, even though login might have taken @@ -2344,13 +2386,6 @@ void asset_callback_nothing(LLVFS*, const LLUUID&, LLAssetType::EType, void*, S3  	// nothing  } -// *HACK: Must match name in Library or agent inventory -const std::string ROOT_GESTURES_FOLDER = "Gestures"; -const std::string COMMON_GESTURES_FOLDER = "Common Gestures"; -const std::string MALE_GESTURES_FOLDER = "Male Gestures"; -const std::string FEMALE_GESTURES_FOLDER = "Female Gestures"; -const std::string SPEECH_GESTURES_FOLDER = "Speech Gestures"; -const std::string OTHER_GESTURES_FOLDER = "Other Gestures";  const S32 OPT_CLOSED_WINDOW = -1;  const S32 OPT_MALE = 0;  const S32 OPT_FEMALE = 1; @@ -2379,84 +2414,30 @@ bool callback_choose_gender(const LLSD& notification, const LLSD& response)  	return false;  } -void LLStartUp::copyLibraryGestures(const std::string& same_gender_gestures) -{ -	llinfos << "Copying library gestures" << llendl; - -	// Copy gestures -	LLUUID lib_gesture_cat_id = -		gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE,false,true); -	if (lib_gesture_cat_id.isNull()) -	{ -		llwarns << "Unable to copy gestures, source category not found" << llendl; -	} -	LLUUID dst_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE); - -	std::vector<std::string> gesture_folders_to_copy; -	gesture_folders_to_copy.push_back(MALE_GESTURES_FOLDER); -	gesture_folders_to_copy.push_back(FEMALE_GESTURES_FOLDER); -	gesture_folders_to_copy.push_back(COMMON_GESTURES_FOLDER); -	gesture_folders_to_copy.push_back(SPEECH_GESTURES_FOLDER); -	gesture_folders_to_copy.push_back(OTHER_GESTURES_FOLDER); - -	for(std::vector<std::string>::iterator it = gesture_folders_to_copy.begin(); -		it != gesture_folders_to_copy.end(); -		++it) -	{ -		std::string& folder_name = *it; - -		LLPointer<LLInventoryCallback> cb(NULL); - -		if (folder_name == same_gender_gestures || -			folder_name == COMMON_GESTURES_FOLDER || -			folder_name == OTHER_GESTURES_FOLDER) -		{ -			cb = new ActivateGestureCallback; -		} - - -		LLUUID cat_id = findDescendentCategoryIDByName(lib_gesture_cat_id,folder_name); -		if (cat_id.isNull()) -		{ -			llwarns << "failed to find gesture folder for " << folder_name << llendl; -		} -		else -		{ -			llinfos << "initiating fetch and copy for " << folder_name << " cat_id " << cat_id << llendl; -			LLAppearanceMgr* app_mgr = LLAppearanceMgr::getInstance(); -			callAfterCategoryFetch(cat_id, -								   boost::bind(&LLAppearanceMgr::shallowCopyCategory, -											   app_mgr, -											   cat_id, -											   dst_id, -											   cb)); -		} -	} -} -  void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,  								   const std::string& gender_name )  { -	llinfos << "starting" << llendl; +	lldebugs << "starting" << llendl;  	// Not going through the processAgentInitialWearables path, so need to set this here.  	LLAppearanceMgr::instance().setAttachmentInvLinkEnable(true);  	// Initiate creation of COF, since we're also bypassing that.  	gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); -	S32 gender = 0; -	std::string same_gender_gestures; +	ESex gender;  	if (gender_name == "male")  	{ -		gender = OPT_MALE; -		same_gender_gestures = MALE_GESTURES_FOLDER; +		lldebugs << "male" << llendl; +		gender = SEX_MALE;  	}  	else  	{ -		gender = OPT_FEMALE; -		same_gender_gestures = FEMALE_GESTURES_FOLDER; +		lldebugs << "female" << llendl; +		gender = SEX_FEMALE;  	} +	gAgentAvatarp->setSex(gender); +  	// try to find the outfit - if not there, create some default  	// wearables.  	LLUUID cat_id = findDescendentCategoryIDByName( @@ -2464,7 +2445,8 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,  		outfit_folder_name);  	if (cat_id.isNull())  	{ -		gAgentWearables.createStandardWearables(gender); +		lldebugs << "standard wearables" << llendl; +		gAgentWearables.createStandardWearables();  	}  	else  	{ @@ -2474,26 +2456,28 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,  		bool do_append = false;  		LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);  		LLAppearanceMgr::instance().wearInventoryCategory(cat, do_copy, do_append); +		lldebugs << "initial outfit category id: " << cat_id << llendl;  	} -	// Copy gestures -	copyLibraryGestures(same_gender_gestures); -	  	// This is really misnamed -- it means we have started loading  	// an outfit/shape that will give the avatar a gender eventually. JC  	gAgent.setGenderChosen(TRUE); -  }  //static  void LLStartUp::saveInitialOutfit()  { -	if (sInitialOutfit.empty()) return; +	if (sInitialOutfit.empty()) { +		lldebugs << "sInitialOutfit is empty" << llendl; +		return; +	}  	if (sWearablesLoadedCon.connected())  	{ +		lldebugs << "sWearablesLoadedCon is connected, disconnecting" << llendl;  		sWearablesLoadedCon.disconnect();  	} +	lldebugs << "calling makeNewOutfitLinks( \"" << sInitialOutfit << "\" )" << llendl;  	LLAppearanceMgr::getInstance()->makeNewOutfitLinks(sInitialOutfit,false);  } @@ -2536,22 +2520,32 @@ void init_start_screen(S32 location_id)  	else if(!start_image_bmp->load(temp_str) )  	{  		LL_WARNS("AppInit") << "Bitmap load failed" << LL_ENDL; -		return; +		gStartTexture = NULL;  	} +	else +	{ +		gStartImageWidth = start_image_bmp->getWidth(); +		gStartImageHeight = start_image_bmp->getHeight(); -	gStartImageWidth = start_image_bmp->getWidth(); -	gStartImageHeight = start_image_bmp->getHeight(); +		LLPointer<LLImageRaw> raw = new LLImageRaw; +		if (!start_image_bmp->decode(raw, 0.0f)) +		{ +			LL_WARNS("AppInit") << "Bitmap decode failed" << LL_ENDL; +			gStartTexture = NULL; +		} +		else +		{ +			raw->expandToPowerOfTwo(); +			gStartTexture = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE) ; +		} +	} -	LLPointer<LLImageRaw> raw = new LLImageRaw; -	if (!start_image_bmp->decode(raw, 0.0f)) +	if(gStartTexture.isNull())  	{ -		LL_WARNS("AppInit") << "Bitmap decode failed" << LL_ENDL; -		gStartTexture = NULL; -		return; +		gStartTexture = LLViewerTexture::sBlackImagep ; +		gStartImageWidth = gStartTexture->getWidth() ; +		gStartImageHeight = gStartTexture->getHeight() ;  	} - -	raw->expandToPowerOfTwo(); -	gStartTexture = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE) ;  } @@ -2738,6 +2732,171 @@ void LLStartUp::setStartSLURL(const LLSLURL& slurl)      }  } +/** + * Read all proxy configuration settings and set up both the HTTP proxy and + * SOCKS proxy as needed. + * + * Any errors that are encountered will result in showing the user a notification. + * When an error is encountered, + * + * @return Returns true if setup was successful, false if an error was encountered. + */ +bool LLStartUp::startLLProxy() +{ +	bool proxy_ok = true; +	std::string httpProxyType = gSavedSettings.getString("HttpProxyType"); + +	// Set up SOCKS proxy (if needed) +	if (gSavedSettings.getBOOL("Socks5ProxyEnabled")) +	{	 +		// Determine and update LLProxy with the saved authentication system +		std::string auth_type = gSavedSettings.getString("Socks5AuthType"); + +		if (auth_type.compare("UserPass") == 0) +		{ +			LLPointer<LLCredential> socks_cred = gSecAPIHandler->loadCredential("SOCKS5"); +			std::string socks_user = socks_cred->getIdentifier()["username"].asString(); +			std::string socks_password = socks_cred->getAuthenticator()["creds"].asString(); + +			bool ok = LLProxy::getInstance()->setAuthPassword(socks_user, socks_password); + +			if (!ok) +			{ +				LLNotificationsUtil::add("SOCKS_BAD_CREDS"); +				proxy_ok = false; +			} +		} +		else if (auth_type.compare("None") == 0) +		{ +			LLProxy::getInstance()->setAuthNone(); +		} +		else +		{ +			LL_WARNS("Proxy") << "Invalid SOCKS 5 authentication type."<< LL_ENDL; + +			// Unknown or missing setting. +			gSavedSettings.setString("Socks5AuthType", "None"); + +			// Clear the SOCKS credentials. +			LLPointer<LLCredential> socks_cred = new LLCredential("SOCKS5"); +			gSecAPIHandler->deleteCredential(socks_cred); + +			LLProxy::getInstance()->setAuthNone(); +		} + +		if (proxy_ok) +		{ +			// Start the proxy and check for errors +			// If status != SOCKS_OK, stopSOCKSProxy() will already have been called when startSOCKSProxy() returns. +			LLHost socks_host; +			socks_host.setHostByName(gSavedSettings.getString("Socks5ProxyHost")); +			socks_host.setPort(gSavedSettings.getU32("Socks5ProxyPort")); +			int status = LLProxy::getInstance()->startSOCKSProxy(socks_host); + +			if (status != SOCKS_OK) +			{ +				LLSD subs; +				subs["HOST"] = gSavedSettings.getString("Socks5ProxyHost"); +				subs["PORT"] = (S32)gSavedSettings.getU32("Socks5ProxyPort"); + +				std::string error_string; + +				switch(status) +				{ +					case SOCKS_CONNECT_ERROR: // TCP Fail +						error_string = "SOCKS_CONNECT_ERROR"; +						break; + +					case SOCKS_NOT_PERMITTED: // SOCKS 5 server rule set refused connection +						error_string = "SOCKS_NOT_PERMITTED"; +						break; + +					case SOCKS_NOT_ACCEPTABLE: // Selected authentication is not acceptable to server +						error_string = "SOCKS_NOT_ACCEPTABLE"; +						break; + +					case SOCKS_AUTH_FAIL: // Authentication failed +						error_string = "SOCKS_AUTH_FAIL"; +						break; + +					case SOCKS_UDP_FWD_NOT_GRANTED: // UDP forward request failed +						error_string = "SOCKS_UDP_FWD_NOT_GRANTED"; +						break; + +					case SOCKS_HOST_CONNECT_FAILED: // Failed to open a TCP channel to the socks server +						error_string = "SOCKS_HOST_CONNECT_FAILED"; +						break; + +					case SOCKS_INVALID_HOST: // Improperly formatted host address or port. +						error_string = "SOCKS_INVALID_HOST"; +						break; + +					default: +						error_string = "SOCKS_UNKNOWN_STATUS"; // Something strange happened, +						LL_WARNS("Proxy") << "Unknown return from LLProxy::startProxy(): " << status << LL_ENDL; +						break; +				} + +				LLNotificationsUtil::add(error_string, subs); +				proxy_ok = false; +			} +		} +	} +	else +	{ +		LLProxy::getInstance()->stopSOCKSProxy(); // ensure no UDP proxy is running and it's all cleaned up +	} + +	if (proxy_ok) +	{ +		// Determine the HTTP proxy type (if any) +		if ((httpProxyType.compare("Web") == 0) && gSavedSettings.getBOOL("BrowserProxyEnabled")) +		{ +			LLHost http_host; +			http_host.setHostByName(gSavedSettings.getString("BrowserProxyAddress")); +			http_host.setPort(gSavedSettings.getS32("BrowserProxyPort")); +			if (!LLProxy::getInstance()->enableHTTPProxy(http_host, LLPROXY_HTTP)) +			{ +				LLSD subs; +				subs["HOST"] = http_host.getIPString(); +				subs["PORT"] = (S32)http_host.getPort(); +				LLNotificationsUtil::add("PROXY_INVALID_HTTP_HOST", subs); +				proxy_ok = false; +			} +		} +		else if ((httpProxyType.compare("Socks") == 0) && gSavedSettings.getBOOL("Socks5ProxyEnabled")) +		{ +			LLHost socks_host; +			socks_host.setHostByName(gSavedSettings.getString("Socks5ProxyHost")); +			socks_host.setPort(gSavedSettings.getU32("Socks5ProxyPort")); +			if (!LLProxy::getInstance()->enableHTTPProxy(socks_host, LLPROXY_SOCKS)) +			{ +				LLSD subs; +				subs["HOST"] = socks_host.getIPString(); +				subs["PORT"] = (S32)socks_host.getPort(); +				LLNotificationsUtil::add("PROXY_INVALID_SOCKS_HOST", subs); +				proxy_ok = false; +			} +		} +		else if (httpProxyType.compare("None") == 0) +		{ +			LLProxy::getInstance()->disableHTTPProxy(); +		} +		else +		{ +			LL_WARNS("Proxy") << "Invalid other HTTP proxy configuration."<< LL_ENDL; + +			// Set the missing or wrong configuration back to something valid. +			gSavedSettings.setString("HttpProxyType", "None"); +			LLProxy::getInstance()->disableHTTPProxy(); + +			// Leave proxy_ok alone, since this isn't necessarily fatal. +		} +	} + +	return proxy_ok; +} +  bool login_alert_done(const LLSD& notification, const LLSD& response)  {  	LLPanelLogin::giveFocus(); @@ -3122,8 +3281,6 @@ bool process_login_success_response()  	}  	// Initial outfit for the user. -	// QUESTION: Why can't we simply simply set the users outfit directly -	// from a web page into the user info on the server? - Roxie  	LLSD initial_outfit = response["initial-outfit"][0];  	if(initial_outfit.size())  	{ diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h index b3d9ef1dcc..0a18ef1b2d 100644 --- a/indra/newview/llstartup.h +++ b/indra/newview/llstartup.h @@ -90,8 +90,6 @@ public:  	static void initNameCache(); -	static void copyLibraryGestures(const std::string& same_gender_gestures); -  	static void cleanupNameCache();  	// outfit_folder_name can be a folder anywhere in your inventory,  @@ -113,6 +111,8 @@ public:  	static void setStartSLURL(const LLSLURL& slurl);   	static LLSLURL& getStartSLURL() { return sStartSLURL; }  +	static bool startLLProxy(); // Initialize the SOCKS 5 proxy +  private:  	static LLSLURL sStartSLURL; diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 1b8be7a5b2..75db269bde 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -169,6 +169,8 @@ BOOL LLStatusBar::postBuild()  	getChild<LLUICtrl>("buyL")->setCommitCallback(  		boost::bind(&LLStatusBar::onClickBuyCurrency, this)); +	getChild<LLUICtrl>("goShop")->setCommitCallback(boost::bind(&LLWeb::loadURLExternal, gSavedSettings.getString("MarketplaceURL"))); +  	mBoxBalance = getChild<LLTextBox>("balance");  	mBoxBalance->setClickedCallback( &LLStatusBar::onClickBalance, this ); @@ -345,9 +347,10 @@ void LLStatusBar::setBalance(S32 balance)  		const S32 HPAD = 24;  		LLRect balance_rect = mBoxBalance->getTextBoundingRect();  		LLRect buy_rect = getChildView("buyL")->getRect(); +		LLRect shop_rect = getChildView("goShop")->getRect();  		LLView* balance_bg_view = getChildView("balance_bg");  		LLRect balance_bg_rect = balance_bg_view->getRect(); -		balance_bg_rect.mLeft = balance_bg_rect.mRight - (buy_rect.getWidth() + balance_rect.getWidth() + HPAD); +		balance_bg_rect.mLeft = balance_bg_rect.mRight - (buy_rect.getWidth() + shop_rect.getWidth() + balance_rect.getWidth() + HPAD);  		balance_bg_view->setShape(balance_bg_rect);  	} diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp index bccabe21a8..66df7dae3e 100644 --- a/indra/newview/llsurface.cpp +++ b/indra/newview/llsurface.cpp @@ -334,6 +334,17 @@ void LLSurface::setOriginGlobal(const LLVector3d &origin_global)  	}  } +void LLSurface::getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegions ) +{ +	S32 i; +	for (i = 0; i < 8; i++) +	{ +		if ( mNeighbors[i] != NULL ) +		{ +			uniqueRegions.push_back( mNeighbors[i]->getRegion() ); +		} +	}	 +}  void LLSurface::connectNeighbor(LLSurface *neighborp, U32 direction)  { diff --git a/indra/newview/llsurface.h b/indra/newview/llsurface.h index 673ee83fe3..a4ef4fe2de 100644 --- a/indra/newview/llsurface.h +++ b/indra/newview/llsurface.h @@ -140,6 +140,9 @@ public:  	friend class LLSurfacePatch;  	friend std::ostream& operator<<(std::ostream &s, const LLSurface &S); +	 +	void getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegions ); +	  public:  	// Number of grid points on one side of a region, including +1 buffer for  	// north and east edge. diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index cb49976e5f..ffe864e220 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -35,16 +35,17 @@  #include "llfloaterreg.h"  #include "llnotifications.h" -#include "llbottomtray.h"  #include "llscriptfloater.h"  #include "llviewercontrol.h"  #include "llviewerwindow.h"  #include "llchiclet.h" +#include "llchicletbar.h"  #include "lltoastpanel.h"  #include "llnotificationmanager.h"  #include "llnotificationsutil.h"  #include "llspeakers.h" +#include "lltoolbarview.h"  //---------------------------------------------------------------------------------  LLSysWellWindow::LLSysWellWindow(const LLSD& key) : LLTransientDockableFloater(NULL, true,  key), @@ -140,15 +141,6 @@ void LLSysWellWindow::initChannel()  }  //--------------------------------------------------------------------------------- -void LLSysWellWindow::getAllowedRect(LLRect& rect) -{ -	rect = gViewerWindow->getWorldViewRectScaled(); -} - -//--------------------------------------------------------------------------------- - - -//---------------------------------------------------------------------------------  void LLSysWellWindow::setVisible(BOOL visible)  {  	if (visible) @@ -156,8 +148,8 @@ void LLSysWellWindow::setVisible(BOOL visible)  		if (NULL == getDockControl() && getDockTongue().notNull())  		{  			setDockControl(new LLDockControl( -				LLBottomTray::getInstance()->getChild<LLView>(getAnchorViewName()), this, -				getDockTongue(), LLDockControl::TOP, boost::bind(&LLSysWellWindow::getAllowedRect, this, _1))); +				LLChicletBar::getInstance()->getChild<LLView>(getAnchorViewName()), this, +				getDockTongue(), LLDockControl::BOTTOM));  		}  	} diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h index 9f8ab01810..52e5370505 100644 --- a/indra/newview/llsyswellwindow.h +++ b/indra/newview/llsyswellwindow.h @@ -76,11 +76,6 @@ public:  	static const S32 MIN_WINDOW_WIDTH		= 318;  protected: - -	// gets a rect that bounds possible positions for the SysWellWindow on a screen (EXT-1111) -	void getAllowedRect(LLRect& rect); - -  	// init Window's channel  	virtual void initChannel(); diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp index bd41aa64f0..e8abee2fb7 100644 --- a/indra/newview/lltexlayer.cpp +++ b/indra/newview/lltexlayer.cpp @@ -45,6 +45,7 @@  #include "llagentwearables.h"  #include "llwearable.h"  #include "llviewercontrol.h" +#include "llviewershadermgr.h"  #include "llviewervisualparam.h"  //#include "../tools/imdebug/imdebug.h" @@ -294,11 +295,17 @@ BOOL LLTexLayerSetBuffer::render()  	BOOL success = TRUE; +	//hack to use fixed function when updating tex layer sets +	bool no_ff = LLGLSLShader::sNoFixedFunction; +	LLGLSLShader::sNoFixedFunction = false; +	  	// Composite the color data  	LLGLSUIDefault gls_ui;  	success &= mTexLayerSet->render( mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight );  	gGL.flush(); +	LLGLSLShader::sNoFixedFunction = no_ff; +	  	if(upload_now)  	{  		if (!success) diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 9b417307fd..70b0a31308 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -36,6 +36,7 @@  // Included to allow LLTextureCache::purgeTextures() to pause watchdog timeout  #include "llappviewer.h"  +#include "llmemory.h"  // Cache organization:  // cache/texture.entries @@ -113,7 +114,7 @@ public:  	~LLTextureCacheWorker()  	{  		llassert_always(!haveWork()); -		delete[] mReadData; +		FREE_MEM(LLImageBase::getPrivatePool(), mReadData);  	}  	// override this interface @@ -215,7 +216,7 @@ bool LLTextureCacheLocalFileWorker::doRead()  			mDataSize = 0;  			return true;  		} -		mReadData = new U8[mDataSize]; +		mReadData = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), mDataSize);  		mBytesRead = -1;  		mBytesToRead = mDataSize;  		setPriority(LLWorkerThread::PRIORITY_LOW | mPriority); @@ -233,7 +234,7 @@ bool LLTextureCacheLocalFileWorker::doRead()  // 						<< " Bytes: " << mDataSize << " Offset: " << mOffset  // 						<< " / " << mDataSize << llendl;  				mDataSize = 0; // failed -				delete[] mReadData; +				FREE_MEM(LLImageBase::getPrivatePool(), mReadData);  				mReadData = NULL;  			}  			return true; @@ -248,7 +249,7 @@ bool LLTextureCacheLocalFileWorker::doRead()  	{  		mDataSize = local_size;  	} -	mReadData = new U8[mDataSize]; +	mReadData = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), mDataSize);  	S32 bytes_read = LLAPRFile::readEx(mFileName, mReadData, mOffset, mDataSize, mCache->getLocalAPRFilePool());	 @@ -258,7 +259,7 @@ bool LLTextureCacheLocalFileWorker::doRead()  // 				<< " Bytes: " << mDataSize << " Offset: " << mOffset  // 				<< " / " << mDataSize << llendl;  		mDataSize = 0; -		delete[] mReadData; +		FREE_MEM(LLImageBase::getPrivatePool(), mReadData);  		mReadData = NULL;  	}  	else @@ -377,7 +378,7 @@ bool LLTextureCacheRemoteWorker::doRead()  			mDataSize = local_size;  		}  		// Allocate read buffer -		mReadData = new U8[mDataSize]; +		mReadData = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), mDataSize);  		S32 bytes_read = LLAPRFile::readEx(local_filename,   											 mReadData, mOffset, mDataSize, mCache->getLocalAPRFilePool());  		if (bytes_read != mDataSize) @@ -386,7 +387,7 @@ bool LLTextureCacheRemoteWorker::doRead()   					<< " Bytes: " << mDataSize << " Offset: " << mOffset   					<< " / " << mDataSize << llendl;  			mDataSize = 0; -			delete[] mReadData; +			FREE_MEM(LLImageBase::getPrivatePool(), mReadData);  			mReadData = NULL;  		}  		else @@ -429,7 +430,7 @@ bool LLTextureCacheRemoteWorker::doRead()  		S32 size = TEXTURE_CACHE_ENTRY_SIZE - mOffset;  		size = llmin(size, mDataSize);  		// Allocate the read buffer -		mReadData = new U8[size]; +		mReadData = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), size);  		S32 bytes_read = LLAPRFile::readEx(mCache->mHeaderDataFileName,   											 mReadData, offset, size, mCache->getLocalAPRFilePool());  		if (bytes_read != size) @@ -437,7 +438,7 @@ bool LLTextureCacheRemoteWorker::doRead()  			llwarns << "LLTextureCacheWorker: "  << mID  					<< " incorrect number of bytes read from header: " << bytes_read  					<< " / " << size << llendl; -			delete[] mReadData; +			FREE_MEM(LLImageBase::getPrivatePool(), mReadData);  			mReadData = NULL;  			mDataSize = -1; // failed  			done = true; @@ -467,7 +468,7 @@ bool LLTextureCacheRemoteWorker::doRead()  			S32 data_offset, file_size, file_offset;  			// Reserve the whole data buffer first -			U8* data = new U8[mDataSize]; +			U8* data = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), mDataSize);  			// Set the data file pointers taking the read offset into account. 2 cases:  			if (mOffset < TEXTURE_CACHE_ENTRY_SIZE) @@ -480,7 +481,7 @@ bool LLTextureCacheRemoteWorker::doRead()  				// Copy the raw data we've been holding from the header cache into the new sized buffer  				llassert_always(mReadData);  				memcpy(data, mReadData, data_offset); -				delete[] mReadData; +				FREE_MEM(LLImageBase::getPrivatePool(), mReadData);  				mReadData = NULL;  			}  			else @@ -506,7 +507,7 @@ bool LLTextureCacheRemoteWorker::doRead()  				llwarns << "LLTextureCacheWorker: "  << mID  						<< " incorrect number of bytes read from body: " << bytes_read  						<< " / " << file_size << llendl; -				delete[] mReadData; +				FREE_MEM(LLImageBase::getPrivatePool(), mReadData);  				mReadData = NULL;  				mDataSize = -1; // failed  				done = true; @@ -598,11 +599,11 @@ bool LLTextureCacheRemoteWorker::doWrite()  		{  			// We need to write a full record in the header cache so, if the amount of data is smaller  			// than a record, we need to transfer the data to a buffer padded with 0 and write that -			U8* padBuffer = new U8[TEXTURE_CACHE_ENTRY_SIZE]; +			U8* padBuffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), TEXTURE_CACHE_ENTRY_SIZE);  			memset(padBuffer, 0, TEXTURE_CACHE_ENTRY_SIZE);		// Init with zeros  			memcpy(padBuffer, mWriteData, mDataSize);			// Copy the write buffer  			bytes_written = LLAPRFile::writeEx(mCache->mHeaderDataFileName, padBuffer, offset, size, mCache->getLocalAPRFilePool()); -			delete [] padBuffer; +			FREE_MEM(LLImageBase::getPrivatePool(), padBuffer);  		}  		else  		{ @@ -698,7 +699,7 @@ void LLTextureCacheWorker::finishWork(S32 param, bool completed)  			}  			else  			{ -				delete[] mReadData; +				FREE_MEM(LLImageBase::getPrivatePool(), mReadData);  				mReadData = NULL;  			}  		} diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h index fdfbee400e..b1312d641f 100644 --- a/indra/newview/lltexturectrl.h +++ b/indra/newview/lltexturectrl.h @@ -92,11 +92,7 @@ public:  			multiselect_text("multiselect_text"),  			caption_text("caption_text"),  			border("border") -		{ -			name = "texture picker"; -			mouse_opaque(true); -			follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP); -		} +		{}  	};  protected:  	LLTextureCtrl(const Params&); diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 18c3a3b87d..56dfb61c4f 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -817,7 +817,7 @@ void LLTextureFetchWorker::setImagePriority(F32 priority)  void LLTextureFetchWorker::resetFormattedData()  { -	delete[] mBuffer; +	FREE_MEM(LLImageBase::getPrivatePool(), mBuffer);  	mBuffer = NULL;  	mBufferSize = 0;  	if (mFormattedImage.notNull()) @@ -888,7 +888,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  		mSentRequest = UNSENT;  		mDecoded  = FALSE;  		mWritten  = FALSE; -		delete[] mBuffer; +		FREE_MEM(LLImageBase::getPrivatePool(), mBuffer);  		mBuffer = NULL;  		mBufferSize = 0;  		mHaveAllData = FALSE; @@ -1284,7 +1284,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  			llassert_always(mBufferSize == cur_size + mRequestedSize);  			if(!mBufferSize)//no data received.  			{ -				delete[] mBuffer;  +				FREE_MEM(LLImageBase::getPrivatePool(), mBuffer);   				mBuffer = NULL;  				//abort. @@ -1312,7 +1312,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  				mFileSize = mBufferSize + 1 ; //flag the file is not fully loaded.  			} -			U8* buffer = new U8[mBufferSize]; +			U8* buffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), mBufferSize);  			if (cur_size > 0)  			{  				memcpy(buffer, mFormattedImage->getData(), cur_size); @@ -1321,7 +1321,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  			// NOTE: setData releases current data and owns new data (buffer)  			mFormattedImage->setData(buffer, mBufferSize);  			// delete temp data -			delete[] mBuffer; // Note: not 'buffer' (assigned in setData()) +			FREE_MEM(LLImageBase::getPrivatePool(), mBuffer); // Note: not 'buffer' (assigned in setData())  			mBuffer = NULL;  			mBufferSize = 0;  			mLoadedDiscard = mRequestedDiscard; @@ -1618,7 +1618,7 @@ bool LLTextureFetchWorker::processSimulatorPackets()  			if (buffer_size > cur_size)  			{  				/// We have new data -				U8* buffer = new U8[buffer_size]; +				U8* buffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), buffer_size);  				S32 offset = 0;  				if (cur_size > 0 && mFirstPacket > 0)  				{ @@ -1670,7 +1670,7 @@ S32 LLTextureFetchWorker::callbackHttpGet(const LLChannelDescriptors& channels,  		if (data_size > 0)  		{  			// *TODO: set the formatted image data here directly to avoid the copy -			mBuffer = new U8[data_size]; +			mBuffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), data_size);  			buffer->readAfter(channels.in(), NULL, mBuffer, data_size);  			mBufferSize += data_size;  			if (data_size < mRequestedSize && mRequestedDiscard == 0) @@ -1811,7 +1811,7 @@ bool LLTextureFetchWorker::writeToCacheComplete()  // public  LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* imagedecodethread, bool threaded, bool qa_mode) -	: LLWorkerThread("TextureFetch", threaded), +	: LLWorkerThread("TextureFetch", threaded, true),  	  mDebugCount(0),  	  mDebugPause(FALSE),  	  mPacketCount(0), diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 0115115a23..6547154bc4 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -94,7 +94,7 @@ public:  		Params()  		:	texture_view("texture_view")  		{ -			mouse_opaque(false); +			changeDefault(mouse_opaque, false);  		}  	};  	LLTextureBar(const Params& p) @@ -387,7 +387,7 @@ public:  		:	texture_view("texture_view")  		{  			S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); -			rect(LLRect(0,0,100,line_height * 4)); +			changeDefault(rect, LLRect(0,0,100,line_height * 4));  		}  	}; @@ -486,7 +486,7 @@ public:  		:	texture_view("texture_view")  		{  			S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); -			rect(LLRect(0,0,100,line_height * 4)); +			changeDefault(rect, LLRect(0,0,100,line_height * 4));  		}  	}; diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index fa91f129b8..6873cf058a 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -307,8 +307,14 @@ void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair  	S32 bottom_offset = mIsScriptDialog ? (BTN_HEIGHT + IGNORE_BTN_TOP_DELTA + BOTTOM_PAD) : BOTTOM_PAD;  	S32 max_width = mControlPanel->getRect().getWidth();  	LLButton* ignore_btn = NULL; +	LLButton* mute_btn = NULL;  	for (std::vector<index_button_pair_t>::const_iterator it = buttons.begin(); it != buttons.end(); it++)  	{ +		if (-2 == it->first) +		{ +			mute_btn = it->second; +			continue; +		}  		if (it->first == -1)  		{  			ignore_btn = it->second; @@ -328,6 +334,8 @@ void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair  		left = btn_rect.mLeft + btn_rect.getWidth() + h_pad;  		mControlPanel->addChild(btn, -1);  	} + +	U32 ignore_btn_width = 0;  	if (mIsScriptDialog && ignore_btn != NULL)  	{  		LLRect ignore_btn_rect(ignore_btn->getRect()); @@ -340,8 +348,25 @@ void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair  		ignore_btn_rect.setOriginAndSize(ignore_btn_left, BOTTOM_PAD,// always move ignore button at the bottom  				ignore_btn_rect.getWidth(), ignore_btn_rect.getHeight());  		ignore_btn->setRect(ignore_btn_rect); +		ignore_btn_width = ignore_btn_rect.getWidth();  		mControlPanel->addChild(ignore_btn, -1);  	} + +	if (mIsScriptDialog && mute_btn != NULL) +	{ +		LLRect mute_btn_rect(mute_btn->getRect()); +		S32 buttons_per_row = max_width / BUTTON_WIDTH; //assume that h_pad far less than BUTTON_WIDTH +		// Place mute (Block) button to the left of the ignore button. +		S32 mute_btn_left = buttons_per_row * BUTTON_WIDTH + (buttons_per_row	- 1) * h_pad - mute_btn_rect.getWidth() - ignore_btn_width - (h_pad / 2); +		if (mute_btn_left + mute_btn_rect.getWidth() > max_width) // make sure that the mute button is in panel +		{ +			mute_btn_left = max_width - mute_btn_rect.getWidth() - 2 * HPAD; +		} +		mute_btn_rect.setOriginAndSize(mute_btn_left, BOTTOM_PAD,// always move mute button at the bottom +				mute_btn_rect.getWidth(), mute_btn_rect.getHeight()); +		mute_btn->setRect(mute_btn_rect); +		mControlPanel->addChild(mute_btn); +	}  }  void LLToastNotifyPanel::adjustPanelForScriptNotice(S32 button_panel_width, S32 button_panel_height) diff --git a/indra/newview/lltoolbar.cpp b/indra/newview/lltoolbar.cpp deleted file mode 100644 index c4f599561d..0000000000 --- a/indra/newview/lltoolbar.cpp +++ /dev/null @@ -1,365 +0,0 @@ -/**  - * @file lltoolbar.cpp - * @author James Cook, Richard Nelson - * @brief Large friendly buttons at bottom of screen. - * - * $LicenseInfo:firstyear=2002&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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 "lltoolbar.h" - -#include "imageids.h" -#include "llfloaterreg.h" -#include "llfontgl.h" -#include "llflyoutbutton.h" -#include "llrect.h" -#include "llparcel.h" - -#include "llagent.h" -#include "llagentwearables.h" -#include "llbutton.h" -#include "llfocusmgr.h" -#include "llviewercontrol.h" -#include "llmenucommands.h" -#include "llimview.h" -#include "lluiconstants.h" -#include "llvoavatarself.h" -#include "lltooldraganddrop.h" -#include "llfloaterinventory.h" -#include "llfloaterchatterbox.h" -#include "llfloatersnapshot.h" -#include "llinventorypanel.h" -#include "lltoolmgr.h" -#include "llui.h" -#include "llviewermenu.h" -//#include "llfirstuse.h" -#include "llpanelblockedlist.h" -#include "llscrolllistctrl.h" -#include "llscrolllistitem.h" -#include "llscrolllistcell.h" -#include "llviewerparcelmgr.h" -#include "lluictrlfactory.h" -#include "llviewerwindow.h" -#include "lltoolgrab.h" -#include "llcombobox.h" -#include "lllayoutstack.h" - -#if LL_DARWIN - -	#include "llresizehandle.h" - -#endif // LL_DARWIN - -// -// Globals -// - -LLToolBar *gToolBar = NULL; - -// -// Statics -// -F32	LLToolBar::sInventoryAutoOpenTime = 1.f; - -// -// Functions -// - -LLToolBar::LLToolBar() -	: LLPanel(), - -	mInventoryAutoOpen(FALSE), -	mNumUnreadIMs(0)	 -#if LL_DARWIN -	, mResizeHandle(NULL) -#endif // LL_DARWIN -{ -	setIsChrome(TRUE); -	setFocusRoot(TRUE); -	 -	mCommitCallbackRegistrar.add("HandleCommunicate", &LLToolBar::onClickCommunicate); -} - - -BOOL LLToolBar::postBuild() -{ -	for (child_list_const_iter_t child_iter = getChildList()->begin(); -		 child_iter != getChildList()->end(); ++child_iter) -	{ -		LLView *view = *child_iter; -		LLButton* buttonp = dynamic_cast<LLButton*>(view); -		if(buttonp) -		{ -			buttonp->setSoundFlags(LLView::SILENT); -		} -	} - -#if LL_DARWIN -	if(mResizeHandle == NULL) -	{ -		LLRect rect(0, 0, RESIZE_HANDLE_WIDTH, RESIZE_HANDLE_HEIGHT); -		LLResizeHandle::Params p; -		p.name(""); -		p.rect(rect); -		p.min_width(RESIZE_HANDLE_WIDTH); -		p.min_height(RESIZE_HANDLE_HEIGHT); -		p.enabled(false); -		mResizeHandle = LLUICtrlFactory::create<LLResizeHandle>(p); -		addChildInBack(mResizeHandle); -		LLLayoutStack* toolbar_stack = getChild<LLLayoutStack>("toolbar_stack"); -		toolbar_stack->reshape(toolbar_stack->getRect().getWidth() - RESIZE_HANDLE_WIDTH, toolbar_stack->getRect().getHeight()); -	} -#endif // LL_DARWIN - -	layoutButtons(); - -	return TRUE; -} - -LLToolBar::~LLToolBar() -{ -	// LLView destructor cleans up children -} - - -BOOL LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, -									 EDragAndDropType cargo_type, -									 void* cargo_data, -									 EAcceptance* accept, -									 std::string& tooltip_msg) -{ -	LLButton* inventory_btn = getChild<LLButton>("inventory_btn"); -	if (!inventory_btn) return FALSE; - -	LLRect button_screen_rect; -	inventory_btn->localRectToScreen(inventory_btn->getRect(),&button_screen_rect); -	 -	const LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(); -	if(active_panel) -	{ -		mInventoryAutoOpen = FALSE; -	} -	else if (button_screen_rect.pointInRect(x, y)) -	{ -		if (mInventoryAutoOpen) -		{ -			if (!active_panel &&  -				mInventoryAutoOpenTimer.getElapsedTimeF32() > sInventoryAutoOpenTime) -			{ -				LLFloaterInventory::showAgentInventory(); -			} -		} -		else -		{ -			mInventoryAutoOpen = TRUE; -			mInventoryAutoOpenTimer.reset(); -		} -	} - -	return LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); -} - -// static -void LLToolBar::toggle(void*) -{ -	BOOL show = gSavedSettings.getBOOL("ShowToolBar");                       -	gSavedSettings.setBOOL("ShowToolBar", !show);                            -	gToolBar->setVisible(!show); -} - - -// static -BOOL LLToolBar::visible(void*) -{ -	return gToolBar->getVisible(); -} - - -void LLToolBar::layoutButtons() -{ -#if LL_DARWIN -	const S32 FUDGE_WIDTH_OF_SCREEN = 4;                                     -	S32 width = gViewerWindow->getWindowWidthScaled() + FUDGE_WIDTH_OF_SCREEN;    -	S32 pad = 2; - -	// this function may be called before postBuild(), in which case mResizeHandle won't have been set up yet. -	if(mResizeHandle != NULL) -	{ -		// Only when running in windowed mode on the Mac, leave room for a resize widget on the right edge of the bar. -		width -= RESIZE_HANDLE_WIDTH; - -		LLRect r; -		r.mLeft = width - pad; -		r.mBottom = 0; -		r.mRight = r.mLeft + RESIZE_HANDLE_WIDTH; -		r.mTop = r.mBottom + RESIZE_HANDLE_HEIGHT; -		mResizeHandle->setRect(r); -		mResizeHandle->setVisible(TRUE); -	} -#endif // LL_DARWIN -} - - -// virtual -void LLToolBar::reshape(S32 width, S32 height, BOOL called_from_parent) -{ -	LLPanel::reshape(width, height, called_from_parent); - -	layoutButtons(); -} - - -// Per-frame updates of visibility -void LLToolBar::refresh() -{ -	BOOL show = gSavedSettings.getBOOL("ShowToolBar"); -	BOOL mouselook = gAgent.cameraMouselook(); -	setVisible(show && !mouselook); - -	if (isInVisibleChain()) -	{ -		updateCommunicateList(); -	} -} - -void LLToolBar::updateCommunicateList() -{ -	LLFlyoutButton* communicate_button = getChild<LLFlyoutButton>("communicate_btn"); -	LLSD selected = communicate_button->getValue(); - -	communicate_button->removeall(); - -	//LLFloater* frontmost_floater = LLFloaterChatterBox::getInstance()->getActiveFloater(); -	LLScrollListItem* itemp = NULL; - -	LLSD contact_sd; -	contact_sd["value"] = "contacts"; -	/*contact_sd["columns"][0]["value"] = LLFloaterMyFriends::getInstance()->getShortTitle();  -	if (LLFloaterMyFriends::getInstance() == frontmost_floater) -	{ -		contact_sd["columns"][0]["font"]["name"] = "SANSSERIF_SMALL";  -		contact_sd["columns"][0]["font"]["style"] = "BOLD";  -		// make sure current tab is selected in list -		if (selected.isUndefined()) -		{ -			selected = "contacts"; -		} -	}*/ -	itemp = communicate_button->addElement(contact_sd, ADD_TOP); - -	communicate_button->addSeparator(ADD_TOP); -	communicate_button->add(getString("Redock Windows"), LLSD("redock"), ADD_TOP); -	communicate_button->addSeparator(ADD_TOP); -	communicate_button->add(getString("Blocked List"), LLSD("mute list"), ADD_TOP); - -	std::set<LLHandle<LLFloater> >::const_iterator floater_handle_it; - -	/*if (gIMMgr->getIMFloaterHandles().size() > 0) -	{ -		communicate_button->addSeparator(ADD_TOP); -	} - -	for(floater_handle_it = gIMMgr->getIMFloaterHandles().begin(); floater_handle_it != gIMMgr->getIMFloaterHandles().end(); ++floater_handle_it) -	{ -		LLFloaterIMPanel* im_floaterp = (LLFloaterIMPanel*)floater_handle_it->get(); -		if (im_floaterp) -		{ -			std::string floater_title = im_floaterp->getNumUnreadMessages() > 0 ? "*" : ""; -			floater_title.append(im_floaterp->getShortTitle()); -			LLSD im_sd; -			im_sd["value"] = im_floaterp->getSessionID(); -			im_sd["columns"][0]["value"] = floater_title; -			if (im_floaterp  == frontmost_floater) -			{ -				im_sd["columns"][0]["font"]["name"] = "SANSSERIF_SMALL"; -				im_sd["columns"][0]["font"]["style"] = "BOLD"; -				if (selected.isUndefined()) -				{ -					selected = im_floaterp->getSessionID(); -				} -			} -			itemp = communicate_button->addElement(im_sd, ADD_TOP); -		} -	}*/ - -	communicate_button->setValue(selected); -} - - -// static -void LLToolBar::onClickCommunicate(LLUICtrl* ctrl, const LLSD& user_data) -{ -	LLFlyoutButton* communicate_button = dynamic_cast<LLFlyoutButton*>(ctrl); -	llassert_always(communicate_button); -	 -	LLSD selected_option = communicate_button->getValue(); -     -	if (selected_option.asString() == "contacts") -	{ -		LLFloaterReg::showInstance("contacts", "friends"); -	} -	else if (selected_option.asString() == "local chat") -	{ -		LLFloaterReg::showInstance("communicate", "local"); -	} -	else if (selected_option.asString() == "redock") -	{ -		/*LLFloaterChatterBox* chatterbox_instance = LLFloaterChatterBox::getInstance(); -		if(chatterbox_instance) -		{ -			chatterbox_instance->addFloater(LLFloaterMyFriends::getInstance(), FALSE); -			 -			LLUUID session_to_show; -		 -			std::set<LLHandle<LLFloater> >::const_iterator floater_handle_it; -			for(floater_handle_it = gIMMgr->getIMFloaterHandles().begin(); floater_handle_it != gIMMgr->getIMFloaterHandles().end(); ++floater_handle_it) -			{ -				LLFloater* im_floaterp = floater_handle_it->get(); -				if (im_floaterp) -				{ -					if (im_floaterp->isFrontmost()) -					{ -						session_to_show = ((LLFloaterIMPanel*)im_floaterp)->getSessionID(); -					} -					chatterbox_instance->addFloater(im_floaterp, FALSE); -				} -			} -			LLFloaterReg::showInstance("communicate", session_to_show); -		}*/ -	} -	else if (selected_option.asString() == "mute list") -	{ -		LLPanelBlockedList::showPanelAndSelect(LLUUID::null); -	} -	else if (selected_option.isUndefined()) // user just clicked the communicate button, treat as toggle -	{ -		/*LLFloaterReg::toggleInstance("communicate");*/ -		} -	else // otherwise selection_option is undifined or a specific IM session id -	{ -		/*LLFloaterReg::showInstance("communicate", selected_option);*/ -	} -} - - diff --git a/indra/newview/lltoolbar.h b/indra/newview/lltoolbar.h deleted file mode 100644 index 217b3c0ac8..0000000000 --- a/indra/newview/lltoolbar.h +++ /dev/null @@ -1,82 +0,0 @@ -/**  - * @file lltoolbar.h - * @brief Large friendly buttons at bottom of screen. - * - * $LicenseInfo:firstyear=2002&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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_LLTOOLBAR_H -#define LL_LLTOOLBAR_H - -#include "llpanel.h" - -#include "llframetimer.h" - -class LLResizeHandle; - -class LLToolBar -:	public LLPanel -{ -public: -	LLToolBar(); -	~LLToolBar(); - -	/*virtual*/ BOOL postBuild(); - -	/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, -									 EDragAndDropType cargo_type, -									 void* cargo_data, -									 EAcceptance* accept, -									 std::string& tooltip_msg); - -	/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); - -	static void toggle(void*); -	static BOOL visible(void*); - -	// Move buttons to appropriate locations based on rect. -	void layoutButtons(); - -	// Per-frame refresh call -	void refresh(); - -	// callbacks -	static void onClickCommunicate(LLUICtrl*, const LLSD&); - -	static F32 sInventoryAutoOpenTime; - -private: -	void updateCommunicateList(); - - -private: -	BOOL		mInventoryAutoOpen; -	LLFrameTimer mInventoryAutoOpenTimer; -	S32			mNumUnreadIMs; -#if LL_DARWIN -	LLResizeHandle *mResizeHandle; -#endif // LL_DARWIN -}; - -extern LLToolBar *gToolBar; - -#endif diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp new file mode 100644 index 0000000000..21e682f072 --- /dev/null +++ b/indra/newview/lltoolbarview.cpp @@ -0,0 +1,492 @@ +/**  + * @file lltoolbarview.cpp + * @author Merov Linden + * @brief User customizable toolbar class + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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 "lltoolbarview.h" + +#include "lldir.h" +#include "llxmlnode.h" +#include "lltoolbar.h" +#include "llbutton.h" +#include "lltooldraganddrop.h" +#include "llclipboard.h" + +#include <boost/foreach.hpp> + +LLToolBarView* gToolBarView = NULL; + +static LLDefaultChildRegistry::Register<LLToolBarView> r("toolbar_view"); + +bool isToolDragged() +{ +	return (LLToolDragAndDrop::getInstance()->getSource() == LLToolDragAndDrop::SOURCE_VIEWER); +} + +LLToolBarView::Toolbar::Toolbar() +:	button_display_mode("button_display_mode"), +	commands("command") +{} + +LLToolBarView::ToolbarSet::ToolbarSet() +:	left_toolbar("left_toolbar"), +	right_toolbar("right_toolbar"), +	bottom_toolbar("bottom_toolbar") +{} + + +LLToolBarView::LLToolBarView(const LLToolBarView::Params& p) +:	LLUICtrl(p), +	mToolbarLeft(NULL), +	mToolbarRight(NULL), +	mToolbarBottom(NULL) +{ +} + +void LLToolBarView::initFromParams(const LLToolBarView::Params& p) +{ +	// Initialize the base object +	LLUICtrl::initFromParams(p); +} + +LLToolBarView::~LLToolBarView() +{ +	saveToolbars(); +} + +BOOL LLToolBarView::postBuild() +{ +	mToolbarLeft   = getChild<LLToolBar>("toolbar_left"); +	mToolbarRight  = getChild<LLToolBar>("toolbar_right"); +	mToolbarBottom = getChild<LLToolBar>("toolbar_bottom"); + +	mToolbarLeft->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3)); +	mToolbarLeft->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4)); +	mToolbarLeft->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4)); +	 +	mToolbarRight->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3)); +	mToolbarRight->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4)); +	mToolbarRight->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4)); +	 +	mToolbarBottom->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3)); +	mToolbarBottom->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4)); +	mToolbarBottom->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4)); +	 +	return TRUE; +} + +bool LLToolBarView::hasCommand(const LLCommandId& commandId) const +{ +	bool has_command = false; +	if (mToolbarLeft && !has_command) +	{ +		has_command = mToolbarLeft->hasCommand(commandId); +	} +	if (mToolbarRight && !has_command) +	{ +		has_command = mToolbarRight->hasCommand(commandId); +	} +	if (mToolbarBottom && !has_command) +	{ +		has_command = mToolbarBottom->hasCommand(commandId); +	} +	return has_command; +} + +bool LLToolBarView::addCommand(const LLCommandId& command, LLToolBar* toolbar) +{ +	LLCommandManager& mgr = LLCommandManager::instance(); +	if (mgr.getCommand(command)) +	{ +		toolbar->addCommand(command); +	} +	else  +	{ +		llwarns	<< "Toolbars creation : the command " << command.name() << " cannot be found in the command manager" << llendl; +		return false; +	} +	return true; +} + +bool LLToolBarView::loadToolbars(bool force_default) +{ +	LLToolBarView::ToolbarSet toolbar_set; +	 +	// Load the toolbars.xml file +	std::string toolbar_file = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "toolbars.xml"); +	if (force_default) +	{ +		toolbar_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "toolbars.xml"); +	} +	else if (!gDirUtilp->fileExists(toolbar_file))  +	{ +		llwarns << "User toolbars def not found -> use default" << llendl; +		toolbar_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "toolbars.xml"); +	} +	 +	LLXMLNodePtr root; +	if(!LLXMLNode::parseFile(toolbar_file, root, NULL)) +	{ +		llwarns << "Unable to load toolbars from file: " << toolbar_file << llendl; +		return false; +	} +	if(!root->hasName("toolbars")) +	{ +		llwarns << toolbar_file << " is not a valid toolbars definition file" << llendl; +		return false; +	} +	 +	// Parse the toolbar settings +	LLXUIParser parser; +	parser.readXUI(root, toolbar_set, toolbar_file); +	if (!toolbar_set.validateBlock()) +	{ +		llerrs << "Unable to validate toolbars from file: " << toolbar_file << llendl; +		return false; +	} +	 +	// Clear the toolbars now before adding the loaded commands and settings +	if (mToolbarLeft) +	{ +		mToolbarLeft->clearCommandsList(); +	} +	if (mToolbarRight) +	{ +		mToolbarRight->clearCommandsList(); +	} +	if (mToolbarBottom) +	{ +		mToolbarBottom->clearCommandsList(); +	} +	 +	// Add commands to each toolbar +	if (toolbar_set.left_toolbar.isProvided() && mToolbarLeft) +	{ +		if (toolbar_set.left_toolbar.button_display_mode.isProvided()) +		{ +			LLToolBarEnums::ButtonType button_type = toolbar_set.left_toolbar.button_display_mode; +			mToolbarLeft->setButtonType(button_type); +		} +		BOOST_FOREACH(LLCommandId::Params& command, toolbar_set.left_toolbar.commands) +		{ +			addCommand(LLCommandId(command),mToolbarLeft); +		} +	} +	if (toolbar_set.right_toolbar.isProvided() && mToolbarRight) +	{ +		if (toolbar_set.right_toolbar.button_display_mode.isProvided()) +		{ +			LLToolBarEnums::ButtonType button_type = toolbar_set.right_toolbar.button_display_mode; +			mToolbarRight->setButtonType(button_type); +		} +		BOOST_FOREACH(LLCommandId::Params& command, toolbar_set.right_toolbar.commands) +		{ +			addCommand(LLCommandId(command),mToolbarRight); +		} +	} +	if (toolbar_set.bottom_toolbar.isProvided() && mToolbarBottom) +	{ +		if (toolbar_set.bottom_toolbar.button_display_mode.isProvided()) +		{ +			LLToolBarEnums::ButtonType button_type = toolbar_set.bottom_toolbar.button_display_mode; +			mToolbarBottom->setButtonType(button_type); +		} +		BOOST_FOREACH(LLCommandId::Params& command, toolbar_set.bottom_toolbar.commands) +		{ +			addCommand(LLCommandId(command),mToolbarBottom); +		} +	} +	return true; +} + +//static +bool LLToolBarView::loadDefaultToolbars() +{ +	bool retval = false; + +	if (gToolBarView) +	{ +		retval = gToolBarView->loadToolbars(true); +	} + +	return retval; +} + +void LLToolBarView::saveToolbars() const +{ +	// Build the parameter tree from the toolbar data +	LLToolBarView::ToolbarSet toolbar_set; +	if (mToolbarLeft) +	{ +		toolbar_set.left_toolbar.button_display_mode = mToolbarLeft->getButtonType(); +		addToToolset(mToolbarLeft->getCommandsList(),toolbar_set.left_toolbar); +	} +	if (mToolbarRight) +	{ +		toolbar_set.right_toolbar.button_display_mode = mToolbarRight->getButtonType(); +		addToToolset(mToolbarRight->getCommandsList(),toolbar_set.right_toolbar); +	} +	if (mToolbarBottom) +	{ +		toolbar_set.bottom_toolbar.button_display_mode = mToolbarBottom->getButtonType(); +		addToToolset(mToolbarBottom->getCommandsList(),toolbar_set.bottom_toolbar); +	} +	 +	// Serialize the parameter tree +	LLXMLNodePtr output_node = new LLXMLNode("toolbars", false); +	LLXUIParser parser; +	parser.writeXUI(output_node, toolbar_set); +	 +	// Write the resulting XML to file +	if(!output_node->isNull()) +	{ +		const std::string& filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "toolbars.xml"); +		LLFILE *fp = LLFile::fopen(filename, "w"); +		if (fp != NULL) +		{ +			LLXMLNode::writeHeaderToFile(fp); +			output_node->writeToFile(fp); +			fclose(fp); +		} +	} +} + +// Enumerate the commands in command_list and add them as Params to the toolbar +void LLToolBarView::addToToolset(command_id_list_t& command_list, Toolbar& toolbar) const +{ +	for (command_id_list_t::const_iterator it = command_list.begin(); +		 it != command_list.end(); +		 ++it) +	{ +		LLCommandId::Params command; +		command.name = it->name();		 +		toolbar.commands.add(command); +	} +} + +void LLToolBarView::draw() +{ +	//LLPanel* sizer_left = getChild<LLPanel>("sizer_left"); +	 +	LLRect bottom_rect, left_rect, right_rect; + +	if (mToolbarBottom)  +	{ +		mToolbarBottom->getParent()->reshape(mToolbarBottom->getParent()->getRect().getWidth(), mToolbarBottom->getRect().getHeight()); +		mToolbarBottom->localRectToOtherView(mToolbarBottom->getLocalRect(), &bottom_rect, this); +	} +	if (mToolbarLeft)    +	{ +		mToolbarLeft->getParent()->reshape(mToolbarLeft->getRect().getWidth(), mToolbarLeft->getParent()->getRect().getHeight()); +		mToolbarLeft->localRectToOtherView(mToolbarLeft->getLocalRect(), &left_rect, this); +	} +	if (mToolbarRight)   +	{ +		mToolbarRight->getParent()->reshape(mToolbarRight->getRect().getWidth(), mToolbarRight->getParent()->getRect().getHeight()); +		mToolbarRight->localRectToOtherView(mToolbarRight->getLocalRect(), &right_rect, this); +	} +	 +	// Draw drop zones if drop of a tool is active +	if (isToolDragged()) +	{ +		LLColor4 drop_color = LLUIColorTable::instance().getColor( "ToolbarDropZoneColor" ); +		gl_rect_2d(bottom_rect, drop_color, TRUE); +		gl_rect_2d(left_rect, drop_color, TRUE); +		gl_rect_2d(right_rect, drop_color, TRUE); +	} +	 +	LLUICtrl::draw(); +} + + +// ---------------------------------------- +// Drag and Drop Handling +// ---------------------------------------- + + +void LLToolBarView::startDragTool( S32 x, S32 y, const LLUUID& uuid) +{ +	// Flag the tool dragging but don't start it yet +	gToolBarView->mDragStarted = false; +	gToolBarView->mDragCommand = LLCommandId::null; +	gToolBarView->mDragRank = LLToolBar::RANK_NONE; +	gToolBarView->mDragToolbar = NULL; +	LLToolDragAndDrop::getInstance()->setDragStart( x, y ); +} + +BOOL LLToolBarView::handleDragTool( S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type) +{ +	if (LLToolDragAndDrop::getInstance()->isOverThreshold( x, y )) +	{ +		if (!gToolBarView->mDragStarted) +		{ +			// Start the tool dragging: +			 +			// First, create the global drag and drop object +			std::vector<EDragAndDropType> types; +			uuid_vec_t cargo_ids; +			types.push_back(DAD_WIDGET); +			cargo_ids.push_back(uuid); +			gClipboard.setSourceObject(uuid,LLAssetType::AT_WIDGET); +			LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_VIEWER; +			LLUUID srcID; +			LLToolDragAndDrop::getInstance()->beginMultiDrag(types, cargo_ids, src, srcID); +			 +			// Second, check if the command is present in one of the 3 toolbars +			// If it is, store the command, the toolbar and the rank in the toolbar and +			// set a callback on end drag so that we reinsert the command if no drop happened +			/* +			gToolBarView->mDragCommand = LLCommandId(uuid); +			if ((gToolBarView->mDragRank = gToolBarView->mToolbarLeft->removeCommand(gToolBarView->mDragCommand)) != LLToolBar::RANK_NONE) +			{ +				gToolBarView->mDragToolbar = gToolBarView->mToolbarLeft; +			} +			else if ((gToolBarView->mDragRank = gToolBarView->mToolbarRight->removeCommand(gToolBarView->mDragCommand)) != LLToolBar::RANK_NONE) +			{ +				gToolBarView->mDragToolbar = gToolBarView->mToolbarRight; +			} +			else if ((gToolBarView->mDragRank = gToolBarView->mToolbarBottom->removeCommand(gToolBarView->mDragCommand)) != LLToolBar::RANK_NONE) +			{ +				gToolBarView->mDragToolbar = gToolBarView->mToolbarBottom; +			} +			if (gToolBarView->mDragRank != LLToolBar::RANK_NONE) +			{ +				llinfos << "Merov debug: rank of dragged tool = " << gToolBarView->mDragRank << llendl; +				LLToolDragAndDrop::getInstance()->setEndDragCallback(boost::bind(&LLToolBarView::onEndDrag, gToolBarView)); +			} +			 */ + +			gToolBarView->mDragStarted = true; +			return TRUE; +		} +		else +		{ +			MASK mask = 0; +			return LLToolDragAndDrop::getInstance()->handleHover( x, y, mask ); +		} +	} +	return FALSE; +} + +BOOL LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* toolbar) +{ +	BOOL handled = FALSE; +	LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data; +	 +	LLAssetType::EType type = inv_item->getType(); +	if (type == LLAssetType::AT_WIDGET) +	{ +		handled = TRUE; +		// Get the command from its uuid +		LLCommandManager& mgr = LLCommandManager::instance(); +		LLCommandId command_id(inv_item->getUUID()); +		LLCommand* command = mgr.getCommand(command_id); +		if (command) +		{ +			// Convert the (x,y) position in rank in toolbar +			int new_rank = LLToolBar::RANK_NONE; +			if (!toolbar->isReadOnly()) +			{ +				new_rank = toolbar->getRankFromPosition(x,y); +			} +			// Suppress the command from the toolbars (including the one it's dropped in,  +			// this will handle move position). +			int old_rank = LLToolBar::RANK_NONE; +			LLToolBar* old_toolbar = NULL; +			int rank; +			if ((rank = gToolBarView->mToolbarLeft->removeCommand(command_id)) != LLToolBar::RANK_NONE) +			{ +				old_rank = rank; +				old_toolbar = gToolBarView->mToolbarLeft; +			} +			if ((rank = gToolBarView->mToolbarRight->removeCommand(command_id)) != LLToolBar::RANK_NONE) +			{ +				old_rank = rank; +				old_toolbar = gToolBarView->mToolbarRight; +			} +			if ((rank = gToolBarView->mToolbarBottom->removeCommand(command_id)) != LLToolBar::RANK_NONE) +			{ +				old_rank = rank; +				old_toolbar = gToolBarView->mToolbarBottom; +			} +			// Now insert it in the toolbar at the detected rank +			if (!toolbar->isReadOnly()) +			{ +				if ((old_toolbar == toolbar) && (old_rank != LLToolBar::RANK_NONE) && (old_rank < new_rank)) +				{ +					// If we just removed the command from the same toolbar, we need to consider that it might +					// change the target rank. +					new_rank -= 1; +				} +				toolbar->addCommand(command->id(),new_rank); +			} +		} +		else +		{ +			llwarns << "Command couldn't be found in command manager" << llendl; +		} +	} +	stopDragTool(); +	return handled; +} + +void LLToolBarView::stopDragTool() +{ +	// Clear the saved command, toolbar and rank +	gToolBarView->mDragStarted = false; +	gToolBarView->mDragCommand = LLCommandId::null; +	gToolBarView->mDragRank = LLToolBar::RANK_NONE; +	gToolBarView->mDragToolbar = NULL; +} + +void LLToolBarView::onEndDrag() +{ +	// If there's a saved command, reinsert it in the saved toolbar +	if (gToolBarView->mDragRank != LLToolBar::RANK_NONE) +	{ +		gToolBarView->mDragToolbar->addCommand(gToolBarView->mDragCommand,gToolBarView->mDragRank); +	} +	stopDragTool(); +} + +void LLToolBarView::setToolBarsVisible(bool visible) +{ +	mToolbarBottom->getParent()->setVisible(visible); +	mToolbarLeft->getParent()->setVisible(visible); +	mToolbarRight->getParent()->setVisible(visible); +} + +bool LLToolBarView::isModified() const +{ +	bool modified = false; + +	modified |= mToolbarBottom->isModified(); +	modified |= mToolbarLeft->isModified(); +	modified |= mToolbarRight->isModified(); + +	return modified; +} diff --git a/indra/newview/lltoolbarview.h b/indra/newview/lltoolbarview.h new file mode 100644 index 0000000000..8b3af43875 --- /dev/null +++ b/indra/newview/lltoolbarview.h @@ -0,0 +1,111 @@ +/**  + * @file lltoolbarview.h + * @author Merov Linden + * @brief User customizable toolbar class + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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_LLTOOLBARVIEW_H +#define LL_LLTOOLBARVIEW_H + +#include "lluictrl.h" +#include "lltoolbar.h" +#include "llcommandmanager.h" + +class LLUICtrlFactory; + +// Parent of all LLToolBar + +class LLToolBarView : public LLUICtrl +{ +public: +	// Xui structure of the toolbar panel +	struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> {}; + +	// Note: valid children for LLToolBarView are stored in this registry +	typedef LLDefaultChildRegistry child_registry_t; +	 +	// Xml structure of the toolbars.xml setting +	// Those live in a toolbars.xml found in app_settings (for the default) and in +	// the user folder for the user specific (saved) settings +	struct Toolbar : public LLInitParam::Block<Toolbar> +	{ +		Mandatory<LLToolBarEnums::ButtonType>	button_display_mode; +		Multiple<LLCommandId::Params>	commands; +		Toolbar(); +	}; +	struct ToolbarSet : public LLInitParam::Block<ToolbarSet> +	{ +		Optional<Toolbar>	left_toolbar, +							right_toolbar, +							bottom_toolbar; +		ToolbarSet(); +	}; + +	// Derived methods +	virtual ~LLToolBarView(); +	virtual BOOL postBuild(); +	virtual void draw(); +	// Toolbar view interface with the rest of the world +	// Checks if the commandId is being used somewhere in one of the toolbars +	bool hasCommand(const LLCommandId& commandId) const; +	// Loads the toolbars from the existing user or default settings +	bool loadToolbars(bool force_default = false);	// return false if load fails +	 +	void setToolBarsVisible(bool visible); + +	static bool loadDefaultToolbars(); +	 +	static void startDragTool( S32 x, S32 y, const LLUUID& uuid); +	static BOOL handleDragTool( S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type); +	static BOOL handleDropTool(	void* cargo_data, S32 x, S32 y, LLToolBar* toolbar); +	static void stopDragTool(); +	void onEndDrag(); + +	bool isModified() const; +	 +protected: +	friend class LLUICtrlFactory; +	LLToolBarView(const Params&); + +	void initFromParams(const Params&); + +private: +	void	saveToolbars() const; +	bool	addCommand(const LLCommandId& commandId, LLToolBar*	toolbar); +	void	addToToolset(command_id_list_t& command_list, Toolbar& toolbar) const; + +	// Pointers to the toolbars handled by the toolbar view +	LLToolBar*	mToolbarLeft; +	LLToolBar*	mToolbarRight; +	LLToolBar*	mToolbarBottom; +	 +	LLCommandId mDragCommand; +	int			mDragRank; +	LLToolBar*	mDragToolbar; +	bool		mDragStarted; +}; + +extern LLToolBarView* gToolBarView; + +#endif  // LL_LLTOOLBARVIEW_H diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index d23d2b3abd..6910b8eced 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -57,6 +57,7 @@  #include "llviewerwindow.h"  #include "llvoavatarself.h"  #include "llworld.h" +#include "llclipboard.h"  // syntactic sugar  #define callMemberFunction(object,ptrToMember)  ((object).*(ptrToMember)) @@ -613,6 +614,7 @@ BOOL LLToolDragAndDrop::handleToolTip(S32 x, S32 y, MASK mask)  {  	if (!mToolTipMsg.empty())  	{ +		LLToolTipMgr::instance().unblockToolTips();  		LLToolTipMgr::instance().show(LLToolTip::Params()  			.message(mToolTipMsg)  			.delay_time(gSavedSettings.getF32( "DragAndDropToolTipDelay" ))); @@ -801,7 +803,7 @@ void LLToolDragAndDrop::pick(const LLPickInfo& pick_info)  	LLViewerObject* hit_obj = pick_info.getObject();  	LLSelectMgr::getInstance()->unhighlightAll(); - +	bool highlight_object = false;  	// Treat attachments as part of the avatar they are attached to.  	if (hit_obj != NULL)  	{ @@ -843,16 +845,7 @@ void LLToolDragAndDrop::pick(const LLPickInfo& pick_info)  		{  			target = DT_OBJECT;  			hit_face = pick_info.mObjectFace; -			// if any item being dragged will be applied to the object under our cursor -			// highlight that object -			for (S32 i = 0; i < (S32)mCargoIDs.size(); i++) -			{ -				if (mCargoTypes[i] != DAD_OBJECT || (pick_info.mKeyMask & MASK_CONTROL)) -				{ -					LLSelectMgr::getInstance()->highlightObjectAndFamily(hit_obj); -					break; -				} -			} +			highlight_object = true;  		}  	}  	else if (pick_info.mPickType == LLPickInfo::PICK_LAND) @@ -898,6 +891,19 @@ void LLToolDragAndDrop::pick(const LLPickInfo& pick_info)  		}  	} +	if (highlight_object && mLastAccept > ACCEPT_NO_LOCKED) +	{ +		// if any item being dragged will be applied to the object under our cursor +		// highlight that object +		for (S32 i = 0; i < (S32)mCargoIDs.size(); i++) +		{ +			if (mCargoTypes[i] != DAD_OBJECT || (pick_info.mKeyMask & MASK_CONTROL)) +			{ +				LLSelectMgr::getInstance()->highlightObjectAndFamily(hit_obj); +				break; +			} +		} +	}  	ECursorType cursor = acceptanceToCursor( mLastAccept );  	gViewerWindow->getWindow()->setCursor( cursor ); @@ -1651,6 +1657,13 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(  		return ACCEPT_NO;  	} +	const LLUUID &outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false); +	if(gInventory.isObjectDescendentOf(item->getUUID(), outbox_id)) +	{ +		return ACCEPT_NO; +	} + +  	if( drop )  	{  		if(mSource == SOURCE_LIBRARY) @@ -2054,6 +2067,12 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(  			return ACCEPT_NO;  		} +		const LLUUID &outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false); +		if(gInventory.isObjectDescendentOf(category->getUUID(), outbox_id)) +		{ +			return ACCEPT_NO; +		} +  		if(drop)  		{  			BOOL append = ( (mask & MASK_SHIFT) ? TRUE : FALSE ); @@ -2481,6 +2500,10 @@ LLInventoryObject* LLToolDragAndDrop::locateInventory(  			item = (LLViewerInventoryItem*)preview->getDragItem();  		}  	} +	else if(mSource == SOURCE_VIEWER) +	{ +		item = (LLViewerInventoryItem*)gClipboard.getSourceObject(); +	}  	if(item) return item;  	if(cat) return cat;  	return NULL; diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h index 7b8cce3dc7..92f007a251 100644 --- a/indra/newview/lltooldraganddrop.h +++ b/indra/newview/lltooldraganddrop.h @@ -66,7 +66,8 @@ public:  		SOURCE_AGENT,  		SOURCE_WORLD,  		SOURCE_NOTECARD, -		SOURCE_LIBRARY +		SOURCE_LIBRARY, +		SOURCE_VIEWER  	};  	void beginDrag(EDragAndDropType type, diff --git a/indra/newview/lltoolgun.cpp b/indra/newview/lltoolgun.cpp index 68af3d73d2..857d105361 100644 --- a/indra/newview/lltoolgun.cpp +++ b/indra/newview/lltoolgun.cpp @@ -56,7 +56,7 @@ void LLToolGun::handleSelect()  {  	gViewerWindow->hideCursor();  	gViewerWindow->moveCursorToCenter(); -	gViewerWindow->mWindow->setMouseClipping(TRUE); +	gViewerWindow->getWindow()->setMouseClipping(TRUE);  	mIsSelected = TRUE;  } @@ -64,7 +64,7 @@ void LLToolGun::handleDeselect()  {  	gViewerWindow->moveCursorToCenter();  	gViewerWindow->showCursor(); -	gViewerWindow->mWindow->setMouseClipping(FALSE); +	gViewerWindow->getWindow()->setMouseClipping(FALSE);  	mIsSelected = FALSE;  } diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index c38c8bad80..b0d9bd5d70 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -35,7 +35,6 @@  #include "llagent.h"  #include "llagentcamera.h"  #include "llavatarnamecache.h" -#include "llviewercontrol.h"  #include "llfocusmgr.h"  #include "llfirstuse.h"  #include "llfloaterland.h" @@ -57,6 +56,7 @@  #include "lltrans.h"  #include "llviewercamera.h"  #include "llviewerparcelmedia.h" +#include "llviewercontrol.h"  #include "llviewermenu.h"  #include "llviewerobjectlist.h"  #include "llviewerobject.h" @@ -76,7 +76,6 @@ static void handle_click_action_play();  static void handle_click_action_open_media(LLPointer<LLViewerObject> objectp);  static ECursorType cursor_from_parcel_media(U8 click_action); -  LLToolPie::LLToolPie()  :	LLTool(std::string("Pie")),  	mMouseButtonDown( false ), @@ -479,6 +478,18 @@ void LLToolPie::resetSelection()  	mClickAction = 0;  } +void LLToolPie::walkToClickedLocation() +{ +	if(mAutoPilotDestination) { mAutoPilotDestination->markDead(); } +	mAutoPilotDestination = (LLHUDEffectBlob *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BLOB, FALSE); +	mAutoPilotDestination->setPositionGlobal(mPick.mPosGlobal); +	mAutoPilotDestination->setPixelSize(5); +	mAutoPilotDestination->setColor(LLColor4U(170, 210, 190)); +	mAutoPilotDestination->setDuration(3.f); + +	handle_go_to(); +} +  // When we get object properties after left-clicking on an object  // with left-click = buy, if it's the same object, do the buy. @@ -662,18 +673,9 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)  			mPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * SELF_CLICK_WALK_DISTANCE;  		}  		gAgentCamera.setFocusOnAvatar(TRUE, TRUE); -		if(mAutoPilotDestination) { mAutoPilotDestination->markDead(); } -		mAutoPilotDestination = (LLHUDEffectBlob *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BLOB, FALSE); -		mAutoPilotDestination->setPositionGlobal(mPick.mPosGlobal); -		mAutoPilotDestination->setPixelSize(5); -		mAutoPilotDestination->setColor(LLColor4U(170, 210, 190)); -		mAutoPilotDestination->setDuration(3.f); - -		handle_go_to(); +		walkToClickedLocation();  		LLFirstUse::notMoving(false); -		mBlockClickToWalk = false; -  		return TRUE;  	}  	gViewerWindow->setCursor(UI_CURSOR_ARROW); @@ -708,16 +710,10 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)  	if (gSavedSettings.getBOOL("DoubleClickAutoPilot"))  	{ -		if (mPick.mPickType == LLPickInfo::PICK_LAND -			&& !mPick.mPosGlobal.isExactlyZero()) -		{ -			handle_go_to(); -			return TRUE; -		} -		else if (mPick.mObjectID.notNull() -				 && !mPick.mPosGlobal.isExactlyZero()) +		if ((mPick.mPickType == LLPickInfo::PICK_LAND && !mPick.mPosGlobal.isExactlyZero()) || +			(mPick.mObjectID.notNull()  && !mPick.mPosGlobal.isExactlyZero()))  		{ -			handle_go_to(); +			walkToClickedLocation();  			return TRUE;  		}  	} diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h index d7c79ee223..68fe8bc4a5 100644 --- a/indra/newview/lltoolpie.h +++ b/indra/newview/lltoolpie.h @@ -66,6 +66,7 @@ public:  	LLViewerObject*		getClickActionObject() { return mClickActionObject; }  	LLObjectSelection*	getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; }  	void 				resetSelection(); +	void				walkToClickedLocation();  	void				blockClickToWalk() { mBlockClickToWalk = true; }  	void				stopClickToWalk(); diff --git a/indra/newview/lluploadfloaterobservers.cpp b/indra/newview/lluploadfloaterobservers.cpp new file mode 100644 index 0000000000..5a6a17fbca --- /dev/null +++ b/indra/newview/lluploadfloaterobservers.cpp @@ -0,0 +1,56 @@ +/** + * @file lluploadfloaterobservers.cpp + * @brief LLUploadModelPremissionsResponder definition + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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 "lluploadfloaterobservers.h" + +LLUploadModelPremissionsResponder::LLUploadModelPremissionsResponder(const LLHandle<LLUploadPermissionsObserver>& observer) +:mObserverHandle(observer) +{ +} + +void LLUploadModelPremissionsResponder::error(U32 status, const std::string& reason) +{ +	llwarns << "LLUploadModelPremissionsResponder::error("<< status << ": " << reason << ")" << llendl; + +	LLUploadPermissionsObserver* observer = mObserverHandle.get(); + +	if (observer) +	{ +		observer->setPermissonsErrorStatus(status, reason); +	} +} + +void LLUploadModelPremissionsResponder::result(const LLSD& content) +{ +	LLUploadPermissionsObserver* observer = mObserverHandle.get(); + +	if (observer) +	{ +		observer->onPermissionsReceived(content); +	} +} diff --git a/indra/newview/lluploadfloaterobservers.h b/indra/newview/lluploadfloaterobservers.h new file mode 100644 index 0000000000..79aad282d7 --- /dev/null +++ b/indra/newview/lluploadfloaterobservers.h @@ -0,0 +1,97 @@ +/** + * @file lluploadfloaterobservers.h + * @brief LLUploadModelPremissionsResponder declaration + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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_LLUPLOADFLOATEROBSERVERS_H +#define LL_LLUPLOADFLOATEROBSERVERS_H + +#include "llfloater.h" +#include "llhttpclient.h" +#include "llhandle.h" + +class LLUploadPermissionsObserver +{ +public: + +	LLUploadPermissionsObserver(){mUploadPermObserverHandle.bind(this);} +	virtual ~LLUploadPermissionsObserver() {} + +	virtual void onPermissionsReceived(const LLSD& result) = 0; +	virtual void setPermissonsErrorStatus(U32 status, const std::string& reason) = 0; + +	LLHandle<LLUploadPermissionsObserver> getPermObserverHandle() const {return mUploadPermObserverHandle;} + +protected: +	LLRootHandle<LLUploadPermissionsObserver> mUploadPermObserverHandle; +}; + +class LLWholeModelFeeObserver +{ +public: +	LLWholeModelFeeObserver() { mWholeModelFeeObserverHandle.bind(this); } +	virtual ~LLWholeModelFeeObserver() {} + +	virtual void onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url) = 0; +	virtual void setModelPhysicsFeeErrorStatus(U32 status, const std::string& reason) = 0; + +	LLHandle<LLWholeModelFeeObserver> getWholeModelFeeObserverHandle() const { return mWholeModelFeeObserverHandle; } + +protected: +	LLRootHandle<LLWholeModelFeeObserver> mWholeModelFeeObserverHandle; +}; + + +class LLWholeModelUploadObserver +{ +public: +	LLWholeModelUploadObserver() { mWholeModelUploadObserverHandle.bind(this); } +	virtual ~LLWholeModelUploadObserver() {} + +	virtual void onModelUploadSuccess() = 0; + +	virtual void onModelUploadFailure() = 0; + +	LLHandle<LLWholeModelUploadObserver> getWholeModelUploadObserverHandle() const { return mWholeModelUploadObserverHandle; } + +protected: +	LLRootHandle<LLWholeModelUploadObserver> mWholeModelUploadObserverHandle; +}; + + +class LLUploadModelPremissionsResponder : public LLHTTPClient::Responder +{ +public: + +	LLUploadModelPremissionsResponder(const LLHandle<LLUploadPermissionsObserver>& observer); + +	void error(U32 status, const std::string& reason); + +	void result(const LLSD& content); + +private: +	LLHandle<LLUploadPermissionsObserver> mObserverHandle; +}; + +#endif /* LL_LLUPLOADFLOATEROBSERVERS_H */ diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index ed4d278e90..f6d7ceeec3 100644 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -32,10 +32,10 @@  #include "llcommandhandler.h"  #include "llfloaterhelpbrowser.h"  #include "llfloaterreg.h" +#include "llfloatersidepanelcontainer.h"  #include "llfloaterworldmap.h"  #include "llpanellogin.h"  #include "llregionhandle.h" -#include "llsidetray.h"  #include "llslurl.h"  #include "llstartup.h"			// gStartupState  #include "llweb.h" @@ -246,7 +246,7 @@ void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const LLSLURL&  		key["y"] = global_pos.mdV[VY];  		key["z"] = global_pos.mdV[VZ]; -		LLSideTray::getInstance()->showPanel("panel_places", key); +		LLFloaterSidePanelContainer::showPanel("places", key);  	}  } diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp index b103f11597..a4b1c2155f 100644 --- a/indra/newview/llviewerassettype.cpp +++ b/indra/newview/llviewerassettype.cpp @@ -80,7 +80,9 @@ LLViewerAssetDictionary::LLViewerAssetDictionary()  	addEntry(LLViewerAssetType::AT_LINK_FOLDER, 		new ViewerAssetEntry(DAD_LINK));  	addEntry(LLViewerAssetType::AT_MESH, 				new ViewerAssetEntry(DAD_MESH)); - +	 +	addEntry(LLViewerAssetType::AT_WIDGET, 				new ViewerAssetEntry(DAD_WIDGET)); +	  	addEntry(LLViewerAssetType::AT_NONE, 				new ViewerAssetEntry(DAD_NONE));  }; diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index b19c738ed2..f7fa5690d6 100644 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -36,6 +36,7 @@  #include "llviewerwindow.h"  #include "llvoiceclient.h"  #include "llviewermedia.h" +#include "llprogressview.h"  ///////////////////////////////////////////////////////// @@ -101,7 +102,16 @@ void audio_update_volume(bool force_update)  {  	F32 master_volume = gSavedSettings.getF32("AudioLevelMaster");  	BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); -	if (!gViewerWindow->getActive() && (gSavedSettings.getBOOL("MuteWhenMinimized"))) + +	LLProgressView* progress = gViewerWindow->getProgressView(); +	BOOL progress_view_visible = FALSE; + +	if (progress) +	{ +		progress_view_visible = progress->getVisible(); +	} + +	if (!gViewerWindow->getActive() && gSavedSettings.getBOOL("MuteWhenMinimized"))  	{  		mute_audio = TRUE;  	} @@ -114,7 +124,7 @@ void audio_update_volume(bool force_update)  		gAudiop->setDopplerFactor(gSavedSettings.getF32("AudioLevelDoppler"));  		gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff")); -		gAudiop->setMuted(mute_audio); +		gAudiop->setMuted(mute_audio || progress_view_visible);  		if (force_update)  		{ @@ -136,7 +146,7 @@ void audio_update_volume(bool force_update)  		F32 music_volume = gSavedSettings.getF32("AudioLevelMusic");  		BOOL music_muted = gSavedSettings.getBOOL("MuteMusic");  		music_volume = mute_volume * master_volume * music_volume; -		gAudiop->setInternetStreamGain ( music_muted ? 0.f : music_volume ); +		gAudiop->setInternetStreamGain ( music_muted || progress_view_visible ? 0.f : music_volume );  	} diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 87ca80260f..967e26be0c 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -142,7 +142,6 @@ static bool handleRenderPerfTestChanged(const LLSD& newvalue)                                                                           LLPipeline::RENDER_TYPE_WATER,                                                                           LLPipeline::RENDER_TYPE_PASS_GRASS,                                                                           LLPipeline::RENDER_TYPE_HUD, -                                                                         LLPipeline::RENDER_TYPE_PARTICLES,                                                                           LLPipeline::RENDER_TYPE_CLOUDS,                                                                           LLPipeline::RENDER_TYPE_HUD_PARTICLES,                                                                           LLPipeline::END_RENDER_TYPES);  @@ -158,7 +157,6 @@ static bool handleRenderPerfTestChanged(const LLSD& newvalue)                                                                           LLPipeline::RENDER_TYPE_WATER,                                                                           LLPipeline::RENDER_TYPE_PASS_GRASS,                                                                           LLPipeline::RENDER_TYPE_HUD, -                                                                         LLPipeline::RENDER_TYPE_PARTICLES,                                                                           LLPipeline::RENDER_TYPE_CLOUDS,                                                                           LLPipeline::RENDER_TYPE_HUD_PARTICLES,                                                                           LLPipeline::END_RENDER_TYPES); @@ -168,6 +166,11 @@ static bool handleRenderPerfTestChanged(const LLSD& newvalue)         return true;  } +bool handleRenderAvatarComplexityLimitChanged(const LLSD& newvalue) +{ +	return true; +} +  bool handleRenderTransparentWaterChanged(const LLSD& newvalue)  {  	LLWorld::getInstance()->updateWaterObjects(); @@ -404,7 +407,7 @@ static bool handleRenderDeferredChanged(const LLSD& newvalue)  		gPipeline.releaseGLBuffers();  		gPipeline.createGLBuffers();  		gPipeline.resetVertexBuffers(); -		if (LLPipeline::sRenderDeferred && LLRenderTarget::sUseFBO) +		if (LLPipeline::sRenderDeferred == (BOOL)LLRenderTarget::sUseFBO)  		{  			LLViewerShaderMgr::instance()->setShaders();  		} @@ -538,18 +541,12 @@ bool toggle_show_navigation_panel(const LLSD& newvalue)  {  	bool value = newvalue.asBoolean(); -	LLNavigationBar::getInstance()->showNavigationPanel(value); +	LLNavigationBar::getInstance()->setVisible(value);  	gSavedSettings.setBOOL("ShowMiniLocationPanel", !value);  	return true;  } -bool toggle_show_favorites_panel(const LLSD& newvalue) -{ -	LLNavigationBar::getInstance()->showFavoritesPanel(newvalue.asBoolean()); -	return true; -} -  bool toggle_show_mini_location_panel(const LLSD& newvalue)  {  	bool value = newvalue.asBoolean(); @@ -566,7 +563,7 @@ bool toggle_show_object_render_cost(const LLSD& newvalue)  	return true;  } -void toggle_updater_service_active(LLControlVariable* control, const LLSD& new_value) +void toggle_updater_service_active(const LLSD& new_value)  {      if(new_value.asInteger())      { @@ -611,6 +608,7 @@ void settings_setup_listeners()  	gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));  	gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));  	gSavedSettings.getControl("RenderAvatarMaxVisible")->getSignal()->connect(boost::bind(&handleAvatarMaxVisibleChanged, _2)); +	gSavedSettings.getControl("RenderAvatarComplexityLimit")->getSignal()->connect(boost::bind(&handleRenderAvatarComplexityLimitChanged, _2));  	gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _2));  	gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _2));  	gSavedSettings.getControl("RenderAvatarPhysicsLODFactor")->getSignal()->connect(boost::bind(&handleAvatarPhysicsLODChanged, _2)); @@ -732,10 +730,9 @@ void settings_setup_listeners()  	gSavedSettings.getControl("UseDebugMenus")->getSignal()->connect(boost::bind(&show_debug_menus));  	gSavedSettings.getControl("AgentPause")->getSignal()->connect(boost::bind(&toggle_agent_pause, _2));  	gSavedSettings.getControl("ShowNavbarNavigationPanel")->getSignal()->connect(boost::bind(&toggle_show_navigation_panel, _2)); -	gSavedSettings.getControl("ShowNavbarFavoritesPanel")->getSignal()->connect(boost::bind(&toggle_show_favorites_panel, _2));  	gSavedSettings.getControl("ShowMiniLocationPanel")->getSignal()->connect(boost::bind(&toggle_show_mini_location_panel, _2));  	gSavedSettings.getControl("ShowObjectRenderingCost")->getSignal()->connect(boost::bind(&toggle_show_object_render_cost, _2)); -	gSavedSettings.getControl("UpdaterServiceSetting")->getSignal()->connect(&toggle_updater_service_active); +	gSavedSettings.getControl("UpdaterServiceSetting")->getSignal()->connect(boost::bind(&toggle_updater_service_active, _2));  	gSavedSettings.getControl("ForceShowGrid")->getSignal()->connect(boost::bind(&handleForceShowGrid, _2));  	gSavedSettings.getControl("RenderTransparentWater")->getSignal()->connect(boost::bind(&handleRenderTransparentWaterChanged, _2));  } diff --git a/indra/newview/llviewercontrollistener.cpp b/indra/newview/llviewercontrollistener.cpp index 8bc25fa281..361b96221c 100644 --- a/indra/newview/llviewercontrollistener.cpp +++ b/indra/newview/llviewercontrollistener.cpp @@ -31,99 +31,196 @@  #include "llviewercontrollistener.h"  #include "llviewercontrol.h" +#include "llcontrol.h" +#include "llerror.h" +#include "llsdutil.h" +#include "stringize.h" +#include <sstream> -LLViewerControlListener gSavedSettingsListener; +namespace { + +LLViewerControlListener sSavedSettingsListener; + +} // unnamed namespace  LLViewerControlListener::LLViewerControlListener()  	: LLEventAPI("LLViewerControl", -                 "LLViewerControl listener: set, toggle or set default for various controls", -                 "group") +				 "LLViewerControl listener: set, toggle or set default for various controls")  { -	add("Global", -        "Set gSavedSettings control [\"key\"] to value [\"value\"]", -        boost::bind(&LLViewerControlListener::set, &gSavedSettings, _1)); -	add("PerAccount", -        "Set gSavedPerAccountSettings control [\"key\"] to value [\"value\"]", -        boost::bind(&LLViewerControlListener::set, &gSavedPerAccountSettings, _1)); -	add("Warning", -        "Set gWarningSettings control [\"key\"] to value [\"value\"]", -        boost::bind(&LLViewerControlListener::set, &gWarningSettings, _1)); -	add("Crash", -        "Set gCrashSettings control [\"key\"] to value [\"value\"]", -        boost::bind(&LLViewerControlListener::set, &gCrashSettings, _1)); - -#if 0 -	add(/*"toggleControl",*/ "Global", boost::bind(&LLViewerControlListener::toggleControl, &gSavedSettings, _1)); -	add(/*"toggleControl",*/ "PerAccount", boost::bind(&LLViewerControlListener::toggleControl, &gSavedPerAccountSettings, _1)); -	add(/*"toggleControl",*/ "Warning", boost::bind(&LLViewerControlListener::toggleControl, &gWarningSettings, _1)); -	add(/*"toggleControl",*/ "Crash", boost::bind(&LLViewerControlListener::toggleControl, &gCrashSettings, _1)); - -	add(/*"setDefault",*/ "Global", boost::bind(&LLViewerControlListener::setDefault, &gSavedSettings, _1)); -	add(/*"setDefault",*/ "PerAccount", boost::bind(&LLViewerControlListener::setDefault, &gSavedPerAccountSettings, _1)); -	add(/*"setDefault",*/ "Warning", boost::bind(&LLViewerControlListener::setDefault, &gWarningSettings, _1)); -	add(/*"setDefault",*/ "Crash", boost::bind(&LLViewerControlListener::setDefault, &gCrashSettings, _1)); -#endif // 0 +	std::ostringstream groupnames; +	groupnames << "[\"group\"] is one of "; +	const char* delim = ""; +	for (LLControlGroup::key_iter cgki(LLControlGroup::beginKeys()), +								  cgkend(LLControlGroup::endKeys()); +		 cgki != cgkend; ++cgki) +	{ +		groupnames << delim << '"' << *cgki << '"'; +		delim = ", "; +	} +	groupnames << '\n'; +	std::string grouphelp(groupnames.str()); +	std::string replyhelp("If [\"reply\"] requested, send new [\"value\"] on specified LLEventPump\n"); + +	add("set", +		std::string("Set [\"group\"] control [\"key\"] to optional value [\"value\"]\n" +					"If [\"value\"] omitted, set to control's defined default value\n") + +		grouphelp + replyhelp, +		&LLViewerControlListener::set, +		LLSDMap("group", LLSD())("key", LLSD())); +	add("toggle", +		std::string("Toggle [\"group\"] control [\"key\"], if boolean\n") + grouphelp + replyhelp, +		&LLViewerControlListener::toggle, +		LLSDMap("group", LLSD())("key", LLSD())); +	add("get", +		std::string("Query [\"group\"] control [\"key\"], replying on LLEventPump [\"reply\"]\n") + +		grouphelp, +		&LLViewerControlListener::get, +		LLSDMap("group", LLSD())("key", LLSD())("reply", LLSD())); +	add("groups", +		"Send on LLEventPump [\"reply\"] an array [\"groups\"] of valid group names", +		&LLViewerControlListener::groups, +		LLSDMap("reply", LLSD())); +	add("vars", +		std::string("For [\"group\"], send on LLEventPump [\"reply\"] an array [\"vars\"],\n" +					"each of whose entries looks like:\n" +					"  [\"name\"], [\"type\"], [\"value\"], [\"comment\"]\n") + grouphelp, +		&LLViewerControlListener::vars, +		LLSDMap("group", LLSD())("reply", LLSD()));  } -//static -void LLViewerControlListener::set(LLControlGroup * controls, LLSD const & event_data) +struct Info  { -	if(event_data.has("key")) +	Info(const LLSD& request): +		response(LLSD(), request), +		groupname(request["group"]), +		group(LLControlGroup::getInstance(groupname)), +		key(request["key"]), +		control(NULL)  	{ -		std::string key(event_data["key"]); +		if (! group) +		{ +			response.error(STRINGIZE("Unrecognized group '" << groupname << "'")); +			return; +		} -		if(controls->controlExists(key)) +		control = group->getControl(key); +		if (! control)  		{ -			controls->setUntypedValue(key, event_data["value"]); +			response.error(STRINGIZE("In group '" << groupname +									 << "', unrecognized control key '" << key << "'"));  		} -		else +	} + +	~Info() +	{ +		// If in fact the request passed to our constructor names a valid +		// group and key, grab the final value of the indicated control and +		// stuff it in our response. Since this outer destructor runs before +		// the contained Response destructor, this data will go into the +		// response we send. +		if (control)  		{ -			llwarns << "requested unknown control: \"" << key << '\"' << llendl; +			response["name"]	= control->getName(); +			response["type"]	= group->typeEnumToString(control->type()); +			response["value"]	= control->get(); +			response["comment"] = control->getComment();  		}  	} + +	LLEventAPI::Response response; +	std::string groupname; +	LLControlGroup* group; +	std::string key; +	LLControlVariable* control; +}; + +//static +void LLViewerControlListener::set(LLSD const & request) +{ +	Info info(request); +	if (! info.control) +		return; + +	if (request.has("value")) +	{ +		info.control->setValue(request["value"]); +	} +	else +	{ +		info.control->resetToDefault(); +	}  }  //static -void LLViewerControlListener::toggleControl(LLControlGroup * controls, LLSD const & event_data) +void LLViewerControlListener::toggle(LLSD const & request)  { -	if(event_data.has("key")) +	Info info(request); +	if (! info.control) +		return; + +	if (info.control->isType(TYPE_BOOLEAN)) +	{ +		info.control->set(! info.control->get().asBoolean()); +	} +	else  	{ -		std::string key(event_data["key"]); +		info.response.error(STRINGIZE("toggle of non-boolean '" << info.groupname +									  << "' control '" << info.key +									  << "', type is " +									  << info.group->typeEnumToString(info.control->type()))); +	} +} -		if(controls->controlExists(key)) -		{ -			LLControlVariable * control = controls->getControl(key); -			if(control->isType(TYPE_BOOLEAN)) -			{ -				control->set(!control->get().asBoolean()); -			} -			else -			{ -				llwarns << "requested toggle of non-boolean control: \"" << key << "\", type is " << control->type() << llendl; -			} -		} -		else -		{ -			llwarns << "requested unknown control: \"" << key << '\"' << llendl; -		} +void LLViewerControlListener::get(LLSD const & request) +{ +	// The Info constructor and destructor actually do all the work here. +	Info info(request); +} + +void LLViewerControlListener::groups(LLSD const & request) +{ +	// No Info, we're not looking up either a group or a control name. +	Response response(LLSD(), request); +	for (LLControlGroup::key_iter cgki(LLControlGroup::beginKeys()), +								  cgkend(LLControlGroup::endKeys()); +		 cgki != cgkend; ++cgki) +	{ +		response["groups"].append(*cgki);  	}  } -//static -void LLViewerControlListener::setDefault(LLControlGroup * controls, LLSD const & event_data) +struct CollectVars: public LLControlGroup::ApplyFunctor  { -	if(event_data.has("key")) +	CollectVars(LLControlGroup* g): +		mGroup(g) +	{} + +	virtual void apply(const std::string& name, LLControlVariable* control)  	{ -		std::string key(event_data["key"]); +		vars.append(LLSDMap +					("name", name) +					("type", mGroup->typeEnumToString(control->type())) +					("value", control->get()) +					("comment", control->getComment())); +	} -		if(controls->controlExists(key)) -		{ -			LLControlVariable * control = controls->getControl(key); -			control->resetToDefault(); -		} -		else -		{ -			llwarns << "requested unknown control: \"" << key << '\"' << llendl; -		} +	LLControlGroup* mGroup; +	LLSD vars; +}; + +void LLViewerControlListener::vars(LLSD const & request) +{ +	// This method doesn't use Info, because we're not looking up a specific +	// control name. +	Response response(LLSD(), request); +	std::string groupname(request["group"]); +	LLControlGroup* group(LLControlGroup::getInstance(groupname)); +	if (! group) +	{ +		return response.error(STRINGIZE("Unrecognized group '" << groupname << "'"));  	} + +	CollectVars collector(group); +	group->applyToAll(&collector); +	response["vars"] = collector.vars;  } diff --git a/indra/newview/llviewercontrollistener.h b/indra/newview/llviewercontrollistener.h index fd211b97af..2e72046924 100644 --- a/indra/newview/llviewercontrollistener.h +++ b/indra/newview/llviewercontrollistener.h @@ -40,11 +40,11 @@ public:  	LLViewerControlListener();  private: -	static void set(LLControlGroup *controls, LLSD const & event_data); -	static void toggleControl(LLControlGroup *controls, LLSD const & event_data); -	static void setDefault(LLControlGroup *controls, LLSD const & event_data); +	static void set(LLSD const & event_data); +	static void toggle(LLSD const & event_data); +	static void get(LLSD const & event_data); +	static void groups(LLSD const & event_data); +	static void vars(LLSD const & event_data);  }; -extern LLViewerControlListener gSavedSettingsListener; -  #endif // LL_LLVIEWERCONTROLLISTENER_H diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 911fc8e1ed..d6512207ae 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -114,8 +114,8 @@ void render_disconnected_background();  void display_startup()  {  	if (   !gViewerWindow->getActive() -		|| !gViewerWindow->mWindow->getVisible()  -		|| gViewerWindow->mWindow->getMinimized() ) +		|| !gViewerWindow->getWindow()->getVisible()  +		|| gViewerWindow->getWindow()->getMinimized() )  	{  		return;   	} @@ -157,7 +157,7 @@ void display_startup()  	LLGLState::checkStates();  	LLGLState::checkTextureChannels(); -	gViewerWindow->mWindow->swapBuffers(); +	gViewerWindow->getWindow()->swapBuffers();  	glClear(GL_DEPTH_BUFFER_BIT);  } @@ -202,6 +202,7 @@ void display_stats()  		gMemoryAllocated = LLMemory::getCurrentRSS();  		U32 memory = (U32)(gMemoryAllocated / (1024*1024));  		llinfos << llformat("MEMORY: %d MB", memory) << llendl; +		LLMemory::logMemoryInfo(TRUE) ;  		gRecentMemoryTime.reset();  	}  } @@ -222,7 +223,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  	{ //skip render on frames where window has been resized  		gGL.flush();  		glClear(GL_COLOR_BUFFER_BIT); -		gViewerWindow->mWindow->swapBuffers(); +		gViewerWindow->getWindow()->swapBuffers();  		gPipeline.resizeScreenTexture();  		gResizeScreenTexture = FALSE;  		gWindowResized = FALSE; @@ -259,8 +260,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  	// In fact, must explicitly check the minimized state before drawing.  	// Attempting to draw into a minimized window causes a GL error. JC  	if (   !gViewerWindow->getActive() -		|| !gViewerWindow->mWindow->getVisible()  -		|| gViewerWindow->mWindow->getMinimized() ) +		|| !gViewerWindow->getWindow()->getVisible()  +		|| gViewerWindow->getWindow()->getMinimized() )  	{  		// Clean up memory the pools may have allocated  		if (rebuild) @@ -616,6 +617,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  				&& LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion")   				&& gSavedSettings.getBOOL("UseOcclusion")   				&& gGLManager.mHasOcclusionQuery) ? 2 : 0; +		LLTexUnit::sWhiteTexture = LLViewerFetchedTexture::sWhiteImagep->getTexName();  		/*if (LLPipeline::sUseOcclusion && LLPipeline::sRenderDeferred)  		{ //force occlusion on for all render types if doing deferred render (tighter shadow frustum) @@ -691,7 +693,11 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  				glh::matrix4f mod = glh_get_current_modelview();  				glViewport(0,0,512,512);  				LLVOAvatar::updateFreezeCounter() ; -				LLVOAvatar::updateImpostors(); + +				if(!LLPipeline::sMemAllocationThrottled) +				{		 +					LLVOAvatar::updateImpostors(); +				}  				glh_set_current_projection(proj);  				glh_set_current_modelview(mod); @@ -709,6 +715,9 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  			glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);  		} +		LLGLState::checkStates(); +		LLGLState::checkClientArrays(); +  		//if (!for_snapshot)  		{  			LLMemType mt_gw(LLMemType::MTYPE_DISPLAY_GEN_REFLECTION); @@ -717,6 +726,9 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  			gPipeline.generateHighlight(*LLViewerCamera::getInstance());  		} +		LLGLState::checkStates(); +		LLGLState::checkClientArrays(); +  		//////////////////////////////////////  		//  		// Update images, using the image stats generated during object update/culling @@ -743,6 +755,10 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  			LLImageGL::deleteDeadTextures();  			stop_glerror();  		} + +		LLGLState::checkStates(); +		LLGLState::checkClientArrays(); +  		///////////////////////////////////  		//  		// StateSort @@ -770,6 +786,9 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  			}  		} +		LLGLState::checkStates(); +		LLGLState::checkClientArrays(); +  		LLPipeline::sUseOcclusion = occlusion;  		{ @@ -828,6 +847,9 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater() ? TRUE : FALSE;  		LLPipeline::refreshRenderDeferred(); +		LLGLState::checkStates(); +		LLGLState::checkClientArrays(); +  		stop_glerror();  		if (to_texture) @@ -878,6 +900,14 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  			stop_glerror();  		} +		for (U32 i = 0; i < gGLManager.mNumTextureImageUnits; i++) +		{ //dummy cleanup of any currently bound textures +			if (gGL.getTexUnit(i)->getCurrType() != LLTexUnit::TT_NONE) +			{ +				gGL.getTexUnit(i)->unbind(gGL.getTexUnit(i)->getCurrType()); +				gGL.getTexUnit(i)->disable(); +			} +		}  		LLAppViewer::instance()->pingMainloopTimeout("Display:RenderFlush");		  		if (to_texture) @@ -1207,7 +1237,7 @@ void render_ui(F32 zoom_factor, int subfield)  	if (gDisplaySwapBuffers)  	{  		LLFastTimer t(FTM_SWAP); -		gViewerWindow->mWindow->swapBuffers(); +		gViewerWindow->getWindow()->swapBuffers();  	}  	gDisplaySwapBuffers = TRUE;  } @@ -1339,7 +1369,7 @@ void render_ui_2d()  	}  	stop_glerror(); -	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +	//gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  	// render outline for HUD  	if (isAgentAvatarValid() && gAgentCamera.mHUDCurZoom < 0.98f) diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 6ae8e79be4..ba53540374 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -33,9 +33,11 @@  #include "llcompilequeue.h"  #include "llcallfloater.h" +#include "llfasttimerview.h"  #include "llfloaterabout.h"  #include "llfloateranimpreview.h"  #include "llfloaterauction.h" +#include "llfloateravatar.h"  #include "llfloateravatarpicker.h"  #include "llfloateravatartextures.h"  #include "llfloaterbeacons.h" @@ -55,7 +57,7 @@  #include "llfloatereditwater.h"  #include "llfloaterenvironmentsettings.h"  #include "llfloaterevent.h" -#include "llfloatersearch.h" +#include "llfloaterdestinations.h"  #include "llfloaterfonttest.h"  #include "llfloatergesture.h"  #include "llfloatergodtools.h" @@ -79,6 +81,7 @@  #include "llfloatermodelwizard.h"  #include "llfloaternamedesc.h"  #include "llfloaternotificationsconsole.h" +#include "llfloaterobjectweights.h"  #include "llfloateropenobject.h"  #include "llfloaterpay.h"  #include "llfloaterperms.h" @@ -91,9 +94,10 @@  #include "llfloaterreporter.h"  #include "llfloaterscriptdebug.h"  #include "llfloaterscriptlimits.h" +#include "llfloatersearch.h"  #include "llfloatersellland.h"  #include "llfloatersettingsdebug.h" -#include "llfloatersidetraytab.h" +#include "llfloatersidepanelcontainer.h"  #include "llfloatersnapshot.h"  #include "llfloatersounddevices.h"  #include "llfloatertelehub.h" @@ -102,6 +106,7 @@  #include "llfloatertools.h"  #include "llfloatertos.h"  #include "llfloatertopobjects.h" +#include "llfloatertoybox.h"  #include "llfloateruipreview.h"  #include "llfloatervoiceeffect.h"  #include "llfloaterwhitelistentry.h" @@ -127,15 +132,16 @@  #include "llscriptfloater.h"  #include "llfloatermodelpreview.h"  #include "llcommandhandler.h" +#include "llnearbychatbar.h"  // *NOTE: Please add files in alphabetical order to keep merges easy. -// handle secondlife:///app/floater/{NAME} URLs +// handle secondlife:///app/openfloater/{NAME} URLs  class LLFloaterOpenHandler : public LLCommandHandler  {  public:  	// requires trusted browser to trigger -	LLFloaterOpenHandler() : LLCommandHandler("floater", UNTRUSTED_THROTTLE) { } +	LLFloaterOpenHandler() : LLCommandHandler("openfloater", UNTRUSTED_THROTTLE) { }  	bool handle(const LLSD& params, const LLSD& query_map,  				LLMediaCtrl* web) @@ -159,8 +165,11 @@ void LLViewerFloaterReg::registerFloaters()  	// *NOTE: Please keep these alphabetized for easier merges  	LLFloaterAboutUtil::registerFloater(); +	LLFloaterReg::add("fast_timers", "floater_fast_timers.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFastTimerView>);  	LLFloaterReg::add("about_land", "floater_about_land.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLand>); +	LLFloaterReg::add("appearance", "floater_my_appearance.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);  	LLFloaterReg::add("auction", "floater_auction.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAuction>); +	LLFloaterReg::add("avatar", "floater_avatar.xml",  (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatar>);  	LLFloaterReg::add("avatar_picker", "floater_avatar_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarPicker>);  	LLFloaterReg::add("avatar_textures", "floater_avatar_textures.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarTextures>); @@ -176,10 +185,12 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("bumps", "floater_bumps.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBump>);  	LLFloaterReg::add("camera", "floater_camera.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCamera>); -	LLFloaterReg::add("nearby_chat", "floater_nearby_chat.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNearbyChat>); +	LLFloaterReg::add("chat_bar", "floater_chat_bar.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNearbyChatBar>);  	LLFloaterReg::add("compile_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCompileQueue>); +	LLFloaterReg::add("destinations", "floater_destinations.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDestinations>); +  	LLFloaterReg::add("env_post_process", "floater_post_process.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostProcess>);  	LLFloaterReg::add("env_settings", "floater_environment_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEnvironmentSettings>);  	LLFloaterReg::add("env_delete_preset", "floater_delete_env_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDeleteEnvPreset>); @@ -202,7 +213,7 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("im_container", "floater_im_container.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloaterContainer>);  	LLFloaterReg::add("im_well_window", "floater_sys_well.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMWellWindow>);  	LLFloaterReg::add("incoming_call", "floater_incoming_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIncomingCallDialog>); -	LLFloaterReg::add("inventory", "floater_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInventory>); +	LLFloaterReg::add("inventory", "floater_my_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);  	LLFloaterReg::add("inspect", "floater_inspect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInspect>);  	LLInspectAvatarUtil::registerFloater();  	LLInspectGroupUtil::registerFloater(); @@ -226,14 +237,19 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("notifications_console", "floater_notifications_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationConsole>);  	LLFloaterReg::add("notification_well_window", "floater_sys_well.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNotificationWellWindow>); +	LLFloaterReg::add("object_weights", "floater_object_weights.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterObjectWeights>);  	LLFloaterReg::add("openobject", "floater_openobject.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOpenObject>);  	LLFloaterReg::add("outgoing_call", "floater_outgoing_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLOutgoingCallDialog>);  	LLFloaterPayUtil::registerFloater(); +	LLFloaterReg::add("people", "floater_people.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>); +	LLFloaterReg::add("places", "floater_places.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);  	LLFloaterReg::add("postcard", "floater_postcard.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostcard>);  	LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>); +	LLFloaterReg::add("prefs_proxy", "floater_preferences_proxy.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreferenceProxy>);  	LLFloaterReg::add("prefs_hardware_settings", "floater_hardware_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHardwareSettings>);  	LLFloaterReg::add("perm_prefs", "floater_perm_prefs.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPerms>); +	LLFloaterReg::add("picks", "floater_picks.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);  	LLFloaterReg::add("pref_joystick", "floater_joystick.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterJoystick>);  	LLFloaterReg::add("preview_anim", "floater_preview_animation.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewAnim>, "preview");  	LLFloaterReg::add("preview_gesture", "floater_preview_gesture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewGesture>, "preview"); @@ -246,16 +262,13 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("publish_classified", "floater_publish_classified.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPublishClassifiedFloater>);  	LLFloaterReg::add("telehubs", "floater_telehub.xml",&LLFloaterReg::build<LLFloaterTelehub>); -	LLFloaterReg::add("test_inspectors", "floater_test_inspectors.xml", -		&LLFloaterReg::build<LLFloaterTestInspectors>); +	LLFloaterReg::add("test_inspectors", "floater_test_inspectors.xml", &LLFloaterReg::build<LLFloaterTestInspectors>);  	//LLFloaterReg::add("test_list_view", "floater_test_list_view.xml",&LLFloaterReg::build<LLFloaterTestListView>); -	LLFloaterReg::add("test_textbox", "floater_test_textbox.xml", -		&LLFloaterReg::build<LLFloater>); -	LLFloaterReg::add("test_text_editor", "floater_test_text_editor.xml", -		&LLFloaterReg::build<LLFloater>); -	LLFloaterReg::add("test_widgets", "floater_test_widgets.xml", -		&LLFloaterReg::build<LLFloater>); +	LLFloaterReg::add("test_textbox", "floater_test_textbox.xml", &LLFloaterReg::build<LLFloater>); +	LLFloaterReg::add("test_text_editor", "floater_test_text_editor.xml", &LLFloaterReg::build<LLFloater>); +	LLFloaterReg::add("test_widgets", "floater_test_widgets.xml", &LLFloaterReg::build<LLFloater>);  	LLFloaterReg::add("top_objects", "floater_top_objects.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTopObjects>); +	LLFloaterReg::add("toybox", "floater_toybox.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterToybox>);  	LLFloaterReg::add("reporter", "floater_report_abuse.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterReporter>);  	LLFloaterReg::add("reset_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterResetQueue>); @@ -268,13 +281,15 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("script_limits", "floater_script_limits.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptLimits>);  	LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater);  	LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>); -	LLFloaterReg::add("side_bar_tab", "floater_side_bar_tab.xml", &LLFloaterReg::build<LLFloaterSideTrayTab>);  	LLFloaterReg::add("sound_devices", "floater_sound_devices.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundDevices>);  	LLFloaterReg::add("stats", "floater_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>);  	LLFloaterReg::add("start_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRunQueue>);  	LLFloaterReg::add("stop_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotRunQueue>);  	LLFloaterReg::add("snapshot", "floater_snapshot.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSnapshot>); -	LLFloaterReg::add("search", "floater_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSearch>);	 +	LLFloaterReg::add("search", "floater_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSearch>); +	LLFloaterReg::add("profile", "floater_web_profile.xml", (LLFloaterBuildFunc)&LLFloaterWebContent::create);	 +	LLFloaterReg::add("how_to", "floater_how_to.xml", (LLFloaterBuildFunc)&LLFloaterWebContent::create);	 +  	LLFloaterUIPreviewUtil::registerFloater();  	LLFloaterReg::add("upload_anim", "floater_animation_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAnimPreview>, "upload"); @@ -286,7 +301,7 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallFloater>);  	LLFloaterReg::add("voice_effect", "floater_voice_effect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVoiceEffect>); -	LLFloaterReg::add("web_content", "floater_web_content.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWebContent>);	 +	LLFloaterReg::add("web_content", "floater_web_content.xml", (LLFloaterBuildFunc)&LLFloaterWebContent::create);	  	LLFloaterReg::add("whitelist_entry", "floater_whitelist_entry.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWhiteListEntry>);	  	LLFloaterWindowSizeUtil::registerFloater();  	LLFloaterReg::add("world_map", "floater_world_map.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWorldMap>);	 diff --git a/indra/newview/llviewerhelp.cpp b/indra/newview/llviewerhelp.cpp index 3a3d4f3881..a8a918f259 100644 --- a/indra/newview/llviewerhelp.cpp +++ b/indra/newview/llviewerhelp.cpp @@ -69,15 +69,12 @@ LLHelpHandler gHelpHandler;  //////////////////////////////  // implement LLHelp interface -void LLViewerHelp::showTopic(const std::string &topic) +std::string LLViewerHelp::getURL(const std::string &topic)  {  	// allow overriding the help server with a local help file  	if( gSavedSettings.getBOOL("HelpUseLocal") )  	{ -		showHelp(); -		LLFloaterHelpBrowser* helpbrowser = dynamic_cast<LLFloaterHelpBrowser*>(LLFloaterReg::getInstance("help_browser")); -		helpbrowser->navigateToLocalPage( "help-offline" , "index.html" ); -		return; +		return "__local";  	}  	// if the help topic is empty, use the default topic @@ -99,11 +96,12 @@ void LLViewerHelp::showTopic(const std::string &topic)  		}  	} -	// work out the URL for this topic and display it  -	showHelp(); -	 -	std::string helpURL = LLViewerHelpUtil::buildHelpURL( help_topic ); -	setRawURL(helpURL); +	return LLViewerHelpUtil::buildHelpURL( help_topic ); +} + +void LLViewerHelp::showTopic(const std::string& topic) +{ +	LLFloaterReg::showInstance("help_browser", topic);  }  std::string LLViewerHelp::defaultTopic() @@ -146,23 +144,3 @@ std::string LLViewerHelp::getTopicFromFocus()  	return defaultTopic();  } -// static  -void LLViewerHelp::showHelp() -{ -	LLFloaterReg::showInstance("help_browser"); -} - -// static -void LLViewerHelp::setRawURL(std::string url) -{ -	LLFloaterHelpBrowser* helpbrowser = dynamic_cast<LLFloaterHelpBrowser*>(LLFloaterReg::getInstance("help_browser")); -	if (helpbrowser) -	{ -		helpbrowser->openMedia(url);	 -	} -	else -	{ -		llwarns << "Eep, help_browser floater not found" << llendl; -	} -} - diff --git a/indra/newview/llviewerhelp.h b/indra/newview/llviewerhelp.h index 7612986227..a983012e2e 100644 --- a/indra/newview/llviewerhelp.h +++ b/indra/newview/llviewerhelp.h @@ -45,6 +45,8 @@ class LLViewerHelp : public LLHelp, public LLSingleton<LLViewerHelp>  	/// display the specified help topic in the help viewer  	/*virtual*/ void showTopic(const std::string &topic); +	std::string getURL(const std::string& topic); +  	// return topic derived from viewer UI focus, else default topic  	std::string getTopicFromFocus(); @@ -56,10 +58,6 @@ class LLViewerHelp : public LLHelp, public LLSingleton<LLViewerHelp>  	// return topic to use for the top-level help, invoked by F1  	/*virtual*/ std::string f1HelpTopic(); - - private: -	static void showHelp(); // make sure help UI is visible & raised -	static void setRawURL(std::string url); // send URL to help UI  };  #endif // header guard diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 22666cec0d..519d4fe7f8 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -34,7 +34,9 @@  #include "llagent.h"  #include "llagentcamera.h"  #include "llagentwearables.h" +#include "llfloatersidepanelcontainer.h"  #include "llviewerfoldertype.h" +#include "llfloatersidepanelcontainer.h"  #include "llfolderview.h"  #include "llviewercontrol.h"  #include "llconsole.h" @@ -43,7 +45,6 @@  #include "llinventorymodel.h"  #include "llinventorymodelbackgroundfetch.h"  #include "llgesturemgr.h" -#include "llsidetray.h"  #include "llinventorybridge.h"  #include "llinventorypanel.h" @@ -139,7 +140,35 @@ public:  		mInventoryItemsDict["Female - Shrug"]			= LLTrans::getString("Female - Shrug");  		mInventoryItemsDict["Female - Stick tougue out"]= LLTrans::getString("Female - Stick tougue out");  		mInventoryItemsDict["Female - Wow"]				= LLTrans::getString("Female - Wow"); -		 + +		//common +		mInventoryItemsDict["/bow"]						= LLTrans::getString("/bow"); +		mInventoryItemsDict["/clap"]					= LLTrans::getString("/clap"); +		mInventoryItemsDict["/count"]					= LLTrans::getString("/count"); +		mInventoryItemsDict["/extinguish"]				= LLTrans::getString("/extinguish"); +		mInventoryItemsDict["/kmb"]						= LLTrans::getString("/kmb"); +		mInventoryItemsDict["/muscle"]					= LLTrans::getString("/muscle"); +		mInventoryItemsDict["/no"]						= LLTrans::getString("/no"); +		mInventoryItemsDict["/no!"]						= LLTrans::getString("/no!"); +		mInventoryItemsDict["/paper"]					= LLTrans::getString("/paper"); +		mInventoryItemsDict["/pointme"]					= LLTrans::getString("/pointme"); +		mInventoryItemsDict["/pointyou"]				= LLTrans::getString("/pointyou"); +		mInventoryItemsDict["/rock"]					= LLTrans::getString("/rock"); +		mInventoryItemsDict["/scissor"]					= LLTrans::getString("/scissor"); +		mInventoryItemsDict["/smoke"]					= LLTrans::getString("/smoke"); +		mInventoryItemsDict["/stretch"]					= LLTrans::getString("/stretch"); +		mInventoryItemsDict["/whistle"]					= LLTrans::getString("/whistle"); +		mInventoryItemsDict["/yes"]						= LLTrans::getString("/yes"); +		mInventoryItemsDict["/yes!"]					= LLTrans::getString("/yes!"); +		mInventoryItemsDict["afk"]						= LLTrans::getString("afk"); +		mInventoryItemsDict["dance1"]					= LLTrans::getString("dance1"); +		mInventoryItemsDict["dance2"]					= LLTrans::getString("dance2"); +		mInventoryItemsDict["dance3"]					= LLTrans::getString("dance3"); +		mInventoryItemsDict["dance4"]					= LLTrans::getString("dance4"); +		mInventoryItemsDict["dance5"]					= LLTrans::getString("dance5"); +		mInventoryItemsDict["dance6"]					= LLTrans::getString("dance6"); +		mInventoryItemsDict["dance7"]					= LLTrans::getString("dance7"); +		mInventoryItemsDict["dance8"]					= LLTrans::getString("dance8");  	}  	/** @@ -192,7 +221,7 @@ public:  		// support secondlife:///app/inventory/show  		if (params[0].asString() == "show")  		{ -			LLSideTray::getInstance()->showPanel("sidepanel_inventory", LLSD()); +			LLFloaterSidePanelContainer::showPanel("inventory", LLSD());  			return true;  		} @@ -418,6 +447,9 @@ void LLViewerInventoryItem::fetchFromServer(void) const  BOOL LLViewerInventoryItem::unpackMessage(LLSD item)  {  	BOOL rv = LLInventoryItem::fromLLSD(item); + +	LLLocalizedInventoryItemsDictionary::getInstance()->localizeInventoryObjectName(mName); +  	mIsComplete = TRUE;  	return rv;  } @@ -945,7 +977,7 @@ void ModifiedCOFCallback::fire(const LLUUID& inv_item)  	if( gAgentCamera.cameraCustomizeAvatar() )  	{  		// If we're in appearance editing mode, the current tab may need to be refreshed -		LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLSideTray::getInstance()->getPanel("sidepanel_appearance")); +		LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance"));  		if (panel)  		{  			panel->showDefaultSubpart(); diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp index fbf11f20db..f6e840adcd 100644 --- a/indra/newview/llviewerjoystick.cpp +++ b/indra/newview/llviewerjoystick.cpp @@ -51,9 +51,6 @@  #define RY_I	5  #define RZ_I	3 -// minimum time after setting away state before coming back -const F32 MIN_AFK_TIME = 2.f; -  F32  LLViewerJoystick::sLastDelta[] = {0,0,0,0,0,0,0};  F32  LLViewerJoystick::sDelta[] = {0,0,0,0,0,0,0}; @@ -551,7 +548,7 @@ void LLViewerJoystick::moveObjects(bool reset)  	if (!is_zero)  	{  		// Clear AFK state if moved beyond the deadzone -		if (gAwayTimer.getElapsedTimeF32() > MIN_AFK_TIME) +		if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)  		{  			gAgent.clearAFK();  		} @@ -725,7 +722,7 @@ void LLViewerJoystick::moveAvatar(bool reset)  	if (!is_zero)  	{  		// Clear AFK state if moved beyond the deadzone -		if (gAwayTimer.getElapsedTimeF32() > MIN_AFK_TIME) +		if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)  		{  			gAgent.clearAFK();  		} @@ -941,7 +938,7 @@ void LLViewerJoystick::moveFlycam(bool reset)  	}  	// Clear AFK state if moved beyond the deadzone -	if (!is_zero && gAwayTimer.getElapsedTimeF32() > MIN_AFK_TIME) +	if (!is_zero && gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)  	{  		gAgent.clearAFK();  	} @@ -1001,7 +998,7 @@ bool LLViewerJoystick::toggleFlycam()  		gAgentCamera.changeCameraToDefault();  	} -	if (gAwayTimer.getElapsedTimeF32() > MIN_AFK_TIME) +	if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)  	{  		gAgent.clearAFK();  	} diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 1be58eae45..41b4dc01e8 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -344,6 +344,8 @@ static LLViewerMedia::impl_id_map sViewerMediaTextureIDMap;  static LLTimer sMediaCreateTimer;  static const F32 LLVIEWERMEDIA_CREATE_DELAY = 1.0f;  static F32 sGlobalVolume = 1.0f; +static bool sForceUpdate = false; +static LLUUID sOnlyAudibleTextureID = LLUUID::null;  static F64 sLowestLoadableImplInterest = 0.0f;  static bool sAnyMediaShowing = false;  static boost::signals2::connection sTeleportFinishConnection; @@ -606,7 +608,7 @@ bool LLViewerMedia::textureHasMedia(const LLUUID& texture_id)  // static  void LLViewerMedia::setVolume(F32 volume)  { -	if(volume != sGlobalVolume) +	if(volume != sGlobalVolume || sForceUpdate)  	{  		sGlobalVolume = volume;  		impl_list::iterator iter = sViewerMediaImplList.begin(); @@ -617,6 +619,8 @@ void LLViewerMedia::setVolume(F32 volume)  			LLViewerMediaImpl* pimpl = *iter;  			pimpl->updateVolume();  		} + +		sForceUpdate = false;  	}  } @@ -1362,6 +1366,10 @@ void LLViewerMedia::removeCookie(const std::string &name, const std::string &dom  } +// This is defined in two files but I don't want to create a dependence between this and llsidepanelinventory +// just to be able to temporarily disable the outbox. +#define ENABLE_INVENTORY_DISPLAY_OUTBOX		0	// keep in sync with ENABLE_MERCHANT_OUTBOX_PANEL, ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU +  class LLInventoryUserStatusResponder : public LLHTTPClient::Responder  {  public: @@ -1374,8 +1382,18 @@ public:  	{  		if (isGoodStatus(status))  		{ +			std::string merchantStatus = content[gAgent.getID().getString()].asString(); +			llinfos << "Marketplace merchant status: " << merchantStatus << llendl; + +			// Save the merchant status before turning on the display +			gSavedSettings.setString("InventoryMarketplaceUserStatus", merchantStatus); +  			// Complete success  			gSavedSettings.setBOOL("InventoryDisplayInbox", true); + +#if ENABLE_INVENTORY_DISPLAY_OUTBOX +			gSavedSettings.setBOOL("InventoryDisplayOutbox", true); +#endif  		}  		else if (status == 401)  		{ @@ -1390,6 +1408,39 @@ public:  	}  }; + +void doOnetimeEarlyHTTPRequests() +{ +	std::string url = "https://marketplace.secondlife.com/"; + +	if (!LLGridManager::getInstance()->isInProductionGrid()) +	{ +		std::string gridLabel = LLGridManager::getInstance()->getGridLabel(); +		url = llformat("https://marketplace.%s.lindenlab.com/", utf8str_tolower(gridLabel).c_str()); + +		// TEMP for Jim's pdp +		//url = "http://pdp24.lindenlab.com:3000/"; +	} +	 +	url += "api/1/users/"; +	url += gAgent.getID().getString(); +	url += "/user_status"; + +	llinfos << "http get: " << url << llendl; +	LLHTTPClient::get(url, new LLInventoryUserStatusResponder(), LLViewerMedia::getHeaders()); +} + + +LLSD LLViewerMedia::getHeaders() +{ +	LLSD headers = LLSD::emptyMap(); +	headers["Accept"] = "*/*"; +	headers["Cookie"] = sOpenIDCookie; +	headers["User-Agent"] = getCurrentUserAgent(); + +	return headers; +} +  /////////////////////////////////////////////////////////////////////////////////////////  // static  void LLViewerMedia::setOpenIDCookie() @@ -1437,24 +1488,8 @@ void LLViewerMedia::setOpenIDCookie()  			new LLViewerMediaWebProfileResponder(raw_profile_url.getAuthority()),  			headers); -		std::string url = "https://marketplace.secondlife.com/"; - -		if (!LLGridManager::getInstance()->isInProductionGrid()) -		{ -			std::string gridLabel = LLGridManager::getInstance()->getGridLabel(); -			url = llformat("https://marketplace.%s.lindenlab.com/", utf8str_tolower(gridLabel).c_str()); -		} -	 -		url += "api/1/users/"; -		url += gAgent.getID().getString(); -		url += "/user_status"; - -		headers = LLSD::emptyMap(); -		headers["Accept"] = "*/*"; -		headers["Cookie"] = sOpenIDCookie; -		headers["User-Agent"] = getCurrentUserAgent(); - -		LLHTTPClient::get(url, new LLInventoryUserStatusResponder(), headers); +		// FUI: No longer perform the user_status query +		//doOnetimeEarlyHTTPRequests();  	}  } @@ -1626,6 +1661,15 @@ void LLViewerMedia::onTeleportFinished()  	gSavedSettings.setBOOL("MediaTentativeAutoPlay", true);  } + +////////////////////////////////////////////////////////////////////////////////////////// +// static +void LLViewerMedia::setOnlyAudibleMediaTextureID(const LLUUID& texture_id) +{ +	sOnlyAudibleTextureID = texture_id; +	sForceUpdate = true; +} +  //////////////////////////////////////////////////////////////////////////////////////////  // LLViewerMediaImpl  ////////////////////////////////////////////////////////////////////////////////////////// @@ -1763,6 +1807,7 @@ void LLViewerMediaImpl::createMediaSource()  			LL_WARNS("Media") << "Failed to initialize media for mime type " << mMimeType << LL_ENDL;  		}  	} +  }  ////////////////////////////////////////////////////////////////////////////////////////// @@ -1867,7 +1912,10 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_  			// collect 'javascript enabled' setting from prefs and send to embedded browser  			bool javascript_enabled = gSavedSettings.getBOOL( "BrowserJavascriptEnabled" );  			media_source->setJavascriptEnabled( javascript_enabled ); -			 +		 +			bool media_plugin_debugging_enabled = gSavedSettings.getBOOL("MediaPluginDebugging"); +			media_source->enableMediaPluginDebugging( media_plugin_debugging_enabled ); +  			media_source->setTarget(target);  			const std::string plugin_dir = gDirUtilp->getLLPluginDir(); @@ -2188,7 +2236,14 @@ void LLViewerMediaImpl::updateVolume()  			}  		} -		mMediaSource->setVolume(volume); +		if (sOnlyAudibleTextureID == LLUUID::null || sOnlyAudibleTextureID == mTextureId) +		{ +			mMediaSource->setVolume(volume); +		} +		else +		{ +			mMediaSource->setVolume(0.0f); +		}  	}  } diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index a70c6f4887..0b69b8f0c1 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -160,6 +160,10 @@ public:  	static void createSpareBrowserMediaSource();  	static LLPluginClassMedia* getSpareBrowserMediaSource(); + +	static void setOnlyAudibleMediaTextureID(const LLUUID& texture_id); + +	static LLSD getHeaders();  private:  	static void setOpenIDCookie(); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index a37f8ad0d8..2345fbfd6a 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -30,6 +30,7 @@  // linden library includes  #include "llavatarnamecache.h"	// IDEVO  #include "llfloaterreg.h" +#include "llfloatersidepanelcontainer.h"  #include "llcombobox.h"  #include "llinventorypanel.h"  #include "llnotifications.h" @@ -41,9 +42,9 @@  #include "llagentcamera.h"  #include "llagentwearables.h"  #include "llagentpilot.h" -#include "llbottomtray.h"  #include "llcompilequeue.h"  #include "llconsole.h" +#include "lldaycyclemanager.h"  #include "lldebugview.h"  #include "llenvmanager.h"  #include "llfilepicker.h" @@ -61,6 +62,7 @@  #include "llfloatersnapshot.h"  #include "llfloatertools.h"  #include "llfloaterworldmap.h" +#include "llfloaterbuildoptions.h"  #include "llavataractions.h"  #include "lllandmarkactions.h"  #include "llgroupmgr.h" @@ -80,7 +82,6 @@  #include "llrootview.h"  #include "llsceneview.h"  #include "llselectmgr.h" -#include "llsidetray.h"  #include "llstatusbar.h"  #include "lltextureview.h"  #include "lltoolcomp.h" @@ -100,6 +101,7 @@  #include "llworldmap.h"  #include "pipeline.h"  #include "llviewerjoystick.h" +#include "llwaterparammanager.h"  #include "llwlanimator.h"  #include "llwlparammanager.h"  #include "llfloatercamera.h" @@ -113,6 +115,8 @@  using namespace LLVOAvatarDefines; +typedef LLPointer<LLViewerObject> LLViewerObjectPtr; +  static boost::unordered_map<std::string, LLStringExplicit> sDefaultItemLabels;  BOOL enable_land_build(void*); @@ -368,8 +372,6 @@ void set_underclothes_menu_options()  void init_menus()  { -	S32 top = gViewerWindow->getRootView()->getRect().getHeight(); -  	// Initialize actions  	initialize_menus(); @@ -441,11 +443,13 @@ void init_menus()  	{  		color = LLUIColorTable::instance().getColor( "MenuNonProductionBgColor" );  	} + +	LLView* menu_bar_holder = gViewerWindow->getRootView()->getChildView("menu_bar_holder"); +  	gMenuBarView = LLUICtrlFactory::getInstance()->createFromFile<LLMenuBarGL>("menu_viewer.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); -	gMenuBarView->setRect(LLRect(0, top, 0, top - MENU_BAR_HEIGHT)); +	gMenuBarView->setRect(LLRect(0, menu_bar_holder->getRect().mTop, 0, menu_bar_holder->getRect().mTop - MENU_BAR_HEIGHT));  	gMenuBarView->setBackgroundColor( color ); -	LLView* menu_bar_holder = gViewerWindow->getRootView()->getChildView("menu_bar_holder");  	menu_bar_holder->addChild(gMenuBarView);      gViewerWindow->setMenuBackgroundColor(false,  @@ -518,7 +522,7 @@ class LLAdvancedToggleConsole : public view_listener_t  		}  		else if ("fast timers" == console_type)  		{ -			toggle_visibility( (void*)gDebugView->mFastTimerView ); +			LLFloaterReg::toggleInstance("fast_timers");  		}  		else if ("scene view" == console_type)  		{ @@ -558,7 +562,7 @@ class LLAdvancedCheckConsole : public view_listener_t  		}  		else if ("fast timers" == console_type)  		{ -			new_value = get_visibility( (void*)gDebugView->mFastTimerView ); +			new_value = LLFloaterReg::instanceVisible("fast_timers");  		}  		else if ("scene view" == console_type)  		{ @@ -829,7 +833,8 @@ U32 feature_from_string(std::string feature)  }; -class LLAdvancedToggleFeature : public view_listener_t{ +class LLAdvancedToggleFeature : public view_listener_t +{  	bool handleEvent(const LLSD& userdata)  	{  		U32 feature = feature_from_string( userdata.asString() ); @@ -842,7 +847,8 @@ class LLAdvancedToggleFeature : public view_listener_t{  };  class LLAdvancedCheckFeature : public view_listener_t -{bool handleEvent(const LLSD& userdata) +{ +	bool handleEvent(const LLSD& userdata)  {  	U32 feature = feature_from_string( userdata.asString() );  	bool new_value = false; @@ -856,51 +862,6 @@ class LLAdvancedCheckFeature : public view_listener_t  }  }; -void toggle_destination_and_avatar_picker(const LLSD& show) -{ -	S32 panel_idx = show.isDefined() ? show.asInteger() : -1; -	LLView* container = gViewerWindow->getRootView()->findChildView("avatar_picker_and_destination_guide_container"); -	if (!container) return; - -	LLMediaCtrl* destinations = container->findChild<LLMediaCtrl>("destination_guide_contents"); -	LLMediaCtrl* avatar_picker = container->findChild<LLMediaCtrl>("avatar_picker_contents"); -	if (!destinations || !avatar_picker) return; - -	LLButton* avatar_btn = gViewerWindow->getRootView()->getChildView("bottom_tray")->getChild<LLButton>("avatar_btn"); -	LLButton* destination_btn = gViewerWindow->getRootView()->getChildView("bottom_tray")->getChild<LLButton>("destination_btn"); - -	if (panel_idx == 0 -		&& !destinations->getVisible()) -	{	// opening destinations guide -		container->setVisible(true); -		destinations->setVisible(true); -		avatar_picker->setVisible(false); -		LLFirstUse::notUsingDestinationGuide(false); -		avatar_btn->setToggleState(false); -		destination_btn->setToggleState(true); -		gSavedSettings.setS32("DestinationsAndAvatarsVisibility", 0); -	} -	else if (panel_idx == 1  -		&& !avatar_picker->getVisible()) -	{	// opening avatar picker -		container->setVisible(true); -		destinations->setVisible(false); -		avatar_picker->setVisible(true); -		avatar_btn->setToggleState(true); -		destination_btn->setToggleState(false); -		gSavedSettings.setS32("DestinationsAndAvatarsVisibility", 1); -	} -	else -	{	// toggling off dest guide or avatar picker -		container->setVisible(false); -		destinations->setVisible(false); -		avatar_picker->setVisible(false); -		avatar_btn->setToggleState(false); -		destination_btn->setToggleState(false); -		gSavedSettings.setS32("DestinationsAndAvatarsVisibility", -1); -	} -}; -  //////////////////  // INFO DISPLAY // @@ -2626,7 +2587,7 @@ void handle_object_inspect()  	{  		LLSD key;  		key["task"] = "task"; -		LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); +		LLFloaterSidePanelContainer::showPanel("inventory", key);  	}  	/* @@ -3151,6 +3112,12 @@ void handle_avatar_eject(const LLSD& avatar_id)  		}  } +bool my_profile_visible() +{ +	LLFloater* floaterp = LLFloaterReg::findInstance("profile", LLSD().with("id", gAgent.getID())); +	return floaterp && floaterp->isInVisibleChain(); +} +  bool enable_freeze_eject(const LLSD& avatar_id)  {  	// Use avatar_id if available, otherwise default to right-click avatar @@ -3385,15 +3352,6 @@ bool enable_sitdown_self()      return isAgentAvatarValid() && !gAgentAvatarp->isSitting() && !gAgent.getFlying();  } -// Used from the login screen to aid in UI work on side tray -void handle_show_side_tray() -{ -	LLSideTray* side_tray = LLSideTray::getInstance(); -	LLView* root = gViewerWindow->getRootView(); -	// automatically removes and re-adds if there already -	root->addChild(side_tray); -} -  // Toggle one of "People" panel tabs in side tray.  class LLTogglePanelPeopleTab : public view_listener_t  { @@ -3404,21 +3362,11 @@ class LLTogglePanelPeopleTab : public view_listener_t  		LLSD param;  		param["people_panel_tab_name"] = panel_name; -		static LLPanel* friends_panel = NULL; -		static LLPanel* groups_panel = NULL; -		static LLPanel* nearby_panel = NULL; - -		if (panel_name == "friends_panel") -		{ -			return togglePeoplePanel(friends_panel, panel_name, param); -		} -		else if (panel_name == "groups_panel") +		if (   panel_name == "friends_panel" +			|| panel_name == "groups_panel" +			|| panel_name == "nearby_panel")  		{ -			return togglePeoplePanel(groups_panel, panel_name, param); -		} -		else if (panel_name == "nearby_panel") -		{ -			return togglePeoplePanel(nearby_panel, panel_name, param); +			return togglePeoplePanel(panel_name, param);  		}  		else  		{ @@ -3426,16 +3374,20 @@ class LLTogglePanelPeopleTab : public view_listener_t  		}  	} -	static bool togglePeoplePanel(LLPanel* &panel, const std::string& panel_name, const LLSD& param) +	static bool togglePeoplePanel(const std::string& panel_name, const LLSD& param)  	{ +		LLPanel	*panel = LLFloaterSidePanelContainer::getPanel("people", panel_name);  		if(!panel) +			return false; + +		if (panel->isInVisibleChain())  		{ -			panel = LLSideTray::getInstance()->getPanel(panel_name); -			if(!panel) -				return false; +			LLFloaterReg::hideInstance("people"); +		} +		else +		{ +			LLFloaterSidePanelContainer::showPanel("people", "panel_people", param) ;  		} - -		LLSideTray::getInstance()->togglePanel(panel, "panel_people", param);  		return true;  	} @@ -3750,7 +3702,7 @@ void handle_reset_view()  	if (gAgentCamera.cameraCustomizeAvatar())  	{  		// switching to outfit selector should automagically save any currently edited wearable -		LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "my_outfits")); +		LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "my_outfits"));  	}  	gAgentCamera.switchCameraPreset(CAMERA_PRESET_REAR_VIEW); @@ -3815,6 +3767,43 @@ class LLViewDefaultUISize : public view_listener_t  	}  }; +class LLViewToggleUI : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		LLNotification::Params params("ConfirmHideUI"); +		params.functor.function(boost::bind(&LLViewToggleUI::confirm, this, _1, _2)); +		LLSD substitutions; +#if LL_DARWIN +		substitutions["SHORTCUT"] = "Cmd+Shift+U"; +#else +		substitutions["SHORTCUT"] = "Ctrl+Shift+U"; +#endif +		params.substitutions = substitutions; +		if (gViewerWindow->getUIVisibility()) +		{ +			// hiding, so show notification +			LLNotifications::instance().add(params); +		} +		else +		{ +			LLNotifications::instance().forceResponse(params, 0); +		} + +		return true; +	} + +	void confirm(const LLSD& notification, const LLSD& response) +	{ +		S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + +		if (option == 0) // OK +		{ +			gViewerWindow->setUIVisibility(!gViewerWindow->getUIVisibility()); +		} +	} +}; +  class LLEditDuplicate : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -4005,23 +3994,21 @@ void handle_god_request_avatar_geometry(void *)  	}  } - -void derez_objects(EDeRezDestination dest, const LLUUID& dest_id) +static bool get_derezzable_objects( +	EDeRezDestination dest, +	std::string& error, +	LLViewerRegion*& first_region, +	LLDynamicArray<LLViewerObjectPtr>* derez_objectsp, +	bool only_check = false)  { -	if(gAgentCamera.cameraMouselook()) -	{ -		gAgentCamera.changeCameraToDefault(); -	} -	//gInventoryView->setPanelOpen(TRUE); +	bool found = false; -	std::string error; -	LLDynamicArray<LLViewerObject*> derez_objects; +	LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();  	// Check conditions that we can't deal with, building a list of  	// everything that we'll actually be derezzing. -	LLViewerRegion* first_region = NULL; -	for (LLObjectSelection::valid_root_iterator iter = LLSelectMgr::getInstance()->getSelection()->valid_root_begin(); -		 iter != LLSelectMgr::getInstance()->getSelection()->valid_root_end(); iter++) +	for (LLObjectSelection::valid_root_iterator iter = selection->valid_root_begin(); +		 iter != selection->valid_root_end(); iter++)  	{  		LLSelectNode* node = *iter;  		LLViewerObject* object = node->getObject(); @@ -4088,8 +4075,53 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)  		}  		if(can_derez_current)  		{ -			derez_objects.put(object); +			found = true; + +			if (only_check) +				// one found, no need to traverse to the end +				break; + +			if (derez_objectsp) +				derez_objectsp->put(object); + +		} +	} + +	return found; +} + +static bool can_derez(EDeRezDestination dest) +{ +	LLViewerRegion* first_region = NULL; +	std::string error; +	return get_derezzable_objects(dest, error, first_region, NULL, true); +} + +static void derez_objects( +	EDeRezDestination dest, +	const LLUUID& dest_id, +	LLViewerRegion*& first_region, +	std::string& error, +	LLDynamicArray<LLViewerObjectPtr>* objectsp) +{ +	LLDynamicArray<LLViewerObjectPtr> derez_objects; + +	if (!objectsp) // if objects to derez not specified +	{ +		// get them from selection +		if (!get_derezzable_objects(dest, error, first_region, &derez_objects, false)) +		{ +			llwarns << "No objects to derez" << llendl; +			return;  		} + +		objectsp = &derez_objects; +	} + + +	if(gAgentCamera.cameraMouselook()) +	{ +		gAgentCamera.changeCameraToDefault();  	}  	// This constant is based on (1200 - HEADER_SIZE) / 4 bytes per @@ -4099,13 +4131,13 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)  	// satisfy anybody.  	const S32 MAX_ROOTS_PER_PACKET = 250;  	const S32 MAX_PACKET_COUNT = 254; -	F32 packets = ceil((F32)derez_objects.count() / (F32)MAX_ROOTS_PER_PACKET); +	F32 packets = ceil((F32)objectsp->count() / (F32)MAX_ROOTS_PER_PACKET);  	if(packets > (F32)MAX_PACKET_COUNT)  	{  		error = "AcquireErrorTooManyObjects";  	} -	if(error.empty() && derez_objects.count() > 0) +	if(error.empty() && objectsp->count() > 0)  	{  		U8 d = (U8)dest;  		LLUUID tid; @@ -4130,11 +4162,11 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)  			msg->addU8Fast(_PREHASH_PacketCount, packet_count);  			msg->addU8Fast(_PREHASH_PacketNumber, packet_number);  			objects_in_packet = 0; -			while((object_index < derez_objects.count()) +			while((object_index < objectsp->count())  				  && (objects_in_packet++ < MAX_ROOTS_PER_PACKET))  			{ -				LLViewerObject* object = derez_objects.get(object_index++); +				LLViewerObject* object = objectsp->get(object_index++);  				msg->nextBlockFast(_PREHASH_ObjectData);  				msg->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID());  				// VEFFECT: DerezObject @@ -4159,6 +4191,13 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)  	}  } +static void derez_objects(EDeRezDestination dest, const LLUUID& dest_id) +{ +	LLViewerRegion* first_region = NULL; +	std::string error; +	derez_objects(dest, dest_id, first_region, error, NULL); +} +  void handle_take_copy()  {  	if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return; @@ -4170,12 +4209,19 @@ void handle_take_copy()  // You can return an object to its owner if it is on your land.  class LLObjectReturn : public view_listener_t  { +public: +	LLObjectReturn() : mFirstRegion(NULL) {} + +private:  	bool handleEvent(const LLSD& userdata)  	{  		if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return true;  		mObjectSelection = LLSelectMgr::getInstance()->getEditSelection(); +		// Save selected objects, so that we still know what to return after the confirmation dialog resets selection. +		get_derezzable_objects(DRD_RETURN_TO_OWNER, mError, mFirstRegion, &mReturnableObjects); +  		LLNotificationsUtil::add("ReturnToOwner", LLSD(), LLSD(), boost::bind(&LLObjectReturn::onReturnToOwner, this, _1, _2));  		return true;  	} @@ -4186,16 +4232,23 @@ class LLObjectReturn : public view_listener_t  		if (0 == option)  		{  			// Ignore category ID for this derez destination. -			derez_objects(DRD_RETURN_TO_OWNER, LLUUID::null); +			derez_objects(DRD_RETURN_TO_OWNER, LLUUID::null, mFirstRegion, mError, &mReturnableObjects);  		} +		mReturnableObjects.clear(); +		mError.clear(); +		mFirstRegion = NULL; +  		// drop reference to current selection  		mObjectSelection = NULL;  		return false;  	} -protected:  	LLObjectSelectionHandle mObjectSelection; + +	LLDynamicArray<LLViewerObjectPtr> mReturnableObjects; +	std::string mError; +	LLViewerRegion* mFirstRegion;  }; @@ -4220,29 +4273,7 @@ class LLObjectEnableReturn : public view_listener_t  		}  		else  		{ -			LLViewerRegion* region = gAgent.getRegion(); -			if (region) -			{ -				// Estate owners and managers can always return objects. -				if (region->canManageEstate()) -				{ -					new_value = true; -				} -				else -				{ -					struct f : public LLSelectedObjectFunctor -					{ -						virtual bool apply(LLViewerObject* obj) -						{ -							return  -								obj->permModify() || -								obj->isReturnable(); -						} -					} func; -					const bool firstonly = true; -					new_value = LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, firstonly); -				} -			} +			new_value = can_derez(DRD_RETURN_TO_OWNER);  		}  #endif  		return new_value; @@ -4490,6 +4521,13 @@ bool tools_visible_take_object()  	return !is_selection_buy_not_take();  } +bool enable_how_to_visible(const LLSD& param) +{ +	LLFloaterWebContent::Params p; +	p.target = "__help_how_to"; +	return LLFloaterReg::instanceVisible("how_to", p); +} +  class LLToolsEnableBuyOrTake : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -5275,7 +5313,7 @@ class LLWorldCreateLandmark : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark")); +		LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));  		return true;  	} @@ -5285,7 +5323,7 @@ class LLWorldPlaceProfile : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent")); +		LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "agent"));  		return true;  	} @@ -5381,6 +5419,34 @@ class LLAvatarAddFriend : public view_listener_t  	}  }; + +class LLAvatarToggleMyProfile : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		LLFloater* instance = LLAvatarActions::getProfileFloater(gAgent.getID()); +		if (LLFloater::isMinimized(instance)) +		{ +			instance->setMinimized(FALSE); +			instance->setFocus(TRUE); +		} +		else if (!LLFloater::isShown(instance)) +		{ +			LLAvatarActions::showProfile(gAgent.getID()); +		} +		else if (!instance->hasFocus() && !instance->getIsChrome()) +		{ +			instance->setFocus(TRUE); +		} +		else +		{ +			instance->closeFloater(); +		} +		return true; +	} +}; + +  class LLAvatarAddContact : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -5526,22 +5592,22 @@ void handle_viewer_disable_message_log(void*)  void handle_customize_avatar()  { -	LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "my_outfits")); +	LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "my_outfits"));  }  void handle_edit_outfit()  { -	LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit")); +	LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit"));  }  void handle_edit_shape()  { -	LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_shape")); +	LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_shape"));  }  void handle_edit_physics()  { -	LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_physics")); +	LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_physics"));  }  void handle_report_abuse() @@ -5611,18 +5677,18 @@ class LLShowSidetrayPanel : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		std::string panel_name = userdata.asString(); +		std::string floater_name = userdata.asString(); -		LLPanel* panel = LLSideTray::getInstance()->getPanel(panel_name); +		LLPanel* panel = LLFloaterSidePanelContainer::getPanel(floater_name);  		if (panel)  		{  			if (panel->isInVisibleChain())  			{ -				LLSideTray::getInstance()->hidePanel(panel_name); +				LLFloaterReg::getInstance(floater_name)->closeFloater();  			}  			else  			{ -				LLSideTray::getInstance()->showPanel(panel_name); +				LLFloaterReg::getInstance(floater_name)->openFloater();  			}  		}  		return true; @@ -5633,9 +5699,9 @@ class LLSidetrayPanelVisible : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		std::string panel_name = userdata.asString(); +		std::string floater_name = userdata.asString();  		// Toggle the panel -		if (LLSideTray::getInstance()->isPanelActive(panel_name)) +		if (LLFloaterReg::getInstance(floater_name)->isInVisibleChain())  		{  			return true;  		} @@ -6821,6 +6887,22 @@ class LLToolsEnableSaveToObjectInventory : public view_listener_t  	}  }; +class LLToggleHowTo : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		LLFloaterWebContent::Params p; +		std::string url = gSavedSettings.getString("HowToHelpURL"); +		p.url = LLWeb::expandURLSubstitutions(url, LLSD()); +		p.show_chrome = false; +		p.target = "__help_how_to"; +		p.show_page_title = false; +		p.preferred_media_size = LLRect(0, 460, 335, 0); + +		LLFloaterReg::toggleInstanceOrBringToFront("how_to", p); +		return true; +	} +};  class LLViewEnableMouselook : public view_listener_t  { @@ -7161,9 +7243,11 @@ class LLToolsUseSelectionForGrid : public view_listener_t  		} func;  		LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func);  		LLSelectMgr::getInstance()->setGridMode(GRID_MODE_REF_OBJECT); -		if (gFloaterTools) + +		LLFloaterBuildOptions* build_options_floater = LLFloaterReg::getTypedInstance<LLFloaterBuildOptions>("build_options"); +		if (build_options_floater && build_options_floater->getVisible())  		{ -			gFloaterTools->mComboGridMode->setCurrentByIndex((S32)GRID_MODE_REF_OBJECT); +			build_options_floater->setGridMode(GRID_MODE_REF_OBJECT);  		}  		return true;  	} @@ -7238,7 +7322,7 @@ void handle_web_browser_test(const LLSD& param)  void handle_web_content_test(const LLSD& param)  {  	std::string url = param.asString(); -	LLWeb::loadWebURLInternal(url); +	LLWeb::loadURLInternal(url);  }  void handle_buy_currency_test(void*) @@ -7667,6 +7751,40 @@ class LLWorldEnvPreset : public view_listener_t  	}  }; +class LLWorldEnableEnvPreset : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		std::string item = userdata.asString(); + +		if (item == "delete_water") +		{ +			LLWaterParamManager::preset_name_list_t user_waters; +			LLWaterParamManager::instance().getUserPresetNames(user_waters); +			return !user_waters.empty(); +		} +		else if (item == "delete_sky") +		{ +			LLWLParamManager::preset_name_list_t user_skies; +			LLWLParamManager::instance().getUserPresetNames(user_skies); +			return !user_skies.empty(); +		} +		else if (item == "delete_day_cycle") +		{ +			LLDayCycleManager::preset_name_list_t user_days; +			LLDayCycleManager::instance().getUserPresetNames(user_days); +			return !user_days.empty(); +		} +		else +		{ +			llwarns << "Unknown item" << llendl; +		} + +		return false; +	} +}; + +  /// Post-Process callbacks  class LLWorldPostProcess : public view_listener_t  { @@ -7681,7 +7799,7 @@ class LLWorldToggleMovementControls : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		LLBottomTray::getInstance()->toggleMovementControls(); +		LLFloaterReg::toggleInstanceOrBringToFront("moveview");  		return true;  	}  }; @@ -7690,7 +7808,7 @@ class LLWorldToggleCameraControls : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		LLBottomTray::getInstance()->toggleCameraControls(); +		LLFloaterReg::toggleInstanceOrBringToFront("camera");  		return true;  	}  }; @@ -7873,6 +7991,7 @@ void initialize_menus()  	view_listener_t::addMenu(new LLZoomer(1/1.2f), "View.ZoomIn");  	view_listener_t::addMenu(new LLZoomer(DEFAULT_FIELD_OF_VIEW, false), "View.ZoomDefault");  	view_listener_t::addMenu(new LLViewDefaultUISize(), "View.DefaultUISize"); +	view_listener_t::addMenu(new LLViewToggleUI(), "View.ToggleUI");  	view_listener_t::addMenu(new LLViewEnableMouselook(), "View.EnableMouselook");  	view_listener_t::addMenu(new LLViewEnableJoystickFlycam(), "View.EnableJoystickFlycam"); @@ -7906,6 +8025,7 @@ void initialize_menus()  	view_listener_t::addMenu(new LLWorldEnvSettings(), "World.EnvSettings");  	view_listener_t::addMenu(new LLWorldEnvPreset(), "World.EnvPreset"); +	view_listener_t::addMenu(new LLWorldEnableEnvPreset(), "World.EnableEnvPreset");  	view_listener_t::addMenu(new LLWorldPostProcess(), "World.PostProcess");  	view_listener_t::addMenu(new LLWorldToggleMovementControls(), "World.Toggle.MovementControls"); @@ -7947,6 +8067,8 @@ void initialize_menus()  	// Help menu  	// most items use the ShowFloater method +	view_listener_t::addMenu(new LLToggleHowTo(), "Help.ToggleHowTo"); +	enable.add("Help.HowToVisible", boost::bind(&enable_how_to_visible, _2));  	// Advanced menu  	view_listener_t::addMenu(new LLAdvancedToggleConsole(), "Advanced.ToggleConsole"); @@ -8025,7 +8147,6 @@ void initialize_menus()  	view_listener_t::addMenu(new LLAdvancedCheckDebugKeys(), "Advanced.CheckDebugKeys");  	view_listener_t::addMenu(new LLAdvancedToggleDebugWindowProc(), "Advanced.ToggleDebugWindowProc");  	view_listener_t::addMenu(new LLAdvancedCheckDebugWindowProc(), "Advanced.CheckDebugWindowProc"); -	commit.add("Advanced.ShowSideTray", boost::bind(&handle_show_side_tray));  	// Advanced > XUI  	commit.add("Advanced.ReloadColorSettings", boost::bind(&LLUIColorTable::loadFromSettings, LLUIColorTable::getInstance())); @@ -8140,6 +8261,10 @@ void initialize_menus()  	view_listener_t::addMenu(new LLAvatarCall(), "Avatar.Call");  	enable.add("Avatar.EnableCall", boost::bind(&LLAvatarActions::canCall));  	view_listener_t::addMenu(new LLAvatarReportAbuse(), "Avatar.ReportAbuse"); +	view_listener_t::addMenu(new LLAvatarToggleMyProfile(), "Avatar.ToggleMyProfile"); +	enable.add("Avatar.IsMyProfileOpen", boost::bind(&my_profile_visible)); + +	commit.add("Avatar.OpenMarketplace", boost::bind(&LLWeb::loadURLExternal, gSavedSettings.getString("MarketplaceURL")));  	view_listener_t::addMenu(new LLAvatarEnableAddFriend(), "Avatar.EnableAddFriend");  	enable.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2)); @@ -8224,9 +8349,5 @@ void initialize_menus()  	view_listener_t::addMenu(new LLSomethingSelectedNoHUD(), "SomethingSelectedNoHUD");  	view_listener_t::addMenu(new LLEditableSelected(), "EditableSelected");  	view_listener_t::addMenu(new LLEditableSelectedMono(), "EditableSelectedMono"); -  	view_listener_t::addMenu(new LLToggleUIHints(), "ToggleUIHints"); - -	commit.add("Destination.show", boost::bind(&toggle_destination_and_avatar_picker, 0)); -	commit.add("Avatar.show", boost::bind(&toggle_destination_and_avatar_picker, 1));  } diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index b4e239b0cd..87cb4efbc4 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -126,8 +126,6 @@ bool enable_pay_object();  bool enable_buy_object();  bool handle_go_to(); -void toggle_destination_and_avatar_picker(const LLSD& show); -  // Export to XML or Collada  void handle_export_selected( void * ); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index e934c38c22..369d2d757d 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -61,6 +61,7 @@  #include "llfloaterlandholdings.h"  #include "llfloaterpostcard.h"  #include "llfloaterpreference.h" +#include "llfloatersidepanelcontainer.h"  #include "llhudeffecttrail.h"  #include "llhudmanager.h"  #include "llinventoryfunctions.h" @@ -73,7 +74,6 @@  #include "llrecentpeople.h"  #include "llscriptfloater.h"  #include "llselectmgr.h" -#include "llsidetray.h"  #include "llstartup.h"  #include "llsky.h"  #include "llslurl.h" @@ -1049,48 +1049,26 @@ void start_new_inventory_observer()  class LLDiscardAgentOffer : public LLInventoryFetchItemsObserver  {  	LOG_CLASS(LLDiscardAgentOffer); +  public:  	LLDiscardAgentOffer(const LLUUID& folder_id, const LLUUID& object_id) :  		LLInventoryFetchItemsObserver(object_id),  		mFolderID(folder_id),  		mObjectID(object_id) {} -	virtual ~LLDiscardAgentOffer() {} +  	virtual void done()  	{  		LL_DEBUGS("Messaging") << "LLDiscardAgentOffer::done()" << LL_ENDL; -		const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); -		bool notify = false; -		if(trash_id.notNull() && mObjectID.notNull()) -		{ -			LLInventoryModel::update_list_t update; -			LLInventoryModel::LLCategoryUpdate old_folder(mFolderID, -1); -			update.push_back(old_folder); -			LLInventoryModel::LLCategoryUpdate new_folder(trash_id, 1); -			update.push_back(new_folder); -			gInventory.accountForUpdate(update); -			gInventory.moveObject(mObjectID, trash_id); -			LLInventoryObject* obj = gInventory.getObject(mObjectID); -			if(obj) -			{ -				// no need to restamp since this is already a freshly -				// stamped item. -				obj->updateParentOnServer(FALSE); -				notify = true; -			} -		} -		else -		{ -			LL_WARNS("Messaging") << "DiscardAgentOffer unable to find: " -					<< (trash_id.isNull() ? "trash " : "") -					<< (mObjectID.isNull() ? "object" : "") << LL_ENDL; -		} + +		// We're invoked from LLInventoryModel::notifyObservers(). +		// If we now try to remove the inventory item, it will cause a nested +		// notifyObservers() call, which won't work. +		// So defer moving the item to trash until viewer gets idle (in a moment). +		LLAppViewer::instance()->addOnIdleCallback(boost::bind(&LLInventoryModel::removeItem, &gInventory, mObjectID));  		gInventory.removeObserver(this); -		if(notify) -		{ -			gInventory.notifyObservers(); -		}  		delete this;  	} +  protected:  	LLUUID mFolderID;  	LLUUID mObjectID; @@ -1214,9 +1192,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam  						LLInventoryCategory* parent_folder = gInventory.getCategory(item->getParentUUID());  						if ("inventory_handler" == from_name)  						{ -							//we have to filter inventory_handler messages to avoid notification displaying -							LLSideTray::getInstance()->showPanel("panel_places", -																 LLSD().with("type", "landmark").with("id", item->getUUID())); +							LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "landmark").with("id", item->getUUID()));  						}  						else if("group_offer" == from_name)  						{ @@ -1225,7 +1201,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam  							LLSD args;  							args["type"] = "landmark";  							args["id"] = obj_id; -							LLSideTray::getInstance()->showPanel("panel_places", args); +							LLFloaterSidePanelContainer::showPanel("places", args);  							continue;  						} @@ -1321,29 +1297,12 @@ bool highlight_offered_object(const LLUUID& obj_id)  void inventory_offer_mute_callback(const LLUUID& blocked_id,  								   const std::string& full_name, -								   bool is_group, -								   boost::shared_ptr<LLNotificationResponderInterface> offer_ptr) +								   bool is_group)  { -	LLOfferInfo* offer =  dynamic_cast<LLOfferInfo*>(offer_ptr.get()); -	 -	std::string from_name = full_name; -	LLMute::EType type; -	if (is_group) -	{ -		type = LLMute::GROUP; -	} -	else if(offer && offer->mFromObject) -	{ -		//we have to block object by name because blocked_id is an id of owner -		type = LLMute::BY_NAME; -	} -	else -	{ -		type = LLMute::AGENT; -	} +	// *NOTE: blocks owner if the offer came from an object +	LLMute::EType mute_type = is_group ? LLMute::GROUP : LLMute::AGENT; -	// id should be null for BY_NAME mute, see  LLMuteList::add for details   -	LLMute mute(type == LLMute::BY_NAME ? LLUUID::null : blocked_id, from_name, type); +	LLMute mute(blocked_id, full_name, mute_type);  	if (LLMuteList::getInstance()->add(mute))  	{  		LLPanelBlockedList::showPanelAndSelect(blocked_id); @@ -1357,6 +1316,7 @@ void inventory_offer_mute_callback(const LLUUID& blocked_id,  		bool matches(const LLNotificationPtr notification) const  		{  			if(notification->getName() == "ObjectGiveItem"  +				|| notification->getName() == "OwnObjectGiveItem"  				|| notification->getName() == "UserGiveItem")  			{  				return (notification->getPayload()["from_id"].asUUID() == blocked_id); @@ -1495,7 +1455,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  	LLChat chat;  	std::string log_message;  	S32 button = LLNotificationsUtil::getSelectedOption(notification, response); -	 +  	LLInventoryObserver* opener = NULL;  	LLViewerInventoryCategory* catp = NULL;  	catp = (LLViewerInventoryCategory*)gInventory.getCategory(mObjectID); @@ -1517,7 +1477,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  		llassert(notification_ptr != NULL);  		if (notification_ptr != NULL)  		{ -			gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,notification_ptr->getResponderPtr())); +			gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback, _1, _2, _3));  		}  	} @@ -1527,7 +1487,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  	// TODO: when task inventory offers can also be handled the new way, migrate the code that sets these strings here:  	from_string = chatHistory_string = mFromName; -	bool busy=FALSE; +	bool busy = gAgent.getBusy();  	switch(button)  	{ @@ -1586,9 +1546,6 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  		}  		break; -	case IOR_BUSY: -		//Busy falls through to decline.  Says to make busy message. -		busy=TRUE;  	case IOR_MUTE:  		// MUTE falls through to decline  	case IOR_DECLINE: @@ -1665,7 +1622,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const  		llassert(notification_ptr != NULL);  		if (notification_ptr != NULL)  		{ -			gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,notification_ptr->getResponderPtr())); +			gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback, _1, _2, _3));  		}  	} @@ -1734,7 +1691,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const  		from_string = chatHistory_string = mFromName;  	} -	bool busy=FALSE; +	bool busy = gAgent.getBusy();  	switch(button)  	{ @@ -1780,9 +1737,6 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const  		}	// end switch (mIM)  			break; -		case IOR_BUSY: -			//Busy falls through to decline.  Says to make busy message. -			busy=TRUE;  		case IOR_MUTE:  			// MUTE falls through to decline  		case IOR_DECLINE: @@ -1846,20 +1800,13 @@ void LLOfferInfo::initRespondFunctionMap()  	if(mRespondFunctions.empty())  	{  		mRespondFunctions["ObjectGiveItem"] = boost::bind(&LLOfferInfo::inventory_task_offer_callback, this, _1, _2); +		mRespondFunctions["OwnObjectGiveItem"] = boost::bind(&LLOfferInfo::inventory_task_offer_callback, this, _1, _2);  		mRespondFunctions["UserGiveItem"] = boost::bind(&LLOfferInfo::inventory_offer_callback, this, _1, _2);  	}  }  void inventory_offer_handler(LLOfferInfo* info)  { -	//Until throttling is implmented, busy mode should reject inventory instead of silently -	//accepting it.  SEE SL-39554 -	if (gAgent.getBusy()) -	{ -		info->forceResponse(IOR_BUSY); -		return; -	} -	  	//If muted, don't even go through the messaging stuff.  Just curtail the offer here.  	if (LLMuteList::getInstance()->isMuted(info->mFromID, info->mFromName))  	{ @@ -1941,7 +1888,7 @@ void inventory_offer_handler(LLOfferInfo* info)  	std::string verb = "select?name=" + LLURI::escape(msg);  	args["ITEM_SLURL"] = LLSLURL("inventory", info->mObjectID, verb.c_str()).getSLURLString(); -	LLNotification::Params p("ObjectGiveItem"); +	LLNotification::Params p;  	// Object -> Agent Inventory Offer  	if (info->mFromObject) @@ -1951,7 +1898,10 @@ void inventory_offer_handler(LLOfferInfo* info)  		// Note: sets inventory_task_offer_callback as the callback  		p.substitutions(args).payload(payload).functor.responder(LLNotificationResponderPtr(info));  		info->mPersist = true; -		p.name = "ObjectGiveItem"; + +		// Offers from your own objects need a special notification template. +		p.name = info->mFromID == gAgentID ? "OwnObjectGiveItem" : "ObjectGiveItem"; +  		// Pop up inv offer chiclet and let the user accept (keep), or reject (and silently delete) the inventory.  	    LLPostponedNotification::add<LLPostponedOfferNotification>(p, info->mFromID, info->mFromGroup == TRUE);  	} @@ -2238,7 +2188,7 @@ void god_message_name_cb(const LLAvatarName& av_name, LLChat chat, std::string m  	// Treat like a system message and put in chat history.  	chat.mText = av_name.getCompleteName() + ": " + message; -	LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); +	LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();  	if(nearby_chat)  	{  		nearby_chat->addMessage(chat); @@ -2630,8 +2580,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				bucketp = (struct offer_agent_bucket_t*) &binary_bucket[0];  				info->mType = (LLAssetType::EType) bucketp->asset_type;  				info->mObjectID = bucketp->object_id; +				info->mFromObject = FALSE;  			} -			else +			else // IM_TASK_INVENTORY_OFFERED  			{  				if (sizeof(S8) != binary_bucket_size)  				{ @@ -2641,6 +2592,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				}  				info->mType = (LLAssetType::EType) binary_bucket[0];  				info->mObjectID = LLUUID::null; +				info->mFromObject = TRUE;  			}  			info->mIM = dialog; @@ -2649,14 +2601,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			info->mTransactionID = session_id;  			info->mFolderID = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(info->mType)); -			if (dialog == IM_TASK_INVENTORY_OFFERED) -			{ -				info->mFromObject = TRUE; -			} -			else -			{ -				info->mFromObject = FALSE; -			}  			info->mFromName = name;  			info->mDesc = message;  			info->mHost = msg->getSender(); @@ -2671,6 +2615,12 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				// Same as closing window  				info->forceResponse(IOR_DECLINE);  			} +			else if (is_busy && dialog != IM_TASK_INVENTORY_OFFERED) // busy mode must not affect interaction with objects (STORM-565) +			{ +				// Until throttling is implemented, busy mode should reject inventory instead of silently +				// accepting it.  SEE SL-39554 +				info->forceResponse(IOR_DECLINE); +			}  			else  			{  				inventory_offer_handler(info); @@ -2800,7 +2750,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			// Note: lie to Nearby Chat, pretending that this is NOT an IM, because  			// IMs from obejcts don't open IM sessions. -			LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); +			LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();  			if(SYSTEM_FROM != name && nearby_chat)  			{  				chat.mOwnerID = from_id; @@ -2884,8 +2834,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			else  			{  				LLVector3 pos, look_at; -				U64 region_handle; -				U8 region_access; +				U64 region_handle(0); +				U8 region_access(0);  				std::string region_info = ll_safe_string((char*)binary_bucket, binary_bucket_size);  				std::string region_access_str = LLStringUtil::null;  				std::string region_access_icn = LLStringUtil::null; @@ -6546,8 +6496,24 @@ bool callback_script_dialog(const LLSD& notification, const LLSD& response)  		rtn_text = LLNotification::getSelectedOptionName(response);  	} -	// Didn't click "Ignore" -	if (button_idx != -1) +	// Button -2 = Mute +	// Button -1 = Ignore - no processing needed for this button +	// Buttons 0 and above = dialog choices + +	if (-2 == button_idx) +	{ +		std::string object_name = notification["payload"]["object_name"].asString(); +		LLUUID object_id = notification["payload"]["object_id"].asUUID(); +		LLMute mute(object_id, object_name, LLMute::OBJECT); +		if (LLMuteList::getInstance()->add(mute)) +		{ +			// This call opens the sidebar, displays the block list, and highlights the newly blocked +			// object in the list so the user can see that their block click has taken effect. +			LLPanelBlockedList::showPanelAndSelect(object_id); +		} +	} + +	if (0 <= button_idx)  	{  		LLMessageSystem* msg = gMessageSystem;  		msg->newMessage("ScriptDialogReply"); @@ -6590,12 +6556,12 @@ void process_script_dialog(LLMessageSystem* msg, void**)  	std::string message;   	std::string first_name;  	std::string last_name; -	std::string title; +	std::string object_name;  	S32 chat_channel;  	msg->getString("Data", "FirstName", first_name);  	msg->getString("Data", "LastName", last_name); -	msg->getString("Data", "ObjectName", title); +	msg->getString("Data", "ObjectName", object_name);  	msg->getString("Data", "Message", message);  	msg->getS32("Data", "ChatChannel", chat_channel); @@ -6606,6 +6572,7 @@ void process_script_dialog(LLMessageSystem* msg, void**)  	payload["sender"] = msg->getSender().getIPandPort();  	payload["object_id"] = object_id;  	payload["chat_channel"] = chat_channel; +	payload["object_name"] = object_name;  	// build up custom form  	S32 button_count = msg->getNumberOfBlocks("Buttons"); @@ -6624,7 +6591,7 @@ void process_script_dialog(LLMessageSystem* msg, void**)  	}  	LLSD args; -	args["TITLE"] = title; +	args["TITLE"] = object_name;  	args["MESSAGE"] = message;  	LLNotificationPtr notification;  	if (!first_name.empty()) @@ -6832,7 +6799,7 @@ void process_covenant_reply(LLMessageSystem* msg, void**)  	LLPanelLandCovenant::updateEstateOwnerName(owner_name);  	LLFloaterBuyLand::updateEstateOwnerName(owner_name); -	LLPanelPlaceProfile* panel = LLSideTray::getInstance()->getPanel<LLPanelPlaceProfile>("panel_place_profile"); +	LLPanelPlaceProfile* panel = LLFloaterSidePanelContainer::getPanel<LLPanelPlaceProfile>("places", "panel_place_profile");  	if (panel)  	{  		panel->updateEstateName(estate_name); @@ -6966,7 +6933,7 @@ void onCovenantLoadComplete(LLVFS *vfs,  	LLPanelLandCovenant::updateCovenantText(covenant_text);  	LLFloaterBuyLand::updateCovenantText(covenant_text, asset_uuid); -	LLPanelPlaceProfile* panel = LLSideTray::getInstance()->getPanel<LLPanelPlaceProfile>("panel_place_profile"); +	LLPanelPlaceProfile* panel = LLFloaterSidePanelContainer::getPanel<LLPanelPlaceProfile>("places", "panel_place_profile");  	if (panel)  	{  		panel->updateCovenantText(covenant_text); diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h index 9d09d9c01a..d8acd99953 100644 --- a/indra/newview/llviewermessage.h +++ b/indra/newview/llviewermessage.h @@ -57,7 +57,6 @@ enum InventoryOfferResponse  	IOR_ACCEPT,  	IOR_DECLINE,  	IOR_MUTE, -	IOR_BUSY,  	IOR_SHOW  }; diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp index a59afdc28a..ef5c65eb87 100644 --- a/indra/newview/llviewernetwork.cpp +++ b/indra/newview/llviewernetwork.cpp @@ -35,7 +35,7 @@  #include "llweb.h" -const char* DEFAULT_LOGIN_PAGE = "http://secondlife.com/app/login/"; +const char* DEFAULT_LOGIN_PAGE = "http://viewer-login.agni.lindenlab.com/";  const char* SYSTEM_GRID_SLURL_BASE = "secondlife://%s/secondlife/";  const char* MAIN_GRID_SLURL_BASE = "http://maps.secondlife.com/secondlife/"; diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 972993202a..d81e67bfe2 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -100,7 +100,6 @@  #include "lltrans.h"  #include "llsdutil.h"  #include "llmediaentry.h" -#include "llaccountingquota.h"  //#define DEBUG_UPDATE_TYPE @@ -140,6 +139,7 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco  			if (!gAgentAvatarp)  			{  				gAgentAvatarp = new LLVOAvatarSelf(id, pcode, regionp); +				gAgentAvatarp->initInstance();  			}  			else   			{ @@ -149,9 +149,10 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco  		}  		else  		{ -			res = new LLVOAvatar(id, pcode, regionp);  +			LLVOAvatar *avatar = new LLVOAvatar(id, pcode, regionp);  +			avatar->initInstance(); +			res = avatar;  		} -		static_cast<LLVOAvatar*>(res)->initInstance();  		break;  	}  	case LL_PCODE_LEGACY_GRASS: @@ -516,7 +517,6 @@ void LLViewerObject::setNameValueList(const std::string& name_value_list)  	}  } -  // This method returns true if the object is over land owned by the  // agent.  bool LLViewerObject::isReturnable() @@ -525,6 +525,112 @@ bool LLViewerObject::isReturnable()  	{  		return false;  	} +		 +	std::vector<LLBBox> boxes; +	boxes.push_back(LLBBox(getPositionRegion(), getRotationRegion(), getScale() * -0.5f, getScale() * 0.5f).getAxisAligned()); +	for (child_list_t::iterator iter = mChildList.begin(); +		 iter != mChildList.end(); iter++) +	{ +		LLViewerObject* child = *iter; +		boxes.push_back( LLBBox(child->getPositionRegion(), child->getRotationRegion(), child->getScale() * -0.5f, child->getScale() * 0.5f).getAxisAligned()); +	} + +	bool result = (mRegionp && mRegionp->objectIsReturnable(getPositionRegion(), boxes)) ? 1 : 0; +	 +	if ( !result ) +	{		 +		//Get list of neighboring regions relative to this vo's region +		std::vector<LLViewerRegion*> uniqueRegions; +		mRegionp->getNeighboringRegions( uniqueRegions ); +	 +		//Build aabb's - for root and all children +		std::vector<PotentialReturnableObject> returnables; +		typedef std::vector<LLViewerRegion*>::iterator RegionIt; +		RegionIt regionStart = uniqueRegions.begin(); +		RegionIt regionEnd   = uniqueRegions.end(); +		 +		for (; regionStart != regionEnd; ++regionStart ) +		{ +			LLViewerRegion* pTargetRegion = *regionStart; +			//Add the root vo as there may be no children and we still want +			//to test for any edge overlap +			buildReturnablesForChildrenVO( returnables, this, pTargetRegion ); +			//Add it's children +			for (child_list_t::iterator iter = mChildList.begin();  iter != mChildList.end(); iter++) +			{ +				LLViewerObject* pChild = *iter;		 +				buildReturnablesForChildrenVO( returnables, pChild, pTargetRegion ); +			} +		}	 +	 +		//TBD#Eventually create a region -> box list map  +		typedef std::vector<PotentialReturnableObject>::iterator ReturnablesIt; +		ReturnablesIt retCurrentIt = returnables.begin(); +		ReturnablesIt retEndIt = returnables.end(); +	 +		for ( ; retCurrentIt !=retEndIt; ++retCurrentIt ) +		{ +			boxes.clear(); +			LLViewerRegion* pRegion = (*retCurrentIt).pRegion; +			boxes.push_back( (*retCurrentIt).box );	 +			bool retResult = 	pRegion +							 && pRegion->childrenObjectReturnable( boxes ) +							 && pRegion->canManageEstate(); +			if ( retResult ) +			{  +				result = true; +				break; +			} +		} +	} +	return result; +} + +void LLViewerObject::buildReturnablesForChildrenVO( std::vector<PotentialReturnableObject>& returnables, LLViewerObject* pChild, LLViewerRegion* pTargetRegion ) +{ +	if ( !pChild ) +	{ +		llerrs<<"child viewerobject is NULL "<<llendl; +	} +	 +	constructAndAddReturnable( returnables, pChild, pTargetRegion ); +	 +	//We want to handle any children VO's as well +	for (child_list_t::iterator iter = pChild->mChildList.begin();  iter != pChild->mChildList.end(); iter++) +	{ +		LLViewerObject* pChildofChild = *iter; +		buildReturnablesForChildrenVO( returnables, pChildofChild, pTargetRegion ); +	} +} + +void LLViewerObject::constructAndAddReturnable( std::vector<PotentialReturnableObject>& returnables, LLViewerObject* pChild, LLViewerRegion* pTargetRegion ) +{ +	 +	LLVector3 targetRegionPos; +	targetRegionPos.setVec( pChild->getPositionGlobal() );	 +	 +	LLBBox childBBox = LLBBox( targetRegionPos, pChild->getRotationRegion(), pChild->getScale() * -0.5f,  +							    pChild->getScale() * 0.5f).getAxisAligned(); +	 +	LLVector3 edgeA = targetRegionPos + childBBox.getMinLocal(); +	LLVector3 edgeB = targetRegionPos + childBBox.getMaxLocal(); +	 +	LLVector3d edgeAd, edgeBd; +	edgeAd.setVec(edgeA); +	edgeBd.setVec(edgeB); +	 +	//Only add the box when either of the extents are in a neighboring region +	if ( pTargetRegion->pointInRegionGlobal( edgeAd ) || pTargetRegion->pointInRegionGlobal( edgeBd ) ) +	{ +		PotentialReturnableObject returnableObj; +		returnableObj.box		= childBBox; +		returnableObj.pRegion	= pTargetRegion; +		returnables.push_back( returnableObj ); +	} +} + +bool LLViewerObject::crossesParcelBounds() +{  	std::vector<LLBBox> boxes;  	boxes.push_back(LLBBox(getPositionRegion(), getRotationRegion(), getScale() * -0.5f, getScale() * 0.5f).getAxisAligned());  	for (child_list_t::iterator iter = mChildList.begin(); @@ -534,8 +640,7 @@ bool LLViewerObject::isReturnable()  		boxes.push_back(LLBBox(child->getPositionRegion(), child->getRotationRegion(), child->getScale() * -0.5f, child->getScale() * 0.5f).getAxisAligned());  	} -	return mRegionp -		&& mRegionp->objectIsReturnable(getPositionRegion(), boxes); +	return mRegionp && mRegionp->objectsCrossParcel(boxes);  }  BOOL LLViewerObject::setParent(LLViewerObject* parent) @@ -2660,7 +2765,7 @@ void LLViewerObject::processTaskInv(LLMessageSystem* msg, void** user_data)  		LLPointer<LLInventoryObject> obj;  		obj = new LLInventoryObject(object->mID, LLUUID::null,  									LLAssetType::AT_CATEGORY, -									LLTrans::getString("ViewerObjectContents").c_str()); +									"Contents");  		object->mInventory->push_front(obj);  		object->doInventoryCallback();  		delete ft; @@ -2727,7 +2832,7 @@ void LLViewerObject::loadTaskInvFile(const std::string& filename)  			{  				LLPointer<LLInventoryObject> inv = new LLInventoryObject;  				inv->importLegacyStream(ifs); -				inv->rename(LLTrans::getString("ViewerObjectContents").c_str()); +				inv->rename("Contents");  				mInventory->push_front(inv);  			}  			else @@ -4787,6 +4892,10 @@ void LLViewerObject::adjustAudioGain(const F32 gain)  bool LLViewerObject::unpackParameterEntry(U16 param_type, LLDataPacker *dp)  { +	if (LLNetworkData::PARAMS_MESH == param_type) +	{ +		param_type = LLNetworkData::PARAMS_SCULPT; +	}  	ExtraParameter* param = getExtraParameterEntryCreate(param_type);  	if (param)  	{ @@ -5691,9 +5800,3 @@ public:  LLHTTPRegistration<ObjectPhysicsProperties>  	gHTTPRegistrationObjectPhysicsProperties("/message/ObjectPhysicsProperties"); - -void LLViewerObject::updateQuota( const SelectionQuota& quota ) -{ -	//update quotas -	mSelectionQuota = quota; -} diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 7ebcee7b74..53e951e483 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -43,12 +43,12 @@  #include "v3dmath.h"  #include "v3math.h"  #include "llvertexbuffer.h" -#include "llaccountingquota.h" +#include "llbbox.h" +#include "llbbox.h"  class LLAgent;			// TODO: Get rid of this.  class LLAudioSource;  class LLAudioSourceVO; -class LLBBox;  class LLDataPacker;  class LLColor4;  class LLFrameTimer; @@ -112,6 +112,12 @@ public:  	LLColor4	mColor;  }; +struct PotentialReturnableObject +{ +	LLBBox			box; +	LLViewerRegion* pRegion; +}; +  //============================================================================  class LLViewerObject : public LLPrimitive, public LLRefCount, public LLGLUpdate @@ -234,6 +240,13 @@ public:  	// anti-encroachment is enabled  	bool isReturnable(); +	void buildReturnablesForChildrenVO( std::vector<PotentialReturnableObject>& returnables, LLViewerObject* pChild, LLViewerRegion* pTargetRegion ); +	void constructAndAddReturnable( std::vector<PotentialReturnableObject>& returnables, LLViewerObject* pChild, LLViewerRegion* pTargetRegion ); + +	// This method returns true if the object crosses +	// any parcel bounds in the region. +	bool crossesParcelBounds(); +  	/*  	// This method will scan through this object, and then query the  	// selection manager to see if the local agent probably has the @@ -646,9 +659,7 @@ protected:  	void setParticleSource(const LLPartSysData& particle_parameters, const LLUUID& owner_id);  public: -	void  updateQuota(  const SelectionQuota& quota ); -	const SelectionQuota& getQuota( void ) { return mSelectionQuota; } -	 +		  private:  	void setNameValueList(const std::string& list);		// clears nv pairs and then individually adds \n separated NV pairs from \0 terminated string  	void deleteTEImages(); // correctly deletes list of images @@ -710,8 +721,6 @@ protected:  	F32 mPhysicsCost;  	F32 mLinksetPhysicsCost; -	SelectionQuota mSelectionQuota; -	  	bool mCostStale;  	mutable bool mPhysicsShapeUnknown; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 9f882ee732..6912faa9ec 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -58,6 +58,7 @@  #include "llviewerregion.h"  #include "llviewerstats.h"  #include "llviewerstatsrecorder.h" +#include "llvovolume.h"  #include "llvoavatarself.h"  #include "lltoolmgr.h"  #include "lltoolpie.h" @@ -993,6 +994,9 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)  	mNumSizeCulled = 0;  	mNumVisCulled = 0; +	// update max computed render cost +	LLVOVolume::updateRenderComplexity(); +  	// compute all sorts of time-based stats  	// don't factor frames that were paused into the stats  	if (! mWasPaused) @@ -1071,10 +1075,12 @@ void LLViewerObjectList::fetchObjectCosts()  				LLSD id_list;  				U32 object_index = 0; +				U32 count = 0; +  				for (  					std::set<LLUUID>::iterator iter = mStaleObjectCost.begin();  					iter != mStaleObjectCost.end(); -					++iter) +					)  				{  					// Check to see if a request for this object  					// has already been made. @@ -1084,13 +1090,15 @@ void LLViewerObjectList::fetchObjectCosts()  						mPendingObjectCost.insert(*iter);  						id_list[object_index++] = *iter;  					} -				} -				// id_list should now contain all -				// requests in mStaleObjectCost before, so clear -				// it now -				mStaleObjectCost.clear(); +					mStaleObjectCost.erase(iter++); +					if (count++ >= 450) +					{ +						break; +					} +				} +									  				if ( id_list.size() > 0 )  				{  					LLSD post_data = LLSD::emptyMap(); @@ -1250,7 +1258,8 @@ void LLViewerObjectList::removeDrawable(LLDrawable* drawablep)  BOOL LLViewerObjectList::killObject(LLViewerObject *objectp)  {  	// Don't ever kill gAgentAvatarp, just force it to the agent's region -	if (objectp == gAgentAvatarp) +	// unless region is NULL which is assumed to mean you are logging out. +	if ((objectp == gAgentAvatarp) && gAgent.getRegion())  	{  		objectp->setRegion(gAgent.getRegion());  		return FALSE; @@ -1273,6 +1282,7 @@ BOOL LLViewerObjectList::killObject(LLViewerObject *objectp)  		return TRUE;  	} +  	return FALSE;  } @@ -1339,18 +1349,29 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)  	S32 num_removed = 0;  	LLViewerObject *objectp; -	for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ) +	 +	vobj_list_t::reverse_iterator target = mObjects.rbegin(); + +	vobj_list_t::iterator iter = mObjects.begin(); +	for ( ; iter != mObjects.end(); )  	{ -		// Scan for all of the dead objects and remove any "global" references to them. +		// Scan for all of the dead objects and put them all on the end of the list with no ref count ops  		objectp = *iter; +		if (objectp == NULL) +		{ //we caught up to the dead tail +			break; +		} +  		if (objectp->isDead())  		{ -			iter = mObjects.erase(iter); +			LLPointer<LLViewerObject>::swap(*iter, *target); +			*target = NULL; +			++target;  			num_removed++; -			if (num_removed == mNumDeadObjects) +			if (num_removed == mNumDeadObjects || iter->isNull())  			{ -				// We've cleaned up all of the dead objects. +				// We've cleaned up all of the dead objects or caught up to the dead tail  				break;  			}  		} @@ -1360,6 +1381,11 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)  		}  	} +	llassert(num_removed == mNumDeadObjects); + +	//erase as a block +	mObjects.erase(mObjects.begin()+(mObjects.size()-mNumDeadObjects), mObjects.end()); +  	// We've cleaned the global object list, now let's do some paranoia testing on objects  	// before blowing away the dead list.  	mDeadObjects.clear(); @@ -1394,6 +1420,10 @@ void LLViewerObjectList::updateActive(LLViewerObject *objectp)  void LLViewerObjectList::updateObjectCost(LLViewerObject* object)  { +	if (!object->isRoot()) +	{ //always fetch cost for the parent when fetching cost for children +		mStaleObjectCost.insert(((LLViewerObject*)object->getParent())->getID()); +	}  	mStaleObjectCost.insert(object->getID());  } @@ -1417,15 +1447,6 @@ void LLViewerObjectList::onObjectCostFetchFailure(const LLUUID& object_id)  	mPendingObjectCost.erase(object_id);  } -void LLViewerObjectList::updateQuota( const LLUUID& objectId, const SelectionQuota& quota  ) -{ -	LLViewerObject* pVO = findObject( objectId ); -	if ( pVO ) -	{ -		pVO->updateQuota( quota ); -	} -} -  void LLViewerObjectList::updatePhysicsFlags(const LLViewerObject* object)  {  	mStalePhysicsFlags.insert(object->getID()); diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h index 9d1b5cb56f..c5f2a2c1ee 100644 --- a/indra/newview/llviewerobjectlist.h +++ b/indra/newview/llviewerobjectlist.h @@ -36,7 +36,6 @@  // project includes  #include "llviewerobject.h" -#include "llaccountingquota.h"  class LLCamera;  class LLNetMap; @@ -102,8 +101,6 @@ public:  									F32 restitution,  									F32 gravity_multiplier); -	void updateQuota( const LLUUID& objectId, const SelectionQuota& costs ); -	  	void shiftObjects(const LLVector3 &offset);  	void repartitionObjects(); diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp index dfa35edef4..90fbc41daa 100644 --- a/indra/newview/llviewerparcelmedia.cpp +++ b/indra/newview/llviewerparcelmedia.cpp @@ -485,6 +485,12 @@ void LLViewerParcelMedia::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent  {  	switch(event)  	{ +		case MEDIA_EVENT_DEBUG_MESSAGE: +		{ +			// LL_DEBUGS("Media") <<  "Media event:  MEDIA_EVENT_DEBUG_MESSAGE " << LL_ENDL; +		}; +		break; +  		case MEDIA_EVENT_CONTENT_UPDATED:  		{  			// LL_DEBUGS("Media") <<  "Media event:  MEDIA_EVENT_CONTENT_UPDATED " << LL_ENDL; diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp index 26765bdd01..e619b89f9b 100644 --- a/indra/newview/llviewerparceloverlay.cpp +++ b/indra/newview/llviewerparceloverlay.cpp @@ -173,6 +173,92 @@ bool LLViewerParcelOverlay::encroachesOwned(const std::vector<LLBBox>& boxes) co  	}  	return false;  } +bool LLViewerParcelOverlay::encroachesOnUnowned(const std::vector<LLBBox>& boxes) const +{ +	// boxes are expected to already be axis aligned +	for (U32 i = 0; i < boxes.size(); ++i) +	{ +		LLVector3 min = boxes[i].getMinAgent(); +		LLVector3 max = boxes[i].getMaxAgent(); +		 +		S32 left   = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); +		S32 right  = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); +		S32 top    = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); +		S32 bottom = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); +		 +		for (S32 row = top; row <= bottom; row++) +		{ +			for (S32 column = left; column <= right; column++) +			{ +				U8 type = ownership(row, column); +				if ((PARCEL_SELF != type)) +				{ +					return true; +				} +			} +		} +	} +	return false; +} + +bool LLViewerParcelOverlay::encroachesOnNearbyParcel(const std::vector<LLBBox>& boxes) const +{ +	// boxes are expected to already be axis aligned +	for (U32 i = 0; i < boxes.size(); ++i) +	{ +		LLVector3 min = boxes[i].getMinAgent(); +		LLVector3 max = boxes[i].getMaxAgent(); + +		// If an object crosses region borders it crosses a parcel +		if (   min.mV[VX] < 0 +			|| min.mV[VY] < 0 +			|| max.mV[VX] > REGION_WIDTH_METERS +			|| max.mV[VY] > REGION_WIDTH_METERS) +		{ +			return true; +		} + +		S32 left   = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); +		S32 right  = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); +		S32 bottom = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); +		S32 top    = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); + +		const S32 GRIDS_PER_EDGE = mParcelGridsPerEdge; + +		for (S32 row = bottom; row <= top; row++) +		{ +			for (S32 col = left; col <= right; col++) +			{ +				// This is not the rightmost column +				if (col < GRIDS_PER_EDGE-1) +				{ +					U8 east_overlay = mOwnership[row*GRIDS_PER_EDGE+col+1]; +					// If the column to the east of the current one marks +					// the other parcel's west edge and the box extends +					// to the west it crosses the parcel border. +					if ((east_overlay & PARCEL_WEST_LINE) && col < right) +					{ +						return true; +					} +				} + +				// This is not the topmost column +				if (row < GRIDS_PER_EDGE-1) +				{ +					U8 north_overlay = mOwnership[(row+1)*GRIDS_PER_EDGE+col]; +					// If the row to the north of the current one marks +					// the other parcel's south edge and the box extends +					// to the south it crosses the parcel border. +					if ((north_overlay & PARCEL_SOUTH_LINE) && row < top) +					{ +						return true; +					} +				} +			} +		} +	} +	return false; +}  BOOL LLViewerParcelOverlay::isSoundLocal(const LLVector3& pos) const  { diff --git a/indra/newview/llviewerparceloverlay.h b/indra/newview/llviewerparceloverlay.h index c80baedda6..7445d5bf1d 100644 --- a/indra/newview/llviewerparceloverlay.h +++ b/indra/newview/llviewerparceloverlay.h @@ -60,6 +60,8 @@ public:  	// might be in another parcel. for now, we simply test axis aligned   	// bounding boxes which isn't perfect, but is close  	bool encroachesOwned(const std::vector<LLBBox>& boxes) const; +	bool encroachesOnUnowned(const std::vector<LLBBox>& boxes) const; +	bool encroachesOnNearbyParcel(const std::vector<LLBBox>& boxes) const;  	BOOL			isSoundLocal(const LLVector3& pos) const; diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h index 252183b6d7..12f6a0dd1c 100644 --- a/indra/newview/llviewerprecompiledheaders.h +++ b/indra/newview/llviewerprecompiledheaders.h @@ -120,8 +120,8 @@  // Library includes from llvfs  #include "lldir.h" -
 -// Library includes from llmessage project
 + +// Library includes from llmessage project  #include "llcachename.h"  #endif diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index bb7170e0f7..ed943964f9 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -77,6 +77,13 @@  const F32 WATER_TEXTURE_SCALE = 8.f;			//  Number of times to repeat the water texture across a region  const S16 MAX_MAP_DIST = 10; +// The server only keeps our pending agent info for 60 seconds. +// We want to allow for seed cap retry, but its not useful after that 60 seconds. +// Give it 3 chances, each at 18 seconds to give ourselves a few seconds to connect anyways if we give up. +const S32 MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN = 3; +const F32 CAP_REQUEST_TIMEOUT = 18; +// Even though we gave up on login, keep trying for caps after we are logged in: +const S32 MAX_CAP_REQUEST_ATTEMPTS = 30;  typedef std::map<std::string, std::string> CapabilityMap; @@ -86,6 +93,10 @@ public:  		:	mHost(host),  			mCompositionp(NULL),  			mEventPoll(NULL), +			mSeedCapMaxAttempts(MAX_CAP_REQUEST_ATTEMPTS), +			mSeedCapMaxAttemptsBeforeLogin(MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN), +			mSeedCapAttempts(0), +			mHttpResponderID(0),  		    // I'd prefer to set the LLCapabilityListener name to match the region  		    // name -- it's disappointing that's not available at construction time.  		    // We could instead store an LLCapabilityListener*, making @@ -100,6 +111,8 @@ public:  	{  	} +	void buildCapabilityNames(LLSD& capabilityNames); +  	// The surfaces and other layers  	LLSurface*	mLandp; @@ -132,6 +145,12 @@ public:  	LLEventPoll* mEventPoll; +	S32 mSeedCapMaxAttempts; +	S32 mSeedCapMaxAttemptsBeforeLogin; +	S32 mSeedCapAttempts; + +	S32 mHttpResponderID; +  	/// Post an event to this LLCapabilityListener to invoke a capability message on  	/// this LLViewerRegion's server  	/// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities) @@ -139,8 +158,6 @@ public:  	//spatial partitions for objects in this region  	std::vector<LLSpatialPartition*> mObjectPartition; - -	LLHTTPClient::ResponderPtr  mHttpResponderPtr ;  };  // support for secondlife:///app/region/{REGION} SLapps @@ -186,54 +203,51 @@ class BaseCapabilitiesComplete : public LLHTTPClient::Responder  {  	LOG_CLASS(BaseCapabilitiesComplete);  public: -    BaseCapabilitiesComplete(LLViewerRegion* region) -		: mRegion(region) +    BaseCapabilitiesComplete(U64 region_handle, S32 id) +		: mRegionHandle(region_handle), mID(id)      { }  	virtual ~BaseCapabilitiesComplete() -	{ -		if(mRegion) -		{ -			mRegion->setHttpResponderPtrNULL() ; -		} -	} - -	void setRegion(LLViewerRegion* region) -	{ -		mRegion = region ; -	} +	{ }      void error(U32 statusNum, const std::string& reason)      {  		LL_WARNS2("AppInit", "Capabilities") << statusNum << ": " << reason << LL_ENDL; -		 -		if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) +		LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle); +		if (regionp)  		{ -			LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED ); +			regionp->failedSeedCapability();  		}      }      void result(const LLSD& content)      { -		if(!mRegion || LLHTTPClient::ResponderPtr(this) != mRegion->getHttpResponderPtr()) //region is removed or responder is not created. +		LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle); +		if(!regionp) //region was removed +		{ +			LL_WARNS2("AppInit", "Capabilities") << "Received results for region that no longer exists!" << LL_ENDL; +			return ; +		} +		if( mID != regionp->getHttpResponderID() ) // region is no longer referring to this responder  		{ +			LL_WARNS2("AppInit", "Capabilities") << "Received results for a stale http responder!" << LL_ENDL;  			return ;  		}  		LLSD::map_const_iterator iter;  		for(iter = content.beginMap(); iter != content.endMap(); ++iter)  		{ -			mRegion->setCapability(iter->first, iter->second); +			regionp->setCapability(iter->first, iter->second);  			LL_DEBUGS2("AppInit", "Capabilities") << "got capability for "   				<< iter->first << LL_ENDL;  			/* HACK we're waiting for the ServerReleaseNotes */ -			if (iter->first == "ServerReleaseNotes" && mRegion->getReleaseNotesRequested()) +			if (iter->first == "ServerReleaseNotes" && regionp->getReleaseNotesRequested())  			{ -				mRegion->showReleaseNotes(); +				regionp->showReleaseNotes();  			}  		} -		mRegion->setCapabilitiesReceived(true); +		regionp->setCapabilitiesReceived(true);  		if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())  		{ @@ -241,15 +255,15 @@ public:  		}  	} -    static boost::intrusive_ptr<BaseCapabilitiesComplete> build( -								LLViewerRegion* region) +    static boost::intrusive_ptr<BaseCapabilitiesComplete> build( U64 region_handle, S32 id )      { -		return boost::intrusive_ptr<BaseCapabilitiesComplete>( -							 new BaseCapabilitiesComplete(region)); +		return boost::intrusive_ptr<BaseCapabilitiesComplete>(  +				new BaseCapabilitiesComplete(region_handle, id) );      }  private: -	LLViewerRegion* mRegion; +	U64 mRegionHandle; +	S32 mID;  }; @@ -340,11 +354,6 @@ void LLViewerRegion::initStats()  LLViewerRegion::~LLViewerRegion()   { -	if(mImpl->mHttpResponderPtr) -	{ -		(static_cast<BaseCapabilitiesComplete*>(mImpl->mHttpResponderPtr.get()))->setRegion(NULL) ; -	} -  	gVLManager.cleanupData(this);  	// Can't do this on destruction, because the neighbor pointers might be invalid.  	// This should be reference counted... @@ -558,6 +567,11 @@ const std::string LLViewerRegion::getSimAccessString() const  	return accessToString(mSimAccess);  } +std::string LLViewerRegion::getLocalizedSimProductName() const +{ +	std::string localized_spn; +	return LLTrans::findString(localized_spn, mProductName) ? localized_spn : mProductName; +}  // static  std::string LLViewerRegion::regionFlagsToString(U32 flags) @@ -891,14 +905,9 @@ U32 LLViewerRegion::getPacketsLost() const  	}  } -void LLViewerRegion::setHttpResponderPtrNULL() -{ -	mImpl->mHttpResponderPtr = NULL; -} - -const LLHTTPClient::ResponderPtr LLViewerRegion::getHttpResponderPtr() const +S32 LLViewerRegion::getHttpResponderID() const  { -	return mImpl->mHttpResponderPtr; +	return mImpl->mHttpResponderID;  }  BOOL LLViewerRegion::pointInRegionGlobal(const LLVector3d &point_global) const @@ -1184,6 +1193,7 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec  	eCacheUpdateResult result = CACHE_UPDATE_ADDED;  	if (mImpl->mCacheMap.size() > MAX_OBJECT_CACHE_ENTRIES)  	{ +		delete mImpl->mCacheMap.begin()->second ;  		mImpl->mCacheMap.erase(mImpl->mCacheMap.begin());  		result = CACHE_UPDATE_REPLACED; @@ -1477,24 +1487,8 @@ void LLViewerRegion::unpackRegionHandshake()  	msg->sendReliable(host);  } -void LLViewerRegion::setSeedCapability(const std::string& url) +void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)  { -	if (getCapability("Seed") == url) -    { -		// llwarns << "Ignoring duplicate seed capability" << llendl; -		return; -    } -	 -	delete mImpl->mEventPoll; -	mImpl->mEventPoll = NULL; -	 -	mImpl->mCapabilities.clear(); -	setCapability("Seed", url); - -	LLSD capabilityNames = LLSD::emptyArray(); -	 -	capabilityNames.append("AccountingParcel"); -	capabilityNames.append("AccountingSelection");  	capabilityNames.append("AttachmentResources");  	capabilityNames.append("AvatarPickerSearch");  	capabilityNames.append("ChatSessionRequest"); @@ -1524,6 +1518,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url)  	capabilityNames.append("LandResources");  	capabilityNames.append("MapLayer");  	capabilityNames.append("MapLayerGod"); +	capabilityNames.append("MeshUploadFlag");  	capabilityNames.append("NewFileAgentInventory");  	capabilityNames.append("ParcelPropertiesUpdate");  	capabilityNames.append("ParcelMediaURLFilterList"); @@ -1533,6 +1528,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url)  	capabilityNames.append("ProvisionVoiceAccountRequest");  	capabilityNames.append("RemoteParcelRequest");  	capabilityNames.append("RequestTextureDownload"); +	capabilityNames.append("ResourceCostSelected");  	capabilityNames.append("SearchStatRequest");  	capabilityNames.append("SearchStatTracking");  	capabilityNames.append("SendPostcard"); @@ -1558,53 +1554,121 @@ void LLViewerRegion::setSeedCapability(const std::string& url)  	capabilityNames.append("ViewerMetrics");  	capabilityNames.append("ViewerStartAuction");  	capabilityNames.append("ViewerStats"); -	//prep# Finalize these!!!!!!!!! -	//capabilityNames.append("AccountingVO");	 -	capabilityNames.append("AccountingParcel"); -	capabilityNames.append("AccountingRegion");  	// Please add new capabilities alphabetically to reduce  	// merge conflicts. +} + +void LLViewerRegion::setSeedCapability(const std::string& url) +{ +	if (getCapability("Seed") == url) +    { +		// llwarns << "Ignoring duplicate seed capability" << llendl; +		return; +    } +	 +	delete mImpl->mEventPoll; +	mImpl->mEventPoll = NULL; +	 +	mImpl->mCapabilities.clear(); +	setCapability("Seed", url); + +	LLSD capabilityNames = LLSD::emptyArray(); +	mImpl->buildCapabilityNames(capabilityNames);  	llinfos << "posting to seed " << url << llendl; -	mImpl->mHttpResponderPtr = BaseCapabilitiesComplete::build(this) ; -	LLHTTPClient::post(url, capabilityNames, mImpl->mHttpResponderPtr); +	S32 id = ++mImpl->mHttpResponderID; +	LLHTTPClient::post(url, capabilityNames,  +						BaseCapabilitiesComplete::build(getHandle(), id), +						LLSD(), CAP_REQUEST_TIMEOUT); +} + +S32 LLViewerRegion::getNumSeedCapRetries() +{ +	return mImpl->mSeedCapAttempts; +} + +void LLViewerRegion::failedSeedCapability() +{ +	// Should we retry asking for caps? +	mImpl->mSeedCapAttempts++; +	std::string url = getCapability("Seed"); +	if ( url.empty() ) +	{ +		LL_WARNS2("AppInit", "Capabilities") << "Failed to get seed capabilities, and can not determine url for retries!" << LL_ENDL; +		return; +	} +	// After a few attempts, continue login.  We will keep trying once in-world: +	if ( mImpl->mSeedCapAttempts >= mImpl->mSeedCapMaxAttemptsBeforeLogin && +		 STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState() ) +	{ +		LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED ); +	} + +	if ( mImpl->mSeedCapAttempts < mImpl->mSeedCapMaxAttempts) +	{ +		LLSD capabilityNames = LLSD::emptyArray(); +		mImpl->buildCapabilityNames(capabilityNames); + +		llinfos << "posting to seed " << url << " (retry "  +				<< mImpl->mSeedCapAttempts << ")" << llendl; + +		S32 id = ++mImpl->mHttpResponderID; +		LLHTTPClient::post(url, capabilityNames,  +						BaseCapabilitiesComplete::build(getHandle(), id), +						LLSD(), CAP_REQUEST_TIMEOUT); +	} +	else +	{ +		// *TODO: Give a user pop-up about this error? +		LL_WARNS2("AppInit", "Capabilities") << "Failed to get seed capabilities from '" << url << "' after " << mImpl->mSeedCapAttempts << " attempts.  Giving up!" << LL_ENDL; +	}  }  class SimulatorFeaturesReceived : public LLHTTPClient::Responder  {  	LOG_CLASS(SimulatorFeaturesReceived);  public: -    SimulatorFeaturesReceived(LLViewerRegion* region) -	: mRegion(region) +    SimulatorFeaturesReceived(const std::string& retry_url, U64 region_handle,  +			S32 attempt = 0, S32 max_attempts = MAX_CAP_REQUEST_ATTEMPTS) +	: mRetryURL(retry_url), mRegionHandle(region_handle), mAttempt(attempt), mMaxAttempts(max_attempts)      { }      void error(U32 statusNum, const std::string& reason)      {  		LL_WARNS2("AppInit", "SimulatorFeatures") << statusNum << ": " << reason << LL_ENDL; +		retry();      } -	 +      void result(const LLSD& content)      { -		if(!mRegion) //region is removed or responder is not created. +		LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle); +		if(!regionp) //region is removed or responder is not created.  		{ +			LL_WARNS2("AppInit", "SimulatorFeatures") << "Received results for region that no longer exists!" << LL_ENDL;  			return ;  		} -		mRegion->setSimulatorFeatures(content); +		regionp->setSimulatorFeatures(content);  	} -	 -    static boost::intrusive_ptr<SimulatorFeaturesReceived> build( -																 LLViewerRegion* region) -    { -		return boost::intrusive_ptr<SimulatorFeaturesReceived>( -															   new SimulatorFeaturesReceived(region)); -    } -	 +  private: -	LLViewerRegion* mRegion; +	void retry() +	{ +		if (mAttempt < mMaxAttempts) +		{ +			mAttempt++; +			LL_WARNS2("AppInit", "SimulatorFeatures") << "Re-trying '" << mRetryURL << "'.  Retry #" << mAttempt << LL_ENDL; +			LLHTTPClient::get(mRetryURL, new SimulatorFeaturesReceived(*this), LLSD(), CAP_REQUEST_TIMEOUT); +		} +	} +	 +	std::string mRetryURL; +	U64 mRegionHandle; +	S32 mAttempt; +	S32 mMaxAttempts;  }; @@ -1623,7 +1687,7 @@ void LLViewerRegion::setCapability(const std::string& name, const std::string& u  	else if (name == "SimulatorFeatures")  	{  		// kick off a request for simulator features -		LLHTTPClient::get(url, new SimulatorFeaturesReceived(this)); +		LLHTTPClient::get(url, new SimulatorFeaturesReceived(url, getHandle()), LLSD(), CAP_REQUEST_TIMEOUT);  	}  	else  	{ @@ -1713,6 +1777,23 @@ bool LLViewerRegion::objectIsReturnable(const LLVector3& pos, const std::vector<  				&& mParcelOverlay->encroachesOwned(boxes)) );  } +bool LLViewerRegion::childrenObjectReturnable( const std::vector<LLBBox>& boxes ) const +{ +	bool result = false; +	result = ( mParcelOverlay && mParcelOverlay->encroachesOnUnowned( boxes ) ) ? 1 : 0; +	return result; +} + +bool LLViewerRegion::objectsCrossParcel(const std::vector<LLBBox>& boxes) const +{ +	return mParcelOverlay && mParcelOverlay->encroachesOnNearbyParcel(boxes); +} + +void LLViewerRegion::getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegions ) +{ +	mImpl->mLandp->getNeighboringRegions( uniqueRegions ); +} +  void LLViewerRegion::showReleaseNotes()  {  	std::string url = this->getCapability("ServerReleaseNotes"); diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index f68b51ea65..c483c6ef52 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -192,7 +192,7 @@ public:  	S32 getSimCPURatio()                   const { return mCPURatio; }  	const std::string& getSimColoName()    const { return mColoName; }  	const std::string& getSimProductSKU()  const { return mProductSKU; } -	const std::string& getSimProductName() const { return mProductName; } +	std::string getLocalizedSimProductName() const;  	// Returns "Sandbox", "Expensive", etc.  	static std::string regionFlagsToString(U32 flags); @@ -226,11 +226,12 @@ public:  	U32	getPacketsLost() const; -	void setHttpResponderPtrNULL(); -	const LLHTTPClient::ResponderPtr getHttpResponderPtr() const; +	S32 getHttpResponderID() const;  	// Get/set named capability URLs for this region.  	void setSeedCapability(const std::string& url); +	void failedSeedCapability(); +	S32 getNumSeedCapRetries();  	void setCapability(const std::string& name, const std::string& url);  	// implements LLCapabilityProvider      virtual std::string getCapability(const std::string& name) const; @@ -320,6 +321,11 @@ public:  	LLSpatialPartition* getSpatialPartition(U32 type);  	bool objectIsReturnable(const LLVector3& pos, const std::vector<LLBBox>& boxes) const; +	bool childrenObjectReturnable( const std::vector<LLBBox>& boxes ) const; +	bool objectsCrossParcel(const std::vector<LLBBox>& boxes) const; + +	void getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegions ); +	  public:  	struct CompareDistance  	{ diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index e473901609..36106752a2 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -61,18 +61,31 @@ BOOL				LLViewerShaderMgr::sInitialized = FALSE;  LLVector4			gShinyOrigin; +//utility shaders +LLGLSLShader	gOcclusionProgram; +LLGLSLShader	gCustomAlphaProgram; +LLGLSLShader	gGlowCombineProgram; +LLGLSLShader	gTwoTextureAddProgram; +  //object shaders  LLGLSLShader		gObjectSimpleProgram;  LLGLSLShader		gObjectSimpleWaterProgram; +LLGLSLShader		gObjectSimpleAlphaMaskProgram; +LLGLSLShader		gObjectSimpleWaterAlphaMaskProgram;  LLGLSLShader		gObjectFullbrightProgram;  LLGLSLShader		gObjectFullbrightWaterProgram; +LLGLSLShader		gObjectFullbrightAlphaMaskProgram; +LLGLSLShader		gObjectFullbrightWaterAlphaMaskProgram;  LLGLSLShader		gObjectFullbrightShinyProgram;  LLGLSLShader		gObjectFullbrightShinyWaterProgram;  LLGLSLShader		gObjectShinyProgram;  LLGLSLShader		gObjectShinyWaterProgram; +LLGLSLShader		gObjectBumpProgram;  LLGLSLShader		gObjectSimpleNonIndexedProgram;  LLGLSLShader		gObjectSimpleNonIndexedWaterProgram; +LLGLSLShader		gObjectAlphaMaskNonIndexedProgram; +LLGLSLShader		gObjectAlphaMaskNonIndexedWaterProgram;  LLGLSLShader		gObjectFullbrightNonIndexedProgram;  LLGLSLShader		gObjectFullbrightNonIndexedWaterProgram;  LLGLSLShader		gObjectFullbrightShinyNonIndexedProgram; @@ -105,6 +118,7 @@ LLGLSLShader		gAvatarProgram;  LLGLSLShader		gAvatarWaterProgram;  LLGLSLShader		gAvatarEyeballProgram;  LLGLSLShader		gAvatarPickProgram; +LLGLSLShader		gImpostorProgram;  // WindLight shader handles  LLGLSLShader			gWLSkyProgram; @@ -121,7 +135,9 @@ LLGLSLShader			gDeferredImpostorProgram;  LLGLSLShader			gDeferredEdgeProgram;  LLGLSLShader			gDeferredWaterProgram;  LLGLSLShader			gDeferredDiffuseProgram; +LLGLSLShader			gDeferredDiffuseAlphaMaskProgram;  LLGLSLShader			gDeferredNonIndexedDiffuseProgram; +LLGLSLShader			gDeferredNonIndexedDiffuseAlphaMaskProgram;  LLGLSLShader			gDeferredSkinnedDiffuseProgram;  LLGLSLShader			gDeferredSkinnedBumpProgram;  LLGLSLShader			gDeferredSkinnedAlphaProgram; @@ -138,6 +154,7 @@ LLGLSLShader			gDeferredSunProgram;  LLGLSLShader			gDeferredBlurLightProgram;  LLGLSLShader			gDeferredSoftenProgram;  LLGLSLShader			gDeferredShadowProgram; +LLGLSLShader			gDeferredShadowAlphaMaskProgram;  LLGLSLShader			gDeferredAvatarShadowProgram;  LLGLSLShader			gDeferredAttachmentShadowProgram;  LLGLSLShader			gDeferredAlphaProgram; @@ -166,14 +183,29 @@ LLViewerShaderMgr::LLViewerShaderMgr() :  	mShaderList.push_back(&gWLCloudProgram);  	mShaderList.push_back(&gAvatarProgram);  	mShaderList.push_back(&gObjectShinyProgram); +	mShaderList.push_back(&gObjectShinyNonIndexedProgram);  	mShaderList.push_back(&gWaterProgram);  	mShaderList.push_back(&gAvatarEyeballProgram);   	mShaderList.push_back(&gObjectSimpleProgram); +	mShaderList.push_back(&gImpostorProgram); +	mShaderList.push_back(&gObjectSimpleAlphaMaskProgram); +	mShaderList.push_back(&gObjectBumpProgram); +	mShaderList.push_back(&gUIProgram); +	mShaderList.push_back(&gCustomAlphaProgram); +	mShaderList.push_back(&gGlowCombineProgram); +	mShaderList.push_back(&gTwoTextureAddProgram); +	mShaderList.push_back(&gSolidColorProgram); +	mShaderList.push_back(&gOcclusionProgram);  	mShaderList.push_back(&gObjectFullbrightProgram); +	mShaderList.push_back(&gObjectFullbrightAlphaMaskProgram);  	mShaderList.push_back(&gObjectFullbrightShinyProgram);  	mShaderList.push_back(&gObjectFullbrightShinyWaterProgram);  	mShaderList.push_back(&gObjectSimpleNonIndexedProgram); +	mShaderList.push_back(&gObjectSimpleNonIndexedWaterProgram); +	mShaderList.push_back(&gObjectAlphaMaskNonIndexedProgram); +	mShaderList.push_back(&gObjectAlphaMaskNonIndexedWaterProgram);  	mShaderList.push_back(&gObjectFullbrightNonIndexedProgram); +	mShaderList.push_back(&gObjectFullbrightNonIndexedWaterProgram);  	mShaderList.push_back(&gObjectFullbrightShinyNonIndexedProgram);  	mShaderList.push_back(&gObjectFullbrightShinyNonIndexedWaterProgram);  	mShaderList.push_back(&gSkinnedObjectSimpleProgram); @@ -188,8 +220,11 @@ LLViewerShaderMgr::LLViewerShaderMgr() :  	mShaderList.push_back(&gTerrainWaterProgram);  	mShaderList.push_back(&gObjectSimpleWaterProgram);  	mShaderList.push_back(&gObjectFullbrightWaterProgram); +	mShaderList.push_back(&gObjectSimpleWaterAlphaMaskProgram); +	mShaderList.push_back(&gObjectFullbrightWaterAlphaMaskProgram);  	mShaderList.push_back(&gAvatarWaterProgram);  	mShaderList.push_back(&gObjectShinyWaterProgram); +	mShaderList.push_back(&gObjectShinyNonIndexedWaterProgram);  	mShaderList.push_back(&gUnderWaterProgram);  	mShaderList.push_back(&gDeferredSunProgram);  	mShaderList.push_back(&gDeferredBlurLightProgram); @@ -410,9 +445,13 @@ void LLViewerShaderMgr::setShaders()  	}  	mMaxAvatarShaderLevel = 0; +	LLGLSLShader::sNoFixedFunction = false;  	if (LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable")   		&& gSavedSettings.getBOOL("VertexShaderEnable"))  	{ +		//using shaders, disable fixed function +		LLGLSLShader::sNoFixedFunction = true; +  		S32 light_class = 2;  		S32 env_class = 2;  		S32 obj_class = 2; @@ -554,6 +593,7 @@ void LLViewerShaderMgr::setShaders()  		}  		else  		{ +			LLGLSLShader::sNoFixedFunction = false;  			gPipeline.mVertexShadersEnabled = FALSE;  			gPipeline.mVertexShadersLoaded = 0;  			mVertexShaderLevel[SHADER_LIGHTING] = 0; @@ -568,6 +608,7 @@ void LLViewerShaderMgr::setShaders()  	}  	else  	{ +		LLGLSLShader::sNoFixedFunction = false;  		gPipeline.mVertexShadersEnabled = FALSE;  		gPipeline.mVertexShadersLoaded = 0;  		mVertexShaderLevel[SHADER_LIGHTING] = 0; @@ -591,10 +632,23 @@ void LLViewerShaderMgr::setShaders()  void LLViewerShaderMgr::unloadShaders()  { +	gOcclusionProgram.unload(); +	gUIProgram.unload(); +	gCustomAlphaProgram.unload(); +	gGlowCombineProgram.unload(); +	gTwoTextureAddProgram.unload(); +	gSolidColorProgram.unload(); +  	gObjectSimpleProgram.unload(); +	gImpostorProgram.unload(); +	gObjectSimpleAlphaMaskProgram.unload(); +	gObjectBumpProgram.unload();  	gObjectSimpleWaterProgram.unload(); +	gObjectSimpleWaterAlphaMaskProgram.unload();  	gObjectFullbrightProgram.unload();  	gObjectFullbrightWaterProgram.unload(); +	gObjectFullbrightAlphaMaskProgram.unload(); +	gObjectFullbrightWaterAlphaMaskProgram.unload();  	gObjectShinyProgram.unload();  	gObjectFullbrightShinyProgram.unload(); @@ -603,6 +657,8 @@ void LLViewerShaderMgr::unloadShaders()  	gObjectSimpleNonIndexedProgram.unload();  	gObjectSimpleNonIndexedWaterProgram.unload(); +	gObjectAlphaMaskNonIndexedProgram.unload(); +	gObjectAlphaMaskNonIndexedWaterProgram.unload();  	gObjectFullbrightNonIndexedProgram.unload();  	gObjectFullbrightNonIndexedWaterProgram.unload(); @@ -641,6 +697,8 @@ void LLViewerShaderMgr::unloadShaders()  	gPostNightVisionProgram.unload();  	gDeferredDiffuseProgram.unload(); +	gDeferredDiffuseAlphaMaskProgram.unload(); +	gDeferredNonIndexedDiffuseAlphaMaskProgram.unload();  	gDeferredNonIndexedDiffuseProgram.unload();  	gDeferredSkinnedDiffuseProgram.unload();  	gDeferredSkinnedBumpProgram.unload(); @@ -734,17 +792,25 @@ BOOL LLViewerShaderMgr::loadBasicShaders()  	index_channels.push_back(-1);	 shaders.push_back( make_pair( "windlight/transportF.glsl",				mVertexShaderLevel[SHADER_WINDLIGHT] ) );	  	index_channels.push_back(-1);	 shaders.push_back( make_pair( "environment/waterFogF.glsl",				mVertexShaderLevel[SHADER_WATER] ) );  	index_channels.push_back(-1);	 shaders.push_back( make_pair( "lighting/lightNonIndexedF.glsl",					mVertexShaderLevel[SHADER_LIGHTING] ) ); +	index_channels.push_back(-1);	 shaders.push_back( make_pair( "lighting/lightAlphaMaskNonIndexedF.glsl",					mVertexShaderLevel[SHADER_LIGHTING] ) );  	index_channels.push_back(-1);	 shaders.push_back( make_pair( "lighting/lightFullbrightNonIndexedF.glsl",			mVertexShaderLevel[SHADER_LIGHTING] ) ); +	index_channels.push_back(-1);	 shaders.push_back( make_pair( "lighting/lightFullbrightNonIndexedAlphaMaskF.glsl",			mVertexShaderLevel[SHADER_LIGHTING] ) );  	index_channels.push_back(-1);	 shaders.push_back( make_pair( "lighting/lightWaterNonIndexedF.glsl",				mVertexShaderLevel[SHADER_LIGHTING] ) ); +	index_channels.push_back(-1);	 shaders.push_back( make_pair( "lighting/lightWaterAlphaMaskNonIndexedF.glsl",				mVertexShaderLevel[SHADER_LIGHTING] ) );  	index_channels.push_back(-1);	 shaders.push_back( make_pair( "lighting/lightFullbrightWaterNonIndexedF.glsl",	mVertexShaderLevel[SHADER_LIGHTING] ) ); +	index_channels.push_back(-1);	 shaders.push_back( make_pair( "lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl",	mVertexShaderLevel[SHADER_LIGHTING] ) );  	index_channels.push_back(-1);	 shaders.push_back( make_pair( "lighting/lightShinyNonIndexedF.glsl",				mVertexShaderLevel[SHADER_LIGHTING] ) );  	index_channels.push_back(-1);	 shaders.push_back( make_pair( "lighting/lightFullbrightShinyNonIndexedF.glsl",	mVertexShaderLevel[SHADER_LIGHTING] ) );  	index_channels.push_back(-1);	 shaders.push_back( make_pair( "lighting/lightShinyWaterNonIndexedF.glsl",			mVertexShaderLevel[SHADER_LIGHTING] ) );  	index_channels.push_back(-1);	 shaders.push_back( make_pair( "lighting/lightFullbrightShinyWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );  	index_channels.push_back(ch);	 shaders.push_back( make_pair( "lighting/lightF.glsl",					mVertexShaderLevel[SHADER_LIGHTING] ) ); +	index_channels.push_back(ch);	 shaders.push_back( make_pair( "lighting/lightAlphaMaskF.glsl",					mVertexShaderLevel[SHADER_LIGHTING] ) );  	index_channels.push_back(ch);	 shaders.push_back( make_pair( "lighting/lightFullbrightF.glsl",			mVertexShaderLevel[SHADER_LIGHTING] ) ); +	index_channels.push_back(ch);	 shaders.push_back( make_pair( "lighting/lightFullbrightAlphaMaskF.glsl",			mVertexShaderLevel[SHADER_LIGHTING] ) );  	index_channels.push_back(ch);	 shaders.push_back( make_pair( "lighting/lightWaterF.glsl",				mVertexShaderLevel[SHADER_LIGHTING] ) ); +	index_channels.push_back(ch);	 shaders.push_back( make_pair( "lighting/lightWaterAlphaMaskF.glsl",	mVertexShaderLevel[SHADER_LIGHTING] ) );  	index_channels.push_back(ch);	 shaders.push_back( make_pair( "lighting/lightFullbrightWaterF.glsl",	mVertexShaderLevel[SHADER_LIGHTING] ) ); +	index_channels.push_back(ch);	 shaders.push_back( make_pair( "lighting/lightFullbrightWaterAlphaMaskF.glsl",	mVertexShaderLevel[SHADER_LIGHTING] ) );  	index_channels.push_back(ch);	 shaders.push_back( make_pair( "lighting/lightShinyF.glsl",				mVertexShaderLevel[SHADER_LIGHTING] ) );  	index_channels.push_back(ch);	 shaders.push_back( make_pair( "lighting/lightFullbrightShinyF.glsl",	mVertexShaderLevel[SHADER_LIGHTING] ) );  	index_channels.push_back(ch);	 shaders.push_back( make_pair( "lighting/lightShinyWaterF.glsl",			mVertexShaderLevel[SHADER_LIGHTING] ) ); @@ -990,6 +1056,8 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	{  		gDeferredTreeProgram.unload();  		gDeferredDiffuseProgram.unload(); +		gDeferredDiffuseAlphaMaskProgram.unload(); +		gDeferredNonIndexedDiffuseAlphaMaskProgram.unload();  		gDeferredNonIndexedDiffuseProgram.unload();  		gDeferredSkinnedDiffuseProgram.unload();  		gDeferredSkinnedBumpProgram.unload(); @@ -1005,6 +1073,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredBlurLightProgram.unload();  		gDeferredSoftenProgram.unload();  		gDeferredShadowProgram.unload(); +		gDeferredShadowAlphaMaskProgram.unload();  		gDeferredAvatarShadowProgram.unload();  		gDeferredAttachmentShadowProgram.unload();  		gDeferredAvatarProgram.unload(); @@ -1045,6 +1114,27 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	if (success)  	{ +		gDeferredDiffuseAlphaMaskProgram.mName = "Deferred Diffuse Alpha Mask Shader"; +		gDeferredDiffuseAlphaMaskProgram.mShaderFiles.clear(); +		gDeferredDiffuseAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB)); +		gDeferredDiffuseAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/diffuseAlphaMaskIndexedF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDeferredDiffuseAlphaMaskProgram.mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits; +		gDeferredDiffuseAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; +		success = gDeferredDiffuseAlphaMaskProgram.createShader(NULL, NULL); +	} + +	if (success) +	{ +		gDeferredNonIndexedDiffuseAlphaMaskProgram.mName = "Deferred Diffuse Non-Indexed Alpha Mask Shader"; +		gDeferredNonIndexedDiffuseAlphaMaskProgram.mShaderFiles.clear(); +		gDeferredNonIndexedDiffuseAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB)); +		gDeferredNonIndexedDiffuseAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/diffuseAlphaMaskF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDeferredNonIndexedDiffuseAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; +		success = gDeferredNonIndexedDiffuseAlphaMaskProgram.createShader(NULL, NULL); +	} + +	if (success) +	{  		gDeferredNonIndexedDiffuseProgram.mName = "Non Indexed Deferred Diffuse Shader";  		gDeferredNonIndexedDiffuseProgram.mShaderFiles.clear();  		gDeferredNonIndexedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB)); @@ -1369,6 +1459,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	if (success)  	{ +		gDeferredShadowAlphaMaskProgram.mName = "Deferred Shadow Alpha Mask Shader"; +		gDeferredShadowAlphaMaskProgram.mShaderFiles.clear(); +		gDeferredShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskV.glsl", GL_VERTEX_SHADER_ARB)); +		gDeferredShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDeferredShadowAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; +		success = gDeferredShadowAlphaMaskProgram.createShader(NULL, NULL); +	} + +	if (success) +	{  		gDeferredAvatarShadowProgram.mName = "Deferred Avatar Shadow Shader";  		gDeferredAvatarShadowProgram.mFeatures.hasSkinning = true;  		gDeferredAvatarShadowProgram.mShaderFiles.clear(); @@ -1581,15 +1681,23 @@ BOOL LLViewerShaderMgr::loadShadersObject()  		gObjectFullbrightShinyWaterProgram.unload();  		gObjectShinyWaterProgram.unload();  		gObjectSimpleProgram.unload(); +		gImpostorProgram.unload(); +		gObjectSimpleAlphaMaskProgram.unload(); +		gObjectBumpProgram.unload();  		gObjectSimpleWaterProgram.unload(); +		gObjectSimpleWaterAlphaMaskProgram.unload();  		gObjectFullbrightProgram.unload(); +		gObjectFullbrightAlphaMaskProgram.unload();  		gObjectFullbrightWaterProgram.unload(); +		gObjectFullbrightWaterAlphaMaskProgram.unload();  		gObjectShinyNonIndexedProgram.unload();  		gObjectFullbrightShinyNonIndexedProgram.unload();  		gObjectFullbrightShinyNonIndexedWaterProgram.unload();  		gObjectShinyNonIndexedWaterProgram.unload();  		gObjectSimpleNonIndexedProgram.unload();  		gObjectSimpleNonIndexedWaterProgram.unload(); +		gObjectAlphaMaskNonIndexedProgram.unload(); +		gObjectAlphaMaskNonIndexedWaterProgram.unload();  		gObjectFullbrightNonIndexedProgram.unload();  		gObjectFullbrightNonIndexedWaterProgram.unload();  		gSkinnedObjectSimpleProgram.unload(); @@ -1639,6 +1747,41 @@ BOOL LLViewerShaderMgr::loadShadersObject()  	if (success)  	{ +		gObjectAlphaMaskNonIndexedProgram.mName = "Non indexed alpha mask Shader"; +		gObjectAlphaMaskNonIndexedProgram.mFeatures.calculatesLighting = true; +		gObjectAlphaMaskNonIndexedProgram.mFeatures.calculatesAtmospherics = true; +		gObjectAlphaMaskNonIndexedProgram.mFeatures.hasGamma = true; +		gObjectAlphaMaskNonIndexedProgram.mFeatures.hasAtmospherics = true; +		gObjectAlphaMaskNonIndexedProgram.mFeatures.hasLighting = true; +		gObjectAlphaMaskNonIndexedProgram.mFeatures.disableTextureIndex = true; +		gObjectAlphaMaskNonIndexedProgram.mFeatures.hasAlphaMask = true; +		gObjectAlphaMaskNonIndexedProgram.mShaderFiles.clear(); +		gObjectAlphaMaskNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB)); +		gObjectAlphaMaskNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gObjectAlphaMaskNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; +		success = gObjectAlphaMaskNonIndexedProgram.createShader(NULL, NULL); +	} +	 +	if (success) +	{ +		gObjectAlphaMaskNonIndexedWaterProgram.mName = "Non indexed alpha mask Water Shader"; +		gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.calculatesLighting = true; +		gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true; +		gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.hasWaterFog = true; +		gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.hasAtmospherics = true; +		gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.hasLighting = true; +		gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.disableTextureIndex = true; +		gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.hasAlphaMask = true; +		gObjectAlphaMaskNonIndexedWaterProgram.mShaderFiles.clear(); +		gObjectAlphaMaskNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB)); +		gObjectAlphaMaskNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gObjectAlphaMaskNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; +		gObjectAlphaMaskNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; +		success = gObjectAlphaMaskNonIndexedWaterProgram.createShader(NULL, NULL); +	} + +	if (success) +	{  		gObjectFullbrightNonIndexedProgram.mName = "Non Indexed Fullbright Shader";  		gObjectFullbrightNonIndexedProgram.mFeatures.calculatesAtmospherics = true;  		gObjectFullbrightNonIndexedProgram.mFeatures.hasGamma = true; @@ -1737,6 +1880,17 @@ BOOL LLViewerShaderMgr::loadShadersObject()  	if (success)  	{ +		gImpostorProgram.mName = "Impostor Shader"; +		gImpostorProgram.mFeatures.disableTextureIndex = true; +		gImpostorProgram.mShaderFiles.clear(); +		gImpostorProgram.mShaderFiles.push_back(make_pair("objects/impostorV.glsl", GL_VERTEX_SHADER_ARB)); +		gImpostorProgram.mShaderFiles.push_back(make_pair("objects/impostorF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gImpostorProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; +		success = gImpostorProgram.createShader(NULL, NULL); +	} + +	if (success) +	{  		gObjectSimpleProgram.mName = "Simple Shader";  		gObjectSimpleProgram.mFeatures.calculatesLighting = true;  		gObjectSimpleProgram.mFeatures.calculatesAtmospherics = true; @@ -1750,6 +1904,39 @@ BOOL LLViewerShaderMgr::loadShadersObject()  		gObjectSimpleProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];  		success = gObjectSimpleProgram.createShader(NULL, NULL);  	} + +	if (success) +	{ +		gObjectSimpleAlphaMaskProgram.mName = "Simple Alpha Mask Shader"; +		gObjectSimpleAlphaMaskProgram.mFeatures.calculatesLighting = true; +		gObjectSimpleAlphaMaskProgram.mFeatures.calculatesAtmospherics = true; +		gObjectSimpleAlphaMaskProgram.mFeatures.hasGamma = true; +		gObjectSimpleAlphaMaskProgram.mFeatures.hasAtmospherics = true; +		gObjectSimpleAlphaMaskProgram.mFeatures.hasLighting = true; +		gObjectSimpleAlphaMaskProgram.mFeatures.hasAlphaMask = true; +		gObjectSimpleAlphaMaskProgram.mFeatures.mIndexedTextureChannels = 0; +		gObjectSimpleAlphaMaskProgram.mShaderFiles.clear(); +		gObjectSimpleAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB)); +		gObjectSimpleAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gObjectSimpleAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; +		success = gObjectSimpleAlphaMaskProgram.createShader(NULL, NULL); +	} +	 +	if (success) +	{ +		gObjectBumpProgram.mName = "Bump Shader"; +		/*gObjectBumpProgram.mFeatures.calculatesLighting = true; +		gObjectBumpProgram.mFeatures.calculatesAtmospherics = true; +		gObjectBumpProgram.mFeatures.hasGamma = true; +		gObjectBumpProgram.mFeatures.hasAtmospherics = true; +		gObjectBumpProgram.mFeatures.hasLighting = true; +		gObjectBumpProgram.mFeatures.mIndexedTextureChannels = 0;*/ +		gObjectBumpProgram.mShaderFiles.clear(); +		gObjectBumpProgram.mShaderFiles.push_back(make_pair("objects/bumpV.glsl", GL_VERTEX_SHADER_ARB)); +		gObjectBumpProgram.mShaderFiles.push_back(make_pair("objects/bumpF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gObjectBumpProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; +		success = gObjectBumpProgram.createShader(NULL, NULL); +	}  	if (success)  	{ @@ -1770,6 +1957,24 @@ BOOL LLViewerShaderMgr::loadShadersObject()  	if (success)  	{ +		gObjectSimpleWaterAlphaMaskProgram.mName = "Simple Water Alpha Mask Shader"; +		gObjectSimpleWaterAlphaMaskProgram.mFeatures.calculatesLighting = true; +		gObjectSimpleWaterAlphaMaskProgram.mFeatures.calculatesAtmospherics = true; +		gObjectSimpleWaterAlphaMaskProgram.mFeatures.hasWaterFog = true; +		gObjectSimpleWaterAlphaMaskProgram.mFeatures.hasAtmospherics = true; +		gObjectSimpleWaterAlphaMaskProgram.mFeatures.hasLighting = true; +		gObjectSimpleWaterAlphaMaskProgram.mFeatures.hasAlphaMask = true; +		gObjectSimpleWaterAlphaMaskProgram.mFeatures.mIndexedTextureChannels = 0; +		gObjectSimpleWaterAlphaMaskProgram.mShaderFiles.clear(); +		gObjectSimpleWaterAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB)); +		gObjectSimpleWaterAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gObjectSimpleWaterAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; +		gObjectSimpleWaterAlphaMaskProgram.mShaderGroup = LLGLSLShader::SG_WATER; +		success = gObjectSimpleWaterAlphaMaskProgram.createShader(NULL, NULL); +	} + +	if (success) +	{  		gObjectFullbrightProgram.mName = "Fullbright Shader";  		gObjectFullbrightProgram.mFeatures.calculatesAtmospherics = true;  		gObjectFullbrightProgram.mFeatures.hasGamma = true; @@ -1801,6 +2006,39 @@ BOOL LLViewerShaderMgr::loadShadersObject()  	if (success)  	{ +		gObjectFullbrightAlphaMaskProgram.mName = "Fullbright Alpha Mask Shader"; +		gObjectFullbrightAlphaMaskProgram.mFeatures.calculatesAtmospherics = true; +		gObjectFullbrightAlphaMaskProgram.mFeatures.hasGamma = true; +		gObjectFullbrightAlphaMaskProgram.mFeatures.hasTransport = true; +		gObjectFullbrightAlphaMaskProgram.mFeatures.isFullbright = true; +		gObjectFullbrightAlphaMaskProgram.mFeatures.hasAlphaMask = true; +		gObjectFullbrightAlphaMaskProgram.mFeatures.mIndexedTextureChannels = 0; +		gObjectFullbrightAlphaMaskProgram.mShaderFiles.clear(); +		gObjectFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB)); +		gObjectFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gObjectFullbrightAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; +		success = gObjectFullbrightAlphaMaskProgram.createShader(NULL, NULL); +	} + +	if (success) +	{ +		gObjectFullbrightWaterAlphaMaskProgram.mName = "Fullbright Water Shader"; +		gObjectFullbrightWaterAlphaMaskProgram.mFeatures.calculatesAtmospherics = true; +		gObjectFullbrightWaterAlphaMaskProgram.mFeatures.isFullbright = true; +		gObjectFullbrightWaterAlphaMaskProgram.mFeatures.hasWaterFog = true;		 +		gObjectFullbrightWaterAlphaMaskProgram.mFeatures.hasTransport = true; +		gObjectFullbrightWaterAlphaMaskProgram.mFeatures.hasAlphaMask = true; +		gObjectFullbrightWaterAlphaMaskProgram.mFeatures.mIndexedTextureChannels = 0; +		gObjectFullbrightWaterAlphaMaskProgram.mShaderFiles.clear(); +		gObjectFullbrightWaterAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB)); +		gObjectFullbrightWaterAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gObjectFullbrightWaterAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; +		gObjectFullbrightWaterAlphaMaskProgram.mShaderGroup = LLGLSLShader::SG_WATER; +		success = gObjectFullbrightWaterAlphaMaskProgram.createShader(NULL, NULL); +	} + +	if (success) +	{  		gObjectShinyProgram.mName = "Shiny Shader";  		gObjectShinyProgram.mFeatures.calculatesAtmospherics = true;  		gObjectShinyProgram.mFeatures.calculatesLighting = true; @@ -2043,6 +2281,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()  		gAvatarProgram.mFeatures.hasGamma = true;  		gAvatarProgram.mFeatures.hasAtmospherics = true;  		gAvatarProgram.mFeatures.hasLighting = true; +		gAvatarProgram.mFeatures.hasAlphaMask = true;  		gAvatarProgram.mFeatures.disableTextureIndex = true;  		gAvatarProgram.mShaderFiles.clear();  		gAvatarProgram.mShaderFiles.push_back(make_pair("avatar/avatarV.glsl", GL_VERTEX_SHADER_ARB)); @@ -2059,6 +2298,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()  			gAvatarWaterProgram.mFeatures.hasWaterFog = true;  			gAvatarWaterProgram.mFeatures.hasAtmospherics = true;  			gAvatarWaterProgram.mFeatures.hasLighting = true; +			gAvatarWaterProgram.mFeatures.hasAlphaMask = true;  			gAvatarWaterProgram.mFeatures.disableTextureIndex = true;  			gAvatarWaterProgram.mShaderFiles.clear();  			gAvatarWaterProgram.mShaderFiles.push_back(make_pair("avatar/avatarV.glsl", GL_VERTEX_SHADER_ARB)); @@ -2097,6 +2337,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()  		gAvatarEyeballProgram.mFeatures.hasGamma = true;  		gAvatarEyeballProgram.mFeatures.hasAtmospherics = true;  		gAvatarEyeballProgram.mFeatures.hasLighting = true; +		gAvatarEyeballProgram.mFeatures.hasAlphaMask = true;  		gAvatarEyeballProgram.mFeatures.disableTextureIndex = true;  		gAvatarEyeballProgram.mShaderFiles.clear();  		gAvatarEyeballProgram.mShaderFiles.push_back(make_pair("avatar/eyeballV.glsl", GL_VERTEX_SHADER_ARB)); @@ -2135,6 +2376,85 @@ BOOL LLViewerShaderMgr::loadShadersInterface()  		success = gHighlightProgram.createShader(NULL, NULL);  	} +	if (success) +	{ +		gUIProgram.mName = "UI Shader"; +		gUIProgram.mShaderFiles.clear(); +		gUIProgram.mShaderFiles.push_back(make_pair("interface/uiV.glsl", GL_VERTEX_SHADER_ARB)); +		gUIProgram.mShaderFiles.push_back(make_pair("interface/uiF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gUIProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; +		success = gUIProgram.createShader(NULL, NULL); +	} + +	if (success) +	{ +		gCustomAlphaProgram.mName = "Custom Alpha Shader"; +		gCustomAlphaProgram.mShaderFiles.clear(); +		gCustomAlphaProgram.mShaderFiles.push_back(make_pair("interface/customalphaV.glsl", GL_VERTEX_SHADER_ARB)); +		gCustomAlphaProgram.mShaderFiles.push_back(make_pair("interface/customalphaF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gCustomAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; +		success = gCustomAlphaProgram.createShader(NULL, NULL); +	} + +	if (success) +	{ +		gGlowCombineProgram.mName = "Glow Combine Shader"; +		gGlowCombineProgram.mShaderFiles.clear(); +		gGlowCombineProgram.mShaderFiles.push_back(make_pair("interface/glowcombineV.glsl", GL_VERTEX_SHADER_ARB)); +		gGlowCombineProgram.mShaderFiles.push_back(make_pair("interface/glowcombineF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gGlowCombineProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; +		success = gGlowCombineProgram.createShader(NULL, NULL); +		if (success) +		{ +			gGlowCombineProgram.bind(); +			gGlowCombineProgram.uniform1i("glowMap", 0); +			gGlowCombineProgram.uniform1i("screenMap", 1); +			gGlowCombineProgram.unbind(); +		} +	} + +	if (success) +	{ +		gTwoTextureAddProgram.mName = "Two Texture Add Shader"; +		gTwoTextureAddProgram.mShaderFiles.clear(); +		gTwoTextureAddProgram.mShaderFiles.push_back(make_pair("interface/twotextureaddV.glsl", GL_VERTEX_SHADER_ARB)); +		gTwoTextureAddProgram.mShaderFiles.push_back(make_pair("interface/twotextureaddF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gTwoTextureAddProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; +		success = gTwoTextureAddProgram.createShader(NULL, NULL); +		if (success) +		{ +			gTwoTextureAddProgram.bind(); +			gTwoTextureAddProgram.uniform1i("tex0", 0); +			gTwoTextureAddProgram.uniform1i("tex1", 1); +		} +	} + +	if (success) +	{ +		gSolidColorProgram.mName = "Solid Color Shader"; +		gSolidColorProgram.mShaderFiles.clear(); +		gSolidColorProgram.mShaderFiles.push_back(make_pair("interface/solidcolorV.glsl", GL_VERTEX_SHADER_ARB)); +		gSolidColorProgram.mShaderFiles.push_back(make_pair("interface/solidcolorF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gSolidColorProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; +		success = gSolidColorProgram.createShader(NULL, NULL); +		if (success) +		{ +			gSolidColorProgram.bind(); +			gSolidColorProgram.uniform1i("tex0", 0); +			gSolidColorProgram.unbind(); +		} +	} + +	if (success) +	{ +		gOcclusionProgram.mName = "Occlusion Shader"; +		gOcclusionProgram.mShaderFiles.clear(); +		gOcclusionProgram.mShaderFiles.push_back(make_pair("interface/occlusionV.glsl", GL_VERTEX_SHADER_ARB)); +		gOcclusionProgram.mShaderFiles.push_back(make_pair("interface/occlusionF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gOcclusionProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; +		success = gOcclusionProgram.createShader(NULL, NULL); +	} +  	if( !success )  	{  		mVertexShaderLevel[SHADER_INTERFACE] = 0; diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index efef9ec5b2..d4040f11e1 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -287,15 +287,30 @@ inline bool operator != (LLViewerShaderMgr::shader_iter const & a, LLViewerShade  extern LLVector4			gShinyOrigin; +//utility shaders +extern LLGLSLShader			gOcclusionProgram; +extern LLGLSLShader			gCustomAlphaProgram; +extern LLGLSLShader			gGlowCombineProgram; + +//output tex0[tc0] + tex1[tc1] +extern LLGLSLShader			gTwoTextureAddProgram; +								  //object shaders  extern LLGLSLShader			gObjectSimpleProgram; +extern LLGLSLShader			gObjectSimpleAlphaMaskProgram;  extern LLGLSLShader			gObjectSimpleWaterProgram; +extern LLGLSLShader			gObjectSimpleWaterAlphaMaskProgram;  extern LLGLSLShader			gObjectSimpleNonIndexedProgram;  extern LLGLSLShader			gObjectSimpleNonIndexedWaterProgram; +extern LLGLSLShader			gObjectAlphaMaskNonIndexedProgram; +extern LLGLSLShader			gObjectAlphaMaskNonIndexedWaterProgram;  extern LLGLSLShader			gObjectFullbrightProgram;  extern LLGLSLShader			gObjectFullbrightWaterProgram; +extern LLGLSLShader			gObjectFullbrightAlphaMaskProgram; +extern LLGLSLShader			gObjectFullbrightWaterAlphaMaskProgram;  extern LLGLSLShader			gObjectFullbrightNonIndexedProgram;  extern LLGLSLShader			gObjectFullbrightNonIndexedWaterProgram; +extern LLGLSLShader			gObjectBumpProgram;  extern LLGLSLShader			gObjectSimpleLODProgram;  extern LLGLSLShader			gObjectFullbrightLODProgram; @@ -336,6 +351,7 @@ extern LLGLSLShader			gAvatarProgram;  extern LLGLSLShader			gAvatarWaterProgram;  extern LLGLSLShader			gAvatarEyeballProgram;  extern LLGLSLShader			gAvatarPickProgram; +extern LLGLSLShader			gImpostorProgram;  // WindLight shader handles  extern LLGLSLShader			gWLSkyProgram; @@ -350,6 +366,8 @@ extern LLGLSLShader			gDeferredImpostorProgram;  extern LLGLSLShader			gDeferredEdgeProgram;  extern LLGLSLShader			gDeferredWaterProgram;  extern LLGLSLShader			gDeferredDiffuseProgram; +extern LLGLSLShader			gDeferredDiffuseAlphaMaskProgram; +extern LLGLSLShader			gDeferredNonIndexedDiffuseAlphaMaskProgram;  extern LLGLSLShader			gDeferredNonIndexedDiffuseProgram;  extern LLGLSLShader			gDeferredSkinnedDiffuseProgram;  extern LLGLSLShader			gDeferredSkinnedBumpProgram; @@ -368,6 +386,7 @@ extern LLGLSLShader			gDeferredBlurLightProgram;  extern LLGLSLShader			gDeferredAvatarProgram;  extern LLGLSLShader			gDeferredSoftenProgram;  extern LLGLSLShader			gDeferredShadowProgram; +extern LLGLSLShader			gDeferredShadowAlphaMaskProgram;  extern LLGLSLShader			gDeferredPostGIProgram;  extern LLGLSLShader			gDeferredPostProgram;  extern LLGLSLShader			gDeferredPostNoDoFProgram; diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 0fb94bc44b..c88122f22c 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -854,7 +854,7 @@ void send_stats()  	body["DisplayNamesEnabled"] = gSavedSettings.getBOOL("UseDisplayNames");  	body["DisplayNamesShowUsername"] = gSavedSettings.getBOOL("NameTagShowUsernames"); -	body["MinimalSkin"] = !gSavedSettings.getString("SessionSettingsFile").empty(); +	body["MinimalSkin"] = false;  	LLViewerStats::getInstance()->addToMessage(body);  	LLHTTPClient::post(url, body, new ViewerStatsResponder()); diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 4798bb536f..0a9fae68a6 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -32,6 +32,7 @@  #include "llaudioengine.h"  #include "llavataractions.h"  #include "llfloaterreg.h" +#include "llfloatersidepanelcontainer.h"  #include "llfloaterworldmap.h"  #include "llfocusmgr.h"  #include "llinventorybridge.h" @@ -50,7 +51,6 @@  #include "llpreviewtexture.h"  #include "llscrollbar.h"  #include "llscrollcontainer.h" -#include "llsidetray.h"  #include "lltooldraganddrop.h"  #include "lltooltip.h"  #include "lltrans.h" @@ -80,7 +80,7 @@ public:  		LLSD key;  		key["type"] = "landmark";  		key["id"] = landmark_inv_id; -		LLSideTray::getInstance()->showPanel("panel_places", key); +		LLFloaterSidePanelContainer::showPanel("places", key);  	}  	static void processForeignLandmark(LLLandmark* landmark,  			const LLUUID& object_id, const LLUUID& notecard_inventory_id, diff --git a/indra/newview/llviewertexteditor.h b/indra/newview/llviewertexteditor.h index 0861dfcb20..fb428d0dc1 100644 --- a/indra/newview/llviewertexteditor.h +++ b/indra/newview/llviewertexteditor.h @@ -36,12 +36,7 @@ class LLViewerTextEditor : public LLTextEditor  {  public:  	struct Params : public LLInitParam::Block<Params, LLTextEditor::Params> -	{ -		Params() -		{ -			name = "text_editor"; -		} -	}; +	{};  protected:  	LLViewerTextEditor(const Params&); diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 4da0f80a00..280337be0f 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -66,6 +66,7 @@  // statics  LLPointer<LLViewerTexture>        LLViewerTexture::sNullImagep = NULL; +LLPointer<LLViewerTexture>        LLViewerTexture::sBlackImagep = NULL;  LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sMissingAssetImagep = NULL;  LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sWhiteImagep = NULL;  LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sDefaultImagep = NULL; @@ -295,17 +296,23 @@ LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromHost(const  void LLViewerTextureManager::init()  { -	LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,3); -	raw->clear(0x77, 0x77, 0x77, 0xFF); -	LLViewerTexture::sNullImagep = LLViewerTextureManager::getLocalTexture(raw.get(), TRUE) ; - -#if 1 -	LLPointer<LLViewerFetchedTexture> imagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT); -	LLViewerFetchedTexture::sDefaultImagep = imagep; +	{ +		LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,3); +		raw->clear(0x77, 0x77, 0x77, 0xFF); +		LLViewerTexture::sNullImagep = LLViewerTextureManager::getLocalTexture(raw.get(), TRUE) ; +	}  	const S32 dim = 128;  	LLPointer<LLImageRaw> image_raw = new LLImageRaw(dim,dim,3);  	U8* data = image_raw->getData(); +	 +	memset(data, 0, dim * dim * 3) ; +	LLViewerTexture::sBlackImagep = LLViewerTextureManager::getLocalTexture(image_raw.get(), TRUE) ; + +#if 1 +	LLPointer<LLViewerFetchedTexture> imagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT); +	LLViewerFetchedTexture::sDefaultImagep = imagep; +	  	for (S32 i = 0; i<dim; i++)  	{  		for (S32 j = 0; j<dim; j++) @@ -359,6 +366,7 @@ void LLViewerTextureManager::cleanup()  	LLImageGL::sDefaultGLTexture = NULL ;  	LLViewerTexture::sNullImagep = NULL; +	LLViewerTexture::sBlackImagep = NULL;  	LLViewerFetchedTexture::sDefaultImagep = NULL;	  	LLViewerFetchedTexture::sSmokeImagep = NULL;  	LLViewerFetchedTexture::sMissingAssetImagep = NULL; @@ -599,7 +607,7 @@ bool LLViewerTexture::bindDefaultImage(S32 stage)  	}  	if (!res && LLViewerTexture::sNullImagep.notNull() && (this != LLViewerTexture::sNullImagep))  	{ -		res = gGL.getTexUnit(stage)->bind(LLViewerTexture::sNullImagep) ; +		res = gGL.getTexUnit(stage)->bind(LLViewerTexture::sNullImagep);  	}  	if (!res)  	{ @@ -3101,9 +3109,16 @@ void LLViewerLODTexture::processTextureStats()  	{  		mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, (S8)mDesiredSavedRawDiscardLevel) ;  	} +	else if(LLPipeline::sMemAllocationThrottled)//release memory of large textures by decrease their resolutions. +	{ +		if(scaleDown()) +		{ +			mDesiredDiscardLevel = mCachedRawDiscardLevel ; +		} +	}  } -void LLViewerLODTexture::scaleDown() +bool LLViewerLODTexture::scaleDown()  {  	if(hasGLTexture() && mCachedRawDiscardLevel > getDiscardLevel())  	{		 @@ -3114,7 +3129,10 @@ void LLViewerLODTexture::scaleDown()  		{  			tester->setStablizingTime() ;  		} + +		return true ;  	} +	return false ;  }  //----------------------------------------------------------------------------------------------  //end of LLViewerLODTexture diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index c5b8c8923a..a4a5ae0a5b 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -330,6 +330,7 @@ public:  	static BOOL sUseTextureAtlas ;  	static LLPointer<LLViewerTexture> sNullImagep; // Null texture for non-textured objects. +	static LLPointer<LLViewerTexture> sBlackImagep;	// Texture to show NOTHING (pure black)  }; @@ -596,7 +597,7 @@ public:  private:  	void init(bool firstinit) ; -	void scaleDown() ;		 +	bool scaleDown() ;		  private:  	F32 mDiscardVirtualSize;		// Virtual size used to calculate desired discard	 diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index d24174adea..c64488251a 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -115,7 +115,7 @@ void LLViewerTextureList::doPreloadImages()  	// Set the "white" image  	LLViewerFetchedTexture::sWhiteImagep = LLViewerTextureManager::getFetchedTextureFromFile("white.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI); -	 +	LLTexUnit::sWhiteTexture = LLViewerFetchedTexture::sWhiteImagep->getTexName();  	LLUIImageList* image_list = LLUIImageList::getInstance();  	image_list->initFromFile(); @@ -1342,7 +1342,8 @@ LLUIImagePtr LLUIImageList::getUIImageByID(const LLUUID& image_id, S32 priority)  	const BOOL use_mips = FALSE;  	const LLRect scale_rect = LLRect::null; -	return loadUIImageByID(image_id, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority); +	const LLRect clip_rect = LLRect::null; +	return loadUIImageByID(image_id, use_mips, scale_rect, clip_rect, (LLViewerTexture::EBoostLevel)priority);  }  LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priority) @@ -1356,32 +1357,33 @@ LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priori  	const BOOL use_mips = FALSE;  	const LLRect scale_rect = LLRect::null; -	return loadUIImageByName(image_name, image_name, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority); +	const LLRect clip_rect = LLRect::null; +	return loadUIImageByName(image_name, image_name, use_mips, scale_rect, clip_rect, (LLViewerTexture::EBoostLevel)priority);  }  LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std::string& filename, -											  BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority ) +											  BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLViewerTexture::EBoostLevel boost_priority )  {  	if (boost_priority == LLViewerTexture::BOOST_NONE)  	{  		boost_priority = LLViewerTexture::BOOST_UI;  	}  	LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTextureFromFile(filename, MIPMAP_NO, boost_priority); -	return loadUIImage(imagep, name, use_mips, scale_rect); +	return loadUIImage(imagep, name, use_mips, scale_rect, clip_rect);  }  LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id, -											BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority) +											BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLViewerTexture::EBoostLevel boost_priority)  {  	if (boost_priority == LLViewerTexture::BOOST_NONE)  	{  		boost_priority = LLViewerTexture::BOOST_UI;  	}  	LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(id, MIPMAP_NO, boost_priority); -	return loadUIImage(imagep, id.asString(), use_mips, scale_rect); +	return loadUIImage(imagep, id.asString(), use_mips, scale_rect, clip_rect);  } -LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips, const LLRect& scale_rect) +LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect)  {  	if (!imagep) return NULL; @@ -1402,13 +1404,14 @@ LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const st  		LLUIImageLoadData* datap = new LLUIImageLoadData;  		datap->mImageName = name;  		datap->mImageScaleRegion = scale_rect; +		datap->mImageClipRegion = clip_rect;  		imagep->setLoadedCallback(onUIImageLoaded, 0, FALSE, FALSE, datap, NULL);  	}  	return new_imagep;  } -LLUIImagePtr LLUIImageList::preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect) +LLUIImagePtr LLUIImageList::preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect)  {  	// look for existing image  	uuid_ui_image_map_t::iterator found_it = mUIImages.find(name); @@ -1418,7 +1421,7 @@ LLUIImagePtr LLUIImageList::preloadUIImage(const std::string& name, const std::s  		llerrs << "UI Image " << name << " already loaded." << llendl;  	} -	return loadUIImageByName(name, filename, use_mips, scale_rect); +	return loadUIImageByName(name, filename, use_mips, scale_rect, clip_rect);  }  //static  @@ -1432,6 +1435,7 @@ void LLUIImageList::onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_v  	LLUIImageLoadData* image_datap = (LLUIImageLoadData*)user_data;  	std::string ui_image_name = image_datap->mImageName;  	LLRect scale_rect = image_datap->mImageScaleRegion; +	LLRect clip_rect = image_datap->mImageClipRegion;  	if (final)  	{  		delete image_datap; @@ -1448,9 +1452,21 @@ void LLUIImageList::onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_v  		// from power-of-2 gl image  		if (success && imagep.notNull() && src_vi && (src_vi->getUrl().compare(0, 7, "file://")==0))  		{ -			F32 clip_x = (F32)src_vi->getOriginalWidth() / (F32)src_vi->getFullWidth(); -			F32 clip_y = (F32)src_vi->getOriginalHeight() / (F32)src_vi->getFullHeight(); -			imagep->setClipRegion(LLRectf(0.f, clip_y, clip_x, 0.f)); +			F32 full_width = (F32)src_vi->getFullWidth(); +			F32 full_height = (F32)src_vi->getFullHeight(); +			F32 clip_x = (F32)src_vi->getOriginalWidth() / full_width; +			F32 clip_y = (F32)src_vi->getOriginalHeight() / full_height; +			if (clip_rect != LLRect::null) +			{ +				imagep->setClipRegion(LLRectf(llclamp((F32)clip_rect.mLeft / full_width, 0.f, 1.f), +											llclamp((F32)clip_rect.mTop / full_height, 0.f, 1.f), +											llclamp((F32)clip_rect.mRight / full_width, 0.f, 1.f), +											llclamp((F32)clip_rect.mBottom / full_height, 0.f, 1.f))); +			} +			else +			{ +				imagep->setClipRegion(LLRectf(0.f, clip_y, clip_x, 0.f)); +			}  			if (scale_rect != LLRect::null)  			{  				imagep->setScaleRegion( @@ -1471,6 +1487,7 @@ struct UIImageDeclaration : public LLInitParam::Block<UIImageDeclaration>  	Optional<std::string>	file_name;  	Optional<bool>			preload;  	Optional<LLRect>		scale; +	Optional<LLRect>		clip;  	Optional<bool>			use_mips;  	UIImageDeclaration() @@ -1478,6 +1495,7 @@ struct UIImageDeclaration : public LLInitParam::Block<UIImageDeclaration>  		file_name("file_name"),  		preload("preload", false),  		scale("scale"), +		clip("clip"),  		use_mips("use_mips", false)  	{}  }; @@ -1572,7 +1590,7 @@ bool LLUIImageList::initFromFile()  			{  				continue;  			} -			preloadUIImage(image.name, file_name, image.use_mips, image.scale); +			preloadUIImage(image.name, file_name, image.use_mips, image.scale, image.clip);  		}  		if (cur_pass == PASS_DECODE_NOW && !gSavedSettings.getBOOL("NoPreload")) diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h index 7f4dd0ae88..e0a362596d 100644 --- a/indra/newview/llviewertexturelist.h +++ b/indra/newview/llviewertexturelist.h @@ -220,24 +220,27 @@ public:  	bool initFromFile(); -	LLPointer<LLUIImage> preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect); +	LLPointer<LLUIImage> preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect);  	static void onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );  private:  	LLPointer<LLUIImage> loadUIImageByName(const std::string& name, const std::string& filename,  		                           BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,  +								   const LLRect& clip_rect = LLRect::null,  		                           LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);  	LLPointer<LLUIImage> loadUIImageByID(const LLUUID& id,  								 BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,  +								 const LLRect& clip_rect = LLRect::null,  								 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI); -	LLPointer<LLUIImage> loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null); +	LLPointer<LLUIImage> loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, const LLRect& clip_rect = LLRect::null);  	struct LLUIImageLoadData  	{  		std::string mImageName;  		LLRect mImageScaleRegion; +		LLRect mImageClipRegion;  	};  	typedef std::map< std::string, LLPointer<LLUIImage> > uuid_ui_image_map_t; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index cff166b825..b84db6b1c0 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -36,6 +36,7 @@  #include <iostream>  #include <fstream>  #include <algorithm> +#include <boost/lambda/core.hpp>  #include "llagent.h"  #include "llagentcamera.h" @@ -84,6 +85,7 @@  // newview includes  #include "llagent.h"  #include "llbox.h" +#include "llchicletbar.h"  #include "llconsole.h"  #include "llviewercontrol.h"  #include "llcylinder.h" @@ -132,7 +134,6 @@  #include "llpreviewtexture.h"  #include "llprogressview.h"  #include "llresmgr.h" -#include "llsidetray.h"  #include "llselectmgr.h"  #include "llrootview.h"  #include "llrendersphere.h" @@ -147,6 +148,7 @@  #include "lltexturefetch.h"  #include "lltextureview.h"  #include "lltool.h" +#include "lltoolbarview.h"  #include "lltoolcomp.h"  #include "lltooldraganddrop.h"  #include "lltoolface.h" @@ -186,7 +188,6 @@  #include "llviewerjoystick.h"  #include "llviewernetwork.h"  #include "llpostprocess.h" -#include "llbottomtray.h"  #include "llnearbychatbar.h"  #include "llagentui.h"  #include "llwearablelist.h" @@ -198,6 +199,7 @@  #include "llfloaternotificationsconsole.h"  #include "llnearbychat.h" +#include "llwindowlistener.h"  #include "llviewerwindowlistener.h"  #include "llpaneltopinfobar.h" @@ -240,8 +242,6 @@ BOOL				gDisplayBadge = FALSE;  static const U8 NO_FACE = 255;  BOOL gQuietSnapshot = FALSE; -const F32 MIN_AFK_TIME = 2.f; // minimum time after setting away state before coming back -  static const F32 MIN_DISPLAY_SCALE = 0.75f;  std::string	LLViewerWindow::sSnapshotBaseName; @@ -528,8 +528,8 @@ public:  				addText(xpos,ypos, llformat("%s streaming cost: %.1f", label, cost));  				ypos += y_inc; -				addText(xpos, ypos, llformat("    %.1f KTris, %.1f/%.1f KB, %d objects", -										count/1024.f, visible_bytes/1024.f, total_bytes/1024.f, object_count)); +				addText(xpos, ypos, llformat("    %.3f KTris, %.1f/%.1f KB, %d objects", +										count/1000.f, visible_bytes/1024.f, total_bytes/1024.f, object_count));  				ypos += y_inc;  			} @@ -662,6 +662,17 @@ public:  			addText(xpos, ypos, llformat("%d %d %d %d", color[0], color[1], color[2], color[3]));  			ypos += y_inc;  		} + +		if (gSavedSettings.getBOOL("DebugShowPrivateMem")) +		{ +			LLPrivateMemoryPoolManager::getInstance()->updateStatistics() ; +			addText(xpos, ypos, llformat("Total Reserved(KB): %d", LLPrivateMemoryPoolManager::getInstance()->mTotalReservedSize / 1024)); +			ypos += y_inc; + +			addText(xpos, ypos, llformat("Total Allocated(KB): %d", LLPrivateMemoryPoolManager::getInstance()->mTotalAllocatedSize / 1024)); +			ypos += y_inc; +		} +  		// only display these messages if we are actually rendering beacons at this moment  		if (LLPipeline::getRenderBeacons(NULL) && LLFloaterReg::instanceVisible("beacons"))  		{ @@ -726,19 +737,6 @@ public:  			}  		}				 -		if (gSavedSettings.getBOOL("DebugShowUploadCost")) -		{ -			addText(xpos, ypos, llformat("       Meshes: L$%d", gPipeline.mDebugMeshUploadCost)); -			ypos += y_inc/2; -			addText(xpos, ypos, llformat("    Sculpties: L$%d", gPipeline.mDebugSculptUploadCost)); -			ypos += y_inc/2; -			addText(xpos, ypos, llformat("     Textures: L$%d", gPipeline.mDebugTextureUploadCost)); -			ypos += y_inc/2; -			addText(xpos, ypos, "Upload Cost: "); -						 -			ypos += y_inc; -		} -  		//temporary hack to give feedback on mesh upload progress  		if (!gMeshRepo.mUploads.empty())  		{ @@ -747,10 +745,8 @@ public:  			{  				LLMeshUploadThread* thread = *iter; -				addText(xpos, ypos, llformat("Mesh Upload -- price quote: %d:%d | upload: %d:%d | create: %d",  -								thread->mPendingConfirmations, thread->mUploadQ.size()+thread->mTextureQ.size(), -								thread->mPendingUploads, thread->mConfirmedQ.size()+thread->mConfirmedTextureQ.size(), -								thread->mInstanceQ.size())); +				addText(xpos, ypos, llformat("Mesh Uploads: %d",  +								thread->mPendingUploads));  				ypos += y_inc;  			}  		} @@ -944,6 +940,11 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window,  LLCoordGL pos, MASK  		//	}  		//} +		// Mark the click as handled and return if we aren't within the root view to avoid spurious bugs +		if( !mRootView->pointInView(x, y) ) +		{ +			return TRUE; +		}  		// Give the UI views a chance to process the click  		if( mRootView->handleAnyMouseClick(x, y, mask, clicktype, down) )  		{ @@ -1218,7 +1219,7 @@ void LLViewerWindow::handleMouseMove(LLWindow *window,  LLCoordGL pos, MASK mask  	mWindow->showCursorFromMouseMove(); -	if (gAwayTimer.getElapsedTimeF32() > MIN_AFK_TIME) +	if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)  	{  		gAgent.clearAFK();  	} @@ -1306,7 +1307,7 @@ BOOL LLViewerWindow::handleTranslatedKeyDown(KEY key,  MASK mask, BOOL repeated)  	// Let the voice chat code check for its PTT key.  Note that this never affects event processing.  	LLVoiceClient::getInstance()->keyDown(key, mask); -	if (gAwayTimer.getElapsedTimeF32() > MIN_AFK_TIME) +	if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)  	{  		gAgent.clearAFK();  	} @@ -1345,7 +1346,7 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)  {  	if (activated)  	{ -		mActive = TRUE; +		mActive = true;  		send_agent_resume();  		gAgent.clearAFK(); @@ -1354,8 +1355,9 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)  	}  	else  	{ -		mActive = FALSE; +		mActive = false; +		// if the user has chosen to go Away automatically after some time, then go Away when minimizing  		if (gSavedSettings.getS32("AFKTimeout"))  		{  			gAgent.setAFK(); @@ -1536,7 +1538,8 @@ LLViewerWindow::LLViewerWindow(  	BOOL fullscreen, BOOL ignore_pixel_depth) // fullscreen is no longer used  	:  	mWindow(NULL), -	mActive(TRUE), +	mActive(true), +	mUIVisible(true),  	mWindowRectRaw(0, height, width, 0),  	mWindowRectScaled(0, height, width, 0),  	mWorldViewRectRaw(0, height, width, 0), @@ -1552,7 +1555,12 @@ LLViewerWindow::LLViewerWindow(  	mResDirty(false),  	mStatesDirty(false),  	mCurrResolutionIndex(0), -    mViewerWindowListener(new LLViewerWindowListener(this)), +	// gKeyboard is still NULL, so it doesn't do LLWindowListener any good to +	// pass its value right now. Instead, pass it a nullary function that +	// will, when we later need it, return the value of gKeyboard. +	// boost::lambda::var() constructs such a functor on the fly. +	mWindowListener(new LLWindowListener(this, boost::lambda::var(gKeyboard))), +	mViewerWindowListener(new LLViewerWindowListener(this)),  	mProgressView(NULL)  {  	LLNotificationChannel::buildChannel("VW_alerts", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alert")); @@ -1578,6 +1586,25 @@ LLViewerWindow::LLViewerWindow(  		ignore_pixel_depth,  		gSavedSettings.getBOOL("RenderDeferred") ? 0 : gSavedSettings.getU32("RenderFSAASamples")); //don't use window level anti-aliasing if FBOs are enabled +	if (NULL == mWindow) +	{ +		LLSplashScreen::update(LLTrans::getString("StartupRequireDriverUpdate")); +	 +		LL_WARNS("Window") << "Failed to create window, to be shutting Down, be sure your graphics driver is updated." << llendl ; + +		ms_sleep(5000) ; //wait for 5 seconds. + +		LLSplashScreen::update(LLTrans::getString("ShuttingDown")); +#if LL_LINUX || LL_SOLARIS +		llwarns << "Unable to create window, be sure screen is set at 32-bit color and your graphics driver is configured correctly.  See README-linux.txt or README-solaris.txt for further information." +				<< llendl; +#else +		LL_WARNS("Window") << "Unable to create window, be sure screen is set at 32-bit color in Control Panels->Display->Settings" +				<< LL_ENDL; +#endif +        LLAppViewer::instance()->fastQuit(1); +	} +	  	if (!LLAppViewer::instance()->restoreErrorTrap())  	{  		LL_WARNS("Window") << " Someone took over my signal/exception handler (post createWindow)!" << LL_ENDL; @@ -1593,19 +1620,6 @@ LLViewerWindow::LLViewerWindow(  		gSavedSettings.setS32("FullScreenHeight",scr.mY);      } -	if (NULL == mWindow) -	{ -		LLSplashScreen::update(LLTrans::getString("ShuttingDown")); -#if LL_LINUX || LL_SOLARIS -		llwarns << "Unable to create window, be sure screen is set at 32-bit color and your graphics driver is configured correctly.  See README-linux.txt or README-solaris.txt for further information." -				<< llendl; -#else -		LL_WARNS("Window") << "Unable to create window, be sure screen is set at 32-bit color in Control Panels->Display->Settings" -				<< LL_ENDL; -#endif -        LLAppViewer::instance()->fastQuit(1); -	} -	  	// 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 = gSavedSettings.getF32("UIScaleFactor"); @@ -1639,6 +1653,7 @@ LLViewerWindow::LLViewerWindow(  	}  	LLVertexBuffer::initClass(gSavedSettings.getBOOL("RenderVBOEnable"), gSavedSettings.getBOOL("RenderVBOMappingDisable"));  	LL_INFOS("RenderInit") << "LLVertexBuffer initialization done." << LL_ENDL ; +	gGL.init() ;  	if (LLFeatureManager::getInstance()->isSafe()  		|| (gSavedSettings.getS32("LastFeatureVersion") != LLFeatureManager::getInstance()->getVersion()) @@ -1769,12 +1784,23 @@ void LLViewerWindow::initBase()  	// placeholder widget that controls where "world" is rendered  	mWorldViewPlaceholder = main_view->getChildView("world_view_rect")->getHandle(); -	mNonSideTrayView = main_view->getChildView("non_side_tray_view")->getHandle(); -	mFloaterViewHolder = main_view->getChildView("floater_view_holder")->getHandle();  	mPopupView = main_view->getChild<LLPopupView>("popup_holder");  	mHintHolder = main_view->getChild<LLView>("hint_holder")->getHandle();  	mLoginPanelHolder = main_view->getChild<LLView>("login_panel_holder")->getHandle(); +	// Create the toolbar view +	// *TODO: Eventually, suppress the existence of this debug setting and turn toolbar FUI on permanently +	if (gSavedSettings.getBOOL("DebugToolbarFUI")) +	{ +		// Get a pointer to the toolbar view holder +		LLPanel* panel_holder = main_view->getChild<LLPanel>("toolbar_view_holder"); +		// Load the toolbar view from file  +		gToolBarView = LLUICtrlFactory::getInstance()->createFromFile<LLToolBarView>("panel_toolbar_view.xml", panel_holder, LLDefaultChildRegistry::instance()); +		gToolBarView->setShape(panel_holder->getLocalRect()); +		// Hide the toolbars for the moment: we'll make them visible after logging in world (see LLViewerWindow::initWorldUI()) +		gToolBarView->setVisible(FALSE); +	} +  	// Constrain floaters to inside the menu and status bar regions.  	gFloaterView = main_view->getChild<LLFloaterView>("Floater View");  	gFloaterView->setFloaterSnapView(main_view->getChild<LLView>("floater_snap_region")->getHandle()); @@ -1834,13 +1860,12 @@ void LLViewerWindow::initWorldUI()  	//getRootView()->sendChildToFront(gFloaterView);  	//getRootView()->sendChildToFront(gSnapshotFloaterView); -	// new bottom panel -	LLPanel* bottom_tray_container = getRootView()->getChild<LLPanel>("bottom_tray_container"); -	LLBottomTray* bottom_tray = LLBottomTray::getInstance(); -	bottom_tray->setShape(bottom_tray_container->getLocalRect()); -	bottom_tray->setFollowsAll(); -	bottom_tray_container->addChild(bottom_tray); -	bottom_tray_container->setVisible(TRUE); +	LLPanel* chiclet_container = getRootView()->getChild<LLPanel>("chiclet_container"); +	LLChicletBar* chiclet_bar = LLChicletBar::getInstance(); +	chiclet_bar->setShape(chiclet_container->getLocalRect()); +	chiclet_bar->setFollowsAll(); +	chiclet_container->addChild(chiclet_bar); +	chiclet_container->setVisible(TRUE);  	LLRect morph_view_rect = full_window;  	morph_view_rect.stretch( -STATUS_BAR_HEIGHT ); @@ -1868,7 +1893,7 @@ void LLViewerWindow::initWorldUI()  	gStatusBar->setShape(status_bar_container->getLocalRect());  	// sync bg color with menu bar  	gStatusBar->setBackgroundColor( gMenuBarView->getBackgroundColor().get() ); -	status_bar_container->addChild(gStatusBar); +	status_bar_container->addChildInBack(gStatusBar);  	status_bar_container->setVisible(TRUE);  	// Navigation bar @@ -1882,12 +1907,7 @@ void LLViewerWindow::initWorldUI()  	if (!gSavedSettings.getBOOL("ShowNavbarNavigationPanel"))  	{ -		navbar->showNavigationPanel(FALSE); -	} - -	if (!gSavedSettings.getBOOL("ShowNavbarFavoritesPanel")) -	{ -		navbar->showFavoritesPanel(FALSE); +		navbar->setVisible(FALSE);  	}  	// Top Info bar @@ -1913,8 +1933,7 @@ void LLViewerWindow::initWorldUI()  			hud_rect.mTop -= gMenuBarView->getRect().getHeight();  		}  		gHUDView = new LLHUDView(hud_rect); -		// put behind everything else in the UI -		getRootView()->addChildInBack(gHUDView); +		getRootView()->addChild(gHUDView);  	}  	LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("stand_stop_flying_container"); @@ -1922,40 +1941,30 @@ void LLViewerWindow::initWorldUI()  	panel_ssf_container->addChild(panel_stand_stop_flying);  	panel_ssf_container->setVisible(TRUE); -	// put sidetray in container -	LLPanel* side_tray_container = getRootView()->getChild<LLPanel>("side_tray_container"); -	LLSideTray* sidetrayp = LLSideTray::getInstance(); -	sidetrayp->setShape(side_tray_container->getLocalRect()); -	// don't follow right edge to avoid spurious resizes, since we are using a fixed width layout -	sidetrayp->setFollows(FOLLOWS_LEFT|FOLLOWS_TOP|FOLLOWS_BOTTOM); -	side_tray_container->addChild(sidetrayp); -	side_tray_container->setVisible(FALSE); -	 -	// put sidetray buttons in their own panel -	LLPanel* buttons_panel = sidetrayp->getButtonsPanel(); -	LLPanel* buttons_panel_container = getRootView()->getChild<LLPanel>("side_bar_tabs"); -	buttons_panel->setShape(buttons_panel_container->getLocalRect()); -	buttons_panel->setFollowsAll(); -	buttons_panel_container->addChild(buttons_panel); - -	LLView* avatar_picker_destination_guide_container = gViewerWindow->getRootView()->getChild<LLView>("avatar_picker_and_destination_guide_container"); -	avatar_picker_destination_guide_container->getChild<LLButton>("close")->setCommitCallback(boost::bind(toggle_destination_and_avatar_picker, LLSD())); -	LLMediaCtrl* destinations = avatar_picker_destination_guide_container->findChild<LLMediaCtrl>("destination_guide_contents"); -	LLMediaCtrl* avatar_picker = avatar_picker_destination_guide_container->findChild<LLMediaCtrl>("avatar_picker_contents"); +	// Load and make the toolbars visible +	// Note: we need to load the toolbars only *after* the user is logged in and IW +	if (gToolBarView) +	{ +		gToolBarView->loadToolbars(); +		gToolBarView->setVisible(TRUE); +	} + +	LLMediaCtrl* destinations = LLFloaterReg::getInstance("destinations")->getChild<LLMediaCtrl>("destination_guide_contents");  	if (destinations)  	{  		destinations->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); -		destinations->navigateTo(gSavedSettings.getString("DestinationGuideURL"), "text/html"); +		std::string url = gSavedSettings.getString("DestinationGuideURL"); +		url = LLWeb::expandURLSubstitutions(url, LLSD()); +		destinations->navigateTo(url, "text/html");  	} - +	LLMediaCtrl* avatar_picker = LLFloaterReg::getInstance("avatar")->findChild<LLMediaCtrl>("avatar_picker_contents");  	if (avatar_picker)  	{  		avatar_picker->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); -		avatar_picker->navigateTo(gSavedSettings.getString("AvatarPickerURL"), "text/html"); +		std::string url = gSavedSettings.getString("AvatarPickerURL"); +		url = LLWeb::expandURLSubstitutions(url, LLSD()); +		avatar_picker->navigateTo(url, "text/html");  	} - -	// show destinations by default -	toggle_destination_and_avatar_picker(gSavedSettings.getS32("DestinationsAndAvatarsVisibility"));  }  // Destroy the UI @@ -1981,7 +1990,7 @@ void LLViewerWindow::shutdownViews()  	// *TODO: Make LLNavigationBar part of gViewerWindow  	if (LLNavigationBar::instanceExists())  	{ -	delete LLNavigationBar::getInstance(); +		delete LLNavigationBar::getInstance();  	}  	// destroy menus after instantiating navbar above, as it needs @@ -1997,6 +2006,7 @@ void LLViewerWindow::shutdownViews()  	gIMMgr = NULL;  	gToolTipView = NULL; +	gToolBarView = NULL;  	gFloaterView = NULL;  	gMorphView = NULL; @@ -2035,15 +2045,17 @@ void LLViewerWindow::shutdownGL()  	llinfos << "All textures and llimagegl images are destroyed!" << llendl ;  	llinfos << "Cleaning up select manager" << llendl; -	LLSelectMgr::getInstance()->cleanup(); - -	LLVertexBuffer::cleanupClass(); +	LLSelectMgr::getInstance()->cleanup();	  	llinfos << "Stopping GL during shutdown" << llendl;  	stopGL(FALSE);  	stop_glerror();  	gGL.shutdown(); + +	LLVertexBuffer::cleanupClass(); + +	llinfos << "LLVertexBuffer cleaned." << llendl ;  }  // shutdownViews() and shutdownGL() need to be called first @@ -2166,10 +2178,10 @@ void LLViewerWindow::reshape(S32 width, S32 height)  // Hide normal UI when a logon fails  void LLViewerWindow::setNormalControlsVisible( BOOL visible )  { -	if(LLBottomTray::instanceExists()) +	if(LLChicletBar::instanceExists())  	{ -		LLBottomTray::getInstance()->setVisible(visible); -		LLBottomTray::getInstance()->setEnabled(visible); +		LLChicletBar::getInstance()->setVisible(visible); +		LLChicletBar::getInstance()->setEnabled(visible);  	}  	if ( gMenuBarView ) @@ -2191,7 +2203,9 @@ void LLViewerWindow::setNormalControlsVisible( BOOL visible )  	LLNavigationBar* navbarp = LLUI::getRootView()->findChild<LLNavigationBar>("navigation_bar");  	if (navbarp)  	{ -		navbarp->setVisible( visible ); +		// when it's time to show navigation bar we need to ensure that the user wants to see it +		// i.e. ShowNavbarNavigationPanel option is true +		navbarp->setVisible( visible && gSavedSettings.getBOOL("ShowNavbarNavigationPanel") );  	}  } @@ -2296,6 +2310,11 @@ void LLViewerWindow::draw()  	// Draw all nested UI views.  	// No translation needed, this view is glued to 0,0 +	if (LLGLSLShader::sNoFixedFunction) +	{ +		gUIProgram.bind(); +	} +  	gGL.pushMatrix();  	LLUI::pushMatrix();  	{ @@ -2370,6 +2389,11 @@ void LLViewerWindow::draw()  	LLUI::popMatrix();  	gGL.popMatrix(); +	if (LLGLSLShader::sNoFixedFunction) +	{ +		gUIProgram.unbind(); +	} +  //#if LL_DEBUG  	LLView::sIsDrawing = FALSE;  //#endif @@ -2452,7 +2476,12 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)  	// Traverses up the hierarchy  	if( keyboard_focus )  	{ -		LLLineEditor* chat_editor = LLBottomTray::instanceExists() ? LLBottomTray::getInstance()->getNearbyChatBar()->getChatBox() : NULL; +		LLNearbyChatBar* nearby_chat = LLFloaterReg::findTypedInstance<LLNearbyChatBar>("chat_bar"); + +		if (nearby_chat) +		{ +			LLLineEditor* chat_editor = nearby_chat->getChatBox(); +		  		// arrow keys move avatar while chatting hack  		if (chat_editor && chat_editor->hasFocus())  		{ @@ -2483,7 +2512,7 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)  				}  			}  		} - +		}  		if (keyboard_focus->handleKey(key, mask, FALSE))  		{  			return TRUE; @@ -2514,11 +2543,11 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)  	if ( gSavedSettings.getS32("LetterKeysFocusChatBar") && !gAgentCamera.cameraMouselook() &&   		!keyboard_focus && key < 0x80 && (mask == MASK_NONE || mask == MASK_SHIFT) )  	{ -		LLLineEditor* chat_editor = LLBottomTray::instanceExists() ? LLBottomTray::getInstance()->getNearbyChatBar()->getChatBox() : NULL; +		LLLineEditor* chat_editor = LLFloaterReg::getTypedInstance<LLNearbyChatBar>("chat_bar")->getChatBox();  		if (chat_editor)  		{  			// passing NULL here, character will be added later when it is handled by character handler. -			LLBottomTray::getInstance()->getNearbyChatBar()->startChat(NULL); +			LLNearbyChatBar::getInstance()->startChat(NULL);  			return TRUE;  		}  	} @@ -3145,6 +3174,12 @@ void LLViewerWindow::updateLayout()  		//gMenuBarView->setItemVisible("BuildTools", gFloaterTools->getVisible());  	} +	LLFloaterBuildOptions* build_options_floater = LLFloaterReg::getTypedInstance<LLFloaterBuildOptions>("build_options"); +	if (build_options_floater && build_options_floater->getVisible()) +	{ +		build_options_floater->updateGridMode(); +	} +  	// Always update console  	if(gConsole)  	{ @@ -3283,9 +3318,6 @@ void LLViewerWindow::updateKeyboardFocus()  		// make sure floater visible order is in sync with tab order  		gFloaterView->syncFloaterTabOrder();  	} - -	if(LLSideTray::instanceCreated())//just getInstance will create sidetray. we don't want this -		LLSideTray::getInstance()->highlightFocused();  }  static LLFastTimer::DeclareTimer FTM_UPDATE_WORLD_VIEW("Update World View"); @@ -3309,12 +3341,6 @@ void LLViewerWindow::updateWorldViewRect(bool use_full_window)  		new_world_rect.mTop = llround((F32)new_world_rect.mTop * mDisplayScale.mV[VY]);  	} -	if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE) -	{ -		// use right edge of window, ignoring sidebar -		new_world_rect.mRight = mWindowRectRaw.mRight; -	} -  	if (mWorldViewRectRaw != new_world_rect)  	{  		mWorldViewRectRaw = new_world_rect; @@ -4072,7 +4098,7 @@ static S32 BORDERWIDTH = 0;  void LLViewerWindow::movieSize(S32 new_width, S32 new_height)  {  	LLCoordScreen size; -	gViewerWindow->mWindow->getSize(&size); +	gViewerWindow->getWindow()->getSize(&size);  	if (  (size.mX != new_width + BORDERWIDTH)  		||(size.mY != new_height + BORDERHEIGHT))  	{ @@ -4083,7 +4109,7 @@ void LLViewerWindow::movieSize(S32 new_width, S32 new_height)  		BORDERHEIGHT = size.mY- y;  		LLCoordScreen new_size(new_width + BORDERWIDTH,   							   new_height + BORDERHEIGHT); -		gViewerWindow->mWindow->setSize(new_size); +		gViewerWindow->getWindow()->setSize(new_size);  	}  } @@ -4141,6 +4167,19 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei  	{  		return FALSE;  	} +	//check if there is enough memory for the snapshot image +	if(LLPipeline::sMemAllocationThrottled) +	{ +		return FALSE ; //snapshot taking is disabled due to memory restriction. +	} +	if(image_width * image_height > (1 << 22)) //if snapshot image is larger than 2K by 2K +	{ +		if(!LLMemory::tryToAlloc(NULL, image_width * image_height * 3)) +		{ +			llwarns << "No enough memory to take the snapshot with size (w : h): " << image_width << " : " << image_height << llendl ; +			return FALSE ; //there is no enough memory for taking this snapshot. +		} +	}  	// PRE SNAPSHOT  	gDisplaySwapBuffers = FALSE; @@ -4531,6 +4570,14 @@ void LLViewerWindow::setShowProgress(const BOOL show)  	}  } +void LLViewerWindow::setStartupComplete() +{ +	if (mProgressView) +	{ +		mProgressView->setStartupComplete(); +	} +} +  BOOL LLViewerWindow::getShowProgress() const  {  	return (mProgressView && mProgressView->getVisible()); @@ -4889,8 +4936,8 @@ S32 LLViewerWindow::getChatConsoleBottomPad()  {  	S32 offset = 0; -	if(LLBottomTray::instanceExists()) -		offset += LLBottomTray::getInstance()->getRect().getHeight(); +	if(gToolBarView) +		offset += gToolBarView->getChild<LLView>("bottom_toolbar_panel")->getRect().getHeight();  	return offset;  } @@ -4946,6 +4993,35 @@ bool LLViewerWindow::onAlert(const LLSD& notify)  	return false;  } +void LLViewerWindow::setUIVisibility(bool visible) +{ +	mUIVisible = visible; + +	if (!visible) +	{ +		gAgentCamera.changeCameraToThirdPerson(FALSE); +		gFloaterView->hideAllFloaters(); +	} +	else +	{ +		gFloaterView->showHiddenFloaters(); +	} + +	if (gToolBarView) +	{ +		gToolBarView->setToolBarsVisible(visible); +	} + +	mRootView->getChildView("topinfo_bar_container")->setVisible(visible); +	mRootView->getChildView("nav_bar_container")->setVisible(visible); +	mRootView->getChildView("status_bar_container")->setVisible(visible); +} + +bool LLViewerWindow::getUIVisibility() +{ +	return mUIVisible; +} +  ////////////////////////////////////////////////////////////////////////////  //  // LLPickInfo diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index ff49ed1f62..d10b06f121 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -62,6 +62,7 @@ class LLImageFormatted;  class LLHUDIcon;  class LLWindow;  class LLRootView; +class LLWindowListener;  class LLViewerWindowListener;  class LLPopupView; @@ -143,6 +144,8 @@ public:  	void			adjustRectanglesForFirstUse(const LLRect& window);  	void            adjustControlRectanglesForFirstUse(const LLRect& window);  	void			initWorldUI(); +	void			setUIVisibility(bool); +	bool			getUIVisibility();  	BOOL handleAnyMouseClick(LLWindow *window,  LLCoordGL pos, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down); @@ -272,6 +275,7 @@ public:  	void			setProgressCancelButtonVisible( BOOL b, const std::string& label = LLStringUtil::null );  	LLProgressView *getProgressView() const;  	void			revealIntroPanel(); +	void			setStartupComplete();  	void			updateObjectUnderCursor(); @@ -281,8 +285,7 @@ public:  	void				updateKeyboardFocus();		  	void			updateWorldViewRect(bool use_full_window=false); -	LLView*			getNonSideTrayView() { return mNonSideTrayView.get(); } -	LLView*			getFloaterViewHolder() { return mFloaterViewHolder.get(); } +	LLView*			getToolBarHolder() { return mToolBarHolder.get(); }  	LLView*			getHintHolder() { return mHintHolder.get(); }  	LLView*			getLoginPanelHolder() { return mLoginPanelHolder.get(); }  	BOOL			handleKey(KEY key, MASK mask); @@ -393,11 +396,10 @@ private:  	S32				getChatConsoleBottomPad(); // Vertical padding for child console rect, varied by bottom clutter  	LLRect			getChatConsoleRect(); // Get optimal cosole rect. -public: +private:  	LLWindow*		mWindow;						// graphical window object - -protected: -	BOOL			mActive; +	bool			mActive; +	bool			mUIVisible;  	LLRect			mWindowRectRaw;				// whole window, including UI  	LLRect			mWindowRectScaled;			// whole window, scaled by UI size @@ -443,8 +445,7 @@ protected:  	std::string		mInitAlert;			// Window / GL initialization requires an alert  	LLHandle<LLView> mWorldViewPlaceholder;	// widget that spans the portion of screen dedicated to rendering the 3d world -	LLHandle<LLView> mNonSideTrayView;		// parent of world view + bottom bar, etc...everything but the side tray -	LLHandle<LLView> mFloaterViewHolder;	// container for floater_view +	LLHandle<LLView> mToolBarHolder;		// container for toolbars  	LLHandle<LLView> mHintHolder;			// container for hints  	LLHandle<LLView> mLoginPanelHolder;		// container for login panel  	LLPopupView*	mPopupView;			// container for transient popups @@ -455,15 +456,14 @@ protected:  	bool			mStatesDirty;  	U32			mCurrResolutionIndex; -    boost::scoped_ptr<LLViewerWindowListener> mViewerWindowListener; +	boost::scoped_ptr<LLWindowListener> mWindowListener; +	boost::scoped_ptr<LLViewerWindowListener> mViewerWindowListener; -protected:  	static std::string sSnapshotBaseName;  	static std::string sSnapshotDir;  	static std::string sMovieBaseName; -private:  	// Object temporarily hovered over while dragging  	LLPointer<LLViewerObject>	mDragHoveredObject;  }; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 3f98df9eb9..bdab250b49 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1123,14 +1123,20 @@ void LLVOAvatar::initClass()  	// Process XML data  	// avatar_skeleton.xml -	llassert(!sAvatarSkeletonInfo); +	if (sAvatarSkeletonInfo) +	{ //this can happen if a login attempt failed +		delete sAvatarSkeletonInfo; +	}  	sAvatarSkeletonInfo = new LLVOAvatarSkeletonInfo;  	if (!sAvatarSkeletonInfo->parseXml(sSkeletonXMLTree.getRoot()))  	{  		llerrs << "Error parsing skeleton XML file: " << skeleton_path << llendl;  	}  	// parse avatar_lad.xml -	llassert(!sAvatarXmlInfo); +	if (sAvatarXmlInfo) +	{ //this can happen if a login attempt failed +		deleteAndClear(sAvatarXmlInfo); +	}  	sAvatarXmlInfo = new LLVOAvatarXmlInfo;  	if (!sAvatarXmlInfo->parseXmlSkeletonNode(root))  	{ @@ -2797,7 +2803,10 @@ void LLVOAvatar::idleUpdateLoadingEffect()  																 LLPartData::LL_PART_EMISSIVE_MASK | // LLPartData::LL_PART_FOLLOW_SRC_MASK |  																 LLPartData::LL_PART_TARGET_POS_MASK ); -			setParticleSource(particle_parameters, getID()); +			if (!isTooComplex()) // do not generate particles for overly-complex avatars +			{ +				setParticleSource(particle_parameters, getID()); +			}  		}  	}  }	 @@ -4219,7 +4228,7 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)  		bool should_alpha_mask = shouldAlphaMask();  		LLGLState test(GL_ALPHA_TEST, should_alpha_mask); -		if (should_alpha_mask) +		if (should_alpha_mask && !LLGLSLShader::sNoFixedFunction)  		{  			gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);  		} @@ -4248,7 +4257,10 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)  			}  		} -		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +		if (should_alpha_mask && !LLGLSLShader::sNoFixedFunction) +		{ +			gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +		}  		if (!LLDrawPoolAvatar::sSkipTransparent || LLPipeline::sImpostorRender)  		{ @@ -4331,7 +4343,7 @@ U32 LLVOAvatar::renderRigid()  	bool should_alpha_mask = shouldAlphaMask();  	LLGLState test(GL_ALPHA_TEST, should_alpha_mask); -	if (should_alpha_mask) +	if (should_alpha_mask && !LLGLSLShader::sNoFixedFunction)  	{  		gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);  	} @@ -4342,7 +4354,10 @@ U32 LLVOAvatar::renderRigid()  		num_indices += mMeshLOD[MESH_ID_EYEBALL_RIGHT]->render(mAdjustedPixelArea, TRUE, mIsDummy);  	} -	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +	if (should_alpha_mask && !LLGLSLShader::sNoFixedFunction) +	{ +		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +	}  	return num_indices;  } @@ -6377,6 +6392,11 @@ BOOL LLVOAvatar::getIsCloud()  	{  		return TRUE;  	} + +	if (isTooComplex()) +	{ +		return TRUE; +	}  	return FALSE;  } @@ -6471,6 +6491,16 @@ BOOL LLVOAvatar::isFullyLoaded() const  		return mFullyLoaded;  } +bool LLVOAvatar::isTooComplex() const +{ +	if (gSavedSettings.getS32("RenderAvatarComplexityLimit") > 0 && mVisualComplexity >= gSavedSettings.getS32("RenderAvatarComplexityLimit")) +	{ +		return true; +	} + +	return false; +} +  //-----------------------------------------------------------------------------  // findMotion() @@ -8304,7 +8334,7 @@ void LLVOAvatar::getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& d  void LLVOAvatar::idleUpdateRenderCost()  { -	static const U32 ARC_BODY_PART_COST = 20; +	static const U32 ARC_BODY_PART_COST = 200;  	static const U32 ARC_LIMIT = 2048;  	static std::set<LLUUID> all_textures; @@ -8315,7 +8345,7 @@ void LLVOAvatar::idleUpdateRenderCost()  	}  	U32 cost = 0; -	std::set<LLUUID> textures; +	LLVOVolume::texture_cost_t textures;  	for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)  	{ @@ -8330,6 +8360,7 @@ void LLVOAvatar::idleUpdateRenderCost()  		}  	} +  	for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin();   		 iter != mAttachmentPoints.end();  		 ++iter) @@ -8342,6 +8373,7 @@ void LLVOAvatar::idleUpdateRenderCost()  			const LLViewerObject* attached_object = (*attachment_iter);  			if (attached_object && !attached_object->isHUDAttachment())  			{ +				textures.clear();  				const LLDrawable* drawable = attached_object->mDrawable;  				if (drawable)  				{ @@ -8349,6 +8381,25 @@ void LLVOAvatar::idleUpdateRenderCost()  					if (volume)  					{  						cost += volume->getRenderCost(textures); + +						const_child_list_t children = volume->getChildren(); +						for (const_child_list_t::const_iterator child_iter = children.begin(); +							  child_iter != children.end(); +							  ++child_iter) +						{ +							LLViewerObject* child_obj = *child_iter; +							LLVOVolume *child = dynamic_cast<LLVOVolume*>( child_obj ); +							if (child) +							{ +								cost += child->getRenderCost(textures); +							} +						} + +						for (LLVOVolume::texture_cost_t::iterator iter = textures.begin(); iter != textures.end(); ++iter) +						{ +							// add the cost of each individual texture in the linkset +							cost += iter->second; +						}  					}  				}  			} @@ -8356,15 +8407,17 @@ void LLVOAvatar::idleUpdateRenderCost()  	} + +  	// Diagnostic output to identify all avatar-related textures.  	// Does not affect rendering cost calculation.  	// Could be wrapped in a debug option if output becomes problematic.  	if (isSelf())  	{  		// print any attachment textures we didn't already know about. -		for (std::set<LLUUID>::iterator it = textures.begin(); it != textures.end(); ++it) +		for (LLVOVolume::texture_cost_t::iterator it = textures.begin(); it != textures.end(); ++it)  		{ -			LLUUID image_id = *it; +			LLUUID image_id = it->first;  			if( image_id.isNull() || image_id == IMG_DEFAULT || image_id == IMG_DEFAULT_AVATAR)  				continue;  			if (all_textures.find(image_id) == all_textures.end()) @@ -8396,9 +8449,8 @@ void LLVOAvatar::idleUpdateRenderCost()  		}  	} -	cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST; -  	setDebugText(llformat("%d", cost)); +	mVisualComplexity = cost;  	F32 green = 1.f-llclamp(((F32) cost-(F32)ARC_LIMIT)/(F32)ARC_LIMIT, 0.f, 1.f);  	F32 red = llmin((F32) cost/(F32)ARC_LIMIT, 1.f);  	mText->setColor(LLColor4(red,green,0,1)); diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 03c0498a2a..e53b8e3f4b 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -273,6 +273,7 @@ public:  	//--------------------------------------------------------------------  public:  	BOOL			isFullyLoaded() const; +	bool			isTooComplex() const;  	bool visualParamWeightsAreDefault();  protected:  	virtual BOOL	getIsCloud(); @@ -285,6 +286,7 @@ private:  	BOOL			mPreviousFullyLoaded;  	BOOL			mFullyLoadedInitialized;  	S32				mFullyLoadedFrameCounter; +	S32				mVisualComplexity;  	LLFrameTimer	mFullyLoadedTimer;  	LLFrameTimer	mRuthTimer;  protected: diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index f0b5b50feb..7db19c5c1b 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -621,16 +621,20 @@ void LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::voca  				S32 num_entries;  				success = check_read(&apr_file, &num_entries, sizeof(S32)) ; -				for (S32 i = 0; success && i < num_entries; i++) +				if(success)  				{ -					LLVOCacheEntry* entry = new LLVOCacheEntry(&apr_file); -					if (!entry->getLocalID()) +					for (S32 i = 0; i < num_entries; i++)  					{ -						llwarns << "Aborting cache file load for " << filename << ", cache file corruption!" << llendl; -						delete entry ; -						success = false ; +						LLVOCacheEntry* entry = new LLVOCacheEntry(&apr_file); +						if (!entry->getLocalID()) +						{ +							llwarns << "Aborting cache file load for " << filename << ", cache file corruption!" << llendl; +							delete entry ; +							success = false ; +							break ; +						} +						cache_entry_map[entry->getLocalID()] = entry;  					} -					cache_entry_map[entry->getLocalID()] = entry;  				}  			}  		}		 @@ -747,4 +751,3 @@ void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry:  	return ;  } - diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index cd2bbad620..8ecf4a80b7 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -55,7 +55,7 @@  #include "llimview.h" // for LLIMMgr  #include "llparcel.h"  #include "llviewerparcelmgr.h" -//#include "llfirstuse.h" +#include "llfirstuse.h"  #include "llspeakers.h"  #include "lltrans.h"  #include "llviewerwindow.h" @@ -4498,17 +4498,25 @@ bool LLVivoxVoiceClient::parcelVoiceInfoReceived(state requesting_state)  bool LLVivoxVoiceClient::requestParcelVoiceInfo()  { -	LL_DEBUGS("Voice") << "sending ParcelVoiceInfoRequest (" << mCurrentRegionName << ", " << mCurrentParcelLocalID << ")" << LL_ENDL; - -	// grab the cap for parcel voice info from the region.    	LLViewerRegion * region = gAgent.getRegion(); -	if (region == NULL) +	if (region == NULL || !region->capabilitiesReceived())  	{ +		// we don't have the cap yet, so return false so the caller can try again later. + +		LL_DEBUGS("Voice") << "ParcelVoiceInfoRequest capability not yet available, deferring" << LL_ENDL;  		return false;  	} +  	// grab the cap.  	std::string url = gAgent.getRegion()->getCapability("ParcelVoiceInfoRequest"); -	if (!url.empty()) +	if (url.empty()) +	{ +		// Region dosn't have the cap. Stop probing. +		LL_DEBUGS("Voice") << "ParcelVoiceInfoRequest capability not available in this region" << LL_ENDL; +		setState(stateDisableCleanup); +		return false; +	} +	else   	{  		// if we've already retrieved the cap from the region, go ahead and make the request,  		// and return true so we can go into the state that waits for the response. @@ -4517,18 +4525,11 @@ bool LLVivoxVoiceClient::requestParcelVoiceInfo()  		LL_DEBUGS("Voice") << "sending ParcelVoiceInfoRequest (" << mCurrentRegionName << ", " << mCurrentParcelLocalID << ")" << LL_ENDL;  		LLHTTPClient::post( -						   url, -						   data, -						   new LLVivoxVoiceClientCapResponder(getState())); +						url, +						data, +						new LLVivoxVoiceClientCapResponder(getState()));  		return true;  	} -	else  -	{ -		 -		// we don't have the cap yet, so return false so the caller can try again later. -		LL_DEBUGS("Voice") << "ParcelVoiceInfoRequest cap not yet available, deferring" << LL_ENDL; -		return false; -	}  }  void LLVivoxVoiceClient::switchChannel( @@ -6257,6 +6258,19 @@ void LLVivoxVoiceClient::notifyStatusObservers(LLVoiceClientStatusObserver::ESta  		it = mStatusObservers.upper_bound(observer);  	} +	// skipped to avoid speak button blinking +	if (   status != LLVoiceClientStatusObserver::STATUS_JOINING +		&& status != LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL) +	{ +		bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); + +		gAgent.setVoiceConnected(voice_status); + +		if (voice_status) +		{ +			LLFirstUse::speak(true); +		} +	}  }  void LLVivoxVoiceClient::addObserver(LLFriendObserver* observer) @@ -7049,6 +7063,8 @@ LLVivoxProtocolParser::~LLVivoxProtocolParser()  		XML_ParserFree(parser);  } +static LLFastTimer::DeclareTimer FTM_VIVOX_PROCESS("Vivox Process"); +  // virtual  LLIOPipe::EStatus LLVivoxProtocolParser::process_impl(  													  const LLChannelDescriptors& channels, @@ -7057,6 +7073,7 @@ LLIOPipe::EStatus LLVivoxProtocolParser::process_impl(  													  LLSD& context,  													  LLPumpIO* pump)  { +	LLFastTimer t(FTM_VIVOX_PROCESS);  	LLBufferStream istr(channels, buffer.get());  	std::ostringstream ostr;  	while (istr.good()) diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index 66ba6249d3..ef21e7373e 100644 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -755,6 +755,11 @@ void LLVOSky::calcSkyColorWLVert(LLVector3 & Pn, LLColor3 & vary_HazeColor, LLCo  	// project the direction ray onto the sky dome.  	F32 phi = acos(Pn[1]);  	F32 sinA = sin(F_PI - phi); +	if (fabsf(sinA) < 0.01f) +	{ //avoid division by zero +		sinA = 0.01f; +	} +  	F32 Plen = dome_radius * sin(F_PI + phi + asin(dome_offset_ratio * sinA)) / sinA;  	Pn *= Plen; diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 3c7fe708e6..890861df71 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -51,6 +51,7 @@  #include "llspatialpartition.h"  #include "llnotificationsutil.h"  #include "raytrace.h" +#include "llglslshader.h"  extern LLPipeline gPipeline; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index e6da8eb89d..380d63c77b 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -90,6 +90,8 @@ F32 LLVOVolume::sLODFactor = 1.f;  F32	LLVOVolume::sLODSlopDistanceFactor = 0.5f; //Changing this to zero, effectively disables the LOD transition slop   F32 LLVOVolume::sDistanceFactor = 1.0f;  S32 LLVOVolume::sNumLODChanges = 0; +S32 LLVOVolume::mRenderComplexity_last = 0; +S32 LLVOVolume::mRenderComplexity_current = 0;  LLPointer<LLObjectMediaDataClient> LLVOVolume::sObjectMediaClient = NULL;  LLPointer<LLObjectMediaNavigateClient> LLVOVolume::sObjectMediaNavigateClient = NULL; @@ -367,6 +369,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,  		//  		// Unpack texture entry data  		// +  		S32 result = unpackTEMessage(mesgsys, _PREHASH_ObjectData, block_num);  		if (result & teDirtyBits)  		{ @@ -704,19 +707,22 @@ BOOL LLVOVolume::isVisible() const  	return FALSE ;  } -void LLVOVolume::updateTextureVirtualSize() +void LLVOVolume::updateTextureVirtualSize(bool forced)  {  	LLFastTimer ftm(FTM_VOLUME_TEXTURES);  	// Update the pixel area of all faces -	if(!isVisible()) +	if(!forced)  	{ -		return ; -	} +		if(!isVisible()) +		{ +			return ; +		} -	if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SIMPLE)) -	{ -		return; +		if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SIMPLE)) +		{ +			return; +		}  	}  	static LLCachedControl<bool> dont_load_textures(gSavedSettings,"TextureDisable"); @@ -966,18 +972,14 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams ¶ms_in, const S32 detail, bo  	S32 lod = mLOD;  	BOOL is404 = FALSE; - +	  	if (isSculpted())  	{  		// if it's a mesh  		if ((volume_params.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)  		{ //meshes might not have all LODs, get the force detail to best existing LOD -  			LLUUID mesh_id = volume_params.getSculptID(); -			//profile and path params don't matter for meshes -			volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE); -  			lod = gMeshRepo.getActualMeshLOD(volume_params, lod);  			if (lod == -1)  			{ @@ -1017,6 +1019,9 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams ¶ms_in, const S32 detail, bo  	if (is404)  	{  		setIcon(LLViewerTextureManager::getFetchedTextureFromFile("icons/Inv_Mesh.png", TRUE, LLViewerTexture::BOOST_UI)); +		//render prim proxy when mesh loading attempts give up +		volume_params.setSculptID(LLUUID::null, LL_SCULPT_TYPE_NONE); +  	}  	if ((LLPrimitive::setVolume(volume_params, lod, (mVolumeImpl && mVolumeImpl->isVolumeUnique()))) || mSculptChanged) @@ -1030,14 +1035,13 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams ¶ms_in, const S32 detail, bo  		updateSculptTexture(); -  		if (isSculpted())  		{  			updateSculptTexture();  			// if it's a mesh  			if ((volume_params.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)  			{ -				if (getVolume()->getNumVolumeFaces() == 0 || getVolume()->isTetrahedron()) +				if (!getVolume()->isMeshAssetLoaded())  				{   					//load request not yet issued, request pipeline load this mesh  					LLUUID asset_id = volume_params.getSculptID(); @@ -1656,11 +1660,16 @@ BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)  			compiled = TRUE;  			sNumLODChanges += new_num_faces ; +			if((S32)getNumTEs() != getVolume()->getNumFaces()) +			{ +				setNumTEs(getVolume()->getNumFaces()); //mesh loading may change number of faces. +			} +  			drawable->setState(LLDrawable::REBUILD_VOLUME); // for face->genVolumeTriangles()  			{  				LLFastTimer t(FTM_GEN_TRIANGLES); -				if (new_num_faces != old_num_faces) +				if (new_num_faces != old_num_faces || mNumFaces != (S32)getNumTEs())  				{  					regenFaces();  				} @@ -2965,24 +2974,38 @@ const LLMatrix4 LLVOVolume::getRenderMatrix() const  // total cost is returned value + 5 * size of the resulting set.  // Cannot include cost of textures, as they may be re-used in linked  // children, and cost should only be increased for unique textures  -Nyx -U32 LLVOVolume::getRenderCost(std::set<LLUUID> &textures) const +U32 LLVOVolume::getRenderCost(texture_cost_t &textures) const  { -	// base cost of each prim should be 10 points -	static const U32 ARC_PRIM_COST = 10; +	// Get access to params we'll need at various points.   +	// Skip if this is object doesn't have a volume (e.g. is an avatar). +	BOOL has_volume = (getVolume() != NULL); +	LLVolumeParams volume_params; +	LLPathParams path_params; +	LLProfileParams profile_params; + +	U32 num_triangles = 0; +  	// per-prim costs -	static const U32 ARC_INVISI_COST = 1; -	static const U32 ARC_SHINY_COST = 1; -	static const U32 ARC_GLOW_COST = 1; -	static const U32 ARC_FLEXI_COST = 8; -	static const U32 ARC_PARTICLE_COST = 16; -	static const U32 ARC_BUMP_COST = 4; +	static const U32 ARC_PARTICLE_COST = 1; // determined experimentally +	static const U32 ARC_PARTICLE_MAX = 2048; // default values +	static const U32 ARC_TEXTURE_COST = 16; // multiplier for texture resolution - performance tested +	static const U32 ARC_LIGHT_COST = 500; // static cost for light-producing prims  +	static const U32 ARC_MEDIA_FACE_COST = 1500; // static cost per media-enabled face  + + +	// per-prim multipliers +	static const F32 ARC_GLOW_MULT = 1.5f; // tested based on performance +	static const F32 ARC_BUMP_MULT = 1.25f; // tested based on performance +	static const F32 ARC_FLEXI_MULT = 5; // tested based on performance +	static const F32 ARC_SHINY_MULT = 1.6f; // tested based on performance +	static const F32 ARC_INVISI_COST = 1.2f; // tested based on performance +	static const F32 ARC_WEIGHTED_MESH = 1.2f; // tested based on performance -	// per-face costs -	static const U32 ARC_PLANAR_COST = 1; -	static const U32 ARC_ANIM_TEX_COST = 4; -	static const U32 ARC_ALPHA_COST = 4; +	static const F32 ARC_PLANAR_COST = 1.0f; // tested based on performance to have negligible impact +	static const F32 ARC_ANIM_TEX_COST = 4.f; // tested based on performance +	static const F32 ARC_ALPHA_COST = 4.f; // 4x max - based on performance -	U32 shame = ARC_PRIM_COST; +	F32 shame = 0;  	U32 invisi = 0;  	U32 shiny = 0; @@ -2991,9 +3014,72 @@ U32 LLVOVolume::getRenderCost(std::set<LLUUID> &textures) const  	U32 flexi = 0;  	U32 animtex = 0;  	U32 particles = 0; -	U32 scale = 0;  	U32 bump = 0;  	U32 planar = 0; +	U32 weighted_mesh = 0; +	U32 produces_light = 0; +	U32 media_faces = 0; + +	const LLDrawable* drawablep = mDrawable; +	U32 num_faces = drawablep->getNumFaces(); + +	if (has_volume) +	{ +		volume_params = getVolume()->getParams(); +		path_params = volume_params.getPathParams(); +		profile_params = volume_params.getProfileParams(); + +		F32 weighted_triangles = -1.0; +		getStreamingCost(NULL, NULL, &weighted_triangles); + +		if (weighted_triangles > 0.0) +		{ +			num_triangles = (U32)(weighted_triangles);  +		} +	} + +	if (num_triangles == 0) +	{ +		num_triangles = 4; +	} + +	if (isSculpted()) +	{ +		if (isMesh()) +		{ +			// base cost is dependent on mesh complexity +			// note that 3 is the highest LOD as of the time of this coding. +			S32 size = gMeshRepo.getMeshSize(volume_params.getSculptID(),3); +			if ( size > 0) +			{ +				if (gMeshRepo.getSkinInfo(volume_params.getSculptID(), this)) +				{ +					// weighted attachment - 1 point for every 3 bytes +					weighted_mesh = 1; +				} + +			} +			else +			{ +				// something went wrong - user should know their content isn't render-free +				return 0; +			} +		} +		else +		{ +			const LLSculptParams *sculpt_params = (LLSculptParams *) getParameterEntry(LLNetworkData::PARAMS_SCULPT); +			LLUUID sculpt_id = sculpt_params->getSculptTexture(); +			if (textures.find(sculpt_id) == textures.end()) +			{ +				LLViewerFetchedTexture *texture = LLViewerTextureManager::getFetchedTexture(sculpt_id); +				if (texture) +				{ +					S32 texture_cost = 256 + (S32)(ARC_TEXTURE_COST * (texture->getFullHeight() / 128.f + texture->getFullWidth() / 128.f)); +					textures.insert(texture_cost_t::value_type(sculpt_id, texture_cost)); +				} +			} +		} +	}  	if (isFlexible())  	{ @@ -3004,19 +3090,12 @@ U32 LLVOVolume::getRenderCost(std::set<LLUUID> &textures) const  		particles = 1;  	} -	const LLVector3& sc = getScale(); -	scale += (U32) sc.mV[0] + (U32) sc.mV[1] + (U32) sc.mV[2]; - -	const LLDrawable* drawablep = mDrawable; - -	if (isSculpted()) +	if (getIsLight())  	{ -		const LLSculptParams *sculpt_params = (LLSculptParams *) getParameterEntry(LLNetworkData::PARAMS_SCULPT); -		LLUUID sculpt_id = sculpt_params->getSculptTexture(); -		textures.insert(sculpt_id); +		produces_light = 1;  	} -	for (S32 i = 0; i < drawablep->getNumFaces(); ++i) +	for (S32 i = 0; i < num_faces; ++i)  	{  		const LLFace* face = drawablep->getFace(i);  		const LLTextureEntry* te = face->getTextureEntry(); @@ -3024,85 +3103,145 @@ U32 LLVOVolume::getRenderCost(std::set<LLUUID> &textures) const  		if (img)  		{ -			textures.insert(img->getID()); +			if (textures.find(img->getID()) == textures.end()) +			{ +				S32 texture_cost = 256 + (S32)(ARC_TEXTURE_COST * (img->getFullHeight() / 128.f + img->getFullWidth() / 128.f)); +				textures.insert(texture_cost_t::value_type(img->getID(), texture_cost)); +			}  		}  		if (face->getPoolType() == LLDrawPool::POOL_ALPHA)  		{ -			alpha++; +			alpha = 1;  		}  		else if (img && img->getPrimaryFormat() == GL_ALPHA)  		{  			invisi = 1;  		} +		if (face->hasMedia()) +		{ +			media_faces++; +		}  		if (te)  		{  			if (te->getBumpmap())  			{ +				// bump is a multiplier, don't add per-face  				bump = 1;  			}  			if (te->getShiny())  			{ +				// shiny is a multiplier, don't add per-face  				shiny = 1;  			}  			if (te->getGlow() > 0.f)  			{ +				// glow is a multiplier, don't add per-face  				glow = 1;  			}  			if (face->mTextureMatrix != NULL)  			{ -				animtex++; +				animtex = 1;  			}  			if (te->getTexGen())  			{ -				planar++; +				planar = 1;  			}  		}  	} +	// shame currently has the "base" cost of 1 point per 15 triangles, min 2. +	shame = num_triangles  * 5.f; +	shame = shame < 2.f ? 2.f : shame; -	shame += invisi * ARC_INVISI_COST; -	shame += shiny * ARC_SHINY_COST; -	shame += glow * ARC_GLOW_COST; -	shame += alpha * ARC_ALPHA_COST; -	shame += flexi * ARC_FLEXI_COST; -	shame += animtex * ARC_ANIM_TEX_COST; -	shame += particles * ARC_PARTICLE_COST; -	shame += bump * ARC_BUMP_COST; -	shame += planar * ARC_PLANAR_COST; -	shame += scale; +	// multiply by per-face modifiers +	if (planar) +	{ +		shame *= planar * ARC_PLANAR_COST; +	} -	LLViewerObject::const_child_list_t& child_list = getChildren(); -	for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); -		 iter != child_list.end();  -		 ++iter) +	if (animtex)  	{ -		const LLViewerObject* child_objectp = *iter; -		const LLDrawable* child_drawablep = child_objectp->mDrawable; -		if (child_drawablep) -		{ -			const LLVOVolume* child_volumep = child_drawablep->getVOVolume(); -			if (child_volumep) -			{ -				shame += child_volumep->getRenderCost(textures); -			} -		} +		shame *= animtex * ARC_ANIM_TEX_COST; +	} + +	if (alpha) +	{ +		shame *= alpha * ARC_ALPHA_COST; +	} + +	if(invisi) +	{ +		shame *= invisi * ARC_INVISI_COST; +	} + +	if (glow) +	{ +		shame *= glow * ARC_GLOW_MULT;  	} -	return shame; +	if (bump) +	{ +		shame *= bump * ARC_BUMP_MULT; +	} + +	if (shiny) +	{ +		shame *= shiny * ARC_SHINY_MULT; +	} + + +	// multiply shame by multipliers +	if (weighted_mesh) +	{ +		shame *= weighted_mesh * ARC_WEIGHTED_MESH; +	} + +	if (flexi) +	{ +		shame *= flexi * ARC_FLEXI_MULT; +	} + + +	// add additional costs +	if (particles) +	{ +		const LLPartSysData *part_sys_data = &(mPartSourcep->mPartSysData); +		const LLPartData *part_data = &(part_sys_data->mPartData); +		U32 num_particles = (U32)(part_sys_data->mBurstPartCount * llceil( part_data->mMaxAge / part_sys_data->mBurstRate)); +		num_particles = num_particles > ARC_PARTICLE_MAX ? ARC_PARTICLE_MAX : num_particles; +		F32 part_size = (llmax(part_data->mStartScale[0], part_data->mEndScale[0]) + llmax(part_data->mStartScale[1], part_data->mEndScale[1])) / 2.f; +		shame += num_particles * part_size * ARC_PARTICLE_COST; +	} +	if (produces_light) +	{ +		shame += ARC_LIGHT_COST; +	} + +	if (media_faces) +	{ +		shame += media_faces * ARC_MEDIA_FACE_COST; +	} + +	if (shame > mRenderComplexity_current) +	{ +		mRenderComplexity_current = (S32)shame; +	} + +	return (U32)shame;  } -F32 LLVOVolume::getStreamingCost(S32* bytes, S32* visible_bytes) +F32 LLVOVolume::getStreamingCost(S32* bytes, S32* visible_bytes, F32* unscaled_value) const  { -	F32 radius = getScale().length(); +	F32 radius = getScale().length()*0.5f;  	if (isMesh())  	{	  		LLSD& header = gMeshRepo.getMeshHeader(getVolume()->getParams().getSculptID()); -		return LLMeshRepository::getStreamingCost(header, radius, bytes, visible_bytes, mLOD); +		return LLMeshRepository::getStreamingCost(header, radius, bytes, visible_bytes, mLOD, unscaled_value);  	}  	else  	{ @@ -3116,11 +3255,18 @@ F32 LLVOVolume::getStreamingCost(S32* bytes, S32* visible_bytes)  		header["medium_lod"]["size"] = counts[2] * 10;  		header["high_lod"]["size"] = counts[3] * 10; -		return LLMeshRepository::getStreamingCost(header, radius); +		return LLMeshRepository::getStreamingCost(header, radius, NULL, NULL, -1, unscaled_value);  	}	  } -U32 LLVOVolume::getTriangleCount() +//static  +void LLVOVolume::updateRenderComplexity() +{ +	mRenderComplexity_last = mRenderComplexity_current; +	mRenderComplexity_current = 0; +} + +U32 LLVOVolume::getTriangleCount() const  {  	U32 count = 0;  	LLVolume* volume = getVolume(); @@ -3147,7 +3293,7 @@ U32 LLVOVolume::getHighLODTriangleCount()  	else if (isMesh())  	{  		LLVolume* ref = LLPrimitive::getVolumeManager()->refVolume(volume->getParams(), 3); -		if (ref->isTetrahedron() || ref->getNumVolumeFaces() == 0) +		if (!ref->isMeshAssetLoaded() || ref->getNumVolumeFaces() == 0)  		{  			gMeshRepo.loadMesh(this, volume->getParams(), LLModel::LOD_HIGH);  		} @@ -3433,7 +3579,7 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e  		bool special_cursor = specialHoverCursor();  		for (S32 i = start_face; i < end_face; ++i)  		{ -			if (!special_cursor && !pick_transparent && getTE(i)->getColor().mV[3] == 0.f) +			if (!special_cursor && !pick_transparent && getTE(i) && getTE(i)->getColor().mV[3] == 0.f)  			{ //don't attempt to pick completely transparent faces unless  				//pick_transparent is true  				continue; @@ -3743,6 +3889,11 @@ bool can_batch_texture(LLFace* facep)  		return false;  	} +	if (facep->getTexture() && facep->getTexture()->getPrimaryFormat() == GL_ALPHA) +	{ //can't batch invisiprims +		return false; +	} +  	if (facep->isState(LLFace::TEXTURE_ANIM) && facep->getVirtualSize() > MIN_TEX_ANIM_SIZE)  	{ //texture animation breaks batches  		return false; @@ -3984,13 +4135,14 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  		LLVOVolume* vobj = drawablep->getVOVolume(); -		if (vobj->getVolume() && vobj->getVolume()->isTetrahedron() || (vobj->isMesh() && !gMeshRepo.meshRezEnabled())) +		if (vobj->isMesh() && +			(vobj->getVolume() && !vobj->getVolume()->isMeshAssetLoaded() || !gMeshRepo.meshRezEnabled()))  		{  			continue;  		}  		llassert_always(vobj); -		vobj->updateTextureVirtualSize(); +		vobj->updateTextureVirtualSize(true);  		vobj->preRebuild();  		drawablep->clearState(LLDrawable::HAS_ALPHA); @@ -4361,6 +4513,8 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)  		group->mBuilt = 1.f; +		std::set<LLVertexBuffer*> mapped_buffers; +  		for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter)  		{  			LLFastTimer t(FTM_VOLUME_GEOM_PARTIAL); @@ -4375,35 +4529,31 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)  				for (S32 i = 0; i < drawablep->getNumFaces(); ++i)  				{  					LLFace* face = drawablep->getFace(i); -					if (face && face->getVertexBuffer()) +					if (face)  					{ -						face->getGeometryVolume(*volume, face->getTEOffset(),  -							vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex()); +						LLVertexBuffer* buff = face->getVertexBuffer(); +						if (buff) +						{ +							face->getGeometryVolume(*volume, face->getTEOffset(),  +								vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex()); + +							if (buff->isLocked()) +							{ +								mapped_buffers.insert(buff); +							} +						}  					}  				} - +				  				drawablep->clearState(LLDrawable::REBUILD_ALL);  			}  		} -		//unmap all the buffers -		for (LLSpatialGroup::buffer_map_t::iterator i = group->mBufferMap.begin(); i != group->mBufferMap.end(); ++i) +		for (std::set<LLVertexBuffer*>::iterator iter = mapped_buffers.begin(); iter != mapped_buffers.end(); ++iter)  		{ -			LLSpatialGroup::buffer_texture_map_t& map = i->second; -			for (LLSpatialGroup::buffer_texture_map_t::iterator j = map.begin(); j != map.end(); ++j) -			{ -				LLSpatialGroup::buffer_list_t& list = j->second; -				for (LLSpatialGroup::buffer_list_t::iterator k = list.begin(); k != list.end(); ++k) -				{ -					LLVertexBuffer* buffer = *k; -					if (buffer->isLocked()) -					{ -						buffer->setBuffer(0); -					} -				} -			} +			(*iter)->setBuffer(0);  		} -		 +  		// don't forget alpha  		if(group != NULL &&   		   !group->mVertexBuffer.isNull() &&  @@ -4481,6 +4631,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  		std::sort(faces.begin(), faces.end(), LLFace::CompareDistanceGreater());  	} +	bool hud_group = group->isHUDGroup() ;  	std::vector<LLFace*>::iterator face_iter = faces.begin();  	LLSpatialGroup::buffer_map_t buffer_map; @@ -4713,6 +4864,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  			}  			const LLTextureEntry* te = facep->getTextureEntry(); +			tex = facep->getTexture();  			BOOL is_alpha = (facep->getPoolType() == LLDrawPool::POOL_ALPHA) ? TRUE : FALSE; @@ -4750,7 +4902,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  					registerFace(group, facep, LLRenderPass::PASS_INVISI_SHINY);  					registerFace(group, facep, LLRenderPass::PASS_INVISIBLE);  				} -				else if (LLPipeline::sRenderDeferred) +				else if (LLPipeline::sRenderDeferred && !hud_group)  				{ //deferred rendering  					if (te->getFullbright())  					{ //register in post deferred fullbright shiny pass @@ -4788,7 +4940,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  				else if (fullbright || bake_sunlight)  				{ //fullbright  					registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT); -					if (LLPipeline::sRenderDeferred && LLPipeline::sRenderBump && te->getBumpmap()) +					if (LLPipeline::sRenderDeferred && !hud_group && LLPipeline::sRenderBump && te->getBumpmap())  					{ //if this is the deferred render and a bump map is present, register in post deferred bump  						registerFace(group, facep, LLRenderPass::PASS_POST_BUMP);  					} @@ -4814,7 +4966,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  			}  			//not sure why this is here, and looks like it might cause bump mapped objects to get rendered redundantly -- davep 5/11/2010 -			if (!is_alpha && !LLPipeline::sRenderDeferred) +			if (!is_alpha && (hud_group || !LLPipeline::sRenderDeferred))  			{  				llassert((mask & LLVertexBuffer::MAP_NORMAL) || fullbright);  				facep->setPoolType((fullbright) ? LLDrawPool::POOL_FULLBRIGHT : LLDrawPool::POOL_SIMPLE); diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index fc00f0c0d0..b6347526ee 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -129,9 +129,11 @@ public:  	const LLMatrix4&	getRelativeXform() const				{ return mRelativeXform; }  	const LLMatrix3&	getRelativeXformInvTrans() const		{ return mRelativeXformInvTrans; }  	/*virtual*/	const LLMatrix4	getRenderMatrix() const; -				U32 	getRenderCost(std::set<LLUUID> &textures) const; -	/*virtual*/	F32		getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL); -	/*virtual*/ U32		getTriangleCount(); +				typedef std::map<LLUUID, S32> texture_cost_t; +				U32 	getRenderCost(texture_cost_t &textures) const; +	/*virtual*/	F32		getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL, F32* unscaled_value = NULL) const; + +	/*virtual*/ U32		getTriangleCount() const;  	/*virtual*/ U32		getHighLODTriangleCount();  	/*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,   										  S32 face = -1,                        // which face to check, -1 = ALL_SIDES @@ -206,7 +208,7 @@ public:  	/*virtual*/ BOOL	updateLOD();  				void	updateRadius();  	/*virtual*/ void	updateTextures(); -				void	updateTextureVirtualSize(); +				void	updateTextureVirtualSize(bool forced = false);  				void	updateFaceFlags();  				void	regenFaces(); @@ -320,11 +322,19 @@ protected:  	LLFace* addFace(S32 face_index);  	void updateTEData(); +	// stats tracking for render complexity +	static S32 mRenderComplexity_last; +	static S32 mRenderComplexity_current; +  	void requestMediaDataUpdate(bool isNew);  	void cleanUpMediaImpls();  	void addMediaImpl(LLViewerMediaImpl* media_impl, S32 texture_index) ;  	void removeMediaImpl(S32 texture_index) ;  public: + +	static S32 getRenderComplexityMax() {return mRenderComplexity_last;} +	static void updateRenderComplexity(); +  	LLViewerTextureAnim *mTextureAnimp;  	U8 mTexAnimMode;  private: @@ -359,8 +369,6 @@ public:  	static LLPointer<LLObjectMediaDataClient> sObjectMediaClient;  	static LLPointer<LLObjectMediaNavigateClient> sObjectMediaNavigateClient; -	static const U32 ARC_TEXTURE_COST = 5; -  protected:  	static S32 sNumLODChanges; diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp index 69ebad61ac..e70ac0a2e7 100644 --- a/indra/newview/llvowater.cpp +++ b/indra/newview/llvowater.cpp @@ -282,6 +282,11 @@ void LLVOWater::updateSpatialExtents(LLVector4a &newMin, LLVector4a& newMax)  U32 LLVOWater::getPartitionType() const  {  +	if (mIsEdgePatch) +	{ +		return LLViewerRegion::PARTITION_VOIDWATER; +	} +  	return LLViewerRegion::PARTITION_WATER;   } @@ -300,6 +305,7 @@ LLWaterPartition::LLWaterPartition()  LLVoidWaterPartition::LLVoidWaterPartition()  { +	mOcclusionEnabled = FALSE;  	mDrawableType = LLPipeline::RENDER_TYPE_VOIDWATER;  	mPartitionType = LLViewerRegion::PARTITION_VOIDWATER;  } diff --git a/indra/newview/llwatchdog.cpp b/indra/newview/llwatchdog.cpp index 1694126802..4f582fc2db 100644 --- a/indra/newview/llwatchdog.cpp +++ b/indra/newview/llwatchdog.cpp @@ -126,8 +126,8 @@ void LLWatchdogTimeout::start(const std::string& state)  	// Order of operation is very impmortant here.  	// After LLWatchdogEntry::start() is called  	// LLWatchdogTimeout::isAlive() will be called asynchronously.  -	mTimer.start();   	ping(state); +	mTimer.start();   	LLWatchdogEntry::start();  } diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index d1c0990f90..d8aa0b7d5c 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -30,13 +30,13 @@  #include "llagentcamera.h"  #include "llagentwearables.h"  #include "lldictionary.h" +#include "llfloatersidepanelcontainer.h"  #include "lllocaltextureobject.h"  #include "llnotificationsutil.h"  #include "llviewertexturelist.h"  #include "llinventorymodel.h"  #include "llinventoryobserver.h"  #include "llsidepanelappearance.h" -#include "llsidetray.h"  #include "lltexlayer.h"  #include "lltexglobalcolor.h"  #include "lltrans.h" @@ -697,7 +697,7 @@ void LLWearable::removeFromAvatar( LLWearableType::EType type, BOOL upload_bake  	if(gAgentCamera.cameraCustomizeAvatar())  	{ -		LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit")); +		LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit"));  	}  	gAgentAvatarp->updateVisualParams(); @@ -967,7 +967,7 @@ void LLWearable::revertValues()  	syncImages(mSavedTEMap, mTEMap); -	LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLSideTray::getInstance()->getPanel("sidepanel_appearance")); +	LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance"));  	if( panel )  	{  		panel->updateScrollingPanelList(); @@ -1008,7 +1008,7 @@ void LLWearable::saveValues()  	syncImages(mTEMap, mSavedTEMap); -	LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLSideTray::getInstance()->getPanel("sidepanel_appearance")); +	LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance"));  	if( panel )  	{  		panel->updateScrollingPanelList(); diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index b73017a51a..b2f35892d0 100644 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -81,19 +81,20 @@ void LLWeb::initClass()  // static  void LLWeb::loadURL(const std::string& url, const std::string& target, const std::string& uuid)  { -	if(target == "_internal") -	{ -		// Force load in the internal browser, as if with a blank target. -		loadURLInternal(url, "", uuid); -	} -	else if (gSavedSettings.getBOOL("UseExternalBrowser") || (target == "_external")) -	{ -		loadURLExternal(url); -	} -	else -	{ -		loadURLInternal(url, target, uuid); -	} +	loadWebURL(url, target, uuid); +	//if(target == "_internal") +	//{ +	//	// Force load in the internal browser, as if with a blank target. +	//	loadURLInternal(url, "", uuid); +	//} +	//else if (gSavedSettings.getBOOL("UseExternalBrowser") || (target == "_external")) +	//{ +	//	loadURLExternal(url); +	//} +	//else +	//{ +	//	loadURLInternal(url, target, uuid); +	//}  }  // static @@ -124,17 +125,17 @@ void LLWeb::loadURLInternal(const std::string &url, const std::string& target, c  // Explicitly open a Web URL using the Web content floater  void LLWeb::loadWebURLInternal(const std::string &url, const std::string& target, const std::string& uuid)  { -	LLFloaterWebContent::create(url, target, uuid); +	LLFloaterWebContent::Params p; +	p.url(url).target(target).id(uuid); +	LLFloaterReg::showInstance("web_content", p);  } -  // static  void LLWeb::loadURLExternal(const std::string& url, const std::string& uuid)  {  	loadURLExternal(url, true, uuid);  } -  // static  void LLWeb::loadURLExternal(const std::string& url, bool async, const std::string& uuid)  { @@ -209,6 +210,7 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url,  	substitution["VERSION_BUILD"] = LLVersionInfo::getBuild();  	substitution["CHANNEL"] = LLVersionInfo::getChannel();  	substitution["GRID"] = LLGridManager::getInstance()->getGridLabel(); +	substitution["GRID_LOWERCASE"] = utf8str_tolower(LLGridManager::getInstance()->getGridLabel());  	substitution["OS"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();  	substitution["SESSION_ID"] = gAgent.getSessionID();  	substitution["FIRST_LOGIN"] = gAgent.isFirstLogin(); diff --git a/indra/newview/llweb.h b/indra/newview/llweb.h index dc5958e57f..376abc0ece 100644 --- a/indra/newview/llweb.h +++ b/indra/newview/llweb.h @@ -46,21 +46,19 @@ public:  	static void loadURL(const std::string& url, const std::string& target, const std::string& uuid = LLStringUtil::null);  	static void loadURL(const std::string& url) { loadURL(url, LLStringUtil::null); }  	/// Load the given url in the user's preferred web browser	 -	static void loadURL(const char* url, const std::string& target) { loadURL( ll_safe_string(url), target); } -	static void loadURL(const char* url) { loadURL( ll_safe_string(url), LLStringUtil::null ); } +	static void loadURL(const char* url, const std::string& target = LLStringUtil::null) { loadURL( ll_safe_string(url), target); }  	/// Load the given url in the Second Life internal web browser  	static void loadURLInternal(const std::string &url, const std::string& target, const std::string& uuid = LLStringUtil::null); -	static void loadURLInternal(const std::string &url) { loadURLInternal(url, LLStringUtil::null); } +	static void loadURLInternal(const std::string &url) { loadURLInternal(url, LLStringUtil::null, LLStringUtil::null);}  	/// Load the given url in the operating system's web browser, async if we want to return immediately  	/// before browser has spawned -	static void loadURLExternal(const std::string& url) { loadURLExternal(url,  LLStringUtil::null); }; +	static void loadURLExternal(const std::string& url) {loadURLExternal(url, LLStringUtil::null);}  	static void loadURLExternal(const std::string& url, const std::string& uuid);  	static void loadURLExternal(const std::string& url, bool async, const std::string& uuid = LLStringUtil::null);  	// Explicitly open a Web URL using the Web content floater vs. the more general media browser  	static void loadWebURL(const std::string& url, const std::string& target, const std::string& uuid); -	static void loadWebURLInternal(const std::string &url, const std::string& target, const std::string& uuid); -	static void loadWebURLInternal(const std::string &url) { loadWebURLInternal(url, LLStringUtil::null, LLStringUtil::null); } +	static void loadWebURLInternal(const std::string &url, const std::string& target = LLStringUtil::null, const std::string& uuid = LLStringUtil::null);  	/// Returns escaped url (eg, " " to "%20") - used by all loadURL methods  	static std::string escapeURL(const std::string& url); diff --git a/indra/newview/llwindowlistener.cpp b/indra/newview/llwindowlistener.cpp new file mode 100644 index 0000000000..28f959eb71 --- /dev/null +++ b/indra/newview/llwindowlistener.cpp @@ -0,0 +1,505 @@ +/**  + * @file llwindowlistener.cpp + * @brief EventAPI interface for injecting input into LLWindow + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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 "linden_common.h" + +#include "llwindowlistener.h" + +#include "llcoord.h" +#include "llfocusmgr.h" +#include "llkeyboard.h" +#include "llwindowcallbacks.h" +#include "llui.h" +#include "llview.h" +#include "llviewinject.h" +#include "llviewerwindow.h" +#include "llviewerkeyboard.h" +#include "llrootview.h" +#include "llsdutil.h" +#include "stringize.h" +#include <typeinfo> +#include <map> +#include <boost/scoped_ptr.hpp> +#include <boost/lambda/core.hpp> +#include <boost/lambda/bind.hpp> + +namespace bll = boost::lambda; + +LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter& kbgetter) +	: LLEventAPI("LLWindow", "Inject input events into the LLWindow instance"), +	  mWindow(window), +	  mKbGetter(kbgetter) +{ +	std::string keySomething = +		"Given [\"keysym\"], [\"keycode\"] or [\"char\"], inject the specified "; +	std::string keyExplain = +		"(integer keycode values, or keysym string from any addKeyName() call in\n" +		"http://hg.secondlife.com/viewer-development/src/tip/indra/llwindow/llkeyboard.cpp )\n"; +	std::string mask = +		"Specify optional [\"mask\"] as an array containing any of \"CTL\", \"ALT\",\n" +		"\"SHIFT\" or \"MAC_CONTROL\"; the corresponding modifier bits will be combined\n" +		"to form the mask used with the event."; + +	std::string given = "Given "; +	std::string mouseParams = +		"optional [\"path\"], optional [\"x\"] and [\"y\"], inject the requested mouse "; +	std::string buttonParams = +		std::string("[\"button\"], ") + mouseParams; +	std::string buttonExplain = +		"(button values \"LEFT\", \"MIDDLE\", \"RIGHT\")\n"; +	std::string paramsExplain = +		"[\"path\"] is as for LLUI::resolvePath(), described in\n" +		"http://hg.secondlife.com/viewer-development/src/tip/indra/llui/llui.h\n" +		"If you omit [\"path\"], you must specify both [\"x\"] and [\"y\"].\n" +		"If you specify [\"path\"] without both [\"x\"] and [\"y\"], will synthesize (x, y)\n" +		"in the center of the LLView selected by [\"path\"].\n" +		"You may specify [\"path\"] with both [\"x\"] and [\"y\"], will use your (x, y).\n" +		"This may cause the LLView selected by [\"path\"] to reject the event.\n" +		"Optional [\"reply\"] requests a reply event on the named LLEventPump.\n" +		"reply[\"error\"] isUndefined (None) on success, else an explanatory message.\n"; + +	add("getInfo", +		"Get information about the ui element specified by [\"path\"]", +		&LLWindowListener::getInfo, +		LLSDMap("reply", LLSD())); +	add("getPaths", +		"Send on [\"reply\"] an event in which [\"paths\"] is an array of valid LLView\n" +		"pathnames. Optional [\"under\"] pathname specifies the base node under which\n" +		"to list; all nodes from root if no [\"under\"].", +		&LLWindowListener::getPaths, +		LLSDMap("reply", LLSD())); +	add("keyDown", +		keySomething + "keypress event.\n" + keyExplain + mask, +		&LLWindowListener::keyDown); +	add("keyUp", +		keySomething + "key release event.\n" + keyExplain + mask, +		&LLWindowListener::keyUp); +	add("mouseDown", +		given + buttonParams + "click event.\n" + buttonExplain + paramsExplain + mask, +		&LLWindowListener::mouseDown); +	add("mouseUp", +		given + buttonParams + "release event.\n" + buttonExplain + paramsExplain + mask, +		&LLWindowListener::mouseUp); +	add("mouseMove", +		given + mouseParams + "movement event.\n" + paramsExplain + mask, +		&LLWindowListener::mouseMove); +	add("mouseScroll", +		"Given an integer number of [\"clicks\"], inject the requested mouse scroll event.\n" +		"(positive clicks moves downward through typical content)", +		&LLWindowListener::mouseScroll); +} + +template <typename MAPPED> +class StringLookup +{ +private: +	std::string mDesc; +	typedef std::map<std::string, MAPPED> Map; +	Map mMap; + +public: +	StringLookup(const std::string& desc): mDesc(desc) {} + +	MAPPED lookup(const typename Map::key_type& key) const +	{ +		typename Map::const_iterator found = mMap.find(key); +		if (found == mMap.end()) +		{ +			LL_WARNS("LLWindowListener") << "Unknown " << mDesc << " '" << key << "'" << LL_ENDL; +			return MAPPED(); +		} +		return found->second; +	} + +protected: +	void add(const typename Map::key_type& key, const typename Map::mapped_type& value) +	{ +		mMap.insert(typename Map::value_type(key, value)); +	} +}; + +namespace { + +// helper for getMask() +MASK lookupMask_(const std::string& maskname) +{ +	// It's unclear to me whether MASK_MAC_CONTROL is important, but it's not +	// supported by maskFromString(). Handle that specially. +	if (maskname == "MAC_CONTROL") +	{ +		return MASK_MAC_CONTROL; +	} +	else +	{ +		// In case of lookup failure, return MASK_NONE, which won't affect our +		// caller's OR. +		MASK mask(MASK_NONE); +		LLKeyboard::maskFromString(maskname, &mask); +		return mask; +	} +} + +MASK getMask(const LLSD& event) +{ +	LLSD masknames(event["mask"]); +	if (! masknames.isArray()) +	{ +		// If event["mask"] is a single string, perform normal lookup on it. +		return lookupMask_(masknames); +	} + +	// Here event["mask"] is an array of mask-name strings. OR together their +	// corresponding bits. +	MASK mask(MASK_NONE); +	for (LLSD::array_const_iterator ai(masknames.beginArray()), aend(masknames.endArray()); +		 ai != aend; ++ai) +	{ +		mask |= lookupMask_(*ai); +	} +	return mask; +} + +KEY getKEY(const LLSD& event) +{ +    if (event.has("keysym")) +	{ +		// Initialize to KEY_NONE; that way we can ignore the bool return from +		// keyFromString() and, in the lookup-fail case, simply return KEY_NONE. +		KEY key(KEY_NONE); +		LLKeyboard::keyFromString(event["keysym"], &key); +		return key; +	} +	else if (event.has("keycode")) +	{ +		return KEY(event["keycode"].asInteger()); +	} +	else +	{ +		return KEY(event["char"].asString()[0]); +	} +} + +} // namespace + +void LLWindowListener::getInfo(LLSD const & evt) +{ +	Response response(LLSD(), evt); +	 +	if (evt.has("path")) +	{ +		std::string path(evt["path"]); +		LLView * target_view = LLUI::resolvePath(LLUI::getRootView(), path); +		if (target_view != 0) +		{ +			response.setResponse(target_view->getInfo()); +		} +		else  +		{ +			response.error(STRINGIZE(evt["op"].asString() << " request " +											"specified invalid \"path\": '" << path << "'")); +		} +	} +	else  +	{ +		response.error( +			STRINGIZE(evt["op"].asString() << "request did not provide a path" )); +	} +} + +void LLWindowListener::getPaths(LLSD const & request) +{ +	Response response(LLSD(), request); +	LLView *root(LLUI::getRootView()), *base(NULL); +	// Capturing request["under"] as string means we conflate the case in +	// which there is no ["under"] key with the case in which its value is the +	// empty string. That seems to make sense to me. +	std::string under(request["under"]); + +	// Deal with optional "under" parameter +	if (under.empty()) +	{ +		base = root; +	} +	else +	{ +		base = LLUI::resolvePath(root, under); +		if (! base) +		{ +			return response.error(STRINGIZE(request["op"].asString() << " request " +											"specified invalid \"under\" path: '" << under << "'")); +		} +	} + +	// Traverse the entire subtree under 'base', collecting pathnames +	for (LLView::tree_iterator_t ti(base->beginTreeDFS()), tend(base->endTreeDFS()); +		 ti != tend; ++ti) +	{ +		response["paths"].append((*ti)->getPathname()); +	} +} + +void LLWindowListener::keyDown(LLSD const & evt) +{ +	Response response(LLSD(), evt); +	 +	if (evt.has("path")) +	{ +		std::string path(evt["path"]); +		LLView * target_view = LLUI::resolvePath(LLUI::getRootView(), path); +		if (target_view == 0)  +		{ +			response.error(STRINGIZE(evt["op"].asString() << " request " +											"specified invalid \"path\": '" << path << "'")); +		} +		else if(target_view->isAvailable()) +		{ +			response.setResponse(target_view->getInfo()); +			 +			gFocusMgr.setKeyboardFocus(target_view); +			KEY key = getKEY(evt); +			MASK mask = getMask(evt); +			gViewerKeyboard.handleKey(key, mask, false); +			if(key < 0x80) mWindow->handleUnicodeChar(key, mask); +		} +		else  +		{ +			response.error(STRINGIZE(evt["op"].asString() << " request " +											"element specified by \"path\": '" << path << "'"  +											<< " is not visible")); +		} +	} +	else  +	{ +		mKbGetter()->handleTranslatedKeyDown(getKEY(evt), getMask(evt)); +	} +} + +void LLWindowListener::keyUp(LLSD const & evt) +{ +	Response response(LLSD(), evt); + +	if (evt.has("path")) +	{ +		std::string path(evt["path"]); +		LLView * target_view = LLUI::resolvePath(LLUI::getRootView(), path); +		if (target_view == 0 ) +		{ +			response.error(STRINGIZE(evt["op"].asString() << " request " +											"specified invalid \"path\": '" << path << "'")); +		} +		else if (target_view->isAvailable()) +		{ +			response.setResponse(target_view->getInfo()); + +			gFocusMgr.setKeyboardFocus(target_view); +			mKbGetter()->handleTranslatedKeyUp(getKEY(evt), getMask(evt)); +		} +		else  +		{ +			response.error(STRINGIZE(evt["op"].asString() << " request " +											"element specified byt \"path\": '" << path << "'"  +											<< " is not visible")); +		} +	} +	else  +	{ +		mKbGetter()->handleTranslatedKeyUp(getKEY(evt), getMask(evt)); +	} +} + +// for WhichButton +typedef BOOL (LLWindowCallbacks::*MouseMethod)(LLWindow *, LLCoordGL, MASK); +struct Actions +{ +	Actions(const MouseMethod& d, const MouseMethod& u): down(d), up(u), valid(true) {} +	Actions(): valid(false) {} +	MouseMethod down, up; +	bool valid; +}; + +struct WhichButton: public StringLookup<Actions> +{ +	WhichButton(): StringLookup<Actions>("mouse button") +	{ +		add("LEFT",		Actions(&LLWindowCallbacks::handleMouseDown, +								&LLWindowCallbacks::handleMouseUp)); +		add("RIGHT",	Actions(&LLWindowCallbacks::handleRightMouseDown, +								&LLWindowCallbacks::handleRightMouseUp)); +		add("MIDDLE",	Actions(&LLWindowCallbacks::handleMiddleMouseDown, +								&LLWindowCallbacks::handleMiddleMouseUp)); +	} +}; +static WhichButton buttons; + +typedef boost::function<bool(LLCoordGL, MASK)> MouseFunc; + +static void mouseEvent(const MouseFunc& func, const LLSD& request) +{ +	// Ensure we send response +	LLEventAPI::Response response(LLSD(), request); +	// We haven't yet established whether the incoming request has "x" and "y", +	// but capture this anyway, with 0 for omitted values. +	LLCoordGL pos(request["x"].asInteger(), request["y"].asInteger()); +	bool has_pos(request.has("x") && request.has("y")); + +	boost::scoped_ptr<LLView::TemporaryDrilldownFunc> tempfunc; + +	// Documentation for mouseDown(), mouseUp() and mouseMove() claims you +	// must either specify ["path"], or both of ["x"] and ["y"]. You MAY +	// specify all. Let's say that passing "path" as an empty string is +	// equivalent to not passing it at all. +	std::string path(request["path"]); +	if (path.empty()) +	{ +		// Without "path", you must specify both "x" and "y". +		if (! has_pos) +		{ +			return response.error(STRINGIZE(request["op"].asString() << " request " +											"without \"path\" must specify both \"x\" and \"y\": " +											<< request)); +		} +	} +	else // ! path.empty() +	{ +		LLView* root   = LLUI::getRootView(); +		LLView* target = LLUI::resolvePath(root, path); +		if (! target) +		{ +			return response.error(STRINGIZE(request["op"].asString() << " request " +											"specified invalid \"path\": '" << path << "'")); +		} + +		response.setResponse(target->getInfo()); + +		// The intent of this test is to prevent trying to drill down to a +		// widget in a hidden floater, or on a tab that's not current, etc. +		if (! target->isInVisibleChain()) +		{ +			return response.error(STRINGIZE(request["op"].asString() << " request " +											"specified \"path\" not currently visible: '" +											<< path << "'")); +		} + +		// This test isn't folded in with the above error case since you can +		// (e.g.) pop up a tooltip even for a disabled widget. +		if (! target->isInEnabledChain()) +		{ +			response.warn(STRINGIZE(request["op"].asString() << " request " +									"specified \"path\" not currently enabled: '" +									<< path << "'")); +		} + +		if (! has_pos) +		{ +			LLRect rect(target->calcScreenRect()); +			pos.set(rect.getCenterX(), rect.getCenterY()); +			// nonstandard warning tactic: probably usual case; we want event +			// sender to know synthesized (x, y), but maybe don't need to log? +			response["warnings"].append(STRINGIZE("using center point (" +												  << pos.mX << ", " << pos.mY << ")")); +		} + +/*==========================================================================*| +		// NEVER MIND: the LLView tree defines priority handler layers in +		// front of the normal widget set, so this has never yet produced +		// anything but spam warnings. (sigh) + +		// recursive childFromPoint() should give us the frontmost, leafmost +		// widget at the specified (x, y). +		LLView* frontmost = root->childFromPoint(pos.mX, pos.mY, true); +		if (frontmost != target) +		{ +			response.warn(STRINGIZE(request["op"].asString() << " request " +									"specified \"path\" = '" << path +									<< "', but frontmost LLView at (" << pos.mX << ", " << pos.mY +									<< ") is '" << LLView::getPathname(frontmost) << "'")); +		} +|*==========================================================================*/ + +		// Instantiate a TemporaryDrilldownFunc to route incoming mouse events +		// to the target LLView*. But put it on the heap since "path" is +		// optional. Nonetheless, manage it with a boost::scoped_ptr so it +		// will be destroyed when we leave. +		tempfunc.reset(new LLView::TemporaryDrilldownFunc(llview::TargetEvent(target))); +	} + +	// The question of whether the requested LLView actually handled the +	// specified event is important enough, and its handling unclear enough, +	// to warrant a separate response attribute. Instead of deciding here to +	// make it a warning, or an error, let caller decide. +	response["handled"] = func(pos, getMask(request)); + +	// On exiting this scope, response will send, tempfunc will restore the +	// normal pointInView(x, y) containment logic, etc. +} + +void LLWindowListener::mouseDown(LLSD const & request) +{ +	Actions actions(buttons.lookup(request["button"])); +	if (actions.valid) +	{ +		// Normally you can pass NULL to an LLWindow* without compiler +		// complaint, but going through boost::lambda::bind() evidently +		// bypasses that special case: it only knows you're trying to pass an +		// int to a pointer. Explicitly cast NULL to the desired pointer type. +		mouseEvent(bll::bind(actions.down, mWindow, +							 static_cast<LLWindow*>(NULL), bll::_1, bll::_2), +				   request); +	} +} + +void LLWindowListener::mouseUp(LLSD const & request) +{ +	Actions actions(buttons.lookup(request["button"])); +	if (actions.valid) +	{ +		mouseEvent(bll::bind(actions.up, mWindow, +							 static_cast<LLWindow*>(NULL), bll::_1, bll::_2), +				   request); +	} +} + +void LLWindowListener::mouseMove(LLSD const & request) +{ +	// We want to call the same central mouseEvent() routine for +	// handleMouseMove() as for button clicks. But handleMouseMove() returns +	// void, whereas mouseEvent() accepts a function returning bool -- and +	// uses that bool return. Use (void-lambda-expression, true) to construct +	// a callable that returns bool anyway. Pass 'true' because we expect that +	// our caller will usually treat 'false' as a problem. +	mouseEvent((bll::bind(&LLWindowCallbacks::handleMouseMove, mWindow, +						  static_cast<LLWindow*>(NULL), bll::_1, bll::_2), +				true), +			   request); +} + +void LLWindowListener::mouseScroll(LLSD const & request) +{ +	S32 clicks = request["clicks"].asInteger(); + +	mWindow->handleScrollWheel(NULL, clicks); +} diff --git a/indra/newview/llfloatersidetraytab.h b/indra/newview/llwindowlistener.h index 89f2444a0e..7af5ab3b9f 100644 --- a/indra/newview/llfloatersidetraytab.h +++ b/indra/newview/llwindowlistener.h @@ -1,8 +1,8 @@  /**  - * @file llfloatersidetraytab.h - * @brief LLFloaterSideTrayTab class definition + * @file llwindowlistener.h + * @brief EventAPI interface for injecting input into LLWindow   * - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ + * $LicenseInfo:firstyear=2001&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2010, Linden Research, Inc.   *  @@ -24,26 +24,34 @@   * $/LicenseInfo$   */ -#ifndef LL_LLFLOATERSIDETRAYTAB_H -#define LL_LLFLOATERSIDETRAYTAB_H +#ifndef LL_LLWINDOWLISTENER_H +#define LL_LLWINDOWLISTENER_H -#include "llfloater.h" +#include "lleventapi.h" +#include <boost/function.hpp> -/** - * When a side tray tab gets detached, it's wrapped in an instance of this class. - * - * This class helps to make sure that clicking a detached side tray tab doesn't - * make transient floaters (e.g. IM windows) hide, so that it's possible to - * drag an inventory item from detached My Inventory window to a docked IM window, - * i.e. share the item (see VWR-22891). - */ -class LLFloaterSideTrayTab : public LLFloater +class LLKeyboard; +class LLViewerWindow; + +class LLWindowListener : public LLEventAPI  {  public: -	LLFloaterSideTrayTab(const LLSD& key, const Params& params = getDefaultParams()); -	~LLFloaterSideTrayTab(); +	typedef boost::function<LLKeyboard*()> KeyboardGetter; +	LLWindowListener(LLViewerWindow * window, const KeyboardGetter& kbgetter); -	void onClose(bool app_quitting); +	void getInfo(LLSD const & evt); +	void getPaths(LLSD const & evt); +	void keyDown(LLSD const & evt); +	void keyUp(LLSD const & evt); +	void mouseDown(LLSD const & evt); +	void mouseUp(LLSD const & evt); +	void mouseMove(LLSD const & evt); +	void mouseScroll(LLSD const & evt); + +private: +	LLViewerWindow * mWindow; +	KeyboardGetter mKbGetter;  }; -#endif // LL_LLFLOATERSIDETRAYTAB_H + +#endif // LL_LLWINDOWLISTENER_H diff --git a/indra/newview/llwlhandlers.cpp b/indra/newview/llwlhandlers.cpp index b5f53232cc..2425b96678 100644 --- a/indra/newview/llwlhandlers.cpp +++ b/indra/newview/llwlhandlers.cpp @@ -2,31 +2,25 @@   * @file llwlhandlers.cpp   * @brief Various classes which handle Windlight-related messaging   * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - *  - * Copyright (c) 2009, Linden Research, Inc. - *  + * $LicenseInfo:firstyear=2009&license=viewerlgpl$   * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab.  Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * Copyright (C) 2011, 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.   *  - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * 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.   *  - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * 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   *  - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ diff --git a/indra/newview/llwlhandlers.h b/indra/newview/llwlhandlers.h index 213bc7c7ce..23558876da 100644 --- a/indra/newview/llwlhandlers.h +++ b/indra/newview/llwlhandlers.h @@ -2,31 +2,25 @@   * @file llwlhandlers.h   * @brief Headers for classes in llwlhandlers.cpp   * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - *  - * Copyright (c) 2009, Linden Research, Inc. - *  + * $LicenseInfo:firstyear=2009&license=viewerlgpl$   * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab.  Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * Copyright (C) 2011, 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.   *  - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * 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.   *  - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * 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   *  - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 4a6ec7fdbb..a7ae456f3c 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -127,6 +127,12 @@ void LLWorld::destroyClass()  		LLVOCache::getInstance()->destroyClass() ;  	}  	LLViewerPartSim::getInstance()->destroyClass(); + +	mDefaultWaterTexturep = NULL ; +	for (S32 i = 0; i < 8; i++) +	{ +		mEdgeWaterObjects[i] = NULL; +	}  } diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 8cdb615686..265d5dc801 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -1752,13 +1752,13 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask )  		case MAP_ITEM_LAND_FOR_SALE_ADULT:  			{  				LLFloaterReg::hideInstance("world_map"); -				LLFloaterReg::showInstance("search", LLSD().with("category", "destinations").with("id", id)); +				LLFloaterReg::showInstance("search", LLSD().with("category", "destinations").with("query", id));  				break;  			}  		case MAP_ITEM_CLASSIFIED:  			{  				LLFloaterReg::hideInstance("world_map"); -				LLFloaterReg::showInstance("search", LLSD().with("category", "classifieds").with("id", id)); +				LLFloaterReg::showInstance("search", LLSD().with("category", "classifieds").with("query", id));  				break;  			}  		default: diff --git a/indra/newview/llworldview.cpp b/indra/newview/llworldview.cpp deleted file mode 100644 index f5dc2a5290..0000000000 --- a/indra/newview/llworldview.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/**  - * @file llworldview.cpp - * @brief LLWorldView class implementation - * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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 "llworldview.h" - -#include "llviewercontrol.h" -#include "llsidetray.h" -///////////////////////////////////////////////////// -// LLFloaterView - -static LLDefaultChildRegistry::Register<LLWorldView> r("world_view"); - -LLWorldView::LLWorldView(const Params& p) -:	LLUICtrl (p) -{ -	gSavedSettings.getControl("SidebarCameraMovement")->getSignal()->connect(boost::bind(&LLWorldView::toggleSidebarCameraMovement, this, _2)); -} - -void LLWorldView::reshape(S32 width, S32 height, BOOL called_from_parent) -{ -	//if (FALSE == gSavedSettings.getBOOL("SidebarCameraMovement") ) -	//{ -	//	LLView* main_view = LLUI::getRootView()->findChild<LLView>("main_view"); -	//	if(main_view) -	//	{ -	//		width = main_view->getRect().getWidth(); -	//	} -	//} -	 -	LLUICtrl::reshape(width, height, called_from_parent); -} -void LLWorldView::toggleSidebarCameraMovement(const LLSD::Boolean& new_visibility) -{ -	reshape(getParent()->getRect().getWidth(),getRect().getHeight()); -} - diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index 257884d921..f483ba5af8 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -306,19 +306,8 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)  		mCurlRequest = new LLCurlEasyRequest();  	}  	mErrorCert = NULL; -	 -	if (gSavedSettings.getBOOL("BrowserProxyEnabled")) -	{ -		mProxyAddress = gSavedSettings.getString("BrowserProxyAddress"); -		S32 port = gSavedSettings.getS32 ( "BrowserProxyPort" ); - -		// tell curl about the settings -		mCurlRequest->setoptString(CURLOPT_PROXY, mProxyAddress); -		mCurlRequest->setopt(CURLOPT_PROXYPORT, port); -		mCurlRequest->setopt(CURLOPT_PROXYTYPE, CURLPROXY_HTTP); -	} -//	mCurlRequest->setopt(CURLOPT_VERBOSE, 1); // usefull for debugging +//	mCurlRequest->setopt(CURLOPT_VERBOSE, 1); // useful for debugging  	mCurlRequest->setopt(CURLOPT_NOSIGNAL, 1);  	mCurlRequest->setWriteCallback(&curlDownloadCallback, (void*)this);  	BOOL vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert"); @@ -394,16 +383,18 @@ bool LLXMLRPCTransaction::Impl::process()  		}  	} -	const F32 MAX_PROCESSING_TIME = 0.05f; -	LLTimer timer; +	//const F32 MAX_PROCESSING_TIME = 0.05f; +	//LLTimer timer; + +	mCurlRequest->perform(); -	while (mCurlRequest->perform() > 0) +	/*while (mCurlRequest->perform() > 0)  	{  		if (timer.getElapsedTimeF32() >= MAX_PROCESSING_TIME)  		{  			return false;  		} -	} +	}*/  	while(1)  	{ diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index e74bf2a620..a50f66f282 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -103,6 +103,7 @@  #include "llmutelist.h"  #include "lltoolpie.h"  #include "llcurl.h" +#include "llnotifications.h"  void check_stack_depth(S32 stack_depth) @@ -317,6 +318,7 @@ BOOL	LLPipeline::sRenderFrameTest = FALSE;  BOOL	LLPipeline::sRenderAttachedLights = TRUE;  BOOL	LLPipeline::sRenderAttachedParticles = TRUE;  BOOL	LLPipeline::sRenderDeferred = FALSE; +BOOL    LLPipeline::sMemAllocationThrottled = FALSE;  S32		LLPipeline::sVisibleLightCount = 0;  F32		LLPipeline::sMinRenderSize = 0.f; @@ -336,10 +338,10 @@ static const U32 gl_cube_face[] =  void validate_framebuffer_object(); -void addDeferredAttachments(LLRenderTarget& target) +bool addDeferredAttachments(LLRenderTarget& target)  { -	target.addColorAttachment(GL_RGBA); //specular -	target.addColorAttachment(GL_RGBA); //normal+z	 +	return target.addColorAttachment(GL_RGBA) && //specular +			target.addColorAttachment(GL_RGBA); //normal+z	  }  LLPipeline::LLPipeline() : @@ -561,6 +563,24 @@ void LLPipeline::destroyGL()  static LLFastTimer::DeclareTimer FTM_RESIZE_SCREEN_TEXTURE("Resize Screen Texture"); +//static +void LLPipeline::throttleNewMemoryAllocation(BOOL disable) +{ +	if(sMemAllocationThrottled != disable) +	{ +		sMemAllocationThrottled = disable ; + +		if(sMemAllocationThrottled) +		{ +			//send out notification +			LLNotification::Params params("LowMemory"); +			LLNotifications::instance().add(params); + +			//release some memory. +		} +	} +} +  void LLPipeline::resizeScreenTexture()  {  	LLFastTimer ft(FTM_RESIZE_SCREEN_TEXTURE); @@ -586,18 +606,61 @@ void LLPipeline::allocatePhysicsBuffer()  void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  { -	// remember these dimensions -	mScreenWidth = resX; -	mScreenHeight = resY; -	 -	//cap samples at 4 for render targets to avoid out of memory errors  	U32 samples = gGLManager.getNumFBOFSAASamples(gSavedSettings.getU32("RenderFSAASamples"));  	if (gGLManager.mIsATI) -	{ //disable multisampling of render targets where ATI is involved +	{ //ATI doesn't like the way we use multisample texture  		samples = 0;  	} +	//try to allocate screen buffers at requested resolution and samples +	// - on failure, shrink number of samples and try again +	// - if not multisampled, shrink resolution and try again (favor X resolution over Y) +	// Make sure to call "releaseScreenBuffers" after each failure to cleanup the partially loaded state + +	if (!allocateScreenBuffer(resX, resY, samples)) +	{ +		releaseScreenBuffers(); +		//reduce number of samples  +		while (samples > 0) +		{ +			samples /= 2; +			if (allocateScreenBuffer(resX, resY, samples)) +			{ //success +				return; +			} +			releaseScreenBuffers(); +		} + +		//reduce resolution +		while (resY > 0 && resX > 0) +		{ +			resY /= 2; +			if (allocateScreenBuffer(resX, resY, samples)) +			{ +				return; +			} +			releaseScreenBuffers(); + +			resX /= 2; +			if (allocateScreenBuffer(resX, resY, samples)) +			{ +				return; +			} +			releaseScreenBuffers(); +		} + +		llwarns << "Unable to allocate screen buffer at any resolution!" << llendl; +	} +} + + +bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples) +{ +	// remember these dimensions +	mScreenWidth = resX; +	mScreenHeight = resY; +	  	U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor");  	if (res_mod > 1 && res_mod < resX && res_mod < resY) @@ -608,7 +671,10 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  	if (gSavedSettings.getBOOL("RenderUIBuffer"))  	{ -		mUIScreen.allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); +		if (!mUIScreen.allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) +		{ +			return false; +		}  	}	  	if (LLPipeline::sRenderDeferred) @@ -618,22 +684,22 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  		bool gi = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED);  		//allocate deferred rendering color buffers -		mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples); -		mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples); -		addDeferredAttachments(mDeferredScreen); +		if (!mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; +		if (!mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; +		if (!addDeferredAttachments(mDeferredScreen)) return false; -		mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples);		 +		if (!mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;  #if LL_DARWIN  		// As of OS X 10.6.7, Apple doesn't support multiple color formats in a single FBO -		mEdgeMap.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); +		if (!mEdgeMap.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;  #else -		mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); +		if (!mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;  #endif  		if (shadow_detail > 0 || ssao)  		{ //only need mDeferredLight[0] for shadows OR ssao -			mDeferredLight[0].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); +			if (!mDeferredLight[0].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;  		}  		else  		{ @@ -642,7 +708,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  		if (ssao)  		{ //only need mDeferredLight[1] for ssao -			mDeferredLight[1].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false); +			if (!mDeferredLight[1].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false)) return false;  		}  		else  		{ @@ -651,14 +717,14 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  		if (gi)  		{ //only need mDeferredLight[2] and mGIMapPost for gi -			mDeferredLight[2].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false); +			if (!mDeferredLight[2].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false)) return false;  			for (U32 i = 0; i < 2; i++)  			{  #if LL_DARWIN  				// As of OS X 10.6.7, Apple doesn't support multiple color formats in a single FBO -				mGIMapPost[i].allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE); +				if (!mGIMapPost[i].allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE)) return false;  #else -				mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE); +				if (!mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE)) return false;  #endif  			}  		} @@ -685,7 +751,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  		{ //allocate 4 sun shadow maps  			for (U32 i = 0; i < 4; i++)  			{ -				mShadow[i].allocate(U32(resX*scale),U32(resY*scale), shadow_fmt, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE); +				if (!mShadow[i].allocate(U32(resX*scale),U32(resY*scale), shadow_fmt, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE)) return false;  			}  		}  		else @@ -703,7 +769,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  		{ //allocate two spot shadow maps  			for (U32 i = 4; i < 6; i++)  			{ -				mShadow[i].allocate(width, height, shadow_fmt, TRUE, FALSE); +				if (!mShadow[i].allocate(width, height, shadow_fmt, TRUE, FALSE)) return false;  			}  		}  		else @@ -716,7 +782,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  		width = nhpo2(resX)/2;  		height = nhpo2(resY)/2; -		mLuminanceMap.allocate(width,height, GL_RGBA, FALSE, FALSE); +		if (!mLuminanceMap.allocate(width,height, GL_RGBA, FALSE, FALSE)) return false;  	}  	else  	{ @@ -738,7 +804,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  		mEdgeMap.release();  		mLuminanceMap.release(); -		mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);		 +		if (!mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;		  	}  	if (LLPipeline::sRenderDeferred) @@ -750,6 +816,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  	stop_glerror(); +	return true;  }  //static @@ -800,9 +867,23 @@ void LLPipeline::releaseGLBuffers()  	mWaterRef.release();  	mWaterDis.release(); +	 +	for (U32 i = 0; i < 3; i++) +	{ +		mGlow[i].release(); +	} + +	releaseScreenBuffers(); + +	gBumpImageList.destroyGL(); +	LLVOAvatar::resetImpostors(); +} + +void LLPipeline::releaseScreenBuffers() +{ +	mUIScreen.release();  	mScreen.release();  	mPhysicsDisplay.release(); -	mUIScreen.release();  	mDeferredScreen.release();  	mDeferredDepth.release();  	for (U32 i = 0; i < 3; i++) @@ -821,16 +902,9 @@ void LLPipeline::releaseGLBuffers()  	{  		mShadow[i].release();  	} - -	for (U32 i = 0; i < 3; i++) -	{ -		mGlow[i].release(); -	} - -	gBumpImageList.destroyGL(); -	LLVOAvatar::resetImpostors();  } +  void LLPipeline::createGLBuffers()  {  	LLMemType mt_cb(LLMemType::MTYPE_PIPELINE_CREATE_BUFFERS); @@ -1983,6 +2057,14 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl  	LLGLDepthTest depth(GL_TRUE, GL_FALSE); +	bool bound_shader = false; +	if (gPipeline.canUseVertexShaders() && LLGLSLShader::sCurBoundShader == 0) +	{ //if no shader is currently bound, use the occlusion shader instead of fixed function if we can +		// (shadow render uses a special shader that clamps to clip planes) +		bound_shader = true; +		gOcclusionProgram.bind(); +	} +	  	for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();   			iter != LLWorld::getInstance()->getRegionList().end(); ++iter)  	{ @@ -2010,6 +2092,11 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl  		}  	} +	if (bound_shader) +	{ +		gOcclusionProgram.unbind(); +	} +  	camera.disableUserClipPlane();  	if (hasRenderType(LLPipeline::RENDER_TYPE_SKY) &&  @@ -2133,7 +2220,21 @@ void LLPipeline::doOcclusion(LLCamera& camera)  		LLGLDepthTest depth(GL_TRUE, GL_FALSE);  		LLGLDisable cull(GL_CULL_FACE); + +		bool bind_shader = LLGLSLShader::sNoFixedFunction && LLGLSLShader::sCurBoundShader == 0; +		if (bind_shader) +		{ +			if (LLPipeline::sShadowRender) +			{ +				gDeferredShadowProgram.bind(); +			} +			else +			{ +				gOcclusionProgram.bind(); +			} +		} +  		for (LLCullResult::sg_list_t::iterator iter = sCull->beginOcclusionGroups(); iter != sCull->endOcclusionGroups(); ++iter)  		{  			LLSpatialGroup* group = *iter; @@ -2141,6 +2242,18 @@ void LLPipeline::doOcclusion(LLCamera& camera)  			group->clearOcclusionState(LLSpatialGroup::ACTIVE_OCCLUSION);  		} +		if (bind_shader) +		{ +			if (LLPipeline::sShadowRender) +			{ +				gDeferredShadowProgram.unbind(); +			} +			else +			{ +				gOcclusionProgram.unbind(); +			} +		} +  		gGL.setColorMask(true, false);  	}  } @@ -3247,6 +3360,13 @@ void render_hud_elements()  	glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);  	gGL.color4f(1,1,1,1); +	 +	if (LLGLSLShader::sNoFixedFunction) +	{ +		gUIProgram.bind(); +	} +	LLGLDepthTest depth(GL_TRUE, GL_FALSE); +  	if (!LLPipeline::sReflectionRender && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))  	{  		LLGLEnable multisample(gSavedSettings.getU32("RenderFSAASamples") > 0 ? GL_MULTISAMPLE_ARB : 0); @@ -3272,6 +3392,11 @@ void render_hud_elements()  	{  		LLHUDText::renderAllHUD();  	} + +	if (LLGLSLShader::sNoFixedFunction) +	{ +		gUIProgram.unbind(); +	}  	gGL.flush();  } @@ -3567,6 +3692,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)  				occlude = FALSE;  				gGLLastMatrix = NULL;  				glLoadMatrixd(gGLModelView); +				LLGLSLShader::bindNoShader();  				doOcclusion(camera);  			} @@ -3599,8 +3725,8 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)  						check_stack_depth(stack_depth);  						std::string msg = llformat("pass %d", i);  						LLGLState::checkStates(msg); -						LLGLState::checkTextureChannels(msg); -						LLGLState::checkClientArrays(msg); +						//LLGLState::checkTextureChannels(msg); +						//LLGLState::checkClientArrays(msg);  					}  				}  			} @@ -3632,77 +3758,71 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)  			occlude = FALSE;  			gGLLastMatrix = NULL;  			glLoadMatrixd(gGLModelView); +			LLGLSLShader::bindNoShader();  			doOcclusion(camera);  		}  	}  	LLVertexBuffer::unbind();  	LLGLState::checkStates(); -	LLGLState::checkTextureChannels(); -	LLGLState::checkClientArrays(); - -	 - -	stop_glerror(); -		 -	LLGLState::checkStates(); -	LLGLState::checkTextureChannels(); -	LLGLState::checkClientArrays(); -	LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderHighlights"); - -	if (!sReflectionRender) +	if (!LLPipeline::sImpostorRender)  	{ -		renderHighlights(); -	} +		LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderHighlights"); -	// Contains a list of the faces of objects that are physical or -	// have touch-handlers. -	mHighlightFaces.clear(); +		if (!sReflectionRender) +		{ +			renderHighlights(); +		} + +		// Contains a list of the faces of objects that are physical or +		// have touch-handlers. +		mHighlightFaces.clear(); -	LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderDebug"); +		LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderDebug"); -	renderDebug(); +		renderDebug(); -	LLVertexBuffer::unbind(); +		LLVertexBuffer::unbind(); -	if (!LLPipeline::sReflectionRender && !LLPipeline::sRenderDeferred) -	{ -		if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) +		if (!LLPipeline::sReflectionRender && !LLPipeline::sRenderDeferred)  		{ -			// Render debugging beacons. -			gObjectList.renderObjectBeacons(); -			gObjectList.resetObjectBeacons(); +			if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) +			{ +				// Render debugging beacons. +				gObjectList.renderObjectBeacons(); +				gObjectList.resetObjectBeacons(); +			} +			else +			{ +				// Make sure particle effects disappear +				LLHUDObject::renderAllForTimer(); +			}  		}  		else  		{  			// Make sure particle effects disappear  			LLHUDObject::renderAllForTimer();  		} -	} -	else -	{ -		// Make sure particle effects disappear -		LLHUDObject::renderAllForTimer(); -	} -	LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderGeomEnd"); +		LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderGeomEnd"); -	//HACK: preserve/restore matrices around HUD render -	if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD)) -	{ -		for (U32 i = 0; i < 16; i++) +		//HACK: preserve/restore matrices around HUD render +		if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD))  		{ -			gGLModelView[i] = saved_modelview[i]; -			gGLProjection[i] = saved_projection[i]; +			for (U32 i = 0; i < 16; i++) +			{ +				gGLModelView[i] = saved_modelview[i]; +				gGLProjection[i] = saved_projection[i]; +			}  		}  	}  	LLVertexBuffer::unbind();  	LLGLState::checkStates(); -	LLGLState::checkTextureChannels(); -	LLGLState::checkClientArrays(); +//	LLGLState::checkTextureChannels(); +//	LLGLState::checkClientArrays();  }  void LLPipeline::renderGeomDeferred(LLCamera& camera) @@ -3785,8 +3905,6 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)  						llerrs << "GL matrix stack corrupted!" << llendl;  					}  					LLGLState::checkStates(); -					LLGLState::checkTextureChannels(); -					LLGLState::checkClientArrays();  				}  			}  		} @@ -3841,6 +3959,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)  			occlude = FALSE;  			gGLLastMatrix = NULL;  			glLoadMatrixd(gGLModelView); +			LLGLSLShader::bindNoShader();  			doOcclusion(camera);  			gGL.setColorMask(true, false);  		} @@ -3879,8 +3998,6 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)  						llerrs << "GL matrix stack corrupted!" << llendl;  					}  					LLGLState::checkStates(); -					LLGLState::checkTextureChannels(); -					LLGLState::checkClientArrays();  				}  			}  		} @@ -3908,6 +4025,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)  		occlude = FALSE;  		gGLLastMatrix = NULL;  		glLoadMatrixd(gGLModelView); +		LLGLSLShader::bindNoShader();  		doOcclusion(camera);  		gGLLastMatrix = NULL;  		glLoadMatrixd(gGLModelView); @@ -3955,8 +4073,6 @@ void LLPipeline::renderGeomShadow(LLCamera& camera)  				LLVertexBuffer::unbind();  				LLGLState::checkStates(); -				LLGLState::checkTextureChannels(); -				LLGLState::checkClientArrays();  			}  		}  		else @@ -4134,63 +4250,6 @@ void LLPipeline::renderDebug()  		}  	} -	if (gSavedSettings.getBOOL("DebugShowUploadCost")) -	{ -		std::set<LLUUID> textures; -		std::set<LLUUID> sculpts; -		std::set<LLUUID> meshes; -		 -		BOOL selected = TRUE; -		if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) -		{ -			selected = FALSE; -		} -			 -		for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter) -		{ -			LLSpatialGroup* group = *iter; -			LLSpatialGroup::OctreeNode* node = group->mOctreeNode; -			for (LLSpatialGroup::OctreeNode::element_iter elem = node->getData().begin(); elem != node->getData().end(); ++elem) -			{ -				LLDrawable* drawable = *elem; -				LLVOVolume* volume = drawable->getVOVolume(); -				if (volume && volume->isSelected() == selected) -				{ -					for (U32 i = 0; i < volume->getNumTEs(); ++i) -					{ -						LLTextureEntry* te = volume->getTE(i); -						textures.insert(te->getID()); -					} - -					if (volume->isSculpted()) -					{ -						LLUUID sculpt_id = volume->getVolume()->getParams().getSculptID(); -						if (volume->isMesh()) -						{ -							meshes.insert(sculpt_id); -						} -						else -						{ -							sculpts.insert(sculpt_id); -						} -					} -				} -			} -		} - -		gPipeline.mDebugTextureUploadCost = textures.size() * 10; -		gPipeline.mDebugSculptUploadCost = sculpts.size()*10; -		 -		U32 mesh_cost = 0; - -		for (std::set<LLUUID>::iterator iter = meshes.begin(); iter != meshes.end(); ++iter) -		{ -			mesh_cost += gMeshRepo.getResourceCost(*iter)*10; -		} - -		gPipeline.mDebugMeshUploadCost = mesh_cost; -	} -  	if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))  	{  		LLVertexBuffer::unbind(); @@ -6150,7 +6209,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)  		gGlowExtractProgram.uniform1f("warmthAmount", warmthAmount);  		LLGLEnable blend_on(GL_BLEND);  		LLGLEnable test(GL_ALPHA_TEST); -		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +		  		gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);  		mScreen.bindTexture(0, 0); @@ -6449,30 +6508,39 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)  		LLGLDisable blend(GL_BLEND); -		//tex unit 0 -		gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR); -	 -		gGL.getTexUnit(0)->bind(&mGlow[1]); -		gGL.getTexUnit(1)->activate(); -		gGL.getTexUnit(1)->enable(LLTexUnit::TT_RECT_TEXTURE); - - -		//tex unit 1 -		gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR); +		if (LLGLSLShader::sNoFixedFunction) +		{ +			gGlowCombineProgram.bind(); +		} +		else +		{ +			//tex unit 0 +			gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR); +			//tex unit 1 +			gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR); +		} +		gGL.getTexUnit(0)->bind(&mGlow[1]);  		gGL.getTexUnit(1)->bind(&mScreen); -		gGL.getTexUnit(1)->activate();  		LLGLEnable multisample(gSavedSettings.getU32("RenderFSAASamples") > 0 ? GL_MULTISAMPLE_ARB : 0);  		buff->setBuffer(mask);  		buff->drawArrays(LLRender::TRIANGLE_STRIP, 0, 3); -		gGL.getTexUnit(1)->disable(); -		gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT); +		if (LLGLSLShader::sNoFixedFunction) +		{ +			gGlowCombineProgram.unbind(); +		} +		else +		{ +			gGL.getTexUnit(1)->disable(); +			gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT); -		gGL.getTexUnit(0)->activate(); -		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +			gGL.getTexUnit(0)->activate(); +			gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +		} +		  	}  	if (LLRenderTarget::sUseFBO) @@ -6485,6 +6553,11 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)  	if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))  	{ +		if (LLGLSLShader::sNoFixedFunction) +		{ +			gUIProgram.bind(); +		} +  		gGL.setColorMask(true, false);  		LLVector2 tc1(0,0); @@ -6508,6 +6581,12 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)  		gGL.end();  		gGL.flush(); + +		if (LLGLSLShader::sNoFixedFunction) +		{ +			gUIProgram.unbind(); +		} +  	}  	glMatrixMode(GL_PROJECTION); @@ -7923,7 +8002,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  			static LLCullResult ref_result; -			if (LLDrawPoolWater::sNeedsDistortionUpdate) +			if (LLDrawPoolWater::sNeedsReflectionUpdate)  			{  				//initial sky pass (no user clip plane)  				{ //mask out everything but the sky @@ -8063,8 +8142,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  		LLViewerCamera::getInstance()->setUserClipPlane(npnorm);  		LLGLState::checkStates(); -		LLGLState::checkTextureChannels(); -		LLGLState::checkClientArrays();  		if (!skip_avatar_update)  		{ @@ -8197,14 +8274,21 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera  	LLVertexBuffer::unbind();  	{ +		if (!use_shader) +		{ //occlusion program is general purpose depth-only no-textures +			gOcclusionProgram.bind(); +		}  		LLFastTimer ftm(FTM_SHADOW_SIMPLE); -		LLGLDisable test(GL_ALPHA_TEST);  		gGL.getTexUnit(0)->disable();  		for (U32 i = 0; i < sizeof(types)/sizeof(U32); ++i)  		{  			renderObjects(types[i], LLVertexBuffer::MAP_VERTEX, FALSE);  		}  		gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); +		if (!use_shader) +		{ +			gOcclusionProgram.unbind(); +		}  	}  	if (use_shader) @@ -8220,12 +8304,11 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera  	{  		LLFastTimer ftm(FTM_SHADOW_ALPHA); -		LLGLEnable test(GL_ALPHA_TEST); -		gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.6f); +		gDeferredShadowAlphaMaskProgram.bind(); +		gDeferredShadowAlphaMaskProgram.setAlphaRange(0.6f, 1.f);  		renderObjects(LLRenderPass::PASS_ALPHA_SHADOW, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR, TRUE);  		glColor4f(1,1,1,1);  		renderObjects(LLRenderPass::PASS_GRASS, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, TRUE); -		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  	}  	//glCullFace(GL_BACK); @@ -8710,6 +8793,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)  					LLPipeline::RENDER_TYPE_WATER,  					LLPipeline::RENDER_TYPE_VOIDWATER,  					LLPipeline::RENDER_TYPE_PASS_ALPHA_SHADOW, +					LLPipeline::RENDER_TYPE_PASS_GRASS,  					LLPipeline::RENDER_TYPE_PASS_SIMPLE,  					LLPipeline::RENDER_TYPE_PASS_BUMP,  					LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT, diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index e9da25e544..27ee2745b5 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -113,9 +113,11 @@ public:  	void resetVertexBuffers();  	void resizeScreenTexture();  	void releaseGLBuffers(); +	void releaseScreenBuffers();  	void createGLBuffers();  	void allocateScreenBuffer(U32 resX, U32 resY); +	bool allocateScreenBuffer(U32 resX, U32 resY, U32 samples);  	void allocatePhysicsBuffer();  	void resetVertexBuffers(LLDrawable* drawable); @@ -360,6 +362,8 @@ public:  	static void updateRenderDeferred();  	static void refreshRenderDeferred(); +	static void throttleNewMemoryAllocation(BOOL disable); +  	void addDebugBlip(const LLVector3& position, const LLColor4& color);  private: @@ -457,6 +461,7 @@ public:  		RENDER_DEBUG_PHYSICS_SHAPES     = 0x1000000,  		RENDER_DEBUG_NORMALS	        = 0x2000000,  		RENDER_DEBUG_LOD_INFO	        = 0x4000000, +		RENDER_DEBUG_RENDER_COMPLEXITY  = 0x8000000  	};  public: @@ -515,8 +520,9 @@ public:  	static BOOL				sRenderAttachedLights;  	static BOOL				sRenderAttachedParticles;  	static BOOL				sRenderDeferred; +	static BOOL             sMemAllocationThrottled;  	static S32				sVisibleLightCount; -	static F32				sMinRenderSize; +	static F32				sMinRenderSize;	  	//screen texture  	U32 					mScreenWidth; diff --git a/indra/newview/res-sdl/ll_icon.BMP b/indra/newview/res-sdl/ll_icon.BMP Binary files differdeleted file mode 100644 index 6f9366df41..0000000000 --- a/indra/newview/res-sdl/ll_icon.BMP +++ /dev/null diff --git a/indra/newview/res/ll_icon.BMP b/indra/newview/res/ll_icon.BMP Binary files differdeleted file mode 100644 index 3a9964cd95..0000000000 --- a/indra/newview/res/ll_icon.BMP +++ /dev/null diff --git a/indra/newview/res/ll_icon.ico b/indra/newview/res/ll_icon.ico Binary files differdeleted file mode 100644 index 87985b9285..0000000000 --- a/indra/newview/res/ll_icon.ico +++ /dev/null diff --git a/indra/newview/res/ll_icon.png b/indra/newview/res/ll_icon.png Binary files differdeleted file mode 100644 index ae573b3874..0000000000 --- a/indra/newview/res/ll_icon.png +++ /dev/null diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc index 38d04b4b5c..a53dece422 100644 --- a/indra/newview/res/viewerRes.rc +++ b/indra/newview/res/viewerRes.rc @@ -62,12 +62,12 @@ IDI_LCD_LL_ICON         ICON                    "icon1.ico"  // Dialog  // -SPLASHSCREEN DIALOG  32, 32, 144, 34 +SPLASHSCREEN DIALOG  32, 32, 264, 34  STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE  FONT 8, "MS Sans Serif"  BEGIN      ICON            IDI_LL_ICON,IDC_STATIC,7,7,20,20 -    LTEXT           "Loading Second Life...",666,36,13,91,8 +    LTEXT           "Loading Second Life...",666,36,13,211,8  END @@ -82,7 +82,7 @@ BEGIN      "SPLASHSCREEN", DIALOG      BEGIN          LEFTMARGIN, 7 -        RIGHTMARGIN, 137 +        RIGHTMARGIN, 257          VERTGUIDE, 36          TOPMARGIN, 7          BOTTOMMARGIN, 27 diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 76965ad14b..8baaa14595 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -30,9 +30,15 @@  	 name="LtGray"  	 value="0.75 0.75 0.75 1" />  	<color +	 name="LtGray_35" +	 value="0.75 0.75 0.75 0.35" /> +	<color  	 name="LtGray_50"  	 value="0.75 0.75 0.75 0.50" />  	<color +	 name="Gray" +	 value="0.5 0.5 0.5 1" /> +	<color  	 name="DkGray"  	 value="0.125 0.125 0.125 1" />  	<color @@ -84,6 +90,9 @@  	name="LtYellow"  	value="1 1 .79 1" />  	<color +	name="DrYellow" +	value="1 0.86 0 1" /> +	<color  	name="LtOrange"  	value="1 .85 .73 1" />  	<color @@ -134,7 +143,7 @@       reference="AvatarListItemIconOfflineColor" />      <color       name="BadgeImageColor" -     value="0.44 0.69 0.56 1.0" /> +     value="1.0 0.40 0.0 1.0" />      <color       name="BadgeBorderColor"       value="0.9 0.9 0.9 1.0" /> @@ -197,7 +206,7 @@       reference="Black" />      <color       name="ColorPaletteEntry02" -     value="0.5 0.5 0.5 1" /> +     reference="Gray" />      <color       name="ColorPaletteEntry03"       value="0.5 0 0 1" /> @@ -424,11 +433,14 @@       name="InventoryItemLinkColor"       reference="LtGray_50" />      <color +     name="InventoryMouseOverColor" +     reference="LtGray_35" /> +    <color       name="InventorySearchStatusColor"       reference="EmphasisColor" />      <color       name="LabelDisabledColor" -	 reference="White_25" /> +     reference="White_25" />      <color       name="LabelSelectedColor"       reference="White" /> @@ -508,6 +520,9 @@       name="MenuPopupBgColor"  	  reference="DkGray2" />      <color +     name="ModelUploaderLabels" +     value="1 0.6 0 1" />	   +    <color       name="MultiSliderDisabledThumbColor"       reference="Black" />      <color @@ -780,6 +795,10 @@      <color       name="DirectChatColor"       reference="LtOrange" /> + +    <color +      name="ToolbarDropZoneColor" +      value=".48 .69 1 .5" />      <!-- Generic color names (legacy) -->    <color diff --git a/indra/newview/skins/default/textures/green_checkmark.png b/indra/newview/skins/default/textures/green_checkmark.png Binary files differnew file mode 100644 index 0000000000..d2a5b348dc --- /dev/null +++ b/indra/newview/skins/default/textures/green_checkmark.png diff --git a/indra/newview/skins/default/textures/navbar/separator.png b/indra/newview/skins/default/textures/navbar/separator.png Binary files differnew file mode 100644 index 0000000000..b93e5791a7 --- /dev/null +++ b/indra/newview/skins/default/textures/navbar/separator.png diff --git a/indra/newview/skins/default/textures/red_x.png b/indra/newview/skins/default/textures/red_x.png Binary files differnew file mode 100644 index 0000000000..a61202f09b --- /dev/null +++ b/indra/newview/skins/default/textures/red_x.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 799cd907dc..bb91d32c6c 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -72,6 +72,10 @@ with the same filename but different name    <texture name="BackButton_Over" file_name="icons/back_arrow_over.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" />    <texture name="BackButton_Press" file_name="icons/back_arrow_press.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" /> +  <texture name="Error_Tag_Background" file_name="widgets/Error_Tag_Background.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" /> +  <texture name="New_Tag_Background" file_name="widgets/New_Tag_Background.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" /> +  <texture name="New_Tag_Border" file_name="widgets/New_Tag_Border.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" /> +    <texture name="Badge_Background" file_name="widgets/Badge_Background.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />    <texture name="Badge_Border" file_name="widgets/Badge_Border.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> @@ -119,7 +123,36 @@ with the same filename but different name    <texture name="Checkbox_On" file_name="widgets/Checkbox_On.png" preload="true" />    <texture name="Checkbox_On_Press" file_name="widgets/Checkbox_On_Press.png" preload="true" />    <texture name="Checkbox_Press" file_name="widgets/Checkbox_Press.png" preload="true" /> -  <texture name="Check_Mark" file_name="icons/check_mark" preload="true" /> +  <texture name="Check_Mark" file_name="icons/check_mark.png" preload="true" /> + +  <texture name="Command_AboutLand_Icon"    file_name="toolbar_icons/land.png"         preload="true" /> +  <texture name="Command_Appearance_Icon"   file_name="toolbar_icons/appearance.png"   preload="true" /> +  <texture name="Command_Avatar_Icon"       file_name="toolbar_icons/avatars.png"      preload="true" /> +  <texture name="Command_Build_Icon"        file_name="toolbar_icons/build.png"        preload="true" /> +  <texture name="Command_Chat_Icon"         file_name="toolbar_icons/chat.png"         preload="true" /> +  <texture name="Command_Compass_Icon"      file_name="toolbar_icons/land.png"         preload="true" /> +  <texture name="Command_Destinations_Icon" file_name="toolbar_icons/destinations.png" preload="true" /> +  <texture name="Command_Gestures_Icon"     file_name="toolbar_icons/gestures.png"     preload="true" /> +  <texture name="Command_HowTo_Icon"        file_name="toolbar_icons/howto.png"        preload="true" /> +  <texture name="Command_Inventory_Icon"    file_name="toolbar_icons/inventory.png"    preload="true" /> +  <texture name="Command_Map_Icon"          file_name="toolbar_icons/map.png"          preload="true" /> +  <texture name="Command_Marketplace_Icon"  file_name="toolbar_icons/marketplace.png"  preload="true" /> +  <texture name="Command_MiniCart_Icon"     file_name="toolbar_icons/mini_cart.png"    preload="true" /> +  <texture name="Command_MiniMap_Icon"      file_name="toolbar_icons/mini_map.png"     preload="true" /> +  <texture name="Command_Move_Icon"         file_name="toolbar_icons/move.png"         preload="true" /> +  <texture name="Command_People_Icon"       file_name="toolbar_icons/people.png"       preload="true" /> +  <texture name="Command_Picks_Icon"        file_name="toolbar_icons/picks.png"        preload="true" /> +  <texture name="Command_Places_Icon"       file_name="toolbar_icons/places.png"       preload="true" /> +  <texture name="Command_Preferences_Icon"  file_name="toolbar_icons/preferences.png"  preload="true" /> +  <texture name="Command_Profile_Icon"      file_name="toolbar_icons/profile.png"      preload="true" /> +  <texture name="Command_Search_Icon"       file_name="toolbar_icons/search.png"       preload="true" /> +  <texture name="Command_Snapshot_Icon"     file_name="toolbar_icons/snapshot.png"     preload="true" /> +  <texture name="Command_Speak_Icon"        file_name="toolbar_icons/speak.png"        preload="true" /> +  <texture name="Command_View_Icon"         file_name="toolbar_icons/view.png"         preload="true" /> +  <texture name="Command_Voice_Icon"        file_name="toolbar_icons/nearbyvoice.png"  preload="true" /> +  <texture name="Caret_Bottom_Icon"         file_name="toolbar_icons/caret_bottom.png" preload="true" scale.left="1" scale.top="23" scale.right="15" scale.bottom="1" /> +  <texture name="Caret_Right_Icon"          file_name="toolbar_icons/caret_right.png"  preload="true" scale.left="5" scale.top="15" scale.right="28" scale.bottom="1" /> +  <texture name="Caret_Left_Icon"           file_name="toolbar_icons/caret_left.png"   preload="true" scale.left="1" scale.top="15" scale.right="23" scale.bottom="1" />    <texture name="ComboButton_Disabled" file_name="widgets/ComboButton_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />    <texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> @@ -279,9 +312,9 @@ with the same filename but different name    <texture name="menu_separator" file_name="navbar/FileMenu_Divider.png" scale.left="4" scale.top="166" scale.right="0" scale.bottom="0" /> -  <texture name="ModelImport_Status_Good" file_name="lag_status_good.tga" preload="false"/> +  <texture name="ModelImport_Status_Good" file_name="green_checkmark.png" preload="false"/>    <texture name="ModelImport_Status_Warning" file_name="lag_status_warning.tga" preload="false"/> -  <texture name="ModelImport_Status_Error" file_name="lag_status_critical.tga" preload="false"/> +  <texture name="ModelImport_Status_Error" file_name="red_x.png" preload="false"/>    <texture name="MouseLook_View_Off" file_name="bottomtray/MouseLook_view_off.png" preload="false" />    <texture name="MouseLook_View_On" file_name="bottomtray/MouseLook_view_on.png" preload="false" /> @@ -428,6 +461,7 @@ with the same filename but different name    <texture name="PushButton_Off" file_name="widgets/PushButton_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />    <texture name="PushButton_On" file_name="widgets/PushButton_On.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />    <texture name="PushButton_On_Selected" file_name="widgets/PushButton_On_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> +  <texture name="PushButton_Over" file_name="widgets/PushButton_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />    <texture name="PushButton_Press" file_name="widgets/PushButton_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />    <texture name="PushButton_Selected" file_name="widgets/PushButton_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />    <texture name="PushButton_Selected_Press" file_name="widgets/PushButton_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> @@ -445,7 +479,11 @@ with the same filename but different name    <texture name="Resize_Corner" file_name="windows/Resize_Corner.png" preload="true" /> -  <texture name="Rounded_Rect"	file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="24" scale.right="58" scale.bottom="6" /> +  <texture name="Rounded_Rect"	file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="26" scale.right="58" scale.bottom="6" /> +  <texture name="Rounded_Rect_Top"	file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="8" scale.right="58" scale.bottom="0" clip.left="0" clip.right="64" clip.bottom="16" clip.top="32" /> +  <texture name="Rounded_Rect_Bottom"	file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="16" scale.right="58" scale.bottom="8" clip.left="0" clip.right="64" clip.bottom="0" clip.top="16"  /> +  <texture name="Rounded_Rect_Left"	file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="26" scale.right="32" scale.bottom="6" clip.left="0" clip.right="32" clip.bottom="0" clip.top="32" /> +  <texture name="Rounded_Rect_Right"	file_name="Rounded_Rect.png" preload="true" scale.left="0" scale.top="26" scale.right="26" scale.bottom="6" clip.left="32" clip.right="64" clip.bottom="0" clip.top="32" />    <texture name="Rounded_Square"	file_name="rounded_square.j2c" preload="true" scale.left="16" scale.top="16" scale.right="112" scale.bottom="16" />    <texture name="Row_Selection" file_name="navbar/Row_Selection.png" preload="false" /> @@ -733,4 +771,5 @@ with the same filename but different name    <texture name="Yellow_Gradient" file_name="windows/yellow_gradient.png"/>    <texture name="Popup_Caution" file_name="icons/pop_up_caution.png"/>    <texture name="Camera_Drag_Dot" file_name="world/CameraDragDot.png"/> +  <texture name="NavBar Separator" file_name="navbar/separator.png"/>  </textures> diff --git a/indra/newview/skins/default/textures/toolbar_icons/appearance.png b/indra/newview/skins/default/textures/toolbar_icons/appearance.png Binary files differnew file mode 100644 index 0000000000..e6b1365388 --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/appearance.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/avatars.png b/indra/newview/skins/default/textures/toolbar_icons/avatars.png Binary files differnew file mode 100644 index 0000000000..8fa0600cee --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/avatars.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/build.png b/indra/newview/skins/default/textures/toolbar_icons/build.png Binary files differnew file mode 100644 index 0000000000..e21ab3f0e4 --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/build.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/caret_bottom.png b/indra/newview/skins/default/textures/toolbar_icons/caret_bottom.png Binary files differnew file mode 100644 index 0000000000..5f6a01eaa1 --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/caret_bottom.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/caret_left.png b/indra/newview/skins/default/textures/toolbar_icons/caret_left.png Binary files differnew file mode 100644 index 0000000000..0b8090314c --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/caret_left.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/caret_right.png b/indra/newview/skins/default/textures/toolbar_icons/caret_right.png Binary files differnew file mode 100644 index 0000000000..044751560f --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/caret_right.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/chat.png b/indra/newview/skins/default/textures/toolbar_icons/chat.png Binary files differnew file mode 100644 index 0000000000..e0dbac495f --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/chat.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/destinations.png b/indra/newview/skins/default/textures/toolbar_icons/destinations.png Binary files differnew file mode 100644 index 0000000000..e2325f083a --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/destinations.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/gestures.png b/indra/newview/skins/default/textures/toolbar_icons/gestures.png Binary files differnew file mode 100644 index 0000000000..2404bb4e25 --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/gestures.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/howto.png b/indra/newview/skins/default/textures/toolbar_icons/howto.png Binary files differnew file mode 100644 index 0000000000..8594d71113 --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/howto.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/inventory.png b/indra/newview/skins/default/textures/toolbar_icons/inventory.png Binary files differnew file mode 100644 index 0000000000..ab3191255e --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/inventory.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/land.png b/indra/newview/skins/default/textures/toolbar_icons/land.png Binary files differnew file mode 100644 index 0000000000..89ea7604a4 --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/land.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/map.png b/indra/newview/skins/default/textures/toolbar_icons/map.png Binary files differnew file mode 100644 index 0000000000..ed1049b7db --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/map.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/marketplace.png b/indra/newview/skins/default/textures/toolbar_icons/marketplace.png Binary files differnew file mode 100644 index 0000000000..62bad20be6 --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/marketplace.png diff --git a/indra/newview/skins/minimal/textures/bottomtray/close_over.png b/indra/newview/skins/default/textures/toolbar_icons/mini_cart.png Binary files differindex 4630cb6dd6..9fcf46794d 100644 --- a/indra/newview/skins/minimal/textures/bottomtray/close_over.png +++ b/indra/newview/skins/default/textures/toolbar_icons/mini_cart.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/mini_map.png b/indra/newview/skins/default/textures/toolbar_icons/mini_map.png Binary files differnew file mode 100644 index 0000000000..ab0a654056 --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/mini_map.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/move.png b/indra/newview/skins/default/textures/toolbar_icons/move.png Binary files differnew file mode 100644 index 0000000000..5c2ced7375 --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/move.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/nearbyvoice.png b/indra/newview/skins/default/textures/toolbar_icons/nearbyvoice.png Binary files differnew file mode 100644 index 0000000000..77a7cd5f44 --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/nearbyvoice.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/people.png b/indra/newview/skins/default/textures/toolbar_icons/people.png Binary files differnew file mode 100644 index 0000000000..7228ae8e2f --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/people.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/picks.png b/indra/newview/skins/default/textures/toolbar_icons/picks.png Binary files differnew file mode 100644 index 0000000000..befda04b42 --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/picks.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/places.png b/indra/newview/skins/default/textures/toolbar_icons/places.png Binary files differnew file mode 100644 index 0000000000..97d9fa066c --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/places.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/preferences.png b/indra/newview/skins/default/textures/toolbar_icons/preferences.png Binary files differnew file mode 100644 index 0000000000..4ccd7b8ae1 --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/preferences.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/profile.png b/indra/newview/skins/default/textures/toolbar_icons/profile.png Binary files differnew file mode 100644 index 0000000000..32fe2bf8ac --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/profile.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/search.png b/indra/newview/skins/default/textures/toolbar_icons/search.png Binary files differnew file mode 100644 index 0000000000..bcb11e950d --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/search.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/snapshot.png b/indra/newview/skins/default/textures/toolbar_icons/snapshot.png Binary files differnew file mode 100644 index 0000000000..d26da9b1d2 --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/snapshot.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/speak.png b/indra/newview/skins/default/textures/toolbar_icons/speak.png Binary files differnew file mode 100644 index 0000000000..10cd354c5c --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/speak.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/view.png b/indra/newview/skins/default/textures/toolbar_icons/view.png Binary files differnew file mode 100644 index 0000000000..ddf0df7c26 --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/view.png diff --git a/indra/newview/skins/default/textures/widgets/Error_Tag_Background.png b/indra/newview/skins/default/textures/widgets/Error_Tag_Background.png Binary files differnew file mode 100644 index 0000000000..c8dbc8e87a --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/Error_Tag_Background.png diff --git a/indra/newview/skins/default/textures/widgets/New_Tag_Background.png b/indra/newview/skins/default/textures/widgets/New_Tag_Background.png Binary files differnew file mode 100644 index 0000000000..cd639dd80f --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/New_Tag_Background.png diff --git a/indra/newview/skins/default/textures/widgets/New_Tag_Border.png b/indra/newview/skins/default/textures/widgets/New_Tag_Border.png Binary files differnew file mode 100644 index 0000000000..56df0d0127 --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/New_Tag_Border.png diff --git a/indra/newview/skins/minimal/colors.xml b/indra/newview/skins/minimal/colors.xml deleted file mode 100644 index 097a298ce5..0000000000 --- a/indra/newview/skins/minimal/colors.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<colors> -    <color -     name="MenuBarBgColor" -     value="0 0 0 0" /> -</colors> diff --git a/indra/newview/skins/minimal/textures/arrow_keys.png b/indra/newview/skins/minimal/textures/arrow_keys.png Binary files differdeleted file mode 100644 index f19af59251..0000000000 --- a/indra/newview/skins/minimal/textures/arrow_keys.png +++ /dev/null diff --git a/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png Binary files differdeleted file mode 100644 index b6e9eef891..0000000000 --- a/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png +++ /dev/null diff --git a/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png Binary files differdeleted file mode 100644 index 687cb7fb53..0000000000 --- a/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png +++ /dev/null diff --git a/indra/newview/skins/minimal/textures/bottomtray/button_separator.png b/indra/newview/skins/minimal/textures/bottomtray/button_separator.png Binary files differdeleted file mode 100644 index 71ed25f931..0000000000 --- a/indra/newview/skins/minimal/textures/bottomtray/button_separator.png +++ /dev/null diff --git a/indra/newview/skins/minimal/textures/click_to_move.png b/indra/newview/skins/minimal/textures/click_to_move.png Binary files differdeleted file mode 100644 index 74e3faa8ff..0000000000 --- a/indra/newview/skins/minimal/textures/click_to_move.png +++ /dev/null diff --git a/indra/newview/skins/minimal/textures/textures.xml b/indra/newview/skins/minimal/textures/textures.xml deleted file mode 100644 index e3ed01721a..0000000000 --- a/indra/newview/skins/minimal/textures/textures.xml +++ /dev/null @@ -1,11 +0,0 @@ - -<textures version="101"> -  <texture name="Button_Separator" file_name="bottomtray/button_separator.png" preload="true" /> -  <texture name="arrow_keys.png"/> -  <texture name="click_to_move" file_name="click_to_move.png"/> -  <texture name="bottomtray_close_off" file_name="bottomtray/close_off.png" preload="true" /> -  <texture name="bottomtray_close_over" file_name="bottomtray/close_over.png" preload="true" /> -  <texture name="bottomtray_close_press" file_name="bottomtray/close_press.png" preload="true" /> -  <texture name="Speak_Btn_Off" file_name="bottomtray/Speak_Btn_Off.png" preload="true" scale.left="4" scale.top="16" scale.right="8" scale.bottom="4" /> -  <texture name="Speak_Btn_Selected_Press" file_name="bottomtray/Speak_Btn_Selected_Press.png" preload="true" scale.left="4" scale.top="16" scale.right="8" scale.bottom="4" /> - </textures> diff --git a/indra/newview/tests/gpus_results.txt b/indra/newview/tests/gpus_results.txt index 7e9a064921..68e2e688cb 100644 --- a/indra/newview/tests/gpus_results.txt +++ b/indra/newview/tests/gpus_results.txt @@ -1,6 +1,6 @@  GPU String                                                                                               Supported?  Class  Recognizer  ------------------------------------------------------------------------------------------------------   ----------- -----  ------------------------------------ -ATI                                                                                                                         UNRECOGNIZED +ATI                                                                                                                         NO MATCH  ATI 3D-Analyze                                                                                           unsupported    0   ATI 3D-Analyze  ATI ASUS A9xxx                                                                                           supported      1   ATI ASUS A9xxx  ATI ASUS AH24xx                                                                                          supported      1   ATI ASUS AH24xx @@ -25,8 +25,8 @@ ATI All-in-Wonder X1800  ATI All-in-Wonder X1900                                                                                  supported      3   ATI All-in-Wonder X1900  ATI All-in-Wonder X600                                                                                   supported      1   ATI All-in-Wonder X600  ATI All-in-Wonder X800                                                                                   supported      2   ATI All-in-Wonder X800 -ATI Diamond X1xxx                                                                                        supported      0   ATI Radeon X1xxx -ATI Display Adapter                                                                                                         UNRECOGNIZED +ATI Diamond X1xxx                                                                                        supported      1   ATI Radeon X1xxx +ATI Display Adapter                                                                                      supported      0   ATI Display Adapter  ATI FireGL                                                                                               supported      0   ATI FireGL  ATI FireGL 5200                                                                                          supported      0   ATI FireGL  ATI FireGL 5xxx                                                                                          supported      0   ATI FireGL @@ -40,7 +40,7 @@ ATI M56  ATI M71                                                                                                  supported      1   ATI M71  ATI M72                                                                                                  supported      1   ATI M72  ATI M76                                                                                                  supported      3   ATI M76 -ATI Mobility Radeon                                                                                      supported      0   ATI Mobility Radeon +ATI Mobility Radeon                                                                                      supported      0   ATI Radeon  ATI Mobility Radeon 7xxx                                                                                 supported      0   ATI Mobility Radeon 7xxx  ATI Mobility Radeon 9600                                                                                 supported      0   ATI Mobility Radeon 9600  ATI Mobility Radeon 9700                                                                                 supported      1   ATI Mobility Radeon 9700 @@ -57,14 +57,14 @@ ATI Mobility Radeon HD 4300  ATI Mobility Radeon HD 4500                                                                              supported      3   ATI Mobility Radeon HD 4500  ATI Mobility Radeon HD 4600                                                                              supported      3   ATI Mobility Radeon HD 4600  ATI Mobility Radeon HD 4800                                                                              supported      3   ATI Mobility Radeon HD 4800 -ATI Mobility Radeon HD 5400                                                                              supported      2   ATI Mobility Radeon HD 5400 -ATI Mobility Radeon HD 5600                                                                              supported      2   ATI Mobility Radeon HD 5600 -ATI Mobility Radeon X1xxx                                                                                supported      0   ATI Radeon X1xxx -ATI Mobility Radeon X2xxx                                                                                supported      0   ATI Mobility Radeon X2xxx -ATI Mobility Radeon X3xx                                                                                 supported      1   ATI Mobility Radeon X3xx -ATI Mobility Radeon X6xx                                                                                 supported      1   ATI Mobility Radeon X6xx -ATI Mobility Radeon X7xx                                                                                 supported      1   ATI Mobility Radeon X7xx -ATI Mobility Radeon Xxxx                                                                                 supported      0   ATI Mobility Radeon Xxxx +ATI Mobility Radeon HD 5400                                                                              supported      3   ATI Mobility Radeon HD 5400 +ATI Mobility Radeon HD 5600                                                                              supported      3   ATI Mobility Radeon HD 5600 +ATI Mobility Radeon X1xxx                                                                                supported      1   ATI Radeon X1xxx +ATI Mobility Radeon X2xxx                                                                                supported      1   ATI Radeon X2xxx +ATI Mobility Radeon X3xx                                                                                 supported      0   ATI Radeon X300 +ATI Mobility Radeon X6xx                                                                                 supported      1   ATI Radeon X600 +ATI Mobility Radeon X7xx                                                                                 supported      1   ATI Radeon X700 +ATI Mobility Radeon Xxxx                                                                                 supported      0   ATI Radeon  ATI RV380                                                                                                supported      0   ATI RV380  ATI RV530                                                                                                supported      1   ATI RV530  ATI Radeon 2100                                                                                          supported      0   ATI Radeon 2100 @@ -86,7 +86,7 @@ ATI Radeon HD 2600  ATI Radeon HD 2900                                                                                       supported      3   ATI Radeon HD 2900  ATI Radeon HD 3000                                                                                       supported      0   ATI Radeon HD 3000  ATI Radeon HD 3100                                                                                       supported      1   ATI Radeon HD 3100 -ATI Radeon HD 3200                                                                                       supported      0   ATI Radeon HD 3200 +ATI Radeon HD 3200                                                                                       supported      1   ATI Radeon HD 3200  ATI Radeon HD 3300                                                                                       supported      1   ATI Radeon HD 3300  ATI Radeon HD 3400                                                                                       supported      1   ATI Radeon HD 3400  ATI Radeon HD 3600                                                                                       supported      3   ATI Radeon HD 3600 @@ -103,29 +103,29 @@ ATI Radeon HD 5600  ATI Radeon HD 5700                                                                                       supported      3   ATI Radeon HD 5700  ATI Radeon HD 5800                                                                                       supported      3   ATI Radeon HD 5800  ATI Radeon HD 5900                                                                                       supported      3   ATI Radeon HD 5900 -ATI Radeon HD 6200                                                                                       supported      2   ATI Radeon HD 6200 -ATI Radeon HD 6300                                                                                       supported      2   ATI Radeon HD 6300 +ATI Radeon HD 6200                                                                                       supported      3   ATI Radeon HD 6200 +ATI Radeon HD 6300                                                                                       supported      3   ATI Radeon HD 6300  ATI Radeon HD 6500                                                                                       supported      3   ATI Radeon HD 6500  ATI Radeon HD 6800                                                                                       supported      3   ATI Radeon HD 6800  ATI Radeon HD 6900                                                                                       supported      3   ATI Radeon HD 6900 -ATI Radeon OpenGL                                                                                        supported      0   ATI Radeon +ATI Radeon OpenGL                                                                                        unsupported    0   ATI Radeon OpenGL  ATI Radeon RV250                                                                                         supported      0   ATI Radeon RV250  ATI Radeon RV600                                                                                         supported      1   ATI Radeon RV600  ATI Radeon RX9550                                                                                        supported      1   ATI Radeon RX9550  ATI Radeon VE                                                                                            unsupported    0   ATI Radeon VE -ATI Radeon X1000                                                                                         supported      0   ATI Radeon X1xxx -ATI Radeon X1200                                                                                         supported      0   ATI Radeon X1xxx -ATI Radeon X1300                                                                                         supported      0   ATI Radeon X1xxx -ATI Radeon X13xx                                                                                         supported      0   ATI Radeon X1xxx -ATI Radeon X1400                                                                                         supported      0   ATI Radeon X1xxx -ATI Radeon X1500                                                                                         supported      0   ATI Radeon X1xxx -ATI Radeon X1600                                                                                         supported      0   ATI Radeon X1xxx -ATI Radeon X16xx                                                                                         supported      0   ATI Radeon X1xxx -ATI Radeon X1700                                                                                         supported      0   ATI Radeon X1xxx -ATI Radeon X1800                                                                                         supported      0   ATI Radeon X1xxx -ATI Radeon X1900                                                                                         supported      0   ATI Radeon X1xxx -ATI Radeon X19xx                                                                                         supported      0   ATI Radeon X1xxx -ATI Radeon X1xxx                                                                                         supported      0   ATI Radeon X1xxx +ATI Radeon X1000                                                                                         supported      1   ATI Radeon X1xxx +ATI Radeon X1200                                                                                         supported      1   ATI Radeon X1xxx +ATI Radeon X1300                                                                                         supported      1   ATI Radeon X13xx +ATI Radeon X13xx                                                                                         supported      1   ATI Radeon X13xx +ATI Radeon X1400                                                                                         supported      1   ATI Radeon X1xxx +ATI Radeon X1500                                                                                         supported      2   ATI Radeon X15xx +ATI Radeon X1600                                                                                         supported      2   ATI Radeon X16xx +ATI Radeon X16xx                                                                                         supported      2   ATI Radeon X16xx +ATI Radeon X1700                                                                                         supported      2   ATI Radeon X17xx +ATI Radeon X1800                                                                                         supported      3   ATI Radeon X18xx +ATI Radeon X1900                                                                                         supported      3   ATI Radeon X19xx +ATI Radeon X19xx                                                                                         supported      3   ATI Radeon X19xx +ATI Radeon X1xxx                                                                                         supported      1   ATI Radeon X1xxx  ATI Radeon X300                                                                                          supported      0   ATI Radeon X300  ATI Radeon X500                                                                                          supported      0   ATI Radeon X500  ATI Radeon X600                                                                                          supported      1   ATI Radeon X600 @@ -138,56 +138,74 @@ ATI Technologies Inc.  ATI Technologies Inc.  x86                                                                               supported      0   ATI Technologies  ATI Technologies Inc.  x86/SSE2                                                                          supported      0   ATI Technologies  ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5730                                                supported      3   ATI Mobility Radeon HD 5700 -ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2                                                 supported      0   ATI Radeon X1xxx +ATI Technologies Inc. 128MB ATI Radeon X1300 x86/SSE2                                                    supported      1   ATI Radeon X13xx +ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2                                                 supported      1   ATI Radeon X13xx  ATI Technologies Inc. AMD 760G                                                                           supported      1   ATI 760G/Radeon 3000  ATI Technologies Inc. AMD 760G (Microsoft WDDM 1.1)                                                      supported      1   ATI 760G/Radeon 3000  ATI Technologies Inc. AMD 780L                                                                           supported      1   ATI 780L/Radeon 3000  ATI Technologies Inc. AMD FirePro 2270                                                                   supported      1   ATI FirePro 2000 -ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100                                            supported      0   ATI Mobility Radeon 4100 +ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100                                            supported      1   ATI Mobility Radeon 4100  ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200                                         supported      2   ATI Mobility Radeon HD 4200  ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250                                         supported      2   ATI Mobility Radeon HD 4200 +ATI Technologies Inc. AMD RADEON HD 6350                                                                 supported      3   ATI Radeon HD 6300  ATI Technologies Inc. AMD RADEON HD 6450                                                                 supported      3   ATI Radeon HD 6400 -ATI Technologies Inc. AMD Radeon HD 6200 series Graphics                                                 supported      2   ATI Radeon HD 6200 -ATI Technologies Inc. AMD Radeon HD 6250 Graphics                                                        supported      2   ATI Radeon HD 6200 -ATI Technologies Inc. AMD Radeon HD 6300 series Graphics                                                 supported      2   ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6300M Series                                                         supported      2   ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6310 Graphics                                                        supported      2   ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6310M                                                                supported      2   ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6330M                                                                supported      2   ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6350                                                                 supported      2   ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6370M                                                                supported      2   ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6400M Series                                                         supported      3   ATI Radeon HD 6400 +ATI Technologies Inc. AMD RADEON HD 6670                                                                 supported      3   ATI Radeon HD 6600 +ATI Technologies Inc. AMD Radeon 6600M and 6700M Series                                                  supported      0   ATI Technologies +ATI Technologies Inc. AMD Radeon HD 6200 series Graphics                                                 supported      3   ATI Radeon HD 6200 +ATI Technologies Inc. AMD Radeon HD 6250 Graphics                                                        supported      3   ATI Radeon HD 6200 +ATI Technologies Inc. AMD Radeon HD 6290 Graphics                                                        supported      3   ATI Radeon HD 6200 +ATI Technologies Inc. AMD Radeon HD 6300 series Graphics                                                 supported      3   ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6300M Series                                                         supported      3   ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6310 Graphics                                                        supported      3   ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6310M                                                                supported      3   ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6330M                                                                supported      3   ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6350                                                                 supported      3   ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6370M                                                                supported      3   ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6400M Series                                                         supported      3   ATI Radeon HD 64xx  ATI Technologies Inc. AMD Radeon HD 6450                                                                 supported      3   ATI Radeon HD 6400 -ATI Technologies Inc. AMD Radeon HD 6470M                                                                supported      3   ATI Radeon HD 6400 -ATI Technologies Inc. AMD Radeon HD 6490M                                                                supported      3   ATI Radeon HD 6400 -ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series                                               supported      3   ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6530M                                                                supported      3   ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6550M                                                                supported      3   ATI Radeon HD 6500 +ATI Technologies Inc. AMD Radeon HD 6470M                                                                supported      3   ATI Radeon HD 64xx +ATI Technologies Inc. AMD Radeon HD 6490M                                                                supported      3   ATI Radeon HD 64xx +ATI Technologies Inc. AMD Radeon HD 6500 Series                                                          supported      3   ATI Radeon HD 6500 +ATI Technologies Inc. AMD Radeon HD 6500M Series                                                         supported      3   ATI Radeon HD 65xx +ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series                                               supported      3   ATI Radeon HD 65xx +ATI Technologies Inc. AMD Radeon HD 6530M                                                                supported      3   ATI Radeon HD 65xx +ATI Technologies Inc. AMD Radeon HD 6550M                                                                supported      3   ATI Radeon HD 65xx  ATI Technologies Inc. AMD Radeon HD 6570                                                                 supported      3   ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6570M                                                                supported      3   ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series                                                    supported      3   ATI Radeon HD 6500 +ATI Technologies Inc. AMD Radeon HD 6570M                                                                supported      3   ATI Radeon HD 65xx +ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series                                                    supported      3   ATI Radeon HD 65xx +ATI Technologies Inc. AMD Radeon HD 6600 Series                                                          supported      3   ATI Radeon HD 6600  ATI Technologies Inc. AMD Radeon HD 6600M Series                                                         supported      3   ATI Radeon HD 66xx +ATI Technologies Inc. AMD Radeon HD 6630M                                                                supported      3   ATI Radeon HD 66xx  ATI Technologies Inc. AMD Radeon HD 6650M                                                                supported      3   ATI Radeon HD 66xx -ATI Technologies Inc. AMD Radeon HD 6670                                                                 supported      3   ATI Radeon HD 66xx +ATI Technologies Inc. AMD Radeon HD 6670                                                                 supported      3   ATI Radeon HD 6600  ATI Technologies Inc. AMD Radeon HD 6700 Series                                                          supported      3   ATI Radeon HD 6700  ATI Technologies Inc. AMD Radeon HD 6750                                                                 supported      3   ATI Radeon HD 6700  ATI Technologies Inc. AMD Radeon HD 6750M                                                                supported      3   ATI Radeon HD 6700  ATI Technologies Inc. AMD Radeon HD 6770                                                                 supported      3   ATI Radeon HD 6700 +ATI Technologies Inc. AMD Radeon HD 6770M                                                                supported      3   ATI Radeon HD 6700  ATI Technologies Inc. AMD Radeon HD 6800 Series                                                          supported      3   ATI Radeon HD 6800 +ATI Technologies Inc. AMD Radeon HD 6800M Series                                                         supported      3   ATI Radeon HD 6800 +ATI Technologies Inc. AMD Radeon HD 6850                                                                 supported      3   ATI Radeon HD 6800  ATI Technologies Inc. AMD Radeon HD 6850M                                                                supported      3   ATI Radeon HD 6800  ATI Technologies Inc. AMD Radeon HD 6870                                                                 supported      3   ATI Radeon HD 6800  ATI Technologies Inc. AMD Radeon HD 6870M                                                                supported      3   ATI Radeon HD 6800  ATI Technologies Inc. AMD Radeon HD 6900 Series                                                          supported      3   ATI Radeon HD 6900 +ATI Technologies Inc. AMD Radeon HD 6900M Series                                                         supported      3   ATI Radeon HD 6900  ATI Technologies Inc. AMD Radeon HD 6970M                                                                supported      3   ATI Radeon HD 6900  ATI Technologies Inc. AMD Radeon HD 6990                                                                 supported      3   ATI Radeon HD 6900 -ATI Technologies Inc. AMD Radeon(TM) HD 6470M                                                            supported      0   ATI Technologies +ATI Technologies Inc. AMD Radeon(TM) HD 6470M                                                            supported      3   ATI Radeon HD 64xx +ATI Technologies Inc. AMD Radeon(TM) HD 6480G                                                            supported      3   ATI Radeon HD 64xx +ATI Technologies Inc. AMD Radeon(TM) HD 6520G                                                            supported      3   ATI Radeon HD 65xx +ATI Technologies Inc. AMD Radeon(TM) HD 6620G                                                            supported      3   ATI Radeon HD 66xx +ATI Technologies Inc. AMD Radeon(TM) HD 6630M                                                            supported      3   ATI Radeon HD 66xx  ATI Technologies Inc. ASUS 5870 Eyefinity 6                                                              supported      0   ATI Technologies +ATI Technologies Inc. ASUS A9550 Series                                                                  supported      1   ATI ASUS A9xxx  ATI Technologies Inc. ASUS AH2600 Series                                                                 supported      3   ATI ASUS AH26xx  ATI Technologies Inc. ASUS AH3450 Series                                                                 supported      1   ATI ASUS AH34xx  ATI Technologies Inc. ASUS AH3650 Series                                                                 supported      3   ATI ASUS AH36xx  ATI Technologies Inc. ASUS AH4650 Series                                                                 supported      3   ATI ASUS AH46xx -ATI Technologies Inc. ASUS ARES                                                                          supported      0   ATI Technologies -ATI Technologies Inc. ASUS EAH2900 Series                                                                supported      0   ATI Technologies +ATI Technologies Inc. ASUS ARES                                                                          supported      3   ATI ASUS ARES +ATI Technologies Inc. ASUS EAH2900 Series                                                                supported      3   ATI ASUS EAH29xx  ATI Technologies Inc. ASUS EAH3450 Series                                                                supported      1   ATI ASUS AH34xx  ATI Technologies Inc. ASUS EAH3650 Series                                                                supported      3   ATI ASUS AH36xx  ATI Technologies Inc. ASUS EAH4350 series                                                                supported      1   ATI ASUS EAH43xx @@ -208,10 +226,13 @@ ATI Technologies Inc. ASUS EAH5830 Series  ATI Technologies Inc. ASUS EAH5850 Series                                                                supported      3   ATI ASUS EAH58xx  ATI Technologies Inc. ASUS EAH5870 Series                                                                supported      3   ATI ASUS EAH58xx  ATI Technologies Inc. ASUS EAH5970 Series                                                                supported      0   ATI Technologies -ATI Technologies Inc. ASUS EAH6850 Series                                                                supported      0   ATI Technologies -ATI Technologies Inc. ASUS EAH6870 Series                                                                supported      0   ATI Technologies -ATI Technologies Inc. ASUS EAH6950 Series                                                                supported      0   ATI Technologies -ATI Technologies Inc. ASUS EAH6970 Series                                                                supported      0   ATI Technologies +ATI Technologies Inc. ASUS EAH6450 Series                                                                supported      3   ATI ASUS EAH6xxx +ATI Technologies Inc. ASUS EAH6570 Series                                                                supported      3   ATI ASUS EAH6xxx +ATI Technologies Inc. ASUS EAH6670 Series                                                                supported      3   ATI ASUS EAH6xxx +ATI Technologies Inc. ASUS EAH6850 Series                                                                supported      3   ATI ASUS EAH6xxx +ATI Technologies Inc. ASUS EAH6870 Series                                                                supported      3   ATI ASUS EAH6xxx +ATI Technologies Inc. ASUS EAH6950 Series                                                                supported      3   ATI ASUS EAH6xxx +ATI Technologies Inc. ASUS EAH6970 Series                                                                supported      3   ATI ASUS EAH6xxx  ATI Technologies Inc. ASUS EAHG4670 series                                                               supported      0   ATI Technologies  ATI Technologies Inc. ASUS Extreme AX600 Series                                                          supported      0   ATI Technologies  ATI Technologies Inc. ASUS Extreme AX600XT-TD                                                            supported      0   ATI Technologies @@ -232,19 +253,23 @@ ATI Technologies Inc. ATI FirePro V4800  ATI Technologies Inc. ATI FirePro V4800 (FireGL)                                                         supported      0   ATI FireGL  ATI Technologies Inc. ATI FirePro V5800                                                                  supported      3   ATI FirePro 5000  ATI Technologies Inc. ATI FirePro V7800                                                                  supported      3   ATI FirePro 7000 -ATI Technologies Inc. ATI MOBILITY RADEON 9XXX x86/SSE2                                                  supported      0   ATI Mobility Radeon Xxxx +ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series                                               supported      1   ATI Mobility Radeon 9700 +ATI Technologies Inc. ATI MOBILITY RADEON 9XXX x86/SSE2                                                  supported      0   ATI Technologies +ATI Technologies Inc. ATI MOBILITY RADEON HD 2300                                                        supported      1   ATI Mobility Radeon HD 2300  ATI Technologies Inc. ATI MOBILITY RADEON HD 3450                                                        supported      2   ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI MOBILITY RADEON X1600                                                          supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI MOBILITY RADEON X2300                                                          supported      0   ATI Mobility Radeon X2xxx -ATI Technologies Inc. ATI MOBILITY RADEON X2300 HD x86/SSE2                                              supported      0   ATI Mobility Radeon X2xxx -ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2                                      supported      0   ATI Mobility Radeon X2xxx -ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/SSE2                                                 supported      0   ATI Mobility Radeon X2xxx -ATI Technologies Inc. ATI MOBILITY RADEON X300                                                           supported      1   ATI Mobility Radeon X3xx -ATI Technologies Inc. ATI MOBILITY RADEON X600                                                           supported      1   ATI Mobility Radeon X6xx -ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200                                                     supported      0   ATI Mobility Radeon Xxxx +ATI Technologies Inc. ATI MOBILITY RADEON HD 3650                                                        supported      3   ATI Mobility Radeon HD 3600 +ATI Technologies Inc. ATI MOBILITY RADEON X1600                                                          supported      2   ATI Radeon X16xx +ATI Technologies Inc. ATI MOBILITY RADEON X2300                                                          supported      1   ATI Radeon X2xxx +ATI Technologies Inc. ATI MOBILITY RADEON X2300 HD x86/SSE2                                              supported      1   ATI Radeon X2xxx +ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2                                      supported      1   ATI Radeon X2xxx +ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/SSE2                                                 supported      1   ATI Radeon X2xxx +ATI Technologies Inc. ATI MOBILITY RADEON X300                                                           supported      0   ATI Radeon X300 +ATI Technologies Inc. ATI MOBILITY RADEON X600                                                           supported      1   ATI Radeon X600 +ATI Technologies Inc. ATI MOBILITY RADEON X700                                                           supported      1   ATI Radeon X700 +ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200                                                     supported      0   ATI Radeon Xpress  ATI Technologies Inc. ATI Mobility FireGL V5700                                                          supported      1   ATI FireGL 5xxx -ATI Technologies Inc. ATI Mobility Radeon 4100                                                           supported      0   ATI Mobility Radeon 4100 -ATI Technologies Inc. ATI Mobility Radeon Graphics                                                       supported      0   ATI Mobility Radeon +ATI Technologies Inc. ATI Mobility Radeon 4100                                                           supported      1   ATI Mobility Radeon 4100 +ATI Technologies Inc. ATI Mobility Radeon Graphics                                                       supported      0   ATI Technologies  ATI Technologies Inc. ATI Mobility Radeon HD 2300                                                        supported      1   ATI Mobility Radeon HD 2300  ATI Technologies Inc. ATI Mobility Radeon HD 2400                                                        supported      1   ATI Mobility Radeon HD 2400  ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT                                                     supported      1   ATI Mobility Radeon HD 2400 @@ -252,17 +277,20 @@ ATI Technologies Inc. ATI Mobility Radeon HD 2600  ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT                                                     supported      3   ATI Mobility Radeon HD 2600  ATI Technologies Inc. ATI Mobility Radeon HD 2700                                                        supported      3   ATI Mobility Radeon HD 2700  ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series                                                 supported      2   ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI Mobility Radeon HD 3410                                                        supported      2   ATI Mobility Radeon HD 3400  ATI Technologies Inc. ATI Mobility Radeon HD 3430                                                        supported      2   ATI Mobility Radeon HD 3400  ATI Technologies Inc. ATI Mobility Radeon HD 3450                                                        supported      2   ATI Mobility Radeon HD 3400  ATI Technologies Inc. ATI Mobility Radeon HD 3470                                                        supported      2   ATI Mobility Radeon HD 3400  ATI Technologies Inc. ATI Mobility Radeon HD 3470 Hybrid X2                                              supported      2   ATI Mobility Radeon HD 3400  ATI Technologies Inc. ATI Mobility Radeon HD 3650                                                        supported      3   ATI Mobility Radeon HD 3600 +ATI Technologies Inc. ATI Mobility Radeon HD 3670                                                        supported      3   ATI Mobility Radeon HD 3600  ATI Technologies Inc. ATI Mobility Radeon HD 4200                                                        supported      2   ATI Mobility Radeon HD 4200  ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series                                                 supported      2   ATI Mobility Radeon HD 4200  ATI Technologies Inc. ATI Mobility Radeon HD 4225                                                        supported      2   ATI Mobility Radeon HD 4200  ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series                                                 supported      2   ATI Mobility Radeon HD 4200  ATI Technologies Inc. ATI Mobility Radeon HD 4250                                                        supported      2   ATI Mobility Radeon HD 4200  ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics                                               supported      2   ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4250 Series                                                 supported      2   ATI Mobility Radeon HD 4200  ATI Technologies Inc. ATI Mobility Radeon HD 4270                                                        supported      2   ATI Mobility Radeon HD 4200  ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series                                                 supported      2   ATI Mobility Radeon HD 4300  ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series                                            supported      2   ATI Mobility Radeon HD 4300 @@ -283,53 +311,55 @@ ATI Technologies Inc. ATI Mobility Radeon HD 4670  ATI Technologies Inc. ATI Mobility Radeon HD 4830 Series                                                 supported      3   ATI Mobility Radeon HD 4800  ATI Technologies Inc. ATI Mobility Radeon HD 4850                                                        supported      3   ATI Mobility Radeon HD 4800  ATI Technologies Inc. ATI Mobility Radeon HD 4870                                                        supported      3   ATI Mobility Radeon HD 4800 -ATI Technologies Inc. ATI Mobility Radeon HD 5000                                                        supported      0   ATI Mobility Radeon -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series                                                 supported      0   ATI Mobility Radeon -ATI Technologies Inc. ATI Mobility Radeon HD 5145                                                        supported      2   ATI Mobility Radeon HD 5100 -ATI Technologies Inc. ATI Mobility Radeon HD 5165                                                        supported      2   ATI Mobility Radeon HD 5100 +ATI Technologies Inc. ATI Mobility Radeon HD 5000                                                        supported      0   ATI Technologies +ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series                                                 supported      0   ATI Technologies +ATI Technologies Inc. ATI Mobility Radeon HD 5145                                                        supported      3   ATI Mobility Radeon HD 5100 +ATI Technologies Inc. ATI Mobility Radeon HD 5165                                                        supported      3   ATI Mobility Radeon HD 5100  ATI Technologies Inc. ATI Mobility Radeon HD 530v                                                        supported      1   ATI Mobility Radeon HD 530v -ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series                                                 supported      2   ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series                                                 supported      3   ATI Mobility Radeon HD 5400  ATI Technologies Inc. ATI Mobility Radeon HD 540v                                                        supported      2   ATI Mobility Radeon HD 540v -ATI Technologies Inc. ATI Mobility Radeon HD 5430                                                        supported      2   ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 5450                                                        supported      2   ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series                                                 supported      2   ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI Mobility Radeon HD 5430                                                        supported      3   ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI Mobility Radeon HD 5450                                                        supported      3   ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series                                                 supported      3   ATI Mobility Radeon HD 5400  ATI Technologies Inc. ATI Mobility Radeon HD 545v                                                        supported      2   ATI Mobility Radeon HD 545v -ATI Technologies Inc. ATI Mobility Radeon HD 5470                                                        supported      2   ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI Mobility Radeon HD 5470                                                        supported      3   ATI Mobility Radeon HD 5400  ATI Technologies Inc. ATI Mobility Radeon HD 550v                                                        supported      2   ATI Mobility Radeon HD 550v -ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series                                            supported      2   ATI Mobility Radeon HD 5600 +ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series                                            supported      3   ATI Mobility Radeon HD 5600  ATI Technologies Inc. ATI Mobility Radeon HD 560v                                                        supported      2   ATI Mobility Radeon HD 560v -ATI Technologies Inc. ATI Mobility Radeon HD 5650                                                        supported      2   ATI Mobility Radeon HD 5600 +ATI Technologies Inc. ATI Mobility Radeon HD 5650                                                        supported      3   ATI Mobility Radeon HD 5600  ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series                                                 supported      3   ATI Mobility Radeon HD 5700  ATI Technologies Inc. ATI Mobility Radeon HD 5730                                                        supported      3   ATI Mobility Radeon HD 5700 -ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series                                                 supported      0   ATI Mobility Radeon -ATI Technologies Inc. ATI Mobility Radeon HD 5850                                                        supported      0   ATI Mobility Radeon -ATI Technologies Inc. ATI Mobility Radeon HD 5870                                                        supported      0   ATI Mobility Radeon -ATI Technologies Inc. ATI Mobility Radeon HD 6300 series                                                 supported      2   ATI Mobility Radeon HD 6300 -ATI Technologies Inc. ATI Mobility Radeon HD 6370                                                        supported      2   ATI Mobility Radeon HD 6300 +ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series                                                 supported      3   ATI Radeon HD 5800 +ATI Technologies Inc. ATI Mobility Radeon HD 5830 Series                                                 supported      3   ATI Radeon HD 5800 +ATI Technologies Inc. ATI Mobility Radeon HD 5850                                                        supported      3   ATI Radeon HD 5800 +ATI Technologies Inc. ATI Mobility Radeon HD 5870                                                        supported      3   ATI Radeon HD 5800 +ATI Technologies Inc. ATI Mobility Radeon HD 6300 series                                                 supported      3   ATI Mobility Radeon HD 6300 +ATI Technologies Inc. ATI Mobility Radeon HD 6370                                                        supported      3   ATI Mobility Radeon HD 6300  ATI Technologies Inc. ATI Mobility Radeon HD 6470M                                                       supported      3   ATI Mobility Radeon HD 6400M  ATI Technologies Inc. ATI Mobility Radeon HD 6550                                                        supported      3   ATI Mobility Radeon HD 6500M  ATI Technologies Inc. ATI Mobility Radeon HD 6570                                                        supported      3   ATI Mobility Radeon HD 6500M -ATI Technologies Inc. ATI Mobility Radeon X1300                                                          supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2                                      supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2                                                 supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Mobility Radeon X1350                                                          supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2                                                 supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Mobility Radeon X1400                                                          supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2                                                 supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Mobility Radeon X1600                                                          supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2                                                 supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2                                                 supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Mobility Radeon X2300                                                          supported      0   ATI Mobility Radeon X2xxx -ATI Technologies Inc. ATI Mobility Radeon X2300 (Omega 3.8.442)                                          supported      0   ATI Mobility Radeon X2xxx -ATI Technologies Inc. ATI Mobility Radeon X2300 x86                                                      supported      0   ATI Mobility Radeon X2xxx -ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2                                      supported      0   ATI Mobility Radeon X2xxx -ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2                                                 supported      0   ATI Mobility Radeon X2xxx -ATI Technologies Inc. ATI Mobility Radeon X2500                                                          supported      0   ATI Mobility Radeon X2xxx -ATI Technologies Inc. ATI Mobility Radeon X2500 x86/SSE2                                                 supported      0   ATI Mobility Radeon X2xxx +ATI Technologies Inc. ATI Mobility Radeon X1300                                                          supported      1   ATI Radeon X13xx +ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2                                      supported      1   ATI Radeon X13xx +ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2                                                 supported      1   ATI Radeon X13xx +ATI Technologies Inc. ATI Mobility Radeon X1350                                                          supported      1   ATI Radeon X13xx +ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2                                                 supported      1   ATI Radeon X13xx +ATI Technologies Inc. ATI Mobility Radeon X1400                                                          supported      1   ATI Radeon X1xxx +ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2                                                 supported      1   ATI Radeon X1xxx +ATI Technologies Inc. ATI Mobility Radeon X1600                                                          supported      2   ATI Radeon X16xx +ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2                                                 supported      2   ATI Radeon X16xx +ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2                                                 supported      2   ATI Radeon X17xx +ATI Technologies Inc. ATI Mobility Radeon X2300                                                          supported      1   ATI Radeon X2xxx +ATI Technologies Inc. ATI Mobility Radeon X2300 (Omega 3.8.442)                                          supported      1   ATI Radeon X2xxx +ATI Technologies Inc. ATI Mobility Radeon X2300 x86                                                      supported      1   ATI Radeon X2xxx +ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2                                      supported      1   ATI Radeon X2xxx +ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2                                                 supported      1   ATI Radeon X2xxx +ATI Technologies Inc. ATI Mobility Radeon X2500                                                          supported      1   ATI Radeon X2xxx +ATI Technologies Inc. ATI Mobility Radeon X2500 x86/SSE2                                                 supported      1   ATI Radeon X2xxx  ATI Technologies Inc. ATI Mobility Radeon. HD 530v                                                       supported      1   ATI Mobility Radeon HD 530v -ATI Technologies Inc. ATI Mobility Radeon. HD 5470                                                       supported      2   ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI RADEON HD 3200 T25XX by CAMILO                                                 supported      0   ATI Radeon HD 3200 +ATI Technologies Inc. ATI Mobility Radeon. HD 5470                                                       supported      3   ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI RADEON HD 3200 T25XX by CAMILO                                                 supported      1   ATI Radeon HD 3200  ATI Technologies Inc. ATI RADEON XPRESS 1100                                                             supported      0   ATI Radeon Xpress +ATI Technologies Inc. ATI RADEON XPRESS 1100 x86/SSE2                                                    supported      0   ATI Radeon Xpress  ATI Technologies Inc. ATI RADEON XPRESS 200 Series                                                       supported      0   ATI Radeon Xpress  ATI Technologies Inc. ATI RADEON XPRESS 200 Series x86/SSE2                                              supported      0   ATI Radeon Xpress  ATI Technologies Inc. ATI RADEON XPRESS 200M SERIES                                                      supported      0   ATI Radeon Xpress @@ -341,14 +371,15 @@ ATI Technologies Inc. ATI Radeon 3000  ATI Technologies Inc. ATI Radeon 3000 Graphics                                                           supported      0   ATI Radeon 3000  ATI Technologies Inc. ATI Radeon 3100 Graphics                                                           supported      1   ATI Radeon 3100  ATI Technologies Inc. ATI Radeon 5xxx series                                                             supported      3   ATI Radeon 5xxx -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series                                                     supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/MMX/3DNow!/SSE                                  supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/SSE2                                            supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft - WDDM)                                   supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon 9600 / X1050 Series                                                     supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series                                                  supported      0   ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon 9550 / X1050 Series                                                     supported      0   ATI Radeon 9500 +ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/MMX/3DNow!/SSE                                  supported      0   ATI Radeon 9500 +ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/SSE2                                            supported      0   ATI Radeon 9500 +ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft - WDDM)                                   supported      0   ATI Radeon 9500 +ATI Technologies Inc. ATI Radeon 9600 / X1050 Series                                                     supported      0   ATI Radeon 9600 +ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series                                                  supported      0   ATI Radeon 9600  ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine                                              supported      0   ATI Technologies  ATI Technologies Inc. ATI Radeon BB Prototype OpenGL Engine                                              supported      0   ATI Technologies +ATI Technologies Inc. ATI Radeon Broadway XT Prototype OpenGL Engine                                     supported      0   ATI Technologies  ATI Technologies Inc. ATI Radeon Cedar PRO Prototype OpenGL Engine                                       supported      2   AMD CEDAR (HD 5450)  ATI Technologies Inc. ATI Radeon Cypress PRO Prototype OpenGL Engine                                     supported      3   AMD CYPRESS (HD 5800)  ATI Technologies Inc. ATI Radeon Graphics Processor                                                      supported      0   ATI Technologies @@ -370,7 +401,7 @@ ATI Technologies Inc. ATI Radeon HD 2600 Series  ATI Technologies Inc. ATI Radeon HD 2600 XT                                                              supported      2   ATI Radeon HD 2600  ATI Technologies Inc. ATI Radeon HD 2900 GT                                                              supported      3   ATI Radeon HD 2900  ATI Technologies Inc. ATI Radeon HD 2900 XT                                                              supported      3   ATI Radeon HD 2900 -ATI Technologies Inc. ATI Radeon HD 3200 Graphics                                                        supported      0   ATI Radeon HD 3200 +ATI Technologies Inc. ATI Radeon HD 3200 Graphics                                                        supported      1   ATI Radeon HD 3200  ATI Technologies Inc. ATI Radeon HD 3300 Graphics                                                        supported      1   ATI Radeon HD 3300  ATI Technologies Inc. ATI Radeon HD 3400 Series                                                          supported      1   ATI Radeon HD 3400  ATI Technologies Inc. ATI Radeon HD 3450                                                                 supported      1   ATI Radeon HD 3400 @@ -392,6 +423,7 @@ ATI Technologies Inc. ATI Radeon HD 4250  ATI Technologies Inc. ATI Radeon HD 4250 Graphics                                                        supported      1   ATI Radeon HD 4200  ATI Technologies Inc. ATI Radeon HD 4270                                                                 supported      1   ATI Radeon HD 4200  ATI Technologies Inc. ATI Radeon HD 4290                                                                 supported      1   ATI Radeon HD 4200 +ATI Technologies Inc. ATI Radeon HD 4290 (Engineering Sample)                                            supported      1   ATI Radeon HD 4200  ATI Technologies Inc. ATI Radeon HD 4300 Series                                                          supported      1   ATI Radeon HD 4300  ATI Technologies Inc. ATI Radeon HD 4300/4500 Series                                                     supported      1   ATI Radeon HD 4300  ATI Technologies Inc. ATI Radeon HD 4350                                                                 supported      1   ATI Radeon HD 4300 @@ -418,9 +450,11 @@ ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine  ATI Technologies Inc. ATI Radeon HD 4870 X2                                                              supported      3   ATI Radeon HD 4800  ATI Technologies Inc. ATI Radeon HD 5400 Series                                                          supported      3   ATI Radeon HD 5400  ATI Technologies Inc. ATI Radeon HD 5450                                                                 supported      3   ATI Radeon HD 5400 +ATI Technologies Inc. ATI Radeon HD 5470                                                                 supported      3   ATI Radeon HD 5400  ATI Technologies Inc. ATI Radeon HD 5500 Series                                                          supported      3   ATI Radeon HD 5500  ATI Technologies Inc. ATI Radeon HD 5570                                                                 supported      3   ATI Radeon HD 5500  ATI Technologies Inc. ATI Radeon HD 5600 Series                                                          supported      3   ATI Radeon HD 5600 +ATI Technologies Inc. ATI Radeon HD 5600/5700                                                            supported      3   ATI Radeon HD 5600  ATI Technologies Inc. ATI Radeon HD 5630                                                                 supported      3   ATI Radeon HD 5600  ATI Technologies Inc. ATI Radeon HD 5670                                                                 supported      3   ATI Radeon HD 5600  ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine                                                   supported      3   ATI Radeon HD 5600 @@ -435,13 +469,14 @@ ATI Technologies Inc. ATI Radeon HD 5870  ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine                                                   supported      3   ATI Radeon HD 5800  ATI Technologies Inc. ATI Radeon HD 5900 Series                                                          supported      3   ATI Radeon HD 5900  ATI Technologies Inc. ATI Radeon HD 5970                                                                 supported      3   ATI Radeon HD 5900 -ATI Technologies Inc. ATI Radeon HD 6230                                                                 supported      2   ATI Radeon HD 6200 -ATI Technologies Inc. ATI Radeon HD 6250                                                                 supported      2   ATI Radeon HD 6200 -ATI Technologies Inc. ATI Radeon HD 6350                                                                 supported      2   ATI Radeon HD 6300 -ATI Technologies Inc. ATI Radeon HD 6390                                                                 supported      2   ATI Radeon HD 6300 +ATI Technologies Inc. ATI Radeon HD 6230                                                                 supported      3   ATI Radeon HD 6200 +ATI Technologies Inc. ATI Radeon HD 6250                                                                 supported      3   ATI Radeon HD 6200 +ATI Technologies Inc. ATI Radeon HD 6350                                                                 supported      3   ATI Radeon HD 6300 +ATI Technologies Inc. ATI Radeon HD 6390                                                                 supported      3   ATI Radeon HD 6300  ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine                                                  supported      3   ATI Radeon HD 6400  ATI Technologies Inc. ATI Radeon HD 6510                                                                 supported      3   ATI Radeon HD 6500  ATI Technologies Inc. ATI Radeon HD 6570M                                                                supported      3   ATI Radeon HD 6500 +ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine                                                  supported      3   ATI Radeon HD 6600  ATI Technologies Inc. ATI Radeon HD 6750                                                                 supported      3   ATI Radeon HD 6700  ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine                                                  supported      3   ATI Radeon HD 6700  ATI Technologies Inc. ATI Radeon HD 6770                                                                 supported      3   ATI Radeon HD 6700 @@ -459,21 +494,21 @@ ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine  ATI Technologies Inc. ATI Radeon Redwood PRO Prototype OpenGL Engine                                     supported      3   AMD REDWOOD (HD 5500/5600)  ATI Technologies Inc. ATI Radeon Redwood XT Prototype OpenGL Engine                                      supported      3   AMD REDWOOD (HD 5500/5600)  ATI Technologies Inc. ATI Radeon Whistler PRO/LP Prototype OpenGL Engine                                 supported      0   ATI Technologies -ATI Technologies Inc. ATI Radeon X1050                                                                   supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1050 Series                                                            supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1200                                                                   supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1200 Series                                                            supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2                                        supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1250                                                                   supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2                                               supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1270                                                                   supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2                                               supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1300/X1550 Series                                                      supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1550 Series                                                            supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine                                                     supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine                                                     supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1950 GT                                                                supported      0   ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series                                                  supported      0   ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1050                                                                   supported      1   ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1050 Series                                                            supported      1   ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1200                                                                   supported      1   ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1200 Series                                                            supported      1   ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2                                        supported      1   ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1250                                                                   supported      1   ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2                                               supported      1   ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1270                                                                   supported      1   ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2                                               supported      1   ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1300/X1550 Series                                                      supported      1   ATI Radeon X13xx +ATI Technologies Inc. ATI Radeon X1550 Series                                                            supported      2   ATI Radeon X15xx +ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine                                                     supported      2   ATI Radeon X16xx +ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine                                                     supported      3   ATI Radeon X19xx +ATI Technologies Inc. ATI Radeon X1950 GT                                                                supported      3   ATI Radeon X19xx +ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series                                                  supported      0   ATI Radeon X300  ATI Technologies Inc. ATI Radeon Xpress 1100                                                             supported      0   ATI Radeon Xpress  ATI Technologies Inc. ATI Radeon Xpress 1150                                                             supported      0   ATI Radeon Xpress  ATI Technologies Inc. ATI Radeon Xpress 1150 x86/MMX/3DNow!/SSE2                                         supported      0   ATI Radeon Xpress @@ -482,18 +517,21 @@ ATI Technologies Inc. ATI Radeon Xpress 1200 Series  ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2                                  supported      0   ATI Radeon Xpress  ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2                                         supported      0   ATI Radeon Xpress  ATI Technologies Inc. ATI Radeon Xpress 1250                                                             supported      0   ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1250 x86/MMX/3DNow!/SSE2                                         supported      0   ATI Radeon Xpress  ATI Technologies Inc. ATI Radeon Xpress 1250 x86/SSE2                                                    supported      0   ATI Radeon Xpress  ATI Technologies Inc. ATI Radeon Xpress Series                                                           supported      0   ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress Series x86/MMX/3DNow!/SSE2                                       supported      0   ATI Radeon Xpress  ATI Technologies Inc. ATI Yamaha HD 9000                                                                 supported      0   ATI Technologies  ATI Technologies Inc. ATi RS880M                                                                         supported      1   ATI RS880M  ATI Technologies Inc. Carte graphique VGA standard                                                       supported      0   ATI Technologies -ATI Technologies Inc. Diamond Radeon X1550 Series                                                        supported      0   ATI Radeon X1xxx +ATI Technologies Inc. Diamond Radeon X1550 Series                                                        supported      2   ATI Radeon X15xx  ATI Technologies Inc. EG JUNIPER                                                                         supported      3   AMD JUNIPER (HD 5700)  ATI Technologies Inc. EG PARK                                                                            supported      3   AMD PARK  ATI Technologies Inc. FireGL V3100 Pentium 4 (SSE2)                                                      supported      0   ATI FireGL  ATI Technologies Inc. FireMV 2400 PCI DDR x86                                                            supported      0   ATI FireMV  ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2                                                       supported      0   ATI FireMV -ATI Technologies Inc. GeCube Radeon X1550                                                                supported      0   ATI Radeon X1xxx +ATI Technologies Inc. GeCube Radeon X1550                                                                supported      2   ATI Radeon X15xx +ATI Technologies Inc. GeForce 9600 GT      x86/SSE2                                                      supported      2   ATI Geforce 9600 GT  ATI Technologies Inc. Geforce 9500 GT                                                                    supported      2   ATI Geforce 9500 GT  ATI Technologies Inc. Geforce 9500GT                                                                     supported      2   ATI Geforce 9500 GT  ATI Technologies Inc. Geforce 9800 GT                                                                    supported      2   ATI Geforce 9800 GT @@ -502,18 +540,22 @@ ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series  ATI Technologies Inc. HIGHTECH EXCALIBUR X700 PRO                                                        supported      0   ATI Technologies  ATI Technologies Inc. M21 x86/MMX/3DNow!/SSE2                                                            supported      0   ATI Technologies  ATI Technologies Inc. M76M                                                                               supported      3   ATI M76 -ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2                                                  supported      0   ATI Mobility Radeon -ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2                                                  supported      0   ATI Mobility Radeon -ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2                               supported      0   ATI Mobility Radeon +ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2                                                  supported      0   ATI Mobility Radeon 7xxx +ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2                                                  supported      0   ATI Radeon 9000 +ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2                               supported      0   ATI Radeon 9000 +ATI Technologies Inc. MOBILITY RADEON 9100 IGP DDR x86/SSE2                                              supported      0   ATI Radeon 9100  ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2                                                      supported      0   ATI Mobility Radeon 9600  ATI Technologies Inc. MOBILITY RADEON 9700 x86/SSE2                                                      supported      1   ATI Mobility Radeon 9700 -ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2                                                      supported      1   ATI Mobility Radeon X3xx -ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2                                                      supported      1   ATI Mobility Radeon X6xx -ATI Technologies Inc. MOBILITY RADEON X700 SE x86                                                        supported      1   ATI Mobility Radeon X7xx -ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2                                                      supported      1   ATI Mobility Radeon X7xx +ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2                                                      supported      0   ATI Radeon X300 +ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2                                                      supported      1   ATI Radeon X600 +ATI Technologies Inc. MOBILITY RADEON X700 SE x86                                                        supported      1   ATI Radeon X700 +ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2                                                      supported      1   ATI Radeon X700 +ATI Technologies Inc. MOBILITY RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2                       supported      0   ATI Radeon Xpress  ATI Technologies Inc. MSI RX9550SE                                                                       supported      1   ATI Radeon RX9550 -ATI Technologies Inc. Mobility Radeon X2300 HD                                                           supported      0   ATI Mobility Radeon X2xxx -ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2                                                  supported      0   ATI Mobility Radeon X2xxx +ATI Technologies Inc. MSI Radeon X1550 Series                                                            supported      2   ATI Radeon X15xx +ATI Technologies Inc. Mobility Radeon HD 6000 series                                                     supported      0   ATI Technologies +ATI Technologies Inc. Mobility Radeon X2300 HD                                                           supported      1   ATI Radeon X2xxx +ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2                                                  supported      1   ATI Radeon X2xxx  ATI Technologies Inc. RADEON 7000 DDR x86/MMX/3DNow!/SSE                                                 supported      0   ATI Radeon 7xxx  ATI Technologies Inc. RADEON 7000 DDR x86/SSE2                                                           supported      0   ATI Radeon 7xxx  ATI Technologies Inc. RADEON 7500 DDR x86/MMX/3DNow!/SSE2                                                supported      0   ATI Radeon 7xxx @@ -535,6 +577,7 @@ ATI Technologies Inc. RADEON 9500  ATI Technologies Inc. RADEON 9550 x86/SSE2                                                               supported      0   ATI Radeon 9500  ATI Technologies Inc. RADEON 9600 SERIES                                                                 supported      0   ATI Radeon 9600  ATI Technologies Inc. RADEON 9600 SERIES x86/MMX/3DNow!/SSE2                                             supported      0   ATI Radeon 9600 +ATI Technologies Inc. RADEON 9600 SERIES x86/SSE2                                                        supported      0   ATI Radeon 9600  ATI Technologies Inc. RADEON 9600 TX x86/SSE2                                                            supported      0   ATI Radeon 9600  ATI Technologies Inc. RADEON 9600 x86/MMX/3DNow!/SSE2                                                    supported      0   ATI Radeon 9600  ATI Technologies Inc. RADEON 9600 x86/SSE2                                                               supported      0   ATI Radeon 9600 @@ -549,8 +592,10 @@ ATI Technologies Inc. RADEON X550 x86/MMX/3DNow!/SSE2  ATI Technologies Inc. RADEON X550 x86/SSE2                                                               supported      0   ATI Radeon X500  ATI Technologies Inc. RADEON X600 Series                                                                 supported      1   ATI Radeon X600  ATI Technologies Inc. RADEON X600 x86/SSE2                                                               supported      1   ATI Radeon X600 +ATI Technologies Inc. RADEON X600/X550 Series                                                            supported      1   ATI Radeon X600  ATI Technologies Inc. RADEON X700 PRO x86/SSE2                                                           supported      1   ATI Radeon X700  ATI Technologies Inc. RADEON X800 SE x86/MMX/3DNow!/SSE2                                                 supported      2   ATI Radeon X800 +ATI Technologies Inc. RADEON X800 XT                                                                     supported      2   ATI Radeon X800  ATI Technologies Inc. RADEON X800GT                                                                      supported      2   ATI Radeon X800  ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2                                supported      0   ATI Radeon Xpress  ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2                                           supported      0   ATI Radeon Xpress @@ -569,7 +614,10 @@ ATI Technologies Inc. RV410 Pro x86/SSE2  ATI Technologies Inc. RV790                                                                              supported      3   AMD RV790 (HD 4800)  ATI Technologies Inc. Radeon (TM) HD 6470M                                                               supported      0   ATI Technologies  ATI Technologies Inc. Radeon (TM) HD 6490M                                                               supported      0   ATI Technologies +ATI Technologies Inc. Radeon (TM) HD 6750M                                                               supported      0   ATI Technologies  ATI Technologies Inc. Radeon (TM) HD 6770M                                                               supported      0   ATI Technologies +ATI Technologies Inc. Radeon (TM) HD 6850M                                                               supported      0   ATI Technologies +ATI Technologies Inc. Radeon 7000 DDR x86/SSE                                                            supported      0   ATI Radeon 7xxx  ATI Technologies Inc. Radeon 7000 DDR x86/SSE2                                                           supported      0   ATI Radeon 7xxx  ATI Technologies Inc. Radeon 7000 SDR x86/SSE2                                                           supported      0   ATI Radeon 7xxx  ATI Technologies Inc. Radeon 7500 DDR x86/SSE2                                                           supported      0   ATI Radeon 7xxx @@ -577,37 +625,43 @@ ATI Technologies Inc. Radeon 9000 DDR x86/SSE2  ATI Technologies Inc. Radeon DDR x86/MMX/3DNow!/SSE2                                                     supported      0   ATI Radeon DDR  ATI Technologies Inc. Radeon DDR x86/SSE                                                                 supported      0   ATI Radeon DDR  ATI Technologies Inc. Radeon DDR x86/SSE2                                                                supported      0   ATI Radeon DDR -ATI Technologies Inc. Radeon HD 6310                                                                     supported      2   ATI Radeon HD 6300 +ATI Technologies Inc. Radeon HD 6310                                                                     supported      3   ATI Radeon HD 6300 +ATI Technologies Inc. Radeon HD 6470M                                                                    supported      3   ATI Radeon HD 6400 +ATI Technologies Inc. Radeon HD 6490M                                                                    supported      3   ATI Radeon HD 6400  ATI Technologies Inc. Radeon HD 6800 Series                                                              supported      3   ATI Radeon HD 6800  ATI Technologies Inc. Radeon SDR x86/SSE2                                                                supported      0   ATI Technologies -ATI Technologies Inc. Radeon X1300 Series                                                                supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2                                            supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1300 Series x86/SSE2                                                       supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1300/X1550 Series                                                          supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2                                                 supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1550 64-bit (Microsoft - WDDM)                                             supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1550 Series                                                                supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1550 Series x86/SSE2                                                       supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1600                                                                       supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/MMX/3DNow!/SSE2                                     supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1600 Series x86/SSE2                                                       supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1600/X1650 Series                                                          supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1650 Series                                                                supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2                                            supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1650 Series x86/SSE2                                                       supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2                                            supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1950 Pro                                                                   supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2                                               supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1950 Series                                                                supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X1950 Series  (Microsoft - WDDM)                                            supported      0   ATI Radeon X1xxx -ATI Technologies Inc. Radeon X300/X550/X1050 Series                                                      supported      0   ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1300 Series                                                                supported      1   ATI Radeon X13xx +ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2                                            supported      1   ATI Radeon X13xx +ATI Technologies Inc. Radeon X1300 Series x86/SSE2                                                       supported      1   ATI Radeon X13xx +ATI Technologies Inc. Radeon X1300/X1550 Series                                                          supported      1   ATI Radeon X13xx +ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2                                                 supported      1   ATI Radeon X13xx +ATI Technologies Inc. Radeon X1550 64-bit (Microsoft - WDDM)                                             supported      2   ATI Radeon X15xx +ATI Technologies Inc. Radeon X1550 Series                                                                supported      2   ATI Radeon X15xx +ATI Technologies Inc. Radeon X1550 Series x86/SSE2                                                       supported      2   ATI Radeon X15xx +ATI Technologies Inc. Radeon X1600                                                                       supported      2   ATI Radeon X16xx +ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/MMX/3DNow!/SSE2                                     supported      2   ATI Radeon X16xx +ATI Technologies Inc. Radeon X1600 Series                                                                supported      2   ATI Radeon X16xx +ATI Technologies Inc. Radeon X1600 Series x86/SSE2                                                       supported      2   ATI Radeon X16xx +ATI Technologies Inc. Radeon X1600/1650 Series                                                           supported      2   ATI Radeon X16xx +ATI Technologies Inc. Radeon X1600/X1650 Series                                                          supported      2   ATI Radeon X16xx +ATI Technologies Inc. Radeon X1650 Series                                                                supported      2   ATI Radeon X16xx +ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2                                            supported      2   ATI Radeon X16xx +ATI Technologies Inc. Radeon X1650 Series x86/SSE2                                                       supported      2   ATI Radeon X16xx +ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2                                            supported      3   ATI Radeon X19xx +ATI Technologies Inc. Radeon X1950 Pro                                                                   supported      3   ATI Radeon X19xx +ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2                                               supported      3   ATI Radeon X19xx +ATI Technologies Inc. Radeon X1950 Series                                                                supported      3   ATI Radeon X19xx +ATI Technologies Inc. Radeon X1950 Series  (Microsoft - WDDM)                                            supported      3   ATI Radeon X19xx +ATI Technologies Inc. Radeon X300/X550/X1050 Series                                                      supported      0   ATI Radeon X300  ATI Technologies Inc. Radeon X550/X700 Series                                                            supported      0   ATI Radeon X500  ATI Technologies Inc. Radeon X550XTX x86/MMX/3DNow!/SSE2                                                 supported      0   ATI Radeon X500  ATI Technologies Inc. SAPPHIRE RADEON X300SE                                                             supported      0   ATI Radeon X300  ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/MMX/3DNow!/SSE2                                         supported      0   ATI Radeon X300  ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/SSE2                                                    supported      0   ATI Radeon X300 -ATI Technologies Inc. SAPPHIRE Radeon X1550 Series                                                       supported      0   ATI Radeon X1xxx -ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/MMX/3DNow!/SSE2                                   supported      0   ATI Radeon X1xxx +ATI Technologies Inc. SAPPHIRE Radeon X1550 Series                                                       supported      2   ATI Radeon X15xx +ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/MMX/3DNow!/SSE2                                   supported      2   ATI Radeon X15xx +ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/SSE2                                              supported      2   ATI Radeon X15xx +ATI Technologies Inc. SAPPHIRE Radeon X1550 x86/SSE2                                                     supported      2   ATI Radeon X15xx  ATI Technologies Inc. Sapphire Radeon HD 3730                                                            supported      3   ATI Radeon HD 3700  ATI Technologies Inc. Sapphire Radeon HD 3750                                                            supported      3   ATI Radeon HD 3700  ATI Technologies Inc. Standard VGA Graphics Adapter                                                      supported      0   ATI Technologies @@ -616,7 +670,7 @@ ATI Technologies Inc. Tul, RADEON  X600 PRO x86/SSE2  ATI Technologies Inc. Tul, RADEON  X700 PRO                                                              supported      0   ATI Technologies  ATI Technologies Inc. Tul, RADEON  X700 PRO x86/MMX/3DNow!/SSE2                                          supported      0   ATI Technologies  ATI Technologies Inc. VisionTek Radeon 4350                                                              supported      0   ATI Technologies -ATI Technologies Inc. VisionTek Radeon X1550 Series                                                      supported      0   ATI Radeon X1xxx +ATI Technologies Inc. VisionTek Radeon X1550 Series                                                      supported      2   ATI Radeon X15xx  ATI Technologies Inc. WRESTLER 9802                                                                      supported      0   ATI Technologies  ATI Technologies Inc. WRESTLER 9803                                                                      supported      0   ATI Technologies  ATI Technologies Inc. XFX Radeon HD 4570                                                                 supported      3   ATI Radeon HD 4500 @@ -632,13 +686,14 @@ Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX+/3DNow!  Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX/SSE2 TCL DRI2                   supported      1   AMD RV620 (HD 3400)  Advanced Micro Devices, Inc. Mesa DRI R600 (RV635 9596) 20090101 x86/MMX+/3DNow!+/SSE TCL DRI2           supported      3   AMD RV635 (HD 3600)  Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2          supported      3   AMD RV670 (HD 3800) +Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX/SSE2 TCL DRI2                   supported      3   AMD RV670 (HD 3800)  Advanced Micro Devices, Inc. Mesa DRI R600 (RV710 9552) 20090101 x86/MMX/SSE2 TCL DRI2                   supported      1   AMD RV710 (HD 4300)  Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2          supported      3   AMD RV730 (HD 4600)  Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX/SSE2 TCL DRI2                   supported      3   AMD RV730 (HD 4600)  Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9498) 20090101  TCL DRI2                               supported      3   AMD RV730 (HD 4600)  Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9440) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2          supported      3   AMD RV770 (HD 4800)  Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9442) 20090101 x86/MMX/SSE2 TCL DRI2                   supported      3   AMD RV770 (HD 4800) -Alex Mohr GL Hijacker!                                                                                                      UNRECOGNIZED +Alex Mohr GL Hijacker!                                                                                                      NO MATCH  Apple Software Renderer                                                                                  unsupported    0   Apple Software Renderer  DRI R300 Project Mesa DRI R300 (RS400 5954) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2                   supported      1   ATI R300 (9700)  DRI R300 Project Mesa DRI R300 (RS400 5975) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2                   supported      1   ATI R300 (9700) @@ -658,13 +713,15 @@ DRI R300 Project Mesa DRI R300 (RV515 7149) 20090101 x86/MMX/SSE2 TCL DRI2  DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL                                    supported      1   ATI RV515  DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL DRI2                               supported      1   ATI RV515  DRI R300 Project Mesa DRI R300 (RV530 71C4) 20090101 x86/MMX/SSE2 TCL DRI2                               supported      1   ATI RV530 -GPU_CLASS_UNKNOWN                                                                                                           UNRECOGNIZED -Humper Chromium                                                                                                             UNRECOGNIZED -Intel                                                                                                                       UNRECOGNIZED +GPU_CLASS_UNKNOWN                                                                                                           NO MATCH +Humper 3D-Analyze v2.3 - http://www.tommti-systems.com                                                   supported      0   Humper +Humper Chromium                                                                                          supported      0   Humper +Imagination Technologies PowerVR SGX545                                                                                     NO MATCH +Intel                                                                                                                       NO MATCH  Intel  HD Graphics Family                                                                                supported      2   Intel HD Graphics -Intel 3D-Analyze v2.2 - http://www.tommti-systems.com                                                                       UNRECOGNIZED -Intel 3D-Analyze v2.3 - http://www.tommti-systems.com                                                                       UNRECOGNIZED -Intel 4 Series Internal Chipset                                                                                             UNRECOGNIZED +Intel 3D-Analyze v2.2 - http://www.tommti-systems.com                                                                       NO MATCH +Intel 3D-Analyze v2.3 - http://www.tommti-systems.com                                                                       NO MATCH +Intel 4 Series Internal Chipset                                                                                             NO MATCH  Intel 830M                                                                                               unsupported    0   Intel 830M  Intel 845G                                                                                               unsupported    0   Intel 845G  Intel 855GM                                                                                              unsupported    0   Intel 855GM @@ -675,13 +732,14 @@ Intel 945G  Intel 945GM                                                                                              supported      0   Intel 945GM  Intel 950                                                                                                supported      0   Intel 950  Intel 965                                                                                                supported      0   Intel 965 -Intel B43 Express Chipset                                                                                                   UNRECOGNIZED +Intel B43 Express Chipset                                                                                                   NO MATCH  Intel Bear Lake                                                                                          unsupported    0   Intel Bear Lake  Intel Broadwater                                                                                         unsupported    0   Intel Broadwater  Intel Brookdale                                                                                          unsupported    0   Intel Brookdale  Intel Cantiga                                                                                            unsupported    0   Intel Cantiga +Intel EMGD on PowerVR SGX535                                                                                                NO MATCH  Intel Eaglelake                                                                                          supported      0   Intel Eaglelake -Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1)                                                  UNRECOGNIZED +Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1)                                                  NO MATCH  Intel G33                                                                                                unsupported    0   Intel G33  Intel G41                                                                                                supported      0   Intel G41  Intel G41 Express Chipset                                                                                supported      0   Intel G41 @@ -710,12 +768,12 @@ Intel HD Graphics Family BR-1012-00Y8  Intel HD Graphics Family BR-1012-00YF                                                                    supported      2   Intel HD Graphics  Intel HD Graphics Family BR-1012-00ZD                                                                    supported      2   Intel HD Graphics  Intel HD Graphics Family BR-1102-00ML                                                                    supported      2   Intel HD Graphics -Intel Inc. Intel GMA 900 OpenGL Engine                                                                                      UNRECOGNIZED +Intel Inc. Intel GMA 900 OpenGL Engine                                                                                      NO MATCH  Intel Inc. Intel GMA 950 OpenGL Engine                                                                   supported      0   Intel 950  Intel Inc. Intel GMA X3100 OpenGL Engine                                                                 supported      0   Intel X3100  Intel Inc. Intel HD Graphics 3000 OpenGL Engine                                                          supported      2   Intel HD Graphics  Intel Inc. Intel HD Graphics OpenGL Engine                                                               supported      2   Intel HD Graphics -Intel Inc. Intel HD xxxx OpenGL Engine                                                                                      UNRECOGNIZED +Intel Inc. Intel HD xxxx OpenGL Engine                                                                                      NO MATCH  Intel Intel 845G                                                                                         unsupported    0   Intel 845G  Intel Intel 855GM                                                                                        unsupported    0   Intel 855GM  Intel Intel 865G                                                                                         unsupported    0   Intel 865G @@ -727,39 +785,42 @@ Intel Intel 965/963 Graphics Media Accelerator  Intel Intel Bear Lake B                                                                                  unsupported    0   Intel Bear Lake  Intel Intel Broadwater G                                                                                 unsupported    0   Intel Broadwater  Intel Intel Brookdale-G                                                                                  unsupported    0   Intel Brookdale -Intel Intel Calistoga                                                                                                       UNRECOGNIZED +Intel Intel Calistoga                                                                                                       NO MATCH  Intel Intel Cantiga                                                                                      unsupported    0   Intel Cantiga  Intel Intel Eaglelake                                                                                    supported      0   Intel Eaglelake -Intel Intel Grantsdale-G                                                                                                    UNRECOGNIZED +Intel Intel Generic Renderer                                                                                                NO MATCH +Intel Intel Grantsdale-G                                                                                                    NO MATCH  Intel Intel HD Graphics 3000                                                                             supported      2   Intel HD Graphics -Intel Intel Lakeport                                                                                                        UNRECOGNIZED +Intel Intel Lakeport                                                                                                        NO MATCH  Intel Intel Montara-GM                                                                                   unsupported    0   Intel Montara  Intel Intel Pineview Platform                                                                            supported      0   Intel Pineview  Intel Intel Springdale-G                                                                                 unsupported    0   Intel Springdale -Intel Mobile - famiglia Express Chipset 45 (Microsoft Corporation - WDDM 1.1)                                               UNRECOGNIZED +Intel Mobile - famiglia Express Chipset 45 (Microsoft Corporation - WDDM 1.1)                                               NO MATCH  Intel Mobile 4 Series                                                                                    supported      0   Intel Mobile 4 Series  Intel Mobile 4 Series Express Chipset Family                                                             supported      0   Intel Mobile 4 Series -Intel Mobile 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1)                                                   UNRECOGNIZED +Intel Mobile 45 Express Chipset Family                                                                                      NO MATCH +Intel Mobile 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1)                                                   NO MATCH  Intel Mobile HD Graphics                                                                                 supported      2   Intel HD Graphics +Intel Mobile Intel(R) 4 Series Express Chipset Family                                                    supported      0   Intel Mobile 4 Series  Intel Mobile SandyBridge HD Graphics                                                                     supported      2   Intel HD Graphics  Intel Montara                                                                                            unsupported    0   Intel Montara  Intel Pineview                                                                                           supported      0   Intel Pineview -Intel Q45/Q43 Express Chipset                                                                                               UNRECOGNIZED -Intel Royal BNA Driver                                                                                                      UNRECOGNIZED +Intel Q45/Q43 Express Chipset                                                                                               NO MATCH +Intel Royal BNA Driver                                                                                                      NO MATCH  Intel SandyBridge HD Graphics                                                                            supported      2   Intel HD Graphics  Intel SandyBridge HD Graphics BR-1006-00V8                                                               supported      2   Intel HD Graphics  Intel Springdale                                                                                         unsupported    0   Intel Springdale  Intel X3100                                                                                              supported      0   Intel X3100 -Intergraph wcgdrv 06.05.06.18                                                                                               UNRECOGNIZED -Intergraph wcgdrv 06.06.00.35                                                                                               UNRECOGNIZED -LegendgrafiX Mobile 945 Express C/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://Legendgra...                      UNRECOGNIZED +Intergraph wcgdrv 06.05.06.18                                                                                               NO MATCH +Intergraph wcgdrv 06.06.00.35                                                                                               NO MATCH +LegendgrafiX Mobile 945 Express C/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://Legendgra...                      NO MATCH  LegendgrafiX NVIDIA GeForce GT 430/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://Legendgr...   supported      3   NVIDIA GT 430M -Linden Lab Headless                                                                                                         UNRECOGNIZED +Linden Lab Headless                                                                                                         NO MATCH  Matrox                                                                                                   unsupported    0   Matrox  Mesa                                                                                                     unsupported    0   Mesa  Mesa Project Software Rasterizer                                                                         unsupported    0   Mesa -NVIDIA /PCI/SSE2                                                                                                            UNRECOGNIZED -NVIDIA /PCI/SSE2/3DNOW!                                                                                                     UNRECOGNIZED +NVIDIA /PCI/SSE2                                                                                                            NO MATCH +NVIDIA /PCI/SSE2/3DNOW!                                                                                                     NO MATCH  NVIDIA 205                                                                                               supported      0   NVIDIA G 205M  NVIDIA 210                                                                                               supported      1   NVIDIA G 210  NVIDIA 310                                                                                               supported      2   NVIDIA G 310M @@ -768,21 +829,25 @@ NVIDIA 315  NVIDIA 315M                                                                                              supported      2   NVIDIA G 315  NVIDIA 320M                                                                                              supported      2   NVIDIA G 320M  NVIDIA C51                                                                                               supported      0   NVIDIA C51 -NVIDIA D10M2-20/PCI/SSE2                                                                                                    UNRECOGNIZED -NVIDIA D10P1-25/PCI/SSE2                                                                                                    UNRECOGNIZED -NVIDIA D10P1-30/PCI/SSE2                                                                                                    UNRECOGNIZED -NVIDIA D10P2-50/PCI/SSE2                                                                                                    UNRECOGNIZED -NVIDIA D11M2-30/PCI/SSE2                                                                                                    UNRECOGNIZED -NVIDIA D12-P1-35/PCI/SSE2                                                                                                   UNRECOGNIZED -NVIDIA D12U-15/PCI/SSE2                                                                                                     UNRECOGNIZED -NVIDIA D13M1-40/PCI/SSE2                                                                                                    UNRECOGNIZED -NVIDIA D13P1-40/PCI/SSE2                                                                                                    UNRECOGNIZED -NVIDIA D13U-10/PCI/SSE2                                                                                                     UNRECOGNIZED -NVIDIA D13U/PCI/SSE2                                                                                                        UNRECOGNIZED +NVIDIA Corporation GeForce GT 230/PCI/SSE2                                                               supported      2   NVIDIA GT 230M +NVIDIA Corporation GeForce GTX 285/PCI/SSE2                                                              supported      3   NVIDIA GTX 285 +NVIDIA D10M2-20/PCI/SSE2                                                                                                    NO MATCH +NVIDIA D10P1-25/PCI/SSE2                                                                                                    NO MATCH +NVIDIA D10P1-25/PCI/SSE2/3DNOW!                                                                                             NO MATCH +NVIDIA D10P1-30/PCI/SSE2                                                                                                    NO MATCH +NVIDIA D10P2-50/PCI/SSE2                                                                                                    NO MATCH +NVIDIA D11M2-30/PCI/SSE2                                                                                                    NO MATCH +NVIDIA D12-P1-35/PCI/SSE2                                                                                                   NO MATCH +NVIDIA D12U-15/PCI/SSE2                                                                                                     NO MATCH +NVIDIA D13M1-40/PCI/SSE2                                                                                                    NO MATCH +NVIDIA D13P1-40/PCI/SSE2                                                                                                    NO MATCH +NVIDIA D13P1-40/PCI/SSE2/3DNOW!                                                                                             NO MATCH +NVIDIA D13U-10/PCI/SSE2                                                                                                     NO MATCH +NVIDIA D13U/PCI/SSE2                                                                                                        NO MATCH  NVIDIA D9M                                                                                               supported      1   NVIDIA D9M  NVIDIA D9M-20/PCI/SSE2                                                                                   supported      1   NVIDIA D9M -NVIDIA Entry Graphics/PCI/SSE2                                                                                              UNRECOGNIZED -NVIDIA Entry Graphics/PCI/SSE2/3DNOW!                                                                                       UNRECOGNIZED +NVIDIA Entry Graphics/PCI/SSE2                                                                                              NO MATCH +NVIDIA Entry Graphics/PCI/SSE2/3DNOW!                                                                                       NO MATCH  NVIDIA G 102M                                                                                            supported      0   NVIDIA G102M  NVIDIA G 103M                                                                                            supported      0   NVIDIA G103M  NVIDIA G 105M                                                                                            supported      0   NVIDIA G105M @@ -793,16 +858,17 @@ NVIDIA G103M  NVIDIA G105M                                                                                             supported      0   NVIDIA G105M  NVIDIA G210                                                                                              supported      1   NVIDIA G 210  NVIDIA G210M                                                                                             supported      1   NVIDIA G 210 -NVIDIA G70/PCI/SSE2                                                                                                         UNRECOGNIZED +NVIDIA G70/PCI/SSE2                                                                                                         NO MATCH  NVIDIA G72                                                                                               supported      1   NVIDIA G72  NVIDIA G73                                                                                               supported      1   NVIDIA G73  NVIDIA G84                                                                                               supported      2   NVIDIA G84  NVIDIA G86                                                                                               supported      3   NVIDIA G86  NVIDIA G92                                                                                               supported      3   NVIDIA G92 -NVIDIA G92-200/PCI/SSE2                                                                                  supported      3   NVIDIA G92 +NVIDIA G92-200/PCI/SSE2                                                                                  supported      0   NVIDIA G 200  NVIDIA G94                                                                                               supported      3   NVIDIA G94 -NVIDIA G96/PCI/SSE2                                                                                                         UNRECOGNIZED -NVIDIA G98/PCI/SSE2                                                                                                         UNRECOGNIZED +NVIDIA G96/PCI/SSE2                                                                                                         NO MATCH +NVIDIA G98/PCI/SSE2                                                                                                         NO MATCH +NVIDIA G98/PCI/SSE2/3DNOW!                                                                                                  NO MATCH  NVIDIA GT 120                                                                                            supported      2   NVIDIA GT 120M  NVIDIA GT 130                                                                                            supported      2   NVIDIA GT 130M  NVIDIA GT 130M                                                                                           supported      2   NVIDIA GT 130M @@ -818,8 +884,8 @@ NVIDIA GT 240  NVIDIA GT 240M                                                                                           supported      2   NVIDIA GT 240M  NVIDIA GT 250M                                                                                           supported      2   NVIDIA GT 250M  NVIDIA GT 260M                                                                                           supported      2   NVIDIA GT 260M -NVIDIA GT 320                                                                                            supported      2   NVIDIA GT 320M -NVIDIA GT 320M                                                                                           supported      2   NVIDIA GT 320M +NVIDIA GT 320                                                                                            supported      2   NVIDIA G 320M +NVIDIA GT 320M                                                                                           supported      2   NVIDIA G 320M  NVIDIA GT 330                                                                                            supported      3   NVIDIA GT 330M  NVIDIA GT 330M                                                                                           supported      3   NVIDIA GT 330M  NVIDIA GT 340                                                                                            supported      2   NVIDIA GT 340M @@ -831,7 +897,7 @@ NVIDIA GT 520  NVIDIA GT 540                                                                                            supported      3   NVIDIA GT 540M  NVIDIA GT 540M                                                                                           supported      3   NVIDIA GT 540M  NVIDIA GT-120                                                                                            supported      2   NVIDIA GT 120 -NVIDIA GT200/PCI/SSE2                                                                                                       UNRECOGNIZED +NVIDIA GT200/PCI/SSE2                                                                                    supported      0   NVIDIA G 200  NVIDIA GTS 150                                                                                           supported      2   NVIDIA GT 150M  NVIDIA GTS 240                                                                                           supported      3   NVIDIA GTS 240  NVIDIA GTS 250                                                                                           supported      3   NVIDIA GTS 250 @@ -858,7 +924,7 @@ NVIDIA GTX 560 Ti  NVIDIA GTX 570                                                                                           supported      3   NVIDIA GTX 570  NVIDIA GTX 580                                                                                           supported      3   NVIDIA GTX 580  NVIDIA GTX 590                                                                                           supported      3   NVIDIA GTX 590 -NVIDIA GeForce                                                                                                              UNRECOGNIZED +NVIDIA GeForce                                                                                                              NO MATCH  NVIDIA GeForce 2                                                                                         supported      0   NVIDIA GeForce 2  NVIDIA GeForce 205/PCI/SSE2                                                                              supported      2   NVIDIA 205  NVIDIA GeForce 210                                                                                       supported      2   NVIDIA 210 @@ -877,34 +943,35 @@ NVIDIA GeForce 4 Go  NVIDIA GeForce 4 MX                                                                                      supported      0   NVIDIA GeForce 4  NVIDIA GeForce 4 Ti                                                                                      supported      0   NVIDIA GeForce 4  NVIDIA GeForce 405/PCI/SSE2                                                                              supported      1   NVIDIA G 405 -NVIDIA GeForce 6100                                                                                      supported      0   NVIDIA GeForce 6100 -NVIDIA GeForce 6100 nForce 400/PCI/SSE2/3DNOW!                                                           supported      0   NVIDIA GeForce 6100 -NVIDIA GeForce 6100 nForce 405/PCI/SSE2                                                                  supported      0   NVIDIA GeForce 6100 -NVIDIA GeForce 6100 nForce 405/PCI/SSE2/3DNOW!                                                           supported      0   NVIDIA GeForce 6100 -NVIDIA GeForce 6100 nForce 420/PCI/SSE2/3DNOW!                                                           supported      0   NVIDIA GeForce 6100 -NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW!                                                           supported      0   NVIDIA GeForce 6100 -NVIDIA GeForce 6100/PCI/SSE2/3DNOW!                                                                      supported      0   NVIDIA GeForce 6100 +NVIDIA GeForce 410M/PCI/SSE2                                                                             supported      1   NVIDIA G 410M +NVIDIA GeForce 6100                                                                                      supported      0   NVIDIA G100 +NVIDIA GeForce 6100 nForce 400/PCI/SSE2/3DNOW!                                                           supported      0   NVIDIA G100 +NVIDIA GeForce 6100 nForce 405/PCI/SSE2                                                                  supported      0   NVIDIA G100 +NVIDIA GeForce 6100 nForce 405/PCI/SSE2/3DNOW!                                                           supported      0   NVIDIA G100 +NVIDIA GeForce 6100 nForce 420/PCI/SSE2/3DNOW!                                                           supported      0   NVIDIA G100 +NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW!                                                           supported      0   NVIDIA G100 +NVIDIA GeForce 6100/PCI/SSE2/3DNOW!                                                                      supported      0   NVIDIA G100  NVIDIA GeForce 6150 LE/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce 6100  NVIDIA GeForce 6150/PCI/SSE2                                                                             supported      0   NVIDIA GeForce 6100  NVIDIA GeForce 6150/PCI/SSE2/3DNOW!                                                                      supported      0   NVIDIA GeForce 6100  NVIDIA GeForce 6150SE nForce 430/PCI/SSE2                                                                supported      0   NVIDIA GeForce 6100  NVIDIA GeForce 6150SE nForce 430/PCI/SSE2/3DNOW!                                                         supported      0   NVIDIA GeForce 6100  NVIDIA GeForce 6150SE/PCI/SSE2/3DNOW!                                                                    supported      0   NVIDIA GeForce 6100 -NVIDIA GeForce 6200                                                                                      supported      0   NVIDIA GeForce 6200 -NVIDIA GeForce 6200 A-LE/AGP/SSE/3DNOW!                                                                  supported      0   NVIDIA GeForce 6200 -NVIDIA GeForce 6200 A-LE/AGP/SSE2                                                                        supported      0   NVIDIA GeForce 6200 -NVIDIA GeForce 6200 A-LE/AGP/SSE2/3DNOW!                                                                 supported      0   NVIDIA GeForce 6200 -NVIDIA GeForce 6200 LE/PCI/SSE2                                                                          supported      0   NVIDIA GeForce 6200 -NVIDIA GeForce 6200 LE/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce 6200 -NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2                                                              supported      0   NVIDIA GeForce 6200 -NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW!                                                       supported      0   NVIDIA GeForce 6200 -NVIDIA GeForce 6200/AGP/SSE/3DNOW!                                                                       supported      0   NVIDIA GeForce 6200 -NVIDIA GeForce 6200/AGP/SSE2                                                                             supported      0   NVIDIA GeForce 6200 -NVIDIA GeForce 6200/AGP/SSE2/3DNOW!                                                                      supported      0   NVIDIA GeForce 6200 -NVIDIA GeForce 6200/PCI/SSE/3DNOW!                                                                       supported      0   NVIDIA GeForce 6200 -NVIDIA GeForce 6200/PCI/SSE2                                                                             supported      0   NVIDIA GeForce 6200 -NVIDIA GeForce 6200/PCI/SSE2/3DNOW!                                                                      supported      0   NVIDIA GeForce 6200 -NVIDIA GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW!                                                     supported      0   NVIDIA GeForce 6200 +NVIDIA GeForce 6200                                                                                      supported      0   NVIDIA G 200 +NVIDIA GeForce 6200 A-LE/AGP/SSE/3DNOW!                                                                  supported      0   NVIDIA G 200 +NVIDIA GeForce 6200 A-LE/AGP/SSE2                                                                        supported      0   NVIDIA G 200 +NVIDIA GeForce 6200 A-LE/AGP/SSE2/3DNOW!                                                                 supported      0   NVIDIA G 200 +NVIDIA GeForce 6200 LE/PCI/SSE2                                                                          supported      0   NVIDIA G 200 +NVIDIA GeForce 6200 LE/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA G 200 +NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2                                                              supported      0   NVIDIA G 200 +NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW!                                                       supported      0   NVIDIA G 200 +NVIDIA GeForce 6200/AGP/SSE/3DNOW!                                                                       supported      0   NVIDIA G 200 +NVIDIA GeForce 6200/AGP/SSE2                                                                             supported      0   NVIDIA G 200 +NVIDIA GeForce 6200/AGP/SSE2/3DNOW!                                                                      supported      0   NVIDIA G 200 +NVIDIA GeForce 6200/PCI/SSE/3DNOW!                                                                       supported      0   NVIDIA G 200 +NVIDIA GeForce 6200/PCI/SSE2                                                                             supported      0   NVIDIA G 200 +NVIDIA GeForce 6200/PCI/SSE2/3DNOW!                                                                      supported      0   NVIDIA G 200 +NVIDIA GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW!                                                     supported      0   NVIDIA G 200  NVIDIA GeForce 6500                                                                                      supported      0   NVIDIA GeForce 6500  NVIDIA GeForce 6500/PCI/SSE2                                                                             supported      0   NVIDIA GeForce 6500  NVIDIA GeForce 6600                                                                                      supported      1   NVIDIA GeForce 6600 @@ -921,11 +988,13 @@ NVIDIA GeForce 6600/PCI/SSE2  NVIDIA GeForce 6600/PCI/SSE2/3DNOW!                                                                      supported      1   NVIDIA GeForce 6600  NVIDIA GeForce 6700                                                                                      supported      2   NVIDIA GeForce 6700  NVIDIA GeForce 6800                                                                                      supported      2   NVIDIA GeForce 6800 +NVIDIA GeForce 6800 GS/PCI/SSE2                                                                          supported      2   NVIDIA GeForce 6800  NVIDIA GeForce 6800 GS/PCI/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce 6800  NVIDIA GeForce 6800 GT/AGP/SSE2                                                                          supported      2   NVIDIA GeForce 6800  NVIDIA GeForce 6800 GT/PCI/SSE2                                                                          supported      2   NVIDIA GeForce 6800  NVIDIA GeForce 6800 XT/AGP/SSE2                                                                          supported      2   NVIDIA GeForce 6800  NVIDIA GeForce 6800 XT/PCI/SSE2                                                                          supported      2   NVIDIA GeForce 6800 +NVIDIA GeForce 6800 XT/PCI/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce 6800  NVIDIA GeForce 6800/PCI/SSE2                                                                             supported      2   NVIDIA GeForce 6800  NVIDIA GeForce 6800/PCI/SSE2/3DNOW!                                                                      supported      2   NVIDIA GeForce 6800  NVIDIA GeForce 7000                                                                                      supported      0   NVIDIA GeForce 7000 @@ -943,12 +1012,12 @@ NVIDIA GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW!  NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2                                                            supported      0   NVIDIA GeForce 7000  NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2/3DNOW!                                                     supported      0   NVIDIA GeForce 7000  NVIDIA GeForce 7050 SE / NVIDIA nForce 630a/PCI/SSE2/3DNOW!                                              supported      0   NVIDIA GeForce 7000 -NVIDIA GeForce 7100                                                                                      supported      0   NVIDIA GeForce 7100 -NVIDIA GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2                                                        supported      0   NVIDIA GeForce 7100 -NVIDIA GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2                                                        supported      0   NVIDIA GeForce 7100 -NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2                                                               supported      0   NVIDIA GeForce 7100 -NVIDIA GeForce 7100 GS/PCI/SSE2                                                                          supported      0   NVIDIA GeForce 7100 -NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce 7100 +NVIDIA GeForce 7100                                                                                      supported      0   NVIDIA G100 +NVIDIA GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2                                                        supported      0   NVIDIA G100 +NVIDIA GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2                                                        supported      0   NVIDIA G100 +NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2                                                               supported      0   NVIDIA G100 +NVIDIA GeForce 7100 GS/PCI/SSE2                                                                          supported      0   NVIDIA G100 +NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA G100  NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2                                                              supported      0   NVIDIA GeForce 7100  NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW!                                                       supported      0   NVIDIA GeForce 7100  NVIDIA GeForce 7300                                                                                      supported      1   NVIDIA GeForce 7300 @@ -960,8 +1029,8 @@ NVIDIA GeForce 7300 GT/PCI/SSE2  NVIDIA GeForce 7300 GT/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce 7300  NVIDIA GeForce 7300 LE/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 7300  NVIDIA GeForce 7300 LE/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce 7300 -NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2                                                                  supported      1   NVIDIA GeForce 7300 -NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW!                                                           supported      1   NVIDIA GeForce 7300 +NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2                                                                  supported      0   NVIDIA G 200 +NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW!                                                           supported      0   NVIDIA G 200  NVIDIA GeForce 7300 SE/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 7300  NVIDIA GeForce 7300 SE/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce 7300  NVIDIA GeForce 7350 LE/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 7300 @@ -982,24 +1051,26 @@ NVIDIA GeForce 7800  NVIDIA GeForce 7800 GS/AGP/SSE2                                                                          supported      2   NVIDIA GeForce 7800  NVIDIA GeForce 7800 GS/AGP/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce 7800  NVIDIA GeForce 7800 GT/PCI/SSE2                                                                          supported      2   NVIDIA GeForce 7800 +NVIDIA GeForce 7800 GT/PCI/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce 7800  NVIDIA GeForce 7800 GTX/PCI/SSE2                                                                         supported      2   NVIDIA GeForce 7800  NVIDIA GeForce 7800 GTX/PCI/SSE2/3DNOW!                                                                  supported      2   NVIDIA GeForce 7800  NVIDIA GeForce 7900                                                                                      supported      2   NVIDIA GeForce 7900  NVIDIA GeForce 7900 GS/PCI/SSE2                                                                          supported      2   NVIDIA GeForce 7900  NVIDIA GeForce 7900 GS/PCI/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce 7900  NVIDIA GeForce 7900 GT/GTO/PCI/SSE2                                                                      supported      2   NVIDIA GeForce 7900 +NVIDIA GeForce 7900 GT/GTO/PCI/SSE2/3DNOW!                                                               supported      2   NVIDIA GeForce 7900  NVIDIA GeForce 7900 GT/PCI/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce 7900  NVIDIA GeForce 7900 GTX/PCI/SSE2                                                                         supported      2   NVIDIA GeForce 7900  NVIDIA GeForce 7950 GT/PCI/SSE2                                                                          supported      2   NVIDIA GeForce 7900  NVIDIA GeForce 7950 GT/PCI/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce 7900 -NVIDIA GeForce 8100                                                                                      supported      1   NVIDIA GeForce 8100 -NVIDIA GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW!                                                        supported      1   NVIDIA GeForce 8100 -NVIDIA GeForce 8200                                                                                      supported      1   NVIDIA GeForce 8200 -NVIDIA GeForce 8200/PCI/SSE2                                                                             supported      1   NVIDIA GeForce 8200 -NVIDIA GeForce 8200/PCI/SSE2/3DNOW!                                                                      supported      1   NVIDIA GeForce 8200 -NVIDIA GeForce 8200M                                                                                     supported      1   NVIDIA GeForce 8200M -NVIDIA GeForce 8200M G/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 8200M -NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce 8200M +NVIDIA GeForce 8100                                                                                      supported      0   NVIDIA G100 +NVIDIA GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW!                                                        supported      0   NVIDIA G100 +NVIDIA GeForce 8200                                                                                      supported      0   NVIDIA G 200 +NVIDIA GeForce 8200/PCI/SSE2                                                                             supported      0   NVIDIA G 200 +NVIDIA GeForce 8200/PCI/SSE2/3DNOW!                                                                      supported      0   NVIDIA G 200 +NVIDIA GeForce 8200M                                                                                     supported      0   NVIDIA G 200 +NVIDIA GeForce 8200M G/PCI/SSE2                                                                          supported      0   NVIDIA G 200 +NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA G 200  NVIDIA GeForce 8300                                                                                      supported      1   NVIDIA GeForce 8300  NVIDIA GeForce 8300 GS/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 8300  NVIDIA GeForce 8400                                                                                      supported      1   NVIDIA GeForce 8400 @@ -1045,17 +1116,17 @@ NVIDIA GeForce 8800 GTX/PCI/SSE2  NVIDIA GeForce 8800 Ultra/PCI/SSE2                                                                       supported      3   NVIDIA GeForce 8800  NVIDIA GeForce 8800M GTS/PCI/SSE2                                                                        supported      3   NVIDIA GeForce 8800M  NVIDIA GeForce 8800M GTX/PCI/SSE2                                                                        supported      3   NVIDIA GeForce 8800M -NVIDIA GeForce 9100                                                                                      supported      0   NVIDIA GeForce 9100 -NVIDIA GeForce 9100/PCI/SSE2                                                                             supported      0   NVIDIA GeForce 9100 -NVIDIA GeForce 9100/PCI/SSE2/3DNOW!                                                                      supported      0   NVIDIA GeForce 9100 -NVIDIA GeForce 9100M                                                                                     supported      0   NVIDIA GeForce 9100M -NVIDIA GeForce 9100M G/PCI/SSE2                                                                          supported      0   NVIDIA GeForce 9100M -NVIDIA GeForce 9100M G/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce 9100M -NVIDIA GeForce 9200                                                                                      supported      1   NVIDIA GeForce 9200 -NVIDIA GeForce 9200/PCI/SSE2                                                                             supported      1   NVIDIA GeForce 9200 -NVIDIA GeForce 9200/PCI/SSE2/3DNOW!                                                                      supported      1   NVIDIA GeForce 9200 -NVIDIA GeForce 9200M GE/PCI/SSE2                                                                         supported      1   NVIDIA GeForce 9200M -NVIDIA GeForce 9200M GS/PCI/SSE2                                                                         supported      1   NVIDIA GeForce 9200M +NVIDIA GeForce 9100                                                                                      supported      0   NVIDIA G100 +NVIDIA GeForce 9100/PCI/SSE2                                                                             supported      0   NVIDIA G100 +NVIDIA GeForce 9100/PCI/SSE2/3DNOW!                                                                      supported      0   NVIDIA G100 +NVIDIA GeForce 9100M                                                                                     supported      0   NVIDIA G100M +NVIDIA GeForce 9100M G/PCI/SSE2                                                                          supported      0   NVIDIA G100M +NVIDIA GeForce 9100M G/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA G100M +NVIDIA GeForce 9200                                                                                      supported      0   NVIDIA G 200 +NVIDIA GeForce 9200/PCI/SSE2                                                                             supported      0   NVIDIA G 200 +NVIDIA GeForce 9200/PCI/SSE2/3DNOW!                                                                      supported      0   NVIDIA G 200 +NVIDIA GeForce 9200M GE/PCI/SSE2                                                                         supported      0   NVIDIA G 200 +NVIDIA GeForce 9200M GS/PCI/SSE2                                                                         supported      0   NVIDIA G 200  NVIDIA GeForce 9300                                                                                      supported      1   NVIDIA GeForce 9300  NVIDIA GeForce 9300 / nForce 730i/PCI/SSE2                                                               supported      1   NVIDIA GeForce 9300  NVIDIA GeForce 9300 GE/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 9300 @@ -1108,16 +1179,16 @@ NVIDIA GeForce 9800M  NVIDIA GeForce 9800M GS/PCI/SSE2                                                                         supported      3   NVIDIA GeForce 9800M  NVIDIA GeForce 9800M GT/PCI/SSE2                                                                         supported      3   NVIDIA GeForce 9800M  NVIDIA GeForce 9800M GTS/PCI/SSE2                                                                        supported      3   NVIDIA GeForce 9800M -NVIDIA GeForce FX 5100                                                                                   supported      0   NVIDIA GeForce FX 5100 -NVIDIA GeForce FX 5100/AGP/SSE/3DNOW!                                                                    supported      0   NVIDIA GeForce FX 5100 -NVIDIA GeForce FX 5200                                                                                   supported      0   NVIDIA GeForce FX 5200 -NVIDIA GeForce FX 5200/AGP/SSE                                                                           supported      0   NVIDIA GeForce FX 5200 -NVIDIA GeForce FX 5200/AGP/SSE/3DNOW!                                                                    supported      0   NVIDIA GeForce FX 5200 -NVIDIA GeForce FX 5200/AGP/SSE2                                                                          supported      0   NVIDIA GeForce FX 5200 -NVIDIA GeForce FX 5200/AGP/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce FX 5200 -NVIDIA GeForce FX 5200/PCI/SSE2                                                                          supported      0   NVIDIA GeForce FX 5200 -NVIDIA GeForce FX 5200/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce FX 5200 -NVIDIA GeForce FX 5200LE/AGP/SSE2                                                                        supported      0   NVIDIA GeForce FX 5200 +NVIDIA GeForce FX 5100                                                                                   supported      0   NVIDIA G100 +NVIDIA GeForce FX 5100/AGP/SSE/3DNOW!                                                                    supported      0   NVIDIA G100 +NVIDIA GeForce FX 5200                                                                                   supported      0   NVIDIA G 200 +NVIDIA GeForce FX 5200/AGP/SSE                                                                           supported      0   NVIDIA G 200 +NVIDIA GeForce FX 5200/AGP/SSE/3DNOW!                                                                    supported      0   NVIDIA G 200 +NVIDIA GeForce FX 5200/AGP/SSE2                                                                          supported      0   NVIDIA G 200 +NVIDIA GeForce FX 5200/AGP/SSE2/3DNOW!                                                                   supported      0   NVIDIA G 200 +NVIDIA GeForce FX 5200/PCI/SSE2                                                                          supported      0   NVIDIA G 200 +NVIDIA GeForce FX 5200/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA G 200 +NVIDIA GeForce FX 5200LE/AGP/SSE2                                                                        supported      0   NVIDIA G 200  NVIDIA GeForce FX 5500                                                                                   supported      0   NVIDIA GeForce FX 5500  NVIDIA GeForce FX 5500/AGP/SSE/3DNOW!                                                                    supported      0   NVIDIA GeForce FX 5500  NVIDIA GeForce FX 5500/AGP/SSE2                                                                          supported      0   NVIDIA GeForce FX 5500 @@ -1136,17 +1207,19 @@ NVIDIA GeForce FX 5800  NVIDIA GeForce FX 5900                                                                                   supported      1   NVIDIA GeForce FX 5900  NVIDIA GeForce FX 5900/AGP/SSE2                                                                          supported      1   NVIDIA GeForce FX 5900  NVIDIA GeForce FX 5900XT/AGP/SSE2                                                                        supported      1   NVIDIA GeForce FX 5900 -NVIDIA GeForce FX Go5100                                                                                 supported      0   NVIDIA GeForce FX Go5100 -NVIDIA GeForce FX Go5100/AGP/SSE2                                                                        supported      0   NVIDIA GeForce FX Go5100 -NVIDIA GeForce FX Go5200                                                                                 supported      0   NVIDIA GeForce FX Go5200 -NVIDIA GeForce FX Go5200/AGP/SSE2                                                                        supported      0   NVIDIA GeForce FX Go5200 +NVIDIA GeForce FX Go5100                                                                                 supported      0   NVIDIA G100 +NVIDIA GeForce FX Go5100/AGP/SSE2                                                                        supported      0   NVIDIA G100 +NVIDIA GeForce FX Go5200                                                                                 supported      0   NVIDIA G 200 +NVIDIA GeForce FX Go5200/AGP/SSE2                                                                        supported      0   NVIDIA G 200  NVIDIA GeForce FX Go5300                                                                                 supported      0   NVIDIA GeForce FX Go5300  NVIDIA GeForce FX Go5600                                                                                 supported      0   NVIDIA GeForce FX Go5600  NVIDIA GeForce FX Go5600/AGP/SSE2                                                                        supported      0   NVIDIA GeForce FX Go5600  NVIDIA GeForce FX Go5650/AGP/SSE2                                                                        supported      0   NVIDIA GeForce FX Go5600  NVIDIA GeForce FX Go5700                                                                                 supported      1   NVIDIA GeForce FX Go5700 +NVIDIA GeForce FX Go5700/AGP/SSE2                                                                        supported      1   NVIDIA GeForce FX Go5700  NVIDIA GeForce FX Go5xxx/AGP/SSE2                                                                        supported      0   NVIDIA GeForce FX Go5xxx  NVIDIA GeForce G 103M/PCI/SSE2                                                                           supported      0   NVIDIA G103M +NVIDIA GeForce G 103M/PCI/SSE2/3DNOW!                                                                    supported      0   NVIDIA G103M  NVIDIA GeForce G 105M/PCI/SSE2                                                                           supported      0   NVIDIA G105M  NVIDIA GeForce G 110M/PCI/SSE2                                                                           supported      0   NVIDIA G 110M  NVIDIA GeForce G100/PCI/SSE2                                                                             supported      0   NVIDIA G100 @@ -1161,7 +1234,7 @@ NVIDIA GeForce G210M/PCI/SSE2  NVIDIA GeForce G310M/PCI/SSE2                                                                            supported      2   NVIDIA G 310M  NVIDIA GeForce GT 120/PCI/SSE2                                                                           supported      2   NVIDIA GT 120M  NVIDIA GeForce GT 120/PCI/SSE2/3DNOW!                                                                    supported      2   NVIDIA GT 120M -NVIDIA GeForce GT 120M/PCI/SSE2                                                                          supported      2   NVIDIA GT 120M +NVIDIA GeForce GT 120M/PCI/SSE2                                                                          supported      1   NVIDIA G 120M  NVIDIA GeForce GT 130M/PCI/SSE2                                                                          supported      2   NVIDIA GT 130M  NVIDIA GeForce GT 140/PCI/SSE2                                                                           supported      2   NVIDIA GT 140M  NVIDIA GeForce GT 220/PCI/SSE2                                                                           supported      2   NVIDIA GT 220M @@ -1173,8 +1246,8 @@ NVIDIA GeForce GT 240  NVIDIA GeForce GT 240/PCI/SSE2                                                                           supported      2   NVIDIA GT 240M  NVIDIA GeForce GT 240/PCI/SSE2/3DNOW!                                                                    supported      2   NVIDIA GT 240M  NVIDIA GeForce GT 240M/PCI/SSE2                                                                          supported      2   NVIDIA GT 240M -NVIDIA GeForce GT 320/PCI/SSE2                                                                           supported      2   NVIDIA GT 320M -NVIDIA GeForce GT 320M/PCI/SSE2                                                                          supported      2   NVIDIA GT 320M +NVIDIA GeForce GT 320/PCI/SSE2                                                                           supported      2   NVIDIA G 320M +NVIDIA GeForce GT 320M/PCI/SSE2                                                                          supported      2   NVIDIA G 320M  NVIDIA GeForce GT 325M/PCI/SSE2                                                                          supported      0   NVIDIA GT 325M  NVIDIA GeForce GT 330/PCI/SSE2                                                                           supported      3   NVIDIA GT 330M  NVIDIA GeForce GT 330/PCI/SSE2/3DNOW!                                                                    supported      3   NVIDIA GT 330M @@ -1192,9 +1265,14 @@ NVIDIA GeForce GT 435M/PCI/SSE2  NVIDIA GeForce GT 440/PCI/SSE2                                                                           supported      3   NVIDIA GT 440M  NVIDIA GeForce GT 440/PCI/SSE2/3DNOW!                                                                    supported      3   NVIDIA GT 440M  NVIDIA GeForce GT 445M/PCI/SSE2                                                                          supported      3   NVIDIA GT 445M +NVIDIA GeForce GT 520/PCI/SSE2                                                                           supported      3   NVIDIA GT 520M +NVIDIA GeForce GT 520/PCI/SSE2/3DNOW!                                                                    supported      3   NVIDIA GT 520M  NVIDIA GeForce GT 520M/PCI/SSE2                                                                          supported      3   NVIDIA GT 520M -NVIDIA GeForce GT 525M/PCI/SSE2                                                                          supported      3   NVIDIA GT 525M +NVIDIA GeForce GT 525M/PCI/SSE2                                                                          supported      3   NVIDIA GT 520M +NVIDIA GeForce GT 530/PCI/SSE2                                                                           supported      3   NVIDIA GT 530M +NVIDIA GeForce GT 530/PCI/SSE2/3DNOW!                                                                    supported      3   NVIDIA GT 530M  NVIDIA GeForce GT 540M/PCI/SSE2                                                                          supported      3   NVIDIA GT 540M +NVIDIA GeForce GT 545/PCI/SSE2                                                                           supported      3   NVIDIA GT 540M  NVIDIA GeForce GT 550M/PCI/SSE2                                                                          supported      3   NVIDIA GT 550M  NVIDIA GeForce GT 555M/PCI/SSE2                                                                          supported      3   NVIDIA GT 555M  NVIDIA GeForce GTS 150/PCI/SSE2                                                                          supported      2   NVIDIA GT 150M @@ -1212,9 +1290,11 @@ NVIDIA GeForce GTX 260/PCI/SSE2  NVIDIA GeForce GTX 260/PCI/SSE2/3DNOW!                                                                   supported      3   NVIDIA GTX 260  NVIDIA GeForce GTX 260M/PCI/SSE2                                                                         supported      3   NVIDIA GTX 260  NVIDIA GeForce GTX 275/PCI/SSE2                                                                          supported      3   NVIDIA GTX 275 +NVIDIA GeForce GTX 275/PCI/SSE2/3DNOW!                                                                   supported      3   NVIDIA GTX 275  NVIDIA GeForce GTX 280                                                                                   supported      3   NVIDIA GTX 280  NVIDIA GeForce GTX 280/PCI/SSE2                                                                          supported      3   NVIDIA GTX 280  NVIDIA GeForce GTX 280M/PCI/SSE2                                                                         supported      3   NVIDIA GTX 280 +NVIDIA GeForce GTX 285                                                                                   supported      3   NVIDIA GTX 285  NVIDIA GeForce GTX 285/PCI/SSE2                                                                          supported      3   NVIDIA GTX 285  NVIDIA GeForce GTX 295/PCI/SSE2                                                                          supported      3   NVIDIA GTX 295  NVIDIA GeForce GTX 460 SE/PCI/SSE2                                                                       supported      3   NVIDIA GTX 460 @@ -1232,6 +1312,8 @@ NVIDIA GeForce GTX 550 Ti/PCI/SSE2/3DNOW!  NVIDIA GeForce GTX 560 Ti/PCI/SSE2                                                                       supported      3   NVIDIA GTX 560  NVIDIA GeForce GTX 560 Ti/PCI/SSE2/3DNOW!                                                                supported      3   NVIDIA GTX 560  NVIDIA GeForce GTX 560/PCI/SSE2                                                                          supported      3   NVIDIA GTX 560 +NVIDIA GeForce GTX 560/PCI/SSE2/3DNOW!                                                                   supported      3   NVIDIA GTX 560 +NVIDIA GeForce GTX 560M/PCI/SSE2                                                                         supported      3   NVIDIA GTX 560  NVIDIA GeForce GTX 570/PCI/SSE2                                                                          supported      3   NVIDIA GTX 570  NVIDIA GeForce GTX 570/PCI/SSE2/3DNOW!                                                                   supported      3   NVIDIA GTX 570  NVIDIA GeForce GTX 580/PCI/SSE2                                                                          supported      3   NVIDIA GTX 580 @@ -1239,13 +1321,13 @@ NVIDIA GeForce GTX 580/PCI/SSE2/3DNOW!  NVIDIA GeForce GTX 580M/PCI/SSE2                                                                         supported      3   NVIDIA GTX 580M  NVIDIA GeForce GTX 590/PCI/SSE2                                                                          supported      3   NVIDIA GTX 590  NVIDIA GeForce Go 6                                                                                      supported      1   NVIDIA GeForce Go 6 -NVIDIA GeForce Go 6100                                                                                   supported      0   NVIDIA GeForce Go 6100 -NVIDIA GeForce Go 6100/PCI/SSE2                                                                          supported      0   NVIDIA GeForce Go 6100 -NVIDIA GeForce Go 6100/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce Go 6100 +NVIDIA GeForce Go 6100                                                                                   supported      0   NVIDIA G100 +NVIDIA GeForce Go 6100/PCI/SSE2                                                                          supported      0   NVIDIA G100 +NVIDIA GeForce Go 6100/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA G100  NVIDIA GeForce Go 6150/PCI/SSE2                                                                          supported      0   NVIDIA GeForce Go 6100  NVIDIA GeForce Go 6150/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce Go 6100 -NVIDIA GeForce Go 6200                                                                                   supported      0   NVIDIA GeForce Go 6200 -NVIDIA GeForce Go 6200/PCI/SSE2                                                                          supported      0   NVIDIA GeForce Go 6200 +NVIDIA GeForce Go 6200                                                                                   supported      0   NVIDIA G 200 +NVIDIA GeForce Go 6200/PCI/SSE2                                                                          supported      0   NVIDIA G 200  NVIDIA GeForce Go 6400                                                                                   supported      1   NVIDIA GeForce Go 6400  NVIDIA GeForce Go 6400/PCI/SSE2                                                                          supported      1   NVIDIA GeForce Go 6400  NVIDIA GeForce Go 6600                                                                                   supported      1   NVIDIA GeForce Go 6600 @@ -1253,9 +1335,9 @@ NVIDIA GeForce Go 6600/PCI/SSE2  NVIDIA GeForce Go 6800                                                                                   supported      1   NVIDIA GeForce Go 6800  NVIDIA GeForce Go 6800 Ultra/PCI/SSE2                                                                    supported      1   NVIDIA GeForce Go 6800  NVIDIA GeForce Go 6800/PCI/SSE2                                                                          supported      1   NVIDIA GeForce Go 6800 -NVIDIA GeForce Go 7200                                                                                   supported      1   NVIDIA GeForce Go 7200 -NVIDIA GeForce Go 7200/PCI/SSE2                                                                          supported      1   NVIDIA GeForce Go 7200 -NVIDIA GeForce Go 7200/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce Go 7200 +NVIDIA GeForce Go 7200                                                                                   supported      0   NVIDIA G 200 +NVIDIA GeForce Go 7200/PCI/SSE2                                                                          supported      0   NVIDIA G 200 +NVIDIA GeForce Go 7200/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA G 200  NVIDIA GeForce Go 7300                                                                                   supported      1   NVIDIA GeForce Go 7300  NVIDIA GeForce Go 7300/PCI/SSE2                                                                          supported      1   NVIDIA GeForce Go 7300  NVIDIA GeForce Go 7300/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce Go 7300 @@ -1266,6 +1348,7 @@ NVIDIA GeForce Go 7600  NVIDIA GeForce Go 7600/PCI/SSE2                                                                          supported      2   NVIDIA GeForce Go 7600  NVIDIA GeForce Go 7600/PCI/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce Go 7600  NVIDIA GeForce Go 7700                                                                                   supported      2   NVIDIA GeForce Go 7700 +NVIDIA GeForce Go 7700/PCI/SSE2                                                                          supported      2   NVIDIA GeForce Go 7700  NVIDIA GeForce Go 7800                                                                                   supported      2   NVIDIA GeForce Go 7800  NVIDIA GeForce Go 7800 GTX/PCI/SSE2                                                                      supported      2   NVIDIA GeForce Go 7800  NVIDIA GeForce Go 7900                                                                                   supported      2   NVIDIA GeForce Go 7900 @@ -1283,7 +1366,9 @@ NVIDIA GeForce3/AGP/SSE2  NVIDIA GeForce4 420 Go 32M/AGP/SSE2                                                                      supported      0   NVIDIA GeForce 4  NVIDIA GeForce4 420 Go 32M/AGP/SSE2/3DNOW!                                                               supported      0   NVIDIA GeForce 4  NVIDIA GeForce4 420 Go 32M/PCI/SSE2/3DNOW!                                                               supported      0   NVIDIA GeForce 4 +NVIDIA GeForce4 420 Go/AGP/SSE2                                                                          supported      0   NVIDIA GeForce 4  NVIDIA GeForce4 440 Go 64M/AGP/SSE2/3DNOW!                                                               supported      0   NVIDIA GeForce 4 +NVIDIA GeForce4 440 Go/AGP/SSE2                                                                          supported      0   NVIDIA GeForce 4  NVIDIA GeForce4 460 Go/AGP/SSE2                                                                          supported      0   NVIDIA GeForce 4  NVIDIA GeForce4 MX 4000/AGP/SSE/3DNOW!                                                                   supported      0   NVIDIA GeForce 4  NVIDIA GeForce4 MX 4000/AGP/SSE2                                                                         supported      0   NVIDIA GeForce 4 @@ -1297,42 +1382,47 @@ NVIDIA GeForce4 MX 440/AGP/SSE2  NVIDIA GeForce4 MX 440/AGP/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce 4  NVIDIA GeForce4 MX 440SE with AGP8X/AGP/SSE2                                                             supported      0   NVIDIA GeForce 4  NVIDIA GeForce4 MX Integrated GPU/AGP/SSE/3DNOW!                                                         supported      0   NVIDIA GeForce 4 -NVIDIA GeForce4 Ti 4200 with AGP8X/AGP/SSE                                                               supported      0   NVIDIA GeForce 4 -NVIDIA GeForce4 Ti 4200/AGP/SSE/3DNOW!                                                                   supported      0   NVIDIA GeForce 4 +NVIDIA GeForce4 Ti 4200 with AGP8X/AGP/SSE                                                               supported      0   NVIDIA G 200 +NVIDIA GeForce4 Ti 4200/AGP/SSE/3DNOW!                                                                   supported      0   NVIDIA G 200  NVIDIA GeForce4 Ti 4400/AGP/SSE2                                                                         supported      0   NVIDIA GeForce 4 -NVIDIA Generic                                                                                                              UNRECOGNIZED +NVIDIA Generic                                                                                                              NO MATCH  NVIDIA ION LE/PCI/SSE2                                                                                   supported      2   NVIDIA ION  NVIDIA ION/PCI/SSE2                                                                                      supported      2   NVIDIA ION  NVIDIA ION/PCI/SSE2/3DNOW!                                                                               supported      2   NVIDIA ION -NVIDIA MCP61/PCI/SSE2                                                                                                       UNRECOGNIZED -NVIDIA MCP61/PCI/SSE2/3DNOW!                                                                                                UNRECOGNIZED -NVIDIA MCP73/PCI/SSE2                                                                                                       UNRECOGNIZED -NVIDIA MCP79MH/PCI/SSE2                                                                                                     UNRECOGNIZED -NVIDIA MCP79MX/PCI/SSE2                                                                                                     UNRECOGNIZED -NVIDIA MCP7A-O/PCI/SSE2                                                                                                     UNRECOGNIZED -NVIDIA MCP7A-S/PCI/SSE2                                                                                                     UNRECOGNIZED -NVIDIA MCP89-EPT/PCI/SSE2                                                                                                   UNRECOGNIZED -NVIDIA N10M-GE1/PCI/SSE2                                                                                                    UNRECOGNIZED -NVIDIA N10P-GE1/PCI/SSE2                                                                                                    UNRECOGNIZED -NVIDIA N10P-GV2/PCI/SSE2                                                                                                    UNRECOGNIZED -NVIDIA N11M-GE1/PCI/SSE2                                                                                                    UNRECOGNIZED -NVIDIA N11M-GE2/PCI/SSE2                                                                                                    UNRECOGNIZED -NVIDIA N12E-GS-A1/PCI/SSE2                                                                                                  UNRECOGNIZED -NVIDIA NB9M-GE/PCI/SSE2                                                                                                     UNRECOGNIZED -NVIDIA NB9M-GE1/PCI/SSE2                                                                                                    UNRECOGNIZED -NVIDIA NB9M-GS/PCI/SSE2                                                                                                     UNRECOGNIZED -NVIDIA NB9M-NS/PCI/SSE2                                                                                                     UNRECOGNIZED -NVIDIA NB9P-GE1/PCI/SSE2                                                                                                    UNRECOGNIZED -NVIDIA NB9P-GS/PCI/SSE2                                                                                                     UNRECOGNIZED -NVIDIA NV17/AGP/3DNOW!                                                                                                      UNRECOGNIZED -NVIDIA NV17/AGP/SSE2                                                                                                        UNRECOGNIZED +NVIDIA MCP61/PCI/SSE2                                                                                    supported      1   NVIDIA MCP61 +NVIDIA MCP61/PCI/SSE2/3DNOW!                                                                             supported      1   NVIDIA MCP61 +NVIDIA MCP73/PCI/SSE2                                                                                    supported      1   NVIDIA MCP73 +NVIDIA MCP79MH/PCI/SSE2                                                                                  supported      1   NVIDIA MCP79 +NVIDIA MCP79MX/PCI/SSE2                                                                                  supported      1   NVIDIA MCP79 +NVIDIA MCP7A-O/PCI/SSE2                                                                                  supported      1   NVIDIA MCP7A +NVIDIA MCP7A-S/PCI/SSE2                                                                                  supported      1   NVIDIA MCP7A +NVIDIA MCP89-EPT/PCI/SSE2                                                                                                   NO MATCH +NVIDIA N10M-GE1/PCI/SSE2                                                                                 supported      1   NVIDIA N10 +NVIDIA N10P-GE1/PCI/SSE2                                                                                 supported      1   NVIDIA N10 +NVIDIA N10P-GV2/PCI/SSE2                                                                                 supported      1   NVIDIA N10 +NVIDIA N11M-GE1/PCI/SSE2                                                                                                    NO MATCH +NVIDIA N11M-GE2/PCI/SSE2                                                                                                    NO MATCH +NVIDIA N12E-GS-A1/PCI/SSE2                                                                                                  NO MATCH +NVIDIA N12P-GVR-B-A1/PCI/SSE2                                                                                               NO MATCH +NVIDIA N13M-GE1-B-A1/PCI/SSE2                                                                                               NO MATCH +NVIDIA N13P-GL-A1/PCI/SSE2                                                                                                  NO MATCH +NVIDIA NB9M-GE/PCI/SSE2                                                                                  supported      1   NVIDIA NB9M +NVIDIA NB9M-GE1/PCI/SSE2                                                                                 supported      1   NVIDIA NB9M +NVIDIA NB9M-GS/PCI/SSE2                                                                                  supported      1   NVIDIA NB9M +NVIDIA NB9M-NS/PCI/SSE2                                                                                  supported      1   NVIDIA NB9M +NVIDIA NB9P-GE1/PCI/SSE2                                                                                 supported      2   NVIDIA NB9P +NVIDIA NB9P-GS/PCI/SSE2                                                                                  supported      2   NVIDIA NB9P +NVIDIA NV17/AGP/3DNOW!                                                                                   supported      0   NVIDIA NV17 +NVIDIA NV17/AGP/SSE2                                                                                     supported      0   NVIDIA NV17  NVIDIA NV34                                                                                              supported      0   NVIDIA NV34  NVIDIA NV35                                                                                              supported      0   NVIDIA NV35 -NVIDIA NV36/AGP/SSE/3DNOW!                                                                                                  UNRECOGNIZED -NVIDIA NV36/AGP/SSE2                                                                                                        UNRECOGNIZED -NVIDIA NV41/PCI/SSE2                                                                                                        UNRECOGNIZED +NVIDIA NV36/AGP/SSE/3DNOW!                                                                               supported      1   NVIDIA NV36 +NVIDIA NV36/AGP/SSE2                                                                                     supported      1   NVIDIA NV36 +NVIDIA NV41/PCI/SSE2                                                                                     supported      1   NVIDIA NV41  NVIDIA NV43                                                                                              supported      1   NVIDIA NV43 +NVIDIA NV43/PCI/SSE2                                                                                     supported      1   NVIDIA NV43  NVIDIA NV44                                                                                              supported      1   NVIDIA NV44 +NVIDIA NV44/AGP/SSE2                                                                                     supported      1   NVIDIA NV44  NVIDIA NVIDIA GeForce 210 OpenGL Engine                                                                  supported      2   NVIDIA 210  NVIDIA NVIDIA GeForce 320M OpenGL Engine                                                                 supported      2   NVIDIA 320M  NVIDIA NVIDIA GeForce 7300 GT OpenGL Engine                                                              supported      1   NVIDIA GeForce 7300 @@ -1364,22 +1454,28 @@ NVIDIA NVIDIA GeForce GTX 460M OpenGL Engine  NVIDIA NVIDIA GeForce GTX 465 OpenGL Engine                                                              supported      3   NVIDIA GTX 465  NVIDIA NVIDIA GeForce GTX 470 OpenGL Engine                                                              supported      3   NVIDIA GTX 470  NVIDIA NVIDIA GeForce GTX 480 OpenGL Engine                                                              supported      3   NVIDIA GTX 480 -NVIDIA NVIDIA GeForce Pre-Release ION OpenGL Engine                                                                         UNRECOGNIZED +NVIDIA NVIDIA GeForce Pre-Release GF108 ES OpenGL Engine                                                                    NO MATCH +NVIDIA NVIDIA GeForce Pre-Release ION OpenGL Engine                                                      supported      2   NVIDIA ION +NVIDIA NVIDIA GeForce Pre-Release MCP7A-J-DC OpenGL Engine                                               supported      1   NVIDIA MCP7A  NVIDIA NVIDIA GeForce4 OpenGL Engine                                                                     supported      0   NVIDIA GeForce 4  NVIDIA NVIDIA NV34MAP OpenGL Engine                                                                      supported      0   NVIDIA NV34  NVIDIA NVIDIA Quadro 4000 OpenGL Engine                                                                  supported      3   NVIDIA Quadro 4000  NVIDIA NVIDIA Quadro FX 4800 OpenGL Engine                                                               supported      3   NVIDIA Quadro FX 4800 -NVIDIA NVS 2100M/PCI/SSE2                                                                                supported      2   NVIDIA Quadro NVS 2100M +NVIDIA NVS 2100M/PCI/SSE2                                                                                supported      0   NVIDIA G100M  NVIDIA NVS 300/PCI/SSE2                                                                                  supported      0   NVIDIA Quadro NVS -NVIDIA NVS 3100M/PCI/SSE2                                                                                supported      2   NVIDIA Quadro NVS 3100M -NVIDIA NVS 4100/PCI/SSE2/3DNOW!                                                                          supported      0   NVIDIA Quadro NVS -NVIDIA NVS 4200M/PCI/SSE2                                                                                supported      2   NVIDIA Quadro NVS 4200M -NVIDIA NVS 5100M/PCI/SSE2                                                                                supported      2   NVIDIA Quadro NVS 5100M -NVIDIA PCI                                                                                                                  UNRECOGNIZED -NVIDIA Quadro 2000/PCI/SSE2                                                                              supported      3   NVIDIA Quadro 2000 M/D +NVIDIA NVS 3100M/PCI/SSE2                                                                                supported      0   NVIDIA G100M +NVIDIA NVS 4100/PCI/SSE2/3DNOW!                                                                          supported      0   NVIDIA G100 +NVIDIA NVS 4200M/PCI/SSE2                                                                                supported      0   NVIDIA G 200 +NVIDIA NVS 5100M/PCI/SSE2                                                                                supported      0   NVIDIA G100M +NVIDIA PCI                                                                                                                  NO MATCH +NVIDIA Quadro 1000M/PCI/SSE2                                                                             supported      0   NVIDIA G100 +NVIDIA Quadro 2000/PCI/SSE2                                                                              supported      0   NVIDIA G 200 +NVIDIA Quadro 2000M/PCI/SSE2                                                                             supported      0   NVIDIA G 200 +NVIDIA Quadro 3000M/PCI/SSE2                                                                             supported      3   NVIDIA Quadro 3000M  NVIDIA Quadro 4000                                                                                       supported      3   NVIDIA Quadro 4000  NVIDIA Quadro 4000 OpenGL Engine                                                                         supported      3   NVIDIA Quadro 4000  NVIDIA Quadro 4000/PCI/SSE2                                                                              supported      3   NVIDIA Quadro 4000 +NVIDIA Quadro 4000M/PCI/SSE2                                                                             supported      3   NVIDIA Quadro 4000M  NVIDIA Quadro 5000/PCI/SSE2                                                                              supported      3   NVIDIA Quadro 50x0 M  NVIDIA Quadro 5000M/PCI/SSE2                                                                             supported      3   NVIDIA Quadro 50x0 M  NVIDIA Quadro 600                                                                                        supported      2   NVIDIA Quadro 600 @@ -1387,12 +1483,13 @@ NVIDIA Quadro 600/PCI/SSE2  NVIDIA Quadro 600/PCI/SSE2/3DNOW!                                                                        supported      2   NVIDIA Quadro 600  NVIDIA Quadro 6000                                                                                       supported      3   NVIDIA Quadro 6000  NVIDIA Quadro 6000/PCI/SSE2                                                                              supported      3   NVIDIA Quadro 6000 -NVIDIA Quadro CX/PCI/SSE2                                                                                                   UNRECOGNIZED +NVIDIA Quadro CX/PCI/SSE2                                                                                supported      3   NVIDIA Quadro CX  NVIDIA Quadro DCC                                                                                        supported      0   NVIDIA Quadro DCC  NVIDIA Quadro FX                                                                                         supported      1   NVIDIA Quadro FX -NVIDIA Quadro FX 1100/AGP/SSE2                                                                           supported      1   NVIDIA Quadro FX +NVIDIA Quadro FX 1100/AGP/SSE2                                                                           supported      0   NVIDIA G100  NVIDIA Quadro FX 1400/PCI/SSE2                                                                           supported      2   NVIDIA Quadro 400  NVIDIA Quadro FX 1500                                                                                    supported      1   NVIDIA Quadro FX +NVIDIA Quadro FX 1500/PCI/SSE2                                                                           supported      1   NVIDIA Quadro FX  NVIDIA Quadro FX 1500M/PCI/SSE2                                                                          supported      1   NVIDIA Quadro FX 1500M  NVIDIA Quadro FX 1600M/PCI/SSE2                                                                          supported      2   NVIDIA Quadro 600  NVIDIA Quadro FX 1700                                                                                    supported      1   NVIDIA Quadro FX @@ -1420,7 +1517,9 @@ NVIDIA Quadro FX 4500  NVIDIA Quadro FX 4600                                                                                    supported      2   NVIDIA Quadro 600  NVIDIA Quadro FX 4800                                                                                    supported      3   NVIDIA Quadro FX 4800  NVIDIA Quadro FX 4800/PCI/SSE2                                                                           supported      3   NVIDIA Quadro FX 4800 +NVIDIA Quadro FX 540/PCI/SSE2/3DNOW!                                                                     supported      1   NVIDIA Quadro FX  NVIDIA Quadro FX 560                                                                                     supported      1   NVIDIA Quadro FX +NVIDIA Quadro FX 560/PCI/SSE2                                                                            supported      1   NVIDIA Quadro FX  NVIDIA Quadro FX 5600                                                                                    supported      2   NVIDIA Quadro 600  NVIDIA Quadro FX 570                                                                                     supported      1   NVIDIA Quadro FX  NVIDIA Quadro FX 570/PCI/SSE2                                                                            supported      1   NVIDIA Quadro FX @@ -1431,57 +1530,73 @@ NVIDIA Quadro FX 880M  NVIDIA Quadro FX 880M/PCI/SSE2                                                                           supported      3   NVIDIA Quadro FX 880M  NVIDIA Quadro FX Go700/AGP/SSE2                                                                          supported      1   NVIDIA Quadro FX  NVIDIA Quadro NVS                                                                                        supported      0   NVIDIA Quadro NVS -NVIDIA Quadro NVS 110M/PCI/SSE2                                                                          supported      0   NVIDIA Quadro NVS 1xxM +NVIDIA Quadro NVS 110M/PCI/SSE2                                                                          supported      0   NVIDIA G 110M  NVIDIA Quadro NVS 130M/PCI/SSE2                                                                          supported      0   NVIDIA Quadro NVS 1xxM  NVIDIA Quadro NVS 135M/PCI/SSE2                                                                          supported      0   NVIDIA Quadro NVS 1xxM  NVIDIA Quadro NVS 140M/PCI/SSE2                                                                          supported      0   NVIDIA Quadro NVS 1xxM  NVIDIA Quadro NVS 150M/PCI/SSE2                                                                          supported      0   NVIDIA Quadro NVS 1xxM  NVIDIA Quadro NVS 160M/PCI/SSE2                                                                          supported      0   NVIDIA Quadro NVS 1xxM -NVIDIA Quadro NVS 210S/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA Quadro NVS +NVIDIA Quadro NVS 210S/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA G 210  NVIDIA Quadro NVS 285/PCI/SSE2                                                                           supported      0   NVIDIA Quadro NVS  NVIDIA Quadro NVS 290/PCI/SSE2                                                                           supported      0   NVIDIA Quadro NVS  NVIDIA Quadro NVS 295/PCI/SSE2                                                                           supported      0   NVIDIA Quadro NVS -NVIDIA Quadro NVS 320M/PCI/SSE2                                                                          supported      2   NVIDIA Quadro NVS 320M +NVIDIA Quadro NVS 320M/PCI/SSE2                                                                          supported      2   NVIDIA G 320M  NVIDIA Quadro NVS 55/280 PCI/PCI/SSE2                                                                    supported      0   NVIDIA Quadro NVS  NVIDIA Quadro NVS/PCI/SSE2                                                                               supported      0   NVIDIA Quadro NVS -NVIDIA Quadro PCI-E Series/PCI/SSE2/3DNOW!                                                                                  UNRECOGNIZED -NVIDIA Quadro VX 200/PCI/SSE2                                                                                               UNRECOGNIZED -NVIDIA Quadro/AGP/SSE2                                                                                                      UNRECOGNIZED +NVIDIA Quadro PCI-E Series/PCI/SSE2/3DNOW!                                                                                  NO MATCH +NVIDIA Quadro VX 200/PCI/SSE2                                                                            supported      0   NVIDIA G 200 +NVIDIA Quadro/AGP/SSE2                                                                                                      NO MATCH  NVIDIA Quadro2                                                                                           supported      0   NVIDIA Quadro2  NVIDIA Quadro4                                                                                           supported      0   NVIDIA Quadro4 +NVIDIA Quadro4 750 XGL/AGP/SSE2                                                                          supported      0   NVIDIA Quadro4  NVIDIA RIVA TNT                                                                                          unsupported    0   NVIDIA RIVA TNT  NVIDIA RIVA TNT2/AGP/SSE2                                                                                unsupported    0   NVIDIA RIVA TNT  NVIDIA RIVA TNT2/PCI/3DNOW!                                                                              unsupported    0   NVIDIA RIVA TNT +NVIDIA Tesla C2050/PCI/SSE2                                                                              supported      0   NVIDIA G 205M  NVIDIA nForce                                                                                            unsupported    0   NVIDIA nForce -NVIDIA unknown board/AGP/SSE2                                                                                               UNRECOGNIZED -NVIDIA unknown board/PCI/SSE2                                                                                               UNRECOGNIZED -NVIDIA unknown board/PCI/SSE2/3DNOW!                                                                                        UNRECOGNIZED +NVIDIA nForce 730a/PCI/SSE2                                                                              unsupported    0   NVIDIA nForce +NVIDIA nForce 730a/PCI/SSE2/3DNOW!                                                                       unsupported    0   NVIDIA nForce +NVIDIA nForce 750a SLI/PCI/SSE2                                                                          unsupported    0   NVIDIA nForce +NVIDIA nForce 750a SLI/PCI/SSE2/3DNOW!                                                                   unsupported    0   NVIDIA nForce +NVIDIA nForce 760i SLI/PCI/SSE2                                                                          unsupported    0   NVIDIA nForce +NVIDIA nForce 780a SLI/PCI/SSE2/3DNOW!                                                                   unsupported    0   NVIDIA nForce +NVIDIA nForce 980a/780a SLI/PCI/SSE2                                                                     unsupported    0   NVIDIA nForce +NVIDIA nForce 980a/780a SLI/PCI/SSE2/3DNOW!                                                              unsupported    0   NVIDIA nForce +NVIDIA unknown board/AGP/SSE2                                                                            unsupported    0   NVIDIA Generic +NVIDIA unknown board/PCI/SSE2                                                                            unsupported    0   NVIDIA Generic +NVIDIA unknown board/PCI/SSE2/3DNOW!                                                                     unsupported    0   NVIDIA Generic  Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine                     supported      3   ATI Radeon HD 5600  Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine                     supported      3   ATI Radeon HD 5700  Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine                     supported      3   ATI Radeon HD 5700  Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6490M OpenGL Engine                    supported      3   ATI Radeon HD 6400  Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine                    supported      3   ATI Radeon HD 6700 -Parallels and Intel Inc. 3D-Analyze v2.3 - http://www.tommti-systems.com                                                    UNRECOGNIZED +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6770M OpenGL Engine                    supported      3   ATI Radeon HD 6700 +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine                    supported      3   ATI Radeon HD 6900 +Parallels and Intel Inc. 3D-Analyze v2.3 - http://www.tommti-systems.com                                                    NO MATCH  Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine                            supported      2   Intel HD Graphics  Parallels and NVIDIA Parallels using NVIDIA GeForce 320M OpenGL Engine                                   supported      2   NVIDIA 320M  Parallels and NVIDIA Parallels using NVIDIA GeForce 9400 OpenGL Engine                                   supported      1   NVIDIA GeForce 9400  Parallels and NVIDIA Parallels using NVIDIA GeForce GT 120 OpenGL Engine                                 supported      2   NVIDIA GT 120M  Parallels and NVIDIA Parallels using NVIDIA GeForce GT 330M OpenGL Engine                                supported      3   NVIDIA GT 330M  Radeon RV350 on Gallium                                                                                  supported      0   ATI RV350 (9600) -S3                                                                                                                          UNRECOGNIZED +S3                                                                                                                          NO MATCH +S3 Fire GL2                                                                                                                 NO MATCH  S3 Graphics VIA/S3G UniChrome IGP/MMX/K3D                                                                unsupported    0   S3 +S3 Graphics VIA/S3G UniChrome IGP/MMX/SSE                                                                unsupported    0   S3  S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE                                                            unsupported    0   S3  S3 Graphics, Incorporated ProSavage/Twister                                                              unsupported    0   S3  S3 Graphics, Incorporated S3 Graphics Chrome9 HC                                                         unsupported    0   S3  S3 Graphics, Incorporated S3 Graphics DeltaChrome                                                        unsupported    0   S3  S3 Graphics, Incorporated VIA Chrome9 HC IGP                                                             unsupported    0   S3  SiS                                                                                                      unsupported    0   SiS +SiS 650/M650 VGA                                                                                         unsupported    0   SiS  SiS 661 VGA                                                                                              unsupported    0   SiS  SiS 662 VGA                                                                                              unsupported    0   SiS  SiS 741 VGA                                                                                              unsupported    0   SiS  SiS 760 VGA                                                                                              unsupported    0   SiS  SiS 761GX VGA                                                                                            unsupported    0   SiS  SiS Mirage Graphics3                                                                                     unsupported    0   SiS +SiS Xabre VGA                                                                                            unsupported    0   SiS  Trident                                                                                                  unsupported    0   Trident  Tungsten Graphics                                                                                        unsupported    0   Tungsten Graphics  Tungsten Graphics, Inc Mesa DRI 865G GEM 20091221 2009Q4 x86/MMX/SSE2                                    unsupported    0   Mesa @@ -1520,22 +1635,27 @@ Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI IGDNG_D GEM 20091221 2009Q4 x86/MMX/SSE2                                 unsupported    0   Mesa  Tungsten Graphics, Inc Mesa DRI Ironlake Desktop GEM 20100330 DEVELOPMENT x86/MMX/SSE2                   unsupported    0   Mesa  Tungsten Graphics, Inc Mesa DRI Ironlake Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2                    unsupported    0   Mesa +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset                                      unsupported    0   Mesa  Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset 20080716 x86/MMX/SSE2                unsupported    0   Mesa  Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20090712 2009Q2 RC3 x86/MMX...   unsupported    0   Mesa  Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2     unsupported    0   Mesa  Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100328 2010Q1                  unsupported    0   Mesa  Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT             unsupported    0   Mesa  Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MM...   unsupported    0   Mesa +Tungsten Graphics, Inc. Mesa DRI R200 (RV250 4C66) 20090101 x86/MMX/SSE2 TCL DRI2                        unsupported    0   Mesa  Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5964) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2               unsupported    0   Mesa  VIA                                                                                                      unsupported    0   VIA -VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE;                                                                         UNRECOGNIZED -VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM)                                                                           UNRECOGNIZED -VMware, Inc. Gallium 0.4 on llvmpipe                                                                                        UNRECOGNIZED -VMware, Inc. Gallium 0.4 on softpipe                                                                                        UNRECOGNIZED +VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE;                                                                         NO MATCH +VMware, Inc. Gallium 0.4 on SVGA3D; build: DEBUG; mutex: MSVC Intrinsics                                                    NO MATCH +VMware, Inc. Gallium 0.4 on SVGA3D; build: RELEASE;                                                                         NO MATCH +VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM)                                                                           NO MATCH +VMware, Inc. Gallium 0.4 on llvmpipe                                                                                        NO MATCH +VMware, Inc. Gallium 0.4 on softpipe                                                                                        NO MATCH  X.Org Gallium 0.4 on AMD BARTS                                                                           supported      3   AMD BARTS (HD 6800)  X.Org Gallium 0.4 on AMD CEDAR                                                                           supported      2   AMD CEDAR (HD 5450)  X.Org Gallium 0.4 on AMD HEMLOCK                                                                         supported      3   AMD HEMLOCK (HD 5970)  X.Org Gallium 0.4 on AMD JUNIPER                                                                         supported      3   AMD JUNIPER (HD 5700) +X.Org Gallium 0.4 on AMD PALM                                                                                               NO MATCH  X.Org Gallium 0.4 on AMD REDWOOD                                                                         supported      3   AMD REDWOOD (HD 5500/5600)  X.Org Gallium 0.4 on AMD RS780                                                                           supported      0   AMD RS780 (HD 3200)  X.Org Gallium 0.4 on AMD RS880                                                                           supported      1   AMD RS880 (HD 4200) @@ -1548,16 +1668,21 @@ X.Org Gallium 0.4 on AMD RV730  X.Org Gallium 0.4 on AMD RV740                                                                           supported      3   AMD RV740 (HD 4700)  X.Org Gallium 0.4 on AMD RV770                                                                           supported      3   AMD RV770 (HD 4800)  X.Org R300 Project Gallium 0.4 on ATI R300                                                               supported      1   ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on ATI R350                                                               supported      1   ATI R350 (9800) +X.Org R300 Project Gallium 0.4 on ATI R420                                                               supported      1   ATI R300 (9700)  X.Org R300 Project Gallium 0.4 on ATI R580                                                               supported      3   ATI R580 (X1900)  X.Org R300 Project Gallium 0.4 on ATI RC410                                                              unsupported    0   ATI RC410 (Xpress 200) +X.Org R300 Project Gallium 0.4 on ATI RS480                                                              unsupported    0   ATI RS48x (Xpress 200x)  X.Org R300 Project Gallium 0.4 on ATI RS482                                                              unsupported    0   ATI RS48x (Xpress 200x)  X.Org R300 Project Gallium 0.4 on ATI RS600                                                              unsupported    0   ATI RS600 (Xpress 3200)  X.Org R300 Project Gallium 0.4 on ATI RS690                                                              supported      1   ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on ATI RS740                                                              supported      1   ATI R300 (9700)  X.Org R300 Project Gallium 0.4 on ATI RV350                                                              supported      0   ATI RV350 (9600)  X.Org R300 Project Gallium 0.4 on ATI RV370                                                              supported      0   ATI RV370 (X300)  X.Org R300 Project Gallium 0.4 on ATI RV410                                                              supported      1   ATI RV410 (X700)  X.Org R300 Project Gallium 0.4 on ATI RV515                                                              supported      1   ATI RV515  X.Org R300 Project Gallium 0.4 on ATI RV530                                                              supported      1   ATI RV530 +X.Org R300 Project Gallium 0.4 on ATI RV560                                                              supported      1   ATI R300 (9700)  X.Org R300 Project Gallium 0.4 on ATI RV570                                                              supported      3   ATI RV570 (X1900 GT/PRO)  X.Org R300 Project Gallium 0.4 on R420                                                                   supported      1   ATI R300 (9700)  X.Org R300 Project Gallium 0.4 on R580                                                                   supported      3   ATI R580 (X1900) @@ -1573,23 +1698,29 @@ X.Org R300 Project Gallium 0.4 on RV410  X.Org R300 Project Gallium 0.4 on RV515                                                                  supported      1   ATI RV515  X.Org R300 Project Gallium 0.4 on RV530                                                                  supported      1   ATI RV530  XGI                                                                                                      unsupported    0   XGI -nouveau Gallium 0.4 on NV34                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NV36                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NV46                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NV49                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NV4A                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NV4B                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NV4E                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NV50                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NV84                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NV86                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NV92                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NV94                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NV96                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NV98                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NVA0                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NVA3                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NVA5                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NVA8                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NVAA                                                                                                 UNRECOGNIZED -nouveau Gallium 0.4 on NVAC                                                                                                 UNRECOGNIZED +nouveau Gallium 0.4 on NV31                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV34                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV36                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV43                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV44                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV46                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV49                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV4A                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV4B                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV4C                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV4E                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV50                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV63                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV67                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV84                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV86                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV92                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV94                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV96                                                                                                 NO MATCH +nouveau Gallium 0.4 on NV98                                                                                                 NO MATCH +nouveau Gallium 0.4 on NVA0                                                                                                 NO MATCH +nouveau Gallium 0.4 on NVA3                                                                                                 NO MATCH +nouveau Gallium 0.4 on NVA5                                                                                                 NO MATCH +nouveau Gallium 0.4 on NVA8                                                                                                 NO MATCH +nouveau Gallium 0.4 on NVAA                                                                                                 NO MATCH +nouveau Gallium 0.4 on NVAC                                                                                                 NO MATCH diff --git a/indra/newview/tests/gpus_seen.txt b/indra/newview/tests/gpus_seen.txt index c807f22b58..570f92a9b0 100644 --- a/indra/newview/tests/gpus_seen.txt +++ b/indra/newview/tests/gpus_seen.txt @@ -135,94 +135,183 @@ ATI Rage 128  ATI Technologies Inc.  ATI Technologies Inc.  x86  ATI Technologies Inc.  x86/SSE2 +ATI Technologies Inc.  x86/SSE2  ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5730 +ATI Technologies Inc. 128MB ATI Radeon X1300 x86/SSE2  ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2  ATI Technologies Inc. AMD 760G +ATI Technologies Inc. AMD 760G  ATI Technologies Inc. AMD 760G (Microsoft WDDM 1.1)  ATI Technologies Inc. AMD 780L  ATI Technologies Inc. AMD FirePro 2270  ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100 +ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100  ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 +ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 +ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250  ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250 +ATI Technologies Inc. AMD RADEON HD 6350 +ATI Technologies Inc. AMD RADEON HD 6450  ATI Technologies Inc. AMD RADEON HD 6450 +ATI Technologies Inc. AMD RADEON HD 6670 +ATI Technologies Inc. AMD Radeon 6600M and 6700M Series  ATI Technologies Inc. AMD Radeon HD 6200 series Graphics +ATI Technologies Inc. AMD Radeon HD 6200 series Graphics +ATI Technologies Inc. AMD Radeon HD 6250 Graphics  ATI Technologies Inc. AMD Radeon HD 6250 Graphics +ATI Technologies Inc. AMD Radeon HD 6290 Graphics +ATI Technologies Inc. AMD Radeon HD 6300 series Graphics  ATI Technologies Inc. AMD Radeon HD 6300 series Graphics  ATI Technologies Inc. AMD Radeon HD 6300M Series +ATI Technologies Inc. AMD Radeon HD 6300M Series +ATI Technologies Inc. AMD Radeon HD 6310 Graphics  ATI Technologies Inc. AMD Radeon HD 6310 Graphics  ATI Technologies Inc. AMD Radeon HD 6310M +ATI Technologies Inc. AMD Radeon HD 6310M +ATI Technologies Inc. AMD Radeon HD 6330M  ATI Technologies Inc. AMD Radeon HD 6330M  ATI Technologies Inc. AMD Radeon HD 6350  ATI Technologies Inc. AMD Radeon HD 6370M +ATI Technologies Inc. AMD Radeon HD 6370M  ATI Technologies Inc. AMD Radeon HD 6400M Series +ATI Technologies Inc. AMD Radeon HD 6400M Series +ATI Technologies Inc. AMD Radeon HD 6450  ATI Technologies Inc. AMD Radeon HD 6450  ATI Technologies Inc. AMD Radeon HD 6470M +ATI Technologies Inc. AMD Radeon HD 6470M  ATI Technologies Inc. AMD Radeon HD 6490M +ATI Technologies Inc. AMD Radeon HD 6490M +ATI Technologies Inc. AMD Radeon HD 6500 Series +ATI Technologies Inc. AMD Radeon HD 6500M Series +ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series  ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series  ATI Technologies Inc. AMD Radeon HD 6530M +ATI Technologies Inc. AMD Radeon HD 6530M  ATI Technologies Inc. AMD Radeon HD 6550M +ATI Technologies Inc. AMD Radeon HD 6550M +ATI Technologies Inc. AMD Radeon HD 6570  ATI Technologies Inc. AMD Radeon HD 6570  ATI Technologies Inc. AMD Radeon HD 6570M +ATI Technologies Inc. AMD Radeon HD 6570M +ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series  ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series +ATI Technologies Inc. AMD Radeon HD 6600 Series  ATI Technologies Inc. AMD Radeon HD 6600M Series +ATI Technologies Inc. AMD Radeon HD 6630M +ATI Technologies Inc. AMD Radeon HD 6650M  ATI Technologies Inc. AMD Radeon HD 6650M  ATI Technologies Inc. AMD Radeon HD 6670 +ATI Technologies Inc. AMD Radeon HD 6670 +ATI Technologies Inc. AMD Radeon HD 6700 Series  ATI Technologies Inc. AMD Radeon HD 6700 Series  ATI Technologies Inc. AMD Radeon HD 6750 +ATI Technologies Inc. AMD Radeon HD 6750  ATI Technologies Inc. AMD Radeon HD 6750M +ATI Technologies Inc. AMD Radeon HD 6750M +ATI Technologies Inc. AMD Radeon HD 6770  ATI Technologies Inc. AMD Radeon HD 6770 +ATI Technologies Inc. AMD Radeon HD 6770M +ATI Technologies Inc. AMD Radeon HD 6800 Series  ATI Technologies Inc. AMD Radeon HD 6800 Series +ATI Technologies Inc. AMD Radeon HD 6800M Series +ATI Technologies Inc. AMD Radeon HD 6850  ATI Technologies Inc. AMD Radeon HD 6850M +ATI Technologies Inc. AMD Radeon HD 6850M +ATI Technologies Inc. AMD Radeon HD 6870  ATI Technologies Inc. AMD Radeon HD 6870  ATI Technologies Inc. AMD Radeon HD 6870M +ATI Technologies Inc. AMD Radeon HD 6870M +ATI Technologies Inc. AMD Radeon HD 6900 Series  ATI Technologies Inc. AMD Radeon HD 6900 Series +ATI Technologies Inc. AMD Radeon HD 6900M Series +ATI Technologies Inc. AMD Radeon HD 6970M  ATI Technologies Inc. AMD Radeon HD 6970M  ATI Technologies Inc. AMD Radeon HD 6990 +ATI Technologies Inc. AMD Radeon HD 6990 +ATI Technologies Inc. AMD Radeon(TM) HD 6470M +ATI Technologies Inc. AMD Radeon(TM) HD 6470M  ATI Technologies Inc. AMD Radeon(TM) HD 6470M +ATI Technologies Inc. AMD Radeon(TM) HD 6480G +ATI Technologies Inc. AMD Radeon(TM) HD 6520G +ATI Technologies Inc. AMD Radeon(TM) HD 6620G +ATI Technologies Inc. AMD Radeon(TM) HD 6630M  ATI Technologies Inc. ASUS 5870 Eyefinity 6 +ATI Technologies Inc. ASUS A9550 Series  ATI Technologies Inc. ASUS AH2600 Series  ATI Technologies Inc. ASUS AH3450 Series  ATI Technologies Inc. ASUS AH3650 Series +ATI Technologies Inc. ASUS AH3650 Series  ATI Technologies Inc. ASUS AH4650 Series  ATI Technologies Inc. ASUS ARES +ATI Technologies Inc. ASUS ARES  ATI Technologies Inc. ASUS EAH2900 Series  ATI Technologies Inc. ASUS EAH3450 Series +ATI Technologies Inc. ASUS EAH3450 Series  ATI Technologies Inc. ASUS EAH3650 Series +ATI Technologies Inc. ASUS EAH3650 Series +ATI Technologies Inc. ASUS EAH4350 series  ATI Technologies Inc. ASUS EAH4350 series  ATI Technologies Inc. ASUS EAH4550 series +ATI Technologies Inc. ASUS EAH4550 series  ATI Technologies Inc. ASUS EAH4650 series  ATI Technologies Inc. ASUS EAH4670 series +ATI Technologies Inc. ASUS EAH4670 series  ATI Technologies Inc. ASUS EAH4750 Series  ATI Technologies Inc. ASUS EAH4770 Series +ATI Technologies Inc. ASUS EAH4770 Series +ATI Technologies Inc. ASUS EAH4770 series  ATI Technologies Inc. ASUS EAH4770 series  ATI Technologies Inc. ASUS EAH4850 series  ATI Technologies Inc. ASUS EAH5450 Series +ATI Technologies Inc. ASUS EAH5450 Series +ATI Technologies Inc. ASUS EAH5550 Series  ATI Technologies Inc. ASUS EAH5550 Series  ATI Technologies Inc. ASUS EAH5570 series +ATI Technologies Inc. ASUS EAH5570 series +ATI Technologies Inc. ASUS EAH5670 Series  ATI Technologies Inc. ASUS EAH5670 Series  ATI Technologies Inc. ASUS EAH5750 Series +ATI Technologies Inc. ASUS EAH5750 Series +ATI Technologies Inc. ASUS EAH5770 Series  ATI Technologies Inc. ASUS EAH5770 Series  ATI Technologies Inc. ASUS EAH5830 Series  ATI Technologies Inc. ASUS EAH5850 Series +ATI Technologies Inc. ASUS EAH5850 Series  ATI Technologies Inc. ASUS EAH5870 Series +ATI Technologies Inc. ASUS EAH5870 Series +ATI Technologies Inc. ASUS EAH5970 Series  ATI Technologies Inc. ASUS EAH5970 Series +ATI Technologies Inc. ASUS EAH6450 Series +ATI Technologies Inc. ASUS EAH6570 Series +ATI Technologies Inc. ASUS EAH6670 Series +ATI Technologies Inc. ASUS EAH6850 Series  ATI Technologies Inc. ASUS EAH6850 Series  ATI Technologies Inc. ASUS EAH6870 Series +ATI Technologies Inc. ASUS EAH6870 Series +ATI Technologies Inc. ASUS EAH6950 Series  ATI Technologies Inc. ASUS EAH6950 Series  ATI Technologies Inc. ASUS EAH6970 Series +ATI Technologies Inc. ASUS EAH6970 Series  ATI Technologies Inc. ASUS EAHG4670 series  ATI Technologies Inc. ASUS Extreme AX600 Series +ATI Technologies Inc. ASUS Extreme AX600 Series +ATI Technologies Inc. ASUS Extreme AX600XT-TD  ATI Technologies Inc. ASUS Extreme AX600XT-TD  ATI Technologies Inc. ASUS X1300 Series x86/SSE2  ATI Technologies Inc. ASUS X1550 Series  ATI Technologies Inc. ASUS X1950 Series x86/SSE2  ATI Technologies Inc. ASUS X800 Series +ATI Technologies Inc. ASUS X800 Series  ATI Technologies Inc. ASUS X850 Series  ATI Technologies Inc. ATI All-in-Wonder HD  ATI Technologies Inc. ATI FirePro 2260 +ATI Technologies Inc. ATI FirePro 2260  ATI Technologies Inc. ATI FirePro 2450  ATI Technologies Inc. ATI FirePro M5800 +ATI Technologies Inc. ATI FirePro M5800  ATI Technologies Inc. ATI FirePro M7740 +ATI Technologies Inc. ATI FirePro M7740 +ATI Technologies Inc. ATI FirePro M7820  ATI Technologies Inc. ATI FirePro M7820  ATI Technologies Inc. ATI FirePro V3700 (FireGL)  ATI Technologies Inc. ATI FirePro V3800 @@ -230,113 +319,202 @@ ATI Technologies Inc. ATI FirePro V4800  ATI Technologies Inc. ATI FirePro V4800 (FireGL)  ATI Technologies Inc. ATI FirePro V5800  ATI Technologies Inc. ATI FirePro V7800 +ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series +ATI Technologies Inc. ATI MOBILITY RADEON 9XXX x86/SSE2  ATI Technologies Inc. ATI MOBILITY RADEON 9XXX x86/SSE2 +ATI Technologies Inc. ATI MOBILITY RADEON HD 2300  ATI Technologies Inc. ATI MOBILITY RADEON HD 3450 +ATI Technologies Inc. ATI MOBILITY RADEON HD 3650  ATI Technologies Inc. ATI MOBILITY RADEON X1600 +ATI Technologies Inc. ATI MOBILITY RADEON X1600 +ATI Technologies Inc. ATI MOBILITY RADEON X2300  ATI Technologies Inc. ATI MOBILITY RADEON X2300  ATI Technologies Inc. ATI MOBILITY RADEON X2300 HD x86/SSE2  ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2  ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/SSE2  ATI Technologies Inc. ATI MOBILITY RADEON X300 +ATI Technologies Inc. ATI MOBILITY RADEON X300  ATI Technologies Inc. ATI MOBILITY RADEON X600 +ATI Technologies Inc. ATI MOBILITY RADEON X700 +ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200  ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200  ATI Technologies Inc. ATI Mobility FireGL V5700 +ATI Technologies Inc. ATI Mobility FireGL V5700  ATI Technologies Inc. ATI Mobility Radeon 4100 +ATI Technologies Inc. ATI Mobility Radeon 4100 +ATI Technologies Inc. ATI Mobility Radeon Graphics  ATI Technologies Inc. ATI Mobility Radeon Graphics  ATI Technologies Inc. ATI Mobility Radeon HD 2300 +ATI Technologies Inc. ATI Mobility Radeon HD 2300 +ATI Technologies Inc. ATI Mobility Radeon HD 2400  ATI Technologies Inc. ATI Mobility Radeon HD 2400  ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT +ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT +ATI Technologies Inc. ATI Mobility Radeon HD 2600  ATI Technologies Inc. ATI Mobility Radeon HD 2600  ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT  ATI Technologies Inc. ATI Mobility Radeon HD 2700 +ATI Technologies Inc. ATI Mobility Radeon HD 2700 +ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series  ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series +ATI Technologies Inc. ATI Mobility Radeon HD 3410  ATI Technologies Inc. ATI Mobility Radeon HD 3430 +ATI Technologies Inc. ATI Mobility Radeon HD 3430 +ATI Technologies Inc. ATI Mobility Radeon HD 3450  ATI Technologies Inc. ATI Mobility Radeon HD 3450  ATI Technologies Inc. ATI Mobility Radeon HD 3470 +ATI Technologies Inc. ATI Mobility Radeon HD 3470  ATI Technologies Inc. ATI Mobility Radeon HD 3470 Hybrid X2  ATI Technologies Inc. ATI Mobility Radeon HD 3650 +ATI Technologies Inc. ATI Mobility Radeon HD 3650 +ATI Technologies Inc. ATI Mobility Radeon HD 3670 +ATI Technologies Inc. ATI Mobility Radeon HD 4200  ATI Technologies Inc. ATI Mobility Radeon HD 4200  ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series  ATI Technologies Inc. ATI Mobility Radeon HD 4225  ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4250  ATI Technologies Inc. ATI Mobility Radeon HD 4250  ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics +ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics +ATI Technologies Inc. ATI Mobility Radeon HD 4250 Series  ATI Technologies Inc. ATI Mobility Radeon HD 4270  ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series  ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series  ATI Technologies Inc. ATI Mobility Radeon HD 4330 +ATI Technologies Inc. ATI Mobility Radeon HD 4330  ATI Technologies Inc. ATI Mobility Radeon HD 4330 Series  ATI Technologies Inc. ATI Mobility Radeon HD 4350  ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series  ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series  ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4530  ATI Technologies Inc. ATI Mobility Radeon HD 4530  ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4550  ATI Technologies Inc. ATI Mobility Radeon HD 4550  ATI Technologies Inc. ATI Mobility Radeon HD 4570 +ATI Technologies Inc. ATI Mobility Radeon HD 4570  ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4650  ATI Technologies Inc. ATI Mobility Radeon HD 4650  ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4670  ATI Technologies Inc. ATI Mobility Radeon HD 4670  ATI Technologies Inc. ATI Mobility Radeon HD 4830 Series  ATI Technologies Inc. ATI Mobility Radeon HD 4850  ATI Technologies Inc. ATI Mobility Radeon HD 4870 +ATI Technologies Inc. ATI Mobility Radeon HD 4870 +ATI Technologies Inc. ATI Mobility Radeon HD 5000  ATI Technologies Inc. ATI Mobility Radeon HD 5000  ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series +ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series +ATI Technologies Inc. ATI Mobility Radeon HD 5145  ATI Technologies Inc. ATI Mobility Radeon HD 5145  ATI Technologies Inc. ATI Mobility Radeon HD 5165 +ATI Technologies Inc. ATI Mobility Radeon HD 5165 +ATI Technologies Inc. ATI Mobility Radeon HD 530v  ATI Technologies Inc. ATI Mobility Radeon HD 530v  ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series +ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series  ATI Technologies Inc. ATI Mobility Radeon HD 540v  ATI Technologies Inc. ATI Mobility Radeon HD 5430 +ATI Technologies Inc. ATI Mobility Radeon HD 5430 +ATI Technologies Inc. ATI Mobility Radeon HD 5450  ATI Technologies Inc. ATI Mobility Radeon HD 5450  ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series +ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series  ATI Technologies Inc. ATI Mobility Radeon HD 545v +ATI Technologies Inc. ATI Mobility Radeon HD 545v +ATI Technologies Inc. ATI Mobility Radeon HD 5470  ATI Technologies Inc. ATI Mobility Radeon HD 5470  ATI Technologies Inc. ATI Mobility Radeon HD 550v +ATI Technologies Inc. ATI Mobility Radeon HD 550v +ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series  ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series  ATI Technologies Inc. ATI Mobility Radeon HD 560v  ATI Technologies Inc. ATI Mobility Radeon HD 5650 +ATI Technologies Inc. ATI Mobility Radeon HD 5650  ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series +ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series +ATI Technologies Inc. ATI Mobility Radeon HD 5730  ATI Technologies Inc. ATI Mobility Radeon HD 5730  ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series +ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series +ATI Technologies Inc. ATI Mobility Radeon HD 5830 Series  ATI Technologies Inc. ATI Mobility Radeon HD 5850 +ATI Technologies Inc. ATI Mobility Radeon HD 5850 +ATI Technologies Inc. ATI Mobility Radeon HD 5870  ATI Technologies Inc. ATI Mobility Radeon HD 5870  ATI Technologies Inc. ATI Mobility Radeon HD 6300 series +ATI Technologies Inc. ATI Mobility Radeon HD 6300 series +ATI Technologies Inc. ATI Mobility Radeon HD 6370  ATI Technologies Inc. ATI Mobility Radeon HD 6370  ATI Technologies Inc. ATI Mobility Radeon HD 6470M  ATI Technologies Inc. ATI Mobility Radeon HD 6550 +ATI Technologies Inc. ATI Mobility Radeon HD 6550 +ATI Technologies Inc. ATI Mobility Radeon HD 6570  ATI Technologies Inc. ATI Mobility Radeon HD 6570  ATI Technologies Inc. ATI Mobility Radeon X1300 +ATI Technologies Inc. ATI Mobility Radeon X1300  ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2  ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2 +ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2  ATI Technologies Inc. ATI Mobility Radeon X1350  ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2  ATI Technologies Inc. ATI Mobility Radeon X1400 +ATI Technologies Inc. ATI Mobility Radeon X1400 +ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2  ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2  ATI Technologies Inc. ATI Mobility Radeon X1600 +ATI Technologies Inc. ATI Mobility Radeon X1600 +ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2  ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2  ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2  ATI Technologies Inc. ATI Mobility Radeon X2300 +ATI Technologies Inc. ATI Mobility Radeon X2300  ATI Technologies Inc. ATI Mobility Radeon X2300 (Omega 3.8.442)  ATI Technologies Inc. ATI Mobility Radeon X2300 x86 +ATI Technologies Inc. ATI Mobility Radeon X2300 x86  ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2  ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2  ATI Technologies Inc. ATI Mobility Radeon X2500 +ATI Technologies Inc. ATI Mobility Radeon X2500  ATI Technologies Inc. ATI Mobility Radeon X2500 x86/SSE2  ATI Technologies Inc. ATI Mobility Radeon. HD 530v +ATI Technologies Inc. ATI Mobility Radeon. HD 530v +ATI Technologies Inc. ATI Mobility Radeon. HD 5470  ATI Technologies Inc. ATI Mobility Radeon. HD 5470  ATI Technologies Inc. ATI RADEON HD 3200 T25XX by CAMILO  ATI Technologies Inc. ATI RADEON XPRESS 1100 +ATI Technologies Inc. ATI RADEON XPRESS 1100 x86/SSE2 +ATI Technologies Inc. ATI RADEON XPRESS 200 Series  ATI Technologies Inc. ATI RADEON XPRESS 200 Series  ATI Technologies Inc. ATI RADEON XPRESS 200 Series x86/SSE2  ATI Technologies Inc. ATI RADEON XPRESS 200M SERIES  ATI Technologies Inc. ATI Radeon  ATI Technologies Inc. ATI Radeon 2100 +ATI Technologies Inc. ATI Radeon 2100  ATI Technologies Inc. ATI Radeon 2100 (Microsoft - WDDM)  ATI Technologies Inc. ATI Radeon 2100 Graphics  ATI Technologies Inc. ATI Radeon 3000 +ATI Technologies Inc. ATI Radeon 3000  ATI Technologies Inc. ATI Radeon 3000 Graphics +ATI Technologies Inc. ATI Radeon 3000 Graphics +ATI Technologies Inc. ATI Radeon 3100 Graphics  ATI Technologies Inc. ATI Radeon 3100 Graphics  ATI Technologies Inc. ATI Radeon 5xxx series  ATI Technologies Inc. ATI Radeon 9550 / X1050 Series @@ -347,143 +525,239 @@ ATI Technologies Inc. ATI Radeon 9600 / X1050 Series  ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series  ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine  ATI Technologies Inc. ATI Radeon BB Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon Broadway XT Prototype OpenGL Engine  ATI Technologies Inc. ATI Radeon Cedar PRO Prototype OpenGL Engine  ATI Technologies Inc. ATI Radeon Cypress PRO Prototype OpenGL Engine  ATI Technologies Inc. ATI Radeon Graphics Processor +ATI Technologies Inc. ATI Radeon Graphics Processor  ATI Technologies Inc. ATI Radeon HD 2200 Graphics  ATI Technologies Inc. ATI Radeon HD 2350  ATI Technologies Inc. ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine  ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine  ATI Technologies Inc. ATI Radeon HD 2400 PRO  ATI Technologies Inc. ATI Radeon HD 2400 PRO AGP  ATI Technologies Inc. ATI Radeon HD 2400 Pro +ATI Technologies Inc. ATI Radeon HD 2400 Pro  ATI Technologies Inc. ATI Radeon HD 2400 Series +ATI Technologies Inc. ATI Radeon HD 2400 Series +ATI Technologies Inc. ATI Radeon HD 2400 XT  ATI Technologies Inc. ATI Radeon HD 2400 XT  ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine  ATI Technologies Inc. ATI Radeon HD 2600 OpenGL Engine  ATI Technologies Inc. ATI Radeon HD 2600 PRO  ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 2600 Pro  ATI Technologies Inc. ATI Radeon HD 2600 Pro  ATI Technologies Inc. ATI Radeon HD 2600 Series  ATI Technologies Inc. ATI Radeon HD 2600 XT +ATI Technologies Inc. ATI Radeon HD 2600 XT  ATI Technologies Inc. ATI Radeon HD 2900 GT  ATI Technologies Inc. ATI Radeon HD 2900 XT  ATI Technologies Inc. ATI Radeon HD 3200 Graphics +ATI Technologies Inc. ATI Radeon HD 3200 Graphics  ATI Technologies Inc. ATI Radeon HD 3300 Graphics  ATI Technologies Inc. ATI Radeon HD 3400 Series +ATI Technologies Inc. ATI Radeon HD 3400 Series  ATI Technologies Inc. ATI Radeon HD 3450 +ATI Technologies Inc. ATI Radeon HD 3450 +ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex  ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex  ATI Technologies Inc. ATI Radeon HD 3470  ATI Technologies Inc. ATI Radeon HD 3470 - Dell Optiplex  ATI Technologies Inc. ATI Radeon HD 3550 +ATI Technologies Inc. ATI Radeon HD 3550  ATI Technologies Inc. ATI Radeon HD 3600 Series +ATI Technologies Inc. ATI Radeon HD 3600 Series +ATI Technologies Inc. ATI Radeon HD 3650  ATI Technologies Inc. ATI Radeon HD 3650  ATI Technologies Inc. ATI Radeon HD 3650 AGP  ATI Technologies Inc. ATI Radeon HD 3730  ATI Technologies Inc. ATI Radeon HD 3800 Series +ATI Technologies Inc. ATI Radeon HD 3800 Series +ATI Technologies Inc. ATI Radeon HD 3850  ATI Technologies Inc. ATI Radeon HD 3850  ATI Technologies Inc. ATI Radeon HD 3850 AGP  ATI Technologies Inc. ATI Radeon HD 3870 +ATI Technologies Inc. ATI Radeon HD 3870  ATI Technologies Inc. ATI Radeon HD 3870 X2  ATI Technologies Inc. ATI Radeon HD 4200 +ATI Technologies Inc. ATI Radeon HD 4200 +ATI Technologies Inc. ATI Radeon HD 4250  ATI Technologies Inc. ATI Radeon HD 4250  ATI Technologies Inc. ATI Radeon HD 4250 Graphics +ATI Technologies Inc. ATI Radeon HD 4250 Graphics +ATI Technologies Inc. ATI Radeon HD 4270  ATI Technologies Inc. ATI Radeon HD 4270  ATI Technologies Inc. ATI Radeon HD 4290 +ATI Technologies Inc. ATI Radeon HD 4290 +ATI Technologies Inc. ATI Radeon HD 4290 (Engineering Sample)  ATI Technologies Inc. ATI Radeon HD 4300 Series +ATI Technologies Inc. ATI Radeon HD 4300 Series +ATI Technologies Inc. ATI Radeon HD 4300/4500 Series  ATI Technologies Inc. ATI Radeon HD 4300/4500 Series  ATI Technologies Inc. ATI Radeon HD 4350 +ATI Technologies Inc. ATI Radeon HD 4350  ATI Technologies Inc. ATI Radeon HD 4350 (Microsoft WDDM 1.1)  ATI Technologies Inc. ATI Radeon HD 4450 +ATI Technologies Inc. ATI Radeon HD 4450  ATI Technologies Inc. ATI Radeon HD 4500 Series  ATI Technologies Inc. ATI Radeon HD 4550 +ATI Technologies Inc. ATI Radeon HD 4550  ATI Technologies Inc. ATI Radeon HD 4600 Series +ATI Technologies Inc. ATI Radeon HD 4600 Series +ATI Technologies Inc. ATI Radeon HD 4650  ATI Technologies Inc. ATI Radeon HD 4650  ATI Technologies Inc. ATI Radeon HD 4670 +ATI Technologies Inc. ATI Radeon HD 4670  ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 4700 Series  ATI Technologies Inc. ATI Radeon HD 4700 Series  ATI Technologies Inc. ATI Radeon HD 4720 +ATI Technologies Inc. ATI Radeon HD 4720  ATI Technologies Inc. ATI Radeon HD 4730 +ATI Technologies Inc. ATI Radeon HD 4730 +ATI Technologies Inc. ATI Radeon HD 4730 Series  ATI Technologies Inc. ATI Radeon HD 4730 Series  ATI Technologies Inc. ATI Radeon HD 4750  ATI Technologies Inc. ATI Radeon HD 4770 +ATI Technologies Inc. ATI Radeon HD 4770 +ATI Technologies Inc. ATI Radeon HD 4800 Series  ATI Technologies Inc. ATI Radeon HD 4800 Series  ATI Technologies Inc. ATI Radeon HD 4850 +ATI Technologies Inc. ATI Radeon HD 4850 +ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine  ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine  ATI Technologies Inc. ATI Radeon HD 4850 Series  ATI Technologies Inc. ATI Radeon HD 4870 +ATI Technologies Inc. ATI Radeon HD 4870  ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine  ATI Technologies Inc. ATI Radeon HD 4870 X2 +ATI Technologies Inc. ATI Radeon HD 4870 X2  ATI Technologies Inc. ATI Radeon HD 5400 Series +ATI Technologies Inc. ATI Radeon HD 5400 Series +ATI Technologies Inc. ATI Radeon HD 5450  ATI Technologies Inc. ATI Radeon HD 5450 +ATI Technologies Inc. ATI Radeon HD 5470 +ATI Technologies Inc. ATI Radeon HD 5500 Series  ATI Technologies Inc. ATI Radeon HD 5500 Series  ATI Technologies Inc. ATI Radeon HD 5570 +ATI Technologies Inc. ATI Radeon HD 5570 +ATI Technologies Inc. ATI Radeon HD 5600 Series  ATI Technologies Inc. ATI Radeon HD 5600 Series +ATI Technologies Inc. ATI Radeon HD 5600/5700  ATI Technologies Inc. ATI Radeon HD 5630  ATI Technologies Inc. ATI Radeon HD 5670 +ATI Technologies Inc. ATI Radeon HD 5670 +ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine  ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine  ATI Technologies Inc. ATI Radeon HD 5700 Series +ATI Technologies Inc. ATI Radeon HD 5700 Series  ATI Technologies Inc. ATI Radeon HD 5750 +ATI Technologies Inc. ATI Radeon HD 5750 +ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine  ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine  ATI Technologies Inc. ATI Radeon HD 5770 +ATI Technologies Inc. ATI Radeon HD 5770  ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 5800 Series  ATI Technologies Inc. ATI Radeon HD 5800 Series  ATI Technologies Inc. ATI Radeon HD 5850 +ATI Technologies Inc. ATI Radeon HD 5850  ATI Technologies Inc. ATI Radeon HD 5870  ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 5900 Series  ATI Technologies Inc. ATI Radeon HD 5900 Series  ATI Technologies Inc. ATI Radeon HD 5970  ATI Technologies Inc. ATI Radeon HD 6230 +ATI Technologies Inc. ATI Radeon HD 6230 +ATI Technologies Inc. ATI Radeon HD 6250  ATI Technologies Inc. ATI Radeon HD 6250  ATI Technologies Inc. ATI Radeon HD 6350  ATI Technologies Inc. ATI Radeon HD 6390  ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine  ATI Technologies Inc. ATI Radeon HD 6510 +ATI Technologies Inc. ATI Radeon HD 6510 +ATI Technologies Inc. ATI Radeon HD 6570M  ATI Technologies Inc. ATI Radeon HD 6570M +ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine  ATI Technologies Inc. ATI Radeon HD 6750  ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine  ATI Technologies Inc. ATI Radeon HD 6770 +ATI Technologies Inc. ATI Radeon HD 6770 +ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine  ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine  ATI Technologies Inc. ATI Radeon HD 6800 Series  ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine  ATI Technologies Inc. ATI Radeon HD3750  ATI Technologies Inc. ATI Radeon HD4300/HD4500 series +ATI Technologies Inc. ATI Radeon HD4300/HD4500 series +ATI Technologies Inc. ATI Radeon HD4670  ATI Technologies Inc. ATI Radeon HD4670  ATI Technologies Inc. ATI Radeon Juniper LE Prototype OpenGL Engine  ATI Technologies Inc. ATI Radeon RV710 Prototype OpenGL Engine  ATI Technologies Inc. ATI Radeon RV730 Prototype OpenGL Engine  ATI Technologies Inc. ATI Radeon RV770 Prototype OpenGL Engine  ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine  ATI Technologies Inc. ATI Radeon Redwood PRO Prototype OpenGL Engine  ATI Technologies Inc. ATI Radeon Redwood XT Prototype OpenGL Engine  ATI Technologies Inc. ATI Radeon Whistler PRO/LP Prototype OpenGL Engine  ATI Technologies Inc. ATI Radeon X1050  ATI Technologies Inc. ATI Radeon X1050 Series  ATI Technologies Inc. ATI Radeon X1200 +ATI Technologies Inc. ATI Radeon X1200 +ATI Technologies Inc. ATI Radeon X1200 Series  ATI Technologies Inc. ATI Radeon X1200 Series  ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Radeon X1250  ATI Technologies Inc. ATI Radeon X1250  ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2  ATI Technologies Inc. ATI Radeon X1270 +ATI Technologies Inc. ATI Radeon X1270 +ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2  ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2  ATI Technologies Inc. ATI Radeon X1300/X1550 Series  ATI Technologies Inc. ATI Radeon X1550 Series +ATI Technologies Inc. ATI Radeon X1550 Series +ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine  ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine  ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine +ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine  ATI Technologies Inc. ATI Radeon X1950 GT  ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series +ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series  ATI Technologies Inc. ATI Radeon Xpress 1100  ATI Technologies Inc. ATI Radeon Xpress 1150 +ATI Technologies Inc. ATI Radeon Xpress 1150  ATI Technologies Inc. ATI Radeon Xpress 1150 x86/MMX/3DNow!/SSE2  ATI Technologies Inc. ATI Radeon Xpress 1200 +ATI Technologies Inc. ATI Radeon Xpress 1200 +ATI Technologies Inc. ATI Radeon Xpress 1200 Series  ATI Technologies Inc. ATI Radeon Xpress 1200 Series  ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2  ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2  ATI Technologies Inc. ATI Radeon Xpress 1250 +ATI Technologies Inc. ATI Radeon Xpress 1250 +ATI Technologies Inc. ATI Radeon Xpress 1250 x86/MMX/3DNow!/SSE2  ATI Technologies Inc. ATI Radeon Xpress 1250 x86/SSE2  ATI Technologies Inc. ATI Radeon Xpress Series +ATI Technologies Inc. ATI Radeon Xpress Series +ATI Technologies Inc. ATI Radeon Xpress Series x86/MMX/3DNow!/SSE2  ATI Technologies Inc. ATI Yamaha HD 9000  ATI Technologies Inc. ATi RS880M +ATI Technologies Inc. ATi RS880M  ATI Technologies Inc. Carte graphique VGA standard  ATI Technologies Inc. Diamond Radeon X1550 Series  ATI Technologies Inc. EG JUNIPER @@ -491,7 +765,9 @@ ATI Technologies Inc. EG PARK  ATI Technologies Inc. FireGL V3100 Pentium 4 (SSE2)  ATI Technologies Inc. FireMV 2400 PCI DDR x86  ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2 +ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2  ATI Technologies Inc. GeCube Radeon X1550 +ATI Technologies Inc. GeForce 9600 GT      x86/SSE2  ATI Technologies Inc. Geforce 9500 GT  ATI Technologies Inc. Geforce 9500GT  ATI Technologies Inc. Geforce 9800 GT @@ -501,98 +777,153 @@ ATI Technologies Inc. HIGHTECH EXCALIBUR X700 PRO  ATI Technologies Inc. M21 x86/MMX/3DNow!/SSE2  ATI Technologies Inc. M76M  ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2  ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2  ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON 9100 IGP DDR x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2  ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2  ATI Technologies Inc. MOBILITY RADEON 9700 x86/SSE2  ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2  ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2  ATI Technologies Inc. MOBILITY RADEON X700 SE x86  ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2  ATI Technologies Inc. MSI RX9550SE +ATI Technologies Inc. MSI Radeon X1550 Series +ATI Technologies Inc. Mobility Radeon HD 6000 series  ATI Technologies Inc. Mobility Radeon X2300 HD +ATI Technologies Inc. Mobility Radeon X2300 HD +ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2  ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2  ATI Technologies Inc. RADEON 7000 DDR x86/MMX/3DNow!/SSE  ATI Technologies Inc. RADEON 7000 DDR x86/SSE2  ATI Technologies Inc. RADEON 7500 DDR x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON 7500 DDR x86/MMX/3DNow!/SSE2  ATI Technologies Inc. RADEON 7500 DDR x86/SSE2  ATI Technologies Inc. RADEON 9100 IGP DDR x86/SSE2  ATI Technologies Inc. RADEON 9200 DDR x86/MMX/3DNow!/SSE  ATI Technologies Inc. RADEON 9200 DDR x86/SSE2  ATI Technologies Inc. RADEON 9200 PRO DDR x86/MMX/3DNow!/SSE  ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE +ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE +ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2  ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2  ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE +ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE +ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2  ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2  ATI Technologies Inc. RADEON 9200SE DDR x86/MMX/3DNow!/SSE2  ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2  ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE +ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE  ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2  ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2 +ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2  ATI Technologies Inc. RADEON 9500  ATI Technologies Inc. RADEON 9550 x86/SSE2  ATI Technologies Inc. RADEON 9600 SERIES  ATI Technologies Inc. RADEON 9600 SERIES x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON 9600 SERIES x86/SSE2 +ATI Technologies Inc. RADEON 9600 TX x86/SSE2  ATI Technologies Inc. RADEON 9600 TX x86/SSE2  ATI Technologies Inc. RADEON 9600 x86/MMX/3DNow!/SSE2  ATI Technologies Inc. RADEON 9600 x86/SSE2 +ATI Technologies Inc. RADEON 9600 x86/SSE2  ATI Technologies Inc. RADEON 9700 PRO x86/MMX/3DNow!/SSE  ATI Technologies Inc. RADEON 9800 PRO  ATI Technologies Inc. RADEON 9800 x86/SSE2  ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2 +ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2  ATI Technologies Inc. RADEON X300 Series x86/SSE2  ATI Technologies Inc. RADEON X300 x86/SSE2 +ATI Technologies Inc. RADEON X300 x86/SSE2 +ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2  ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2  ATI Technologies Inc. RADEON X550 x86/MMX/3DNow!/SSE2  ATI Technologies Inc. RADEON X550 x86/SSE2  ATI Technologies Inc. RADEON X600 Series  ATI Technologies Inc. RADEON X600 x86/SSE2 +ATI Technologies Inc. RADEON X600 x86/SSE2 +ATI Technologies Inc. RADEON X600/X550 Series  ATI Technologies Inc. RADEON X700 PRO x86/SSE2  ATI Technologies Inc. RADEON X800 SE x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON X800 XT  ATI Technologies Inc. RADEON X800GT  ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2  ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2  ATI Technologies Inc. RADEON XPRESS 200 Series x86/SSE2  ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2  ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2 +ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2 +ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2  ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2  ATI Technologies Inc. RADEON XPRESS 200M Series x86/SSE2  ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON XPRESS Series x86/SSE2  ATI Technologies Inc. RADEON XPRESS Series x86/SSE2  ATI Technologies Inc. RS740  ATI Technologies Inc. RS780C  ATI Technologies Inc. RS780M +ATI Technologies Inc. RS780M +ATI Technologies Inc. RS880  ATI Technologies Inc. RS880  ATI Technologies Inc. RV410 Pro x86/SSE2  ATI Technologies Inc. RV790 +ATI Technologies Inc. RV790 +ATI Technologies Inc. Radeon (TM) HD 6470M  ATI Technologies Inc. Radeon (TM) HD 6470M  ATI Technologies Inc. Radeon (TM) HD 6490M +ATI Technologies Inc. Radeon (TM) HD 6490M +ATI Technologies Inc. Radeon (TM) HD 6750M  ATI Technologies Inc. Radeon (TM) HD 6770M +ATI Technologies Inc. Radeon (TM) HD 6770M +ATI Technologies Inc. Radeon (TM) HD 6850M +ATI Technologies Inc. Radeon 7000 DDR x86/SSE  ATI Technologies Inc. Radeon 7000 DDR x86/SSE2  ATI Technologies Inc. Radeon 7000 SDR x86/SSE2  ATI Technologies Inc. Radeon 7500 DDR x86/SSE2 +ATI Technologies Inc. Radeon 7500 DDR x86/SSE2  ATI Technologies Inc. Radeon 9000 DDR x86/SSE2  ATI Technologies Inc. Radeon DDR x86/MMX/3DNow!/SSE2  ATI Technologies Inc. Radeon DDR x86/SSE  ATI Technologies Inc. Radeon DDR x86/SSE2  ATI Technologies Inc. Radeon HD 6310 +ATI Technologies Inc. Radeon HD 6310 +ATI Technologies Inc. Radeon HD 6470M +ATI Technologies Inc. Radeon HD 6490M +ATI Technologies Inc. Radeon HD 6800 Series  ATI Technologies Inc. Radeon HD 6800 Series  ATI Technologies Inc. Radeon SDR x86/SSE2 +ATI Technologies Inc. Radeon SDR x86/SSE2  ATI Technologies Inc. Radeon X1300 Series  ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2  ATI Technologies Inc. Radeon X1300 Series x86/SSE2  ATI Technologies Inc. Radeon X1300/X1550 Series +ATI Technologies Inc. Radeon X1300/X1550 Series  ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2  ATI Technologies Inc. Radeon X1550 64-bit (Microsoft - WDDM)  ATI Technologies Inc. Radeon X1550 Series  ATI Technologies Inc. Radeon X1550 Series x86/SSE2  ATI Technologies Inc. Radeon X1600  ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. Radeon X1600 Series  ATI Technologies Inc. Radeon X1600 Series x86/SSE2 +ATI Technologies Inc. Radeon X1600/1650 Series  ATI Technologies Inc. Radeon X1600/X1650 Series  ATI Technologies Inc. Radeon X1650 Series +ATI Technologies Inc. Radeon X1650 Series  ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2  ATI Technologies Inc. Radeon X1650 Series x86/SSE2 +ATI Technologies Inc. Radeon X1650 Series x86/SSE2  ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2  ATI Technologies Inc. Radeon X1950 Pro  ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2 @@ -602,18 +933,24 @@ ATI Technologies Inc. Radeon X300/X550/X1050 Series  ATI Technologies Inc. Radeon X550/X700 Series  ATI Technologies Inc. Radeon X550XTX x86/MMX/3DNow!/SSE2  ATI Technologies Inc. SAPPHIRE RADEON X300SE +ATI Technologies Inc. SAPPHIRE RADEON X300SE  ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/MMX/3DNow!/SSE2  ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/SSE2  ATI Technologies Inc. SAPPHIRE Radeon X1550 Series  ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/SSE2 +ATI Technologies Inc. SAPPHIRE Radeon X1550 x86/SSE2 +ATI Technologies Inc. Sapphire Radeon HD 3730  ATI Technologies Inc. Sapphire Radeon HD 3730  ATI Technologies Inc. Sapphire Radeon HD 3750  ATI Technologies Inc. Standard VGA Graphics Adapter +ATI Technologies Inc. Standard VGA Graphics Adapter  ATI Technologies Inc. Tul, RADEON  X600 PRO  ATI Technologies Inc. Tul, RADEON  X600 PRO x86/SSE2  ATI Technologies Inc. Tul, RADEON  X700 PRO  ATI Technologies Inc. Tul, RADEON  X700 PRO x86/MMX/3DNow!/SSE2  ATI Technologies Inc. VisionTek Radeon 4350 +ATI Technologies Inc. VisionTek Radeon 4350  ATI Technologies Inc. VisionTek Radeon X1550 Series  ATI Technologies Inc. WRESTLER 9802  ATI Technologies Inc. WRESTLER 9803 @@ -630,6 +967,7 @@ Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX+/3DNow!  Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX/SSE2 TCL DRI2  Advanced Micro Devices, Inc. Mesa DRI R600 (RV635 9596) 20090101 x86/MMX+/3DNow!+/SSE TCL DRI2  Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 +Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX/SSE2 TCL DRI2  Advanced Micro Devices, Inc. Mesa DRI R600 (RV710 9552) 20090101 x86/MMX/SSE2 TCL DRI2  Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2  Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX/SSE2 TCL DRI2 @@ -648,6 +986,7 @@ DRI R300 Project Mesa DRI R300 (RV350 4153) 20090101 AGP 8x x86/MMX+/3DNow!+/SSE  DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2  DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX/SSE2 TCL DRI2  DRI R300 Project Mesa DRI R300 (RV380 5B60) 20090101 x86/MMX/SSE2 TCL DRI2 +DRI R300 Project Mesa DRI R300 (RV380 5B60) 20090101 x86/MMX/SSE2 TCL DRI2  DRI R300 Project Mesa DRI R300 (RV380 5B62) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2  DRI R300 Project Mesa DRI R300 (RV515 7145) 20090101 x86/MMX/SSE2 TCL DRI2  DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 @@ -657,11 +996,17 @@ DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL  DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL DRI2  DRI R300 Project Mesa DRI R300 (RV530 71C4) 20090101 x86/MMX/SSE2 TCL DRI2  GPU_CLASS_UNKNOWN +Humper 3D-Analyze v2.3 - http://www.tommti-systems.com  Humper Chromium +Humper Chromium +Imagination Technologies PowerVR SGX545  Intel  Intel  HD Graphics Family +Intel  HD Graphics Family  Intel 3D-Analyze v2.2 - http://www.tommti-systems.com  Intel 3D-Analyze v2.3 - http://www.tommti-systems.com +Intel 3D-Analyze v2.3 - http://www.tommti-systems.com +Intel 4 Series Internal Chipset  Intel 4 Series Internal Chipset  Intel 830M  Intel 845G @@ -674,19 +1019,26 @@ Intel 945GM  Intel 950  Intel 965  Intel B43 Express Chipset +Intel B43 Express Chipset  Intel Bear Lake  Intel Broadwater  Intel Brookdale  Intel Cantiga +Intel EMGD on PowerVR SGX535  Intel Eaglelake  Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1) +Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1)  Intel G33  Intel G41  Intel G41 Express Chipset +Intel G41 Express Chipset  Intel G45  Intel G45/G43 Express Chipset +Intel G45/G43 Express Chipset +Intel Graphics Media Accelerator HD  Intel Graphics Media Accelerator HD  Intel HD Graphics +Intel HD Graphics  Intel HD Graphics 100  Intel HD Graphics 200  Intel HD Graphics 200 BR-1101-00SH @@ -695,6 +1047,7 @@ Intel HD Graphics 200 BR-1101-00SK  Intel HD Graphics 200 BR-1101-01M5  Intel HD Graphics 200 BR-1101-01M6  Intel HD Graphics BR-1004-01Y1 +Intel HD Graphics BR-1004-01Y1  Intel HD Graphics BR-1006-0364  Intel HD Graphics BR-1006-0365  Intel HD Graphics BR-1006-0366 @@ -704,45 +1057,73 @@ Intel HD Graphics BR-1101-04SZ  Intel HD Graphics BR-1101-04T0  Intel HD Graphics BR-1101-04T9  Intel HD Graphics Family +Intel HD Graphics Family  Intel HD Graphics Family BR-1012-00Y8  Intel HD Graphics Family BR-1012-00YF  Intel HD Graphics Family BR-1012-00ZD  Intel HD Graphics Family BR-1102-00ML  Intel Inc. Intel GMA 900 OpenGL Engine +Intel Inc. Intel GMA 900 OpenGL Engine +Intel Inc. Intel GMA 950 OpenGL Engine  Intel Inc. Intel GMA 950 OpenGL Engine  Intel Inc. Intel GMA X3100 OpenGL Engine +Intel Inc. Intel GMA X3100 OpenGL Engine +Intel Inc. Intel HD Graphics 3000 OpenGL Engine  Intel Inc. Intel HD Graphics 3000 OpenGL Engine  Intel Inc. Intel HD Graphics OpenGL Engine +Intel Inc. Intel HD Graphics OpenGL Engine  Intel Inc. Intel HD xxxx OpenGL Engine  Intel Intel 845G +Intel Intel 845G +Intel Intel 855GM  Intel Intel 855GM  Intel Intel 865G +Intel Intel 865G  Intel Intel 915G +Intel Intel 915G +Intel Intel 915GM  Intel Intel 915GM  Intel Intel 945G +Intel Intel 945G +Intel Intel 945GM  Intel Intel 945GM  Intel Intel 965/963 Graphics Media Accelerator +Intel Intel 965/963 Graphics Media Accelerator +Intel Intel Bear Lake B  Intel Intel Bear Lake B  Intel Intel Broadwater G  Intel Intel Brookdale-G +Intel Intel Brookdale-G  Intel Intel Calistoga  Intel Intel Cantiga +Intel Intel Cantiga  Intel Intel Eaglelake +Intel Intel Eaglelake +Intel Intel Generic Renderer +Intel Intel Grantsdale-G  Intel Intel Grantsdale-G  Intel Intel HD Graphics 3000  Intel Intel Lakeport  Intel Intel Montara-GM  Intel Intel Pineview Platform +Intel Intel Pineview Platform  Intel Intel Springdale-G  Intel Mobile - famiglia Express Chipset 45 (Microsoft Corporation - WDDM 1.1)  Intel Mobile 4 Series  Intel Mobile 4 Series Express Chipset Family +Intel Mobile 4 Series Express Chipset Family +Intel Mobile 45 Express Chipset Family +Intel Mobile 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1)  Intel Mobile 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1)  Intel Mobile HD Graphics +Intel Mobile HD Graphics +Intel Mobile Intel(R) 4 Series Express Chipset Family  Intel Mobile SandyBridge HD Graphics  Intel Montara  Intel Pineview  Intel Q45/Q43 Express Chipset +Intel Q45/Q43 Express Chipset +Intel Royal BNA Driver  Intel Royal BNA Driver  Intel SandyBridge HD Graphics  Intel SandyBridge HD Graphics BR-1006-00V8 @@ -750,14 +1131,18 @@ Intel Springdale  Intel X3100  Intergraph wcgdrv 06.05.06.18  Intergraph wcgdrv 06.06.00.35 +Intergraph wcgdrv 06.06.00.35  LegendgrafiX Mobile 945 Express C/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://LegendgrafiX.tk  LegendgrafiX NVIDIA GeForce GT 430/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://LegendgrafiX.tk  Linden Lab Headless  Matrox  Mesa  Mesa Project Software Rasterizer +Mesa Project Software Rasterizer +NVIDIA /PCI/SSE2  NVIDIA /PCI/SSE2  NVIDIA /PCI/SSE2/3DNOW! +NVIDIA /PCI/SSE2/3DNOW!  NVIDIA 205  NVIDIA 210  NVIDIA 310 @@ -766,8 +1151,13 @@ NVIDIA 315  NVIDIA 315M  NVIDIA 320M  NVIDIA C51 +NVIDIA Corporation GeForce GT 230/PCI/SSE2 +NVIDIA Corporation GeForce GTX 285/PCI/SSE2 +NVIDIA D10M2-20/PCI/SSE2  NVIDIA D10M2-20/PCI/SSE2  NVIDIA D10P1-25/PCI/SSE2 +NVIDIA D10P1-25/PCI/SSE2 +NVIDIA D10P1-25/PCI/SSE2/3DNOW!  NVIDIA D10P1-30/PCI/SSE2  NVIDIA D10P2-50/PCI/SSE2  NVIDIA D11M2-30/PCI/SSE2 @@ -775,11 +1165,16 @@ NVIDIA D12-P1-35/PCI/SSE2  NVIDIA D12U-15/PCI/SSE2  NVIDIA D13M1-40/PCI/SSE2  NVIDIA D13P1-40/PCI/SSE2 +NVIDIA D13P1-40/PCI/SSE2 +NVIDIA D13P1-40/PCI/SSE2/3DNOW!  NVIDIA D13U-10/PCI/SSE2  NVIDIA D13U/PCI/SSE2 +NVIDIA D13U/PCI/SSE2  NVIDIA D9M  NVIDIA D9M-20/PCI/SSE2  NVIDIA Entry Graphics/PCI/SSE2 +NVIDIA Entry Graphics/PCI/SSE2 +NVIDIA Entry Graphics/PCI/SSE2/3DNOW!  NVIDIA Entry Graphics/PCI/SSE2/3DNOW!  NVIDIA G 102M  NVIDIA G 103M @@ -800,7 +1195,10 @@ NVIDIA G92  NVIDIA G92-200/PCI/SSE2  NVIDIA G94  NVIDIA G96/PCI/SSE2 +NVIDIA G96/PCI/SSE2  NVIDIA G98/PCI/SSE2 +NVIDIA G98/PCI/SSE2 +NVIDIA G98/PCI/SSE2/3DNOW!  NVIDIA GT 120  NVIDIA GT 130  NVIDIA GT 130M @@ -809,6 +1207,8 @@ NVIDIA GT 150  NVIDIA GT 160M  NVIDIA GT 220  NVIDIA GT 220/PCI/SSE2 +NVIDIA GT 220/PCI/SSE2 +NVIDIA GT 220/PCI/SSE2/3DNOW!  NVIDIA GT 220/PCI/SSE2/3DNOW!  NVIDIA GT 230  NVIDIA GT 230M @@ -859,58 +1259,89 @@ NVIDIA GTX 590  NVIDIA GeForce  NVIDIA GeForce 2  NVIDIA GeForce 205/PCI/SSE2 +NVIDIA GeForce 205/PCI/SSE2  NVIDIA GeForce 210  NVIDIA GeForce 210/PCI/SSE2 +NVIDIA GeForce 210/PCI/SSE2 +NVIDIA GeForce 210/PCI/SSE2/3DNOW!  NVIDIA GeForce 210/PCI/SSE2/3DNOW!  NVIDIA GeForce 3  NVIDIA GeForce 305M/PCI/SSE2 +NVIDIA GeForce 305M/PCI/SSE2 +NVIDIA GeForce 310/PCI/SSE2  NVIDIA GeForce 310/PCI/SSE2  NVIDIA GeForce 310/PCI/SSE2/3DNOW! +NVIDIA GeForce 310/PCI/SSE2/3DNOW! +NVIDIA GeForce 310M/PCI/SSE2  NVIDIA GeForce 310M/PCI/SSE2  NVIDIA GeForce 315/PCI/SSE2 +NVIDIA GeForce 315/PCI/SSE2  NVIDIA GeForce 315/PCI/SSE2/3DNOW! +NVIDIA GeForce 315/PCI/SSE2/3DNOW! +NVIDIA GeForce 315M/PCI/SSE2  NVIDIA GeForce 315M/PCI/SSE2  NVIDIA GeForce 320M/PCI/SSE2  NVIDIA GeForce 4 Go  NVIDIA GeForce 4 MX  NVIDIA GeForce 4 Ti  NVIDIA GeForce 405/PCI/SSE2 +NVIDIA GeForce 405/PCI/SSE2 +NVIDIA GeForce 410M/PCI/SSE2  NVIDIA GeForce 6100  NVIDIA GeForce 6100 nForce 400/PCI/SSE2/3DNOW! +NVIDIA GeForce 6100 nForce 400/PCI/SSE2/3DNOW!  NVIDIA GeForce 6100 nForce 405/PCI/SSE2  NVIDIA GeForce 6100 nForce 405/PCI/SSE2/3DNOW! +NVIDIA GeForce 6100 nForce 405/PCI/SSE2/3DNOW!  NVIDIA GeForce 6100 nForce 420/PCI/SSE2/3DNOW! +NVIDIA GeForce 6100 nForce 420/PCI/SSE2/3DNOW! +NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW!  NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW!  NVIDIA GeForce 6100/PCI/SSE2/3DNOW! +NVIDIA GeForce 6100/PCI/SSE2/3DNOW! +NVIDIA GeForce 6150 LE/PCI/SSE2/3DNOW!  NVIDIA GeForce 6150 LE/PCI/SSE2/3DNOW!  NVIDIA GeForce 6150/PCI/SSE2  NVIDIA GeForce 6150/PCI/SSE2/3DNOW! +NVIDIA GeForce 6150/PCI/SSE2/3DNOW!  NVIDIA GeForce 6150SE nForce 430/PCI/SSE2 +NVIDIA GeForce 6150SE nForce 430/PCI/SSE2 +NVIDIA GeForce 6150SE nForce 430/PCI/SSE2/3DNOW!  NVIDIA GeForce 6150SE nForce 430/PCI/SSE2/3DNOW!  NVIDIA GeForce 6150SE/PCI/SSE2/3DNOW! +NVIDIA GeForce 6150SE/PCI/SSE2/3DNOW!  NVIDIA GeForce 6200  NVIDIA GeForce 6200 A-LE/AGP/SSE/3DNOW!  NVIDIA GeForce 6200 A-LE/AGP/SSE2  NVIDIA GeForce 6200 A-LE/AGP/SSE2/3DNOW!  NVIDIA GeForce 6200 LE/PCI/SSE2 +NVIDIA GeForce 6200 LE/PCI/SSE2  NVIDIA GeForce 6200 LE/PCI/SSE2/3DNOW!  NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2 +NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2  NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW!  NVIDIA GeForce 6200/AGP/SSE/3DNOW! +NVIDIA GeForce 6200/AGP/SSE/3DNOW! +NVIDIA GeForce 6200/AGP/SSE2  NVIDIA GeForce 6200/AGP/SSE2  NVIDIA GeForce 6200/AGP/SSE2/3DNOW!  NVIDIA GeForce 6200/PCI/SSE/3DNOW!  NVIDIA GeForce 6200/PCI/SSE2 +NVIDIA GeForce 6200/PCI/SSE2 +NVIDIA GeForce 6200/PCI/SSE2/3DNOW!  NVIDIA GeForce 6200/PCI/SSE2/3DNOW!  NVIDIA GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW!  NVIDIA GeForce 6500  NVIDIA GeForce 6500/PCI/SSE2 +NVIDIA GeForce 6500/PCI/SSE2  NVIDIA GeForce 6600  NVIDIA GeForce 6600 GT/AGP/SSE/3DNOW!  NVIDIA GeForce 6600 GT/AGP/SSE2 +NVIDIA GeForce 6600 GT/AGP/SSE2  NVIDIA GeForce 6600 GT/PCI/SSE/3DNOW!  NVIDIA GeForce 6600 GT/PCI/SSE2  NVIDIA GeForce 6600 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 6600 GT/PCI/SSE2/3DNOW!  NVIDIA GeForce 6600 LE/PCI/SSE2  NVIDIA GeForce 6600/AGP/SSE/3DNOW!  NVIDIA GeForce 6600/AGP/SSE2 @@ -919,49 +1350,77 @@ NVIDIA GeForce 6600/PCI/SSE2  NVIDIA GeForce 6600/PCI/SSE2/3DNOW!  NVIDIA GeForce 6700  NVIDIA GeForce 6800 +NVIDIA GeForce 6800 GS/PCI/SSE2  NVIDIA GeForce 6800 GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 6800 GT/AGP/SSE2  NVIDIA GeForce 6800 GT/PCI/SSE2  NVIDIA GeForce 6800 XT/AGP/SSE2  NVIDIA GeForce 6800 XT/PCI/SSE2 +NVIDIA GeForce 6800 XT/PCI/SSE2/3DNOW!  NVIDIA GeForce 6800/PCI/SSE2  NVIDIA GeForce 6800/PCI/SSE2/3DNOW!  NVIDIA GeForce 7000  NVIDIA GeForce 7000M  NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2  NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! +NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! +NVIDIA GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW!  NVIDIA GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW!  NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2 +NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2 +NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW!  NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW!  NVIDIA GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2 +NVIDIA GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2  NVIDIA GeForce 7050 / NVIDIA nForce 620i/PCI/SSE2  NVIDIA GeForce 7050 / nForce 610i/PCI/SSE2 +NVIDIA GeForce 7050 / nForce 610i/PCI/SSE2 +NVIDIA GeForce 7050 / nForce 620i/PCI/SSE2  NVIDIA GeForce 7050 / nForce 620i/PCI/SSE2  NVIDIA GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW! +NVIDIA GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW!  NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2  NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2/3DNOW!  NVIDIA GeForce 7050 SE / NVIDIA nForce 630a/PCI/SSE2/3DNOW!  NVIDIA GeForce 7100  NVIDIA GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2 +NVIDIA GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2 +NVIDIA GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2  NVIDIA GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2  NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2 +NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2 +NVIDIA GeForce 7100 GS/PCI/SSE2  NVIDIA GeForce 7100 GS/PCI/SSE2  NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW! +NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2 +NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2 +NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW!  NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW!  NVIDIA GeForce 7300  NVIDIA GeForce 7300 GS/PCI/SSE2 +NVIDIA GeForce 7300 GS/PCI/SSE2 +NVIDIA GeForce 7300 GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 7300 GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 7300 GT/AGP/SSE2  NVIDIA GeForce 7300 GT/AGP/SSE2/3DNOW!  NVIDIA GeForce 7300 GT/PCI/SSE2 +NVIDIA GeForce 7300 GT/PCI/SSE2  NVIDIA GeForce 7300 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 7300 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 7300 LE/PCI/SSE2  NVIDIA GeForce 7300 LE/PCI/SSE2  NVIDIA GeForce 7300 LE/PCI/SSE2/3DNOW! +NVIDIA GeForce 7300 LE/PCI/SSE2/3DNOW!  NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2 +NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2 +NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 7300 SE/PCI/SSE2 +NVIDIA GeForce 7300 SE/PCI/SSE2  NVIDIA GeForce 7300 SE/PCI/SSE2/3DNOW! +NVIDIA GeForce 7300 SE/PCI/SSE2/3DNOW! +NVIDIA GeForce 7350 LE/PCI/SSE2  NVIDIA GeForce 7350 LE/PCI/SSE2  NVIDIA GeForce 7500  NVIDIA GeForce 7500 LE/PCI/SSE2 @@ -970,22 +1429,30 @@ NVIDIA GeForce 7600  NVIDIA GeForce 7600 GS/AGP/SSE2  NVIDIA GeForce 7600 GS/AGP/SSE2/3DNOW!  NVIDIA GeForce 7600 GS/PCI/SSE2 +NVIDIA GeForce 7600 GS/PCI/SSE2 +NVIDIA GeForce 7600 GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 7600 GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 7600 GT/AGP/SSE/3DNOW!  NVIDIA GeForce 7600 GT/AGP/SSE2  NVIDIA GeForce 7600 GT/PCI/SSE2 +NVIDIA GeForce 7600 GT/PCI/SSE2  NVIDIA GeForce 7600 GT/PCI/SSE2/3DNOW!  NVIDIA GeForce 7650 GS/PCI/SSE2  NVIDIA GeForce 7800  NVIDIA GeForce 7800 GS/AGP/SSE2  NVIDIA GeForce 7800 GS/AGP/SSE2/3DNOW!  NVIDIA GeForce 7800 GT/PCI/SSE2 +NVIDIA GeForce 7800 GT/PCI/SSE2/3DNOW!  NVIDIA GeForce 7800 GTX/PCI/SSE2  NVIDIA GeForce 7800 GTX/PCI/SSE2/3DNOW! +NVIDIA GeForce 7800 GTX/PCI/SSE2/3DNOW!  NVIDIA GeForce 7900  NVIDIA GeForce 7900 GS/PCI/SSE2 +NVIDIA GeForce 7900 GS/PCI/SSE2  NVIDIA GeForce 7900 GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 7900 GT/GTO/PCI/SSE2 +NVIDIA GeForce 7900 GT/GTO/PCI/SSE2/3DNOW! +NVIDIA GeForce 7900 GT/PCI/SSE2/3DNOW!  NVIDIA GeForce 7900 GT/PCI/SSE2/3DNOW!  NVIDIA GeForce 7900 GTX/PCI/SSE2  NVIDIA GeForce 7950 GT/PCI/SSE2 @@ -994,123 +1461,186 @@ NVIDIA GeForce 8100  NVIDIA GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW!  NVIDIA GeForce 8200  NVIDIA GeForce 8200/PCI/SSE2 +NVIDIA GeForce 8200/PCI/SSE2 +NVIDIA GeForce 8200/PCI/SSE2/3DNOW!  NVIDIA GeForce 8200/PCI/SSE2/3DNOW!  NVIDIA GeForce 8200M  NVIDIA GeForce 8200M G/PCI/SSE2 +NVIDIA GeForce 8200M G/PCI/SSE2 +NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW!  NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW!  NVIDIA GeForce 8300  NVIDIA GeForce 8300 GS/PCI/SSE2 +NVIDIA GeForce 8300 GS/PCI/SSE2  NVIDIA GeForce 8400  NVIDIA GeForce 8400 GS/PCI/SSE/3DNOW!  NVIDIA GeForce 8400 GS/PCI/SSE2 +NVIDIA GeForce 8400 GS/PCI/SSE2 +NVIDIA GeForce 8400 GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 8400 GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 8400/PCI/SSE2/3DNOW!  NVIDIA GeForce 8400GS/PCI/SSE2 +NVIDIA GeForce 8400GS/PCI/SSE2 +NVIDIA GeForce 8400GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 8400GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 8400M  NVIDIA GeForce 8400M G/PCI/SSE2 +NVIDIA GeForce 8400M G/PCI/SSE2 +NVIDIA GeForce 8400M G/PCI/SSE2/3DNOW!  NVIDIA GeForce 8400M G/PCI/SSE2/3DNOW!  NVIDIA GeForce 8400M GS/PCI/SSE2 +NVIDIA GeForce 8400M GS/PCI/SSE2 +NVIDIA GeForce 8400M GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 8400M GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 8400M GT/PCI/SSE2 +NVIDIA GeForce 8400M GT/PCI/SSE2  NVIDIA GeForce 8500  NVIDIA GeForce 8500 GT/PCI/SSE2 +NVIDIA GeForce 8500 GT/PCI/SSE2 +NVIDIA GeForce 8500 GT/PCI/SSE2/3DNOW!  NVIDIA GeForce 8500 GT/PCI/SSE2/3DNOW!  NVIDIA GeForce 8600  NVIDIA GeForce 8600 GS/PCI/SSE2 +NVIDIA GeForce 8600 GS/PCI/SSE2  NVIDIA GeForce 8600 GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 8600 GT/PCI/SSE2 +NVIDIA GeForce 8600 GT/PCI/SSE2 +NVIDIA GeForce 8600 GT/PCI/SSE2/3DNOW!  NVIDIA GeForce 8600 GT/PCI/SSE2/3DNOW!  NVIDIA GeForce 8600 GTS/PCI/SSE2  NVIDIA GeForce 8600 GTS/PCI/SSE2/3DNOW!  NVIDIA GeForce 8600GS/PCI/SSE2 +NVIDIA GeForce 8600GS/PCI/SSE2  NVIDIA GeForce 8600M  NVIDIA GeForce 8600M GS/PCI/SSE2  NVIDIA GeForce 8600M GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 8600M GT/PCI/SSE2 +NVIDIA GeForce 8600M GT/PCI/SSE2  NVIDIA GeForce 8700  NVIDIA GeForce 8700M  NVIDIA GeForce 8700M GT/PCI/SSE2 +NVIDIA GeForce 8700M GT/PCI/SSE2  NVIDIA GeForce 8800  NVIDIA GeForce 8800 GS/PCI/SSE2  NVIDIA GeForce 8800 GT/PCI/SSE2 +NVIDIA GeForce 8800 GT/PCI/SSE2 +NVIDIA GeForce 8800 GT/PCI/SSE2/3DNOW!  NVIDIA GeForce 8800 GT/PCI/SSE2/3DNOW!  NVIDIA GeForce 8800 GTS 512/PCI/SSE2  NVIDIA GeForce 8800 GTS 512/PCI/SSE2/3DNOW!  NVIDIA GeForce 8800 GTS/PCI/SSE2 +NVIDIA GeForce 8800 GTS/PCI/SSE2  NVIDIA GeForce 8800 GTS/PCI/SSE2/3DNOW!  NVIDIA GeForce 8800 GTX/PCI/SSE2  NVIDIA GeForce 8800 Ultra/PCI/SSE2  NVIDIA GeForce 8800M GTS/PCI/SSE2 +NVIDIA GeForce 8800M GTS/PCI/SSE2 +NVIDIA GeForce 8800M GTX/PCI/SSE2  NVIDIA GeForce 8800M GTX/PCI/SSE2  NVIDIA GeForce 9100  NVIDIA GeForce 9100/PCI/SSE2 +NVIDIA GeForce 9100/PCI/SSE2  NVIDIA GeForce 9100/PCI/SSE2/3DNOW!  NVIDIA GeForce 9100M  NVIDIA GeForce 9100M G/PCI/SSE2 +NVIDIA GeForce 9100M G/PCI/SSE2  NVIDIA GeForce 9100M G/PCI/SSE2/3DNOW!  NVIDIA GeForce 9200  NVIDIA GeForce 9200/PCI/SSE2 +NVIDIA GeForce 9200/PCI/SSE2  NVIDIA GeForce 9200/PCI/SSE2/3DNOW! +NVIDIA GeForce 9200/PCI/SSE2/3DNOW! +NVIDIA GeForce 9200M GE/PCI/SSE2  NVIDIA GeForce 9200M GE/PCI/SSE2  NVIDIA GeForce 9200M GS/PCI/SSE2 +NVIDIA GeForce 9200M GS/PCI/SSE2  NVIDIA GeForce 9300  NVIDIA GeForce 9300 / nForce 730i/PCI/SSE2  NVIDIA GeForce 9300 GE/PCI/SSE2 +NVIDIA GeForce 9300 GE/PCI/SSE2 +NVIDIA GeForce 9300 GE/PCI/SSE2/3DNOW!  NVIDIA GeForce 9300 GE/PCI/SSE2/3DNOW!  NVIDIA GeForce 9300 GS/PCI/SSE2 +NVIDIA GeForce 9300 GS/PCI/SSE2 +NVIDIA GeForce 9300 GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 9300 GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 9300 SE/PCI/SSE2  NVIDIA GeForce 9300M  NVIDIA GeForce 9300M G/PCI/SSE2 +NVIDIA GeForce 9300M G/PCI/SSE2  NVIDIA GeForce 9300M G/PCI/SSE2/3DNOW!  NVIDIA GeForce 9300M GS/PCI/SSE2 +NVIDIA GeForce 9300M GS/PCI/SSE2  NVIDIA GeForce 9300M GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 9400  NVIDIA GeForce 9400 GT/PCI/SSE2 +NVIDIA GeForce 9400 GT/PCI/SSE2 +NVIDIA GeForce 9400 GT/PCI/SSE2/3DNOW!  NVIDIA GeForce 9400 GT/PCI/SSE2/3DNOW!  NVIDIA GeForce 9400/PCI/SSE2  NVIDIA GeForce 9400M  NVIDIA GeForce 9400M G/PCI/SSE2 +NVIDIA GeForce 9400M G/PCI/SSE2 +NVIDIA GeForce 9400M/PCI/SSE2  NVIDIA GeForce 9400M/PCI/SSE2  NVIDIA GeForce 9500  NVIDIA GeForce 9500 GS/PCI/SSE2 +NVIDIA GeForce 9500 GS/PCI/SSE2  NVIDIA GeForce 9500 GS/PCI/SSE2/3DNOW!  NVIDIA GeForce 9500 GT/PCI/SSE2 +NVIDIA GeForce 9500 GT/PCI/SSE2 +NVIDIA GeForce 9500 GT/PCI/SSE2/3DNOW!  NVIDIA GeForce 9500 GT/PCI/SSE2/3DNOW!  NVIDIA GeForce 9500M  NVIDIA GeForce 9500M GS/PCI/SSE2 +NVIDIA GeForce 9500M GS/PCI/SSE2  NVIDIA GeForce 9600  NVIDIA GeForce 9600 GS/PCI/SSE2  NVIDIA GeForce 9600 GSO 512/PCI/SSE2  NVIDIA GeForce 9600 GSO/PCI/SSE2  NVIDIA GeForce 9600 GSO/PCI/SSE2/3DNOW! +NVIDIA GeForce 9600 GSO/PCI/SSE2/3DNOW! +NVIDIA GeForce 9600 GT/PCI/SSE2  NVIDIA GeForce 9600 GT/PCI/SSE2  NVIDIA GeForce 9600 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 9600 GT/PCI/SSE2/3DNOW!  NVIDIA GeForce 9600M  NVIDIA GeForce 9600M GS/PCI/SSE2 +NVIDIA GeForce 9600M GS/PCI/SSE2 +NVIDIA GeForce 9600M GT/PCI/SSE2  NVIDIA GeForce 9600M GT/PCI/SSE2  NVIDIA GeForce 9650M GT/PCI/SSE2 +NVIDIA GeForce 9650M GT/PCI/SSE2  NVIDIA GeForce 9700M  NVIDIA GeForce 9700M GT/PCI/SSE2  NVIDIA GeForce 9700M GTS/PCI/SSE2 +NVIDIA GeForce 9700M GTS/PCI/SSE2  NVIDIA GeForce 9800  NVIDIA GeForce 9800 GT/PCI/SSE2 +NVIDIA GeForce 9800 GT/PCI/SSE2  NVIDIA GeForce 9800 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 9800 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 9800 GTX+/PCI/SSE2  NVIDIA GeForce 9800 GTX+/PCI/SSE2  NVIDIA GeForce 9800 GTX+/PCI/SSE2/3DNOW!  NVIDIA GeForce 9800 GTX/9800 GTX+/PCI/SSE2 +NVIDIA GeForce 9800 GTX/9800 GTX+/PCI/SSE2  NVIDIA GeForce 9800 GTX/PCI/SSE2  NVIDIA GeForce 9800 GX2/PCI/SSE2  NVIDIA GeForce 9800M  NVIDIA GeForce 9800M GS/PCI/SSE2 +NVIDIA GeForce 9800M GS/PCI/SSE2 +NVIDIA GeForce 9800M GT/PCI/SSE2  NVIDIA GeForce 9800M GT/PCI/SSE2  NVIDIA GeForce 9800M GTS/PCI/SSE2 +NVIDIA GeForce 9800M GTS/PCI/SSE2  NVIDIA GeForce FX 5100  NVIDIA GeForce FX 5100/AGP/SSE/3DNOW!  NVIDIA GeForce FX 5200  NVIDIA GeForce FX 5200/AGP/SSE  NVIDIA GeForce FX 5200/AGP/SSE/3DNOW! +NVIDIA GeForce FX 5200/AGP/SSE/3DNOW! +NVIDIA GeForce FX 5200/AGP/SSE2  NVIDIA GeForce FX 5200/AGP/SSE2  NVIDIA GeForce FX 5200/AGP/SSE2/3DNOW!  NVIDIA GeForce FX 5200/PCI/SSE2 @@ -1119,11 +1649,16 @@ NVIDIA GeForce FX 5200LE/AGP/SSE2  NVIDIA GeForce FX 5500  NVIDIA GeForce FX 5500/AGP/SSE/3DNOW!  NVIDIA GeForce FX 5500/AGP/SSE2 +NVIDIA GeForce FX 5500/AGP/SSE2 +NVIDIA GeForce FX 5500/AGP/SSE2/3DNOW!  NVIDIA GeForce FX 5500/AGP/SSE2/3DNOW!  NVIDIA GeForce FX 5500/PCI/SSE2 +NVIDIA GeForce FX 5500/PCI/SSE2 +NVIDIA GeForce FX 5500/PCI/SSE2/3DNOW!  NVIDIA GeForce FX 5500/PCI/SSE2/3DNOW!  NVIDIA GeForce FX 5600  NVIDIA GeForce FX 5600/AGP/SSE2 +NVIDIA GeForce FX 5600/AGP/SSE2  NVIDIA GeForce FX 5600/AGP/SSE2/3DNOW!  NVIDIA GeForce FX 5600XT/AGP/SSE2/3DNOW!  NVIDIA GeForce FX 5700 @@ -1138,136 +1673,239 @@ NVIDIA GeForce FX Go5100  NVIDIA GeForce FX Go5100/AGP/SSE2  NVIDIA GeForce FX Go5200  NVIDIA GeForce FX Go5200/AGP/SSE2 +NVIDIA GeForce FX Go5200/AGP/SSE2  NVIDIA GeForce FX Go5300  NVIDIA GeForce FX Go5600  NVIDIA GeForce FX Go5600/AGP/SSE2 +NVIDIA GeForce FX Go5600/AGP/SSE2  NVIDIA GeForce FX Go5650/AGP/SSE2  NVIDIA GeForce FX Go5700 +NVIDIA GeForce FX Go5700/AGP/SSE2 +NVIDIA GeForce FX Go5xxx/AGP/SSE2  NVIDIA GeForce FX Go5xxx/AGP/SSE2  NVIDIA GeForce G 103M/PCI/SSE2 +NVIDIA GeForce G 103M/PCI/SSE2 +NVIDIA GeForce G 103M/PCI/SSE2/3DNOW!  NVIDIA GeForce G 105M/PCI/SSE2 +NVIDIA GeForce G 105M/PCI/SSE2 +NVIDIA GeForce G 110M/PCI/SSE2  NVIDIA GeForce G 110M/PCI/SSE2  NVIDIA GeForce G100/PCI/SSE2 +NVIDIA GeForce G100/PCI/SSE2 +NVIDIA GeForce G100/PCI/SSE2/3DNOW!  NVIDIA GeForce G100/PCI/SSE2/3DNOW!  NVIDIA GeForce G102M/PCI/SSE2 +NVIDIA GeForce G102M/PCI/SSE2  NVIDIA GeForce G105M/PCI/SSE2 +NVIDIA GeForce G105M/PCI/SSE2 +NVIDIA GeForce G200/PCI/SSE2  NVIDIA GeForce G200/PCI/SSE2  NVIDIA GeForce G205M/PCI/SSE2 +NVIDIA GeForce G205M/PCI/SSE2  NVIDIA GeForce G210/PCI/SSE2 +NVIDIA GeForce G210/PCI/SSE2 +NVIDIA GeForce G210/PCI/SSE2/3DNOW!  NVIDIA GeForce G210/PCI/SSE2/3DNOW!  NVIDIA GeForce G210M/PCI/SSE2 +NVIDIA GeForce G210M/PCI/SSE2  NVIDIA GeForce G310M/PCI/SSE2  NVIDIA GeForce GT 120/PCI/SSE2 +NVIDIA GeForce GT 120/PCI/SSE2  NVIDIA GeForce GT 120/PCI/SSE2/3DNOW!  NVIDIA GeForce GT 120M/PCI/SSE2  NVIDIA GeForce GT 130M/PCI/SSE2 +NVIDIA GeForce GT 130M/PCI/SSE2  NVIDIA GeForce GT 140/PCI/SSE2 +NVIDIA GeForce GT 140/PCI/SSE2 +NVIDIA GeForce GT 220/PCI/SSE2  NVIDIA GeForce GT 220/PCI/SSE2  NVIDIA GeForce GT 220/PCI/SSE2/3DNOW! +NVIDIA GeForce GT 220/PCI/SSE2/3DNOW!  NVIDIA GeForce GT 220M/PCI/SSE2 +NVIDIA GeForce GT 220M/PCI/SSE2 +NVIDIA GeForce GT 230/PCI/SSE2  NVIDIA GeForce GT 230/PCI/SSE2  NVIDIA GeForce GT 230M/PCI/SSE2 +NVIDIA GeForce GT 230M/PCI/SSE2  NVIDIA GeForce GT 240  NVIDIA GeForce GT 240/PCI/SSE2 +NVIDIA GeForce GT 240/PCI/SSE2 +NVIDIA GeForce GT 240/PCI/SSE2/3DNOW!  NVIDIA GeForce GT 240/PCI/SSE2/3DNOW!  NVIDIA GeForce GT 240M/PCI/SSE2 +NVIDIA GeForce GT 240M/PCI/SSE2  NVIDIA GeForce GT 320/PCI/SSE2  NVIDIA GeForce GT 320M/PCI/SSE2 +NVIDIA GeForce GT 320M/PCI/SSE2  NVIDIA GeForce GT 325M/PCI/SSE2  NVIDIA GeForce GT 330/PCI/SSE2 +NVIDIA GeForce GT 330/PCI/SSE2  NVIDIA GeForce GT 330/PCI/SSE2/3DNOW!  NVIDIA GeForce GT 330M/PCI/SSE2 +NVIDIA GeForce GT 330M/PCI/SSE2 +NVIDIA GeForce GT 335M/PCI/SSE2  NVIDIA GeForce GT 335M/PCI/SSE2  NVIDIA GeForce GT 340/PCI/SSE2 +NVIDIA GeForce GT 340/PCI/SSE2  NVIDIA GeForce GT 340/PCI/SSE2/3DNOW! +NVIDIA GeForce GT 340/PCI/SSE2/3DNOW! +NVIDIA GeForce GT 415M/PCI/SSE2  NVIDIA GeForce GT 415M/PCI/SSE2  NVIDIA GeForce GT 420/PCI/SSE2 +NVIDIA GeForce GT 420/PCI/SSE2  NVIDIA GeForce GT 420M/PCI/SSE2 +NVIDIA GeForce GT 420M/PCI/SSE2 +NVIDIA GeForce GT 425M/PCI/SSE2  NVIDIA GeForce GT 425M/PCI/SSE2  NVIDIA GeForce GT 430/PCI/SSE2 +NVIDIA GeForce GT 430/PCI/SSE2  NVIDIA GeForce GT 430/PCI/SSE2/3DNOW! +NVIDIA GeForce GT 430/PCI/SSE2/3DNOW! +NVIDIA GeForce GT 435M/PCI/SSE2  NVIDIA GeForce GT 435M/PCI/SSE2  NVIDIA GeForce GT 440/PCI/SSE2 +NVIDIA GeForce GT 440/PCI/SSE2 +NVIDIA GeForce GT 440/PCI/SSE2/3DNOW!  NVIDIA GeForce GT 440/PCI/SSE2/3DNOW!  NVIDIA GeForce GT 445M/PCI/SSE2 +NVIDIA GeForce GT 445M/PCI/SSE2 +NVIDIA GeForce GT 520/PCI/SSE2 +NVIDIA GeForce GT 520/PCI/SSE2/3DNOW!  NVIDIA GeForce GT 520M/PCI/SSE2 +NVIDIA GeForce GT 520M/PCI/SSE2 +NVIDIA GeForce GT 525M/PCI/SSE2  NVIDIA GeForce GT 525M/PCI/SSE2 +NVIDIA GeForce GT 530/PCI/SSE2 +NVIDIA GeForce GT 530/PCI/SSE2/3DNOW! +NVIDIA GeForce GT 540M/PCI/SSE2  NVIDIA GeForce GT 540M/PCI/SSE2 +NVIDIA GeForce GT 545/PCI/SSE2  NVIDIA GeForce GT 550M/PCI/SSE2 +NVIDIA GeForce GT 550M/PCI/SSE2 +NVIDIA GeForce GT 555M/PCI/SSE2  NVIDIA GeForce GT 555M/PCI/SSE2  NVIDIA GeForce GTS 150/PCI/SSE2 +NVIDIA GeForce GTS 150/PCI/SSE2  NVIDIA GeForce GTS 160M/PCI/SSE2 +NVIDIA GeForce GTS 160M/PCI/SSE2 +NVIDIA GeForce GTS 240/PCI/SSE2  NVIDIA GeForce GTS 240/PCI/SSE2  NVIDIA GeForce GTS 250/PCI/SSE2 +NVIDIA GeForce GTS 250/PCI/SSE2 +NVIDIA GeForce GTS 250/PCI/SSE2/3DNOW!  NVIDIA GeForce GTS 250/PCI/SSE2/3DNOW!  NVIDIA GeForce GTS 250M/PCI/SSE2  NVIDIA GeForce GTS 350M/PCI/SSE2 +NVIDIA GeForce GTS 350M/PCI/SSE2  NVIDIA GeForce GTS 360M/PCI/SSE2 +NVIDIA GeForce GTS 360M/PCI/SSE2 +NVIDIA GeForce GTS 450/PCI/SSE2  NVIDIA GeForce GTS 450/PCI/SSE2  NVIDIA GeForce GTS 450/PCI/SSE2/3DNOW! +NVIDIA GeForce GTS 450/PCI/SSE2/3DNOW!  NVIDIA GeForce GTS 455/PCI/SSE2  NVIDIA GeForce GTX 260/PCI/SSE2 +NVIDIA GeForce GTX 260/PCI/SSE2 +NVIDIA GeForce GTX 260/PCI/SSE2/3DNOW!  NVIDIA GeForce GTX 260/PCI/SSE2/3DNOW!  NVIDIA GeForce GTX 260M/PCI/SSE2 +NVIDIA GeForce GTX 260M/PCI/SSE2 +NVIDIA GeForce GTX 275/PCI/SSE2  NVIDIA GeForce GTX 275/PCI/SSE2 +NVIDIA GeForce GTX 275/PCI/SSE2/3DNOW!  NVIDIA GeForce GTX 280  NVIDIA GeForce GTX 280/PCI/SSE2  NVIDIA GeForce GTX 280M/PCI/SSE2 +NVIDIA GeForce GTX 285  NVIDIA GeForce GTX 285/PCI/SSE2 +NVIDIA GeForce GTX 285/PCI/SSE2 +NVIDIA GeForce GTX 285/PCI/SSE2 +NVIDIA GeForce GTX 295/PCI/SSE2  NVIDIA GeForce GTX 295/PCI/SSE2  NVIDIA GeForce GTX 460 SE/PCI/SSE2 +NVIDIA GeForce GTX 460 SE/PCI/SSE2 +NVIDIA GeForce GTX 460 SE/PCI/SSE2/3DNOW!  NVIDIA GeForce GTX 460 SE/PCI/SSE2/3DNOW!  NVIDIA GeForce GTX 460/PCI/SSE2 +NVIDIA GeForce GTX 460/PCI/SSE2  NVIDIA GeForce GTX 460/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 460/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 460M/PCI/SSE2  NVIDIA GeForce GTX 460M/PCI/SSE2  NVIDIA GeForce GTX 465/PCI/SSE2 +NVIDIA GeForce GTX 465/PCI/SSE2  NVIDIA GeForce GTX 465/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 465/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 470/PCI/SSE2  NVIDIA GeForce GTX 470/PCI/SSE2  NVIDIA GeForce GTX 470/PCI/SSE2/3DNOW!  NVIDIA GeForce GTX 480/PCI/SSE2  NVIDIA GeForce GTX 550 Ti/PCI/SSE2 +NVIDIA GeForce GTX 550 Ti/PCI/SSE2 +NVIDIA GeForce GTX 550 Ti/PCI/SSE2/3DNOW!  NVIDIA GeForce GTX 550 Ti/PCI/SSE2/3DNOW!  NVIDIA GeForce GTX 560 Ti/PCI/SSE2 +NVIDIA GeForce GTX 560 Ti/PCI/SSE2  NVIDIA GeForce GTX 560 Ti/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 560 Ti/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 560/PCI/SSE2  NVIDIA GeForce GTX 560/PCI/SSE2 +NVIDIA GeForce GTX 560/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 560M/PCI/SSE2 +NVIDIA GeForce GTX 570/PCI/SSE2  NVIDIA GeForce GTX 570/PCI/SSE2  NVIDIA GeForce GTX 570/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 570/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 580/PCI/SSE2  NVIDIA GeForce GTX 580/PCI/SSE2  NVIDIA GeForce GTX 580/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 580/PCI/SSE2/3DNOW!  NVIDIA GeForce GTX 580M/PCI/SSE2  NVIDIA GeForce GTX 590/PCI/SSE2 +NVIDIA GeForce GTX 590/PCI/SSE2  NVIDIA GeForce Go 6  NVIDIA GeForce Go 6100  NVIDIA GeForce Go 6100/PCI/SSE2  NVIDIA GeForce Go 6100/PCI/SSE2/3DNOW! +NVIDIA GeForce Go 6100/PCI/SSE2/3DNOW!  NVIDIA GeForce Go 6150/PCI/SSE2  NVIDIA GeForce Go 6150/PCI/SSE2/3DNOW! +NVIDIA GeForce Go 6150/PCI/SSE2/3DNOW!  NVIDIA GeForce Go 6200  NVIDIA GeForce Go 6200/PCI/SSE2  NVIDIA GeForce Go 6400  NVIDIA GeForce Go 6400/PCI/SSE2 +NVIDIA GeForce Go 6400/PCI/SSE2  NVIDIA GeForce Go 6600  NVIDIA GeForce Go 6600/PCI/SSE2 +NVIDIA GeForce Go 6600/PCI/SSE2  NVIDIA GeForce Go 6800  NVIDIA GeForce Go 6800 Ultra/PCI/SSE2 +NVIDIA GeForce Go 6800 Ultra/PCI/SSE2  NVIDIA GeForce Go 6800/PCI/SSE2  NVIDIA GeForce Go 7200  NVIDIA GeForce Go 7200/PCI/SSE2  NVIDIA GeForce Go 7200/PCI/SSE2/3DNOW!  NVIDIA GeForce Go 7300  NVIDIA GeForce Go 7300/PCI/SSE2 +NVIDIA GeForce Go 7300/PCI/SSE2  NVIDIA GeForce Go 7300/PCI/SSE2/3DNOW!  NVIDIA GeForce Go 7400  NVIDIA GeForce Go 7400/PCI/SSE2 +NVIDIA GeForce Go 7400/PCI/SSE2  NVIDIA GeForce Go 7400/PCI/SSE2/3DNOW!  NVIDIA GeForce Go 7600  NVIDIA GeForce Go 7600/PCI/SSE2 +NVIDIA GeForce Go 7600/PCI/SSE2 +NVIDIA GeForce Go 7600/PCI/SSE2/3DNOW!  NVIDIA GeForce Go 7600/PCI/SSE2/3DNOW!  NVIDIA GeForce Go 7700 +NVIDIA GeForce Go 7700/PCI/SSE2  NVIDIA GeForce Go 7800  NVIDIA GeForce Go 7800 GTX/PCI/SSE2  NVIDIA GeForce Go 7900  NVIDIA GeForce Go 7900 GS/PCI/SSE2 +NVIDIA GeForce Go 7900 GS/PCI/SSE2  NVIDIA GeForce Go 7900 GTX/PCI/SSE2  NVIDIA GeForce Go 7950 GTX/PCI/SSE2  NVIDIA GeForce PCX @@ -1275,15 +1913,20 @@ NVIDIA GeForce2 GTS/AGP/SSE  NVIDIA GeForce2 MX/AGP/3DNOW!  NVIDIA GeForce2 MX/AGP/SSE/3DNOW!  NVIDIA GeForce2 MX/AGP/SSE2 +NVIDIA GeForce2 MX/AGP/SSE2  NVIDIA GeForce2 MX/PCI/SSE2  NVIDIA GeForce3/AGP/SSE/3DNOW!  NVIDIA GeForce3/AGP/SSE2  NVIDIA GeForce4 420 Go 32M/AGP/SSE2  NVIDIA GeForce4 420 Go 32M/AGP/SSE2/3DNOW!  NVIDIA GeForce4 420 Go 32M/PCI/SSE2/3DNOW! +NVIDIA GeForce4 420 Go/AGP/SSE2  NVIDIA GeForce4 440 Go 64M/AGP/SSE2/3DNOW! +NVIDIA GeForce4 440 Go/AGP/SSE2  NVIDIA GeForce4 460 Go/AGP/SSE2  NVIDIA GeForce4 MX 4000/AGP/SSE/3DNOW! +NVIDIA GeForce4 MX 4000/AGP/SSE/3DNOW! +NVIDIA GeForce4 MX 4000/AGP/SSE2  NVIDIA GeForce4 MX 4000/AGP/SSE2  NVIDIA GeForce4 MX 4000/PCI/3DNOW!  NVIDIA GeForce4 MX 4000/PCI/SSE/3DNOW! @@ -1291,97 +1934,161 @@ NVIDIA GeForce4 MX 4000/PCI/SSE2  NVIDIA GeForce4 MX 420/AGP/SSE/3DNOW!  NVIDIA GeForce4 MX 420/AGP/SSE2  NVIDIA GeForce4 MX 440 with AGP8X/AGP/SSE2 +NVIDIA GeForce4 MX 440 with AGP8X/AGP/SSE2 +NVIDIA GeForce4 MX 440/AGP/SSE2  NVIDIA GeForce4 MX 440/AGP/SSE2  NVIDIA GeForce4 MX 440/AGP/SSE2/3DNOW!  NVIDIA GeForce4 MX 440SE with AGP8X/AGP/SSE2 +NVIDIA GeForce4 MX 440SE with AGP8X/AGP/SSE2 +NVIDIA GeForce4 MX Integrated GPU/AGP/SSE/3DNOW!  NVIDIA GeForce4 MX Integrated GPU/AGP/SSE/3DNOW!  NVIDIA GeForce4 Ti 4200 with AGP8X/AGP/SSE  NVIDIA GeForce4 Ti 4200/AGP/SSE/3DNOW!  NVIDIA GeForce4 Ti 4400/AGP/SSE2  NVIDIA Generic  NVIDIA ION LE/PCI/SSE2 +NVIDIA ION LE/PCI/SSE2  NVIDIA ION/PCI/SSE2 +NVIDIA ION/PCI/SSE2 +NVIDIA ION/PCI/SSE2/3DNOW!  NVIDIA ION/PCI/SSE2/3DNOW!  NVIDIA MCP61/PCI/SSE2 +NVIDIA MCP61/PCI/SSE2  NVIDIA MCP61/PCI/SSE2/3DNOW! +NVIDIA MCP61/PCI/SSE2/3DNOW! +NVIDIA MCP73/PCI/SSE2  NVIDIA MCP73/PCI/SSE2  NVIDIA MCP79MH/PCI/SSE2 +NVIDIA MCP79MH/PCI/SSE2 +NVIDIA MCP79MX/PCI/SSE2  NVIDIA MCP79MX/PCI/SSE2  NVIDIA MCP7A-O/PCI/SSE2 +NVIDIA MCP7A-O/PCI/SSE2  NVIDIA MCP7A-S/PCI/SSE2  NVIDIA MCP89-EPT/PCI/SSE2 +NVIDIA MCP89-EPT/PCI/SSE2 +NVIDIA N10M-GE1/PCI/SSE2  NVIDIA N10M-GE1/PCI/SSE2  NVIDIA N10P-GE1/PCI/SSE2 +NVIDIA N10P-GE1/PCI/SSE2  NVIDIA N10P-GV2/PCI/SSE2 +NVIDIA N10P-GV2/PCI/SSE2 +NVIDIA N11M-GE1/PCI/SSE2  NVIDIA N11M-GE1/PCI/SSE2  NVIDIA N11M-GE2/PCI/SSE2 +NVIDIA N11M-GE2/PCI/SSE2  NVIDIA N12E-GS-A1/PCI/SSE2 +NVIDIA N12P-GVR-B-A1/PCI/SSE2 +NVIDIA N13M-GE1-B-A1/PCI/SSE2 +NVIDIA N13P-GL-A1/PCI/SSE2  NVIDIA NB9M-GE/PCI/SSE2 +NVIDIA NB9M-GE/PCI/SSE2 +NVIDIA NB9M-GE1/PCI/SSE2  NVIDIA NB9M-GE1/PCI/SSE2  NVIDIA NB9M-GS/PCI/SSE2 +NVIDIA NB9M-GS/PCI/SSE2 +NVIDIA NB9M-NS/PCI/SSE2  NVIDIA NB9M-NS/PCI/SSE2  NVIDIA NB9P-GE1/PCI/SSE2 +NVIDIA NB9P-GE1/PCI/SSE2  NVIDIA NB9P-GS/PCI/SSE2  NVIDIA NV17/AGP/3DNOW!  NVIDIA NV17/AGP/SSE2 +NVIDIA NV17/AGP/SSE2  NVIDIA NV34  NVIDIA NV35  NVIDIA NV36/AGP/SSE/3DNOW!  NVIDIA NV36/AGP/SSE2  NVIDIA NV41/PCI/SSE2  NVIDIA NV43 +NVIDIA NV43/PCI/SSE2  NVIDIA NV44 +NVIDIA NV44/AGP/SSE2 +NVIDIA NVIDIA GeForce 210 OpenGL Engine  NVIDIA NVIDIA GeForce 210 OpenGL Engine  NVIDIA NVIDIA GeForce 320M OpenGL Engine +NVIDIA NVIDIA GeForce 320M OpenGL Engine +NVIDIA NVIDIA GeForce 7300 GT OpenGL Engine  NVIDIA NVIDIA GeForce 7300 GT OpenGL Engine  NVIDIA NVIDIA GeForce 7600 GT OpenGL Engine  NVIDIA NVIDIA GeForce 8600M GT OpenGL Engine +NVIDIA NVIDIA GeForce 8600M GT OpenGL Engine +NVIDIA NVIDIA GeForce 8800 GS OpenGL Engine  NVIDIA NVIDIA GeForce 8800 GS OpenGL Engine  NVIDIA NVIDIA GeForce 8800 GT OpenGL Engine +NVIDIA NVIDIA GeForce 8800 GT OpenGL Engine +NVIDIA NVIDIA GeForce 9400 OpenGL Engine  NVIDIA NVIDIA GeForce 9400 OpenGL Engine  NVIDIA NVIDIA GeForce 9400M OpenGL Engine +NVIDIA NVIDIA GeForce 9400M OpenGL Engine  NVIDIA NVIDIA GeForce 9500 GT OpenGL Engine  NVIDIA NVIDIA GeForce 9600M GT OpenGL Engine +NVIDIA NVIDIA GeForce 9600M GT OpenGL Engine +NVIDIA NVIDIA GeForce GT 120 OpenGL Engine  NVIDIA NVIDIA GeForce GT 120 OpenGL Engine  NVIDIA NVIDIA GeForce GT 130 OpenGL Engine +NVIDIA NVIDIA GeForce GT 130 OpenGL Engine  NVIDIA NVIDIA GeForce GT 220 OpenGL Engine  NVIDIA NVIDIA GeForce GT 230M OpenGL Engine  NVIDIA NVIDIA GeForce GT 240M OpenGL Engine  NVIDIA NVIDIA GeForce GT 330M OpenGL Engine +NVIDIA NVIDIA GeForce GT 330M OpenGL Engine  NVIDIA NVIDIA GeForce GT 420M OpenGL Engine  NVIDIA NVIDIA GeForce GT 425M OpenGL Engine  NVIDIA NVIDIA GeForce GT 430 OpenGL Engine +NVIDIA NVIDIA GeForce GT 430 OpenGL Engine  NVIDIA NVIDIA GeForce GT 440 OpenGL Engine  NVIDIA NVIDIA GeForce GT 540M OpenGL Engine  NVIDIA NVIDIA GeForce GTS 240 OpenGL Engine  NVIDIA NVIDIA GeForce GTS 250 OpenGL Engine +NVIDIA NVIDIA GeForce GTS 250 OpenGL Engine +NVIDIA NVIDIA GeForce GTS 450 OpenGL Engine  NVIDIA NVIDIA GeForce GTS 450 OpenGL Engine  NVIDIA NVIDIA GeForce GTX 285 OpenGL Engine  NVIDIA NVIDIA GeForce GTX 460 OpenGL Engine +NVIDIA NVIDIA GeForce GTX 460 OpenGL Engine  NVIDIA NVIDIA GeForce GTX 460M OpenGL Engine  NVIDIA NVIDIA GeForce GTX 465 OpenGL Engine  NVIDIA NVIDIA GeForce GTX 470 OpenGL Engine  NVIDIA NVIDIA GeForce GTX 480 OpenGL Engine +NVIDIA NVIDIA GeForce GTX 480 OpenGL Engine +NVIDIA NVIDIA GeForce Pre-Release GF108 ES OpenGL Engine +NVIDIA NVIDIA GeForce Pre-Release ION OpenGL Engine  NVIDIA NVIDIA GeForce Pre-Release ION OpenGL Engine +NVIDIA NVIDIA GeForce Pre-Release MCP7A-J-DC OpenGL Engine  NVIDIA NVIDIA GeForce4 OpenGL Engine  NVIDIA NVIDIA NV34MAP OpenGL Engine  NVIDIA NVIDIA Quadro 4000 OpenGL Engine +NVIDIA NVIDIA Quadro 4000 OpenGL Engine  NVIDIA NVIDIA Quadro FX 4800 OpenGL Engine  NVIDIA NVS 2100M/PCI/SSE2 +NVIDIA NVS 2100M/PCI/SSE2 +NVIDIA NVS 300/PCI/SSE2  NVIDIA NVS 300/PCI/SSE2  NVIDIA NVS 3100M/PCI/SSE2 +NVIDIA NVS 3100M/PCI/SSE2  NVIDIA NVS 4100/PCI/SSE2/3DNOW!  NVIDIA NVS 4200M/PCI/SSE2 +NVIDIA NVS 4200M/PCI/SSE2 +NVIDIA NVS 5100M/PCI/SSE2  NVIDIA NVS 5100M/PCI/SSE2  NVIDIA PCI +NVIDIA Quadro 1000M/PCI/SSE2 +NVIDIA Quadro 2000/PCI/SSE2  NVIDIA Quadro 2000/PCI/SSE2 +NVIDIA Quadro 2000M/PCI/SSE2 +NVIDIA Quadro 3000M/PCI/SSE2  NVIDIA Quadro 4000  NVIDIA Quadro 4000 OpenGL Engine  NVIDIA Quadro 4000/PCI/SSE2 +NVIDIA Quadro 4000/PCI/SSE2 +NVIDIA Quadro 4000M/PCI/SSE2 +NVIDIA Quadro 5000/PCI/SSE2  NVIDIA Quadro 5000/PCI/SSE2  NVIDIA Quadro 5000M/PCI/SSE2  NVIDIA Quadro 600  NVIDIA Quadro 600/PCI/SSE2 +NVIDIA Quadro 600/PCI/SSE2  NVIDIA Quadro 600/PCI/SSE2/3DNOW!  NVIDIA Quadro 6000  NVIDIA Quadro 6000/PCI/SSE2 @@ -1390,16 +2097,22 @@ NVIDIA Quadro DCC  NVIDIA Quadro FX  NVIDIA Quadro FX 1100/AGP/SSE2  NVIDIA Quadro FX 1400/PCI/SSE2 +NVIDIA Quadro FX 1400/PCI/SSE2  NVIDIA Quadro FX 1500 +NVIDIA Quadro FX 1500/PCI/SSE2  NVIDIA Quadro FX 1500M/PCI/SSE2  NVIDIA Quadro FX 1600M/PCI/SSE2 +NVIDIA Quadro FX 1600M/PCI/SSE2  NVIDIA Quadro FX 1700  NVIDIA Quadro FX 1700M/PCI/SSE2  NVIDIA Quadro FX 1800  NVIDIA Quadro FX 1800/PCI/SSE2  NVIDIA Quadro FX 1800M/PCI/SSE2  NVIDIA Quadro FX 2500M/PCI/SSE2 +NVIDIA Quadro FX 2500M/PCI/SSE2  NVIDIA Quadro FX 2700M/PCI/SSE2 +NVIDIA Quadro FX 2700M/PCI/SSE2 +NVIDIA Quadro FX 2800M/PCI/SSE2  NVIDIA Quadro FX 2800M/PCI/SSE2  NVIDIA Quadro FX 3400  NVIDIA Quadro FX 3450 @@ -1411,75 +2124,125 @@ NVIDIA Quadro FX 370  NVIDIA Quadro FX 370/PCI/SSE2  NVIDIA Quadro FX 3700  NVIDIA Quadro FX 3700M/PCI/SSE2 +NVIDIA Quadro FX 3700M/PCI/SSE2  NVIDIA Quadro FX 370M/PCI/SSE2  NVIDIA Quadro FX 3800  NVIDIA Quadro FX 3800M/PCI/SSE2 +NVIDIA Quadro FX 3800M/PCI/SSE2  NVIDIA Quadro FX 4500  NVIDIA Quadro FX 4600  NVIDIA Quadro FX 4800  NVIDIA Quadro FX 4800/PCI/SSE2 +NVIDIA Quadro FX 540/PCI/SSE2/3DNOW!  NVIDIA Quadro FX 560 +NVIDIA Quadro FX 560/PCI/SSE2  NVIDIA Quadro FX 5600  NVIDIA Quadro FX 570  NVIDIA Quadro FX 570/PCI/SSE2  NVIDIA Quadro FX 570M/PCI/SSE2  NVIDIA Quadro FX 580/PCI/SSE2 +NVIDIA Quadro FX 580/PCI/SSE2 +NVIDIA Quadro FX 770M/PCI/SSE2  NVIDIA Quadro FX 770M/PCI/SSE2  NVIDIA Quadro FX 880M  NVIDIA Quadro FX 880M/PCI/SSE2 +NVIDIA Quadro FX 880M/PCI/SSE2  NVIDIA Quadro FX Go700/AGP/SSE2  NVIDIA Quadro NVS  NVIDIA Quadro NVS 110M/PCI/SSE2 +NVIDIA Quadro NVS 110M/PCI/SSE2  NVIDIA Quadro NVS 130M/PCI/SSE2  NVIDIA Quadro NVS 135M/PCI/SSE2 +NVIDIA Quadro NVS 135M/PCI/SSE2 +NVIDIA Quadro NVS 140M/PCI/SSE2  NVIDIA Quadro NVS 140M/PCI/SSE2  NVIDIA Quadro NVS 150M/PCI/SSE2 +NVIDIA Quadro NVS 150M/PCI/SSE2 +NVIDIA Quadro NVS 160M/PCI/SSE2  NVIDIA Quadro NVS 160M/PCI/SSE2  NVIDIA Quadro NVS 210S/PCI/SSE2/3DNOW!  NVIDIA Quadro NVS 285/PCI/SSE2 +NVIDIA Quadro NVS 285/PCI/SSE2 +NVIDIA Quadro NVS 290/PCI/SSE2  NVIDIA Quadro NVS 290/PCI/SSE2  NVIDIA Quadro NVS 295/PCI/SSE2  NVIDIA Quadro NVS 320M/PCI/SSE2 +NVIDIA Quadro NVS 320M/PCI/SSE2  NVIDIA Quadro NVS 55/280 PCI/PCI/SSE2  NVIDIA Quadro NVS/PCI/SSE2  NVIDIA Quadro PCI-E Series/PCI/SSE2/3DNOW!  NVIDIA Quadro VX 200/PCI/SSE2 +NVIDIA Quadro VX 200/PCI/SSE2 +NVIDIA Quadro/AGP/SSE2  NVIDIA Quadro/AGP/SSE2  NVIDIA Quadro2  NVIDIA Quadro4 +NVIDIA Quadro4 750 XGL/AGP/SSE2  NVIDIA RIVA TNT  NVIDIA RIVA TNT2/AGP/SSE2  NVIDIA RIVA TNT2/PCI/3DNOW! +NVIDIA Tesla C2050/PCI/SSE2  NVIDIA nForce +NVIDIA nForce 730a/PCI/SSE2 +NVIDIA nForce 730a/PCI/SSE2/3DNOW! +NVIDIA nForce 750a SLI/PCI/SSE2 +NVIDIA nForce 750a SLI/PCI/SSE2/3DNOW! +NVIDIA nForce 760i SLI/PCI/SSE2 +NVIDIA nForce 780a SLI/PCI/SSE2/3DNOW! +NVIDIA nForce 980a/780a SLI/PCI/SSE2 +NVIDIA nForce 980a/780a SLI/PCI/SSE2/3DNOW!  NVIDIA unknown board/AGP/SSE2  NVIDIA unknown board/PCI/SSE2  NVIDIA unknown board/PCI/SSE2/3DNOW!  Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine  Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine  Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6490M OpenGL Engine  Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6490M OpenGL Engine  Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6770M OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine  Parallels and Intel Inc. 3D-Analyze v2.3 - http://www.tommti-systems.com  Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine +Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine +Parallels and NVIDIA Parallels using NVIDIA GeForce 320M OpenGL Engine  Parallels and NVIDIA Parallels using NVIDIA GeForce 320M OpenGL Engine  Parallels and NVIDIA Parallels using NVIDIA GeForce 9400 OpenGL Engine  Parallels and NVIDIA Parallels using NVIDIA GeForce GT 120 OpenGL Engine +Parallels and NVIDIA Parallels using NVIDIA GeForce GT 120 OpenGL Engine +Parallels and NVIDIA Parallels using NVIDIA GeForce GT 330M OpenGL Engine  Parallels and NVIDIA Parallels using NVIDIA GeForce GT 330M OpenGL Engine  Radeon RV350 on Gallium  S3 +S3 Fire GL2  S3 Graphics VIA/S3G UniChrome IGP/MMX/K3D +S3 Graphics VIA/S3G UniChrome IGP/MMX/SSE +S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE  S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE  S3 Graphics, Incorporated ProSavage/Twister  S3 Graphics, Incorporated S3 Graphics Chrome9 HC +S3 Graphics, Incorporated S3 Graphics Chrome9 HC  S3 Graphics, Incorporated S3 Graphics DeltaChrome +S3 Graphics, Incorporated S3 Graphics DeltaChrome +S3 Graphics, Incorporated VIA Chrome9 HC IGP  S3 Graphics, Incorporated VIA Chrome9 HC IGP  SiS +SiS 650/M650 VGA +SiS 661 VGA  SiS 661 VGA  SiS 662 VGA  SiS 741 VGA  SiS 760 VGA +SiS 760 VGA +SiS 761GX VGA  SiS 761GX VGA  SiS Mirage Graphics3 +SiS Mirage Graphics3 +SiS Xabre VGA  Trident  Tungsten Graphics  Tungsten Graphics, Inc Mesa DRI 865G GEM 20091221 2009Q4 x86/MMX/SSE2 @@ -1489,6 +2252,7 @@ Tungsten Graphics, Inc Mesa DRI 915G GEM 20100330 DEVELOPMENT x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI 915GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI 915GM GEM 20091221 2009Q4 x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI 915GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 915GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI 945G  Tungsten Graphics, Inc Mesa DRI 945G GEM 20091221 2009Q4 x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT @@ -1497,18 +2261,23 @@ Tungsten Graphics, Inc Mesa DRI 945GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI 945GM GEM 20091221 2009Q4 x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100328 2010Q1 x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI 945GME  x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI 945GME 20061017  Tungsten Graphics, Inc Mesa DRI 945GME GEM 20090712 2009Q2 RC3 x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI 945GME GEM 20091221 2009Q4 x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI 945GME GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 945GME GEM 20100330 DEVELOPMENT x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090326 2009Q1 RC2 x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI 965GM GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 965GM GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 965GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI 965GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI G33 20061017 x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI G33 GEM 20090712 2009Q2 RC3 x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI G33 GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI G33 GEM 20091221 2009Q4 x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI G41 GEM 20091221 2009Q4 x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI G41 GEM 20100330 DEVELOPMENT x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI GMA500 20081116 - 5.0.1.0046 x86/MMX/SSE2 @@ -1518,44 +2287,83 @@ Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI IGDNG_D GEM 20091221 2009Q4 x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI Ironlake Desktop GEM 20100330 DEVELOPMENT x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI Ironlake Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset  Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset 20080716 x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20090712 2009Q2 RC3 x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2  Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100328 2010Q1  Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT  Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc. Mesa DRI R200 (RV250 4C66) 20090101 x86/MMX/SSE2 TCL DRI2  Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5964) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2  VIA  VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE; +VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE; +VMware, Inc. Gallium 0.4 on SVGA3D; build: DEBUG; mutex: MSVC Intrinsics +VMware, Inc. Gallium 0.4 on SVGA3D; build: RELEASE; +VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM)  VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM)  VMware, Inc. Gallium 0.4 on llvmpipe +VMware, Inc. Gallium 0.4 on llvmpipe +VMware, Inc. Gallium 0.4 on softpipe  VMware, Inc. Gallium 0.4 on softpipe  X.Org Gallium 0.4 on AMD BARTS +X.Org Gallium 0.4 on AMD BARTS +X.Org Gallium 0.4 on AMD CEDAR  X.Org Gallium 0.4 on AMD CEDAR  X.Org Gallium 0.4 on AMD HEMLOCK  X.Org Gallium 0.4 on AMD JUNIPER +X.Org Gallium 0.4 on AMD JUNIPER +X.Org Gallium 0.4 on AMD PALM +X.Org Gallium 0.4 on AMD REDWOOD  X.Org Gallium 0.4 on AMD REDWOOD  X.Org Gallium 0.4 on AMD RS780 +X.Org Gallium 0.4 on AMD RS780 +X.Org Gallium 0.4 on AMD RS880  X.Org Gallium 0.4 on AMD RS880  X.Org Gallium 0.4 on AMD RV610 +X.Org Gallium 0.4 on AMD RV610 +X.Org Gallium 0.4 on AMD RV620  X.Org Gallium 0.4 on AMD RV620  X.Org Gallium 0.4 on AMD RV630 +X.Org Gallium 0.4 on AMD RV630  X.Org Gallium 0.4 on AMD RV635 +X.Org Gallium 0.4 on AMD RV635 +X.Org Gallium 0.4 on AMD RV710  X.Org Gallium 0.4 on AMD RV710  X.Org Gallium 0.4 on AMD RV730 +X.Org Gallium 0.4 on AMD RV730 +X.Org Gallium 0.4 on AMD RV740  X.Org Gallium 0.4 on AMD RV740  X.Org Gallium 0.4 on AMD RV770  X.Org R300 Project Gallium 0.4 on ATI R300 +X.Org R300 Project Gallium 0.4 on ATI R350 +X.Org R300 Project Gallium 0.4 on ATI R420 +X.Org R300 Project Gallium 0.4 on ATI R580  X.Org R300 Project Gallium 0.4 on ATI R580  X.Org R300 Project Gallium 0.4 on ATI RC410 +X.Org R300 Project Gallium 0.4 on ATI RC410 +X.Org R300 Project Gallium 0.4 on ATI RS480 +X.Org R300 Project Gallium 0.4 on ATI RS482  X.Org R300 Project Gallium 0.4 on ATI RS482  X.Org R300 Project Gallium 0.4 on ATI RS600  X.Org R300 Project Gallium 0.4 on ATI RS690 +X.Org R300 Project Gallium 0.4 on ATI RS690 +X.Org R300 Project Gallium 0.4 on ATI RS740  X.Org R300 Project Gallium 0.4 on ATI RV350 +X.Org R300 Project Gallium 0.4 on ATI RV350 +X.Org R300 Project Gallium 0.4 on ATI RV370  X.Org R300 Project Gallium 0.4 on ATI RV370  X.Org R300 Project Gallium 0.4 on ATI RV410 +X.Org R300 Project Gallium 0.4 on ATI RV410  X.Org R300 Project Gallium 0.4 on ATI RV515 +X.Org R300 Project Gallium 0.4 on ATI RV515 +X.Org R300 Project Gallium 0.4 on ATI RV530  X.Org R300 Project Gallium 0.4 on ATI RV530 +X.Org R300 Project Gallium 0.4 on ATI RV560 +X.Org R300 Project Gallium 0.4 on ATI RV570  X.Org R300 Project Gallium 0.4 on ATI RV570  X.Org R300 Project Gallium 0.4 on R420  X.Org R300 Project Gallium 0.4 on R580 @@ -1571,23 +2379,44 @@ X.Org R300 Project Gallium 0.4 on RV410  X.Org R300 Project Gallium 0.4 on RV515  X.Org R300 Project Gallium 0.4 on RV530  XGI +nouveau Gallium 0.4 on NV31 +nouveau Gallium 0.4 on NV34  nouveau Gallium 0.4 on NV34  nouveau Gallium 0.4 on NV36 +nouveau Gallium 0.4 on NV43 +nouveau Gallium 0.4 on NV44 +nouveau Gallium 0.4 on NV46  nouveau Gallium 0.4 on NV46  nouveau Gallium 0.4 on NV49  nouveau Gallium 0.4 on NV4A +nouveau Gallium 0.4 on NV4A  nouveau Gallium 0.4 on NV4B +nouveau Gallium 0.4 on NV4B +nouveau Gallium 0.4 on NV4C  nouveau Gallium 0.4 on NV4E  nouveau Gallium 0.4 on NV50 +nouveau Gallium 0.4 on NV63 +nouveau Gallium 0.4 on NV67 +nouveau Gallium 0.4 on NV84  nouveau Gallium 0.4 on NV84  nouveau Gallium 0.4 on NV86 +nouveau Gallium 0.4 on NV86 +nouveau Gallium 0.4 on NV92  nouveau Gallium 0.4 on NV92  nouveau Gallium 0.4 on NV94 +nouveau Gallium 0.4 on NV94  nouveau Gallium 0.4 on NV96 +nouveau Gallium 0.4 on NV96 +nouveau Gallium 0.4 on NV98  nouveau Gallium 0.4 on NV98  nouveau Gallium 0.4 on NVA0 +nouveau Gallium 0.4 on NVA0  nouveau Gallium 0.4 on NVA3  nouveau Gallium 0.4 on NVA5 +nouveau Gallium 0.4 on NVA5 +nouveau Gallium 0.4 on NVA8  nouveau Gallium 0.4 on NVA8  nouveau Gallium 0.4 on NVAA +nouveau Gallium 0.4 on NVAA +nouveau Gallium 0.4 on NVAC  nouveau Gallium 0.4 on NVAC diff --git a/indra/newview/tests/lldir_stub.cpp b/indra/newview/tests/lldir_stub.cpp index 6646860b5e..18cf4e7419 100644 --- a/indra/newview/tests/lldir_stub.cpp +++ b/indra/newview/tests/lldir_stub.cpp @@ -2,8 +2,25 @@   * @file lldir_stub.cpp   * @brief  stub class to allow unit testing   * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - * Copyright (c) 2009, Linden Research, Inc. + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$   */ diff --git a/indra/newview/tests/llglslshader_stub.cpp b/indra/newview/tests/llglslshader_stub.cpp index 5333c8a361..8947a632c8 100644 --- a/indra/newview/tests/llglslshader_stub.cpp +++ b/indra/newview/tests/llglslshader_stub.cpp @@ -2,8 +2,25 @@   * @file llglslshader_stub.cpp   * @brief  stub class to allow unit testing   * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - * Copyright (c) 2009, Linden Research, Inc. + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$   */ diff --git a/indra/newview/tests/llpipeline_stub.cpp b/indra/newview/tests/llpipeline_stub.cpp index 85bf0ae3fb..ad112cbf6a 100644 --- a/indra/newview/tests/llpipeline_stub.cpp +++ b/indra/newview/tests/llpipeline_stub.cpp @@ -2,8 +2,25 @@   * @file llpipeline_stub.cpp   * @brief  stub class to allow unit testing   * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - * Copyright (c) 2009, Linden Research, Inc. + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$   */ diff --git a/indra/newview/tests/llsechandler_basic_test.cpp b/indra/newview/tests/llsechandler_basic_test.cpp index daa10819fc..0235400976 100644 --- a/indra/newview/tests/llsechandler_basic_test.cpp +++ b/indra/newview/tests/llsechandler_basic_test.cpp @@ -86,6 +86,9 @@ std::string LLControlGroup::getString(const std::string& name)  	return "";  } +// Stub for --no-verify-ssl-cert +BOOL LLControlGroup::getBOOL(const std::string& name) { return FALSE; } +  LLSD LLCredential::getLoginParams()  {  	LLSD result = LLSD::emptyMap(); diff --git a/indra/newview/tests/llsky_stub.cpp b/indra/newview/tests/llsky_stub.cpp index 35f4944a95..241d740635 100644 --- a/indra/newview/tests/llsky_stub.cpp +++ b/indra/newview/tests/llsky_stub.cpp @@ -2,8 +2,25 @@   * @file llsky_stub.cpp   * @brief  stub class to allow unit testing   * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - * Copyright (c) 2009, Linden Research, Inc. + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$   */ diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp index dd7761475e..3c89b64d52 100644 --- a/indra/newview/tests/llviewernetwork_test.cpp +++ b/indra/newview/tests/llviewernetwork_test.cpp @@ -164,7 +164,7 @@ namespace tut  					  std::string("https://secondlife.com/helpers/"));  		ensure_equals("Agni login page is correct",  					  grid[GRID_LOGIN_PAGE_VALUE].asString(),  -					  std::string("http://secondlife.com/app/login/")); +					  std::string("http://viewer-login.agni.lindenlab.com/"));  		ensure("Agni is a favorite",  			   grid.has(GRID_IS_FAVORITE_VALUE));  		ensure("Agni is a system grid",  @@ -208,7 +208,7 @@ namespace tut  					  std::string("https://secondlife.com/helpers/"));  		ensure_equals("Agni login page the same after grid file",   					  grid[GRID_LOGIN_PAGE_VALUE].asString(),  -					  std::string("http://secondlife.com/app/login/")); +					  std::string("http://viewer-login.agni.lindenlab.com/"));  		ensure("Agni still a favorite after grid file",   			   grid.has(GRID_IS_FAVORITE_VALUE));  		ensure("Agni system grid still set after grid file",  @@ -310,7 +310,7 @@ namespace tut  					  std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/"));  		ensure_equals("Override known grid login uri: login page is not set",  					  grid[GRID_LOGIN_PAGE_VALUE].asString(),  -					  std::string("http://secondlife.com/app/login/"));		 +					  std::string("http://viewer-login.agni.lindenlab.com/"));		  		// Override with loginuri  		// override custom grid @@ -359,7 +359,7 @@ namespace tut  					  std::string("https://my.helper.uri/mycustomhelpers"));  		ensure_equals("Override known grid helper uri: login page is not changed",  					  grid[GRID_LOGIN_PAGE_VALUE].asString(),  -					  std::string("http://secondlife.com/app/login/"));		 +					  std::string("http://viewer-login.agni.lindenlab.com/"));		  		// Override with helperuri  		// override custom grid @@ -451,9 +451,9 @@ namespace tut  		ensure_equals("getHelperURI", LLGridManager::getInstance()->getHelperURI(),   					  std::string("https://secondlife.com/helpers/"));  		ensure_equals("getLoginPage", LLGridManager::getInstance()->getLoginPage(),  -					  std::string("http://secondlife.com/app/login/")); +					  std::string("http://viewer-login.agni.lindenlab.com/"));  		ensure_equals("getLoginPage2", LLGridManager::getInstance()->getLoginPage("util.agni.lindenlab.com"),  -					  std::string("http://secondlife.com/app/login/")); +					  std::string("http://viewer-login.agni.lindenlab.com/"));  		ensure("Is Agni a production grid", LLGridManager::getInstance()->isInProductionGrid());		  		std::vector<std::string> uris;  		LLGridManager::getInstance()->getLoginURIs(uris); diff --git a/indra/newview/tests/llviewershadermgr_stub.cpp b/indra/newview/tests/llviewershadermgr_stub.cpp index 0dae527035..18eff72f3c 100644 --- a/indra/newview/tests/llviewershadermgr_stub.cpp +++ b/indra/newview/tests/llviewershadermgr_stub.cpp @@ -2,8 +2,25 @@   * @file llglslshader_stub.cpp   * @brief  stub class to allow unit testing   * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - * Copyright (c) 2009, Linden Research, Inc. + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$   */ diff --git a/indra/newview/tests/llwlanimator_stub.cpp b/indra/newview/tests/llwlanimator_stub.cpp index 4d1bb85544..f5e15b2e7b 100644 --- a/indra/newview/tests/llwlanimator_stub.cpp +++ b/indra/newview/tests/llwlanimator_stub.cpp @@ -2,8 +2,25 @@   * @file llwlanimator_stub.cpp   * @brief  stub class to allow unit testing   * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - * Copyright (c) 2009, Linden Research, Inc. + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$   */ diff --git a/indra/newview/tests/llwldaycycle_stub.cpp b/indra/newview/tests/llwldaycycle_stub.cpp index d98c9614b4..a7bc9a7b83 100644 --- a/indra/newview/tests/llwldaycycle_stub.cpp +++ b/indra/newview/tests/llwldaycycle_stub.cpp @@ -2,8 +2,25 @@   * @file llwldaycycle_stub.cpp   * @brief  stub class to allow unit testing   * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - * Copyright (c) 2009, Linden Research, Inc. + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$   */ diff --git a/indra/newview/tests/llwlparammanager_test.cpp b/indra/newview/tests/llwlparammanager_test.cpp index a6c6a2abf4..be0dc9fd0c 100644 --- a/indra/newview/tests/llwlparammanager_test.cpp +++ b/indra/newview/tests/llwlparammanager_test.cpp @@ -2,8 +2,25 @@   * @file llwlparammanager_test.cpp   * @brief LLWLParamManager tests   * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - * Copyright (c) 2009, Linden Research, Inc. + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$   */ diff --git a/indra/newview/tests/llwlparamset_stub.cpp b/indra/newview/tests/llwlparamset_stub.cpp index 6ce4b5827d..ccb99db475 100644 --- a/indra/newview/tests/llwlparamset_stub.cpp +++ b/indra/newview/tests/llwlparamset_stub.cpp @@ -2,8 +2,25 @@   * @file llwlparamset_stub.cpp   * @brief  stub class to allow unit testing   * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - * Copyright (c) 2009, Linden Research, Inc. + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$   */ diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 8aa94616d6..f0bee2bfee 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -31,6 +31,7 @@ import os.path  import re  import tarfile  import time +import random  viewer_dir = os.path.dirname(__file__)  # add llmanifest library to our path so we don't have to muck with PYTHONPATH  sys.path.append(os.path.join(viewer_dir, '../lib/python/indra/util')) @@ -62,6 +63,32 @@ class ViewerManifest(LLManifest):                  # include the entire shaders directory recursively                  self.path("shaders") +                # include the extracted list of contributors +                contributor_names = self.extract_names("../../doc/contributions.txt") +                self.put_in_file(contributor_names, "contributors.txt") +                self.file_list.append(["../../doc/contributions.txt",self.dst_path_of("contributors.txt")]) +                # include the extracted list of translators +                translator_names = self.extract_names("../../doc/translations.txt") +                self.put_in_file(translator_names, "translators.txt") +                self.file_list.append(["../../doc/translations.txt",self.dst_path_of("translators.txt")]) +                # include the list of Lindens (if any) +                #   see https://wiki.lindenlab.com/wiki/Generated_Linden_Credits +                linden_names_path = os.getenv("LINDEN_CREDITS") +                if linden_names_path : +                    try: +                        linden_file = open(linden_names_path,'r') +                         # all names should be one line, but the join below also converts to a string +                        linden_names = ', '.join(linden_file.readlines()) +                        self.put_in_file(linden_names, "lindens.txt") +                        linden_file.close() +                        print "Linden names extracted from '%s'" % linden_names_path +                        self.file_list.append([linden_names_path,self.dst_path_of("lindens.txt")]) +                    except IOError: +                        print "No Linden names found at '%s', using built-in list" % linden_names_path +                        pass +                else : +                    print "No 'LINDEN_CREDITS' specified in environment, using built-in list" +                  # ... and the entire windlight directory                  self.path("windlight")                  self.end_prefix("app_settings") @@ -143,6 +170,21 @@ class ViewerManifest(LLManifest):      def channel_lowerword(self):          return self.channel_oneword().lower() +    def icon_path(self): +        icon_path="icons/" +        channel_type=self.channel_lowerword() +        if channel_type == 'release' \ +        or channel_type == 'development' \ +        : +            icon_path += channel_type +        elif channel_type == 'betaviewer' : +            icon_path += 'beta' +        elif re.match('project.*',channel_type) : +            icon_path += 'project' +        else : +            icon_path += 'test' +        return icon_path +      def flags_list(self):          """ Convenience function that returns the command-line flags          for the grid""" @@ -174,6 +216,28 @@ class ViewerManifest(LLManifest):          return " ".join((channel_flags, grid_flags, setting_flags)).strip() +    def extract_names(self,src): +        try: +            contrib_file = open(src,'r') +        except IOError: +            print "Failed to open '%s'" % src +            raise +        lines = contrib_file.readlines() +        contrib_file.close() + +        # All lines up to and including the first blank line are the file header; skip them +        lines.reverse() # so that pop will pull from first to last line +        while not re.match("\s*$", lines.pop()) : +            pass # do nothing + +        # A line that starts with a non-whitespace character is a name; all others describe contributions, so collect the names +        names = [] +        for line in lines : +            if re.match("\S", line) : +                names.append(line.rstrip()) +        # It's not fair to always put the same people at the head of the list +        random.shuffle(names) +        return ', '.join(names)  class WindowsManifest(ViewerManifest):      def final_exe(self): @@ -609,12 +673,11 @@ class DarwinManifest(ViewerManifest):                  self.path("featuretable_mac.txt")                  self.path("SecondLife.nib") -                # If we are not using the default channel, use the 'Firstlook -                # icon' to show that it isn't a stable release. -                if self.default_channel() and self.default_grid(): +                icon_path = self.icon_path() +                if self.prefix(src=icon_path, dst="") :                      self.path("secondlife.icns") -                else: -                    self.path("secondlife_firstlook.icns", "secondlife.icns") +                    self.end_prefix(icon_path) +                  self.path("SecondLife.nib")                  # Translations @@ -693,7 +756,7 @@ class DarwinManifest(ViewerManifest):                                      "libexpat.1.5.2.dylib",                                      "libexception_handler.dylib",                                      "libGLOD.dylib", -				    "libcollada14dom.dylib" +                                    "libcollada14dom.dylib"                                      ):                          target_lib = os.path.join('../../..', libfile)                          self.run_command("ln -sf %(target)r %(link)r" %  @@ -795,9 +858,7 @@ class DarwinManifest(ViewerManifest):              # will use the release .DS_Store, and will look broken.              # - Ambroff 2008-08-20              dmg_template = os.path.join( -                'installers',  -                'darwin', -                '%s-dmg' % "".join(self.channel_unique().split()).lower()) +                'installers', 'darwin', '%s-dmg' % self.channel_lowerword())              if not os.path.exists (self.src_path_of(dmg_template)):                  dmg_template = os.path.join ('installers', 'darwin', 'release-dmg') @@ -853,7 +914,6 @@ class LinuxManifest(ViewerManifest):      def construct(self):          super(LinuxManifest, self).construct()          self.path("licenses-linux.txt","licenses.txt") -        self.path("res/ll_icon.png","secondlife_icon.png")          if self.prefix("linux_tools", dst=""):              self.path("client-readme.txt","README-linux.txt")              self.path("client-readme-voice.txt","README-linux-voice.txt") @@ -879,6 +939,15 @@ class LinuxManifest(ViewerManifest):              # recurse              self.end_prefix("res-sdl") +        # Get the icons based on the channel +        icon_path = self.icon_path() +        if self.prefix(src=icon_path, dst="") : +            self.path("secondlife_256.png","secondlife_icon.png") +            if self.prefix(src="",dst="res-sdl") : +                self.path("secondlife_256.BMP","ll_icon.BMP") +                self.end_prefix("res-sdl") +            self.end_prefix(icon_path) +          self.path("../viewer_components/updater/scripts/linux/update_install", "bin/update_install")          # plugins @@ -964,15 +1033,15 @@ class Linux_i686Manifest(LinuxManifest):              self.path("libbreakpad_client.so.0.0.0")              self.path("libbreakpad_client.so.0")              self.path("libbreakpad_client.so") -	    self.path("libcollada14dom.so") +            self.path("libcollada14dom.so")              self.path("libdb-5.1.so")              self.path("libdb-5.so")              self.path("libdb.so")              self.path("libcrypto.so.1.0.0")              self.path("libexpat.so.1.5.2")              self.path("libssl.so.1.0.0") -	    self.path("libglod.so") -	    self.path("libminizip.so") +            self.path("libglod.so") +            self.path("libminizip.so")              self.path("libuuid.so")              self.path("libuuid.so.16")              self.path("libuuid.so.16.0.22")  | 
