Skip to content

Commit

Permalink
Fix item search limit, project wide reformatting and cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
Ebag333 committed Apr 7, 2017
1 parent 2f335a1 commit ddb4037
Show file tree
Hide file tree
Showing 126 changed files with 975 additions and 898 deletions.
21 changes: 11 additions & 10 deletions _development/helpers.py
Expand Up @@ -13,14 +13,14 @@
sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..'))) sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..')))
sys._called_from_test = True sys._called_from_test = True



# noinspection PyUnresolvedReferences,PyUnusedLocal # noinspection PyUnresolvedReferences,PyUnusedLocal
@pytest.fixture @pytest.fixture
def DBInMemory_test(): def DBInMemory_test():
def rollback(): def rollback():
with sd_lock: with sd_lock:
saveddata_session.rollback() saveddata_session.rollback()



print("Creating database in memory") print("Creating database in memory")
from os.path import realpath, join, dirname, abspath from os.path import realpath, join, dirname, abspath


Expand All @@ -47,7 +47,7 @@ class ReadOnlyException(Exception):
# game db because we haven't reached gamedata_meta.create_all() # game db because we haven't reached gamedata_meta.create_all()
try: try:
gamedata_version = gamedata_session.execute( gamedata_version = gamedata_session.execute(
"SELECT `field_value` FROM `metadata` WHERE `field_name` LIKE 'client_build'" "SELECT `field_value` FROM `metadata` WHERE `field_name` LIKE 'client_build'"
).fetchone()[0] ).fetchone()[0]
except Exception as e: except Exception as e:
print("Missing gamedata version.") print("Missing gamedata version.")
Expand All @@ -70,9 +70,9 @@ class ReadOnlyException(Exception):


# Import all the definitions for all our database stuff # Import all the definitions for all our database stuff
# noinspection PyPep8 # noinspection PyPep8
#from eos.db.gamedata import alphaClones, attribute, category, effect, group, icon, item, marketGroup, metaData, metaGroup, queries, traits, unit # from eos.db.gamedata import alphaClones, attribute, category, effect, group, icon, item, marketGroup, metaData, metaGroup, queries, traits, unit
# noinspection PyPep8 # noinspection PyPep8
#from eos.db.saveddata import booster, cargo, character, crest, damagePattern, databaseRepair, drone, fighter, fit, implant, implantSet, loadDefaultDatabaseValues, miscData, module, override, price, queries, skill, targetResists, user # from eos.db.saveddata import booster, cargo, character, crest, damagePattern, databaseRepair, drone, fighter, fit, implant, implantSet, loadDefaultDatabaseValues, miscData, module, override, price, queries, skill, targetResists, user


# If using in memory saveddata, you'll want to reflect it so the data structure is good. # If using in memory saveddata, you'll want to reflect it so the data structure is good.
if saveddata_connectionstring == "sqlite:///:memory:": if saveddata_connectionstring == "sqlite:///:memory:":
Expand All @@ -83,12 +83,13 @@ class ReadOnlyException(Exception):
print(gamedata_engine) print(gamedata_engine)


helper = { helper = {
#'config': eos.config, # 'config': eos.config,
'gamedata_session' : gamedata_session, 'gamedata_session' : gamedata_session,
'saveddata_session' : saveddata_session, 'saveddata_session': saveddata_session,
} }
return helper return helper



# noinspection PyUnresolvedReferences,PyUnusedLocal # noinspection PyUnresolvedReferences,PyUnusedLocal
@pytest.fixture @pytest.fixture
def DBInMemory(): def DBInMemory():
Expand All @@ -104,10 +105,10 @@ def DBInMemory():
print(eos.db.gamedata_engine) print(eos.db.gamedata_engine)


helper = { helper = {
'config': eos.config, 'config' : eos.config,
'db' : eos.db, 'db' : eos.db,
'gamedata_session' : eos.db.gamedata_session, 'gamedata_session' : eos.db.gamedata_session,
'saveddata_session' : eos.db.saveddata_session, 'saveddata_session': eos.db.saveddata_session,
} }
return helper return helper


Expand Down
2 changes: 1 addition & 1 deletion _development/helpers_items.py
Expand Up @@ -6,7 +6,7 @@


