| Line 184... |
Line 184... |
| 184 |
'
|
184 |
'
|
| 185 |
' Setup for the database access
|
185 |
' Setup for the database access
|
| 186 |
OraDatabase.Parameters.Add "SDKNAME", QStrPar("sdkName"), ORAPARM_INPUT, ORATYPE_VARCHAR2
|
186 |
OraDatabase.Parameters.Add "SDKNAME", QStrPar("sdkName"), ORAPARM_INPUT, ORATYPE_VARCHAR2
|
| 187 |
OraDatabase.Parameters.Add "SDKCOMMENT", QStrPar("sdkComment"), ORAPARM_INPUT, ORATYPE_VARCHAR2
|
187 |
OraDatabase.Parameters.Add "SDKCOMMENT", QStrPar("sdkComment"), ORAPARM_INPUT, ORATYPE_VARCHAR2
|
| 188 |
OraDatabase.Parameters.Add "SDKBASEVIEW", baseView, ORAPARM_INPUT, ORATYPE_VARCHAR2
|
188 |
OraDatabase.Parameters.Add "SDKBASEVIEW", baseView, ORAPARM_INPUT, ORATYPE_VARCHAR2
|
| 189 |
OraDatabase.Parameters.Add "SDKVIEWID", 0, ORAPARM_INPUT, ORATYPE_NUMBER
|
189 |
OraDatabase.Parameters.Add "SDKVIEWID", 0, ORAPARM_INPUT, ORATYPE_NUMBER
|
| - |
|
190 |
OraDatabase.Parameters.Add "SDKPROJECT", QStrPar("sdkProject"), ORAPARM_INPUT, ORATYPE_NUMBER
|
| 190 |
|
191 |
|
| 191 |
' Test existance - simply to provide a Nice Error message
|
192 |
' Test existance - simply to provide a Nice Error message
|
| 192 |
SqlQry = "SELECT * FROM SDK_NAMES WHERE SDK_NAME = :SDKNAME"
|
193 |
SqlQry = "SELECT * FROM SDK_NAMES WHERE SDK_NAME = :SDKNAME"
|
| 193 |
objEH.ErrorRedirect = FALSE
|
194 |
objEH.ErrorRedirect = FALSE
|
| 194 |
objEH.TryORA ( OraSession )
|
195 |
objEH.TryORA ( OraSession )
|
| Line 229... |
Line 230... |
| 229 |
"INSERT INTO views (view_id, view_name, owner_id, base_view, public_read)"&_
|
230 |
"INSERT INTO views (view_id, view_name, owner_id, base_view, public_read)"&_
|
| 230 |
" VALUES ("& SEQ_view_id &", '"& baseView &"', 0,'S','Y')"
|
231 |
" VALUES ("& SEQ_view_id &", '"& baseView &"', 0,'S','Y')"
|
| 231 |
End If
|
232 |
End If
|
| 232 |
|
233 |
|
| 233 |
If Err.Number = 0 Then
|
234 |
If Err.Number = 0 Then
|
| 234 |
SqlQry = "INSERT INTO SDK_NAMES (SDK_NAME, SDK_COMMENT, VIEW_ID) VALUES (:SDKNAME, :SDKCOMMENT, :SDKVIEWID )"
|
235 |
SqlQry = "INSERT INTO SDK_NAMES (SDK_NAME, SDK_COMMENT, VIEW_ID, PROJ_ID) VALUES (:SDKNAME, :SDKCOMMENT, :SDKVIEWID, :SDKPROJECT )"
|
| 235 |
On Error Resume Next
|
236 |
On Error Resume Next
|
| 236 |
OraDatabase.ExecuteSQL SqlQry
|
237 |
OraDatabase.ExecuteSQL SqlQry
|
| 237 |
If Err.Number = 0 Then
|
238 |
If Err.Number = 0 Then
|
| 238 |
result = 0
|
239 |
result = 0
|
| 239 |
End If
|
240 |
End If
|
| 240 |
End If
|
241 |
End If
|
| 241 |
|
242 |
|
| 242 |
objEH.CatchORA ( OraSession )
|
243 |
objEH.CatchORA ( OraSession )
|
| 243 |
On Error GoTo 0
|
244 |
On Error GoTo 0
|
| 244 |
End If
|
245 |
End If
|
| - |
|
246 |
OraDatabase.Parameters.Remove "SDKPROJECT"
|
| 245 |
OraDatabase.Parameters.Remove "SDKVIEWID"
|
247 |
OraDatabase.Parameters.Remove "SDKVIEWID"
|
| 246 |
OraDatabase.Parameters.Remove "SDKBASEVIEW"
|
248 |
OraDatabase.Parameters.Remove "SDKBASEVIEW"
|
| 247 |
OraDatabase.Parameters.Remove "SDKCOMMENT"
|
249 |
OraDatabase.Parameters.Remove "SDKCOMMENT"
|
| 248 |
OraDatabase.Parameters.Remove "SDKNAME"
|
250 |
OraDatabase.Parameters.Remove "SDKNAME"
|
| 249 |
End Sub
|
251 |
End Sub
|
| Line 288... |
Line 290... |
| 288 |
'
|
290 |
'
|
| 289 |
OraDatabase.Parameters.Add "SDKID", QStrPar("sdkId"), ORAPARM_INPUT, ORATYPE_NUMBER
|
291 |
OraDatabase.Parameters.Add "SDKID", QStrPar("sdkId"), ORAPARM_INPUT, ORATYPE_NUMBER
|
| 290 |
OraDatabase.Parameters.Add "SDKNAME", QStrPar("sdkName"), ORAPARM_INPUT, ORATYPE_VARCHAR2
|
292 |
OraDatabase.Parameters.Add "SDKNAME", QStrPar("sdkName"), ORAPARM_INPUT, ORATYPE_VARCHAR2
|
| 291 |
OraDatabase.Parameters.Add "SDKCOMMENT", QStrPar("sdkComment"), ORAPARM_INPUT, ORATYPE_VARCHAR2
|
293 |
OraDatabase.Parameters.Add "SDKCOMMENT", QStrPar("sdkComment"), ORAPARM_INPUT, ORATYPE_VARCHAR2
|
| 292 |
OraDatabase.Parameters.Add "SDKBASEVIEW", QStrPar("sdkBaseView"), ORAPARM_INPUT, ORATYPE_NUMBER
|
294 |
OraDatabase.Parameters.Add "SDKBASEVIEW", QStrPar("sdkBaseView"), ORAPARM_INPUT, ORATYPE_NUMBER
|
| - |
|
295 |
OraDatabase.Parameters.Add "SDKPROJECT", QStrPar("sdkProject"), ORAPARM_INPUT, ORATYPE_NUMBER
|
| 293 |
|
296 |
|
| 294 |
' Test existance - simply to provide a Nice Error message
|
297 |
' Test existance - simply to provide a Nice Error message
|
| 295 |
SqlQry = "SELECT * FROM SDK_NAMES WHERE SDK_NAME = :SDKNAME AND SDK_ID != :SDKID"
|
298 |
SqlQry = "SELECT * FROM SDK_NAMES WHERE SDK_NAME = :SDKNAME AND SDK_ID != :SDKID"
|
| 296 |
objEH.ErrorRedirect = FALSE
|
299 |
objEH.ErrorRedirect = FALSE
|
| 297 |
objEH.TryORA ( OraSession )
|
300 |
objEH.TryORA ( OraSession )
|
| Line 305... |
Line 308... |
| 305 |
oJSON.data("error") = -1
|
308 |
oJSON.data("error") = -1
|
| 306 |
oJSON.data("emsgSummary") = "SDK Name already exists"
|
309 |
oJSON.data("emsgSummary") = "SDK Name already exists"
|
| 307 |
oJSON.data("emsgDetails") = oJSON.data("emsgSummary")
|
310 |
oJSON.data("emsgDetails") = oJSON.data("emsgSummary")
|
| 308 |
Else
|
311 |
Else
|
| 309 |
' Update an existing entry
|
312 |
' Update an existing entry
|
| 310 |
SqlQry = "UPDATE SDK_NAMES SET SDK_NAME = :SDKNAME, SDK_COMMENT = :SDKCOMMENT, VIEW_ID = :SDKBASEVIEW WHERE SDK_ID = :SDKID"
|
313 |
SqlQry = "UPDATE SDK_NAMES SET SDK_NAME = :SDKNAME, SDK_COMMENT = :SDKCOMMENT, VIEW_ID = :SDKBASEVIEW, PROJ_ID = :SDKPROJECT WHERE SDK_ID = :SDKID"
|
| 311 |
objEH.ErrorRedirect = FALSE
|
314 |
objEH.ErrorRedirect = FALSE
|
| 312 |
objEH.TryORA ( OraSession )
|
315 |
objEH.TryORA ( OraSession )
|
| 313 |
On Error Resume Next
|
316 |
On Error Resume Next
|
| 314 |
OraDatabase.ExecuteSQL SqlQry
|
317 |
OraDatabase.ExecuteSQL SqlQry
|
| 315 |
objEH.CatchORA ( OraSession )
|
318 |
objEH.CatchORA ( OraSession )
|
| 316 |
On Error GoTo 0
|
319 |
On Error GoTo 0
|
| 317 |
result = 0
|
320 |
result = 0
|
| 318 |
End If
|
321 |
End If
|
| 319 |
|
322 |
|
| - |
|
323 |
OraDatabase.Parameters.Remove "SDKPROJECT"
|
| 320 |
OraDatabase.Parameters.Remove "SDKBASEVIEW"
|
324 |
OraDatabase.Parameters.Remove "SDKBASEVIEW"
|
| 321 |
OraDatabase.Parameters.Remove "SDKCOMMENT"
|
325 |
OraDatabase.Parameters.Remove "SDKCOMMENT"
|
| 322 |
OraDatabase.Parameters.Remove "SDKNAME"
|
326 |
OraDatabase.Parameters.Remove "SDKNAME"
|
| 323 |
OraDatabase.Parameters.Remove "SDKID"
|
327 |
OraDatabase.Parameters.Remove "SDKID"
|
| 324 |
End Sub
|
328 |
End Sub
|
| Line 581... |
Line 585... |
| 581 |
End Sub
|
585 |
End Sub
|
| 582 |
|
586 |
|
| 583 |
'-------------------------------------------------
|
587 |
'-------------------------------------------------
|
| 584 |
' Function: getSdkUsage
|
588 |
' Function: getSdkUsage
|
| 585 |
' Description: Get SDK Usage information for a given sdktag_id
|
589 |
' Description: Get SDK Usage information for a given sdktag_id
|
| 586 |
' Array of:
|
590 |
' Array of (unless countOnly is not empty):
|
| 587 |
' sdktag_id
|
591 |
' sdktag_id
|
| 588 |
' sdktag_name
|
592 |
' sdktag_name
|
| 589 |
' sdktag_state
|
593 |
' sdktag_state
|
| - |
|
594 |
' useCount
|
| 590 |
'
|
595 |
'
|
| 591 |
' Options: sdktag_id - Get information for given sdktag
|
596 |
' Options: sdktag_id - Get information for given sdktag
|
| - |
|
597 |
' countOnly - Just get count (Simple Test)
|
| 592 |
|
598 |
|
| 593 |
Sub getSdkUsage
|
599 |
Sub getSdkUsage
|
| 594 |
' Get Data for an existing entry
|
600 |
' Get Data for an existing entry
|
| 595 |
' Setup for the database access
|
601 |
' Setup for the database access
|
| 596 |
Dim sdktag_id : sdktag_id = QStrPar("sdktag_id")
|
602 |
Dim sdktag_id : sdktag_id = QStrPar("sdktag_id")
|
| 597 |
OraDatabase.Parameters.Add "SDKTAG_ID", sdktag_id, ORAPARM_INPUT, ORATYPE_NUMBER
|
603 |
OraDatabase.Parameters.Add "SDKTAG_ID", sdktag_id, ORAPARM_INPUT, ORATYPE_NUMBER
|
| 598 |
|
604 |
|
| 599 |
SqlQry = "SELECT DISTINCT p.proj_id, rc.rtag_id, p.PROJ_NAME, rt.RTAG_NAME" &_
|
605 |
SqlQry = "SELECT DISTINCT p.proj_id, rc.rtag_id, p.PROJ_NAME, rt.RTAG_NAME" &_
|
| 600 |
" FROM release_content rc," &_
|
606 |
" FROM release_content rc," &_
|
| 601 |
" release_tags rt, PROJECTS p" &_
|
607 |
" release_tags rt, PROJECTS p" &_
|
| 602 |
" WHERE NOT rc.SDKTAG_ID = :SDKTAG_ID" &_
|
608 |
" WHERE rc.SDKTAG_ID = :SDKTAG_ID" &_
|
| 603 |
" and rc.RTAG_ID = rt.RTAG_ID" &_
|
609 |
" and rc.RTAG_ID = rt.RTAG_ID" &_
|
| 604 |
" and p.PROJ_ID = rt.PROJ_ID" &_
|
610 |
" and p.PROJ_ID = rt.PROJ_ID" &_
|
| 605 |
" ORDER BY UPPER(p.PROJ_NAME), UPPER(rt.RTAG_NAME)"
|
611 |
" ORDER BY UPPER(p.PROJ_NAME), UPPER(rt.RTAG_NAME)"
|
| 606 |
|
612 |
|
| 607 |
' Perform Query
|
613 |
' Perform Query
|
| Line 610... |
Line 616... |
| 610 |
On Error Resume Next
|
616 |
On Error Resume Next
|
| 611 |
Set rsQry = OraDatabase.DbCreateDynaset( SqlQry, ORADYN_DEFAULT )
|
617 |
Set rsQry = OraDatabase.DbCreateDynaset( SqlQry, ORADYN_DEFAULT )
|
| 612 |
objEH.CatchORA ( OraSession )
|
618 |
objEH.CatchORA ( OraSession )
|
| 613 |
|
619 |
|
| 614 |
' Process Results
|
620 |
' Process Results
|
| - |
|
621 |
If QStrPar("countOnly") = "" Then
|
| 615 |
Set oJSON.data("aaData") = oJSON.Collection()
|
622 |
Set oJSON.data("aaData") = oJSON.Collection()
|
| 616 |
While (NOT rsQry.BOF) AND (NOT rsQry.EOF)
|
623 |
While (NOT rsQry.BOF) AND (NOT rsQry.EOF)
|
| 617 |
Set newitem = oJSON.AddToCollection(oJSON.data("aaData"))
|
624 |
Set newitem = oJSON.AddToCollection(oJSON.data("aaData"))
|
| 618 |
Dim ii
|
625 |
Dim ii
|
| 619 |
for ii = 0 to rsQry.Fields.Count - 1
|
626 |
for ii = 0 to rsQry.Fields.Count - 1
|
| 620 |
newitem (rsQry.FieldName(ii)) = rsQry.Fields(ii)
|
627 |
newitem (rsQry.FieldName(ii)) = rsQry.Fields(ii)
|
| 621 |
Next
|
628 |
Next
|
| 622 |
rsQry.MoveNext
|
629 |
rsQry.MoveNext
|
| 623 |
Wend
|
630 |
Wend
|
| - |
|
631 |
End If
|
| - |
|
632 |
|
| - |
|
633 |
' Return count too
|
| - |
|
634 |
oJSON.data("useCount") = rsQry.RecordCount
|
| 624 |
|
635 |
|
| 625 |
result = 0
|
636 |
result = 0
|
| 626 |
rsQry.Close
|
637 |
rsQry.Close
|
| 627 |
Set rsQry = Nothing
|
638 |
Set rsQry = Nothing
|
| 628 |
|
639 |
|
| Line 819... |
Line 830... |
| 819 |
'
|
830 |
'
|
| 820 |
OraDatabase.Parameters.Add "SDKTAG_ID", sdkTagId, ORAPARM_INPUT, ORATYPE_NUMBER
|
831 |
OraDatabase.Parameters.Add "SDKTAG_ID", sdkTagId, ORAPARM_INPUT, ORATYPE_NUMBER
|
| 821 |
|
832 |
|
| 822 |
' Test to see if the version is in use - simply to provide a Nice Error message
|
833 |
' Test to see if the version is in use - simply to provide a Nice Error message
|
| 823 |
SqlQry = "SELECT * FROM SDK_TAGS WHERE SDKTAG_ID = :SDKTAG_ID"
|
834 |
SqlQry = "SELECT * FROM SDK_TAGS WHERE SDKTAG_ID = :SDKTAG_ID"
|
| 824 |
objEH.ErrorRedirect = FALSE
|
835 |
'objEH.ErrorRedirect = FALSE
|
| 825 |
objEH.TryORA ( OraSession )
|
836 |
'objEH.TryORA ( OraSession )
|
| 826 |
'On Error Resume Next
|
837 |
'On Error Resume Next
|
| 827 |
Set rsQry = OraDatabase.DbCreateDynaset( SqlQry, ORADYN_DEFAULT )
|
838 |
Set rsQry = OraDatabase.DbCreateDynaset( SqlQry, ORADYN_DEFAULT )
|
| 828 |
objEH.CatchORA ( OraSession )
|
839 |
'objEH.CatchORA ( OraSession )
|
| 829 |
On Error GoTo 0
|
840 |
On Error GoTo 0
|
| 830 |
|
841 |
|
| 831 |
If rsQry.RecordCount = 0 Then
|
842 |
If rsQry.RecordCount = 0 Then
|
| 832 |
result = -3
|
843 |
result = -3
|
| 833 |
oJSON.data("error") = -1
|
844 |
oJSON.data("error") = -1
|
| 834 |
oJSON.data("emsgSummary") = "SDK Verion does not exist"
|
845 |
oJSON.data("emsgSummary") = "SDK Verion does not exist"
|
| 835 |
oJSON.data("emsgDetails") = oJSON.data("emsgSummary")
|
846 |
oJSON.data("emsgDetails") = oJSON.data("emsgSummary")
|
| 836 |
Else
|
847 |
Else
|
| 837 |
' Determine the number of times this SDK_TAG is in use
|
- |
|
| 838 |
' Determine the sdk_tag
|
- |
|
| 839 |
SqlQry = "SELECT st.SDK_ID, st.SDKTAG_ID FROM SDK_TAGS st WHERE SDK_ID IN ( SELECT SDK_ID FROM SDK_TAGS WHERE SDKTAG_ID=:SDKTAG_ID)"
|
- |
|
| 840 |
|
848 |
|
| 841 |
Dim sdkId, sdkTagCount
|
849 |
' Determine if the SDK is in use
|
| 842 |
objEH.ErrorRedirect = FALSE
|
850 |
'
|
| 843 |
objEH.TryORA ( OraSession )
|
851 |
SqlQry = "SELECT distinct rtag_id FROM RELEASE_CONTENT WHERE SDKTAG_ID = :SDKTAG_ID"
|
| 844 |
On Error Resume Next
|
- |
|
| 845 |
Set rsQry = OraDatabase.DbCreateDynaset( SqlQry, ORADYN_DEFAULT )
|
852 |
Set rsQry = OraDatabase.DbCreateDynaset( SqlQry, ORADYN_DEFAULT )
|
| 846 |
If Err.Number = 0 Then
|
853 |
If rsQry.RecordCount <> 0 Then
|
| 847 |
sdkTagCount = rsQry.RecordCount
|
854 |
oJSON.data("useCount") = rsQry.RecordCount
|
| 848 |
oJSON.data("sdkTagCount") = sdkTagCount
|
855 |
result = 0
|
| - |
|
856 |
Else
|
| 849 |
|
857 |
|
| 850 |
If ((NOT rsQry.BOF) AND (NOT rsQry.EOF)) Then
|
858 |
' Determine the number of times this SDK_TAG is in use
|
| 851 |
sdkId = rsQry.Fields(0)
|
859 |
' Determine the sdk_tag
|
| 852 |
oJSON.data("sdkId") = sdkId
|
860 |
SqlQry = "SELECT st.SDK_ID, st.SDKTAG_ID FROM SDK_TAGS st WHERE SDK_ID IN ( SELECT SDK_ID FROM SDK_TAGS WHERE SDKTAG_ID=:SDKTAG_ID)"
|
| 853 |
End If
|
- |
|
| 854 |
|
861 |
|
| 855 |
' Delete content
|
862 |
Dim sdkId, sdkTagCount
|
| 856 |
SqlQry = "DELETE FROM SDK_CONTENT WHERE SDKTAG_ID = :SDKTAG_ID"
|
- |
|
| 857 |
objEH.ErrorRedirect = FALSE
|
863 |
objEH.ErrorRedirect = FALSE
|
| 858 |
objEH.TryORA ( OraSession )
|
864 |
objEH.TryORA ( OraSession )
|
| 859 |
On Error Resume Next
|
865 |
On Error Resume Next
|
| 860 |
OraDatabase.ExecuteSQL SqlQry
|
866 |
Set rsQry = OraDatabase.DbCreateDynaset( SqlQry, ORADYN_DEFAULT )
|
| 861 |
|
- |
|
| 862 |
' Delete tag
|
- |
|
| 863 |
If Err.Number = 0 Then
|
867 |
If Err.Number = 0 Then
|
| - |
|
868 |
sdkTagCount = rsQry.RecordCount
|
| - |
|
869 |
oJSON.data("sdkTagCount") = sdkTagCount
|
| - |
|
870 |
|
| - |
|
871 |
If ((NOT rsQry.BOF) AND (NOT rsQry.EOF)) Then
|
| - |
|
872 |
sdkId = rsQry.Fields(0)
|
| - |
|
873 |
oJSON.data("sdkId") = sdkId
|
| - |
|
874 |
End If
|
| - |
|
875 |
|
| - |
|
876 |
' Delete content
|
| 864 |
SqlQry = "DELETE FROM SDK_TAGS WHERE SDKTAG_ID = :SDKTAG_ID"
|
877 |
SqlQry = "DELETE FROM SDK_CONTENT WHERE SDKTAG_ID = :SDKTAG_ID"
|
| - |
|
878 |
objEH.ErrorRedirect = FALSE
|
| - |
|
879 |
objEH.TryORA ( OraSession )
|
| - |
|
880 |
On Error Resume Next
|
| 865 |
OraDatabase.ExecuteSQL SqlQry
|
881 |
OraDatabase.ExecuteSQL SqlQry
|
| 866 |
End If
|
- |
|
| 867 |
|
882 |
|
| 868 |
If Err.Number = 0 Then
|
883 |
' Delete tag
|
| 869 |
' Possibly delete the Sdk Name entry
|
- |
|
| 870 |
If sdkTagCount = 1 Then
|
884 |
If Err.Number = 0 Then
|
| 871 |
SqlQry = "DELETE FROM SDK_NAMES WHERE SDK_ID = :SDK_ID"
|
885 |
SqlQry = "DELETE FROM SDK_TAGS WHERE SDKTAG_ID = :SDKTAG_ID"
|
| 872 |
OraDatabase.Parameters.Add "SDK_ID", sdkId, ORAPARM_INPUT, ORATYPE_NUMBER
|
- |
|
| 873 |
OraDatabase.ExecuteSQL SqlQry
|
886 |
OraDatabase.ExecuteSQL SqlQry
|
| - |
|
887 |
End If
|
| - |
|
888 |
|
| - |
|
889 |
If Err.Number = 0 Then
|
| - |
|
890 |
' Possibly delete the Sdk Name entry
|
| - |
|
891 |
If sdkTagCount = 1 Then
|
| - |
|
892 |
SqlQry = "DELETE FROM SDK_NAMES WHERE SDK_ID = :SDK_ID"
|
| - |
|
893 |
OraDatabase.Parameters.Add "SDK_ID", sdkId, ORAPARM_INPUT, ORATYPE_NUMBER
|
| - |
|
894 |
OraDatabase.ExecuteSQL SqlQry
|
| 874 |
OraDatabase.Parameters.Remove "SDK_ID"
|
895 |
OraDatabase.Parameters.Remove "SDK_ID"
|
| 875 |
oJSON.data("SdkNameRemoved") = sdkId
|
896 |
oJSON.data("SdkNameRemoved") = sdkId
|
| - |
|
897 |
End If
|
| 876 |
End If
|
898 |
End If
|
| 877 |
End If
|
899 |
End If
|
| 878 |
|
900 |
|
| 879 |
objEH.CatchORA ( OraSession )
|
901 |
objEH.CatchORA ( OraSession )
|
| 880 |
On Error GoTo 0
|
902 |
On Error GoTo 0
|
| 881 |
result = 0
|
903 |
result = 0
|
| 882 |
End If
|
904 |
End If
|
| 883 |
End If
|
905 |
End If
|
| 884 |
|
- |
|
| 885 |
OraDatabase.Parameters.Remove "SDKTAG_ID"
|
906 |
OraDatabase.Parameters.Remove "SDKTAG_ID"
|
| 886 |
|
907 |
|
| 887 |
End Sub
|
908 |
End Sub
|
| 888 |
|
909 |
|
| 889 |
'-------------------------------------------------
|
910 |
'-------------------------------------------------
|