CkString Ruby Reference Documentation

CkString

Current Version: 9.5.0.73

The Chilkat string class.

Object Creation

obj = Chilkat::CkString.new()

Properties

NumArabic
# intVal is an integer
intVal = ckString.get_NumArabic();
Introduced in version 9.5.0.25

The number of Arabic characters contained in this string.

top
NumAscii
# intVal is an integer
intVal = ckString.get_NumAscii();
Introduced in version 9.5.0.25

The number of us-ascii characters contained in this string.

top
NumCentralEuro
# intVal is an integer
intVal = ckString.get_NumCentralEuro();
Introduced in version 9.5.0.25

The number of Central European and Eastern European characters found in this string. These are characters specific to Polish, Czech, Slovak, Hungarian, Slovene, Croatian, Serbian (Latin script), Romanian and Albanian.

top
NumChinese
# intVal is an integer
intVal = ckString.get_NumChinese();
Introduced in version 9.5.0.25

The number of Chinese characters contained in this string.

top
NumCyrillic
# intVal is an integer
intVal = ckString.get_NumCyrillic();
Introduced in version 9.5.0.25

The number of Cyrillic characters contained in this string. The Cyrillic alphabet also called azbuka, from the old name of the first two letters) is actually a family of alphabets, subsets of which are used by certain East and South Slavic languages "” Belarusian, Bulgarian, Macedonian, Russian, Rusyn, Serbian and Ukrainian"”as well as many other languages of the former Soviet Union, Asia and Eastern Europe.

top
NumGreek
# intVal is an integer
intVal = ckString.get_NumGreek();
Introduced in version 9.5.0.25

The number of Greek characters contained in this string.

top
NumHebrew
# intVal is an integer
intVal = ckString.get_NumHebrew();
Introduced in version 9.5.0.25

The number of Hebrew characters contained in this string.

top
NumJapanese
# intVal is an integer
intVal = ckString.get_NumJapanese();
Introduced in version 9.5.0.25

The number of Japanese characters contained in this string.

top
NumKorean
# intVal is an integer
intVal = ckString.get_NumKorean();
Introduced in version 9.5.0.25

The number of Korean characters contained in this string.

top
NumLatin
# intVal is an integer
intVal = ckString.get_NumLatin();
Introduced in version 9.5.0.25

The number of Latin characters contained in this string. Latin characters include all major Western European languages, such as German, Spanish, French, Italian, Nordic languages, etc.

top
NumThai
# intVal is an integer
intVal = ckString.get_NumThai();
Introduced in version 9.5.0.25

The number of Thai characters contained in this string.

top

Methods

append
# str is a string
ckString.append(str);

The str is appended to end of this instance.

top
appendAnsi
# str is a string
ckString.appendAnsi(str);

Appends an ANSI string to the end of this instance. str should always be a null terminated ANSI string regardless of the Utf8 property setting.

top
appendChar
# c is a char
ckString.appendChar(c);

Appends a single ANSI character to the end of this instance.

top
appendCurrentDateRfc822
ckString.appendCurrentDateRfc822();

Appends the current date/time to the end of this instance. The date/time is formatted according to the RFC822 standard, which is the typical format used in the "Date" header field of email. For example: "Fri, 27 Jul 2012 17:41:41 -0500"

top
appendEnc
# str is a string
# charsetEncoding is a string
ckString.appendEnc(str, charsetEncoding);

Appends a string of any character encoding to the end of this instance. Examples of charsetEncoding are: Shift_JIS, windows-1255, iso-8859-2, gb2312, etc. The str should point to a null-terminated string that uses the charset specified by charsetEncoding.

More Information and Examples
top
appendHexData
# byteData is binary data
# numBytes is an integer
ckString.appendHexData(byteData, numBytes);

Converts the binary data to a hexidecimal string representation and appends to the end of this instance.

top
appendInt
# n is an integer
ckString.appendInt(n);

Appends the decimal string representation of an integer to the end of this instance.

top
appendN
# str is a string
# numBytes is an integer
ckString.appendN(str, numBytes);

Appends N bytes of character data to the end of this instance. If the Utf8 property is set to true, then str should point to characters in the utf-8 encoding, otherwise it should point to characters using the ANSI encoding. Note: numBytes is not necessarily the number of characters. It is the length, in bytes, of the string to be appended. This method exists to allow for non-null terminated strings to be appended.