# noinspection PyShadowingNames # noinspection PyShadowingNames
@pytest.fixture @pytest.fixture
def StrongBluePillBooster (DB, Gamedata, Saveddata): def StrongBluePillBooster(DB, Gamedata, Saveddata):
print("Creating Strong Blue Pill Booster") print("Creating Strong Blue Pill Booster")
item = DB['gamedata_session'].query(Gamedata['Item']).filter(Gamedata['Item'].name == "Strong Blue Pill Booster").first() item = DB['gamedata_session'].query(Gamedata['Item']).filter(Gamedata['Item'].name == "Strong Blue Pill Booster").first()
return Saveddata['Booster'](item) return Saveddata['Booster'](item)
5 changes: 3 additions & 2 deletions _development/helpers_locale.py
Expand Up @@ -69,8 +69,8 @@


system_names = { system_names = {
'Windows': windows_codecs, 'Windows': windows_codecs,
'Linux': linux_codecs, 'Linux' : linux_codecs,
'Darwin': mac_codecs, 'Darwin' : mac_codecs,
} }




Expand All @@ -86,6 +86,7 @@ def GetPath(root, file=None, codec=None):


return path return path



def GetUnicodePath(root, file=None, codec=None): def GetUnicodePath(root, file=None, codec=None):
# Replace this with the function we actually use for this # Replace this with the function we actually use for this
path = os.path.realpath(os.path.abspath(root)) path = os.path.realpath(os.path.abspath(root))
Expand Down
1 change: 0 additions & 1 deletion config.py
Expand Up @@ -12,7 +12,6 @@
pyfalog.warning("Failed to import: configforced") pyfalog.warning("Failed to import: configforced")
configforced = None configforced = None



# Turns on debug mode # Turns on debug mode
debug = False debug = False
# Defines if our saveddata will be in pyfa root or not # Defines if our saveddata will be in pyfa root or not
Expand Down
1 change: 1 addition & 0 deletions eos/db/__init__.py
Expand Up @@ -31,6 +31,7 @@
pyfalog.info("Gamedata connection: {0}", config.gamedata_connectionstring) pyfalog.info("Gamedata connection: {0}", config.gamedata_connectionstring)
pyfalog.info("Saveddata connection: {0}", config.saveddata_connectionstring) pyfalog.info("Saveddata connection: {0}", config.saveddata_connectionstring)



class ReadOnlyException(Exception): class ReadOnlyException(Exception):
pass pass


Expand Down
2 changes: 1 addition & 1 deletion eos/db/gamedata/marketGroup.py
Expand Up @@ -41,4 +41,4 @@
"ID" : synonym("marketGroupID"), "ID" : synonym("marketGroupID"),
"name" : synonym("marketGroupName"), "name" : synonym("marketGroupName"),
"description": deferred(marketgroups_table.c.description) "description": deferred(marketgroups_table.c.description)
}) })
4 changes: 2 additions & 2 deletions eos/db/gamedata/metaGroup.py
Expand Up @@ -38,14 +38,14 @@
properties={ properties={
"ID" : synonym("metaGroupID"), "ID" : synonym("metaGroupID"),
"name": synonym("metaGroupName") "name": synonym("metaGroupName")
}) })


mapper(MetaType, metatypes_table, mapper(MetaType, metatypes_table,
properties={ properties={
"ID" : synonym("metaGroupID"), "ID" : synonym("metaGroupID"),
"parent": relation(Item, primaryjoin=metatypes_table.c.parentTypeID == items_table.c.typeID), "parent": relation(Item, primaryjoin=metatypes_table.c.parentTypeID == items_table.c.typeID),
"items" : relation(Item, primaryjoin=metatypes_table.c.typeID == items_table.c.typeID), "items" : relation(Item, primaryjoin=metatypes_table.c.typeID == items_table.c.typeID),
"info" : relation(MetaGroup, lazy=False) "info" : relation(MetaGroup, lazy=False)
}) })


MetaType.name = association_proxy("info", "name") MetaType.name = association_proxy("info", "name")
2 changes: 1 addition & 1 deletion eos/db/gamedata/unit.py
Expand Up @@ -32,4 +32,4 @@
properties={ properties={
"ID" : synonym("unitID"), "ID" : synonym("unitID"),
"name": synonym("unitName") "name": synonym("unitName")
}) })
31 changes: 15 additions & 16 deletions eos/db/migrations/upgrade22.py
Expand Up @@ -7,26 +7,25 @@




