#  Licensed to the Apache Software Foundation (ASF) under one or more
#  contributor license agreements.  See the NOTICE file distributed with
#  this work for additional information regarding copyright ownership.
#  The ASF licenses this file to You under the Apache License, Version 2.0
#  (the "License"); you may not use this file except in compliance with
#  the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

# messages for EN locale
luni.00=Connection has not been established yet
luni.01=Could not make SSL Tunneling. Got response: {0} ({1})
luni.02=Hostname <{0}> was not verified
luni.03=The enum constant {0}.{1} is missing
luni.04=this Map
luni.05=Attempt to insert {0} element into collection with element type {1}
luni.06=The string argument is null
luni.07=The stream is corrupted
luni.08=Invalid Unicode sequence: expected format \\uxxxx
luni.09=Invalid Unicode sequence: illegal character
luni.0A=Index: {0}, Size: {1}
luni.0B=Array index out of range: {0}
luni.0C=Socket is closed
luni.0D=SOCKS connection failed\: {0}
luni.0E=Unable to connect to SOCKS server\: {0}
luni.0F=Invalid SOCKS client.
luni.10=Malformed reply from SOCKS server
luni.11=buffer is null
luni.12=Offset out of bounds \: {0}
luni.13=Arguments out of bounds
luni.14=Failure to connect to SOCKS server.
luni.15=Unable to connect to identd to verify user.
luni.16=Failure - user ids do not match.
luni.17=Success
luni.18=Length out of bounds \: {0}
luni.19=the methods named {0} must have the same return type
luni.1A=Host is unresolved\: {0}
luni.1B=url and proxy can not be null
luni.1C=Unable to change directories
luni.1D=Unable to connect to server\: {0}
luni.1E=Could not establish data connection
luni.1F=Unable to retrieve file\: {0}
luni.20=Unable to log into server\: {0}
luni.21=Unable to configure data port
luni.22=Unable to store file
luni.23=Unable to set transfer type
luni.24=Stream is closed
luni.25=Content-Length underflow
luni.26=Content-Length exceeded
luni.27=Cannot access request header fields after connection is set
luni.28=This protocol does not support input
luni.29=Does not support output
luni.2A=can't open OutputStream after reading from an inputStream
luni.2B=This method does not support writing\: {0}
luni.2C=Cannot set method after connection is made
luni.2D=Received HTTP_PROXY_AUTH (407) code while not using proxy
luni.2E=Received authentication challenge is null
luni.2F=Too many redirects
luni.30=Invalid proxy port\: {0}
luni.31=Proxy port out of range
luni.32=Cannot find \!/
luni.33=Inputstream of the JarURLConnection has been closed
luni.34=Jar entry not specified
luni.35=Start index ({0}) is greater than end index ({1})
luni.36=Array index out of range\: {0}
luni.37=Negative index specified
luni.38=Source size {0} does not fit into destination
luni.39=Format specifier '{0}'
luni.3A=Can't find resource for bundle {0}, key {1}
luni.3B=DST offset\: {0}
luni.3C=era\: {0}
luni.3D=month\: {0}
luni.3E=time\: {0}
luni.3F=day of month\: {0}
luni.40=day of week in month\: {0}
luni.41=Timer was cancelled
luni.42=Illegal delay to start the TimerTask
luni.43=TimerTask is scheduled already
luni.44=TimerTask is cancelled
luni.45=Conversion is '{0}'
luni.46=The flags are {0}
luni.47=Invalid UUID string
luni.48=day of week\: {0}
luni.49=SocketAddress {0} not supported
luni.4A=Count out of range
luni.4B={0} incompatible with {1}
luni.4C=Enums may not be cloned
luni.4D=Argument must not be null
luni.4E={0} is not an enum type
luni.4F={0} is not a constant in the enum type {1}
luni.50={0} is not an interface
luni.51={0} is not visible from class loader
luni.52={0} appears more than once
luni.53=non-public interfaces must be in the same package
luni.54=not a proxy instance
luni.55=String index out of range\: {0}
luni.56=Port out of range\: {0}
luni.57=Unresolved address
luni.58=Packet address mismatch with connected address
luni.59=Destination address is null
luni.5A=Zero or negative buffer size
luni.5B=Invalid negative timeout
luni.5C=The factory has already been set
luni.5D=SocketAddress is null
luni.5E=Connection already established
luni.5F=Already connected
luni.60=different mode already set
luni.61=scale value < than zero
luni.62=Illegal IPv6 address
luni.63=Scope id is not found for the given address
luni.64=Invalid IP Address is neither 4 or 16 bytes
luni.65=Invalid IP Address is neither 4 or 16 bytes\: {0}
luni.66=Attempted to join a non-multicast group
luni.67=No addresses associated with Interface
luni.68=address is null
luni.69=Attempted to leave a non-multicast group
luni.6A=Address not associated with an interface - not set
luni.6B=Cannot set network interface with null
luni.6C=TimeToLive out of bounds
luni.6D=interface name is null
luni.6E=Illegal Proxy.Type or SocketAddress argument
luni.6F=Socket is not bound
luni.70=Socket implementation factory already set
luni.71=Socket is already bound
luni.72=Method has not been implemented
luni.73=Proxy is null or invalid type
luni.74=Socket input is shutdown
luni.75=Socket output is shutdown
luni.76=Attempted to set a negative SoLinger
luni.77=Local port declared out of range
luni.78=Socket is not connected
luni.79=Urgent data not supported
luni.7A=Invalid action specified\: {0}
luni.7B=MinPort is greater than MaxPort\: {0}
luni.7C=Invalid port number specified\: {0}
luni.7D=Incomplete % sequence
luni.7E=Invalid % sequence ({0})
luni.7F=Illegal character
luni.80=Incomplete % sequence at\: {0}
luni.81=Invalid % sequence ({0}) at\: {1}
luni.82=Relative path
luni.83=Scheme expected
luni.84=Scheme-specific part expected
luni.85=Illegal character in scheme
luni.86={0} in schemeSpecificPart
luni.87={0} in authority
luni.88={0} in path
luni.89={0} in query
luni.8A={0} in fragment
luni.8B=Invalid port number
luni.8C=Illegal character in userinfo
luni.8D=Expected a closing square bracket for ipv6 address
luni.8E=Malformed ipv6 address
luni.8F=Illegal character in host name
luni.90=Malformed ipv4 address
luni.91=URI is not absolute
luni.92={0} at index {1}\: {2}
luni.93={0}\: {1}
luni.94=One of urls is null
luni.95=field is null
luni.96=Does not support writing to the input stream
luni.97=Does not support writing to the output stream
luni.98=Duplicate Factory
luni.99=Invalid parameter - {0}
luni.9A=Attempt to set factory more than once.
luni.9B=Protocol not found\: {0}
luni.9C=Unknown protocol\: {0}
luni.9D=proxy should not be null
luni.9E=method has not been implemented yet
luni.9F=Authority expected
luni.A0=Expected host
luni.A1=Package is sealed
luni.A2=package is sealed
