{
public:
- enum PropType { Auto, Space, Bool, Color, String, Selector,
+ enum PropType { Disabled, Space, Bool, Color, String, Selector,
DblSpin, IntSpin, Double, Integer,
GroupBox, Tab, Frame, Font, DirList, File,
Slider, Shortcut, ShortcutTree, BiColor, Background };
std::string section() const { return mySection; }
std::string name() const { return myName; }
+
std::string title() const { return myTitle; }
+ void setTitle(const std::string& theTitle) { myTitle = theTitle; }
+
PropType type() const { return myType; }
+ void setType(PropType theType) { myType = theType; }
+
std::string value() const { return myValue; }
+ void setValue(const std::string& theValue) { myValue = theValue; }
+
+ bool operator==(const Config_Prop* theProp) const
+ {
+ return (mySection == theProp->section()) && (myName == theProp->name());
+ }
private:
std::string mySection;
#include "Config_PropManager.h"
-std::map<std::string, Config_Properties> Config_PropManager::myPropMap;
+std::vector<int> stringToRGB(const std::string& theColor);
+int stringToInteger(const std::string& theInt);
+double stringToDouble(const std::string& theDouble);
-bool Config_PropManager::registerProp(const std::string& theOwnerId,
- const std::string& theSection,
+Config_Properties Config_PropManager::myProps;
+
+
+
+bool Config_PropManager::registerProp(const std::string& theSection,
const std::string& theName,
const std::string& theTitle,
Config_Prop::PropType theType,
const std::string& theValue)
{
- Config_Prop* aProp = new Config_Prop(theSection, theName, theTitle, theType, theValue);
- return registerProp(theOwnerId, aProp);
-}
-
-bool Config_PropManager::registerProp(const std::string& theOwnerId,
- Config_Prop* theProp)
-{
- if (myPropMap.find(theOwnerId) == myPropMap.end()) {
- Config_Properties aPropList;
- aPropList.push_back(theProp);
- myPropMap[theOwnerId] = aPropList;
- } else {
- myPropMap[theOwnerId].push_back(theProp);
+ Config_Prop* aProp = findProp(theSection, theName);
+ if (aProp) {
+ if (aProp->type() == Config_Prop::Disabled) {
+ aProp->setType(theType);
+ aProp->setTitle(theTitle);
+ return true;
+ }
+ return false;
}
+ aProp = new Config_Prop(theSection, theName, theTitle, theType, theValue);
+ myProps.push_back(aProp);
return true;
}
-std::list<std::string> Config_PropManager::getOwners()
+Config_Prop* Config_PropManager::findProp(const std::string& theSection,
+ const std::string& theName)
{
- std::list<std::string> aKeys;
- std::map<std::string, Config_Properties>::const_iterator aIt;
- for (aIt = myPropMap.cbegin(); aIt != myPropMap.cend(); ++aIt)
- aKeys.push_back((*aIt).first);
- return aKeys;
+ Config_Properties::const_iterator aIt;
+ for (aIt = myProps.cbegin(); aIt != myProps.cend(); ++aIt) {
+ Config_Prop* aProp = (*aIt);
+ if ((aProp->section() == theSection) && (aProp->name() == theName))
+ return aProp;
+ }
+ return NULL;
}
-Config_Properties Config_PropManager::getProperties(const std::string& theOwnerId)
+
+Config_Properties Config_PropManager::getProperties()
{
- return myPropMap[theOwnerId];
+ Config_Properties aRes;
+ Config_Properties::const_iterator aIt;
+ for (aIt = myProps.cbegin(); aIt != myProps.cend(); aIt++) {
+ Config_Prop* aProp = (*aIt);
+ if (aProp->type() != Config_Prop::Disabled)
+ aRes.push_back(aProp);
+ }
+ return aRes;
}
-
-std::list<std::string> Config_PropManager::getSections(const std::string& theOwnerId)
+std::list<std::string> Config_PropManager::getSections()
{
+ // Return only non disabled sections
std::list<std::string> aSections;
- Config_Properties aProps = getProperties(theOwnerId);
Config_Properties::const_iterator aIt;
- for (aIt = aProps.cbegin(); aIt != aProps.cend(); aIt++) {
+ for (aIt = myProps.cbegin(); aIt != myProps.cend(); aIt++) {
const Config_Prop* aProp = (*aIt);
- aSections.push_back(aProp->section());
+ if (aProp->type() != Config_Prop::Disabled)
+ aSections.push_back(aProp->section());
}
aSections.unique();
return aSections;
}
-Config_Properties Config_PropManager::getProperties(const std::string& theOwnerId,
- const std::string& theSection)
+Config_Properties Config_PropManager::getProperties(const std::string& theSection)
{
- Config_Properties aProps = getProperties(theOwnerId);
Config_Properties aRes;
Config_Properties::iterator aIt;
- for (aIt = aProps.begin(); aIt != aProps.end(); aIt++) {
+ for (aIt = myProps.begin(); aIt != myProps.end(); aIt++) {
Config_Prop* aProp = (*aIt);
- if (aProp->section() == theSection)
+ if ((aProp->section() == theSection) && (aProp->type() != Config_Prop::Disabled))
aRes.push_back(aProp);
}
return aRes;
}
-std::string Config_PropManager::value(const std::string& theOwnerId,
- const std::string& theSection,
+std::string Config_PropManager::string(const std::string& theSection,
const std::string& theName,
const std::string& theDefault)
{
- Config_Properties aProps = getProperties(theOwnerId, theSection);
+ Config_Properties aProps = getProperties(theSection);
Config_Properties::const_iterator aIt;
for (aIt = aProps.cbegin(); aIt != aProps.cend(); aIt++) {
Config_Prop* aProp = (*aIt);
}
+std::vector<int> Config_PropManager::color(const std::string& theSection,
+ const std::string& theName,
+ const std::string& theDefault)
+{
+ std::string aStr = string(theSection, theName, theDefault);
+ return stringToRGB(aStr);
+}
+
+int Config_PropManager::integer(const std::string& theSection,
+ const std::string& theName,
+ const std::string& theDefault)
+{
+ std::string aStr = string(theSection, theName, theDefault);
+ return stringToInteger(aStr);
+}
+
+double Config_PropManager::real(const std::string& theSection,
+ const std::string& theName,
+ const std::string& theDefault)
+{
+ std::string aStr = string(theSection, theName, theDefault);
+ return stringToDouble(aStr);
+}
+
+
+
std::vector<int> stringToRGB(const std::string& theColor)
{
std::vector<int> aRes(3);
- int aPos = theColor.find(",");
- char aBuf[10];
- // Get Red
- std::size_t length = theColor.copy(aBuf, aPos, 0);
- aBuf[length] = '\0';
- int aC = atoi(aBuf);
- aRes[0] = aC;
-
- // Get Green
- int aNPos = theColor.find(",", aPos + 1);
- length = theColor.copy(aBuf, aNPos - aPos - 1, aPos + 1);
- aBuf[length] = '\0';
- aC = atoi(aBuf);
- aRes[1] = aC;
-
- // Get Green
- length = theColor.copy(aBuf, theColor.length() - aNPos - 1, aNPos + 1);
- aBuf[length] = '\0';
- aC = atoi(aBuf);
- aRes[2] = aC;
+ if (theColor[0] == '#') {
+ char aBuf[3];
+ char* aP;
+ aBuf[2] = '\0';
+
+ aBuf[0] = theColor[1];
+ aBuf[1] = theColor[2];
+ aRes[0] = strtol(aBuf, &aP, 16);
+ aBuf[0] = theColor[3];
+ aBuf[1] = theColor[4];
+ aRes[1] = strtol(aBuf, &aP, 16);
+
+ aBuf[0] = theColor[5];
+ aBuf[1] = theColor[6];
+ aRes[2] = strtol(aBuf, &aP, 16);
+ } else {
+ int aPos = theColor.find(",");
+ char aBuf[10];
+ // Get Red
+ std::size_t length = theColor.copy(aBuf, aPos, 0);
+ aBuf[length] = '\0';
+ aRes[0] = atoi(aBuf);
+
+ // Get Green
+ int aNPos = theColor.find(",", aPos + 1);
+ length = theColor.copy(aBuf, aNPos - aPos - 1, aPos + 1);
+ aBuf[length] = '\0';
+ aRes[1] = atoi(aBuf);
+
+ // Get Green
+ length = theColor.copy(aBuf, theColor.length() - aNPos - 1, aNPos + 1);
+ aBuf[length] = '\0';
+ aRes[2] = atoi(aBuf);
+ }
return aRes;
-}
\ No newline at end of file
+}
+
+int stringToInteger(const std::string& theInt)
+{
+ return atoi(theInt.c_str());
+}
+
+double stringToDouble(const std::string& theDouble)
+{
+ char* p;
+ return strtod(theDouble.c_str(), &p);
+}
* \param theValue - initial value of the property
* Returns True if the property succesfully registered
*/
- static bool registerProp(const std::string& theOwnerId,
- const std::string& theSection,
+ static bool registerProp(const std::string& theSection,
const std::string& theName,
const std::string& theTitle,
Config_Prop::PropType theType,
const std::string& theValue);
- //! Returns list of registered owners.
- static std::list<std::string> getOwners();
+ static Config_Prop* findProp(const std::string& theSection,
+ const std::string& theName);
- //! Returns list of properties by its owner.
- static Config_Properties getProperties(const std::string& theOwnerId);
+ static Config_Properties getProperties();
//! Returns list of registered section names.
- static std::list<std::string> getSections(const std::string& theOwnerId);
+ static std::list<std::string> getSections();
//! Returns list of properties by its owner and section.
- static Config_Properties getProperties(const std::string& theOwnerId, const std::string& theSection);
+ static Config_Properties getProperties(const std::string& theSection);
//! Returns value of the property by its owner, section, and name
- static std::string value(const std::string& theOwnerId,
- const std::string& theSection,
- const std::string& theName,
- const std::string& theDefault);
+ static std::string string(const std::string& theSection,
+ const std::string& theName,
+ const std::string& theDefault);
+ static std::vector<int> color(const std::string& theSection,
+ const std::string& theName,
+ const std::string& theDefault);
+ static int integer(const std::string& theSection,
+ const std::string& theName,
+ const std::string& theDefault);
+ static double real(const std::string& theSection,
+ const std::string& theName,
+ const std::string& theDefault);
private:
-
- /**
- * Registers property parameters
- * \param theOwnerId - name of owner (name of plugin for example)
- * \param theProp - the Property object.
- * Returns True if the property succesfully registered
- */
- static bool registerProp(const std::string& theOwnerId,
- Config_Prop* theProp);
-
- static std::map<std::string, Config_Properties> myPropMap;
+ static Config_Properties myProps;
};
-CONFIG_EXPORT std::vector<int> stringToRGB(const std::string& theColor);
-
#endif
\ No newline at end of file
anAIS->createDistance(aPoint1, aPoint2, aFlyoutPnt, aPlane, aValue);
// Set color from preferences
- std::string aColor = Config_PropManager::value("Sketcher", "Visualization",
- "distance_color", DISTANCE_COLOR);
- std::vector<int> aRGB = stringToRGB(aColor);
+ std::vector<int> aRGB = Config_PropManager::color("Visualization", "distance_color", DISTANCE_COLOR);
anAIS->setColor(aRGB[0], aRGB[1], aRGB[2]);
return anAIS;
}
class SketchPlugin_Line;
class GeomDataAPI_Point2D;
-#define DISTANCE_COLOR "255, 0, 255"
+#define DISTANCE_COLOR "#ff00ff"
/** \class SketchPlugin_ConstraintDistance
* \ingroup DataModel
anAIS->createDistance(aPoint1, aPoint2, aFlyoutPnt, aPlane, aValue);
// Set color from preferences
- std::string aColor = Config_PropManager::value("Sketcher", "Visualization",
- "length_color", LENGTH_COLOR);
- std::vector<int> aRGB = stringToRGB(aColor);
+ std::vector<int> aRGB = Config_PropManager::color("Visualization", "length_color", LENGTH_COLOR);
anAIS->setColor(aRGB[0], aRGB[1], aRGB[2]);
return anAIS;
}
#include <SketchPlugin_Sketch.h>
#include <list>
-#define LENGTH_COLOR "255, 0, 255"
+#define LENGTH_COLOR "#ff00ff"
/** \class SketchPlugin_ConstraintLength
* \ingroup DataModel
anAIS->createParallel(aLine1, aLine2, aFlyoutPnt, aPlane);
// Set color from preferences
- std::string aColor = Config_PropManager::value("Sketcher", "Visualization",
- "parallel_color", PARALLEL_COLOR);
- std::vector<int> aRGB = stringToRGB(aColor);
+ std::vector<int> aRGB = Config_PropManager::color("Visualization", "parallel_color", PARALLEL_COLOR);
anAIS->setColor(aRGB[0], aRGB[1], aRGB[2]);
return anAIS;
}
#include "SketchPlugin_Constraint.h"
-#define PARALLEL_COLOR "255, 255, 0"
+#define PARALLEL_COLOR "#ffff00"
/** \class SketchPlugin_ConstraintParallel
* \ingroup DataModel
anAIS->createPerpendicular(aLine1, aLine2, aPlane);
// Set color from preferences
- std::string aColor = Config_PropManager::value("Sketcher", "Visualization",
- "perpendicular_color", PERPENDICULAR_COLOR);
- std::vector<int> aRGB = stringToRGB(aColor);
+ std::vector<int> aRGB = Config_PropManager::color("Visualization", "perpendicular_color", PERPENDICULAR_COLOR);
anAIS->setColor(aRGB[0], aRGB[1], aRGB[2]);
return anAIS;
}
#include <SketchPlugin_Sketch.h>
#include "SketchPlugin_Constraint.h"
-#define PERPENDICULAR_COLOR "255, 255, 0"
+#define PERPENDICULAR_COLOR "#ffff00"
/** \class SketchPlugin_ConstraintPerpendicular
* \ingroup DataModel
anAIS->createRadius(aCircle, aFlyoutPnt, aValue);
// Set color from preferences
- std::string aColor = Config_PropManager::value("Sketcher", "Visualization",
- "radius_color", RADIUS_COLOR);
- std::vector<int> aRGB = stringToRGB(aColor);
+ std::vector<int> aRGB = Config_PropManager::color("Visualization", "radius_color", RADIUS_COLOR);
anAIS->setColor(aRGB[0], aRGB[1], aRGB[2]);
return anAIS;
}
#include <SketchPlugin_Sketch.h>
#include "SketchPlugin_Constraint.h"
-#define RADIUS_COLOR "255, 0, 255"
+#define RADIUS_COLOR "#ff00ff"
/** \class SketchPlugin_ConstraintRadius
* \ingroup DataModel
using namespace std;
-// face of the square-face displayed for selection of general plane
-const double PLANE_SIZE = 200;
SketchPlugin_Line::SketchPlugin_Line()
: SketchPlugin_Feature()
ModelAPI_PluginManager::get()->registerPlugin(this);
// register sketcher properties
- Config_PropManager::registerProp("Sketcher", "Visualization",
+ Config_PropManager::registerProp("Sketch planes",
+ "planes_color", "Color",
+ Config_Prop::Color, SKETCH_PLANE_COLOR);
+ Config_PropManager::registerProp("Sketch planes",
+ "planes_size", "Size",
+ Config_Prop::Double, PLANE_SIZE);
+ Config_PropManager::registerProp("Sketch planes",
+ "planes_thikness", "Thickness",
+ Config_Prop::Integer, SKETCH_WIDTH);
+
+ Config_PropManager::registerProp("Visualization",
"parallel_color", "Parallel constraint color",
Config_Prop::Color, PARALLEL_COLOR);
- Config_PropManager::registerProp("Sketcher", "Visualization",
+ Config_PropManager::registerProp("Visualization",
"perpendicular_color", "Perpendicular constraint color",
Config_Prop::Color, PERPENDICULAR_COLOR);
- Config_PropManager::registerProp("Sketcher", "Visualization",
+ Config_PropManager::registerProp("Visualization",
"distance_color", "Distance color",
Config_Prop::Color, DISTANCE_COLOR);
- Config_PropManager::registerProp("Sketcher", "Visualization",
+ Config_PropManager::registerProp("Visualization",
"length_color", "Length color",
Config_Prop::Color, LENGTH_COLOR);
- Config_PropManager::registerProp("Sketcher", "Visualization",
+ Config_PropManager::registerProp("Visualization",
"radius_color", "Radius color",
Config_Prop::Color, RADIUS_COLOR);
}
#include <GeomAlgoAPI_SketchBuilder.h>
#include <ModelAPI_ResultConstruction.h>
+#include <Config_PropManager.h>
using namespace std;
-const int SKETCH_PLANE_COLOR = Colors::COLOR_BROWN; /// the plane edge color
-const double SKETCH_WIDTH = 4.0; /// the plane edge width
-// face of the square-face displayed for selection of general plane
-const double PLANE_SIZE = 200;
-
SketchPlugin_Sketch::SketchPlugin_Sketch()
{
{
boost::shared_ptr<GeomAPI_Pnt> anOrigin(new GeomAPI_Pnt(0, 0, 0));
boost::shared_ptr<GeomAPI_Dir> aNormal(new GeomAPI_Dir(theX, theY, theZ));
+ double aSize = Config_PropManager::integer("Sketch definition", "Size of planes", PLANE_SIZE);
boost::shared_ptr<GeomAPI_Shape> aFace =
- GeomAlgoAPI_FaceBuilder::square(anOrigin, aNormal, PLANE_SIZE);
+ GeomAlgoAPI_FaceBuilder::square(anOrigin, aNormal, aSize);
theShapes.push_back(aFace);
}
boost::shared_ptr<GeomAPI_Shape> aCompound = GeomAlgoAPI_CompoundBuilder::compound(aFaces);
aAIS = boost::shared_ptr<GeomAPI_AISObject>(new GeomAPI_AISObject());
aAIS->createShape(aCompound);
- aAIS->setColor(SKETCH_PLANE_COLOR);
- aAIS->setWidth(SKETCH_WIDTH);
+
+ std::vector<int> aRGB = Config_PropManager::color("Sketch definition",
+ "planes_color",
+ SKETCH_PLANE_COLOR);
+ aAIS->setColor(aRGB[0], aRGB[1], aRGB[2]);
+
+ aAIS->setWidth(Config_PropManager::integer("Sketch definition",
+ "planes_thikness",
+ SKETCH_WIDTH));
}
return aAIS;
}
#include <GeomAPI_IPresentable.h>
#include <list>
+/// the plane edge color
+#define SKETCH_PLANE_COLOR "#700000"
+
+/// the plane edge width
+#define SKETCH_WIDTH "4"
+
+/// face of the square-face displayed for selection of general plane
+#define PLANE_SIZE "200"
+
/**\class SketchPlugin_Sketch
* \ingroup DataModel
* \brief Feature for creation of the new part in PartSet.
}
+void XGUI_Preferences::updateCustomProps()
+{
+ Config_Properties aProps = Config_PropManager::getProperties();
+ Config_Properties::iterator aIt;
+ for (aIt = aProps.begin(); aIt != aProps.end(); ++ aIt) {
+ Config_Prop* aProp = (*aIt);
+ QString aVal = myResourceMgr->stringValue(QString(aProp->section().c_str()),
+ QString(aProp->name().c_str()));
+ if (!aVal.isNull())
+ aProp->setValue(qPrintable(aVal));
+ }
+}
+
+
+void XGUI_Preferences::loadCustomProps()
+{
+ QStringList aSections = myResourceMgr->sections();
+ foreach (QString aSection, aSections) {
+ QStringList aParams = myResourceMgr->parameters(aSection);
+ foreach (QString aParam, aParams) {
+ Config_PropManager::registerProp(qPrintable(aSection),
+ qPrintable(aParam),
+ "", Config_Prop::Disabled,
+ qPrintable(myResourceMgr->stringValue(aSection, aParam)));
+ }
+ }
+}
+
+
//**********************************************************
//**********************************************************
void XGUI_PreferencesDlg::createEditors()
{
- int aLFpage = myPreferences->addItem("Desktop");
- //myPreferences->setItemIcon(aLFpage, QIcon(":pictures/view_prefs.png"));
+ int aPage = myPreferences->addItem(tr("Desktop"));
+ myPreferences->setItemIcon(aPage, QIcon(":pictures/view_prefs.png"));
- createMenuPage(aLFpage);
- createViewerPage(aLFpage);
+ createMenuPage(aPage);
+ createViewerPage(aPage);
- std::list<std::string> aOwners = Config_PropManager::getOwners();
- std::list<std::string>::const_iterator aIt;
- for (aIt = aOwners.cbegin(); aIt != aOwners.cend(); ++ aIt) {
- int aPage = myPreferences->addItem((*aIt).c_str());
- createCustomPage(aPage, Config_PropManager::getProperties((*aIt)));
- }
+ aPage = myPreferences->addItem(tr("Module"));
+ myPreferences->setItemIcon(aPage, QIcon(":pictures/module.png"));
+ createCustomPage(aPage);
}
void XGUI_PreferencesDlg::createViewerPage(int thePageId)
}
-void XGUI_PreferencesDlg::createCustomPage(int thePageId, Config_Properties& theProps)
+void XGUI_PreferencesDlg::createCustomPage(int thePageId)
{
SUIT_ResourceMgr* aResMgr = XGUI_Preferences::resourceMgr();
bool isResModified = false;
- // Sort by sections
- QMap<QString, Config_Properties> aGroupMap;
- Config_Properties::const_iterator aIt;
- for (aIt = theProps.cbegin(); aIt != theProps.cend(); ++aIt) {
- QString aGroup((*aIt)->section().c_str());
- if (aGroupMap.contains(aGroup)) {
- aGroupMap[aGroup].push_back(*aIt);
- } else {
- Config_Properties aProps;
- aProps.push_back(*aIt);
- aGroupMap[aGroup] = aProps;
- }
- // check that the property is defined
- QString aName((*aIt)->name().c_str());
- if (!aResMgr->hasValue(aGroup, aName)) {
- aResMgr->setValue(aGroup, aName, QString((*aIt)->value().c_str()));
- isResModified = true;
- }
- }
- if (isResModified)
- aResMgr->save();
-
// Make a Tab from each section
- QMap<QString, Config_Properties>::iterator it;
- for (it = aGroupMap.begin(); it != aGroupMap.end(); ++it) {
- int aTab = myPreferences->addItem(it.key(), thePageId );
+ std::list<std::string> aSections = Config_PropManager::getSections();
+ std::list<std::string>::const_iterator it;
+ for (it = aSections.cbegin(); it != aSections.cend(); ++it) {
+ Config_Properties aProps = Config_PropManager::getProperties(*it);
+ int aTab = myPreferences->addItem(QString((*it).c_str()), thePageId );
myPreferences->setItemProperty( "columns", 2, aTab );
- Config_Properties& aProps = it.value();
+
+ Config_Properties::const_iterator aIt;
for (aIt = aProps.cbegin(); aIt != aProps.cend(); ++aIt) {
- myPreferences->addItem( QString((*aIt)->title().c_str()), aTab,
- (SUIT_PreferenceMgr::PrefItemType)(*aIt)->type(),
- QString((*aIt)->section().c_str()),
- QString((*aIt)->name().c_str()) );
+ Config_Prop* aProp = (*aIt);
+ // check that the property is defined
+ QString aSection(aProp->section().c_str());
+ QString aName(aProp->name().c_str());
+ if (!aResMgr->hasValue(aSection, aName)) {
+ aResMgr->setValue(aSection, aName, QString(aProp->value().c_str()));
+ isResModified = true;
+ }
+ // Add item
+ if (aProp->type() != Config_Prop::Disabled)
+ myPreferences->addItem( tr(aProp->title().c_str()), aTab,
+ (SUIT_PreferenceMgr::PrefItemType)aProp->type(),
+ QString(aProp->section().c_str()),
+ QString(aProp->name().c_str()) );
}
}
}
{
myPreferences->store();
myIsChanged = true;
+
+ // Save custom properties
+ XGUI_Preferences::updateCustomProps();
QDialog::accept();
}
+
void XGUI_PreferencesDlg::modified(XGUI_Prefs& theModified) const
{
theModified = myPreferences->modified();
static SUIT_ResourceMgr* resourceMgr();
+ static void updateCustomProps();
+
+ static void loadCustomProps();
+
private:
static SUIT_ResourceMgr* myResourceMgr;
};
void createEditors();
void createViewerPage(int thePageId);
void createMenuPage(int thePageId);
- void createCustomPage(int thePageId, Config_Properties& theProps);
+ void createCustomPage(int thePageId);
+
+ void updateCustomProps();
XGUI_PreferencesMgr* myPreferences;
bool myIsChanged;
myMainWindow->show();
updateCommandStatus();
}
+ XGUI_Preferences::loadCustomProps();
onNew();
}
<file>pictures/eye_pencil_closed.png</file>
<file>pictures/view_prefs.png</file>
+ <file>pictures/module.png</file>
</qresource>
</RCC>