def upgrade(saveddata_engine): def upgrade(saveddata_engine):

# 1 = created only # 1 = created only
# 2 = created and modified # 2 = created and modified
tables = { tables = {
"boosters": 2, "boosters" : 2,
"cargo": 2, "cargo" : 2,
"characters": 2, "characters" : 2,
"crest": 1, "crest" : 1,
"damagePatterns": 2, "damagePatterns" : 2,
"drones": 2, "drones" : 2,
"fighters": 2, "fighters" : 2,
"fits": 2, "fits" : 2,
"projectedFits": 2, "projectedFits" : 2,
"commandFits": 2, "commandFits" : 2,
"implants": 2, "implants" : 2,
"implantSets": 2, "implantSets" : 2,
"modules": 2, "modules" : 2,
"overrides": 2, "overrides" : 2,
"characterSkills": 2, "characterSkills": 2,
"targetResists": 2 "targetResists" : 2
} }


for table in tables.keys(): for table in tables.keys():
Expand Down
12 changes: 6 additions & 6 deletions eos/db/saveddata/booster.py
Expand Up @@ -26,12 +26,12 @@
from eos.saveddata.booster import Booster from eos.saveddata.booster import Booster


boosters_table = Table("boosters", saveddata_meta, boosters_table = Table("boosters", saveddata_meta,
Column("ID", Integer, primary_key=True), Column("ID", Integer, primary_key=True),
Column("itemID", Integer), Column("itemID", Integer),
Column("fitID", Integer, ForeignKey("fits.ID"), nullable=False), Column("fitID", Integer, ForeignKey("fits.ID"), nullable=False),
Column("active", Boolean), Column("active", Boolean),
Column("created", DateTime, nullable=True, default=func.now()), Column("created", DateTime, nullable=True, default=func.now()),
Column("modified", DateTime, nullable=True, onupdate=func.now()), Column("modified", DateTime, nullable=True, onupdate=func.now()),
) )


# Legacy booster side effect code, should disable but a mapper relies on it. # Legacy booster side effect code, should disable but a mapper relies on it.
Expand Down
1 change: 0 additions & 1 deletion eos/db/saveddata/skill.py
Expand Up @@ -24,7 +24,6 @@
from eos.db import saveddata_meta from eos.db import saveddata_meta
from eos.saveddata.character import Skill from eos.saveddata.character import Skill