top
appendNU
# wideStr is a utf-16 string
# numChars is an integer
ckString.appendNU(wideStr, numChars);

Append N Unicode characters to the end of this instance. The wideStr points to the 2-byte per char Unicode string. The numChars is the number of Unicode characters to be appended (not the number of bytes).

top
appendRandom
# numBytes is an integer
# encoding is a string
ckString.appendRandom(numBytes, encoding);

Appends numBytes random bytes to the end of this instance. Because arbitrary byte values in the range 0 to 255 do not necessarily represent valid characters, the bytes must be encoded to a string friendly representation such as hex, base64, etc. The encoding specifies the encoding to be used. Possible values are "hex", "base64", "quoted-printable", "asc", or "url".

top
appendStr
# strObj is a CkString
ckString.appendStr(strObj);

Appends the contents of strObj to the end of this instance.

top
appendU
# unicode is a utf-16 string
ckString.appendU(unicode);

Append a Unicode string to the CkString object.

top
appendUtf8
# str is a string
ckString.appendUtf8(str);

Appends a utf-8 string to the existing contents of this instance. str should always be a null terminated utf-8 string regardless of the Utf8 property setting.

top
base64Decode
# charsetEncoding is a string
ckString.base64Decode(charsetEncoding);

In-place base64 decodes the string and inteprets the results according to the character encoding specified.

More Information and Examples
top
base64DecodeW
# charsetEncoding is a utf-16 string
ckString.base64DecodeW(charsetEncoding);

The utf-16 version of base64Decode.

top
base64Encode
# charsetEncoding is a string
ckString.base64Encode(charsetEncoding);

In-place base64 encodes the string. Internally, the string is first converted to the character encoding specified and then base-64 encoded. Typical charsetEncoding values are "utf-8", "ANSI", "iso-8859-1", etc.

More Information and Examples
top
base64EncodeW
# charsetEncoding is a utf-16 string
ckString.base64EncodeW(charsetEncoding);

The utf-16 version of base64Encode.

top
beginsWith
# substr is a string
retBool = ckString.beginsWith(substr);

Return true if this string begins with substr (case sensitive), otherwise returns false.

top
beginsWithStr
# strObj is a CkString
retBool = ckString.beginsWithStr(strObj);

Returns true if the string begins with the contents of strObj. Otherwise returns false. This method is case sensitive.

top
beginsWithW
# str is a utf-16 string
retBool = ckString.beginsWithW(str);

The utf-16 version of beginsWith.

top
charAt
# idx is an integer
retChar = ckString.charAt(idx);

Returns the ANSI character at a specified index.The first character is at index 0.

top
charAtU
# idx is an integer
utf16_char = ckString.charAtU(idx);

Return the Nth character as a Unicode character.

top
chopAtFirstChar
# ch is a char
ckString.chopAtFirstChar(ch);

Finds the first occurrence of ch and discards the characters at and following ch.

top
chopAtStr
# subStrObj is a CkString
ckString.chopAtStr(subStrObj);

Finds the first occurrence of a substring and chops it at that point. The result is that the substring and all subsequent characters are removed from the string.

top
clear
ckString.clear();

Clears the string. The string contains 0 characters after calling this method.

top
clone
# returns a CkString
ret_ckString = ckString.clone();

Creates a copy of the string. As with any newly created Chilkat object instance returned by a Chilkat method, the returned CkString object must be deleted by the calling application.

Returns nil on failure

top
compareStr
# str is a CkString
retInt = ckString.compareStr(str);

Compare two strings. A return value = 0 means they are equal. Return value = 1 indicates that calling object is lexicographically less than argument. Return value = -1 indicates that calling object is lexicographically greater than argument.

top
containsSubstring
# substr is a string
retBool = ckString.containsSubstring(substr);

Returns true if the string contains the specified substring, otherwise returns false. The string comparison is case-sensitive.

top
containsSubstringNoCase
# substr is a string
retBool = ckString.containsSubstringNoCase(substr);

Same as containsSubstring except the matching is case insensitive.

top
containsSubstringNoCaseW
# substr is a utf-16 string
retBool = ckString.containsSubstringNoCaseW(substr);

The utf-16 version of containsSubstringNoCase.

