Skip to content

Commit

Permalink
Find and replace
Browse files Browse the repository at this point in the history
  • Loading branch information
Meatballs1 committed Sep 26, 2013
1 parent 813bd2c commit 7ba846c
Show file tree
Hide file tree
Showing 131 changed files with 175 additions and 175 deletions.
4 changes: 2 additions & 2 deletions lib/msf/core/auxiliary/jtr.rb
Expand Up @@ -32,13 +32,13 @@ def initialize(info = {})
)

@run_path = nil
@john_path = ::File.join(Msf::Config.install_root, "data", "john")
@john_path = ::File.join(Msf::Config.data_directory, "john")

autodetect_platform
end

def autodetect_platform
cpuinfo_base = ::File.join(Msf::Config.install_root, "data", "cpuinfo")
cpuinfo_base = ::File.join(Msf::Config.data_directory, "cpuinfo")
return @run_path if @run_path

case ::RUBY_PLATFORM
Expand Down
2 changes: 1 addition & 1 deletion lib/msf/core/auxiliary/mime_types.rb
Expand Up @@ -23,7 +23,7 @@ def mime_yaml_lookup(extension)
end

def mime_load_extension_map
path = File.join( Msf::Config.install_root, "data", "mime.yml")
path = File.join( Msf::Config.data_directory, "mime.yml")
@extension_map = YAML.load_file(path)
end

Expand Down
2 changes: 1 addition & 1 deletion lib/msf/core/db.rb
Expand Up @@ -3649,7 +3649,7 @@ def import_msf_collateral(args={}, &block)
data = ::File.open(args[:filename], "rb") {|f| f.read(f.stat.size)}
wspace = args[:wspace] || args['wspace'] || workspace
bl = validate_ips(args[:blacklist]) ? args[:blacklist].split : []
basedir = args[:basedir] || args['basedir'] || ::File.join(Msf::Config.install_root, "data", "msf")
basedir = args[:basedir] || args['basedir'] || ::File.join(Msf::Config.data_directory, "msf")

allow_yaml = false
btag = nil
Expand Down
2 changes: 1 addition & 1 deletion lib/msf/core/exploit/cmdstager_debug_asm.rb
Expand Up @@ -19,7 +19,7 @@ def initialize(info = {})
register_advanced_options(
[
OptString.new( 'DECODERSTUB', [ true, 'The debug.exe assembly listing decoder stub to use.',
File.join(Msf::Config.install_root, "data", "exploits", "cmdstager", "debug_asm")]),
File.join(Msf::Config.data_directory, "exploits", "cmdstager", "debug_asm")]),
], self.class)
end

Expand Down
2 changes: 1 addition & 1 deletion lib/msf/core/exploit/cmdstager_debug_write.rb
Expand Up @@ -19,7 +19,7 @@ def initialize(info = {})
register_advanced_options(
[
OptString.new( 'DECODERSTUB', [ true, 'The debug.exe file-writing decoder stub to use.',
File.join(Msf::Config.install_root, "data", "exploits", "cmdstager", "debug_write")]),
File.join(Msf::Config.data_directory, "exploits", "cmdstager", "debug_write")]),
], self.class)
end

Expand Down
2 changes: 1 addition & 1 deletion lib/msf/core/exploit/cmdstager_vbs.rb
Expand Up @@ -19,7 +19,7 @@ def initialize(info = {})
register_advanced_options(
[
OptString.new( 'DECODERSTUB', [ true, 'The VBS base64 file decoder stub to use.',
File.join(Msf::Config.install_root, "data", "exploits", "cmdstager", "vbs_b64")]),
File.join(Msf::Config.data_directory, "exploits", "cmdstager", "vbs_b64")]),
], self.class)
end

Expand Down
2 changes: 1 addition & 1 deletion lib/msf/core/exploit/cmdstager_vbs_adodb.rb
Expand Up @@ -19,7 +19,7 @@ def initialize(info = {})
register_advanced_options(
[
OptString.new( 'DECODERSTUB', [ true, 'The VBS base64 file decoder stub to use.',
File.join(Msf::Config.install_root, "data", "exploits", "cmdstager", "vbs_b64_adodb")]),
File.join(Msf::Config.data_directory, "exploits", "cmdstager", "vbs_b64_adodb")]),
], self.class)
end