skills_table = Table("characterSkills", saveddata_meta, skills_table = Table("characterSkills", saveddata_meta,
Column("characterID", ForeignKey("characters.ID"), primary_key=True, index=True), Column("characterID", ForeignKey("characters.ID"), primary_key=True, index=True),
Column("itemID", Integer, primary_key=True), Column("itemID", Integer, primary_key=True),
Expand Down
10 changes: 5 additions & 5 deletions eos/effects/adaptivearmorhardener.py
Expand Up @@ -33,7 +33,7 @@ def handler(fit, module, context):
# pyfalog.debug("Damage Adjusted for Armor Resists: %f/%f/%f/%f", baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3]) # pyfalog.debug("Damage Adjusted for Armor Resists: %f/%f/%f/%f", baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3])


resistanceShiftAmount = module.getModifiedItemAttr( resistanceShiftAmount = module.getModifiedItemAttr(
'resistanceShiftAmount') / 100 # The attribute is in percent and we want a fraction 'resistanceShiftAmount') / 100 # The attribute is in percent and we want a fraction
RAHResistance = [ RAHResistance = [
module.getModifiedItemAttr('armorEmDamageResonance'), module.getModifiedItemAttr('armorEmDamageResonance'),
module.getModifiedItemAttr('armorThermalDamageResonance'), module.getModifiedItemAttr('armorThermalDamageResonance'),
Expand Down Expand Up @@ -90,9 +90,9 @@ def handler(fit, module, context):
for i, val in enumerate(cycleList): for i, val in enumerate(cycleList):
tolerance = 1e-06 tolerance = 1e-06
if abs(RAHResistance[0] - val[0]) <= tolerance and \ if abs(RAHResistance[0] - val[0]) <= tolerance and \
abs(RAHResistance[1] - val[1]) <= tolerance and \ abs(RAHResistance[1] - val[1]) <= tolerance and \
abs(RAHResistance[2] - val[2]) <= tolerance and \ abs(RAHResistance[2] - val[2]) <= tolerance and \
abs(RAHResistance[3] - val[3]) <= tolerance: abs(RAHResistance[3] - val[3]) <= tolerance:
loopStart = i loopStart = i
# pyfalog.debug("Loop found: %d-%d", loopStart, num) # pyfalog.debug("Loop found: %d-%d", loopStart, num)
break break
Expand All @@ -103,7 +103,7 @@ def handler(fit, module, context):


if loopStart < 0: if loopStart < 0:
pyfalog.error("Reactive Armor Hardener failed to find equilibrium. Damage profile after armor: {0}/{1}/{2}/{3}", pyfalog.error("Reactive Armor Hardener failed to find equilibrium. Damage profile after armor: {0}/{1}/{2}/{3}",
baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3]) baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3])


# Average the profiles in the RAH loop, or the last 20 if it didn't find a loop. # Average the profiles in the RAH loop, or the last 20 if it didn't find a loop.
loopCycles = cycleList[loopStart:] loopCycles = cycleList[loopStart:]
Expand Down
8 changes: 4 additions & 4 deletions eos/effects/angelsetbonus.py
Expand Up @@ -8,7 +8,7 @@


def handler(fit, implant, context): def handler(fit, implant, context):
fit.appliedImplants.filteredItemMultiply( fit.appliedImplants.filteredItemMultiply(
lambda implant: "signatureRadiusBonus" in implant.itemModifiedAttributes and lambda implant: "signatureRadiusBonus" in implant.itemModifiedAttributes and
"implantSetAngel" in implant.itemModifiedAttributes, "implantSetAngel" in implant.itemModifiedAttributes,
"signatureRadiusBonus", "signatureRadiusBonus",
implant.getModifiedItemAttr("implantSetAngel")) implant.getModifiedItemAttr("implantSetAngel"))
4 changes: 2 additions & 2 deletions eos/effects/armorallrepairsystemsamountbonuspassive.py
Expand Up @@ -8,5 +8,5 @@


def handler(fit, booster, context): def handler(fit, booster, context):
fit.modules.filteredItemBoost( fit.modules.filteredItemBoost(
lambda mod: mod.item.requiresSkill("Repair Systems") or mod.item.requiresSkill("Capital Repair Systems"), lambda mod: mod.item.requiresSkill("Repair Systems") or mod.item.requiresSkill("Capital Repair Systems"),
"armorDamageAmount", booster.getModifiedItemAttr("armorDamageAmountBonus")) "armorDamageAmount", booster.getModifiedItemAttr("armorDamageAmountBonus"))
4 changes: 2 additions & 2 deletions eos/effects/elitebonusinterdictorsmissilekineticdamage1.py
Expand Up @@ -7,5 +7,5 @@


def handler(fit, ship, context): def handler(fit, ship, context):
fit.modules.filteredChargeBoost( fit.modules.filteredChargeBoost(
lambda mod: mod.charge.requiresSkill("Light Missiles") or mod.charge.requiresSkill("Rockets"), lambda mod: mod.charge.requiresSkill("Light Missiles") or mod.charge.requiresSkill("Rockets"),
"kineticDamage", ship.getModifiedItemAttr("eliteBonusInterdictors1"), skill="Interdictors") "kineticDamage", ship.getModifiedItemAttr("eliteBonusInterdictors1"), skill="Interdictors")
4 changes: 2 additions & 2 deletions eos/effects/elitebonusmarauderscruiseandtorpedodamagerole1.py
Expand Up @@ -9,5 +9,5 @@ def handler(fit, ship, context):
damageTypes = ("em", "explosive", "kinetic", "thermal") damageTypes = ("em", "explosive", "kinetic", "thermal")
for damageType in damageTypes: for damageType in damageTypes:
fit.modules.filteredChargeBoost( fit.modules.filteredChargeBoost(
lambda mod: mod.charge.requiresSkill("Cruise Missiles") or mod.charge.requiresSkill("Torpedoes"), lambda mod: mod.charge.requiresSkill("Cruise Missiles") or mod.charge.requiresSkill("Torpedoes"),
"{0}Damage".format(damageType), ship.getModifiedItemAttr("eliteBonusViolatorsRole1")) "{0}Damage".format(damageType), ship.getModifiedItemAttr("eliteBonusViolatorsRole1"))
2 changes: 1 addition & 1 deletion eos/effects/energyneutralizerfalloff.py
Expand Up @@ -9,7 +9,7 @@


def handler(fit, src, context): def handler(fit, src, context):
if "projected" in context and ((hasattr(src, "state") and src.state >= State.ACTIVE) or if "projected" in context and ((hasattr(src, "state") and src.state >= State.ACTIVE) or
hasattr(src, "amountActive")): hasattr(src, "amountActive")):
amount = src.getModifiedItemAttr("energyNeutralizerAmount") amount = src.getModifiedItemAttr("energyNeutralizerAmount")
time = src.cycleTime time = src.cycleTime


Expand Down
2 changes: 1 addition & 1 deletion eos/effects/entityenergyneutralizerfalloff.py
Expand Up @@ -9,7 +9,7 @@


def handler(fit, src, context): def handler(fit, src, context):
if "projected" in context and ((hasattr(src, "state") and src.state >= State.ACTIVE) or if "projected" in context and ((hasattr(src, "state") and src.state >= State.ACTIVE) or
hasattr(src, "amountActive")): hasattr(src, "amountActive")):
amount = src.getModifiedItemAttr("energyNeutralizerAmount") amount = src.getModifiedItemAttr("energyNeutralizerAmount")
time = src.getModifiedItemAttr("energyNeutralizerDuration") time = src.getModifiedItemAttr("energyNeutralizerDuration")


Expand Down
12 changes: 6 additions & 6 deletions eos/effects/maraudermodeeffect26.py
Expand Up @@ -34,13 +34,13 @@ def handler(fit, module, context):


# Tanking # Tanking
fit.modules.filteredItemBoost( fit.modules.filteredItemBoost(
lambda mod: mod.item.requiresSkill("Capital Repair Systems") or mod.item.requiresSkill("Repair Systems"), lambda mod: mod.item.requiresSkill("Capital Repair Systems") or mod.item.requiresSkill("Repair Systems"),
"armorDamageAmount", module.getModifiedItemAttr("armorDamageAmountBonus"), "armorDamageAmount", module.getModifiedItemAttr("armorDamageAmountBonus"),
stackingPenalties=True) stackingPenalties=True)
fit.modules.filteredItemBoost( fit.modules.filteredItemBoost(
lambda mod: mod.item.requiresSkill("Capital Shield Operation") or mod.item.requiresSkill("Shield Operation"), lambda mod: mod.item.requiresSkill("Capital Shield Operation") or mod.item.requiresSkill("Shield Operation"),
"shieldBonus", module.getModifiedItemAttr("shieldBoostMultiplier"), "shieldBonus", module.getModifiedItemAttr("shieldBoostMultiplier"),
stackingPenalties=True) stackingPenalties=True)


# Speed penalty # Speed penalty
fit.ship.boostItemAttr("maxVelocity", module.getModifiedItemAttr("speedFactor")) fit.ship.boostItemAttr("maxVelocity", module.getModifiedItemAttr("speedFactor"))
Expand Down
4 changes: 2 additions & 2 deletions eos/effects/minigamevirusstrengthbonus.py
Expand Up @@ -16,5 +16,5 @@
def handler(fit, container, context): def handler(fit, container, context):
level = container.level if "skill" in context else 1 level = container.level if "skill" in context else 1
fit.modules.filteredItemIncrease( fit.modules.filteredItemIncrease(
lambda mod: (mod.item.requiresSkill("Hacking") or mod.item.requiresSkill("Archaeology")), lambda mod: (mod.item.requiresSkill("Hacking") or mod.item.requiresSkill("Archaeology")),
"virusStrength", container.getModifiedItemAttr("virusStrengthBonus") * level) "virusStrength", container.getModifiedItemAttr("virusStrengthBonus") * level)
8 changes: 4 additions & 4 deletions eos/effects/modeagilitypostdiv.py
Expand Up @@ -7,8 +7,8 @@


def handler(fit, module, context): def handler(fit, module, context):
fit.ship.multiplyItemAttr( fit.ship.multiplyItemAttr(
"agility", "agility",
1 / module.getModifiedItemAttr("modeAgilityPostDiv"), 1 / module.getModifiedItemAttr("modeAgilityPostDiv"),
stackingPenalties=True, stackingPenalties=True,
penaltyGroup="postDiv" penaltyGroup="postDiv"
) )
6 changes: 3 additions & 3 deletions eos/effects/modearmorrepdurationpostdiv.py
Expand Up @@ -7,7 +7,7 @@


def handler(fit, module, context): def handler(fit, module, context):
fit.modules.filteredItemMultiply( fit.modules.filteredItemMultiply(
lambda mod: mod.item.requiresSkill("Repair Systems"), lambda mod: mod.item.requiresSkill("Repair Systems"),
"duration", "duration",
1 / module.getModifiedItemAttr("modeArmorRepDurationPostDiv") 1 / module.getModifiedItemAttr("modeArmorRepDurationPostDiv")
) )
8 changes: 4 additions & 4 deletions eos/effects/modearmorresonancepostdiv.py
Expand Up @@ -13,8 +13,8 @@ def handler(fit, module, context):
("Thermic", "Thermal") ("Thermic", "Thermal")
): ):
fit.ship.multiplyItemAttr( fit.ship.multiplyItemAttr(
"armor{0}DamageResonance".format(tgtResType), "armor{0}DamageResonance".format(tgtResType),
1 / module.getModifiedItemAttr("mode{0}ResistancePostDiv".format(srcResType)), 1 / module.getModifiedItemAttr("mode{0}ResistancePostDiv".format(srcResType)),
stackingPenalties=True, stackingPenalties=True,
penaltyGroup="postDiv" penaltyGroup="postDiv"
) )
4 changes: 2 additions & 2 deletions eos/effects/modehullresonancepostdiv.py
Expand Up @@ -13,6 +13,6 @@ def handler(fit, module, context):
("Thermic", "thermal") ("Thermic", "thermal")
): ):
fit.ship.multiplyItemAttr( fit.ship.multiplyItemAttr(
"{0}DamageResonance".format(tgtResType), "{0}DamageResonance".format(tgtResType),
1 / module.getModifiedItemAttr("mode{0}ResistancePostDiv".format(srcResType)) 1 / module.getModifiedItemAttr("mode{0}ResistancePostDiv".format(srcResType))
) )
10 changes: 5 additions & 5 deletions eos/effects/modemwdandabboostpostdiv.py
Expand Up @@ -8,9 +8,9 @@