top
containsSubstringW
# substr is a utf-16 string
retBool = ckString.containsSubstringW(substr);

The utf-16 version of containsSubstring.

top
countCharOccurances
# ch is a char
retInt = ckString.countCharOccurances(ch);

Returns the number of occurrences of the specified ANSI char.

top
decodeXMLSpecial
ckString.decodeXMLSpecial();

Decodes XML special characters. For example, < is converted to '<'

top
doubleValue
retDouble = ckString.doubleValue();

Converts the string to a double and returns the value.

top
eliminateChar
# ansiChar is a char
# startIndex is an integer
ckString.eliminateChar(ansiChar, startIndex);

Eliminate all occurrences of a particular ANSI character.

top
encodeXMLSpecial
ckString.encodeXMLSpecial();

Encodes XML special characters. For example, '<' is converted to <

top
endsWith
# substr is a string
retBool = ckString.endsWith(substr);

Returns true if the string ends with substr (case-sensitive). Otherwise returns false.

top
endsWithStr
# substrObj is a CkString
retBool = ckString.endsWithStr(substrObj);

Returns true if the string ends with the specified substring, otherwise returns false.

top
endsWithW
# s is a utf-16 string
retBool = ckString.endsWithW(s);

The utf-16 version of endsWith.

top
entityDecode
ckString.entityDecode();

Decodes any HTML entities found within the string, replacing them with the characters represented.

top
entityEncode
ckString.entityEncode();

HTML encodes any characters that are special to HTML or cannot be represented by 7-bit us-ascii.

top
equals
# str is a string
retBool = ckString.equals(str);

Returns true if the strings are equal, otherwise returns false. (case-sensitive)

top
equalsIgnoreCase
# str is a string
retBool = ckString.equalsIgnoreCase(str);

Returns true if the strings are equal, otherwise returns false. (case-insensitive)

top
equalsIgnoreCaseStr
# strObj is a CkString
retBool = ckString.equalsIgnoreCaseStr(strObj);

Returns true if the strings are equal, otherwise returns false (case-insensitive)

top
equalsIgnoreCaseW
# s is a utf-16 string
retBool = ckString.equalsIgnoreCaseW(s);

The utf-16 version of equalsIgnoreCase.

top
equalsStr
# strObj is a CkString
retBool = ckString.equalsStr(strObj);

Returns true if the strings are equal, otherwise returns false. (case-sensitive)

top
equalsW
# s is a utf-16 string
retBool = ckString.equalsW(s);

The utf-16 version of the "equals" method.

top
getChar
# returns a CkString
# idx is an integer
ret_ckString = ckString.getChar(idx);

Returns a new CkString object containing the Nth character. (Note, it does not contain the Nth byte, but the Nth character.) For languages such as Chinese, Japanese, etc. individual characters are represented by multiple or varying number of bytes.

Returns nil on failure

top
getNumChars
retInt = ckString.getNumChars();

Returns the number of characters in the string.

top
getSizeAnsi
retInt = ckString.getSizeAnsi();

Returns the size, in bytes, of the ANSI encoding of the string.

top
getSizeUnicode
retInt = ckString.getSizeUnicode();

Returns the size, in bytes, of the Unicode encoding of the string.

top
getSizeUtf8
retInt = ckString.getSizeUtf8();

Returns the size, in bytes, of the utf-8 encoding of the string.

top
getUnicode
utf16_text = ckString.getUnicode();

Return a pointer to memory containing the string in Unicode.

top
hexDecode
# charsetEncoding is a string
ckString.hexDecode(charsetEncoding);

Hex decodes a string and inteprets the bytes according to the character encoding specified.

More Information and Examples
top
hexDecodeW
# charsetEncoding is a utf-16 string
ckString.hexDecodeW(charsetEncoding);

The utf-16 version of hexDecode.

top
hexEncode
# charsetEncoding is a string
ckString.hexEncode(charsetEncoding);

Converts the string to the character encoding specified and replaces the string contents with the hex encoding of the character data.

More Information and Examples
top
hexEncodeW
# charsetEncoding is a utf-16 string
ckString.hexEncodeW(charsetEncoding);

The utf-16 version of hexEncode.

top
indexOf
# substr is a string
retInt = ckString.indexOf(substr);

Returns the index of the first occurrence of a substring. Returns -1 if not found.

