diff --git a/Source/Base/Base.dproj b/Source/Base/Base.dproj
index ab75d05c..aa2988cf 100644
--- a/Source/Base/Base.dproj
+++ b/Source/Base/Base.dproj
@@ -53,58 +53,58 @@
MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
TForm
diff --git a/Source/Base/Base.res b/Source/Base/Base.res
index 8b251f31..1641339f 100644
Binary files a/Source/Base/Base.res and b/Source/Base/Base.res differ
diff --git a/Source/Modulos/Gestion de documentos/Servidor/srvGestorDocumentos_Impl.pas b/Source/Modulos/Gestion de documentos/Servidor/srvGestorDocumentos_Impl.pas
index 338269b5..91d761ab 100644
--- a/Source/Modulos/Gestion de documentos/Servidor/srvGestorDocumentos_Impl.pas
+++ b/Source/Modulos/Gestion de documentos/Servidor/srvGestorDocumentos_Impl.pas
@@ -38,7 +38,13 @@ implementation
{$R *.dfm}
uses
- {Generated:} FactuGES_Invk, srvConfiguracion_Impl, uSistemaFunc, Dialogs;
+ {Generated:} FactuGES_Invk, srvConfiguracion_Impl, uSistemaFunc, Dialogs, Forms;
+
+const
+ CTE_VALOR = 'RUTA_DOCUMENTOS';
+ CTE_DOCUMENTOS = 'DOCUMENTOS';
+ CTE_ALMACEN_PRESUPUESTOS = '\Presupuestos\';
+
procedure Create_srvGestorDocumentos(out anInstance : IUnknown);
begin
@@ -74,7 +80,7 @@ begin
case Almacen of
TRdxAlmacenes_Presupuestos:
begin
- Ruta := Ruta + '\presupuestos\' + IntToStr(ID) + '\*.*';
+ Ruta := Ruta + CTE_ALMACEN_PRESUPUESTOS + IntToStr(ID) + '\*.*';
ListaFicheros := FindFile(Ruta);
Result := StringArray.Create();
for i := 0 to ListaFicheros.Count - 1 do
@@ -100,7 +106,7 @@ begin
try
GetClassFactory('srvConfiguracion').CreateInstance(AClientID, Intf);
AConfiguracionService := Intf as IsrvConfiguracion;
- Result := AConfiguracionService.darValor('RUTA_DOCUMENTOS');
+ Result := AConfiguracionService.darValor(CTE_VALOR, (ExtractFilePath(Application.ExeName) + CTE_DOCUMENTOS));
finally
AConfiguracionService := Nil;
end;
@@ -118,7 +124,7 @@ begin
case Almacen of
TRdxAlmacenes_Presupuestos:
begin
- Ruta := Ruta + '\presupuestos\' + IntToStr(ID) + '\' + NombreFichero;
+ Ruta := Ruta + CTE_ALMACEN_PRESUPUESTOS + IntToStr(ID) + '\' + NombreFichero;
Result.LoadFromFile(Ruta);
end;
end;
@@ -140,7 +146,7 @@ begin
case Almacen of
TRdxAlmacenes_Presupuestos:
begin
- Ruta := Ruta + '\presupuestos\' + IntToStr(ID) + '\' + NombreFichero;
+ Ruta := Ruta + CTE_ALMACEN_PRESUPUESTOS + IntToStr(ID) + '\' + NombreFichero;
Result := DeleteFile(Ruta);
end;
end;
@@ -161,7 +167,7 @@ begin
case Almacen of
TRdxAlmacenes_Presupuestos:
begin
- Ruta := Ruta + '\presupuestos\' + IntToStr(ID);
+ Ruta := Ruta + CTE_ALMACEN_PRESUPUESTOS + IntToStr(ID);
Deltree(Ruta, True);
Result := True;
end;
@@ -180,10 +186,17 @@ begin
Result := False;
try
Ruta := DarRutaDocumentos;
+ if not DirectoryExists(Ruta) then
+ CreateDir(Ruta);
+
case Almacen of
TRdxAlmacenes_Presupuestos:
begin
- Ruta := Ruta + '\presupuestos\' + IntToStr(ID);
+ Ruta := Ruta + CTE_ALMACEN_PRESUPUESTOS;
+ if not DirectoryExists(Ruta) then
+ CreateDir(Ruta);
+
+ Ruta := Ruta + IntToStr(ID);
if not DirectoryExists(Ruta) then
CreateDir(Ruta);
diff --git a/Source/Servicios/FactuGES.RODL b/Source/Servicios/FactuGES.RODL
index d2610152..4c2eef57 100644
--- a/Source/Servicios/FactuGES.RODL
+++ b/Source/Servicios/FactuGES.RODL
@@ -108,6 +108,8 @@
+
+
diff --git a/Source/Servicios/FactuGES_Intf.pas b/Source/Servicios/FactuGES_Intf.pas
index 9438e926..50d53b5e 100644
--- a/Source/Servicios/FactuGES_Intf.pas
+++ b/Source/Servicios/FactuGES_Intf.pas
@@ -299,7 +299,7 @@ type
{ IsrvConfiguracion }
IsrvConfiguracion = interface(IDataAbstractService)
['{0882B8A4-C8AA-424E-8FC1-C6226B670522}']
- function darValor(const CODIGO: String): String;
+ function darValor(const CODIGO: String; const ValorPorDefecto: String): String;
end;
{ CosrvConfiguracion }
@@ -312,7 +312,7 @@ type
protected
function __GetInterfaceName:string; override;
- function darValor(const CODIGO: String): String;
+ function darValor(const CODIGO: String; const ValorPorDefecto: String): String;
end;
{ IsrvFamilias }
@@ -1338,11 +1338,12 @@ begin
result := 'srvConfiguracion';
end;
-function TsrvConfiguracion_Proxy.darValor(const CODIGO: String): String;
+function TsrvConfiguracion_Proxy.darValor(const CODIGO: String; const ValorPorDefecto: String): String;
begin
try
__Message.InitializeRequestMessage(__TransportChannel, 'FactuGES', __InterfaceName, 'darValor');
__Message.Write('CODIGO', TypeInfo(String), CODIGO, []);
+ __Message.Write('ValorPorDefecto', TypeInfo(String), ValorPorDefecto, []);
__Message.Finalize;
__TransportChannel.Dispatch(__Message);
diff --git a/Source/Servicios/FactuGES_Invk.pas b/Source/Servicios/FactuGES_Invk.pas
index 7784a65e..8ac25a4f 100644
--- a/Source/Servicios/FactuGES_Invk.pas
+++ b/Source/Servicios/FactuGES_Invk.pas
@@ -391,15 +391,17 @@ end;
{ TsrvConfiguracion_Invoker }
procedure TsrvConfiguracion_Invoker.Invoke_darValor(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
-{ function darValor(const CODIGO: String): String; }
+{ function darValor(const CODIGO: String; const ValorPorDefecto: String): String; }
var
CODIGO: String;
+ ValorPorDefecto: String;
lResult: String;
begin
try
__Message.Read('CODIGO', TypeInfo(String), CODIGO, []);
+ __Message.Read('ValorPorDefecto', TypeInfo(String), ValorPorDefecto, []);
- lResult := (__Instance as IsrvConfiguracion).darValor(CODIGO);
+ lResult := (__Instance as IsrvConfiguracion).darValor(CODIGO, ValorPorDefecto);
__Message.InitializeResponseMessage(__Transport, 'FactuGES', 'srvConfiguracion', 'darValorResponse');
__Message.Write('Result', TypeInfo(String), lResult, []);
diff --git a/Source/Servicios/RODLFILE.res b/Source/Servicios/RODLFILE.res
index 558c9d83..e39c0ebb 100644
Binary files a/Source/Servicios/RODLFILE.res and b/Source/Servicios/RODLFILE.res differ
diff --git a/Source/Servidor/Configuracion/srvConfiguracion_Impl.dfm b/Source/Servidor/Configuracion/srvConfiguracion_Impl.dfm
index 95fac36b..97d462a6 100644
--- a/Source/Servidor/Configuracion/srvConfiguracion_Impl.dfm
+++ b/Source/Servidor/Configuracion/srvConfiguracion_Impl.dfm
@@ -38,12 +38,41 @@ object srvConfiguracion: TsrvConfiguracion
item
Name = 'VALOR'
DataType = datString
- Size = 100
+ Size = 255
end>
end>
JoinDataTables = <>
UnionDataTables = <>
- Commands = <>
+ Commands = <
+ item
+ Params = <
+ item
+ Name = 'CODIGO'
+ Value = ''
+ end
+ item
+ Name = 'VALOR'
+ Value = ''
+ end
+ item
+ Name = 'ID_EMPRESA'
+ Value = ''
+ end>
+ Statements = <
+ item
+ Connection = 'IBX'
+ ConnectionType = 'Interbase'
+ Default = True
+ TargetTable = 'CONFIGURACION'
+ Name = 'IBX'
+ SQL =
+ 'insert into CONFIGURACION (ID, CODIGO, VALOR, ID_EMPRESA)'#10'values' +
+ '(GEN_ID(GEN_CONFIGURACION_ID, 1), :CODIGO, :VALOR, :ID_EMPRESA)'#10
+ StatementType = stSQL
+ ColumnMappings = <>
+ end>
+ Name = 'InsertarValor'
+ end>
RelationShips = <>
UpdateRules = <>
Version = 0
diff --git a/Source/Servidor/Configuracion/srvConfiguracion_Impl.pas b/Source/Servidor/Configuracion/srvConfiguracion_Impl.pas
index a1e1f1a1..5ec37ded 100644
--- a/Source/Servidor/Configuracion/srvConfiguracion_Impl.pas
+++ b/Source/Servidor/Configuracion/srvConfiguracion_Impl.pas
@@ -21,14 +21,14 @@ uses
type
{ TsrvConfiguracion }
TsrvConfiguracion = class(TDataAbstractService, IsrvConfiguracion)
- schConfiguracion: TDASchema;
Bin2DataStreamer: TDABin2DataStreamer;
+ schConfiguracion: TDASchema;
procedure DARemoteServiceCreate(Sender: TObject);
procedure DataAbstractServiceBeforeAcquireConnection(aSender: TObject;
var aConnectionName: string);
protected
{ IsrvConfiguracion methods }
- function DarValor(const CODIGO: String): String;
+ function DarValor(const CODIGO: String; const ValorPorDefecto: String = ''): String;
end;
implementation
@@ -49,9 +49,12 @@ begin
SessionManager := dmServer.SessionManager;
end;
-function TsrvConfiguracion.DarValor(const CODIGO: String): String;
+function TsrvConfiguracion.DarValor(const CODIGO: String; const ValorPorDefecto: String = ''): String;
var
ADataSet : IDADataset;
+ ASchema : TDASchema;
+ ACurrentConn : IDAConnection;
+ ACommand : IDASQLCommand;
begin
try
ADataSet := schConfiguracion.NewDataset(Connection, 'darValor', ['CODIGO'], [CODIGO]);
@@ -59,7 +62,26 @@ begin
if ADataSet.Dataset.RecordCount > 0 then
Result := ADataSet.Dataset.Fields[0].AsVariant
else
- RaiseError('Falta variable de configuracion: ' + CODIGO);
+ begin
+ Result := ValorPorDefecto;
+ //Creamos la variable de configuración con su valor por defecto
+ ACurrentConn := dmServer.ConnectionManager.NewConnection(dmServer.ConnectionManager.GetDefaultConnectionName);
+ ACommand := schConfiguracion.NewCommand(ACurrentConn, 'InsertarValor');
+ try
+ with ACommand do
+ begin
+ ParamByName('CODIGO').Value := CODIGO;
+ ParamByName('VALOR').Value := ValorPorDefecto;
+ ParamByName('ID_EMPRESA').Value := Null;
+ Execute;
+ ACurrentConn.CommitTransaction;
+ end;
+ except
+ ACurrentConn.RollbackTransaction;
+ end;
+ ACommand := NIL;
+// RaiseError('Falta variable de configuracion: ' + CODIGO);
+ end;
finally
ADataSet.Close;
end;
diff --git a/Source/Servidor/FactuGES_Server.dproj b/Source/Servidor/FactuGES_Server.dproj
index e33b3439..c4a4c0a9 100644
--- a/Source/Servidor/FactuGES_Server.dproj
+++ b/Source/Servidor/FactuGES_Server.dproj
@@ -1,294 +1,294 @@
-
+
-
- {ebdcd25d-40d7-4146-91ec-a0ea4aa1dcd1}
- FactuGES_Server.dpr
- Debug
- AnyCPU
- DCC32
- ..\..\Output\Debug\Servidor\FactuGES_Server.exe
- vcl;rtl;vclx;vclactnband;dbrtl;vcldb;vcldbx;bdertl;dsnap;dsnapcon;teeUI;teedb;tee;adortl;vclib;ibxpress;dbxcds;dbexpress;DbxCommonDriver;IndyCore;IndySystem;IndyProtocols;VclSmp;vclie;webdsnap;xmlrtl;inet;inetdbbde;inetdbxpress;RemObjects_BPDX_D11;RemObjects_RODX_D11;RemObjects_Indy_D11;RemObjects_Synapse_D11;RemObjects_WebBroker_D11;DataAbstract_Core_D11;DataAbstract_DBXDriver_D11;DataAbstract_IDE_D11;DataAbstract_Scripting_D11;DataAbstract_SDACDriver_D11;sdac105;dac105;DataAbstract_SQLiteDriver_D11;cxEditorsD10;cxLibraryD10;dxThemeD10;cxDataD10;cxExtEditorsD10;cxGridD10;cxPageControlD10;cxSchedulerD10;cxTreeListD10;cxVerticalGridD10;dxBarD10;dxComnD10;dxBarDBNavD10;dxBarExtDBItemsD10;dxBarExtItemsD10;dxDockingD10;dxLayoutControlD10;dxNavBarD10;dxPSCoreD10;dxsbD10;dxPScxCommonD10;dxPSLnksD10;vclshlctrls;dxPScxExtCommonD10;dxPScxGridLnkD10;dxPScxPCProdD10;dxPScxScheduler2LnkD10;dxPScxTLLnkD10;dxPSdxLCLnkD10;dxPsPrVwAdvD10;pckMD5;pckUCDataConnector;pckUserControl_RT;PluginSDK_D10R;PNG_D10;PngComponentsD10;tb2k_d10;tbx_d10;JclVcl;Jcl;JvXPCtrlsD11R;JvCoreD11R;JvSystemD11R;JvStdCtrlsD11R;JvAppFrmD11R;JvBandsD11R;JvDBD11R;JvDlgsD11R;JvBDED11R;JvCmpD11R;JvCryptD11R;JvCtrlsD11R;JvCustomD11R;JvDockingD11R;JvDotNetCtrlsD11R;JvEDID11R;JvGlobusD11R;JvHMID11R;JvInterpreterD11R;JvJansD11R;JvManagedThreadsD11R;JvMMD11R;JvNetD11R;JvPageCompsD11R;JvPluginD11R;JvPrintPreviewD11R;JvRuntimeDesignD11R;JvTimeFrameworkD11R;JvUIBD11R;JvValidatorsD11R;JvWizardD11R;pckUCADOConn;pckUCBDEConn;pckUCIBXConn;pckUCMidasConn;cxIntlPrintSys3D10;cxExportD10;cxIntl5D10;GUISDK_D11;ccpackD11;JSDialog100;fsTee11;fs11;frx11;frxADO11;frxBDE11;frxDB11;frxDBX11;frxe11;frxIBX11;frxTee11;fsADO11;fsBDE11;fsDB11;fsIBX11;websnap;soaprtl;IntrawebDB_90_100;Intraweb_90_100
-
-
- 7.0
- False
- False
- 0
- 3
- ..\..\Output\Release\Servidor
- RELEASE
-
-
- 7.0
- 3
- ..\..\Output\Debug\Servidor
- DEBUG;
- True
- True
- True
- $(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10
- $(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10
- $(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10
- $(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10
-
-
- Delphi.Personality
-
-
- FalseTrueFalse/standaloneTrueFalse1240FalseFalseFalseFalseFalse308212521.2.4.01.2.4.0jueves, 21 de agosto de 2008 18:49FactuGES_Server.dpr
-
-
-
-
- MainSource
-
-
-
-
-
-
- TDARemoteService
-
-
-
-
-
-
-
-
-
-
-
-
-
- TDataModule
-
-
-
- TDataModule
-
-
-
- TDataAbstractService
-
-
-
-
-
-
- TDataAbstractService
-
-
-
-
-
- TDARemoteService
-
-
-
-
-
-
- TDARemoteService
-
-
-
-
-
-
-
-
-
- TDataModule
-
-
-
- TDataModule
-
-
-
- TDARemoteService
-
-
-
-
-
- TDataAbstractService
-
-
-
-
-
-
- TDataModule
-
-
-
- TDataModule
-
-
-
- TDataAbstractService
-
-
-
-
-
-
- TDataAbstractService
-
-
-
-
-
-
-
-
-
-
- TDataAbstractService
-
-
-
-
-
- TDataAbstractService
-
-
-
-
-
- TDataAbstractService
-
-
-
-
-
-
-
-
-
-
- TDataModule
-
-
-
- TDataModule
-
-
-
- TDataAbstractService
-
-
-
-
-
-
- TDataModule
-
-
-
- TDataModule
-
-
-
- TDataModule
-
-
-
- TDataAbstractService
-
-
-
-
-
- TDataModule
-
-
-
- TDataAbstractService
-
-
-
-
-
- TDataAbstractService
-
-
-
-
-
- TDataAbstractService
-
-
-
-
-
-
- TDataAbstractService
-
-
-
-
-
-
- TDataAbstractService
-
-
-
-
-
-
-
-
- TDataAbstractService
-
-
-
-
-
- TDataAbstractService
-
-
-
- TFrame
-
-
-
- TFrame
-
-
-
- TForm
-
-
-
- TFrame
-
-
-
- TDARemoteService
-
-
-
-
-
-
- TDataModule
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ {ebdcd25d-40d7-4146-91ec-a0ea4aa1dcd1}
+ FactuGES_Server.dpr
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Output\Debug\Servidor\FactuGES_Server.exe
+ vcl;rtl;vclx;vclactnband;dbrtl;vcldb;vcldbx;bdertl;dsnap;dsnapcon;teeUI;teedb;tee;adortl;vclib;ibxpress;dbxcds;dbexpress;DbxCommonDriver;IndyCore;IndySystem;IndyProtocols;VclSmp;vclie;webdsnap;xmlrtl;inet;inetdbbde;inetdbxpress;RemObjects_BPDX_D11;RemObjects_RODX_D11;RemObjects_Indy_D11;RemObjects_Synapse_D11;RemObjects_WebBroker_D11;DataAbstract_Core_D11;DataAbstract_DBXDriver_D11;DataAbstract_IDE_D11;DataAbstract_Scripting_D11;DataAbstract_SDACDriver_D11;sdac105;dac105;DataAbstract_SQLiteDriver_D11;cxEditorsD10;cxLibraryD10;dxThemeD10;cxDataD10;cxExtEditorsD10;cxGridD10;cxPageControlD10;cxSchedulerD10;cxTreeListD10;cxVerticalGridD10;dxBarD10;dxComnD10;dxBarDBNavD10;dxBarExtDBItemsD10;dxBarExtItemsD10;dxDockingD10;dxLayoutControlD10;dxNavBarD10;dxPSCoreD10;dxsbD10;dxPScxCommonD10;dxPSLnksD10;vclshlctrls;dxPScxExtCommonD10;dxPScxGridLnkD10;dxPScxPCProdD10;dxPScxScheduler2LnkD10;dxPScxTLLnkD10;dxPSdxLCLnkD10;dxPsPrVwAdvD10;pckMD5;pckUCDataConnector;pckUserControl_RT;PluginSDK_D10R;PNG_D10;PngComponentsD10;tb2k_d10;tbx_d10;JclVcl;Jcl;JvXPCtrlsD11R;JvCoreD11R;JvSystemD11R;JvStdCtrlsD11R;JvAppFrmD11R;JvBandsD11R;JvDBD11R;JvDlgsD11R;JvBDED11R;JvCmpD11R;JvCryptD11R;JvCtrlsD11R;JvCustomD11R;JvDockingD11R;JvDotNetCtrlsD11R;JvEDID11R;JvGlobusD11R;JvHMID11R;JvInterpreterD11R;JvJansD11R;JvManagedThreadsD11R;JvMMD11R;JvNetD11R;JvPageCompsD11R;JvPluginD11R;JvPrintPreviewD11R;JvRuntimeDesignD11R;JvTimeFrameworkD11R;JvUIBD11R;JvValidatorsD11R;JvWizardD11R;pckUCADOConn;pckUCBDEConn;pckUCIBXConn;pckUCMidasConn;cxIntlPrintSys3D10;cxExportD10;cxIntl5D10;GUISDK_D11;ccpackD11;JSDialog100;fsTee11;fs11;frx11;frxADO11;frxBDE11;frxDB11;frxDBX11;frxe11;frxIBX11;frxTee11;fsADO11;fsBDE11;fsDB11;fsIBX11;websnap;soaprtl;IntrawebDB_90_100;Intraweb_90_100
+
+
+ 7.0
+ False
+ False
+ 0
+ 3
+ ..\..\Output\Release\Servidor
+ RELEASE
+
+
+ 7.0
+ 3
+ ..\..\Output\Debug\Servidor
+ DEBUG;
+ True
+ True
+ True
+ $(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10
+ $(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10
+ $(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10
+ $(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10
+
+
+ Delphi.Personality
+
+
+FalseTrueFalse/standaloneTrueFalse1240FalseFalseFalseFalseFalse308212521.2.4.01.2.4.0jueves, 21 de agosto de 2008 18:49FactuGES_Server.dpr
+
+
+
+
+ MainSource
+
+
+
+
+
+
+ TDARemoteService
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TDataModule
+
+
+
+ TDataModule
+
+
+
+ TDataAbstractService
+
+
+
+
+
+
+ TDataAbstractService
+
+
+
+
+
+ TDARemoteService
+
+
+
+
+
+
+ TDARemoteService
+
+
+
+
+
+
+
+
+
+ TDataModule
+
+
+
+ TDataModule
+
+
+
+ TDARemoteService
+
+
+
+
+
+ TDataAbstractService
+
+
+
+
+
+
+ TDataModule
+
+
+
+ TDataModule
+
+
+
+ TDataAbstractService
+
+
+
+
+
+
+ TDataAbstractService
+
+
+
+
+
+
+
+
+
+
+ TDataAbstractService
+
+
+
+
+
+ TDataAbstractService
+
+
+
+
+
+ TDataAbstractService
+
+
+
+
+
+
+
+
+
+
+ TDataModule
+
+
+
+ TDataModule
+
+
+
+ TDataAbstractService
+
+
+
+
+
+
+ TDataModule
+
+
+
+ TDataModule
+
+
+
+ TDataModule
+
+
+
+ TDataAbstractService
+
+
+
+
+
+ TDataModule
+
+
+
+ TDataAbstractService
+
+
+
+
+
+ TDataAbstractService
+
+
+
+
+
+ TDataAbstractService
+
+
+
+
+
+
+ TDataAbstractService
+
+
+
+
+
+
+ TDataAbstractService
+
+
+
+
+
+
+
+
+ TDataAbstractService
+
+
+
+
+
+ TDataAbstractService
+
+
+
+ TFrame
+
+
+
+ TFrame
+
+
+
+ TForm
+
+
+
+ TFrame
+
+
+
+ TDARemoteService
+
+
+
+
+
+
+ TDataModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+