Expand Down
2 changes: 1 addition & 1 deletion lib/msf/core/exploit/java.rb
Expand Up @@ -51,7 +51,7 @@ def init_jvm(jvmoptions = nil)

# Instantiate the JVM with a classpath pointing to the JDK tools.jar
# and our javatoolkit jar.
classpath = File.join(Msf::Config.install_root, "data", "exploits", "msfJavaToolkit.jar")
classpath = File.join(Msf::Config.data_directory, "exploits", "msfJavaToolkit.jar")
classpath += ":" + toolsjar
classpath += ":" + datastore['ADDCLASSPATH'] if datastore['ADDCLASSPATH']

Expand Down
2 changes: 1 addition & 1 deletion lib/msf/core/exploit/mssql.rb
Expand Up @@ -75,7 +75,7 @@ def initialize(info = {})
register_advanced_options(
[
OptPath.new('HEX2BINARY', [ false, "The path to the hex2binary script on the disk",
File.join(Msf::Config.install_root, "data", "exploits", "mssql", "h2b")
File.join(Msf::Config.data_directory, "exploits", "mssql", "h2b")
]),
OptString.new('DOMAIN', [ true, 'The domain to use for windows authentication', 'WORKSTATION'])
], Msf::Exploit::Remote::MSSQL)
Expand Down
2 changes: 1 addition & 1 deletion lib/msf/core/exploit/mssql_sqli.rb
Expand Up @@ -34,7 +34,7 @@ def initialize(info = {})
register_advanced_options(
[
OptPath.new('HEX2BINARY', [ false, "The path to the hex2binary script on the disk",
File.join(Msf::Config.install_root, "data", "exploits", "mssql", "h2b")
File.join(Msf::Config.data_directory, "exploits", "mssql", "h2b")
])
], Msf::Exploit::Remote::MSSQL_SQLI)

Expand Down
2 changes: 1 addition & 1 deletion lib/msf/core/exploit/mysql.rb
Expand Up @@ -150,7 +150,7 @@ def mysql_upload_binary(bindata)

def mysql_upload_sys_udf(arch=:win32,target_path=nil)
fname = (arch == :win32 ? "lib_mysqludf_sys_32.dll" : "lib_mysqludf_sys_64.dll")
sys_dll = File.join( Msf::Config.install_root, "data", "exploits", "mysql", fname )
sys_dll = File.join( Msf::Config.data_directory, "exploits", "mysql", fname )
data = File.open(sys_dll, "rb") {|f| f.read f.stat.size}
blob = "0x"
blob << data.unpack("C*").map {|x| "%02x" % [x]}.join
Expand Down
2 changes: 1 addition & 1 deletion lib/msf/core/exploit/sunrpc.rb
Expand Up @@ -150,7 +150,7 @@ def portmap_qry()
end

def progresolv(number)
names = File.join(Msf::Config.install_root, "data", "wordlists", "rpc_names.txt")
names = File.join(Msf::Config.data_directory, "wordlists", "rpc_names.txt")
File.open(names, "rb").each_line do |line|
next if line.empty? || line =~ /^\s*#/

Expand Down
2 changes: 1 addition & 1 deletion lib/msf/util/exe.rb
Expand Up @@ -57,7 +57,7 @@ def self.set_template_default(opts, exe = nil, path = nil)
end

def self.read_replace_script_template(filename, hash_sub)
template_pathname = File.join(Msf::Config.install_root, "data", "templates", "scripts", filename)
template_pathname = File.join(Msf::Config.data_directory, "templates", "scripts", filename)