top
indexOfStr
# substrObj is a CkString
retInt = ckString.indexOfStr(substrObj);

Returns the index of the first occurrence of a substring. Returns -1 if not found.

top
indexOfW
# s is a utf-16 string
retInt = ckString.indexOfW(s);

The utf-16 version of "indexOf".

top
intValue
retInt = ckString.intValue();

Converts the string to an integer and returns the integer value.

top
isEmpty
retBool = ckString.isEmpty();

Returns true if the string object is empty, otherwise returns false.

top
lastChar
retChar = ckString.lastChar();

Returns the last ANSI character in the string.

top
loadFile
# path is a string
# charsetEncoding is a string
status = ckString.loadFile(path, charsetEncoding);

Load the contents of a text file into the CkString object. The string is cleared before loading. The character encoding of the text file is specified by charsetEncoding. This method allows for text files in any charset to be loaded: utf-8, Unicode, Shift_JIS, iso-8859-1, etc.

Returns true for success, false for failure.

More Information and Examples
top
loadFileW
# path is a utf-16 string
# charsetEncoding is a utf-16 string
status = ckString.loadFileW(path, charsetEncoding);

The utf-16 version of loadFile.

Returns true for success, false for failure.

top
matches
# strPattern is a string
retBool = ckString.matches(strPattern);

Returns true if the string matches the strPattern, which may contain one or more asterisk wildcard characters. Returns false if the string does not match. This method is case-sensitive.

top
matchesNoCase
# strPattern is a string
retBool = ckString.matchesNoCase(strPattern);

Returns true if the string matches the strPattern, which may contain one or more asterisk wildcard characters. Returns false if the string does not match. This method is case-insensitive.

top
matchesNoCaseW
# s is a utf-16 string
retBool = ckString.matchesNoCaseW(s);

The utf-16 version of matchesNoCase.

top
matchesStr
# strPatternObj is a CkString
retBool = ckString.matchesStr(strPatternObj);

Returns true if the string matches a pattern, otherwise returns false. The pattern may contain any number of wildcard '*' characters which represent 0 or more occurrences of any character. This method is case-sensitive.

top
matchesW
# s is a utf-16 string
retBool = ckString.matchesW(s);

The utf-16 version of the "matches" method.

top
minimizeMemory
ckString.minimizeMemory();

Minimizes the amount of memory consumed by this object. For example, consider the following: A CkString object is loaded with the contents of a text file. The "replaceAllOccurances" method is called, replacing longer substrings with shorter replacements. The actual string length will become shorter than the internal buffer space that is allocated. The minimizeMemory method will, if necessary, allocate a new internal buffer that is exactly the size needed to hold the current contents of the string, copy the string to the new internal buffer, and deallocate the old buffer.

top
obfuscate
ckString.obfuscate();

Obfuscates the string. (The unobfuscate method can be called to reverse the obfuscation to restore the original string.)

The Chilkat string obfuscation algorithm works by taking the utf-8 bytes of the string, base64 encoding it, and then scrambling the letters of the base64 encoded string. It is deterministic in that the same string will always obfuscate to the same result. It is not a secure way of encrypting a string. It is only meant to be a simple means of transforming a string into something unintelligible.

top
prepend
# str is a string
ckString.prepend(str);

Prepends str to this instance.

top
prependW
# s is a utf-16 string
ckString.prependW(s);

The utf-16 version of the "prepend" method.

top
punyDecode
ckString.punyDecode();
Introduced in version 9.5.0.52

In-place decodes the string from punycode.

More Information and Examples
top
punyEncode
ckString.punyEncode();
Introduced in version 9.5.0.52

In-place encodes the string to punycode.

More Information and Examples
top
qpDecode
# charsetEncoding is a string
ckString.qpDecode(charsetEncoding);

Quoted-printable decodes the string and interprets the resulting character data according to the specified character encoding. The result is that the quoted-printable string is in-place decoded.

More Information and Examples
top
qpDecodeW
# charset is a utf-16 string
ckString.qpDecodeW(charset);

The utf-16 version of the qpDecode method.

top
qpEncode
# charsetEncoding is a string
ckString.qpEncode(charsetEncoding);

Quoted-printable encodes the string. The string is first converted to the charset specified, and those bytes are QP-encoded. The contents of the string are replaced with the QP-encoded result.