def handler(fit, module, context): def handler(fit, module, context):
fit.modules.filteredItemMultiply( fit.modules.filteredItemMultiply(
lambda mod: mod.item.requiresSkill("High Speed Maneuvering") or mod.item.requiresSkill("Afterburner"), lambda mod: mod.item.requiresSkill("High Speed Maneuvering") or mod.item.requiresSkill("Afterburner"),
"speedFactor", "speedFactor",
1 / module.getModifiedItemAttr("modeVelocityPostDiv"), 1 / module.getModifiedItemAttr("modeVelocityPostDiv"),
stackingPenalties=True, stackingPenalties=True,
penaltyGroup="postDiv" penaltyGroup="postDiv"
) )
10 changes: 5 additions & 5 deletions eos/effects/modemwdboostpostdiv.py
Expand Up @@ -7,9 +7,9 @@


def handler(fit, module, context): def handler(fit, module, context):
fit.modules.filteredItemMultiply( fit.modules.filteredItemMultiply(
lambda mod: mod.item.requiresSkill("High Speed Maneuvering"), lambda mod: mod.item.requiresSkill("High Speed Maneuvering"),
"speedFactor", "speedFactor",
1 / module.getModifiedItemAttr("modeMWDVelocityPostDiv"), 1 / module.getModifiedItemAttr("modeMWDVelocityPostDiv"),
stackingPenalties=True, stackingPenalties=True,
penaltyGroup="postDiv" penaltyGroup="postDiv"
) )

0 comments on commit ddb4037

Please sign in to comment.