úÎjdÂF      !"#$%&'()*+,-./0123456789:;<=>?@ABCDE &Hostname used for connecting to Amazon's production S3 service (s3.amazonaws.com). )Port number used for connecting to Amazon's production S3 service (80). >Create an AWSConnection to Amazon from credentials. Uses the  production service. ;Retrieve Access and Secret keys from environment variables > AWS_ACCESS_KEY_ID and AWS_ACCESS_KEY_SECRET, respectively. ; Either variable being undefined or empty will result in  F. AAn Amazon Web Services connection. Everything needed to connect  and authenticate requests. Service provider hostname Service provider port number Access Key ID Secret Access Key   Pretty print an error message. BAn error from an S3 request, either at the network layer, or from  S3 itself. ?A result from processing a request to S3. Either some success  value, or a . %G Transform an % into an HTTP request. Does not add A authentication or date information, so it is not suitable for  sending directly to AWS. HCreate I J  objects from an action. KInspect HTTP body, and add a Content-Length header with the  correct length. L2Add AWS authentication header to an HTTP request. M2Sign a string using the given authentication data N@Generate text that will be signed and subsequently added to the  request. O(Extract header data needed for signing. PExtract x-amz-* headers needed for signing. B find all headers with type HdrCustom that begin with amzHeader  lowercase key names $ sort lexigraphically by key name " combine headers with same name  unfold multi-line headers % trim whitespace around the header Q=Give the string representation of a (key,value) header pair. ) Uses rules for authenticated headers. R8Replace CRLF followed by whitespace with a single space Sstrip leading tabs/spaces TCombine same-named headers. U2Headers with same name should have values merged. V"Group headers with the same name. WSort by key name. XMake I J * easier to work with, and lowercase keys. 2Determine if a header belongs in the StringToSign Y*is the first list a prefix of the second? Z'Prefix used by Amazon metadata headers 0Extract resource name, as required for signing. [ Add a date string to a request. \$Add an expiration date to a request ]/Get current time in HTTP 1.1 format (RFC 2616) + Numeric time zones should be used, but I'd rather not subvert the E intent of ctTZName, so we stick with the name format. Otherwise,  we could send +0000 instead of GMT.  see:   #http://www.ietf.org/rfc/rfc2616.txt   #http://www.ietf.org/rfc/rfc1123.txt   "http://www.ietf.org/rfc/rfc822.txt ^'Convenience for dealing with HMAC-SHA1 @Construct the request specified by an S3Action, send to Amazon, 6 and return the response. Todo: add MD5 signature. #Construct a pre-signed URI, but don't act on it. This is useful E for when an expiration date has been set, and the URI needs to be  passed on to a client. _=Inspect a response for network errors, HTTP error codes, and  Amazon error messages. `=Find the errors embedded in an XML message body from Amazon. Find children of Error entity, use their Code and Message  entities to create an . a@Decode a mime string, we only know about quoted printable UTF-8 $An action to be performed using S3. *Connection and authentication information Name of bucket to act on Name of object to act on 'Query parameters (requires a prefix of ?) !Additional header fields to send  Body of action, if sending data Type of action, b , c , etc.    !Send data for an object. "ACreate a pre-signed request URI. Anyone can use this to request ' an object until the specified date. #ACreate a pre-signed request URI. Anyone can use this to request 2 an object for the number of seconds specified. $Retrieve an object. %=Get object info without retrieving content body from server. d%Get an object with specified method. &:Delete an object. Only bucket and object name need to be A specified in the S3Object. Deletion of a non-existent object  does not return an error. '4An object that can be stored and retrieved from S3. )*Name of the bucket containing this object *"URI of the object. Subresources (?acl or  | ?torrent%) should be suffixed onto this name. +2A standard MIME type describing the format of the  contents. If not specified, binary/ octet-stream is  used. ,1Object metadata in (key,value) pairs. Key names  should use the prefix  x-amz-meta- to be stored with : the object. The total HTTP request must be under 4KB,  including these headers. - Object data. !"#$%&'()*+,- !$%&#"'()*+,-.>Create a new bucket on S3 with the given prefix, and a random ? suffix. This can be used to programatically create buckets  without of naming conflicts. //Create a new bucket on S3 with the given name. 0?Delete a bucket with the given name on S3. The bucket must be " empty for deletion to succeed. 1=Empty a bucket of all objects. Iterates through all objects A issuing delete commands, so time is proportional to number of B objects in the bucket. At this time, delete requests are free  from Amazon. eCDelete a list of objects, stop as soon as an error is encountered. 2:Return a list of all bucket names and creation dates. S3 - allows a maximum of 100 buckets per user. 33List objects in a bucket, based on parameters from <=. See E the Amazon S3 developer resources for in depth explanation of how  the fields in <=# can be used to query for objects.   Mhttp://docs.amazonwebservices.com/AmazonS3/2006-03-01/ListingKeysRequest.html 4FRepeatedly query the server for all objects in a bucket, ignoring the max_keys field. fADetermine if ListBucketResult is truncated. It would make sense > to combine this with the query for list results, so we didn't  have to parse the XML twice. gLearning arrows on the job. Remove quote characters from a h . 5$Is a result set response truncated? 6Result from listing objects. 8Name of object 9Last modification date :MD5 ;Bytes of object data <List request parameters ./0123456789:;<=>?@ABCDE/.01234BCDE<=>?@A6789:;5i  !"#$$%&'()*+,-./01223456789:;<=>?@@ABCDEEFGHIJJKLMNO P PQRSTUVWXYZ[\]^_`abcdefg h ijklm nohS3-0.3Network.AWS.ArrowUtilsNetwork.AWS.AWSConnectionNetwork.AWS.AWSResultNetwork.AWS.AuthenticationNetwork.AWS.S3ObjectNetwork.AWS.S3Bucketbase Data.Maybe HTTP-3001.1.3Network.HTTP.Headers Network.HTTPGHC.BasesplitunsplitatTagtextdefaultAmazonS3HostdefaultAmazonS3PortamazonS3ConnectionamazonS3ConnectionFromEnv AWSConnectionawsHostawsPort awsAccessKey awsSecretKeyprettyReqErrorReqErrorAWSError NetworkError AWSResult isAmzHeader runAction preSignedURI mimeDecode mimeEncodeQPS3Actions3conns3buckets3objects3query s3metadatas3body s3operation sendObjectpublicUriUntilTimepublicUriForSeconds getObject getObjectInfo deleteObjectS3Object obj_bucketobj_name content_type obj_headersobj_datacreateBucketWithPrefix createBucket deleteBucket emptyBucket listBuckets listObjectslistAllObjects IsTruncated ListResultkey last_modifiedetagsize ListRequestprefixmarker delimitermax_keysS3Bucket bucket_namebucket_creation_dateNothingrequestFromActionheadersFromActionHeaderaddContentLengthHeaderaddAuthenticationHeader makeSignature stringToSigncanonicalizeHeaderscanonicalizeAmzHeaders showHeaderfold_whitespaceremoveLeadingWhitespacecombineHeadersmergeSameHeaders groupHeaders sortHeadersheaderToLCKeyValueisPrefixcanonicalizeResource addDateToReqaddExpirationToReqhttpCurrentDate string2wordscreateAWSResultparseRestErrorXML mimeDecode'PUTGETgetObjectWithMethod deleteObjectsisListTruncatedunquoteString