More Information and Examples
top
qpEncodeW
# charset is a utf-16 string
ckString.qpEncodeW(charset);

The utf-16 version of the qpEncode method.

top
removeAll
# substr is a CkString
retInt = ckString.removeAll(substr);

Removes all occurrences of substr.

top
removeCharOccurances
# ch is a char
ckString.removeCharOccurances(ch);

Removes all occurrences of a specific ANSI character from the string.

top
removeChunk
# charStartPos is an integer
# numChars is an integer
ckString.removeChunk(charStartPos, numChars);

Removes a chunk of characters specified by starting index and length.

top
removeDelimited
# beginDelim is a string
# endDelim is a string
# caseSensitive is a boolean
ckString.removeDelimited(beginDelim, endDelim, caseSensitive);
Introduced in version 9.5.0.52

Remove all occurrences of strings delimited by beginDelim and endDelim. Also removes the delimiters.

top
removeFirst
# substr is a CkString
retBool = ckString.removeFirst(substr);

Removes the first occurrence of a substring.

top
replaceAll
# findStrObj is a CkString
# replaceStrObj is a CkString
retInt = ckString.replaceAll(findStrObj, replaceStrObj);

Replaces all occurrences of a substring with another. The replacement string is allowed to be empty or different in length.

top
replaceAllOccurances
# findStr is a string
# replaceStr is a string
retInt = ckString.replaceAllOccurances(findStr, replaceStr);

Replaces all occurrences of a substring with another substring. The replacement string is allowed to be empty or different in length.

top
replaceAllOccurancesW
# pattern is a utf-16 string
# replacement is a utf-16 string
retInt = ckString.replaceAllOccurancesW(pattern, replacement);

The utf-16 version of the replaceAllOccurances method.

top
replaceChar
# findCh is a char
# replaceCh is a char
ckString.replaceChar(findCh, replaceCh);

Replaces all occurrences of a specified ANSI character with another.

top
replaceFirst
# findStrObj is a CkString
# replaceStrObj is a CkString
retBool = ckString.replaceFirst(findStrObj, replaceStrObj);

Replaces the first occurrence of a substring with another. The replacement string is allowed to be empty or different in length.

top
replaceFirstOccurance
# findStr is a string
# replaceStr is a string
retBool = ckString.replaceFirstOccurance(findStr, replaceStr);

Replaces the first occurrence of a substring with another. The replacement string is allowed to be empty or different in length. (Chilkat is aware of the misspelling of the word "occurrence", but unfortunately it is too late to change..)

top
replaceFirstOccuranceW
# pattern is a utf-16 string
# replacement is a utf-16 string
retBool = ckString.replaceFirstOccuranceW(pattern, replacement);

The utf-16 version of replaceFirstOccurrance. (Chilkat is aware of the misspelling of the word "occurrence", but unfortunately it is too late to change..)

top
saveToFile
# path is a string
# charsetEncoding is a string
status = ckString.saveToFile(path, charsetEncoding);

Saves the string to a file using the character encoding specified by charsetEncoding. If a file of the same name exists, it is overwritten. For charsets such as "utf-8", "utf-16", or others that have a possible BOM/preamble, the preamble is output by default. To exclude the BOM/preamble, prepend "no-bom-" to the charset name. For example "no-bom-utf-8".

Returns true for success, false for failure.

More Information and Examples
top
saveToFileW
# path is a utf-16 string
# charset is a utf-16 string
status = ckString.saveToFileW(path, charset);

The utf-16 version of the saveToFile method.

Returns true for success, false for failure.

top
setStr
# s is a CkString
ckString.setStr(s);

Replaces the contents of the string with another.

top
setString
# str is a string
ckString.setString(str);

Clears the contents of this instance and appends str.

top
setStringAnsi
# s is a string
ckString.setStringAnsi(s);

Set the CkString object from an ANSI string.

top
setStringU
# unicode is a utf-16 string
ckString.setStringU(unicode);

Set the CkString object from a Unicode string.

top
setStringUtf8
# s is a string
ckString.setStringUtf8(s);

Set the string object from a utf-8 string.

top
shorten
# n is an integer
ckString.shorten(n);

Discards the last N characters.

