TSTP Solution File: KLE072+1 by Bliksem---1.12
View Problem
- Process Solution
%------------------------------------------------------------------------------
% File : Bliksem---1.12
% Problem : KLE072+1 : TPTP v8.1.0. Released v4.0.0.
% Transfm : none
% Format : tptp:raw
% Command : bliksem %s
% Computer : n015.cluster.edu
% Model : x86_64 x86_64
% CPU : Intel(R) Xeon(R) CPU E5-2620 v4 2.10GHz
% Memory : 8042.1875MB
% OS : Linux 3.10.0-693.el7.x86_64
% CPULimit : 300s
% WCLimit : 0s
% DateTime : Sun Jul 17 01:37:01 EDT 2022
% Result : Theorem 0.76s 1.16s
% Output : Refutation 0.76s
% Verified :
% SZS Type : -
% Comments :
%------------------------------------------------------------------------------
%----WARNING: Could not form TPTP format derivation
%------------------------------------------------------------------------------
%----ORIGINAL SYSTEM OUTPUT
% 0.04/0.13 % Problem : KLE072+1 : TPTP v8.1.0. Released v4.0.0.
% 0.14/0.14 % Command : bliksem %s
% 0.14/0.36 % Computer : n015.cluster.edu
% 0.14/0.36 % Model : x86_64 x86_64
% 0.14/0.36 % CPU : Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
% 0.14/0.36 % Memory : 8042.1875MB
% 0.14/0.36 % OS : Linux 3.10.0-693.el7.x86_64
% 0.14/0.36 % CPULimit : 300
% 0.14/0.36 % DateTime : Thu Jun 16 09:13:41 EDT 2022
% 0.14/0.36 % CPUTime :
% 0.76/1.16 *** allocated 10000 integers for termspace/termends
% 0.76/1.16 *** allocated 10000 integers for clauses
% 0.76/1.16 *** allocated 10000 integers for justifications
% 0.76/1.16 Bliksem 1.12
% 0.76/1.16
% 0.76/1.16
% 0.76/1.16 Automatic Strategy Selection
% 0.76/1.16
% 0.76/1.16
% 0.76/1.16 Clauses:
% 0.76/1.16
% 0.76/1.16 { addition( X, Y ) = addition( Y, X ) }.
% 0.76/1.16 { addition( Z, addition( Y, X ) ) = addition( addition( Z, Y ), X ) }.
% 0.76/1.16 { addition( X, zero ) = X }.
% 0.76/1.16 { addition( X, X ) = X }.
% 0.76/1.16 { multiplication( X, multiplication( Y, Z ) ) = multiplication(
% 0.76/1.16 multiplication( X, Y ), Z ) }.
% 0.76/1.16 { multiplication( X, one ) = X }.
% 0.76/1.16 { multiplication( one, X ) = X }.
% 0.76/1.16 { multiplication( X, addition( Y, Z ) ) = addition( multiplication( X, Y )
% 0.76/1.16 , multiplication( X, Z ) ) }.
% 0.76/1.16 { multiplication( addition( X, Y ), Z ) = addition( multiplication( X, Z )
% 0.76/1.16 , multiplication( Y, Z ) ) }.
% 0.76/1.16 { multiplication( X, zero ) = zero }.
% 0.76/1.16 { multiplication( zero, X ) = zero }.
% 0.76/1.16 { ! leq( X, Y ), addition( X, Y ) = Y }.
% 0.76/1.16 { ! addition( X, Y ) = Y, leq( X, Y ) }.
% 0.76/1.16 { addition( X, multiplication( domain( X ), X ) ) = multiplication( domain
% 0.76/1.16 ( X ), X ) }.
% 0.76/1.16 { domain( multiplication( X, Y ) ) = domain( multiplication( X, domain( Y )
% 0.76/1.16 ) ) }.
% 0.76/1.16 { addition( domain( X ), one ) = one }.
% 0.76/1.16 { domain( zero ) = zero }.
% 0.76/1.16 { domain( addition( X, Y ) ) = addition( domain( X ), domain( Y ) ) }.
% 0.76/1.16 { ! domain( multiplication( addition( skol1, skol2 ), domain( skol3 ) ) ) =
% 0.76/1.16 addition( domain( multiplication( skol1, domain( skol3 ) ) ), domain(
% 0.76/1.16 multiplication( skol2, domain( skol3 ) ) ) ) }.
% 0.76/1.16
% 0.76/1.16 percentage equality = 0.904762, percentage horn = 1.000000
% 0.76/1.16 This is a pure equality problem
% 0.76/1.16
% 0.76/1.16
% 0.76/1.16
% 0.76/1.16 Options Used:
% 0.76/1.16
% 0.76/1.16 useres = 1
% 0.76/1.16 useparamod = 1
% 0.76/1.16 useeqrefl = 1
% 0.76/1.16 useeqfact = 1
% 0.76/1.16 usefactor = 1
% 0.76/1.16 usesimpsplitting = 0
% 0.76/1.16 usesimpdemod = 5
% 0.76/1.16 usesimpres = 3
% 0.76/1.16
% 0.76/1.16 resimpinuse = 1000
% 0.76/1.16 resimpclauses = 20000
% 0.76/1.16 substype = eqrewr
% 0.76/1.16 backwardsubs = 1
% 0.76/1.16 selectoldest = 5
% 0.76/1.16
% 0.76/1.16 litorderings [0] = split
% 0.76/1.16 litorderings [1] = extend the termordering, first sorting on arguments
% 0.76/1.16
% 0.76/1.16 termordering = kbo
% 0.76/1.16
% 0.76/1.16 litapriori = 0
% 0.76/1.16 termapriori = 1
% 0.76/1.16 litaposteriori = 0
% 0.76/1.16 termaposteriori = 0
% 0.76/1.16 demodaposteriori = 0
% 0.76/1.16 ordereqreflfact = 0
% 0.76/1.16
% 0.76/1.16 litselect = negord
% 0.76/1.16
% 0.76/1.16 maxweight = 15
% 0.76/1.16 maxdepth = 30000
% 0.76/1.16 maxlength = 115
% 0.76/1.16 maxnrvars = 195
% 0.76/1.16 excuselevel = 1
% 0.76/1.16 increasemaxweight = 1
% 0.76/1.16
% 0.76/1.16 maxselected = 10000000
% 0.76/1.16 maxnrclauses = 10000000
% 0.76/1.16
% 0.76/1.16 showgenerated = 0
% 0.76/1.16 showkept = 0
% 0.76/1.16 showselected = 0
% 0.76/1.16 showdeleted = 0
% 0.76/1.16 showresimp = 1
% 0.76/1.16 showstatus = 2000
% 0.76/1.16
% 0.76/1.16 prologoutput = 0
% 0.76/1.16 nrgoals = 5000000
% 0.76/1.16 totalproof = 1
% 0.76/1.16
% 0.76/1.16 Symbols occurring in the translation:
% 0.76/1.16
% 0.76/1.16 {} [0, 0] (w:1, o:2, a:1, s:1, b:0),
% 0.76/1.16 . [1, 2] (w:1, o:23, a:1, s:1, b:0),
% 0.76/1.16 ! [4, 1] (w:0, o:17, a:1, s:1, b:0),
% 0.76/1.16 = [13, 2] (w:1, o:0, a:0, s:1, b:0),
% 0.76/1.16 ==> [14, 2] (w:1, o:0, a:0, s:1, b:0),
% 0.76/1.16 addition [37, 2] (w:1, o:47, a:1, s:1, b:0),
% 0.76/1.16 zero [39, 0] (w:1, o:9, a:1, s:1, b:0),
% 0.76/1.16 multiplication [40, 2] (w:1, o:49, a:1, s:1, b:0),
% 0.76/1.16 one [41, 0] (w:1, o:10, a:1, s:1, b:0),
% 0.76/1.16 leq [42, 2] (w:1, o:48, a:1, s:1, b:0),
% 0.76/1.16 domain [44, 1] (w:1, o:22, a:1, s:1, b:0),
% 0.76/1.16 skol1 [47, 0] (w:1, o:14, a:1, s:1, b:1),
% 0.76/1.16 skol2 [48, 0] (w:1, o:15, a:1, s:1, b:1),
% 0.76/1.16 skol3 [49, 0] (w:1, o:16, a:1, s:1, b:1).
% 0.76/1.16
% 0.76/1.16
% 0.76/1.16 Starting Search:
% 0.76/1.16
% 0.76/1.16
% 0.76/1.16 Bliksems!, er is een bewijs:
% 0.76/1.16 % SZS status Theorem
% 0.76/1.16 % SZS output start Refutation
% 0.76/1.16
% 0.76/1.16 (8) {G0,W13,D4,L1,V3,M1} I { addition( multiplication( X, Z ),
% 0.76/1.16 multiplication( Y, Z ) ) ==> multiplication( addition( X, Y ), Z ) }.
% 0.76/1.16 (14) {G0,W10,D5,L1,V2,M1} I { domain( multiplication( X, domain( Y ) ) )
% 0.76/1.16 ==> domain( multiplication( X, Y ) ) }.
% 0.76/1.16 (17) {G0,W10,D4,L1,V2,M1} I { addition( domain( X ), domain( Y ) ) ==>
% 0.76/1.16 domain( addition( X, Y ) ) }.
% 0.76/1.16 (18) {G1,W0,D0,L0,V0,M0} I;d(14);d(17);d(8);d(14);q { }.
% 0.76/1.16
% 0.76/1.16
% 0.76/1.16 % SZS output end Refutation
% 0.76/1.16 found a proof!
% 0.76/1.16
% 0.76/1.16
% 0.76/1.16 Unprocessed initial clauses:
% 0.76/1.16
% 0.76/1.16 (20) {G0,W7,D3,L1,V2,M1} { addition( X, Y ) = addition( Y, X ) }.
% 0.76/1.16 (21) {G0,W11,D4,L1,V3,M1} { addition( Z, addition( Y, X ) ) = addition(
% 0.76/1.16 addition( Z, Y ), X ) }.
% 0.76/1.16 (22) {G0,W5,D3,L1,V1,M1} { addition( X, zero ) = X }.
% 0.76/1.16 (23) {G0,W5,D3,L1,V1,M1} { addition( X, X ) = X }.
% 0.76/1.16 (24) {G0,W11,D4,L1,V3,M1} { multiplication( X, multiplication( Y, Z ) ) =
% 0.76/1.16 multiplication( multiplication( X, Y ), Z ) }.
% 0.76/1.16 (25) {G0,W5,D3,L1,V1,M1} { multiplication( X, one ) = X }.
% 0.76/1.16 (26) {G0,W5,D3,L1,V1,M1} { multiplication( one, X ) = X }.
% 0.76/1.16 (27) {G0,W13,D4,L1,V3,M1} { multiplication( X, addition( Y, Z ) ) =
% 0.76/1.16 addition( multiplication( X, Y ), multiplication( X, Z ) ) }.
% 0.76/1.16 (28) {G0,W13,D4,L1,V3,M1} { multiplication( addition( X, Y ), Z ) =
% 0.76/1.16 addition( multiplication( X, Z ), multiplication( Y, Z ) ) }.
% 0.76/1.16 (29) {G0,W5,D3,L1,V1,M1} { multiplication( X, zero ) = zero }.
% 0.76/1.16 (30) {G0,W5,D3,L1,V1,M1} { multiplication( zero, X ) = zero }.
% 0.76/1.16 (31) {G0,W8,D3,L2,V2,M2} { ! leq( X, Y ), addition( X, Y ) = Y }.
% 0.76/1.16 (32) {G0,W8,D3,L2,V2,M2} { ! addition( X, Y ) = Y, leq( X, Y ) }.
% 0.76/1.16 (33) {G0,W11,D5,L1,V1,M1} { addition( X, multiplication( domain( X ), X )
% 0.76/1.16 ) = multiplication( domain( X ), X ) }.
% 0.76/1.16 (34) {G0,W10,D5,L1,V2,M1} { domain( multiplication( X, Y ) ) = domain(
% 0.76/1.16 multiplication( X, domain( Y ) ) ) }.
% 0.76/1.16 (35) {G0,W6,D4,L1,V1,M1} { addition( domain( X ), one ) = one }.
% 0.76/1.16 (36) {G0,W4,D3,L1,V0,M1} { domain( zero ) = zero }.
% 0.76/1.16 (37) {G0,W10,D4,L1,V2,M1} { domain( addition( X, Y ) ) = addition( domain
% 0.76/1.16 ( X ), domain( Y ) ) }.
% 0.76/1.16 (38) {G0,W19,D6,L1,V0,M1} { ! domain( multiplication( addition( skol1,
% 0.76/1.16 skol2 ), domain( skol3 ) ) ) = addition( domain( multiplication( skol1,
% 0.76/1.16 domain( skol3 ) ) ), domain( multiplication( skol2, domain( skol3 ) ) ) )
% 0.76/1.16 }.
% 0.76/1.16
% 0.76/1.16
% 0.76/1.16 Total Proof:
% 0.76/1.16
% 0.76/1.16 eqswap: (46) {G0,W13,D4,L1,V3,M1} { addition( multiplication( X, Z ),
% 0.76/1.16 multiplication( Y, Z ) ) = multiplication( addition( X, Y ), Z ) }.
% 0.76/1.16 parent0[0]: (28) {G0,W13,D4,L1,V3,M1} { multiplication( addition( X, Y ),
% 0.76/1.16 Z ) = addition( multiplication( X, Z ), multiplication( Y, Z ) ) }.
% 0.76/1.16 substitution0:
% 0.76/1.16 X := X
% 0.76/1.16 Y := Y
% 0.76/1.16 Z := Z
% 0.76/1.16 end
% 0.76/1.16
% 0.76/1.16 subsumption: (8) {G0,W13,D4,L1,V3,M1} I { addition( multiplication( X, Z )
% 0.76/1.16 , multiplication( Y, Z ) ) ==> multiplication( addition( X, Y ), Z ) }.
% 0.76/1.16 parent0: (46) {G0,W13,D4,L1,V3,M1} { addition( multiplication( X, Z ),
% 0.76/1.16 multiplication( Y, Z ) ) = multiplication( addition( X, Y ), Z ) }.
% 0.76/1.16 substitution0:
% 0.76/1.16 X := X
% 0.76/1.16 Y := Y
% 0.76/1.16 Z := Z
% 0.76/1.16 end
% 0.76/1.16 permutation0:
% 0.76/1.16 0 ==> 0
% 0.76/1.16 end
% 0.76/1.16
% 0.76/1.16 eqswap: (60) {G0,W10,D5,L1,V2,M1} { domain( multiplication( X, domain( Y )
% 0.76/1.16 ) ) = domain( multiplication( X, Y ) ) }.
% 0.76/1.16 parent0[0]: (34) {G0,W10,D5,L1,V2,M1} { domain( multiplication( X, Y ) ) =
% 0.76/1.16 domain( multiplication( X, domain( Y ) ) ) }.
% 0.76/1.16 substitution0:
% 0.76/1.16 X := X
% 0.76/1.16 Y := Y
% 0.76/1.16 end
% 0.76/1.16
% 0.76/1.16 subsumption: (14) {G0,W10,D5,L1,V2,M1} I { domain( multiplication( X,
% 0.76/1.16 domain( Y ) ) ) ==> domain( multiplication( X, Y ) ) }.
% 0.76/1.16 parent0: (60) {G0,W10,D5,L1,V2,M1} { domain( multiplication( X, domain( Y
% 0.76/1.16 ) ) ) = domain( multiplication( X, Y ) ) }.
% 0.76/1.16 substitution0:
% 0.76/1.16 X := X
% 0.76/1.16 Y := Y
% 0.76/1.16 end
% 0.76/1.16 permutation0:
% 0.76/1.16 0 ==> 0
% 0.76/1.16 end
% 0.76/1.16
% 0.76/1.16 eqswap: (77) {G0,W10,D4,L1,V2,M1} { addition( domain( X ), domain( Y ) ) =
% 0.76/1.16 domain( addition( X, Y ) ) }.
% 0.76/1.16 parent0[0]: (37) {G0,W10,D4,L1,V2,M1} { domain( addition( X, Y ) ) =
% 0.76/1.16 addition( domain( X ), domain( Y ) ) }.
% 0.76/1.16 substitution0:
% 0.76/1.16 X := X
% 0.76/1.16 Y := Y
% 0.76/1.16 end
% 0.76/1.16
% 0.76/1.16 subsumption: (17) {G0,W10,D4,L1,V2,M1} I { addition( domain( X ), domain( Y
% 0.76/1.16 ) ) ==> domain( addition( X, Y ) ) }.
% 0.76/1.16 parent0: (77) {G0,W10,D4,L1,V2,M1} { addition( domain( X ), domain( Y ) )
% 0.76/1.16 = domain( addition( X, Y ) ) }.
% 0.76/1.16 substitution0:
% 0.76/1.16 X := X
% 0.76/1.16 Y := Y
% 0.76/1.16 end
% 0.76/1.16 permutation0:
% 0.76/1.16 0 ==> 0
% 0.76/1.16 end
% 0.76/1.16
% 0.76/1.16 paramod: (176) {G1,W18,D6,L1,V0,M1} { ! domain( multiplication( addition(
% 0.76/1.16 skol1, skol2 ), domain( skol3 ) ) ) = addition( domain( multiplication(
% 0.76/1.16 skol1, domain( skol3 ) ) ), domain( multiplication( skol2, skol3 ) ) )
% 0.76/1.16 }.
% 0.76/1.16 parent0[0]: (14) {G0,W10,D5,L1,V2,M1} I { domain( multiplication( X, domain
% 0.76/1.16 ( Y ) ) ) ==> domain( multiplication( X, Y ) ) }.
% 0.76/1.16 parent1[0; 15]: (38) {G0,W19,D6,L1,V0,M1} { ! domain( multiplication(
% 0.76/1.16 addition( skol1, skol2 ), domain( skol3 ) ) ) = addition( domain(
% 0.76/1.16 multiplication( skol1, domain( skol3 ) ) ), domain( multiplication( skol2
% 0.76/1.16 , domain( skol3 ) ) ) ) }.
% 0.76/1.16 substitution0:
% 0.76/1.16 X := skol2
% 0.76/1.16 Y := skol3
% 0.76/1.16 end
% 0.76/1.16 substitution1:
% 0.76/1.16 end
% 0.76/1.16
% 0.76/1.16 paramod: (178) {G1,W17,D5,L1,V0,M1} { ! domain( multiplication( addition(
% 0.76/1.16 skol1, skol2 ), domain( skol3 ) ) ) = addition( domain( multiplication(
% 0.76/1.16 skol1, skol3 ) ), domain( multiplication( skol2, skol3 ) ) ) }.
% 0.76/1.16 parent0[0]: (14) {G0,W10,D5,L1,V2,M1} I { domain( multiplication( X, domain
% 0.76/1.16 ( Y ) ) ) ==> domain( multiplication( X, Y ) ) }.
% 0.76/1.16 parent1[0; 10]: (176) {G1,W18,D6,L1,V0,M1} { ! domain( multiplication(
% 0.76/1.16 addition( skol1, skol2 ), domain( skol3 ) ) ) = addition( domain(
% 0.76/1.16 multiplication( skol1, domain( skol3 ) ) ), domain( multiplication( skol2
% 0.76/1.16 , skol3 ) ) ) }.
% 0.76/1.16 substitution0:
% 0.76/1.16 X := skol1
% 0.76/1.16 Y := skol3
% 0.76/1.16 end
% 0.76/1.16 substitution1:
% 0.76/1.16 end
% 0.76/1.16
% 0.76/1.16 paramod: (182) {G1,W16,D5,L1,V0,M1} { ! domain( multiplication( addition(
% 0.76/1.16 skol1, skol2 ), domain( skol3 ) ) ) = domain( addition( multiplication(
% 0.76/1.16 skol1, skol3 ), multiplication( skol2, skol3 ) ) ) }.
% 0.76/1.16 parent0[0]: (17) {G0,W10,D4,L1,V2,M1} I { addition( domain( X ), domain( Y
% 0.76/1.16 ) ) ==> domain( addition( X, Y ) ) }.
% 0.76/1.16 parent1[0; 9]: (178) {G1,W17,D5,L1,V0,M1} { ! domain( multiplication(
% 0.76/1.16 addition( skol1, skol2 ), domain( skol3 ) ) ) = addition( domain(
% 0.76/1.16 multiplication( skol1, skol3 ) ), domain( multiplication( skol2, skol3 )
% 0.76/1.16 ) ) }.
% 0.76/1.16 substitution0:
% 0.76/1.16 X := multiplication( skol1, skol3 )
% 0.76/1.16 Y := multiplication( skol2, skol3 )
% 0.76/1.16 end
% 0.76/1.16 substitution1:
% 0.76/1.16 end
% 0.76/1.16
% 0.76/1.16 paramod: (183) {G1,W14,D5,L1,V0,M1} { ! domain( multiplication( addition(
% 0.76/1.16 skol1, skol2 ), domain( skol3 ) ) ) = domain( multiplication( addition(
% 0.76/1.16 skol1, skol2 ), skol3 ) ) }.
% 0.76/1.16 parent0[0]: (8) {G0,W13,D4,L1,V3,M1} I { addition( multiplication( X, Z ),
% 0.76/1.16 multiplication( Y, Z ) ) ==> multiplication( addition( X, Y ), Z ) }.
% 0.76/1.16 parent1[0; 10]: (182) {G1,W16,D5,L1,V0,M1} { ! domain( multiplication(
% 0.76/1.16 addition( skol1, skol2 ), domain( skol3 ) ) ) = domain( addition(
% 0.76/1.16 multiplication( skol1, skol3 ), multiplication( skol2, skol3 ) ) ) }.
% 0.76/1.16 substitution0:
% 0.76/1.16 X := skol1
% 0.76/1.16 Y := skol2
% 0.76/1.16 Z := skol3
% 0.76/1.16 end
% 0.76/1.16 substitution1:
% 0.76/1.16 end
% 0.76/1.16
% 0.76/1.16 paramod: (184) {G1,W13,D5,L1,V0,M1} { ! domain( multiplication( addition(
% 0.76/1.16 skol1, skol2 ), skol3 ) ) = domain( multiplication( addition( skol1,
% 0.76/1.16 skol2 ), skol3 ) ) }.
% 0.76/1.16 parent0[0]: (14) {G0,W10,D5,L1,V2,M1} I { domain( multiplication( X, domain
% 0.76/1.16 ( Y ) ) ) ==> domain( multiplication( X, Y ) ) }.
% 0.76/1.16 parent1[0; 2]: (183) {G1,W14,D5,L1,V0,M1} { ! domain( multiplication(
% 0.76/1.16 addition( skol1, skol2 ), domain( skol3 ) ) ) = domain( multiplication(
% 0.76/1.16 addition( skol1, skol2 ), skol3 ) ) }.
% 0.76/1.16 substitution0:
% 0.76/1.16 X := addition( skol1, skol2 )
% 0.76/1.16 Y := skol3
% 0.76/1.16 end
% 0.76/1.16 substitution1:
% 0.76/1.16 end
% 0.76/1.16
% 0.76/1.16 eqrefl: (185) {G0,W0,D0,L0,V0,M0} { }.
% 0.76/1.16 parent0[0]: (184) {G1,W13,D5,L1,V0,M1} { ! domain( multiplication(
% 0.76/1.16 addition( skol1, skol2 ), skol3 ) ) = domain( multiplication( addition(
% 0.76/1.16 skol1, skol2 ), skol3 ) ) }.
% 0.76/1.16 substitution0:
% 0.76/1.16 end
% 0.76/1.16
% 0.76/1.16 subsumption: (18) {G1,W0,D0,L0,V0,M0} I;d(14);d(17);d(8);d(14);q { }.
% 0.76/1.16 parent0: (185) {G0,W0,D0,L0,V0,M0} { }.
% 0.76/1.16 substitution0:
% 0.76/1.16 end
% 0.76/1.16 permutation0:
% 0.76/1.16 end
% 0.76/1.16
% 0.76/1.16 Proof check complete!
% 0.76/1.16
% 0.76/1.16 Memory use:
% 0.76/1.16
% 0.76/1.16 space for terms: 566
% 0.76/1.16 space for clauses: 1733
% 0.76/1.16
% 0.76/1.16
% 0.76/1.16 clauses generated: 19
% 0.76/1.16 clauses kept: 19
% 0.76/1.16 clauses selected: 0
% 0.76/1.16 clauses deleted: 0
% 0.76/1.16 clauses inuse deleted: 0
% 0.76/1.16
% 0.76/1.16 subsentry: 560
% 0.76/1.16 literals s-matched: 223
% 0.76/1.16 literals matched: 223
% 0.76/1.16 full subsumption: 0
% 0.76/1.16
% 0.76/1.16 checksum: 1072596275
% 0.76/1.16
% 0.76/1.16
% 0.76/1.16 Bliksem ended
%------------------------------------------------------------------------------