template = ''
File.open(template_pathname, "rb") do |f|
Expand Down
2 changes: 1 addition & 1 deletion modules/auxiliary/admin/http/tomcat_utf8_traversal.rb
Expand Up @@ -42,7 +42,7 @@ def initialize
[
Opt::RPORT(8080),
OptPath.new('SENSITIVE_FILES', [ true, "File containing senstive files, one per line",
File.join(Msf::Config.install_root, "data", "wordlists", "sensitive_files.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "sensitive_files.txt") ]),
OptInt.new('MAXDIRS', [ true, 'The maximum directory depth to search', 7]),
], self.class)
end
Expand Down
2 changes: 1 addition & 1 deletion modules/auxiliary/admin/http/trendmicro_dlp_traversal.rb
Expand Up @@ -43,7 +43,7 @@ def initialize
Opt::RPORT(8443),
OptBool.new('SSL', [true, 'Use SSL', true]),
OptPath.new('SENSITIVE_FILES', [ true, "File containing senstive files, one per line",
File.join(Msf::Config.install_root, "data", "wordlists", "sensitive_files.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "sensitive_files.txt") ]),
], self.class)
end

Expand Down
2 changes: 1 addition & 1 deletion modules/auxiliary/admin/oracle/oraenum.rb
Expand Up @@ -657,7 +657,7 @@ def run
FROM sys.user$
where password != 'null' and type# = 1
|
ordfltpss = "#{File.join(Msf::Config.install_root, "data", "wordlists", "oracle_default_hashes.txt")}"
ordfltpss = "#{File.join(Msf::Config.data_directory, "wordlists", "oracle_default_hashes.txt")}"
returnedstring = prepare_exec(query)
accts = {}
returnedstring.each do |record|
Expand Down
2 changes: 1 addition & 1 deletion modules/auxiliary/client/smtp/emailer.rb
Expand Up @@ -38,7 +38,7 @@ def initialize(info = {})
OptString.new('RHOST', [true, "SMTP server address",'127.0.0.1']),
OptString.new('RPORT', [true, "SMTP server port",'25']),
OptString.new('YAML_CONFIG', [true, "Full path to YAML Configuration file",
File.join(Msf::Config.install_root, "data","emailer_config.yaml")]),
File.join(Msf::Config.data_directory,"emailer_config.yaml")]),
], self.class)

# Hide this option from the user
Expand Down
2 changes: 1 addition & 1 deletion modules/auxiliary/crawler/msfcrawler.rb
Expand Up @@ -40,7 +40,7 @@ def initialize(info = {})

register_advanced_options([
OptPath.new('CrawlerModulesDir', [true, 'The base directory containing the crawler modules',
File.join(Msf::Config.install_root, "data", "msfcrawler")
File.join(Msf::Config.data_directory, "msfcrawler")
]),
OptBool.new('EnableUl', [ false, "Enable maximum number of request per URI", true ]),
OptBool.new('StoreDB', [ false, "Store requests in database", false ]),
Expand Down
2 changes: 1 addition & 1 deletion modules/auxiliary/docx/word_unc_injector.rb
Expand Up @@ -57,7 +57,7 @@ def make_new_file
metadata_file_data << "2013-01-08T14:14:00Z</dcterms:modified></cp:coreProperties>"

#where to find the skeleton files required for creating an empty document
data_dir = File.join(Msf::Config.install_root, "data", "exploits", "docx")
data_dir = File.join(Msf::Config.data_directory, "exploits", "docx")

zip_data = {}

Expand Down
Expand Up @@ -33,7 +33,7 @@ def initialize(info = {})
'DisclosureDate' => 'Nov 10 2009'
))
register_options([
OptPath.new('EOTFILE', [ true, "The EOT template to use to generate the trigger", File.join(Msf::Config.install_root, "data", "exploits", "pricedown.eot")]),
OptPath.new('EOTFILE', [ true, "The EOT template to use to generate the trigger", File.join(Msf::Config.data_directory, "exploits", "pricedown.eot")]),
], self.class)

end
Expand Down
2 changes: 1 addition & 1 deletion modules/auxiliary/gather/dns_bruteforce.rb
Expand Up @@ -28,7 +28,7 @@ def initialize(info = {})
OptString.new('DOMAIN', [ true, "The target domain name"]),
OptAddress.new('NS', [ false, "Specify the name server to use for queries, otherwise use the system DNS" ]),
OptPath.new('WORDLIST', [ true, "Wordlist file for domain name brute force.",
File.join(Msf::Config.install_root, "data", "wordlists", "namelist.txt")])
File.join(Msf::Config.data_directory, "wordlists", "namelist.txt")])
], self.class)