top
split
# returns a CkStringArray
# delimiterChar is a char
# exceptDoubleQuoted is a boolean
# exceptEscaped is a boolean
# keepEmpty is a boolean
ret_stringArray = ckString.split(delimiterChar, exceptDoubleQuoted, exceptEscaped, keepEmpty);

Splits a string into a collection of strings using a delimiter character. If exceptEscaped is true, then delimiter chars escaped with a backslash are ignored. If exceptDoubleQuoted is true, then delimiter chars inside quotes are ignored. If keepEmpty is false, then empty strings are excluded from being added to the returned CkStringArray object.

Returns nil on failure

top
split2
# returns a CkStringArray
# delimiterChars is a string
# exceptDoubleQuoted is a boolean
# exceptEscaped is a boolean
# keepEmpty is a boolean
ret_stringArray = ckString.split2(delimiterChars, exceptDoubleQuoted, exceptEscaped, keepEmpty);

Same as "split", except a set of characters can be used for delimiters.

Returns nil on failure

top
split2W
# returns a CkStringArray
# splitCharSet is a utf-16 string
# exceptDoubleQuoted is a boolean
# exceptEscaped is a boolean
# keepEmpty is a boolean
ret_stringArray = ckString.split2W(splitCharSet, exceptDoubleQuoted, exceptEscaped, keepEmpty);

The utf-16 version of the split2 method.

Returns nil on failure

top
splitAtWS
# returns a CkStringArray
ret_stringArray = ckString.splitAtWS();

Equivalent to split2(" \t\r\n",true,true,false)

Returns nil on failure

top
substring
# returns a CkString
# startCharIndex is an integer
# numChars is an integer
ret_ckString = ckString.substring(startCharIndex, numChars);

Returns a substring specified by starting character position and number of characters. (The 1st char is at index 0.)

Returns nil on failure

top
toCRLF
ckString.toCRLF();

Converts all line endings to CRLF.

top
tokenize
# returns a CkStringArray
# punctuation is a string
ret_stringArray = ckString.tokenize(punctuation);

Tokenizes a string. The string is split at whitespace characters, and any single punctuation character is returned as a separate token. For example, this string:
CkStringArray *CkString::tokenize(char *punctuation) const

is tokenized to

CkStringArray
*
CkString
:
:
tokenize
(
*
punctuation
)
const

Returns nil on failure

top
tokenizeW
# returns a CkStringArray
# punctuation is a utf-16 string
ret_stringArray = ckString.tokenizeW(punctuation);

The utf-16 version of the "tokenize" method.

Returns nil on failure

top
toLF
ckString.toLF();

Converts all line endings to bare-LF (Unix/Linux style line endings).

top
toLowerCase
ckString.toLowerCase();

Converts the string to lowercase.

top
toUpperCase
ckString.toUpperCase();

Converts the string to uppercase.

top
trim
ckString.trim();

Trim SPACE and Tab characters from both ends of the string.

top
trim2
ckString.trim2();

Trim SPACE, Tab, CR, and LF characters from both ends of the string.

top
trimInsideSpaces
ckString.trimInsideSpaces();

Replaces all tabs, CR's, and LF's, with SPACE chars, and removes extra SPACE's so there are no occurrences of more than one SPACE char in a row.

top
unobfuscate
ckString.unobfuscate();

Unobfuscates the string.

The Chilkat string obfuscation algorithm works by taking the utf-8 bytes of the string, base64 encoding it, and then scrambling the letters of the base64 encoded string. It is deterministic in that the same string will always obfuscate to the same result. It is not a secure way of encrypting a string. It is only meant to be a simple means of transforming a string into something unintelligible.

top
urlDecode
# charsetEncoding is a string
ckString.urlDecode(charsetEncoding);

URL decodes the string and interprets the resulting byte data in the specified charset encoding.

More Information and Examples
top
urlDecodeW
# charsetEncoding is a utf-16 string
ckString.urlDecodeW(charsetEncoding);

The utf-16 version of the urlDecode method.

top
urlEncode
# charsetEncoding is a string
ckString.urlEncode(charsetEncoding);

URL encodes the string. The string is first converted to the specified charset encoding, and those bytes are URL-encoded. The contents of the string are replaced with the URL-encoded result.

More Information and Examples
top
urlEncodeW
# charsetEncoding is a utf-16 string
ckString.urlEncodeW(charsetEncoding);

The utf-16 version of the urlEncode method.

top