| Modifier and Type | Method and Description |
|---|---|
Set<Argument> |
DungTheory.getAttacked(Argument argument)
Computes the set {A | (argument,A) in attacks}.
|
Set<Argument> |
DungTheory.getAttackers(Argument argument)
Computes the set {A | (A,argument) in attacks}.
|
Collection<Argument> |
DungTheory.getChildren(net.sf.tweety.graphs.Node node) |
net.sf.tweety.graphs.Edge<Argument> |
DungTheory.getEdge(Argument a,
Argument b) |
Collection<? extends net.sf.tweety.graphs.Edge<? extends Argument>> |
DungTheory.getEdges() |
Collection<Argument> |
DungTheory.getNeighbors(Argument node) |
Collection<Argument> |
DungTheory.getNodes() |
Collection<Argument> |
DungTheory.getParents(net.sf.tweety.graphs.Node node) |
net.sf.tweety.graphs.Graph<Argument> |
DungTheory.getRestriction(Collection<Argument> arguments) |
Collection<Collection<Argument>> |
DungTheory.getStronglyConnectedComponents() |
Collection<net.sf.tweety.graphs.Graph<Argument>> |
DungTheory.getSubgraphs() |
Collection<Argument> |
GrossiModgilRankingReasoner.gradedDefense(Collection<Argument> args,
int m,
int n)
Implements the graded defense function from Def.
|
Collection<Argument> |
GrossiModgilRankingReasoner.gradedNeutrality(Collection<Argument> args,
int m)
Implements the graded neutrality function from Def.
|
| Modifier and Type | Method and Description |
|---|---|
boolean |
DungTheory.areAdjacent(Argument a,
Argument b) |
boolean |
DungTheory.existsDirectedPath(Argument node1,
Argument node2) |
Set<Argument> |
DungTheory.getAttacked(Argument argument)
Computes the set {A | (argument,A) in attacks}.
|
Set<Argument> |
DungTheory.getAttackers(Argument argument)
Computes the set {A | (A,argument) in attacks}.
|
net.sf.tweety.graphs.Edge<Argument> |
DungTheory.getEdge(Argument a,
Argument b) |
Collection<Argument> |
DungTheory.getNeighbors(Argument node) |
boolean |
DungTheory.isAttacked(Argument argument,
Extension ext)
returns true if some argument of
|
boolean |
DungTheory.isAttackedBy(Argument arg1,
Argument arg2)
Checks whether arg1 is attacked by arg2.
|
boolean |
DungTheory.isAttackedBy(Argument argument,
Collection<Argument> ext)
returns true if some argument of
|
boolean |
DungTheory.isIndirectAttack(Argument arg1,
Argument arg2)
Checks whether "arg1" indirectly attacks "arg2", i.e.
|
boolean |
DungTheory.isSupport(Argument arg1,
Argument arg2)
Checks whether "arg1" supports "arg2", i.e.
|
boolean |
DungTheory.remove(Argument a)
Removes the argument and all its attacks
|
| Modifier and Type | Method and Description |
|---|---|
boolean |
DungTheory.add(net.sf.tweety.graphs.Edge<Argument> edge) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
StageReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
StageReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
StageReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
StableReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
StableReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
StableReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
SemiStableReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
SemiStableReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
SemiStableReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
SccCompleteReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
SccCompleteReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
SccCompleteReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
PreferredReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
PreferredReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
PreferredReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
IdealReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
IdealReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
IdealReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
GroundReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
GroundReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
GroundReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
ConflictFreeReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
ConflictFreeReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
ConflictFreeReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
CompleteReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
CompleteReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
CompleteReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
CF2Reasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
CF2Reasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
CF2Reasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
AdmissibleReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
AdmissibleReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected net.sf.tweety.logics.pl.PlBeliefSet |
AdmissibleReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec) |
protected abstract net.sf.tweety.logics.pl.PlBeliefSet |
AbstractExtensionReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec)
Returns the semantic-specific propositional characterization of the underlying Dung
theory, see
getPropositionalCharacterisation. |
protected abstract net.sf.tweety.logics.pl.PlBeliefSet |
AbstractExtensionReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec)
Returns the semantic-specific propositional characterization of the underlying Dung
theory, see
getPropositionalCharacterisation. |
protected abstract net.sf.tweety.logics.pl.PlBeliefSet |
AbstractExtensionReasoner.getPropositionalCharacterisationBySemantics(Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> in,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> out,
Map<Argument,net.sf.tweety.logics.pl.syntax.Proposition> undec)
Returns the semantic-specific propositional characterization of the underlying Dung
theory, see
getPropositionalCharacterisation. |
net.sf.tweety.graphs.Graph<Argument> |
DungTheory.getRestriction(Collection<Argument> arguments) |
Collection<Argument> |
GrossiModgilRankingReasoner.gradedDefense(Collection<Argument> args,
int m,
int n)
Implements the graded defense function from Def.
|
Collection<Argument> |
GrossiModgilRankingReasoner.gradedNeutrality(Collection<Argument> args,
int m)
Implements the graded neutrality function from Def.
|
boolean |
DungTheory.isAttackedBy(Argument argument,
Collection<Argument> ext)
returns true if some argument of
|
boolean |
GrossiModgilRankingReasoner.isMConflictFree(Collection<Argument> args,
int m)
Checks whether the given set of arguments is m-conflict-free, cf.
|
boolean |
GrossiModgilRankingReasoner.isMNAdmissible(Collection<Argument> args,
int m,
int n)
Checks whether the given set of arguments is mn-admissible, cf.
|
boolean |
GrossiModgilRankingReasoner.isMNComplete(Collection<Argument> args,
int m,
int n)
Checks whether the given set of arguments is mn-complete, cf.
|
boolean |
GrossiModgilRankingReasoner.isMNGrounded(Collection<Argument> args,
int m,
int n)
Checks whether the given set of arguments is mn-grounded, cf.
|
boolean |
GrossiModgilRankingReasoner.isMNPreferred(Collection<Argument> args,
int m,
int n)
Checks whether the given set of arguments is mn-preferred, cf.
|
boolean |
GrossiModgilRankingReasoner.isMStable(Collection<Argument> args,
int m)
Checks whether the given set of arguments is m-stable, cf.
|
| Constructor and Description |
|---|
DungTheory(net.sf.tweety.graphs.Graph<Argument> graph)
Creates a new theory from the given graph.
|
| Modifier and Type | Method and Description |
|---|---|
Argument |
LdoArgument.getArgument()
Returns an argument representation (in Dung-style)
of this LdoArgument.
|
| Modifier and Type | Method and Description |
|---|---|
static Argument |
DungParser.SingleArgument() |
| Modifier and Type | Method and Description |
|---|---|
Set<Map.Entry<Argument,Integer>> |
StratifiedLabeling.entrySet() |
Set<Map.Entry<Argument,Double>> |
NumericalArgumentRanking.entrySet() |
Set<Map.Entry<Argument,ArgumentStatus>> |
Labeling.entrySet() |
Collection<Argument> |
ArgumentRanking.getMaximallyAcceptedArguments(Collection<Argument> args)
Returns the set of all arguments a from the given
set that are maximally accepted, i.e.
|
Collection<Argument> |
ArgumentRanking.getMinimallyAcceptedArguments(Collection<Argument> args)
Returns the set of all arguments a from the given
set that are minimally accepted, i.e.
|
Iterator<Argument> |
Extension.iterator() |
Set<Argument> |
StratifiedLabeling.keySet() |
Set<Argument> |
NumericalArgumentRanking.keySet() |
Set<Argument> |
Labeling.keySet() |
| Modifier and Type | Method and Description |
|---|---|
boolean |
Extension.add(Argument arg0) |
int |
ArgumentRanking.compare(Argument arg0,
Argument arg1) |
boolean |
AbstractArgumentationInterpretation.isAcceptable(Argument argument,
DungTheory dungTheory)
returns true if every attacker on
|
boolean |
ArgumentRanking.isEquallyAcceptableThan(Argument a,
Argument b)
Returns "true" iff a is equally acceptable as b or a and b are not comparable,
i.e.
|
boolean |
ArgumentRanking.isStrictlyLessAcceptableThan(Argument a,
Argument b)
Returns "true" iff a is strictly less acceptable than b, i.e.
|
boolean |
NumericalArgumentRanking.isStrictlyLessOrEquallyAcceptableThan(Argument a,
Argument b) |
boolean |
LatticeArgumentRanking.isStrictlyLessOrEquallyAcceptableThan(Argument a,
Argument b) |
abstract boolean |
ArgumentRanking.isStrictlyLessOrEquallyAcceptableThan(Argument a,
Argument b)
Returns "true" iff a is strictly less acceptable than b or a is equally
acceptable as b or a and b are not comparable, i.e.
|
boolean |
ArgumentRanking.isStrictlyMoreAcceptableThan(Argument a,
Argument b)
Returns "true" iff a is strictly more acceptable than b, i.e.
|
boolean |
ArgumentRanking.isStrictlyMoreOrEquallyAcceptableThan(Argument a,
Argument b)
Returns "true" iff a is strictly more acceptable than b or a is equally
acceptable as b or a and b are not comparable, i.e.
|
ArgumentStatus |
Labeling.put(Argument arg0,
ArgumentStatus arg1) |
Double |
NumericalArgumentRanking.put(Argument arg0,
Double arg1) |
Integer |
StratifiedLabeling.put(Argument arg0,
Integer arg1) |
void |
LatticeArgumentRanking.setStrictlyLessOrEquallyAcceptableThan(Argument a,
Argument b)
Defines "a" to be strictly less or equally acceptable than "b".
|
| Modifier and Type | Method and Description |
|---|---|
boolean |
Extension.addAll(Collection<? extends Argument> arg0) |
Collection<Argument> |
ArgumentRanking.getMaximallyAcceptedArguments(Collection<Argument> args)
Returns the set of all arguments a from the given
set that are maximally accepted, i.e.
|
Collection<Argument> |
ArgumentRanking.getMinimallyAcceptedArguments(Collection<Argument> args)
Returns the set of all arguments a from the given
set that are minimally accepted, i.e.
|
void |
Labeling.putAll(Map<? extends Argument,? extends ArgumentStatus> arg0) |
void |
NumericalArgumentRanking.putAll(Map<? extends Argument,? extends Double> arg0) |
void |
StratifiedLabeling.putAll(Map<? extends Argument,? extends Integer> arg0) |
| Constructor and Description |
|---|
Extension(Collection<? extends Argument> arguments)
Creates a new extension with the given set of arguments.
|
LatticeArgumentRanking(Collection<Argument> args)
Creates a new argument ranking with the given arguments which
are initially all incomparable.
|
NumericalArgumentRanking(Collection<Argument> args,
double initialvalue)
Creates a new argument ranking.
|
| Modifier and Type | Method and Description |
|---|---|
Argument |
Attack.getAttacked()
returns the attacked argument of this attack relation.
|
Argument |
Attack.getAttacker()
returns the attacking argument of this attack relation.
|
| Modifier and Type | Method and Description |
|---|---|
boolean |
Attack.contains(Argument argument)
Return true if the given argument is in this attack relation.
|
| Modifier and Type | Method and Description |
|---|---|
boolean |
Attack.isConflictFree(Collection<? extends Argument> arguments)
returns true if one arguments in
|
| Constructor and Description |
|---|
Attack(Argument attacker,
Argument attacked)
Default constructor; initializes the two arguments used in this attack relation
|
DungSignature(Argument argument)
Creates a new signature with the single given argument.
|
| Constructor and Description |
|---|
DungSignature(Collection<? extends Argument> arguments)
Creates a new signature with the given set of arguments.
|
| Modifier and Type | Method and Description |
|---|---|
DungTheory |
PodlaszewskiCaminadaDungTheoryGenerator.generate(Argument arg) |
DungTheory |
IsoSafeEnumeratingDungTheoryGenerator.generate(Argument arg) |
DungTheory |
FileDungTheoryGenerator.generate(Argument arg) |
DungTheory |
EnumeratingDungTheoryGenerator.generate(Argument arg) |
DungTheory |
DungTheoryGenerator.generate(Argument arg)
Generates a new Dung theory where the given argument
is enforced to be in the grounded extension
|
DungTheory |
DefaultDungTheoryGenerator.generate(Argument arg) |
Copyright © 2017. All rights reserved.