register_advanced_options(
Expand Down
2 changes: 1 addition & 1 deletion modules/auxiliary/gather/enum_dns.rb
Expand Up @@ -39,7 +39,7 @@ def initialize(info = {})
OptBool.new('ENUM_IP6', [ true, 'Brute force hosts with IPv6 AAAA records',false]),
OptBool.new('ENUM_RVL', [ true, 'Reverse lookup a range of IP addresses', false]),
OptBool.new('ENUM_SRV', [ true, 'Enumerate the most common SRV records', true]),
OptPath.new('WORDLIST', [ false, "Wordlist for domain name bruteforcing", ::File.join(Msf::Config.install_root, "data", "wordlists", "namelist.txt")]),
OptPath.new('WORDLIST', [ false, "Wordlist for domain name bruteforcing", ::File.join(Msf::Config.data_directory, "wordlists", "namelist.txt")]),
OptAddress.new('NS', [ false, "Specify the nameserver to use for queries (default is system DNS)" ]),
OptAddressRange.new('IPRANGE', [false, "The target address range or CIDR identifier"]),
OptBool.new('STOP_WLDCRD', [ true, 'Stops bruteforce enumeration if wildcard resolution is detected', false])
Expand Down
6 changes: 3 additions & 3 deletions modules/auxiliary/scanner/couchdb/couchdb_login.rb
Expand Up @@ -33,11 +33,11 @@ def initialize(info={})
Opt::RPORT(5984),
OptString.new('TARGETURI', [false, "TARGETURI for CouchDB. Default here is /", "/"]),
OptPath.new('USERPASS_FILE', [ false, "File containing users and passwords separated by space, one pair per line",
File.join(Msf::Config.install_root, "data", "wordlists", "http_default_userpass.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "http_default_userpass.txt") ]),
OptPath.new('USER_FILE', [ false, "File containing users, one per line",
File.join(Msf::Config.install_root, "data", "wordlists", "http_default_users.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "http_default_users.txt") ]),
OptPath.new('PASS_FILE', [ false, "File containing passwords, one per line",
File.join(Msf::Config.install_root, "data", "wordlists", "http_default_pass.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "http_default_pass.txt") ]),
OptBool.new('USER_AS_PASS', [ false, "Try the username as the password for all users", false]),
], self.class)
end
Expand Down
6 changes: 3 additions & 3 deletions modules/auxiliary/scanner/db2/db2_auth.rb
Expand Up @@ -33,11 +33,11 @@ def initialize
register_options(
[
OptPath.new('USERPASS_FILE', [ false, "File containing (space-seperated) users and passwords, one pair per line",
File.join(Msf::Config.install_root, "data", "wordlists", "db2_default_userpass.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "db2_default_userpass.txt") ]),
OptPath.new('USER_FILE', [ false, "File containing users, one per line",
File.join(Msf::Config.install_root, "data", "wordlists", "db2_default_user.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "db2_default_user.txt") ]),
OptPath.new('PASS_FILE', [ false, "File containing passwords, one per line",
File.join(Msf::Config.install_root, "data", "wordlists", "db2_default_pass.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "db2_default_pass.txt") ]),
], self.class)
end

Expand Down
2 changes: 1 addition & 1 deletion modules/auxiliary/scanner/http/apache_userdir_enum.rb
Expand Up @@ -41,7 +41,7 @@ def initialize
[
OptString.new('URI', [true, 'The path to users Home Page', '/']),
OptPath.new('USER_FILE', [ true, "File containing users, one per line",
File.join(Msf::Config.install_root, "data", "wordlists", "unix_users.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "unix_users.txt") ]),
], self.class)

deregister_options(
Expand Down
2 changes: 1 addition & 1 deletion modules/auxiliary/scanner/http/brute_dirs.rb
Expand Up @@ -37,7 +37,7 @@ def initialize(info = {})
[
OptInt.new('ErrorCode', [ true, "The expected http code for non existant directories", 404]),
OptPath.new('HTTP404Sigs', [ false, "Path of 404 signatures to use",
File.join(Msf::Config.install_root, "data", "wmap", "wmap_404s.txt")
File.join(Msf::Config.data_directory, "wmap", "wmap_404s.txt")
]
),
OptBool.new('NoDetailMessages', [ false, "Do not display detailed test messages", true ]),
Expand Down
2 changes: 1 addition & 1 deletion modules/auxiliary/scanner/http/copy_of_file.rb
Expand Up @@ -36,7 +36,7 @@ def initialize(info = {})
[
OptInt.new('ErrorCode', [ true, "Error code for non existent directory", 404]),
OptPath.new('HTTP404Sigs', [ false, "Path of 404 signatures to use",
File.join(Msf::Config.install_root, "data", "wmap", "wmap_404s.txt")
File.join(Msf::Config.data_directory, "wmap", "wmap_404s.txt")
]
),
OptBool.new('NoDetailMessages', [ false, "Do not display detailed test messages", true ])
Expand Down
4 changes: 2 additions & 2 deletions modules/auxiliary/scanner/http/dell_idrac.rb
Expand Up @@ -36,9 +36,9 @@ def initialize
register_options([
OptString.new('TARGETURI', [true, 'Path to the iDRAC Administration page', '/data/login']),
OptPath.new('USER_FILE', [ false, "File containing users, one per line",
File.join(Msf::Config.install_root, "data", "wordlists", "idrac_default_user.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "idrac_default_user.txt") ]),
OptPath.new('PASS_FILE', [ false, "File containing passwords, one per line",
File.join(Msf::Config.install_root, "data", "wordlists", "idrac_default_pass.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "idrac_default_pass.txt") ]),
OptInt.new('RPORT', [true, "Default remote port", 443])
], self.class)

Expand Down
2 changes: 1 addition & 1 deletion modules/auxiliary/scanner/http/dir_scanner.rb
Expand Up @@ -31,7 +31,7 @@ def initialize(info = {})
[
OptString.new('PATH', [ true, "The path to identify files", '/']),
OptPath.new('DICTIONARY', [ false, "Path of word dictionary to use",
File.join(Msf::Config.install_root, "data", "wmap", "wmap_dirs.txt")
File.join(Msf::Config.data_directory, "wmap", "wmap_dirs.txt")
]
)

Expand Down
4 changes: 2 additions & 2 deletions modules/auxiliary/scanner/http/dir_webdav_unicode_bypass.rb
Expand Up @@ -43,11 +43,11 @@ def initialize(info = {})
OptString.new('PATH', [ true, "The path to identify files", '/']),
OptInt.new('ERROR_CODE', [ true, "Error code for non existent directory", 404]),
OptPath.new('DICTIONARY', [ false, "Path of word dictionary to use",
File.join(Msf::Config.install_root, "data", "wmap", "wmap_dirs.txt")
File.join(Msf::Config.data_directory, "wmap", "wmap_dirs.txt")
]
),
OptPath.new('HTTP404S', [ false, "Path of 404 signatures to use",
File.join(Msf::Config.install_root, "data", "wmap", "wmap_404s.txt")
File.join(Msf::Config.data_directory, "wmap", "wmap_404s.txt")
]
)
], self.class)
Expand Down
Expand Up @@ -41,7 +41,7 @@ def initialize
[
OptString.new('USERNAME', [ false, "Username for authentication (default: admin)","admin" ]),
OptPath.new('PASS_FILE', [ false, "File containing passwords, one per line",
File.join(Msf::Config.install_root, "data", "wordlists", "http_default_pass.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "http_default_pass.txt") ]),
], self.class)
end

Expand Down
Expand Up @@ -39,7 +39,7 @@ def initialize
[
OptString.new('USERNAME', [ false, "Username for authentication (default: admin)","admin" ]),
OptPath.new('PASS_FILE', [ false, "File containing passwords, one per line",
File.join(Msf::Config.install_root, "data", "wordlists", "http_default_pass.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "http_default_pass.txt") ]),
], self.class)
end

Expand Down
Expand Up @@ -42,7 +42,7 @@ def initialize
[
OptString.new('USERNAME', [ false, "Username for authentication (default: admin)","admin" ]),
OptPath.new('PASS_FILE', [ false, "File containing passwords, one per line",
File.join(Msf::Config.install_root, "data", "wordlists", "http_default_pass.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "http_default_pass.txt") ]),
], self.class)
end

Expand Down
6 changes: 3 additions & 3 deletions modules/auxiliary/scanner/http/dolibarr_login.rb
Expand Up @@ -28,11 +28,11 @@ def initialize(info = {})
register_options(
[
OptPath.new('USERPASS_FILE', [ false, "File containing users and passwords separated by space, one pair per line",
File.join(Msf::Config.install_root, "data", "wordlists", "http_default_userpass.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "http_default_userpass.txt") ]),
OptPath.new('USER_FILE', [ false, "File containing users, one per line",
File.join(Msf::Config.install_root, "data", "wordlists", "http_default_users.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "http_default_users.txt") ]),
OptPath.new('PASS_FILE', [ false, "File containing passwords, one per line",
File.join(Msf::Config.install_root, "data", "wordlists", "http_default_pass.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "http_default_pass.txt") ]),
OptString.new('TARGETURI', [true, 'The URI path to dolibarr', '/dolibarr/'])
], self.class)
end
Expand Down
2 changes: 1 addition & 1 deletion modules/auxiliary/scanner/http/ektron_cms400net.rb
Expand Up @@ -35,7 +35,7 @@ def initialize(info={})
[
false,
"File containing users and passwords",
File.join(Msf::Config.install_root, "data", "wordlists", "cms400net_default_userpass.txt")
File.join(Msf::Config.data_directory, "wordlists", "cms400net_default_userpass.txt")
])
], self.class)

Expand Down
4 changes: 2 additions & 2 deletions modules/auxiliary/scanner/http/files_dir.rb
Expand Up @@ -31,7 +31,7 @@ def initialize(info = {})
OptString.new('PATH', [ true, "The path to identify files", '/']),
OptString.new('EXT', [ false, "Append file extension to use", '']),
OptPath.new('DICTIONARY', [ false, "Path of word dictionary to use",
File.join(Msf::Config.install_root, "data", "wmap", "wmap_files.txt")
File.join(Msf::Config.data_directory, "wmap", "wmap_files.txt")
]
)
], self.class)
Expand All @@ -40,7 +40,7 @@ def initialize(info = {})
[
OptInt.new('ErrorCode', [ true, "The expected http code for non existant files", 404]),
OptPath.new('HTTP404Sigs', [ false, "Path of 404 signatures to use",
File.join(Msf::Config.install_root, "data", "wmap", "wmap_404s.txt")
File.join(Msf::Config.data_directory, "wmap", "wmap_404s.txt")
]
),
OptBool.new('NoDetailMessages', [ false, "Do not display detailed test messages", true ]),
Expand Down
6 changes: 3 additions & 3 deletions modules/auxiliary/scanner/http/hp_sys_mgmt_login.rb
Expand Up @@ -29,11 +29,11 @@ def initialize(info={})
[
Opt::RPORT(2381),
OptPath.new('USERPASS_FILE', [ false, "File containing users and passwords separated by space, one pair per line",
File.join(Msf::Config.install_root, "data", "wordlists", "http_default_userpass.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "http_default_userpass.txt") ]),
OptPath.new('USER_FILE', [ false, "File containing users, one per line",
File.join(Msf::Config.install_root, "data", "wordlists", "http_default_users.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "http_default_users.txt") ]),
OptPath.new('PASS_FILE', [ false, "File containing passwords, one per line",
File.join(Msf::Config.install_root, "data", "wordlists", "http_default_pass.txt") ]),
File.join(Msf::Config.data_directory, "wordlists", "http_default_pass.txt") ]),
], self.class)
end

Expand Down

0 comments on commit 7ba846c

Please sign in to comment.