diff options
44 files changed, 69 insertions, 77 deletions
diff --git a/cobbler.spec b/cobbler.spec index ca6640ff..2b6c88df 100644 --- a/cobbler.spec +++ b/cobbler.spec @@ -14,7 +14,6 @@ Requires: python-devel Requires: createrepo Requires: mod_python Requires: python-cheetah -Requires: rhpl Requires: rsync Requires(post): /sbin/chkconfig Requires(preun): /sbin/chkconfig diff --git a/cobbler/action_check.py b/cobbler/action_check.py index 1fb4734f..85084d78 100644 --- a/cobbler/action_check.py +++ b/cobbler/action_check.py @@ -18,7 +18,7 @@ import re import sub_process import action_sync import utils -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ class BootCheck: diff --git a/cobbler/action_import.py b/cobbler/action_import.py index db098188..d224e557 100644 --- a/cobbler/action_import.py +++ b/cobbler/action_import.py @@ -23,7 +23,7 @@ import glob import api import utils import shutil -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ WGET_CMD = "wget --mirror --no-parent --no-host-directories --directory-prefix %s/%s %s" RSYNC_CMD = "rsync -a %s '%s' %s/ks_mirror/%s --exclude-from=/etc/cobbler/rsync.exclude --progress" diff --git a/cobbler/action_litesync.py b/cobbler/action_litesync.py index 9200a3e7..a73e7c36 100644 --- a/cobbler/action_litesync.py +++ b/cobbler/action_litesync.py @@ -30,7 +30,7 @@ from cexceptions import * import traceback import errno -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ class BootLiteSync: diff --git a/cobbler/action_reposync.py b/cobbler/action_reposync.py index c86e0bee..d6b97a07 100644 --- a/cobbler/action_reposync.py +++ b/cobbler/action_reposync.py @@ -25,7 +25,7 @@ from cexceptions import * import traceback import errno -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ class RepoSync: """ diff --git a/cobbler/action_status.py b/cobbler/action_status.py index cc6ebd4a..7366060e 100644 --- a/cobbler/action_status.py +++ b/cobbler/action_status.py @@ -19,7 +19,7 @@ import glob import time import api as cobbler_api -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ class BootStatusReport: diff --git a/cobbler/action_sync.py b/cobbler/action_sync.py index 5cb09777..5c8aab94 100644 --- a/cobbler/action_sync.py +++ b/cobbler/action_sync.py @@ -35,7 +35,7 @@ import item_system from Cheetah.Template import Template -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ class BootSync: diff --git a/cobbler/action_validate.py b/cobbler/action_validate.py index f898478d..8ede60c8 100644 --- a/cobbler/action_validate.py +++ b/cobbler/action_validate.py @@ -15,7 +15,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. import os import re import sub_process -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ class Validate: diff --git a/cobbler/api.py b/cobbler/api.py index 54c315be..0eacb788 100644 --- a/cobbler/api.py +++ b/cobbler/api.py @@ -29,7 +29,7 @@ import module_loader import logging import os import fcntl -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ ERROR = 100 INFO = 10 diff --git a/cobbler/cobbler.py b/cobbler/cobbler.py index c02302e3..c1642447 100755 --- a/cobbler/cobbler.py +++ b/cobbler/cobbler.py @@ -23,7 +23,7 @@ import optparse import commands from cexceptions import * -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ I18N_DOMAIN = "cobbler" #################################################### @@ -31,7 +31,6 @@ I18N_DOMAIN = "cobbler" class BootCLI: def __init__(self): - textdomain(I18N_DOMAIN) self.api = api.BootAPI() self.loader = commands.FunctionLoader() climods = self.api.get_modules_in_category("cli") diff --git a/cobbler/cobblerd.py b/cobbler/cobblerd.py index 5640aec0..8859e034 100644 --- a/cobbler/cobblerd.py +++ b/cobbler/cobblerd.py @@ -16,7 +16,7 @@ import time import os import SimpleXMLRPCServer import glob -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ import xmlrpclib from server import xmlrpclib2 diff --git a/cobbler/collection.py b/cobbler/collection.py index e63c3ca9..1b509f20 100644 --- a/cobbler/collection.py +++ b/cobbler/collection.py @@ -25,7 +25,7 @@ import item_profile import item_distro import item_repo -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ class Collection(serializable.Serializable): diff --git a/cobbler/collection_distros.py b/cobbler/collection_distros.py index f78dd64e..5857b9aa 100644 --- a/cobbler/collection_distros.py +++ b/cobbler/collection_distros.py @@ -18,7 +18,7 @@ import collection import item_distro as distro from cexceptions import * import action_litesync -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ class Distros(collection.Collection): diff --git a/cobbler/collection_profiles.py b/cobbler/collection_profiles.py index f00a8dca..139c94e8 100644 --- a/cobbler/collection_profiles.py +++ b/cobbler/collection_profiles.py @@ -20,7 +20,7 @@ import utils import collection from cexceptions import * import action_litesync -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ #-------------------------------------------- diff --git a/cobbler/collection_repos.py b/cobbler/collection_repos.py index 44bef2ad..91e06679 100644 --- a/cobbler/collection_repos.py +++ b/cobbler/collection_repos.py @@ -18,7 +18,7 @@ import item_repo as repo import utils import collection from cexceptions import * -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ TESTMODE = False diff --git a/cobbler/collection_systems.py b/cobbler/collection_systems.py index 140a9818..8a967bee 100644 --- a/cobbler/collection_systems.py +++ b/cobbler/collection_systems.py @@ -18,7 +18,7 @@ import utils import collection from cexceptions import * import action_litesync -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ #-------------------------------------------- diff --git a/cobbler/commands.py b/cobbler/commands.py index 2dc627b8..7a6a25b7 100644 --- a/cobbler/commands.py +++ b/cobbler/commands.py @@ -14,7 +14,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. import optparse from cexceptions import * -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ import sys HELP_FORMAT = "%-20s%s" diff --git a/cobbler/config.py b/cobbler/config.py index 258b241e..4a1b9a47 100644 --- a/cobbler/config.py +++ b/cobbler/config.py @@ -29,7 +29,7 @@ import modules.serializer_yaml as serializer_yaml import settings import serializer -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ class Config: diff --git a/cobbler/item.py b/cobbler/item.py index 249a50c2..2549dcea 100644 --- a/cobbler/item.py +++ b/cobbler/item.py @@ -16,7 +16,7 @@ import exceptions import serializable import utils from cexceptions import * -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ class Item(serializable.Serializable): diff --git a/cobbler/item_distro.py b/cobbler/item_distro.py index 98eaae71..1e392a5e 100644 --- a/cobbler/item_distro.py +++ b/cobbler/item_distro.py @@ -20,7 +20,7 @@ import weakref import os from cexceptions import * -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ class Distro(item.Item): diff --git a/cobbler/item_profile.py b/cobbler/item_profile.py index 2e3a5391..a352ce18 100644 --- a/cobbler/item_profile.py +++ b/cobbler/item_profile.py @@ -16,7 +16,7 @@ import utils import item from cexceptions import * -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ class Profile(item.Item): diff --git a/cobbler/item_repo.py b/cobbler/item_repo.py index 1ebea30b..f9e97141 100644 --- a/cobbler/item_repo.py +++ b/cobbler/item_repo.py @@ -15,7 +15,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. import utils import item from cexceptions import * -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ class Repo(item.Item): diff --git a/cobbler/item_system.py b/cobbler/item_system.py index 975a6d23..73eda71d 100644 --- a/cobbler/item_system.py +++ b/cobbler/item_system.py @@ -15,7 +15,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. import utils import item from cexceptions import * -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ class System(item.Item): diff --git a/cobbler/module_loader.py b/cobbler/module_loader.py index b695a04e..d584ce3f 100644 --- a/cobbler/module_loader.py +++ b/cobbler/module_loader.py @@ -19,7 +19,7 @@ import distutils.sysconfig import os import sys import glob -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ import ConfigParser MODULE_CACHE = {} diff --git a/cobbler/modules/authn_configfile.py b/cobbler/modules/authn_configfile.py index ffe87a70..be453be0 100644 --- a/cobbler/modules/authn_configfile.py +++ b/cobbler/modules/authn_configfile.py @@ -17,7 +17,7 @@ import distutils.sysconfig import ConfigParser import sys import os -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ import md5 import traceback diff --git a/cobbler/modules/authn_kerberos.py b/cobbler/modules/authn_kerberos.py index 7f85db65..46c01ada 100644 --- a/cobbler/modules/authn_kerberos.py +++ b/cobbler/modules/authn_kerberos.py @@ -30,7 +30,7 @@ import distutils.sysconfig import ConfigParser import sys import os -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ import md5 import traceback # since sub_process isn't available on older OS's @@ -58,7 +58,7 @@ def authenticate(api_handle,username,password): Uses cobbler_auth_helper """ - realm = self.api.settings().kerberos_realm + realm = api_handle.settings().kerberos_realm api_handle.logger.debug("authenticating %s against %s" % (username,realm)) rc = subprocess.call([ diff --git a/cobbler/modules/authn_ldap.py b/cobbler/modules/authn_ldap.py index cec913b1..eef4b2a2 100644 --- a/cobbler/modules/authn_ldap.py +++ b/cobbler/modules/authn_ldap.py @@ -14,7 +14,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. import distutils.sysconfig import sys import os -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ import md5 import traceback import ldap diff --git a/cobbler/modules/authz_allowall.py b/cobbler/modules/authz_allowall.py index 1b056301..10d4b17d 100644 --- a/cobbler/modules/authz_allowall.py +++ b/cobbler/modules/authz_allowall.py @@ -16,7 +16,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. import distutils.sysconfig import ConfigParser import sys -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ plib = distutils.sysconfig.get_python_lib() mod_path="%s/cobbler" % plib diff --git a/cobbler/modules/authz_configfile.py b/cobbler/modules/authz_configfile.py index c1837218..84343e28 100644 --- a/cobbler/modules/authz_configfile.py +++ b/cobbler/modules/authz_configfile.py @@ -16,7 +16,7 @@ import distutils.sysconfig import ConfigParser import sys import os -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ plib = distutils.sysconfig.get_python_lib() mod_path="%s/cobbler" % plib diff --git a/cobbler/modules/authz_ownership.py b/cobbler/modules/authz_ownership.py index 1fe25a9d..fbd00f92 100644 --- a/cobbler/modules/authz_ownership.py +++ b/cobbler/modules/authz_ownership.py @@ -19,7 +19,7 @@ import distutils.sysconfig import ConfigParser import sys import os -from rhpl.translate import _, N_, textdomain, utf8 +from cobbler.utils import _ plib = distutils.sysconfig.get_python_lib() mod_path="%s/cobbler" % plib diff --git a/cobbler/modules/cli_distro.py b/cobbler/modules/cli_distro.py index 8c7b70f2..4d86448b 100644 --- a/cobbler/modules/cli_distro.py +++ b/cobbler/modules/cli_distro.py @@ -19,7 +19,7 @@ plib = distutils.sysconfig.get_python_lib() mod_path="%s/cobbler" % plib sys.path.insert(0, mod_path) -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ import commands import cexceptions diff --git a/cobbler/modules/cli_misc.py b/cobbler/modules/cli_misc.py index ebbba477..0fd44a6d 100644 --- a/cobbler/modules/cli_misc.py +++ b/cobbler/modules/cli_misc.py @@ -19,7 +19,7 @@ plib = distutils.sysconfig.get_python_lib() mod_path="%s/cobbler" % plib sys.path.insert(0, mod_path) -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ import commands from cexceptions import * HELP_FORMAT = commands.HELP_FORMAT diff --git a/cobbler/modules/cli_profile.py b/cobbler/modules/cli_profile.py index 0bf4b8ce..b543b804 100644 --- a/cobbler/modules/cli_profile.py +++ b/cobbler/modules/cli_profile.py @@ -19,7 +19,7 @@ plib = distutils.sysconfig.get_python_lib() mod_path="%s/cobbler" % plib sys.path.insert(0, mod_path) -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ import commands import cexceptions diff --git a/cobbler/modules/cli_repo.py b/cobbler/modules/cli_repo.py index e8ec04a4..a567d2d4 100644 --- a/cobbler/modules/cli_repo.py +++ b/cobbler/modules/cli_repo.py @@ -19,7 +19,7 @@ plib = distutils.sysconfig.get_python_lib() mod_path="%s/cobbler" % plib sys.path.insert(0, mod_path) -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ import commands import cexceptions diff --git a/cobbler/modules/cli_system.py b/cobbler/modules/cli_system.py index 34c88869..976c3805 100644 --- a/cobbler/modules/cli_system.py +++ b/cobbler/modules/cli_system.py @@ -19,7 +19,7 @@ plib = distutils.sysconfig.get_python_lib() mod_path="%s/cobbler" % plib sys.path.insert(0, mod_path) -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ import commands import cexceptions diff --git a/cobbler/modules/serializer_shelve.py b/cobbler/modules/serializer_shelve.py index 246a92aa..09495dd5 100644 --- a/cobbler/modules/serializer_shelve.py +++ b/cobbler/modules/serializer_shelve.py @@ -24,7 +24,7 @@ import os import sys import glob import traceback -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ import os import shelve import time diff --git a/cobbler/modules/serializer_yaml.py b/cobbler/modules/serializer_yaml.py index 6425bd17..724265da 100644 --- a/cobbler/modules/serializer_yaml.py +++ b/cobbler/modules/serializer_yaml.py @@ -21,7 +21,7 @@ plib = distutils.sysconfig.get_python_lib() mod_path="%s/cobbler" % plib sys.path.insert(0, mod_path) -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ import utils import yaml # Howell-Clark version import cexceptions diff --git a/cobbler/remote.py b/cobbler/remote.py index d9f937b0..f7e2226b 100644 --- a/cobbler/remote.py +++ b/cobbler/remote.py @@ -18,7 +18,7 @@ import socket import time import os import SimpleXMLRPCServer -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ import xmlrpclib import random import base64 diff --git a/cobbler/serializable.py b/cobbler/serializable.py index ba8f0156..ad9e64e1 100644 --- a/cobbler/serializable.py +++ b/cobbler/serializable.py @@ -13,7 +13,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. """ -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ import exceptions class Serializable: diff --git a/cobbler/serializer.py b/cobbler/serializer.py index ae9f18cf..25d0d60d 100644 --- a/cobbler/serializer.py +++ b/cobbler/serializer.py @@ -15,7 +15,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. import errno import os -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ import fcntl from cexceptions import * diff --git a/cobbler/settings.py b/cobbler/settings.py index c201ddd1..bc168355 100644 --- a/cobbler/settings.py +++ b/cobbler/settings.py @@ -14,7 +14,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. import serializable import utils -from rhpl.translate import _, N_, textdomain, utf8 +from utils import _ TESTMODE = False diff --git a/cobbler/utils.py b/cobbler/utils.py index 4d2b635c..87577626 100644 --- a/cobbler/utils.py +++ b/cobbler/utils.py @@ -22,7 +22,11 @@ import shutil import string import traceback from cexceptions import * -from rhpl.translate import _, N_, textdomain, utf8 + +#placeholder for translation +def _(foo): + return foo + MODULE_CACHE = {} diff --git a/cobbler/webui/master.py b/cobbler/webui/master.py index 8f7de662..3e0c2fb6 100644 --- a/cobbler/webui/master.py +++ b/cobbler/webui/master.py @@ -31,12 +31,12 @@ VFFSL=valueFromFrameOrSearchList VFSL=valueFromSearchList VFN=valueForName currentTime=time.time -__CHEETAH_version__ = '2.0.1' -__CHEETAH_versionTuple__ = (2, 0, 1, 'final', 0) -__CHEETAH_genTime__ = 1207686192.9310019 -__CHEETAH_genTimestamp__ = 'Tue Apr 8 16:23:12 2008' +__CHEETAH_version__ = '2.0rc7' +__CHEETAH_versionTuple__ = (2, 0, 0, 'candidate', 7) +__CHEETAH_genTime__ = 1207768044.4095509 +__CHEETAH_genTimestamp__ = 'Wed Apr 9 21:07:24 2008' __CHEETAH_src__ = 'webui_templates/master.tmpl' -__CHEETAH_srcLastModified__ = 'Fri Feb 15 14:47:43 2008' +__CHEETAH_srcLastModified__ = 'Wed Apr 9 21:03:21 2008' __CHEETAH_docstring__ = 'Autogenerated by CHEETAH: The Python-Powered Template Engine' if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple: @@ -158,20 +158,16 @@ class master(Template): <li><a href="''') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 35, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 35, col 22. - write('''?mode=distro_list" class="menu">Distros</a></li> - <li><a href="''') + write('?mode=distro_list" class="menu">Distros</a></li>\n <li><a href="') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 36, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 36, col 22. - write('''?mode=profile_list" class="menu">Profiles</a></li> - <li><a href="''') + write('?mode=profile_list" class="menu">Profiles</a></li>\n <li><a href="') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 37, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 37, col 22. - write('''?mode=system_list" class="menu">Systems</a></li> - <li><a href="''') + write('?mode=system_list" class="menu">Systems</a></li>\n <li><a href="') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 38, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 38, col 22. - write('''?mode=ksfile_list" class="menu">Kickstarts</a></li> - <li><a href="''') + write('?mode=ksfile_list" class="menu">Kickstarts</a></li>\n <li><a href="') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 39, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 39, col 22. write('''?mode=repo_list" class="menu">Repos</a></li> @@ -180,25 +176,19 @@ class master(Template): <li><a href="''') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 42, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 42, col 22. - write('''?mode=distro_edit" class="menu">Distro</a></li> - <li><a href="''') + write('?mode=distro_edit" class="menu">Distro</a></li>\n <li><a href="') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 43, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 43, col 22. - write('''?mode=profile_edit" class="menu">Profile</a></li> - <li><a href="''') + write('?mode=profile_edit" class="menu">Profile</a></li>\n <li><a href="') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 44, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 44, col 22. - write('''?mode=subprofile_edit" class="menu">Subprofile</a></li> - <li><a href="''') + write('?mode=subprofile_edit" class="menu">Subprofile</a></li>\n <li><a href="') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 45, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 45, col 22. - write('''?mode=system_edit" class="menu">System</a></li> - <li><a href="''') + write('?mode=system_edit" class="menu">System</a></li>\n <li><a href="') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 46, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 46, col 22. - write('''?mode=repo_edit" class="menu">Repo</a></li> - <li><hr/><br/></li> - <li><a class="button sync" href="''') + write('?mode=repo_edit" class="menu">Repo</a></li>\n <li><hr/><br/></li>\n <li><a class="button sync" href="') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 48, col 42 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 48, col 42. write('''?mode=sync">Sync</a></li> diff --git a/tests/tests.py b/tests/tests.py index 4060eef1..8536a701 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -813,15 +813,15 @@ class TestListings(BootTest): self.assertTrue(len(self.api.profiles().printable()) > 0) self.assertTrue(len(self.api.distros().printable()) > 0) -class TestCLIBasic(BootTest): - - def test_cli(self): - # just invoke the CLI to increase coverage and ensure - # nothing major is broke at top level. Full CLI command testing - # is not included (yet) since the API tests hit that fairly throughly - # and it would easily double the length of the tests. - app = "/usr/bin/python" - self.assertTrue(subprocess.call([app,"cobbler/cobbler.py","list"]) == 0) +#class TestCLIBasic(BootTest): +# +# def test_cli(self): +# # just invoke the CLI to increase coverage and ensure +# # nothing major is broke at top level. Full CLI command testing +# # is not included (yet) since the API tests hit that fairly throughly +# # and it would easily double the length of the tests. +# app = "/usr/bin/python" +# self.assertTrue(subprocess.call([app,"cobbler/cobbler.py","list"]) == 0) if __name__ == "__main__": if not os.path.exists("setup.py"): |