diff options
42 files changed, 987 insertions, 68 deletions
diff --git a/BuildParams b/BuildParams index 6adae15d5f..d481072185 100644 --- a/BuildParams +++ b/BuildParams @@ -1,19 +1,15 @@ # BuildParams # # Please refer to: -# https://wiki.lindenlab.com/wiki/Parabuild_with_Mercurial#How_Build_Parameters_Work +# https://wiki.secondlife.com/wiki/Automated_Build_System # Global setting for now... Darwin.symbolfiles = "newview/Release/secondlife-symbols-darwin.tar.bz2" CYGWIN.symbolfiles = "newview/Release/secondlife-symbols-windows.tar.bz2" Linux.symbolfiles = "newview/secondlife-symbols-linux.tar.bz2" -# Public Upload Locations overriding the default private ones -S3PROXY_URL = http://automated-builds-secondlife-com.s3.amazonaws.com/ -S3INTERNAL_URL = http://automated-builds-secondlife-com.s3.amazonaws.com/ -S3GET_URL = http://automated-builds-secondlife-com.s3.amazonaws.com/ -S3PUT_URL = https://s3.amazonaws.com/automated-builds-secondlife-com/ -S3ACL = public-read +# Use Public Upload Locations +public_build = true # Update Public Inworld Build Status Indicators email_status_this_is_os = true @@ -27,7 +23,6 @@ viewer-development.show_changes_since = 2-1-release # Build Settings viewer-development_coverity.coverity_product = viewer - viewer-development.build_debug_release_separately = true # Notifications - to configure email notices, add a setting like this: @@ -155,4 +150,26 @@ oz_viewer-review1_coverity.build_CYGWIN_Debug = false oz_viewer-review1_coverity.build_CYGWIN_RelWithDebInfo = false oz_viewer-review1_coverity.build_CYGWIN_Release = false +oz_viewer-review2_coverity.coverity_product = viewer + +oz_viewer-review2.build_Linux = true +oz_viewer-review2_debug.build_Linux = false +oz_viewer-review2_coverity.build_Linux = false + +oz_viewer-review2.build_Darwin = true +oz_viewer-review2_debug.build_Darwin = false +oz_viewer-review2_coverity.build_Darwin = false + +oz_viewer-review2.build_CYGWIN = true +oz_viewer-review2.build_CYGWIN_Debug = false +oz_viewer-review2.build_CYGWIN_RelWithDebInfo = false +oz_viewer-review2.build_CYGWIN_Release = true +oz_viewer-review2_debug.build_CYGWIN_Debug = true +oz_viewer-review2_debug.build_CYGWIN_RelWithDebInfo = true +oz_viewer-review2_debug.build_CYGWIN_Release = false +oz_viewer-review2_coverity.build_coverity = true +oz_viewer-review2_coverity.build_CYGWIN_Debug = false +oz_viewer-review2_coverity.build_CYGWIN_RelWithDebInfo = false +oz_viewer-review2_coverity.build_CYGWIN_Release = false + # eof diff --git a/doc/contributions.txt b/doc/contributions.txt index 9df072e937..6d93eca14c 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -64,6 +64,7 @@ Aleric Inglewood VWR-12691 VWR-13996 VWR-14426 + SNOW-766 Ales Beaumont VWR-9352 Alissa Sabre @@ -127,6 +128,8 @@ Asuka Neely VWR-8179 Balp Allen VWR-4157 +Be Holder + SNOW-397 Benja Kepler VWR-746 Biancaluce Robbiani @@ -153,6 +156,7 @@ Boroondas Gupte SNOW-503 SNOW-510 SNOW-527 + SNOW-610 SNOW-624 VWR-233 WEB-262 @@ -212,6 +216,8 @@ Dzonatas Sol VWR-1705 VWR-1729 VWR-1812 +Eddi Decosta + SNOW-586 Eddy Stryker VWR-15 VWR-23 @@ -632,6 +638,7 @@ Tharax Ferraris VWR-605 Thickbrick Sleaford SNOW-207 + SNOW-586 SNOW-743 VWR-7109 VWR-9287 diff --git a/indra/develop.py b/indra/develop.py index 3c88bb8a01..36c947327a 100755 --- a/indra/develop.py +++ b/indra/develop.py @@ -742,9 +742,10 @@ Options: -p | --project=NAME set the root project name. (Doesn't effect makefiles) Commands: - build configure and build default target - clean delete all build directories, does not affect sources - configure configure project by running cmake (default command if none given) + build configure and build default target + clean delete all build directories, does not affect sources + configure configure project by running cmake (default if none given) + printbuilddirs print the build directory that will be used Command-options for "configure": We use cmake variables to change the build configuration. @@ -762,15 +763,6 @@ Examples: ''' def main(arguments): - if os.getenv('DISTCC_DIR') is None: - distcc_dir = os.path.join(getcwd(), '.distcc') - if not os.path.exists(distcc_dir): - os.mkdir(distcc_dir) - print "setting DISTCC_DIR to %s" % distcc_dir - os.environ['DISTCC_DIR'] = distcc_dir - else: - print "DISTCC_DIR is set to %s" % os.getenv('DISTCC_DIR') - setup = setup_platform[sys.platform]() try: opts, args = getopt.getopt( @@ -832,6 +824,14 @@ For example: develop.py configure -DSERVER:BOOL=OFF""" if cmd in ('cmake', 'configure'): setup.run_cmake(args) elif cmd == 'build': + if os.getenv('DISTCC_DIR') is None: + distcc_dir = os.path.join(getcwd(), '.distcc') + if not os.path.exists(distcc_dir): + os.mkdir(distcc_dir) + print "setting DISTCC_DIR to %s" % distcc_dir + os.environ['DISTCC_DIR'] = distcc_dir + else: + print "DISTCC_DIR is set to %s" % os.getenv('DISTCC_DIR') for d in setup.build_dirs(): if not os.path.exists(d): raise CommandError('run "develop.py cmake" first') @@ -842,6 +842,9 @@ For example: develop.py configure -DSERVER:BOOL=OFF""" if args: raise CommandError('clean takes no arguments') setup.cleanup() + elif cmd == 'printbuilddirs': + for d in setup.build_dirs(): + print >> sys.stdout, d else: print >> sys.stderr, 'Error: unknown subcommand', repr(cmd) print >> sys.stderr, "(run 'develop.py --help' for help)" diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 3a89b999bd..e26acd53a3 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -895,9 +895,7 @@ LLVector3 LLRender::getUITranslation() { if (mUIOffset.empty()) { - //llassert(!mUIOffset.empty()); - llwarns << "UI offset stack empty." << llendl; - return LLVector3(0,0,0); + return LLVector3::zero; } return mUIOffset.back(); } @@ -906,9 +904,7 @@ LLVector3 LLRender::getUIScale() { if (mUIScale.empty()) { - //llassert(!mUIScale.empty()); - llwarns << "UI scale stack empty." << llendl; - return LLVector3(1,1,1); + return LLVector3(1.f, 1.f, 1.f); } return mUIScale.back(); } diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 07418d1b5e..9d911777d1 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8635,7 +8635,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>ShowBetaGrids</key> <map> diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index 3ea7897501..49ae58d53a 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -29,6 +29,7 @@ RequestExecutionLevel admin ; on Vista we must be admin because we write to Prog ;; (these files are in the same place as the nsi template but the python script generates a new nsi file in the ;; application directory so we have to add a path to these include files) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +!include "%%SOURCE%%\installers\windows\lang_da.nsi" !include "%%SOURCE%%\installers\windows\lang_de.nsi" !include "%%SOURCE%%\installers\windows\lang_en-us.nsi" !include "%%SOURCE%%\installers\windows\lang_es.nsi" @@ -37,18 +38,21 @@ RequestExecutionLevel admin ; on Vista we must be admin because we write to Prog !include "%%SOURCE%%\installers\windows\lang_it.nsi" !include "%%SOURCE%%\installers\windows\lang_ko.nsi" !include "%%SOURCE%%\installers\windows\lang_nl.nsi" +!include "%%SOURCE%%\installers\windows\lang_pl.nsi" !include "%%SOURCE%%\installers\windows\lang_pt-br.nsi" !include "%%SOURCE%%\installers\windows\lang_zh.nsi" # *TODO: Move these into the language files themselves +LangString LanguageCode ${LANG_DANISH} "da" LangString LanguageCode ${LANG_GERMAN} "de" -LangString LanguageCode ${LANG_ENGLISH} "en" +Langstring LanguageCode ${LANG_ENGLISH} "en" LangString LanguageCode ${LANG_SPANISH} "es" LangString LanguageCode ${LANG_FRENCH} "fr" LangString LanguageCode ${LANG_JAPANESE} "ja" LangString LanguageCode ${LANG_ITALIAN} "it" LangString LanguageCode ${LANG_KOREAN} "ko" LangString LanguageCode ${LANG_DUTCH} "nl" +LangString LanguageCode ${LANG_POLISH} "da" LangString LanguageCode ${LANG_PORTUGUESEBR} "pt" LangString LanguageCode ${LANG_SIMPCHINESE} "zh" diff --git a/indra/newview/installers/windows/lang_da.nsi b/indra/newview/installers/windows/lang_da.nsi Binary files differnew file mode 100644 index 0000000000..0c832e8ba9 --- /dev/null +++ b/indra/newview/installers/windows/lang_da.nsi diff --git a/indra/newview/installers/windows/lang_pl.nsi b/indra/newview/installers/windows/lang_pl.nsi Binary files differnew file mode 100644 index 0000000000..191bae4755 --- /dev/null +++ b/indra/newview/installers/windows/lang_pl.nsi diff --git a/indra/newview/installers/windows/language_menu.nsi b/indra/newview/installers/windows/language_menu.nsi Binary files differindex 988f452dea..fef8d40c69 100644 --- a/indra/newview/installers/windows/language_menu.nsi +++ b/indra/newview/installers/windows/language_menu.nsi diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 37cd289b1b..fe7e883d83 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -827,6 +827,11 @@ LLVector3d LLAgent::getPosGlobalFromAgent(const LLVector3 &pos_agent) const return pos_agent_d + mAgentOriginGlobal; } +void LLAgent::sitDown() +{ + setControlFlags(AGENT_CONTROL_SIT_ON_GROUND); +} + //----------------------------------------------------------------------------- // resetAxes() diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 0d95683a98..c643cef78f 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -345,6 +345,8 @@ private: //-------------------------------------------------------------------- public: void standUp(); + /// @brief ground-sit at agent's current position + void sitDown(); //-------------------------------------------------------------------- // Busy diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp index f7ae320a6f..1edc96e165 100644 --- a/indra/newview/llagentwearablesfetch.cpp +++ b/indra/newview/llagentwearablesfetch.cpp @@ -115,6 +115,7 @@ void LLInitialWearablesFetch::processContents() LLInventoryModel::cat_array_t cat_array; LLInventoryModel::item_array_t wearable_array; LLFindWearables is_wearable; + llassert_always(mComplete.size() != 0); gInventory.collectDescendentsIf(mComplete.front(), cat_array, wearable_array, LLInventoryModel::EXCLUDE_TRASH, is_wearable); diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 94286fd799..7159d89d21 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -2307,12 +2307,17 @@ bool LLAppearanceMgr::updateBaseOutfit() void LLAppearanceMgr::divvyWearablesByType(const LLInventoryModel::item_array_t& items, wearables_by_type_t& items_by_type) { - items_by_type.reserve(LLWearableType::WT_COUNT); + items_by_type.resize(LLWearableType::WT_COUNT); if (items.empty()) return; for (S32 i=0; i<items.count(); i++) { LLViewerInventoryItem *item = items.get(i); + if (!item) + { + LL_WARNS("Appearance") << "NULL item found" << llendl; + continue; + } // Ignore non-wearables. if (!item->isWearableType()) continue; @@ -2335,6 +2340,7 @@ std::string build_order_string(LLWearableType::EType type, U32 i) struct WearablesOrderComparator { + LOG_CLASS(WearablesOrderComparator); WearablesOrderComparator(const LLWearableType::EType type) { mControlSize = build_order_string(type, 0).size(); diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 78c2142ea5..c65d9dc9ee 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -42,6 +42,8 @@ class LLOutfitUnLockTimer; class LLAppearanceMgr: public LLSingleton<LLAppearanceMgr> { + LOG_CLASS(LLAppearanceMgr); + friend class LLSingleton<LLAppearanceMgr>; friend class LLOutfitUnLockTimer; diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index defd882fe4..d22950cad3 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -827,6 +827,73 @@ LLVector2 LLFace::surfaceToTexture(LLVector2 surface_coord, LLVector3 position, return tc; } +// Returns scale compared to default texgen, and face orientation as calculated +// by planarProjection(). This is needed to match planar texgen parameters. +void LLFace::getPlanarProjectedParams(LLQuaternion* face_rot, LLVector3* face_pos, F32* scale) const +{ + const LLMatrix4& vol_mat = getWorldMatrix(); + const LLVolumeFace& vf = getViewerObject()->getVolume()->getVolumeFace(mTEOffset); + LLVector3 normal = vf.mVertices[0].mNormal; + LLVector3 binormal = vf.mVertices[0].mBinormal; + LLVector2 projected_binormal; + planarProjection(projected_binormal, normal, vf.mCenter, binormal); + projected_binormal -= LLVector2(0.5f, 0.5f); // this normally happens in xform() + *scale = projected_binormal.length(); + // rotate binormal to match what planarProjection() thinks it is, + // then find rotation from that: + projected_binormal.normalize(); + F32 ang = acos(projected_binormal.mV[VY]); + ang = (projected_binormal.mV[VX] < 0.f) ? -ang : ang; + binormal.rotVec(ang, normal); + LLQuaternion local_rot( binormal % normal, binormal, normal ); + *face_rot = local_rot * vol_mat.quaternion(); + *face_pos = vol_mat.getTranslation(); +} + +// Returns the necessary texture transform to align this face's TE to align_to's TE +bool LLFace::calcAlignedPlanarTE(const LLFace* align_to, LLVector2* res_st_offset, + LLVector2* res_st_scale, F32* res_st_rot) const +{ + if (!align_to) + { + return false; + } + const LLTextureEntry *orig_tep = align_to->getTextureEntry(); + if ((orig_tep->getTexGen() != LLTextureEntry::TEX_GEN_PLANAR) || + (getTextureEntry()->getTexGen() != LLTextureEntry::TEX_GEN_PLANAR)) + { + return false; + } + + LLVector3 orig_pos, this_pos; + LLQuaternion orig_face_rot, this_face_rot; + F32 orig_proj_scale, this_proj_scale; + align_to->getPlanarProjectedParams(&orig_face_rot, &orig_pos, &orig_proj_scale); + getPlanarProjectedParams(&this_face_rot, &this_pos, &this_proj_scale); + + // The rotation of "this face's" texture: + LLQuaternion orig_st_rot = LLQuaternion(orig_tep->getRotation(), LLVector3::z_axis) * orig_face_rot; + LLQuaternion this_st_rot = orig_st_rot * ~this_face_rot; + F32 x_ang, y_ang, z_ang; + this_st_rot.getEulerAngles(&x_ang, &y_ang, &z_ang); + *res_st_rot = z_ang; + + // Offset and scale of "this face's" texture: + LLVector3 centers_dist = (this_pos - orig_pos) * ~orig_st_rot; + LLVector3 st_scale(orig_tep->mScaleS, orig_tep->mScaleT, 1.f); + st_scale *= orig_proj_scale; + centers_dist.scaleVec(st_scale); + LLVector2 orig_st_offset(orig_tep->mOffsetS, orig_tep->mOffsetT); + + *res_st_offset = orig_st_offset + (LLVector2)centers_dist; + res_st_offset->mV[VX] -= (S32)res_st_offset->mV[VX]; + res_st_offset->mV[VY] -= (S32)res_st_offset->mV[VY]; + + st_scale /= this_proj_scale; + *res_st_scale = (LLVector2)st_scale; + return true; +} + void LLFace::updateRebuildFlags() { if (!mDrawablep->isState(LLDrawable::REBUILD_VOLUME)) diff --git a/indra/newview/llface.h b/indra/newview/llface.h index d95057f3ef..0166e45bee 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -89,6 +89,9 @@ public: BOOL hasGeometry() const { return mGeomCount > 0; } LLVector3 getPositionAgent() const; LLVector2 surfaceToTexture(LLVector2 surface_coord, LLVector3 position, LLVector3 normal); + void getPlanarProjectedParams(LLQuaternion* face_rot, LLVector3* face_pos, F32* scale) const; + bool calcAlignedPlanarTE(const LLFace* align_to, LLVector2* st_offset, + LLVector2* st_scale, F32* st_rot) const; U32 getState() const { return mState; } void setState(U32 state) { mState |= state; } diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index b00a663a9a..129c9aec14 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -3077,7 +3077,9 @@ public: std::string saved; if(offline == IM_OFFLINE) { - saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str()); + LLStringUtil::format_map_t args; + args["[LONG_TIMESTAMP]"] = formatted_time(timestamp); + saved = LLTrans::getString("Saved_message", args); } std::string buffer = saved + message; diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 08229d3a50..53835f0166 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -501,7 +501,7 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id, for(S32 i = 0; i < count; ++i) { item = item_array->get(i); - if (item->getActualType() == LLAssetType::AT_LINK_FOLDER) + if (item && item->getActualType() == LLAssetType::AT_LINK_FOLDER) { LLViewerInventoryCategory *linked_cat = item->getLinkedCategory(); if (linked_cat && linked_cat->getPreferredType() != LLFolderType::FT_OUTFIT) diff --git a/indra/newview/lllandmarklist.cpp b/indra/newview/lllandmarklist.cpp index 87257832b6..dd402de394 100644 --- a/indra/newview/lllandmarklist.cpp +++ b/indra/newview/lllandmarklist.cpp @@ -159,6 +159,11 @@ void LLLandmarkList::processGetAssetReply( } +BOOL LLLandmarkList::isAssetInLoadedCallbackMap(const LLUUID& asset_uuid) +{ + return mLoadedCallbackMap.find(asset_uuid) != mLoadedCallbackMap.end(); +} + BOOL LLLandmarkList::assetExists(const LLUUID& asset_uuid) { return mList.count(asset_uuid) != 0 || mBadList.count(asset_uuid) != 0; diff --git a/indra/newview/lllandmarklist.h b/indra/newview/lllandmarklist.h index 6d32f0e75b..3356f866ce 100644 --- a/indra/newview/lllandmarklist.h +++ b/indra/newview/lllandmarklist.h @@ -59,6 +59,10 @@ public: S32 status, LLExtStat ext_status ); + // Returns TRUE if loading the landmark with given asset_uuid has been requested + // but is not complete yet. + BOOL isAssetInLoadedCallbackMap(const LLUUID& asset_uuid); + protected: void onRegionHandle(const LLUUID& landmark_id); void makeCallbacks(const LLUUID& landmark_id); diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 572e7a6212..bce496cbad 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -42,6 +42,7 @@ #include "llcolorswatch.h" #include "llcombobox.h" #include "lldrawpoolbump.h" +#include "llface.h" #include "lllineeditor.h" #include "llmediaentry.h" #include "llresmgr.h" @@ -75,6 +76,7 @@ BOOL LLPanelFace::postBuild() childSetCommitCallback("checkbox flip t",&LLPanelFace::onCommitTextureInfo, this); childSetCommitCallback("TexRot",&LLPanelFace::onCommitTextureInfo, this); childSetAction("button apply",&LLPanelFace::onClickApply,this); + childSetCommitCallback("checkbox planar align",&LLPanelFace::onCommitPlanarAlign, this); childSetCommitCallback("TexOffsetU",LLPanelFace::onCommitTextureInfo, this); childSetCommitCallback("TexOffsetV",LLPanelFace::onCommitTextureInfo, this); childSetAction("button align",&LLPanelFace::onClickAutoFix,this); @@ -359,6 +361,93 @@ private: LLPanelFace* mPanel; }; +// Functor that aligns a face to mCenterFace +struct LLPanelFaceSetAlignedTEFunctor : public LLSelectedTEFunctor +{ + LLPanelFaceSetAlignedTEFunctor(LLPanelFace* panel, LLFace* center_face) : + mPanel(panel), + mCenterFace(center_face) {} + + virtual bool apply(LLViewerObject* object, S32 te) + { + LLFace* facep = object->mDrawable->getFace(te); + if (!facep) + { + return true; + } + + bool set_aligned = true; + if (facep == mCenterFace) + { + set_aligned = false; + } + if (set_aligned) + { + LLVector2 uv_offset, uv_scale; + F32 uv_rot; + set_aligned = facep->calcAlignedPlanarTE(mCenterFace, &uv_offset, &uv_scale, &uv_rot); + if (set_aligned) + { + object->setTEOffset(te, uv_offset.mV[VX], uv_offset.mV[VY]); + object->setTEScale(te, uv_scale.mV[VX], uv_scale.mV[VY]); + object->setTERotation(te, uv_rot); + } + } + if (!set_aligned) + { + LLPanelFaceSetTEFunctor setfunc(mPanel); + setfunc.apply(object, te); + } + return true; + } +private: + LLPanelFace* mPanel; + LLFace* mCenterFace; +}; + +// Functor that tests if a face is aligned to mCenterFace +struct LLPanelFaceGetIsAlignedTEFunctor : public LLSelectedTEFunctor +{ + LLPanelFaceGetIsAlignedTEFunctor(LLFace* center_face) : + mCenterFace(center_face) {} + + virtual bool apply(LLViewerObject* object, S32 te) + { + LLFace* facep = object->mDrawable->getFace(te); + if (!facep) + { + return false; + } + if (facep == mCenterFace) + { + return true; + } + + LLVector2 aligned_st_offset, aligned_st_scale; + F32 aligned_st_rot; + if ( facep->calcAlignedPlanarTE(mCenterFace, &aligned_st_offset, &aligned_st_scale, &aligned_st_rot) ) + { + const LLTextureEntry* tep = facep->getTextureEntry(); + LLVector2 st_offset, st_scale; + tep->getOffset(&st_offset.mV[VX], &st_offset.mV[VY]); + tep->getScale(&st_scale.mV[VX], &st_scale.mV[VY]); + F32 st_rot = tep->getRotation(); + // needs a fuzzy comparison, because of fp errors + if (is_approx_equal_fraction(st_offset.mV[VX], aligned_st_offset.mV[VX], 12) && + is_approx_equal_fraction(st_offset.mV[VY], aligned_st_offset.mV[VY], 12) && + is_approx_equal_fraction(st_scale.mV[VX], aligned_st_scale.mV[VX], 12) && + is_approx_equal_fraction(st_scale.mV[VY], aligned_st_scale.mV[VY], 12) && + is_approx_equal_fraction(st_rot, aligned_st_rot, 14)) + { + return true; + } + } + return false; + } +private: + LLFace* mCenterFace; +}; + struct LLPanelFaceSendFunctor : public LLSelectedObjectFunctor { virtual bool apply(LLViewerObject* object) @@ -370,8 +459,26 @@ struct LLPanelFaceSendFunctor : public LLSelectedObjectFunctor void LLPanelFace::sendTextureInfo() { - LLPanelFaceSetTEFunctor setfunc(this); - LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc); + if ((bool)childGetValue("checkbox planar align").asBoolean()) + { + struct f1 : public LLSelectedTEGetFunctor<LLFace *> + { + LLFace* get(LLViewerObject* object, S32 te) + { + return (object->mDrawable) ? object->mDrawable->getFace(te): NULL; + } + } get_last_face_func; + LLFace* last_face; + LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&get_last_face_func, last_face); + + LLPanelFaceSetAlignedTEFunctor setfunc(this, last_face); + LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc); + } + else + { + LLPanelFaceSetTEFunctor setfunc(this); + LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc); + } LLPanelFaceSendFunctor sendfunc; LLSelectMgr::getInstance()->getSelection()->applyToObjects(&sendfunc); @@ -497,6 +604,44 @@ void LLPanelFace::getState() } } + + // planar align + bool align_planar = false; + bool identical_planar_aligned = false; + bool is_planar = false; + { + LLCheckBoxCtrl* cb_planar_align = getChild<LLCheckBoxCtrl>("checkbox planar align"); + align_planar = (cb_planar_align && cb_planar_align->get()); + struct f1 : public LLSelectedTEGetFunctor<bool> + { + bool get(LLViewerObject* object, S32 face) + { + return (object->getTE(face)->getTexGen() == LLTextureEntry::TEX_GEN_PLANAR); + } + } func; + + bool texgens_identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, is_planar ); + bool enabled = (editable && texgens_identical && is_planar); + childSetValue("checkbox planar align", align_planar && enabled); + childSetEnabled("checkbox planar align", enabled); + + if (align_planar && enabled) + { + struct f2 : public LLSelectedTEGetFunctor<LLFace *> + { + LLFace* get(LLViewerObject* object, S32 te) + { + return (object->mDrawable) ? object->mDrawable->getFace(te): NULL; + } + } get_te_face_func; + LLFace* last_face; + LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&get_te_face_func, last_face); + LLPanelFaceGetIsAlignedTEFunctor get_is_aligend_func(last_face); + // this will determine if the texture param controls are tentative: + identical_planar_aligned = LLSelectMgr::getInstance()->getSelection()->applyToTEs(&get_is_aligend_func); + } + } + // Texture scale { F32 scale_s = 1.f; @@ -508,6 +653,7 @@ void LLPanelFace::getState() } } func; identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, scale_s ); + identical = align_planar ? identical_planar_aligned : identical; getChild<LLUICtrl>("TexScaleU")->setValue(editable ? llabs(scale_s) : 0); getChild<LLUICtrl>("TexScaleU")->setTentative(LLSD((BOOL)(!identical))); getChildView("TexScaleU")->setEnabled(editable); @@ -526,6 +672,7 @@ void LLPanelFace::getState() } } func; identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, scale_t ); + identical = align_planar ? identical_planar_aligned : identical; getChild<LLUICtrl>("TexScaleV")->setValue(llabs(editable ? llabs(scale_t) : 0)); getChild<LLUICtrl>("TexScaleV")->setTentative(LLSD((BOOL)(!identical))); @@ -547,6 +694,7 @@ void LLPanelFace::getState() } } func; identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, offset_s ); + identical = align_planar ? identical_planar_aligned : identical; getChild<LLUICtrl>("TexOffsetU")->setValue(editable ? offset_s : 0); getChild<LLUICtrl>("TexOffsetU")->setTentative(!identical); getChildView("TexOffsetU")->setEnabled(editable); @@ -562,6 +710,7 @@ void LLPanelFace::getState() } } func; identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, offset_t ); + identical = align_planar ? identical_planar_aligned : identical; getChild<LLUICtrl>("TexOffsetV")->setValue(editable ? offset_t : 0); getChild<LLUICtrl>("TexOffsetV")->setTentative(!identical); getChildView("TexOffsetV")->setEnabled(editable); @@ -578,6 +727,7 @@ void LLPanelFace::getState() } } func; identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, rotation ); + identical = align_planar ? identical_planar_aligned : identical; getChild<LLUICtrl>("TexRot")->setValue(editable ? rotation * RAD_TO_DEG : 0); getChild<LLUICtrl>("TexRot")->setTentative(!identical); getChildView("TexRot")->setEnabled(editable); @@ -993,3 +1143,11 @@ void LLPanelFace::setMediaType(const std::string& mime_type) { } +// static +void LLPanelFace::onCommitPlanarAlign(LLUICtrl* ctrl, void* userdata) +{ + LLPanelFace* self = (LLPanelFace*) userdata; + self->getState(); + self->sendTextureInfo(); +} + diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h index 94c354cf02..42be9b257f 100644 --- a/indra/newview/llpanelface.h +++ b/indra/newview/llpanelface.h @@ -85,6 +85,7 @@ protected: static void onCommitShiny( LLUICtrl* ctrl, void* userdata); static void onCommitFullbright( LLUICtrl* ctrl, void* userdata); static void onCommitGlow( LLUICtrl* ctrl, void *userdata); + static void onCommitPlanarAlign( LLUICtrl* ctrl, void* userdata); static void onClickApply(void*); static void onClickAutoFix(void*); diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 43814ac652..ff15e3f08e 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -974,7 +974,28 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const ) { // disable some commands for multi-selection. EXT-1757 - return root_folder_view && root_folder_view->getSelectedCount() == 1; + bool is_single_selection = root_folder_view && root_folder_view->getSelectedCount() == 1; + if (!is_single_selection) + { + return false; + } + + if ("show_on_map" == command_name) + { + LLFolderViewItem* cur_item = root_folder_view->getCurSelectedItem(); + if (!cur_item) return false; + + LLViewerInventoryItem* inv_item = cur_item->getInventoryItem(); + if (!inv_item) return false; + + LLUUID asset_uuid = inv_item->getAssetUUID(); + if (asset_uuid.isNull()) return false; + + // Disable "Show on Map" if landmark loading is in progress. + return !gLandmarkList.isAssetInLoadedCallbackMap(asset_uuid); + } + + return true; } else if ("rename" == command_name) { @@ -1099,7 +1120,8 @@ bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) co if ("cut" == command_name) { - can_be_modified = root_folder->canCut(); + // "Cut" disabled for folders. See EXT-8697. + can_be_modified = root_folder->canCut() && listenerp->getInventoryType() != LLInventoryType::IT_CATEGORY; } else if ("rename" == command_name) { @@ -1188,6 +1210,7 @@ void LLLandmarksPanel::doShowOnMap(LLLandmark* landmark) } mShowOnMapBtn->setEnabled(TRUE); + mGearLandmarkMenu->setItemEnabled("show_on_map", TRUE); } void LLLandmarksPanel::doProcessParcelInfo(LLLandmark* landmark, diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp index 0308f5e632..4cf1df1655 100644 --- a/indra/newview/llslurl.cpp +++ b/indra/newview/llslurl.cpp @@ -44,7 +44,6 @@ const char* LLSLURL::SLURL_COM = "slurl.com"; // version is required also. const char* LLSLURL::WWW_SLURL_COM = "www.slurl.com"; -const char* LLSLURL::SECONDLIFE_COM = "secondlife.com"; const char* LLSLURL::MAPS_SECONDLIFE_COM = "maps.secondlife.com"; const char* LLSLURL::SLURL_X_GRID_LOCATION_INFO_SCHEME = "x-grid-location-info"; const char* LLSLURL::SLURL_APP_PATH = "app"; @@ -183,15 +182,6 @@ LLSLURL::LLSLURL(const std::string& slurl) (slurl_uri.scheme() == LLSLURL::SLURL_HTTPS_SCHEME) || (slurl_uri.scheme() == LLSLURL::SLURL_X_GRID_LOCATION_INFO_SCHEME)) { - // *HACK: ignore http://secondlife.com/ URLs so that we can use - // http://secondlife.com/app/ redirect URLs - // This is only necessary while the server returns Release Note - // urls using this format rather that pointing to the wiki - if ((slurl_uri.scheme() == LLSLURL::SLURL_HTTP_SCHEME || - slurl_uri.scheme() == LLSLURL::SLURL_HTTPS_SCHEME) && - slurl_uri.hostName() == LLSLURL::SECONDLIFE_COM) - return; - // We're dealing with either a Standalone style slurl or slurl.com slurl if ((slurl_uri.hostName() == LLSLURL::SLURL_COM) || (slurl_uri.hostName() == LLSLURL::WWW_SLURL_COM) || @@ -202,6 +192,17 @@ LLSLURL::LLSLURL(const std::string& slurl) } else { + // Don't try to match any old http://<host>/ URL as a SLurl. + // SLE SLurls will have the grid hostname in the URL, so only + // match http URLs if the hostname matches the grid hostname + // (or its a slurl.com or maps.secondlife.com URL). + if ((slurl_uri.scheme() == LLSLURL::SLURL_HTTP_SCHEME || + slurl_uri.scheme() == LLSLURL::SLURL_HTTPS_SCHEME) && + slurl_uri.hostName() != LLGridManager::getInstance()->getGrid()) + { + return; + } + // As it's a Standalone grid/open, we will always have a hostname, as Standalone/open style // urls are properly formed, unlike the stinky maingrid style mGrid = slurl_uri.hostName(); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index c275068028..daeace0ec5 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -3383,8 +3383,21 @@ class LLSelfStandUp : public view_listener_t bool enable_standup_self() { - bool new_value = isAgentAvatarValid() && gAgentAvatarp->isSitting(); - return new_value; + return isAgentAvatarValid() && gAgentAvatarp->isSitting(); +} + +class LLSelfSitDown : public view_listener_t + { + bool handleEvent(const LLSD& userdata) + { + gAgent.sitDown(); + return true; + } + }; + +bool enable_sitdown_self() +{ + return isAgentAvatarValid() && !gAgentAvatarp->isSitting() && !gAgent.getFlying(); } // Used from the login screen to aid in UI work on side tray @@ -8100,11 +8113,13 @@ void initialize_menus() // Admin top level view_listener_t::addMenu(new LLAdminOnSaveState(), "Admin.OnSaveState"); - // Self pie menu + // Self context menu view_listener_t::addMenu(new LLSelfStandUp(), "Self.StandUp"); + enable.add("Self.EnableStandUp", boost::bind(&enable_standup_self)); + view_listener_t::addMenu(new LLSelfSitDown(), "Self.SitDown"); + enable.add("Self.EnableSitDown", boost::bind(&enable_sitdown_self)); view_listener_t::addMenu(new LLSelfRemoveAllAttachments(), "Self.RemoveAllAttachments"); - enable.add("Self.EnableStandUp", boost::bind(&enable_standup_self)); view_listener_t::addMenu(new LLSelfEnableRemoveAllAttachments(), "Self.EnableRemoveAllAttachments"); // we don't use boost::bind directly to delay side tray construction diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 92c61ddefe..82bc084f68 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2183,7 +2183,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) std::string saved; if(offline == IM_OFFLINE) { - saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str()); + LLStringUtil::format_map_t args; + args["[LONG_TIMESTAMP]"] = formatted_time(timestamp); + saved = LLTrans::getString("Saved_message", args); } buffer = saved + message; diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml index 0f02de866b..b373be4382 100644 --- a/indra/newview/skins/default/xui/de/panel_login.xml +++ b/indra/newview/skins/default/xui/de/panel_login.xml @@ -20,7 +20,7 @@ <text name="start_location_text"> Hier anfangen: </text> - <combo_box name="start_location_combo" width="150"> + <combo_box name="start_location_combo"> <combo_box.item label="Mein letzter Standort" name="MyLastLocation"/> <combo_box.item label="Mein Zuhause" name="MyHome"/> <combo_box.item label="<Region eingeben>" name="Typeregionname"/> diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 514b0a501b..1d58e7a540 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -2408,7 +2408,7 @@ even though the user gets a free copy. name="label shininess" left_pad="4" text_readonly_color="LabelDisabledColor" - top_pad="-36" + top_pad="-37" width="90"> Shininess </text> @@ -2445,7 +2445,7 @@ even though the user gets a free copy. left_pad="4" name="label bumpiness" text_readonly_color="LabelDisabledColor" - top_pad="-36" + top_pad="-37" width="90"> Bumpiness </text> @@ -2563,6 +2563,17 @@ even though the user gets a free copy. top_delta="-4" width="120" /> --> + <check_box + follows="top|left" + height="16" + initial_value="false" + label="Align planar faces" + layout="topleft" + left="17" + name="checkbox planar align" + tool_tip="Align textures on all selected faces with the last selected face. Requires Planar texture mapping." + top_delta="26" + width="140" /> <text type="string" length="1" @@ -2572,8 +2583,8 @@ even though the user gets a free copy. left="10" name="rpt" text_readonly_color="LabelDisabledColor" - top_pad="4" - width="200"> + top_pad="2" + width="140"> Repeats / Face </text> <spinner @@ -2586,7 +2597,7 @@ even though the user gets a free copy. left="20" max_val="100" name="TexScaleU" - top_pad="6" + top_pad="5" width="185" /> <check_box height="19" @@ -2696,7 +2707,7 @@ even though the user gets a free copy. bg_alpha_color="DkGray" name="Add_Media" left="0" - height="63" + height="47" width="290"> <text type="string" @@ -2782,8 +2793,9 @@ even though the user gets a free copy. label="Align" label_selected="Align Media" layout="topleft" - right="-10" + right="-16" name="button align" + top_delta="-4" tool_tip="Align media texture (must load first)" width="80" /> </panel> diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml index e2348375d5..84e81397be 100644 --- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml @@ -23,7 +23,7 @@ <menu_item_call.on_enable function="Self.EnableStandUp" /> </menu_item_call--> - <menu_item_call + <menu_item_call enabled="false" label="Edit" layout="topleft" @@ -46,6 +46,17 @@ <menu_item_separator layout="topleft" /> + <menu_item_call + label="Sit Down" + layout="topleft" + name="Sit Down Here"> + <menu_item_call.on_click + function="Self.SitDown" + parameter="" /> + <menu_item_call.on_enable + function="Self.EnableSitDown" /> + </menu_item_call> + <menu_item_call label="Stand Up" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml index d5b993152a..9059745f46 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml @@ -2,7 +2,17 @@ <context_menu layout="topleft" name="Self Pie"> - <menu_item_call + <menu_item_call + label="Sit Down" + layout="topleft" + name="Sit Down Here"> + <menu_item_call.on_click + function="Self.SitDown" + parameter="" /> + <menu_item_call.on_enable + function="Self.EnableSitDown" /> + </menu_item_call> + <menu_item_call label="Stand Up" layout="topleft" name="Stand Up"> diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml index ea18e02ca1..30c2cde552 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml @@ -6,6 +6,16 @@ visible="false" name="Gear Menu"> <menu_item_call + label="Sit Down" + enabled="true" + name="sit_down_here"> + <menu_item_call.on_click + function="Self.SitDown" + parameter="" /> + <menu_item_call.on_visible + function="Self.EnableSitDown" /> + </menu_item_call> + <menu_item_call label="Stand Up" enabled="true" name="stand_up"> diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index 9fac296e26..751dc0bf3e 100644 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -64,6 +64,7 @@ parameter="UseDebugMenus" /> </menu_item_check> <menu + create_jump_keys="true" visible="false" create_jump_keys="true" label="Debug" @@ -102,6 +103,7 @@ </menu_item_call> --> <menu + create_jump_keys="true" label="UI Tests" name="UI Tests" tear_off="true"> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 0b85074eb6..c79a484ef6 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -4,6 +4,7 @@ follows="left|top|right" name="Main Menu"> <menu + create_jump_keys="true" label="Me" name="Me" tear_off="true"> @@ -94,6 +95,7 @@ parameter="voice_effect" /> </menu_item_check> <menu + create_jump_keys="true" label="My Status" name="Status" tear_off="true"> @@ -138,6 +140,7 @@ </menu_item_call> </menu> <menu + create_jump_keys="true" label="Communicate" name="Communicate" tear_off="true"> @@ -188,6 +191,7 @@ </menu_item_call> </menu> <menu + create_jump_keys="true" label="World" name="World" tear_off="true"> @@ -901,6 +905,7 @@ </menu> </menu> <menu + create_jump_keys="true" label="Help" name="Help" tear_off="true"> @@ -947,6 +952,7 @@ </menu_item_call> </menu> <menu + create_jump_keys="true" label="Advanced" name="Advanced" tear_off="true" @@ -1451,6 +1457,7 @@ <menu_item_separator/> <menu + create_jump_keys="true" label="Shortcuts" name="Shortcuts" tear_off="true" diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 0499873fb0..6b136495d2 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -130,7 +130,7 @@ control_name="LoginLocation" max_chars="128" top_pad="0" name="start_location_combo" - width="135"> + width="170"> <combo_box.item label="My last location" name="MyLastLocation" diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml index cf174da2f0..e6714af943 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -295,7 +295,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap auto_resize="true" default_tab_group="3" height="450" - min_height="53" + min_height="73" name="add_wearables_panel" width="313" tab_group="2" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 676bef2d0b..cf040b10c7 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -3005,6 +3005,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="IM_default_text_label">Click here to instant message.</string> <string name="IM_to_label">To</string> <string name="IM_moderator_label">(Moderator)</string> + <string name="Saved_message">(Saved [LONG_TIMESTAMP])</string> <!-- voice calls --> <string name="answered_call">Your call has been answered</string> diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml index 1b3e1c1c90..b3ab2f4f90 100644 --- a/indra/newview/skins/default/xui/fr/panel_login.xml +++ b/indra/newview/skins/default/xui/fr/panel_login.xml @@ -20,7 +20,7 @@ <text name="start_location_text"> Lieu de départ : </text> - <combo_box name="start_location_combo" width="152"> + <combo_box name="start_location_combo"> <combo_box.item label="Dernier emplacement" name="MyLastLocation"/> <combo_box.item label="Domicile" name="MyHome"/> <combo_box.item label="<Saisir le nom de la région>" name="Typeregionname"/> diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml index 47d7a88b4c..808f19a16d 100644 --- a/indra/newview/skins/default/xui/ja/panel_login.xml +++ b/indra/newview/skins/default/xui/ja/panel_login.xml @@ -20,7 +20,7 @@ <text name="start_location_text"> 開始地点: </text> - <combo_box name="start_location_combo" width="160"> + <combo_box name="start_location_combo"> <combo_box.item label="最後にログアウトした場所" name="MyLastLocation"/> <combo_box.item label="ホーム" name="MyHome"/> <combo_box.item label="<地域名を入力>" name="Typeregionname"/> diff --git a/indra/newview/tests/llslurl_test.cpp b/indra/newview/tests/llslurl_test.cpp index b5adb217fd..40425a5caf 100644 --- a/indra/newview/tests/llslurl_test.cpp +++ b/indra/newview/tests/llslurl_test.cpp @@ -150,6 +150,7 @@ namespace tut ensure_equals(" slurl, region + coords", slurl.getSLURLString(), "http://maps.secondlife.com/secondlife/my%20region/1/2/3"); + LLGridManager::getInstance()->setGridChoice("my.grid.com"); slurl = LLSLURL("https://my.grid.com/region/my%20region/1/2/3"); ensure_equals("grid slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION); ensure_equals("grid slurl, region + coords", slurl.getSLURLString(), @@ -206,6 +207,7 @@ namespace tut ensure_equals("region" , "myregion", slurl.getRegion()); ensure_equals("grid4", "util.aditi.lindenlab.com", slurl.getGrid()); + LLGridManager::getInstance()->setGridChoice("my.grid.com"); slurl = LLSLURL("https://my.grid.com/app/foo/bar?12345"); ensure_equals("app", slurl.getType(), LLSLURL::APP); ensure_equals("appcmd", slurl.getAppCmd(), "foo"); @@ -246,6 +248,7 @@ namespace tut template<> template<> void slurlTestObject::test<3>() { + LLGridManager::getInstance()->setGridChoice("my.grid.com"); LLSLURL slurl = LLSLURL("https://my.grid.com/region/my%20region/1/2/3"); ensure_equals("login string", slurl.getLoginString(), "uri:my region&1&2&3"); ensure_equals("location string", slurl.getLocationString(), "my region/1/2/3"); diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index e963bcc9f7..08ba8c13b1 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -930,10 +930,10 @@ class Linux_i686Manifest(LinuxManifest): self.path("libopenal.so", "libopenal.so.1") self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname try: - self.path("libkdu_v42R.so", "libkdu.so") + self.path("libkdu.so") pass except: - print "Skipping libkdu_v42R.so - not found" + print "Skipping libkdu.so - not found" pass try: self.path("libfmod-3.75.so") diff --git a/install.xml b/install.xml index 3a9dc5f6d1..a47a732d56 100644 --- a/install.xml +++ b/install.xml @@ -797,9 +797,9 @@ <key>linux</key> <map> <key>md5sum</key> - <string>b379063f5f03374f85620e87ce48e497</string> + <string>b1f15bbabb68445e55ce23a2aeaca598</string> <key>url</key> - <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/indra_private-2.1.1-linux-20100820.tar.bz2</uri> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/indra_private-2.1.1-linux-20100826.tar.bz2</uri> </map> <key>windows</key> <map> diff --git a/viewer-hg-convert.shamap b/viewer-hg-convert.shamap index b90d98d428..29f98ed8cf 100644 --- a/viewer-hg-convert.shamap +++ b/viewer-hg-convert.shamap @@ -13891,3 +13891,542 @@ c267182dfcb36f6c0b99b67969a3122c45004f15 520ccbb610dfdeea531d2c894756d6286702a78 07710c4679b285ffab80e83c02c85084aeead0df 2bc5c6bc5ab38bdd6ed182b29d1cd03301de7b05 35138c9bfae8e85f930e8779aab0483cb8eac623 d32e9b00a5a67db432c162e6beaab23bc50d6936 35138c9bfae8e85f930e8779aab0483cb8eac623 a6250fa92374d84353e5d80d38bafc0a315a9d71 +5c5ececdd9165d61df64ff8a7cd1ae5d518ba0ed 66bfab0dbb41ba31d535d2ce412d9f7a88c5942e +a2a5725545a9deb75cc8b612f624358537443330 97ab2604669a6004a1b73d8fe34efa74bd91e81c +08423454fc4dbf812770d69675badf2f5c89d43d 03c49960563fa19b919becf2602a229e7cf0fcc5 +0b240c3ba999888f964722fee88e70f33e133eab 4d325d4f59e6213d0d85a4f57bfc34801164cc02 +6ea755725c27d76ce1a161ab8262cc59247625a6 8f614d6d4b4a1862df8e0e470e03a7a0b915502b +7d52d255301639c593b89bd31cfb5f83e72b8c33 07cf6ece7fc735f39a181b88a7dd6e3b1d6e4daa +371195160372e391c309f6ac1acaf9d0a0a64f93 fc2c560bfc1b6239043a0e56c630889c885c4916 +07089a32bf7c97818b72f87af0f4619420148721 d775dfaf0293308b0a6c95dec63645982d58080a +7202954103df308dcce7389a626c5615c6a99788 cfd317aa69385f5c50deb00762e517b2fef1d12b +271ffe664bd2f74e8b5fa2a888edfabe95d1a6c8 801ae59617ee7e1da11a6beb8b0136186e5e693f +064acd6d3ddf76fb076cf3213906697886800663 ca385c19f1a10e1e9691567ce9d44bcc6d6b3f03 +1890c874ab4876f5407ff589998993ed00cdb059 2858a1b0015137c30da2a5c656ffc0f5e14b9200 +a3e2f33837a7167e1c431fa8e77b35c00808070a 0553ced8b5a0c433ba077c2595315da0cdbbd17d +3451d53f603add8dcdb6e7a5c084b8725f868e05 507861dac9a4f74b9dedb3b9730e65288dbd7d68 +23885c2527483ccece854095af32498aa5676131 3fe02760c682eef4783ec7c63f63f8f78a0781b2 +c1dc021ae5213233669bb114e8f25bde8d49e8d2 0f02aabb07ac0b63d2552ad75b23199e8043027c +fdd823276070994ce9546f32ee7387ebeaf7e6ac cfdd65f867be38028944e20f87fb17921ec389ae +160f8fa616afc2ee686d2ac12e7bf6ddc5379b60 0f7245306ff27c5f036f62471972cc92d42897e2 +1045a61877be4023b40971d942199e1862cdbfb3 36f9b2b6ec061a62ed2a1795563b4bd9903b3bd5 +712c197687c917a5b7bb13b4c9021a455c7425e4 33eeae831cdb68a9552448116780bd21ef95d848 +262a807129e69426e9feac023e634209c817ff64 1c9652fa26a2735f3b7f741169dcb224a9d60faa +08105fadb71a4cf1a1ed27996f1c9ae18aff754f c16a903b9f32db89aa580ff95baa896620267a1e +bc2226d86238fc3d04c5a784ceb283ddc1a2d2d3 d11f06558fb3413ed0f044ad1210a2167c3e9c98 +1be7627d95537a843aff4ae0da7d401cc5eb09b6 82d80d2e287926a7b3927ad4cdf822491ac5f292 +2527f4f1621958ee07a5452b210f180e0efe1246 f1a37dc84bfd03c6924e14ed61344dd1d7af2c64 +a9cb81d2a1bb2e0b0b904d1ce22f15aa11d9304d f5c6d4b47e22c804c15d355c1f8084e35c2fa265 +c3a397ebc129c924ff61960c6f0257d3e15f8b02 911ff09337a37348a2a3bc7465482d0955522e75 +dedc484cd0a853bf9c6cd081663108a314859624 2a6e1a7aceced726c68ea2f8b8cd82a3af708072 +6f178d14b411498dcf4aaa1345ca7947182b7753 44eb56b02a8f22fa26d29dabe01a8a14488e1e0e +54f3510f13b672e1b7cb05ffd71a0c84eaa1f20e bc9a8165f582daa38f7b275b322e6013f368a4f5 +5be7af3d024b33e0ea91f9c2b34f3d4501b5b327 1a852727b8a31a27e72b5964f5bbbf04f5a17215 +64f74b638affde4b12e10bfb62d9ae077b276499 dd041cb6b84bbfd8b8daa69eda2e0d866f9d356c +aac7a129f76b81f3f329a5ad8dc02d77a9963abe 4ba1f7c837d3e394e22ede6ddeddf38b72b5afb0 +80e9acc23515bcb4c093b94c57bfc080101fb77b 53d36cbc5df209d27d89065d6841cc0856ac673c +d641ff792d91ddc136fd54c3d73ae9cd10bf2666 c8b3053e72c6b6069a3cc45646fd635740196111 +26a4d505971d128629e9e90b3e0c61badf4299a1 4a29f35ed2215cd029e7511773fcb603e00f0071 +91afc47fe4b97e8883cf10e00b2e91d3d73ec991 db3d121cea5eb21648fc2a8a8da7ac59b3711f14 +4f407b6db81f3e362f0f489cd4ba5b6bfac2a018 7ce66a87da35b91d6bd7a17ab4d43e24d828b0c3 +6fc45df1cdf333f1961414216257a6b209ddc981 09ce018e32b247afaab99d24bd1abbf00388dd37 +1bd45be73d6dc2f0bdbad962c2266d0e82f9f540 8d48ff810f46a68ff157949464dc827bfb8c114c +8b9b9d5930cb8783790e02318e291027dec1fdb6 d087595ed4c9a912acc7942ce1324ed1fcb6a538 +bd1265f3e43f9bed9a14f065a29712172c325072 93933cfc8a004a16a5eb9f39c9ef5ca769929080 +d9718b616761d0a30018fed104134be724ccabe3 26c9805fea1adc733d5c71290d811486f506b4e3 +1e5af8092bacae80b9bf44c2edb73d5eb65fae0e f3c7e3fb15257e77949562bb6929490319f92d5c +796d9749e40316ad3d0d9cee8f6921bd925aa766 0986d9abc7ba15a830d340ff6123931e1470015f +b0a7b75e2720ea724d58ceaea218d38ade1382ce dcbcdd44f064772f41d87f8fe1f4156998226b34 +9c5e7652be42956726013bc332eec3053db1f509 c5acec256d84177a29aa652c8cf69b868af8dbdf +070cd06ce26c3155229e03a0d44638b168f1bae4 d307025224ed251d6d3e26d322204a75e510e76b +5942b26b9dfa348c7e59bdcbf072054cf223117a 69b9711df065d4868766ba283fb62ce909f192a1 +c7d1d670121afdf76f8287b62f1faa029b03126d 6916fdddee476a23d33f519ae582185cf1e907e4 +39263ded059d783eae6c2a98b0416afd09e3384c d43661300701213502a5a832c95a3e4bc66e1e5e +ece3ae004bfd5a69de56d1cdc1bc18cdb629b726 bb285fda0475893e44874eaf37dbac62bad8fe93 +7dac97bbe561323498ddb1d9024498ca4485233b 5548911aa82d30eb980872a33b9fe6a5aae96741 +1770b24a05ed54a7fa494ff8a12cd2e308cf2989 355b35c2b3e2bc69dd86a7c53920cf93c1c50eac +3ba6621f0fd10daf4e3f3244ec6d83c6b40a2ab4 bf10b61752f7db17d86c0834fc6108f586bf2e2c +0d585f5f00cafd75f7b839632aa2c73b87e8a8fd 152704ba6f55e1bf62fdd93589dc1dbc5b4e2e3e +1d45aa7a46674839e6bfebf8ddb1189416470977 442a3e52a7e1468173a548ff73ca03260dcf9d9a +98652a5b7dd9a4c16256bd510141c5b00b574af0 9126422f87aa3e49e7556955af036f015e29fecf +49a8c196e8a2aca4b24709d1948990f75b448909 8610a1948a8f639a882700a5a56e638bfdce1bfa +c494f1110ec8212300c532aac570ca38e0354e08 9878ae16dd1c4df7cbbdd28dcd7b42abf0c86002 +8ed97e82ede90244c9b6d290b922185328b5e252 fd59aa574dd4634f9579dacb47823c1ee5b61c20 +18ada4642cfa110b42273b9c1ae26a3fa72e45aa 140b35158f62ad0cf119e06f2dc3a1d23e8c1c88 +b1656ed1e92cd651d943af80291e27ba9de45d77 02d8d4c951dc3b70248e0bc10c0b4ad109a03d5d +92818c0f4916b1f16602a396e697f0d8de47ac63 a260b388689d9f5dbc321d04725675ae8abe49f1 +b67cf042fdb9a61dca5f54ed5632c4678e1cfa2c f9af5ba22a49e358bcbe4384f830dc14436f355d +e1e4b68b2730b215bdc549a032c303d9c8f46510 e23a2156cbcee35989715c5555bed06713c29a96 +48f108599240c372b17af1324364a1ff3698f810 9a20e73f9895562f7b6461f4a48ba2bcf6fa915a +a27ce616d045df8ef43d4f2479260bf629a73355 fb88396417264c75f4dc7bbe26d55f5ac404f006 +ba582c06809fd6922f7bd753b3ea5e7f8e5f11a9 383871a7f970c0c2a12a6e307e4752bab0d893c2 +11c7ffd26c7e4f2e6309cd164d55e852ae671f04 720df5b82cd396d9d84ea03a93fce66e44a06bb1 +9bfe19c63b517c603c9ee3ec8a5669b6c1ce4af9 8f22b03cdbd3f841c95f84ebc42d56cfa6befa49 +588977a0caeac8f67d8ff6991473bce1fded2646 29f8c1e0f40401c45c179510dde06e891f52c07f +579ab56ab7e9c673ec0003aa6bd5be9f96bd7301 739486b83c5a3a67727a2ef5fb62f223b526f949 +b509b85889e58e5b13e6029e0c47b7e9cb76c85f 25ff5daed19851a9bac03267b1f6e6f6bf197731 +09baec3ce7c1c27f2557b78cc8ddfb24cf32add5 dd623b1a79f7f0a4a5a7d584c3ee76df184a4f44 +8086c9699c188b609fc08c664db5c050f4b87ea4 61af04dfda03c9ae256d041a752320ff6b596372 +c382e0fab7e66b813ccbe0998f8a6ee86fc4a60b 5fa3e7b9fda29fbc8588e7282363aad8eee0cfbd +ea9c2733fbf6d22166c213cfaeb1800a30ce90e9 a73724008d6db9e242330ec049143579741d6761 +298b1322a6646a8630b4656a44d1e9e4bdab7d61 7aea8f2008544a169280578fce0107280bd4b1de +67fa4273bff04278ec9b3e25d0991f8790a2ddc5 2e536e3e594307b6feffb7fcd583ac83c5f2d73e +78dddb3a1dd300fb727c1855f729442c25d69d93 cc7d5e69827f7f952fc60ca6b5af8f69c11bc67d +36ea57fc1c67f4e806d35fb15d39f33b400510a6 8277dba809eb5bd7163158ed5b1cb62b41da7ee9 +4e01b259fdd4429fe5e2efe14c3a1266714e0c88 e46a6e6c8176a4f7ff110c244e91596e3efdf567 +5d5e820de3ef131a895b89519753734124f3a74c f95b48b08f5ec2fea03c325a9f26bd21ef20d069 +8d006f07bf22da25db071efaea0804eddb600970 b2d72673aa6c8cbac1c565340994b514ec4cc37d +788c48f49ba1d9c352be86b1434b458ab66ecd42 41807eb23a357a99c05c2662c02982c38afe1250 +24ced57037101a42fd47d5e53a2ce3e36c6b15a1 d90e0f2abd1fbe193bc8e59b0ac393f4a8a76aed +99a474b2e33288073af1db395968f3536f8941f5 f2f3a215935bc3a46440ba973c86b13d7295352e +307ec4b73895fb7d1007f98bf2e5eae731e5c16e 3ca3d3675a55599a68d3bd44a09f8bec14ab8cff +3195c3a33fe71f43c86c695c01e7ec268a20f54d 0813e932df6243ed0cee958cf37de1fc60b9a518 +9b5c88fea509da6c82ee3ada5aedcf4cd4ab5502 f0825f9b0db7a3080d9cd1ba95b9a2873e14a56c +0f7e446130a89330e33e0f61edd7e3a4d5f5777a 8f670f3c95706e473316e3929fa07ed123f50572 +df35aedac04be171a7ec10df58636c6bd4fca1ad 0b39f9fcdeb1f8c1a389b079b26dbda208e55479 +d8def9fdd6577ffba808c41b8ecc8f13fa219773 41b1a0393cd5589ff3111af1352378b7dd53d07c +b16e3e1e5af804db3a817d066f252037dc634a43 b10da9095387d7307ea930f42d104cea881c9b62 +0a39b7f7a08a593afa65aa3f0d88bf66653906b7 7404c0f2c5b6daad3388a928c1e67b75bc513d6c +c638606d3723fc375139a6c7bac102c830d76cb5 d791304c05565d5fa27fdc47c08635b2ac3b776b +0e1df71eef189c849d25d82f94bea50a8d08d5ce aac9d5f0238f2c9867ccbde3b71fdc48f0bf5737 +08cd58f0ccc2eb6b5a52081421eaf384c5af06a0 aeb37e55b2c675b8270863711050366561af3d3d +211aeed4e8f4c9107fd1ed31ea29f08fb1db3bfd c5407844273842488de997b3d3b814e91f1a08ef +c245b7d852e0f16700bb0ed5c8c92c385935e343 184bf2c188c2444db3fbdf7c09c47a8539e80640 +afa69e8d559a8960fddaee1bb7fdf392e22afa56 f6b44442b32bbe6e25364374ef6aec02d5b16ee7 +5f69724b57df17dbc91ddf14c352e6f8d0f252ce fb25e84af925740394d9a750aeedce0e368bcaf6 +0b6510af17871f151f0bf6a580cf2e7143daa161 962c68da6afc4ae461db63a2a0cc3c67f82960a1 +e86aaf84bf89f1f06f53d21121da907fcef3c168 d47433444112361cf36cdd5b707dee2c4b7fe1b2 +be3899299950211ef9d99b9928e4a69d7ef812b6 7b57d38a9cb17b8b4daa08983308655f79807b49 +e1973f1e374c17a0c4b017e73fc0aa557745fbd4 e23ddad349b6276b39d84d180e0b3597239117f5 +17f4e34f11798eaf77eb33c2375bc06d6e225323 5671c09da75614034528cd18c2b1fa85df596b36 +e644cd567b1161f567876414f67ba45579823f9d 6724449336146ab10baeb1bf441e866fdba94e48 +c002214bcf3af7319199b946b1acd7bb3099c825 abb902ffced26b87f90432bd19ad7e356e6a2069 +491edf15255a1045942751eb65d588a554ff5e0f d450f6647879dc48fd39fe8bbd7b0c380771203a +e0d28526c117ed483ab2b144bc321925b0dc89e6 cefe1c5f441fd52e2e95df9f8fae695347aea0c1 +e01102fd80903b485c5f3013f72ee34a5d83bb1c 71052e2a41de6ac285e6b0bf1be37b9f83f1bcb1 +18edc4858b28d1126709b1736b95c7afdcb680c8 d53e8fbedf4167e51ab23e88a480140ee28672e9 +c4553aaee0ed4b431867e8a31229e0d4ac600e91 6ceb29625a47627f5f375686490953a6a85965ff +f95d7cab0fe6daa5fe78f80b6aa16ace6fd98f12 38b081ada4ed0b548cbfb6f12dce7d358fe429b0 +a38b6aee5af99b5f69b82fc6c7ff55e65fa3b45e f65c5827fdad4ec963fb2f9b84157d3bd69aef7d +7cf3979243401e21c60a01015608d4f09438ed8d 7b61cbb611f25f4291ee5dd91f95532cd76b6d17 +12dd548be46577b74a8e13a39c3e4859fa5a0566 ff9aadff2281b8380b0fa150a0aeb29d57ceccf3 +5789043409bbb90b4950f6b4ae2816cf143e3ad6 35058f073c1f213156bc7d8e7d4e568882a79a0b +3a59c2729b37a7e35f9380f1d99f0c416d5d1563 2a0dcda815a88afcf74cc1adb9030970fbd043cf +d06f35fd8c7991183687486193f121b2c504fd1f 99cae3106b625e538993a4a883e1cd85f4012014 +cba9bf2cf5194da14105cc28e792f908ef672864 f71615bb527d8eb95748f60aa28cf8facc83f9d2 +6a68dd0222f940edb6c7785339f88e8e1c6caa0b 60282aec053e2993a496d12c3a70c419a92b7037 +38b1bf7b4f3d94e30d4180ce50eb63e582b9993e d6c4049d4b895a9c034695bd42484df745db83ce +9a2d88bd2141d388a2e022ef993a78a1420dbe90 12bbb2f87143501e8483a2742be61dc249abd883 +ede2c9f28dd5f684ce288c7b86b16a6b4a4de4a2 dd08632a2331f32b14b80e7825f87799771fa8a5 +706b8df74b3f1185c629b2746648c22f1eb493b8 851dcd14ec99fe88aa373d42f29bcc22e51a0409 +08dc2f58ab784ff76c7920be017e026773d0d100 9344e5f8ae5533e6eb790cc35c7d9e046c8fdeb8 +37e9e67533d7dd65dac910f19b65f777803b3e70 3af4a96e0d6e49c295ff3417e522b1c6ee6e23d4 +04c21166cb45b2ce437ef2dadc78f2305812ec17 f0914de01cc2473df856cea4206e020819216f75 +8499ff40544cecef0edd07934f18baef10af2a2c c233f7ffbacedc74a8933203e119e314482989cf +9874486f6e056333b1584d390c94f129ce06564a d3d9cb1f4f2fe61af970deb2d7a2b8142e928972 +bd146cb3d857cd628e55e9a92e8d954966a426e4 8316ca7eaec2e7bac565846b49d3075a539f1070 +0b8a8fda5b4f9dfef4b1d6a45fb9113a3fc245c6 32d4d57b3873f41357045112f3f561d0595cc4db +9a20ba9d3b719fdac1809d4c2946ff3973892789 d5eb635ffa88ef2bde7fb829bdd61fc38bd8582e +6b5030faf67e5c7590ee6e182602587b1b244f93 576835275497df1c3090d3954949c4a868411022 +e833e7a7121cfa53f6ce45821cce62b360bcea34 e80f3f02d252f972b560db8edbb4b903d7d986cb +b4fa63a2d907e3c4da775f0d49a3223e88cb1242 d590977ad2eea48c4a74f2afae282c4169b1ad68 +a3bdc91c91b4546e2ade3bb98e0a7f37a198913d aaadecd751332c1e3dee6f66809bd54a4acbce19 +6101755e247c315a14fbd4e41bee057013e099a1 80fc06d522246fb2972e8ac72270fd1813855730 +3c0c0203e7caadc1a3664be2ce861dfd2c98ecc2 00366e122b9b9ac11298ba6f030ede2b620b2039 +dcf3380bf77989c85ebd4146a6e57ef0ce2d2647 2f746808e602d9699563722668835378120440b1 +afe09ef1253675133ee467962633217d9032eaec 1e254e694b81e384cd38909a2f73edca8b9c0ad4 +1cf51e021a62ce22fa37b073979d4d0ee7979281 62943f9f59620bd1b0652cbbb3e63fd593c0c07b +d4f35361f93d025f2c665bd646a3d76deaebd142 0c7d388fe6522c13fbf31e77da06b6a1ab654233 +47a02f4d6d2715ac797faab85b5eb41cfe99d358 95c665ac8ca9878ff7b5d49ee92b93417be1ff01 +b379d162769e3e6093cf4486dafe14cc589ad693 1ce9ef6b3e7b22de24907b8e8764555941321655 +8badb2274c90d36ecbb0fabdc5a1e8254f102471 8a7f94564b283f31b42af614dfe23d2778abb891 +649103c5f76a84b6b469f866acbd40d76998e1a9 40f6bdf174b5d40ec3c0a41355410fd89bbb319d +334fc6eba31c9ae731ae4415ba83cf86039eea57 e997bcbdebe457317e60a53b63a27f43da31da02 +d1536931b880dc6709bcbd2abb52d20f1180034c 18af2c7d36549a60adc6ac32aa7d8f4b607b9e7e +dfe2bf1d14865041730250d9bbf486406736eabf 742c9d8291ff578c3b652515e835a8397e607c8c +51186a5b40063e7dad6388a99ddaddc6ab89d0bd 9dfbab4714659816a2693e1e1c1d5b83b58e4375 +194106f7443ebac4cdeffe6ce4d883b3f5465111 4366bc2e0603fc0f9d1a3e95bf864b90d321fcaa +778a5a83ef4e5e70652fbc00f2e1f8375e587afc 65f17fe1430f22b9ef280d1b881a00a7aa419757 +36680184ec50ecf5fff92ee33db711b7512d923a 49b55024b1f7a4cc776d1160b2d1fc95560a0c9a +57e136beedee9122dbbf46a1d91f6514f058b829 892fccc4064d67e42f48a05ab789eb7b8a131130 +0aaf4b4676f27560cc436d0ff74b7d812a1e6662 a890b4c57ef8f89834de5e2e41da41bc342f9fd0 +7371669945e7f690c9f2f22b04dee0b0b3cf70a6 21fa726e54d490058c975214dd1773699c8ff284 +3196941d73f122f5dbe42aa0ffdc28a2470ea089 c923fb8dae0f6ef4157a2c2a2fa898110ca0505e +f37fa9b31c9b82b0ca1f13c5b18c024c63bc7598 19eef5d0208e75f2550b63047edce075d4cbe1a1 +6f25e5a4f0e0d7bbe1ed3e14e7da4d371e290c67 42e6a2db92f56af099e3dbdcb5bfe3b4c501aa94 +7afdf5c80c20934ad0c228f41406b3c5df06cdd8 b731415c92d88089a0fe990e57d5f2337f440993 +69e3791e134fc080564d46a71251f15fb1934070 1b249d6f75edcd8ab6647623f017a034d8254c24 +f2365628646e7703ef47e54ea5c3ab877afc465a 9b5c7790d4119991edf02e1e050349e4c0d5bacd +bde80560117295f6b3e61f9b47f3bdea826945ca c6e688ac453304d2201551c4940b8d52c390fa9e +42a31ea27be742c452a73e88dda918ea66947a07 c72cb035110ca6007860db68c74c5d0cee4af213 +1d89b85c797bff6ac251999056d54cf46b6c869e bca9dd535f15a4f2232f4b27d82a3cd18e740490 +610181b56d3c39852c7432fefa76ad517fc942fb 4ea0f7b0d13981e6bba59dbf9c54ab492a0832ef +d58b75f4d0412ba33f1daac52572ab34ad6cbcb2 3fcd22f3552e181871fce5bac6099d34cc843b74 +21fa62ef7038ddb1539e2eba3690e236f4a866c8 2577139c8809ea6cd6c31ea0e3aa770a2b654879 +053ff9dea22d3507ac08c7d671f5f9dceceab0fb baffe5b3c466248beb827452fe978f5cbe427c42 +495a8d490c861c78ddbc68877e4ee593a8770be2 7fb0274c98368fb73bcb0851ddc8a814e9d982a3 +9028be7fec186159dc733b225ed558410aaf03de 0cfe91f9c83c165c25973f6f07c26a629e0f87de +4b6b655ef6aaf8192b81358a759ba6b02dbcd1df 6117cb9dcefeddaeaca6d2fc3c5fa4e1c39323d9 +1772f8d2575bd717794dfb3624508d5324dbd823 3d65b0698399489ce1e9256a95721755f77532aa +ea82fcd4589d3cae4e6ef1b6ba826ea2e4b4e846 3823f14efbb9894829b2ff1de6e7c57e0fea1f2c +e17fb66322f0cf51fc19e17111b38e82d78c50d6 57f355054415ca89296b5bc207bdd0db5c0f9d67 +bf541483d9074c18c6d4f4bd19caf0de82013cbf 369872fa9c5386d2bdc2a37e29355183a7f64b01 +15cac4881bf11eba172556d63416a5d462e5d6d4 f6e9805ebad1c03f66444193a38676cc543e7ab9 +b94be036dcce0c8324d966846dfd2475349a5eda 9bdc7dca3dcab0dcbee0639e8ffeef02ac2559ea +482aec5c620497a4c242babd135f1898bba271b3 dee119d7a5156c8198d21f595de1ed225aafc647 +9e23eb15550830b5efe1012c8169339931ec5f32 9d45e31e4e39e3736da22ea917623fb2b36f393f +c336ae03e4b5dc45dcb05e2e9bcf7a7e62f3f6b3 83606bbdc084c962229c671fc2b13d1091e5ff29 +dd081111855a722ccba3f1513a18c54fd875aa1c df8c61ac8ee3e9be12fa7650b9d69a7de2c2f565 +569666ad2d30d83cab0eec1eb206f7e91e89d398 1dd0fe381c0abaf8c434c78052b329d5aa0517dc +3df270968da72fc7f7143cf778a2148abcf507f6 1253c128500080e53968786bc1c17ce74c62ceda +edf4f38c846a1e895cdb839bc5c044fe1761d770 a4fe5db599acb138f97aa1b0794ee5e5b44af74d +4ecbc3c25fc27871654b705fafc7d74ac77a65c2 cd3f5c873321f2cb3d5c73c7eee58d854ef9068c +1ed421424048a5ae8045ebc1d2b853c3a98b5493 dc9d3795d39ce5f527f434573c93e3a6e3f4e1d7 +ead7b61a6b95fdfb556ffbacdbfef3eaf0d4a168 9d396223cb9f90ae4721ef135ac42462268140a7 +3620b7690b1de428e8bada86124566157ea674a5 43913bc3230819d2f37ee479a5d6899f6397346c +d7cba3b0a2f4fcb2b729a0422ff70ba730c8b92b 1ae13dc1fed06ac5889ff4b03f7aad90deeb8305 +9524268a86761b4bd5a421af3dae48850d93ca5e 9e3bb1f2469cbb66857b3325f7c833b76c58e9ab +7aaea473895e09869e5ed26d85be21c122d56788 fa7326e4b22f85c5bb3e68ca474098f6db7dabc4 +fc8ad4823407d51a64464e0d8cdaaade1573a0cc a533f10e2fb8d270fc34e1fa43a82efd2f3f2052 +f805a49439909faee9153212444c1dafce92df7d 1112bb17dad3fef743bd7a1d57ac043bca8ee4d2 +3932458625bd1c4f62a6c88dcef4dadce5b00339 cca85f45d1766be0bf9528f4cb9ef6a62cb1a900 +a260368d321c4c5ad69a965d08c032025be639b0 a6906e163c1bb3426b7ff2621541b715e51ee5e6 +d913eb3b9c4538bda5837732a21cb9413b6a6c60 3a129414a10cb712b62f073f8674be3a7ac40c52 +e1687576d22105db59e68c67ab5f856957d1865d a7cf5992ffabeb2f49532613967abc83d872ac2d +5fb718e8abbfb59a9fa9c0222a555aee964f4b6c 50530f5c170d602713736b2ed95c356e3320d521 +bc1cf9fc03d2cea7e4ac55df76cb2eb7cd550ef8 1d1cf9052ecdf957721c5bc9d87f63f414059fbc +d3163a313db90a1699151c8ffd7f2afd66abcf37 9f23cfcf4eecc74142a40a14fdbea93a127acb98 +c63d01d56d0e27db3fa130dd6bb4eec08f2ccfee 532b5d15329c99f380a2ee1c7faf9075d40658b0 +0f112fbae4954a6ebec53306c085ac57b4a91331 e4d4c51515d7a662543a1c3028ed82d685ccb376 +2db202cd64345bd67d757ab8c3175fdbd38a6cc2 f38a76f983d7c6a4c3949ebc5cf5ac2b6ff96ddc +fafcbd5220c0696f6951c5ce77815d883957ac39 3d097a3b8f52702dda4b754ff92f9b6fedc6a070 +372fb87d85f7d78c6ff285b4789bd868cb000c97 89d61d346af18a20a5049a0fa019624943cbcb06 +8d8239a10bdf8001317553202717277334022b21 51bc8c8bd9bbb3e3f8ceb0a70c2eda8eca3bcf05 +336b16d21b54fbb57d5c6eb0db923df73d16e176 273d510a0a8e823d59810fb8612c648ec7096be0 +997456b101841697cd1b5bb22955ff9e314405f5 7454dfdd5013b216ab1231420a077ce1f87f386c +8a75298a6965eb35721e63420e7703272d172671 6ff6bed0bdd0d37ffe6594b44d415f3a920dc135 +7143feebabd71312547d647a32a341c07c0f3121 e2276257cf5204c143aa191eeb17c84c719dc2ea +3f95c322795af28d9b8f8730b9479a8925042039 e735c5ac250ecf0baef7e6988e95ce0d51c070bb +038a7eab2205921584fed72a75c59d3739f120e4 ad8feaf3c843bdf43fcd344afdf0073c833724ff +934f757ed10b41413e6b064739cda7146023068e 8c9a849f090287dfd7a0a14ffa4be32187b3950a +7c0f51ca82fd21389cb7cf833887c63dda79b2fc 335bd0b75c15f898d06e6e1af616293f5f06e96a +276fdc7b9cfa8a7913f17e0c60a4603ba3181cf8 4e1d1585e8cf218b04a065b6abd834f9d4a586ef +1c763473a1b5b63c0bbd74afb7befc5522b69d17 91dbf65421f54310b2b64e80761400891c6df89b +eeff72dbd3f8a43c78070f01cb4054564b3e6aa0 effe24eaf9dfeee69e26048711c174a388b1f1c8 +9ff0560f60433ee3d194006ae0ae36fd6dd1ccfe ae6732309415db5ee7d6cc61d7b7fa9893ed69ea +28d69f6c7f787230c3569ca07d5c1ad338aeb6a6 69120ea81f5d17f4969263f42c7f0822c00d086b +2d797b9506cda9cc17310bcaed23b7d27071b941 3d8664a7d2a82e48cff2c168a6e4650075180e62 +bd73296081f8b98c8cce93694e58de8fa4e0452c 5ac16b98a63d250957e69a05ea149b1232ada130 +11bf20602885c3d2d42d8a7f7361d2005a708b5c 7836cc8b93be35d387f8b95b1fb4cfd5f224ff53 +3c79fdb428663a03116f9ce02353e4c41adc1718 ced954b2463d6108db7ba9af4cc2b1806c56dac3 +802b67382e31c31118494570a15e8c1b4ca3749e 65c10fda5684325f147eada48af47afa4eec1848 +e67bf3d79e4341be1ab6eb9a26ab669005736de7 acf8080bdd9b80fe3109a781a063c9257a31ebc6 +dfeef23df3a5eb6d31ff46c17e8ae5bb09ca79fe 475eab0c6e5e296655d7c88fce76b6673feafdee +2fedbfb21c2e1946d53bd0a1da51ddef77544005 9f9b8a0a763e9b5938835c497a7eb6644ae6b72e +3daaa4e168b8cd1cb858214f1e42a1c4d95af731 76ef916dff07f053c8592649bef852ef1055b971 +34b7003a5e4a4e8da612d9d62a8cb314d9c56bcb fb2819f74d19363adb5a28c356ca25098ec37196 +cc6c02d43135b77cfb6c11474145248e72fac05b ffb78950143e9beb0f07e3f4bee7e5cb27df2033 +f86ab98adc3d7fd4eaa61d1a4685c5d8a1efdbab 8572c3d700c39de103ae9f96e5dd1417e774eb50 +20c04f6504943d5cd8d45261a69d06cd3b81c56b fa6bd431d8348ab4a2e70eee60d01226f2ade31b +d70dae59dc5a54322f736e0f1167908d80b8c2bc a835f03814bcf9fc3f8dd8ab14e5db691054257f +ceee5d13f032c0735c3290cfe7d80dc6dbda0c58 a835f03814bcf9fc3f8dd8ab14e5db691054257f +624e1473ad34771d003637c8877df9c7a6165d23 ea093af353febe94b8cf48cc19619701e10ab640 +b90515a211a961867d0e46cd46a0aadd4c6963cb ae1e8aae00d878f67fe45fd4fab825b115810606 +a548e35be52c3f668116116e6b628a0cadb11468 ae1e8aae00d878f67fe45fd4fab825b115810606 +f75d1322a1ebf7b541565c2e550f80ef6954c273 4b86718d69137a00ffe2eb22ca9b70f7f6c06468 +87d4633d20b776ac4524145305ba379f7e738610 8a893783ca1ec8b194325d959633e27633f1c6df +1601b5295e1bc57d7250b693993323ad7d0b3214 8a893783ca1ec8b194325d959633e27633f1c6df +7f21a122567530338b31d57eb2e83041157797bf 987a9dd5015b7abea3b6ac89bf4f5829cffca14f +a4e992a26a6734570524a37b581fd1641da3f6a6 681d431ee0080ed4653680c82d749cd2e354290a +e4e1d3f4fd990a118b9add32c1f3304e1aca4077 e2caa48b35afc85a89b5f1769053ca3c9a51ad5d +8c05621974f473cc8b68278eb750e045a83942fa 0c799fe0a011467c5216f5b09f62ddee26a6f0e7 +db8ee62ca3519c1488aee09a9e02c9f73d2cbc85 b86eb563a75614a3ec58912ad28207865d631acb +a3f472952a16d9cbcfc16681447920bde04a6ed2 79b48fd354244c840934eab857defead20011961 +74b62646437e5ead313f5afcc9269aedbe0048be 2750d230b6d3e4a461883db2d0fb03bee98a58f3 +c446b746447692bcfdd65e6b0131b51030e228cd f8df324df0763d2ed51ce40a0760e2a5472c8d12 +9b08c210edcfb3fe36890bfc6171c8a6d4aaa5c9 1e5b43fdf43b85f806d1a6cc93b1fddff8ed3b7d +3e482e6e28769c3f2f4e5587f0fe4c1b33949a1d d4e3bd2e370fb730236979343f054dc3881cf868 +904809c542f4517806ba794d85f31bbddde2782b d4e3bd2e370fb730236979343f054dc3881cf868 +47df1b3fd94ee76165231899179630770fce72b0 737994fe21b23cf9a0e3c7f541bc43ef16312b2b +9eb2b70f60540dd159dceb39850bb5a518ffaf19 efe99d0926806a1617b9b3ebf18e4b1cf06b4c6a +b1c6890eeb989a2cf83d8107aceb4c09e385371c efe99d0926806a1617b9b3ebf18e4b1cf06b4c6a +0bc66c6c1e73f9f52d244f450d6e9c86de74ba8c 681b1a44b6e90ecd754aba809a76fba2f606946c +f73b3197fe8ef329ad8a3b88c617361ed126448a b64eaf5e5991a93bf7078d81d3424df8ae5a146c +00aabe555ea6631277a80781176a33041168f2a5 c7b4cea3ff1de56872a01a1ef72c9c1e258acc73 +34a314297b7f7b3102790088cd867076efa71ec2 822cb176f7e9faf258ef317b8029ecfff326c843 +f1d2229164bbab5c10509913ea392da694a7cd5a 5b30c371718c17d598e84bd040672ab9e129872c +15f8294dbd52f36cc90fa0f9c85ddb23192ac09a 8d0a189d0d345457e5ff170f000a8e7e16e76fb3 +bb98be9decdf7c43f6dfe1b117d2c67f86345850 5b30c371718c17d598e84bd040672ab9e129872c +ed019e2607a9040e4e18fffc5f8a13956d8d3722 8d0a189d0d345457e5ff170f000a8e7e16e76fb3 +d90064c9f1ba8c2e8f12e7976035faf8673ae8a5 8b83aa1fcb7bd052713627a46a654005751393e3 +cdc2f8348087e25ed4e2fe0191f5b0019c26a544 8b83aa1fcb7bd052713627a46a654005751393e3 +49dc96bf6cfa6455b99ac5523980df195b8d87c8 8b83aa1fcb7bd052713627a46a654005751393e3 +144df58602c078063cd05d4b4cb7857634db5116 4ab2d0b484e7ec22e13e3f98498c8477fff1570c +e4f164f0409af48d958c7c85d869aef51d02adc3 4ab2d0b484e7ec22e13e3f98498c8477fff1570c +d23189d0c67c8236c10750db126b0bef0a9cb50c d34a287f441bdc13f4bcdc00264bccce36cdd665 +5e93b5c5b0d27291e566eeb4ff51edf7386f107a 4985d6a110a1b1a02dd298d4fa309d4410b9976f +917f8aaed631de48b04cd58608ecf842c9fecdee 0833cb3134257eb203462b4ab9ac8585f98f78b0 +0bcd630eec0af1b93ada21b105ab86fd3195b19b 80f69b2cc7c181f0fcdbf4a9aebec1fa7f811907 +96fff66678ed221a048180cae965419e4fb88385 7f0f4b58b4954085ea80eaa00120779a81479e2c +3d3ac980fc387e0b4004e8a41bfe7279e4365b87 f130bf0b129b8dc484db22f53db7714e63fac5c1 +e2d0e01fa54f37de3dec3390c82d462c634821db 34984eabb9009e9065add99d98fe2c34ce109d79 +30c46bfa9a50c03ce5d3e614a037b828bde52ff9 6676bd5e8ffb652c302b31f09a0b9e1138666c25 +013dfc16d6ce62aef324499404130c76d5d613ed 30ee90948b63ba6c58e97274ec309f16c9bdfb22 +b369662a4efb68be33e4f0d40e036755e9251e58 b4a06542a9c80970d5d2f35b9269da63a90ce911 +99143cfe3caa98ac07fd05c12fc1105c8f2cc24a e097fd3f7ec58b4ea4544af0c261fd331aca0aac +cd1e49987aca33ea855927e803ac1eb799ec25c2 a1334903915531f6ea25966382cab06106cddf5b +aba0c2a6c7e1d1f2499d8a345a1fb73271c8d62c 14cfcbd39b39e7d63969cd2bc694f93a57b0ed77 +2f9e7eb5deaa058718080e70cbdcc19df78a7d1b 4cd29a255848fa5e60024b5d8d68d082bf72860a +8df381d89e7bd89cc3e6b79cde8fcdfb7c503363 14b7a7cce78f4a5249b0514ee7afc306c6788a93 +1a0b445d095058e40f699d4234827bbba7baeca4 7d6dc4137087a7e3f9d1d3c63b8b2538a26d34f6 +478908e4a5dbbb32ae4d69e2e9ec3f0cc7469c97 878cdae6fb396b995ecf5457793cc1cecff74a6d +602f64fcb8049d8a1a7db86408ab3d408440b342 51f2a2182d36b21135c74e116449b215c86f4da5 +da0a34c638afb2c2b9b04ce5dd93b4d0dd9c4a5a ce7752b08c9225e8c319836a08ae5d23b4534571 +10bf9966681da0a648baa9329f604ec43f09bf82 07924579dc9ff8bc9987baeca0144ffb6f280699 +28c4eea7bf0e4b47a836d7aea59047851c40701c 116d8c04916dcd8d53de4b8b5911a79aef4b966c +01a4e51fdeb44cec209b3b089e9f42ef1729f350 ce7752b08c9225e8c319836a08ae5d23b4534571 +541e28cd37875dbb0879525072ee4e4f79c6155b 167ad3960b77f87935ddda6ea0a551752d91c370 +6a12325c1b6b2aec32c3a0e7f8dbbe6b3316db8b 01b0a19860324cea67964a8624433af422c0b626 +ab023b8df2b29a0ba121f12a7a2f126c8db5dff7 504760e3b35629287ddb1c4e6fd19d21a9a4a5a8 +787e2fb7df2d998bcc4e5260d4fd22bd52b7be18 ae64c453ab8c94ac5b44d746b8ef72d3ec2fc0fc +2553f8b29fae6bb9b83d506e5f6d741180ed1819 1dd47ee15af3516591ede7037cb12ad35832f876 +42fde10ac0f971384a18afb6cefd317389bad461 34792399db3f0d70e95311b9d6f61ee4d31b9cec +63c4e4aa3b6a35f2d7c4c8434f3873a4d6ec70de 0b60da166f9a0aa867d1dabc558e10a3b225b0eb +70c1bb674d7e8aef1123d898d01ad823299f4379 c3d47e8a8f1f7f27c7ec538011ec75fbc2c04bc0 +c6a9cc5028ca63dbdc85f21d38e02f64fc996bc0 302db9b20713d9edb468cf26a464219c387a4637 +f7331b5749ed0e239e6ec1252f4553576dc5855a d15f0f88c243e9e34a870faf9eeb0497b13bde0a +ac638fef69a9afc5c3baf4f0796483dd86fe723e c0b2d37e46c1ccaeb84e111958b28f4bd755127f +d4a9b50475c8d57a5616cb8efc7b7d700e7ad46e c0b2d37e46c1ccaeb84e111958b28f4bd755127f +0209ded0df164a65380565cb974ba7b6e6d9f3b7 0cc8c01b31363c04edbacf419843d6c8917f9002 +21e6f0751403d078a76753ddd960dcb1e27c8495 e12d7df770ffbbe9d99bcd0315d1103f7fa28e29 +76bd528035064374446e44af80c71e3016d8d5d1 c6af322c1539d3f718a408725dc1891db415777e +b1af318cb0ccf1401cf9a86d4854a4503a82260c 3df5051737197142bcdf10ddba56e6e5e0ef6231 +55c0ac7ddab297d009896c4d7d18f74b266e3177 0b85d3c482ad3930676e17f31b5bb30a511c3516 +ef717196763d20a49b5052b0e820e6ed796bb93f 151fd0bd161ebc49338f1c6f68a26d5e2e063d99 +e910539f2f90b70a4718dfd76e7abea441483273 151fd0bd161ebc49338f1c6f68a26d5e2e063d99 +3971e72f8859f3abf19bab10425a09a2b44eec8d 91537be71c5eafbd9f2c43b440cea52abcc225df +548977cd0c950daad7ed463bc5182ce483976b0e 151fd0bd161ebc49338f1c6f68a26d5e2e063d99 +cc9f9b999d1f819bebc99b9a69576f6de0a8d63a 3fb41ab68b3a2f011680be694a166ef80651e87e +ef0e94697ec258acc364e1bd67c5fa6b947806bc 91537be71c5eafbd9f2c43b440cea52abcc225df +dcc45918454b2ade6d9e4acb875725451a37ee82 54ff890a3b5e178b59c0714de88fdf6b0fd1b1d6 +2823d3cd515bc6d768afa2ee3295a53dc78a5ee8 7d02b2cbdf9ae8586b67d7d6b11682d01fd2c6b3 +ecb23d20a9de2bc07e4c8a242183cf062e7c3b8b 92f9c3f4449d6c2312298de62354e20e0115fda4 +29f0c3cf96216006acf309518fb186482a073fa6 92f9c3f4449d6c2312298de62354e20e0115fda4 +07c001727af5e44420ccdd97b7f43376e7c27200 750a52afd817776d587ddf7d016f52bcfb70287d +1d0d2dd586ab0ac69abf7f9a8d6c00477f85f366 750a52afd817776d587ddf7d016f52bcfb70287d +0db1c6cb292d4d2faa08fd213127aa0435015ce4 a35fe5e070595c63a8b79ed59e18fdf90619c264 +d616619f563e2af2c3ffad8e7a33a5d029427bcb f7e809c9dcf581adcbb866a7e27f5ddaa05af2fd +ebd1cec6f138300365e9c480981af45ed25be976 28d8f997062654b45cfec70a41098180fbad4a5a +f84652107d6c440380745854e4cd45fc3e48c3e6 185bf00dfb7bcf20c7c4dd43029eebdb60f78b13 +b5457b9613fe9b3ab7d3fe8998bd9f8c4e14d682 83c60ba0a4f994c3f7f1573c4462c2cc09cf5117 +0de02c9ec598ccd413b1b85622002e9b2168018d 1c6958c3f658c630019e53175888530a8a98bc57 +10f02c59761cb1d566604e04724d42343e2ddf17 6b3c85c24924065e78f2ed9163e490380f93965c +0def2820c00c42ff630169f7b37aaa48a15b187c f7e809c9dcf581adcbb866a7e27f5ddaa05af2fd +8b8cfc69c022fa295007f818c693d1f406894a3f 9abb88dd3f2e541ff34b7130fb02569061183a54 +5b5cc4a8642ddb5f309d01d7f95dca6474001159 4adc9bac2be1668b665d9ec37b15df7487e352fa +f62c347bb9addda4f4d1882e2364a955a22afb32 78a7646374fe89cd05034ec69cb05152d5f18333 +b1ba14f9725a67ee5c4418ad5ff0a005838d7721 1f3c7a664fb727cb0220cf572cd106a6d2ef80ad +889f5f2ece3df5663e5e64acddc828fd4ea1f60d 660b709a528c2809ebc9c4506707f84c19726b36 +cf6cf9344aadb69756b76e7f284d4679556f3319 5e744b1f734fa7862e59c8852fdeec632d81b6e5 +6e8606d4b350947ed87a37e8984d597522f0370a 5e744b1f734fa7862e59c8852fdeec632d81b6e5 +babb41195f70f374f8816ecfe6bd59f8f7eccc1e 337d0092d9406bd2b93ea7108513f7d199d45bb5 +8573b48f05c8e1f05ee2e036c2f0715ad5608673 42600ae6c98671c673926eca2fe8b1dad1acc62b +509b502018f31c344ef5ea4e8f093c82b074c1b8 47f6458850b827282d250d665bcdb51210613390 +6ac2959df48ee440a0677cf735110e3540bab285 0ad7ec87331f128166ffd0b70db70a9ebac771f0 +ead29f1366c3b7155d286f2639f2d8d0190b453e 44abffb397573128fd12ab72e03674098ada0d1b +7f3e91e29471efc93755bda3003ed12d14ef8a24 86746a951ab9487f058e26cf714bfac71d96df8c +446bda52c32e2f6d2cf1a60988a739465f6c8576 ab7772ea3c4fdd4f8cb28dd26c2d3ad560c135b4 +269f91445d1ec0e4437b868bc65c7d06a9833f1d 2e7d5443efff3048d463dd91959a1101f27ec9b3 +4306d66df940339e5fbdfee21e2bacf7f0203c87 62c977180863c4b8f16158c2d25b27c2ef00c2ab +60519de8d194d117df73941037e49f6a55cf6978 7687cd9891ff596c88540786c5df917de2a0a4f2 +a79a7985c87cf4d4e1eab2a5a7be23473eb74cb6 503021167c705d3bf06bb7eda1b7e4535c8462bd +7ecff5c2e0fbbb6a8e5c04040ddcced0b31d7b00 f82a7eb4127000554810d22616d2aaf673271598 +7ceaef6a240f0971aa106a0f6fc59fc08ec18b9e 51da18b5e7a0a981c47bbb2eb146bd0c4893540e +b919780567e9dc2f871e75a1095abbb0b3f49040 2febc35ff0c768e77115d605a81209d0e46c099b +7d4cbdf01e822c8e7deeaf2300727f5a7af73275 0ceff9065d5daf08ac8047b3ab3aef28b429cf6f +88f75e33832467da599bdb2ad5d068ffd959a092 51da18b5e7a0a981c47bbb2eb146bd0c4893540e +55e8b3855bc913aa88ec55e555b1e0491589ad90 acf6425ffc002f2f3e56ff8f8906850fbafbf56c +cea873378e22f332ef6b002790ccdb4225e1348f d4fe9898feacef9847e4a0fd6c5f7c3381800d8a +02f07dd139d766478b351d00018ce49c3346cfcf e5b584ad46f1919e889b970d8507ddcd89e77ccc +10d619eae33ee18daaea848695c11bcf67e45195 a7de392ddeff1fee276d4b7c82547053dfed4d07 +e787bf8ad115249d346f2552a03924fce35e4326 9be3d0de3da10e6e97343417767367a98a574da6 +5e9a077df6125835e893578b9904195bc64b1117 ce8a1cb20f6cd2c8525c9e49fabfc4f9be430070 +b2847d0963bdb5b4016fe1798a4322d3f84ff376 710c486d6be25d55cf52bd433e91e676b57b8a86 +f8ef3e55bfbbad2a34972f925adf193d71c2b326 77037bd2892f64358c2826cc2d1a6282f4d296fb +741b3a355e81536d36687062e27e041229beb630 7e92790d78cb2632ef0992161668e71b7d32bb4a +b8251fb85d66beb23b2e890ff3208310f588e2c4 c55c24a16cda7bfb1f3480fb46bdaa5acb1d980f +cbf66ab7bc0fab5c4985d56c5a3e431afd12bd6b f6f99da2a9cb3f74d2867080985065d948c5337f +a6537781700d0179318aab401b6078566a7a6ed6 5508050eee79df1a0a45f887b66745b90641222d +3c99501485e04fd5604011d42f5d27b6640c718d 513b5d7cff7a37986684171b9db1aaf6dd68b0e5 +262d2b88dd0b5787137220def659e6c0236b2b0c cb31c25450566fb8d6bde05616b2c57653833033 +c2a3aea06ac54be2578d0873d5d7cbc30570bf93 40d2a6549d49de2983043276a6c2d7dbd3ba1c72 +8e34aa2fe3357d05e6df7b5db587bc727bdc263a 4b88e810bae34a48c4134f82d3e0422e08078ba4 +79cf5549077f4ab53b9d2b09090513bfdebd7693 4a0ce32a5a82891b5b9cb18dec2e10d41020bdad +53aacb305d5c71ba1dd72cd4cf94738b54b5b48a 6963bff5b92f1d66147489e45109acc2ce0b2b20 +2c0e7faebd3ad47f922ba68fc9b7569a9cddcb70 7358f113974f5bc99c11ef3b35b04ff55e5eaf0a +21288da813cde8780f5594a86d18a1832660e79f 52be24e74cb0221ecf8b7fd4bd0702b3c27d0325 +661ab870a0ac658e1d637ad730c8c4aa848e7738 cd603122a85d6eadbde6c87a3deff71c2a3d59ce +4debaca33b41009f58d90f35e90374efaff330ef 47e2b28fafb0ca6c27e7acd0ac1b7fb25a3522a1 +629d52590de23120c658ed425f5f23fee2e4c5f7 c0164233fdb1615f4a59d0ff9833432ed7b3be6d +6c5dcffad1d57c0b01d5ea89f5bbd929cad0381c 79d01dc9bbe2a067a601e64b733a45d8e0d5eb97 +32ff7e88da92a18a12e00dddf2b509d0c420a8b0 62e9a8a6e811e1a3a27e716a0aa74a4979e3392b +1e37cdbef38abafa91d172cc835efdeeb204b715 77ee4f85a6c949e2fcd9fc813f6646be1655ec49 +d84cccbed112d9b53fc13dcf14ffc5cdc27630d3 300d3011ef69c46b8dd9087d0b1a8324e1375db6 +fd0d0a7b8eb45e6bb8b253f791dc29ded1fd27d0 ef3584fa7467fda102354a613a424c8ab274e16d +117d99160683208d2fe9d03263f8b2328b09c872 0aa6ead58b39e1967ffbec97ddcab76d73715554 +98ebbe2bbae83675478aabad54ed5dd637efd876 e1bc442dc95585762bcf4c9786121bd8ba429876 +16f1697699615b526a2a66545f1504714aa707b6 3b6a62557531cc286c50a70c410d21b0f9da2188 +e9d6526dd76f4b8917989dea873ed8b15fa96d81 a1fced514a0cde1f67202387b5c4a473f80c2f1a +2ed45dc039386bf4d1cf909b6e6a9965ec9f7424 b78a9c14bf69c2095ed80bd20ddd237c8254ae10 +7ade7c63bd78b498f7f7e96afa739a900af3432b 46c7b36793c9cf1e88e2b640d45d057d10e97b70 +915b5f98ab7106cf8ea452a966de6ddf4b18b7b5 f195aaef7e759cd531f7c87351b64382aed9174b +cd7b26593ee1501a849cf0a3c84fc3ac97a00ad9 3b704b1b36f4722575e3378a7ef29fb0750ccf33 +8b779147696f9957f4317887cb465b86eaf965c2 d000753adf19a9da2eec7a25663705a698c4efe5 +ce5b1e9de361a1e486c502a62a543dbdc42a38f2 e741f630ee4fea1c48d6eaeb46a41222e12dd590 +95d31777466bf60d82361f179c4995ad56a6ece6 28f52b3d2e3d56cb8a97de9be1039f1b03e21f25 +0fd59a0e5634495ffca23f6f7bd9ea6e198c07c4 12c209e46c0d194e1de360131d8c8b285c785e45 +b409c74f5435034cab3677a76eb796406d10052f dda38c3df87c71066cd04c83a4e97ac28ef067b2 +b873a3087aae760785cda9cd1666a3f90b8e9931 d8ed01e11ebd6cf20845de167b32526eeedd01c6 +075978c15314a66699afb6a1c6d5ca9e3326d35a 361b295255b2860d303fd3e9e2ba78bfc3b4deb1 +80c9e173e37930eba713bd631c8fd55cae48f10d 96718051b0b68522be980eb8dd072c7c71738f87 +9abec4ba873cac94c9394ab71d37416fa7479aa3 867704926a0651f10fa1a4a8711325bb6e187055 +49f577dd95d592ec2a8d268d438e034fe5b5bd4f c80ae8904645af82771e4abc7cb818e08405e647 +48a0ab1a6a48198e6f418b2522f04a31a676f5e2 bf52742368c9141340d061aae14cfbff9178a2aa +986dc1f15bc31c1f72677a2ffae7290c729d9bb1 8f1754d49d6f33a9bbe0c2f2d230d351188863eb +cf848ea595d9457501f3142ed18267593d00447e 67faf2ffdbd5d3215a13fbf60621b757a690ea8c +7e459733948f4e49507276df3bcef535d6994d08 da61766d40c1f0dd3b374b81f8765e6dd0e6dfa6 +3f8fb2bed75cfa4e962e13c3a25fcbac39031089 64c5d70a37694e21ca2aa746bc67cc6375bc9a6e +bc52ea817eaf781b0992ab19ec9b223f91cdd58f 89d3c8bbc122dff9ff057c54d78060ec58182760 +29a134b1936fface0a4875b1f3608bec9288a77d 2743124ba4ec46e862c15f57d5f57fc681d4c05a +92fd90bd795a18dd6b85e257a3f3de618fd1236d 75641ffd74a153b1dcd7f954a7e0cf7ab4cffd18 +77cc9dbc639ab839d0f9cb144abd20fc0defa50b d15f0cdd434afd38612da4c4b62ff8ee1d8133c1 +20802f9ab6b69760e2e543d7c4eb9f339f78efa4 663cfa5ef2c4dc13c22fc64c5e97de2a207150c3 +ee45c7c252681ff4444bd521200a6ac5febe9d9c 8a4ee67a519122e46bad7e5c2aa06c2c81a47474 +3b4e317dac43174922c8e32a1b7a5bfca438ee9a 6e575c62d2b8bdc3bfaad0ed8809f9fb2ec4fff5 +3aedf19df38454b3b5b56994ccbc7f2e164c226e d8e9ac1a77304f04144f0773675cc584ddb8071a +efeaee80cc93da038df59ea89079ff148334a17a d8e9ac1a77304f04144f0773675cc584ddb8071a +e79736fb3ca4d60c0d76249780c1e3c28d412741 399130221cfc789722268c7c63027bfda4be2dec +94c6c66b0c5911e31944f754fb8087e33986cf17 399130221cfc789722268c7c63027bfda4be2dec +fb7f4d6fb35ae0c1db608d3c4395befc8dcfcc91 f356344e9076ac7898222f3f8da6accb40c333a4 +609febc12fcfa89c38303c6e493b7d47609b253e 3bc38a50f36cbfccef4c7741659b742c4451fe57 +b31cfeaa78c036d70cea9b653ad702cfeaa8ffa0 8c898fe4407c5f70a4186619df5a8cad87dc7086 +fc414570c9f8d59d4fddce24ca35519c564e4f2c 399130221cfc789722268c7c63027bfda4be2dec +e073660d4d98f42310f19767894d52093282b133 c6c659b890643b637f41b0f32d3164749d37d783 +6bb5c0b334f9f45a50ca7f379a81f4d756501761 8c898fe4407c5f70a4186619df5a8cad87dc7086 +2b2a13e3383a49fb562f8ba980d07f844e87f9da 6f3399d48f6c88cfc2082286f2806a83e080afcd +04fc6252f417a4f57c738e4bbbe6f9cb5b509820 38de1292825e0cd5e1d04b6da6e128df155fd828 +cb2ecabea423cb572da19158ff744946e0f8a00c 0cc52f3610e122f2f0ad342c90e64175e8b18c30 +2fb7055dc7a1d4ab0a6b136e643045df45b37a18 80c47006ed9df6117273fa201aa8576a363a7767 +bcd2233fb456033983cbf31f789b850eccbda8fb 452c2201ad495ad862c42bccc7ee7b6c1bf38129 +4b5616619c8c49564f95bfa9508755eca308fdf4 ac07c94732a4b9b651ec1afdcbc836f36ea6222c +ccfcc17cedf6587b8c51a2df7b505f668b91733e c6c185fffd798db7698eeab25eff5b7b9f5c7096 +a60bdab92cfbebb31912f20dc416b492155360e8 793b67ba2476e7c69b90759859e2c834ffa7ef36 +d1e6fbe666570157b0043aa85052a61808a10f9c 2d614d1db40137add49f4810b34b6bf8a8199007 +e1e225cd1debd7b546c998c05623e43ace8755b0 c5c13d305993cfc79c19b8cd10018c6be9a02b14 +768a87bde2dd5836b6c3102e29b114930148c867 1d4b3099ef26ab587c7fa1424de3a5261bad91eb +ff2ca1974f91fce24bead30e097ccb14c199f501 a72986c69a84dd8bbb2e816f41594d09094e0077 +9a0d5509de1f6adb6638c0d6b2d328b812861149 9558e4a3307a828e416cdb7a83e8df91a8a7c7d5 +5ab3bea6bd2f7afdec9000fd1ad07a3930c90017 0070d48afbc9a33e3671b8c504e3bb257e9f1027 +13c77a962e494fd8e53463003a6326f21867dc5d b9a66df6018da3d226ce1927c5a1237a5c83c402 +14c0ef02b60f6b757d2655a02ba3562c712701ec 2286c8ce1f0d11e37bc2f422d8a1141abfb1dee3 +b593c868061c8a27afc81ab47b4464333458854b 99a6c121b1fab8d619e4aa461d5842bf05e9c20d +2237a314ea2035ad84e27606d31a9d8d89a2e852 8ce15d32a6c961f149a04564653467567080742c +84a9b0dc0dc342020cb5f8aad4b3bb27e6cfe54c a079ff1e5101d35e5e9121b6195fc7e45fff10be +a61f16432aca3b2c61fe25c62577ec7c767f52e6 d2b7c0a93d36ec4fd5a0ed6995548c9afc5081dc +5a1938ee06e0e25725601d63dd11eeb50f002d39 c61e1102b4c038c0106996922d475fb1e656cd19 +bb238447d0a48f8920941031cf3c20671529fe28 d159dc34064f38c391afe5422332e9b1a0cd0990 +456245cf2d42e2c5b2ecd506fe63b90077159780 c7706c3afd0b2250de94023601a1c18855185bee +caef46a3ff91430c1fe40135a040339c1c0af4ad 11171572dbcb020bf986b9fabcea691e11212052 +f603b9d510e1e2a2eb6822ad0e4d88639be57fe8 8238f9a6e48024ceffa65b39bfddf883f6df920a +f55241f4ac9bb79654b2414b12011c4071e4c047 4cf6634aa839c34e4bea0fb32c9ce11b5d8bfb98 +aad271c813a2da9f534c83503154f366fc07c4d7 96ee127b50dae0c58093541d43f4de6c84e65dfd +4ecae2701c796dd261e4ed4058f9c5bc65f312c5 aea858a1ce32d588efbb476dd3b26e3ee82c3bf7 +494326d89c966d832e1cc7ecdd6add8e28ccacd5 aea858a1ce32d588efbb476dd3b26e3ee82c3bf7 +11122e1fc5cf981d712b59c37101cde107cc00d2 84d4fa5bfb681f036db78c0b716fdc25f5173538 +0a4e00b26cc516e8678ad7084a00546bb886b6a0 0238de47db9606560f72a89e1623649293251686 +a9c6503c6b27fe267e09de4b49e2bc4a99756160 7c1c392ca1725520d283aa17eee03a5e84cb9ebc +c6dba3442febb2bf7f43295a7cbde0e268e6ea3c 30c0848cace8d33e17ac3d6df8f1d460ce0e36ce +18afdf2ff8a277cb73da7a40d6261f8526a6e0a3 7c1c392ca1725520d283aa17eee03a5e84cb9ebc +1712d2057a9f35092d0857c975c689abe3a71e55 a46dc3270e606968ca02f74844596e7dc2b2122b +7a839d9c9732984d77f411f7671b20ae848a7186 a0e1429341c65d149f7cf1f686a0fec65227ddbd +f2ae6cb669e79c060459cbab1d9f2717f16fa527 858c7fe07d3b0785849c92feee46956e8d53beb4 +590fb90646deff979eca2d3476fb537ead158b57 973d67828aa210d4dbf84a13906d6f82021e2a68 +f215e77d9fe8f620fc29f3d2c15dd0ebb3a1a3a0 d18581a5f0cea0678fc02636ecf1c30c7a7d671b +48747c8890670fe47bed0a72ad9bde3ef0500161 6548aa06e7a9843ec8d591beb327af8c7e5d5d3f +500050bd86168caae0f78867308808d59bbe01e9 2645476df0b1fb42bd74274f33bebccae1a2ca5f +cf62b95f4961dd8335063ce9d4bcd121a1ed5604 e2a7a573697e79f799c357c51c4c977756b1ca5c +bf55323b1d8640190a3f2a6747546286d6a905d5 633a050b3e67fb30104e2de0d99f6b0c9d322956 +005405a7687c2464c8095101e24fbb4eaec748f2 069012ca5b16accc46516294d71c894e5f28eda1 +60b527e8e2dc2e264830150cd6fe586bafb40278 ab0fbe1f093120ce827ce3200577a1ece96df466 +eb5ed016d3dd6b503837a4d228cba26212cb4e6e e8b14e5a78c3a15f629d174723b666f2f1ebb3fa +2d69536576731329c2748530e8ac156a9b1db6b4 6a1cdabd33311050fd39d1fe1dfcb23e36dd1bb0 +59f88bc08b92050706e9e666fe6dbf2cab7dfa53 6e3b2e13906ba8ff22d3c8490b02d518adb2c907 +70395a799fd1411ea7aeccbdedf2eca6964c7cb2 6e3b2e13906ba8ff22d3c8490b02d518adb2c907 +ef160381948b448c2e691031c33051f5bd2943ea 6e3b2e13906ba8ff22d3c8490b02d518adb2c907 +fd46494f8acb7873e6b32f0a7b55b49d5c5f5a50 6e3b2e13906ba8ff22d3c8490b02d518adb2c907 +ce77c2087cec2a1b85f922013e34f82d545dc2c0 8a906e581c989838b696e500411d27d7a54f8d6a +ffcc49e25af8b9988350804c2efeca4a9aff0469 bb38ff1a763738609e1b3cada6d15fa61e5e84b9 +2b4a8ff5ef7c8669171195d6051e04bea16872b2 bb38ff1a763738609e1b3cada6d15fa61e5e84b9 +c833ad59f80a5cbbd5ec95c51b24a3eec4dfdb4f 08f6d1ab5da29675da93c9638184910f5e4a3e1d +88e9170e4412a957b9022a3ed6382a4d4ee0428e b3f9041e389f4e9698268d87fd10d1fc9f471f2a +6ee7ca7cf60b1dd0ba5e2338b4841dc7ac69d259 09a7024d094d0626b8983921bad79f070af45b51 +b57ef42975d69b964b448e2341028f21f8391911 b3f9041e389f4e9698268d87fd10d1fc9f471f2a +a779078f6a61c30579fde56a8270ca03fe0353b8 182e2b07b24819a3ba8f6ce31d4d950e48c37a44 +e3e3d4aa6e9889cab293f35a00098623d7050a8c 838cfce97052d5d41980bf0bb8417080e2dc063b +963827526c5d8a12f460ce1f39381cb1a548c251 dfa1e2e9dab09d15a811e279273bd3f91a3a1764 +a982a7124e0e2aea69d016b0a50ac5c44e99d301 86baa3e4a1eae7166f9b27bd04a79cbf39adb161 +56215d16c5ff2806d338425218c7a38f84d55fa7 0a7edca939cf1f8fdec7415785e430f7074ae9c9 +912b59d3c695fb1a7f6625bf1ee98380050da30e 10ec0c4b79c9cc994b1b16b94e5a9ba722e32ad6 +df63be6effca2930fabd3c5ac90f2f5a6831ee08 511823566054fc995395d7cefd886afe668fc220 +489208e86f4d906c92b45ab75596349c014ee3da 1f9c8403a321783ac1ec810f435c9495f4215651 +e09b1aaefd7496dfa450a0eebc2f5d0123c0aa11 4b487a3e56e9ebfc96a5377b419a84b18ea450ef +f393601e09def2eca841a17a35e7ac98de0e5c4e 079acb68b85f626bfe4bae9e3f1ddb15894c19e0 +a2bee14815b5a69a78dd85d24b87ba70bf079ef4 f9ae2db50089842ce735f380a8ebce724f9c046f +bd4d9b4fff8fc4bb5cfc8c2ee107a85cb60123af 948ab51ebb57cecd1ff4f0fd98bd3afe7c247448 +cce574a80120e06a4e5675708a22b1eb01478fb0 a7e82b63c32074feee9122d84ad794b706b6a9e4 +a9a36b3e7442ed7b4fffdee79c605b395fadd3b8 63e8f1935eb487586d5c626200906023e3aa0d4d +a81b257427c2917d257e0fefd53f36fda1e9ea9f f766a2da51133f2137e882e5b64dc9176d403889 +fc6be9db5185113339f8a8612ad06227cdb37f36 e5944642d55142f7690d1e5ee8f2bf0ddfb5a8dd +2e82b8d39123c94d6a619e3ec070c33ced9d2fb5 8492baaf5f5843a48adfd0776ed6bf0fb5102368 +fa6edf5db9a5616fcd32c3497fdf9fcb5bdff1d2 839246111082a59eb0fbe12bcd47275f7e876d3e +a0a8e0eab99ab84fe87bc9933afababad2b9b801 497e9cdb4d4115014feaf108a70b738205ed842a +2a5858ce7df6f61875285d9024ee30ebb4a9e818 9c405164a8d52ca30f60c4fe36f3275b4176a8b1 +f18a3c2d4d6076a7cafbcc3d4d8b279ce0005a77 497e9cdb4d4115014feaf108a70b738205ed842a +24056882acb43a3353c5ee4503abf22db96378e9 a13e43fdd9f418a924227da8cbaf73c68a8b4360 +0c837d232fd5cae3486e3396540114223b18aa72 8a8ffcc9a94fd040a87f4a257d93edb745327766 +9210e8678a0c87e6a6f41aae35baf1ee9da1fe24 0fb33d1f4555a958ea6659bd3634e520a6498253 +5e03364217ae748984e9ec32eb68b6df19a91e92 995e84449ac704c65a4ed6447a58767134d9d004 +d7516bf8b7121358cb68372c833946c77d91d023 3eaa3bebef0623b1855de65d9cd2d5e247b6f8f6 +fa6e00805128a7a56dcbfb1dff0239d3e3333615 0d7cd94236b1c370a89eb691f8ab8a4c30c0acde +e4d996c1c8cab96af14616287b735265e1cd8b67 2e5b328819f586bb270aaeed607b3f47167665cb +46cd7051ce81cb7b018a54b3f413c5b08587073c 9e7a0ad6fac51751741fa7f0bd59b1073b36dd59 +0aac567995050157959b22c63f894b82079c16e3 01a5315ae5aa26abb73b4f95a184c2a80fba099f +491e01aab0fb99c8867dac6d851b09c8e4bfa4e6 c2c3fb930fbc0ce6723cf5536594ecc3ac203181 +0e4d02438a4475a3b96a50777c1da394dbdbfb41 c98e3e7b1552c2fa045fe74abacc147c37343a5a +358e7b7878725078f188d2894c4ba0fdd4c00417 c98e3e7b1552c2fa045fe74abacc147c37343a5a +1bb50e24c2c07ed1a8843911fdb91269433f4c9e c98e3e7b1552c2fa045fe74abacc147c37343a5a +daee1cab2a01720cfc6d2688b545b2efb9aeceb5 8bc403b4b4d6e9b1bc70fc31b033729b67acaabd +586e3a1e9780ca72795efdf2a7c23589856ad5da abe0c8bf8063289dcd63ff321e1d65c28d793abe +d2f84872f14bcaafd2fbe864bd962a28b3d7b797 b31fc8d8d3b7886dfd656a3c209e6004f95babc0 +32623b58af8f23d7b82cf0f2e380f0cb021c33dc 93cb159ec35a389d7d81bd513fe929f623b848c9 +2d6e3c013c21caf5d991ed6f47d43e9c21a12aa2 686f8b6d6eb36dfed46af06327920edd559d0dfc +a90a1b77a904f5050bab13e2e7928aa97b55a133 627346fa495ce4a06d779c4efd7497a2e3348de9 +aad35cb693d91a0eee3e57e72cfc4e582158b944 06b44d76135e18c19d8be62537d25a93883335fc +955c801c5d3c74ebcf5630cac1c9c3ff91615e2a 664ba832510fa56d689fea38b3463d6244258d59 +af2e23b431ee80cd9c86012228da6afed014d59f a043ef5eb84f09452e91e5002e00a342867a3f87 +a6ae40bdf3b943f99974a852c75f79f925ebf11b 24a5773d735af6d418f937ab3060292217113f9d +8468ae92fc39ca60fb0631aa3cc80edee13446fd ad5a1110f42fb6d352124e1d445d2fc56b0af22e +2a213ac519f97bd8484d66d59f773a86e5316b78 9db770e6b8b4aecb4c516e8e38135326315ed0b1 +0ebb8bfd909fb5b986efb577d16f9d39ea898dee b4af7adb8934472753dbdbf396774d2db7726d28 +6d771f97b95732498f629fa1b1fae293fb0535dd 24a5773d735af6d418f937ab3060292217113f9d +57b08b52bf57157dc8539b02fbc24c27593f86c7 d872481b97b278a3f8a79ac85a75172ca8b115ee +8b1c2cbacd644fa51fcf2a951b11ff8e83c9ba0b d872481b97b278a3f8a79ac85a75172ca8b115ee +be55d06f477349561d74df85630acc482c37bfb1 24596bc71823cc9711e4a8e463929d54b8e76998 +554f5d5ac7f5f7e0317a2dc2fc78adcb6b0d6962 d90770415fb4dae6a868e26b47649a09cc05e394 +080f903d4f152bec5882f4b6c2fd7b448e1173c8 016050f733f76e95ac9f5c4ccf4429a7110d0c9b +af03630eb89af97fbfd8d76f6912665cd97b9587 c727731739f9d5b30986c191c5d02a7a8d80bb65 +1aa0d0348a68d07164863431e542061786f98bcf 09f13edf6aa8c1cef43c8ba7f17289e75096a6a4 +ac617ee90acf68794feef501b99ae43ab538a558 09f13edf6aa8c1cef43c8ba7f17289e75096a6a4 +f84f5fca57946f838e79a59be20dffe407e9d3a7 edb3d5536c38643633925215404f2f02350f37d4 +426780dc180359b13f72bb6a259f9c4effe88cf9 fe1a7607de6ce5c3dedf96907e114ca0a208076a +edef0997a11b5e3bc1c82cce0509e0d57bdde64b 6b93a09d0cdf42d7cee85979de6d7b18e34f6dd1 |