henrinormak / Heimdall

Heimdall is a wrapper around the Security framework for simple encryption/decryption operations.
MIT License
402 stars 68 forks source link

65 Compile errors on Xcode 6.1.1 in Swift with Example project #6

Closed testower closed 9 years ago

testower commented 9 years ago
CompileSwift normal x86_64 <path>Heimdall/Heimdall/Heimdall/Heimdall.swift
    cd <path>Heimdall/Heimdall
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -c -primary-file <path>Heimdall/Heimdall/Heimdall/Heimdall.swift -target x86_64-apple-ios8.0 -target-cpu core2 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.1.sdk -I /Users/<user>/Library/Developer/Xcode/DerivedData/HeimdallExample-eehzudxaclzvebgffkvuvxmsuoqx/Build/Products/Debug-iphonesimulator -I /Users/<user>/Library/Developer/Xcode/DerivedData/modules -F /Users/<user>/Library/Developer/Xcode/DerivedData/HeimdallExample-eehzudxaclzvebgffkvuvxmsuoqx/Build/Products/Debug-iphonesimulator -g -import-underlying-module -module-cache-path /Users/<user>/Library/Developer/Xcode/DerivedData/ModuleCache -Xcc -I/Users/<user>/Library/Developer/Xcode/DerivedData/HeimdallExample-eehzudxaclzvebgffkvuvxmsuoqx/Build/Intermediates/Heimdall.build/Debug-iphonesimulator/Heimdall.build/swift-overrides.hmap -Xcc -iquote -Xcc /Users/<user>/Library/Developer/Xcode/DerivedData/HeimdallExample-eehzudxaclzvebgffkvuvxmsuoqx/Build/Intermediates/Heimdall.build/Debug-iphonesimulator/Heimdall.build/Heimdall-generated-files.hmap -Xcc -I/Users/<user>/Library/Developer/Xcode/DerivedData/HeimdallExample-eehzudxaclzvebgffkvuvxmsuoqx/Build/Intermediates/Heimdall.build/Debug-iphonesimulator/Heimdall.build/Heimdall-own-target-headers.hmap -Xcc -I/Users/<user>/Library/Developer/Xcode/DerivedData/HeimdallExample-eehzudxaclzvebgffkvuvxmsuoqx/Build/Intermediates/Heimdall.build/Debug-iphonesimulator/Heimdall.build/Heimdall-all-non-framework-target-headers.hmap -Xcc -ivfsoverlay -Xcc /Users/<user>/Library/Developer/Xcode/DerivedData/HeimdallExample-eehzudxaclzvebgffkvuvxmsuoqx/Build/Intermediates/Heimdall.build/all-product-headers.yaml -Xcc -iquote -Xcc /Users/<user>/Library/Developer/Xcode/DerivedData/HeimdallExample-eehzudxaclzvebgffkvuvxmsuoqx/Build/Intermediates/Heimdall.build/Debug-iphonesimulator/Heimdall.build/Heimdall-project-headers.hmap -Xcc -I/Users/<user>/Library/Developer/Xcode/DerivedData/HeimdallExample-eehzudxaclzvebgffkvuvxmsuoqx/Build/Products/Debug-iphonesimulator/include -Xcc -I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -Xcc -I/Users/<user>/Library/Developer/Xcode/DerivedData/HeimdallExample-eehzudxaclzvebgffkvuvxmsuoqx/Build/Intermediates/Heimdall.build/Debug-iphonesimulator/Heimdall.build/DerivedSources/x86_64 -Xcc -I/Users/<user>/Library/Developer/Xcode/DerivedData/HeimdallExample-eehzudxaclzvebgffkvuvxmsuoqx/Build/Intermediates/Heimdall.build/Debug-iphonesimulator/Heimdall.build/DerivedSources -Xcc -DDEBUG=1 -Xcc -ivfsoverlay -Xcc /Users/<user>/Library/Developer/Xcode/DerivedData/HeimdallExample-eehzudxaclzvebgffkvuvxmsuoqx/Build/Intermediates/Heimdall.build/Debug-iphonesimulator/Heimdall.build/unextended-module-overlay.yaml -emit-module-doc-path /Users/<user>/Library/Developer/Xcode/DerivedData/HeimdallExample-eehzudxaclzvebgffkvuvxmsuoqx/Build/Intermediates/Heimdall.build/Debug-iphonesimulator/Heimdall.build/Objects-normal/x86_64/Heimdall~partial.swiftdoc -Onone -parse-as-library -module-name Heimdall -emit-module-path /Users/<user>/Library/Developer/Xcode/DerivedData/HeimdallExample-eehzudxaclzvebgffkvuvxmsuoqx/Build/Intermediates/Heimdall.build/Debug-iphonesimulator/Heimdall.build/Objects-normal/x86_64/Heimdall~partial.swiftmodule -serialize-diagnostics-path /Users/<user>/Library/Developer/Xcode/DerivedData/HeimdallExample-eehzudxaclzvebgffkvuvxmsuoqx/Build/Intermediates/Heimdall.build/Debug-iphonesimulator/Heimdall.build/Objects-normal/x86_64/Heimdall.dia -emit-dependencies-path /Users/<user>/Library/Developer/Xcode/DerivedData/HeimdallExample-eehzudxaclzvebgffkvuvxmsuoqx/Build/Intermediates/Heimdall.build/Debug-iphonesimulator/Heimdall.build/Objects-normal/x86_64/Heimdall.d -o /Users/<user>/Library/Developer/Xcode/DerivedData/HeimdallExample-eehzudxaclzvebgffkvuvxmsuoqx/Build/Intermediates/Heimdall.build/Debug-iphonesimulator/Heimdall.build/Objects-normal/x86_64/Heimdall.o

<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:59:73: error: expected '{' after 'if' condition
            if let newData = publicKeyData?.dataByStrippingX509Header() where !existingData.isEqualToData(newData) {
                                                                        ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:59:116: error: braced block of statements is an unused closure
            if let newData = publicKeyData?.dataByStrippingX509Header() where !existingData.isEqualToData(newData) {
                                                                                                                   ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:64:72: error: expected '{' after 'if' condition
        } else if let data = publicKeyData?.dataByStrippingX509Header(), key = Heimdall.insertPublicKey(publicTag, data: data) {
                                                                       ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:64:128: error: braced block of statements is an unused closure
        } else if let data = publicKeyData?.dataByStrippingX509Header(), key = Heimdall.insertPublicKey(publicTag, data: data) {
                                                                                                                               ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:67:10: error: consecutive statements on a line must be separated by ';'
        } else {
         ^
         ;
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:67:11: error: expected expression
        } else {
          ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:67:16: error: braced block of statements is an unused closure
        } else {
               ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:138:48: error: expected '{' after 'if' condition
        if let keyData = obtainKeyData(.Public), (modulus, exponent) = keyData.splitIntoComponents() {
                                               ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:138:102: error: braced block of statements is an unused closure
        if let keyData = obtainKeyData(.Public), (modulus, exponent) = keyData.splitIntoComponents() {
                                                                                                     ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:160:46: error: expected '{' after 'if' condition
        if let publicKey = obtainKey(.Public), aesKey = Heimdall.generateSymmetricKey(Int(kCCKeySizeAES256)), encrypted = Heimdall.encrypt(string, key: aesKey) {
                                             ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:160:161: error: braced block of statements is an unused closure
        if let publicKey = obtainKey(.Public), aesKey = Heimdall.generateSymmetricKey(Int(kCCKeySizeAES256)), encrypted = Heimdall.encrypt(string, key: aesKey) {
                                                                                                                                                                ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:247:41: error: expected '{' after 'if' condition
        if let key = obtainKey(.Private), messageData = message.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false), hash = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH)) {
                                        ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:247:194: error: braced block of statements is an unused closure
        if let key = obtainKey(.Private), messageData = message.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false), hash = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH)) {
                                                                                                                                                                                                 ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:298:96: error: expected '{' after 'if' condition
            if let signature = NSData(base64EncodedString: signatureBase64, options: .allZeros),
                                                                                               ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:300:80: error: braced block of statements is an unused closure
                hashData = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH)) {
                                                                               ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:371:45: error: expected '{' after 'if' condition
        } else if let tag = self.privateTag where key == .Private && self.scope & ScopeOptions.PrivateKey == ScopeOptions.PrivateKey {
                                            ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:371:134: error: braced block of statements is an unused closure
        } else if let tag = self.privateTag where key == .Private && self.scope & ScopeOptions.PrivateKey == ScopeOptions.PrivateKey {
                                                                                                                                     ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:381:45: error: expected '{' after 'if' condition
        } else if let tag = self.privateTag where key == .Private && self.scope & ScopeOptions.PrivateKey == ScopeOptions.PrivateKey {
                                            ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:381:134: error: braced block of statements is an unused closure
        } else if let tag = self.privateTag where key == .Private && self.scope & ScopeOptions.PrivateKey == ScopeOptions.PrivateKey {
                                                                                                                                     ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:407:31: error: expected type after 'as'
                return (ref as! SecKeyRef)
                              ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:407:31: error: expected ',' separator
                return (ref as! SecKeyRef)
                              ^
                              ,
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:407:31: error: expected expression in list of expressions
                return (ref as! SecKeyRef)
                              ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:407:31: error: expected ',' separator
                return (ref as! SecKeyRef)
                              ^
                              ,
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:429:61: error: expected type after 'as'
            result = Optional(keyRef?.takeRetainedValue() as! NSData)
                                                            ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:429:61: error: expected ',' separator
            result = Optional(keyRef?.takeRetainedValue() as! NSData)
                                                            ^
                                                            ,
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:429:61: error: expected expression in list of expressions
            result = Optional(keyRef?.takeRetainedValue() as! NSData)
                                                            ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:429:61: error: expected ',' separator
            result = Optional(keyRef?.takeRetainedValue() as! NSData)
                                                            ^
                                                            ,
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:483:74: error: expected type after 'as'
                              kSecPublicKeyAttrs.takeUnretainedValue() as! String: publicAttributes,
                                                                         ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:483:74: error: expected ',' separator
                              kSecPublicKeyAttrs.takeUnretainedValue() as! String: publicAttributes,
                                                                         ^
                                                                         ,
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:483:74: error: expected key expression in dictionary literal
                              kSecPublicKeyAttrs.takeUnretainedValue() as! String: publicAttributes,
                                                                         ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:483:74: error: expected ',' separator
                              kSecPublicKeyAttrs.takeUnretainedValue() as! String: publicAttributes,
                                                                         ^
                                                                         ,
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:484:75: error: expected type after 'as'
                              kSecPrivateKeyAttrs.takeUnretainedValue() as! String: privateAttributes]
                                                                          ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:484:75: error: expected ',' separator
                              kSecPrivateKeyAttrs.takeUnretainedValue() as! String: privateAttributes]
                                                                          ^
                                                                          ,
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:484:75: error: expected key expression in dictionary literal
                              kSecPrivateKeyAttrs.takeUnretainedValue() as! String: privateAttributes]
                                                                          ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:484:75: error: expected ',' separator
                              kSecPrivateKeyAttrs.takeUnretainedValue() as! String: privateAttributes]
                                                                          ^
                                                                          ,
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:490:45: error: expected '{' after 'if' condition
                if let publicKey = publicRef, privateKey = privateRef {
                                            ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:490:71: error: braced block of statements is an unused closure
                if let publicKey = publicRef, privateKey = privateRef {
                                                                      ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:670:37: error: expected '{' after 'if' condition
            if keyBytes[i++] == 0x02, let modulusLength = NSInteger(octetBytes: keyBytes, startIdx: &i) {
                                    ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:671:68: error: variable used within its own initial value
                let modulus = self.subdataWithRange(NSMakeRange(i, modulusLength))
                                                                   ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:672:22: error: variable used within its own initial value
                i += modulusLength
                     ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:675:41: error: expected '{' after 'if' condition
                if keyBytes[i++] == 0x02, let exponentLength = NSInteger(octetBytes: keyBytes, startIdx: &i) {
                                        ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:676:73: error: variable used within its own initial value
                    let exponent = self.subdataWithRange(NSMakeRange(i, exponentLength))
                                                                        ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:677:26: error: variable used within its own initial value
                    i += exponentLength
                         ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:60:53: error: use of unresolved identifier 'newData'
                Heimdall.updateKey(publicTag, data: newData)
                                                    ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:64:128: error: expression resolves to an unused function
        } else if let data = publicKeyData?.dataByStrippingX509Header(), key = Heimdall.insertPublicKey(publicTag, data: data) {
                                                                                                                               ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:67:16: error: type of expression is ambiguous without more context
        } else {
               ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:138:102: error: type of expression is ambiguous without more context
        if let keyData = obtainKeyData(.Public), (modulus, exponent) = keyData.splitIntoComponents() {
                                                                                                     ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:160:161: error: type of expression is ambiguous without more context
        if let publicKey = obtainKey(.Public), aesKey = Heimdall.generateSymmetricKey(Int(kCCKeySizeAES256)), encrypted = Heimdall.encrypt(string, key: aesKey) {
                                                                                                                                                                ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:212:36: error: could not find an overload for 'init' that accepts the supplied arguments
                let keyData = data.subdataWithRange(NSRange(location: 0, length: blockSize))
                              ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:213:40: error: could not find an overload for '-' that accepts the supplied arguments
                let messageData = data.subdataWithRange(NSRange(location: blockSize, length: data.length - blockSize))
                                  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:216:56: error: extra argument 'length' in call
                if let decryptedKeyData = NSMutableData(length: blockSize) {
                                                       ^        ~~~~~~~~~
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:247:194: error: type of expression is ambiguous without more context
        if let key = obtainKey(.Private), messageData = message.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false), hash = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH)) {
                                                                                                                                                                                                 ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:300:80: error: type of expression is ambiguous without more context
                hashData = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH)) {
                                                                               ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:371:134: error: type of expression is ambiguous without more context
        } else if let tag = self.privateTag where key == .Private && self.scope & ScopeOptions.PrivateKey == ScopeOptions.PrivateKey {
                                                                                                                                     ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:381:134: error: type of expression is ambiguous without more context
        } else if let tag = self.privateTag where key == .Private && self.scope & ScopeOptions.PrivateKey == ScopeOptions.PrivateKey {
                                                                                                                                     ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:401:13: warning: immutable value is default initialized and can never be changed
        let result: SecKeyRef?
            ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:407:24: error: '()' is not convertible to 'SecKeyRef'
                return (ref as! SecKeyRef)
                       ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:410:20: error: cannot assign to 'let' value 'result'
            result = nil
            ~~~~~~ ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:425:13: warning: immutable value is default initialized and can never be changed
        let result: NSData?
            ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:429:20: error: cannot assign to 'let' value 'result'
            result = Optional(keyRef?.takeRetainedValue() as! NSData)
            ~~~~~~ ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:431:20: error: cannot assign to 'let' value 'result'
            result = nil
            ~~~~~~ ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:463:48: error: use of unresolved identifier '>?'
        var persistentRef = Unmanaged<AnyObject>?()
                                               ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:463:48: error: operator is not a known binary operator
        var persistentRef = Unmanaged<AnyObject>?()
                                               ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:463:48: error: operator is not a known binary operator
        var persistentRef = Unmanaged<AnyObject>?()
                                               ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:464:13: warning: immutable value is default initialized and can never be changed
        let result: SecKeyRef?
            ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:486:41: error: use of unresolved identifier '>?'
        var publicRef = Unmanaged<SecKey>?()
                                        ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:486:41: error: operator is not a known binary operator
        var publicRef = Unmanaged<SecKey>?()
                                        ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:486:41: error: operator is not a known binary operator
        var publicRef = Unmanaged<SecKey>?()
                                        ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:487:42: error: use of unresolved identifier '>?'
        var privateRef = Unmanaged<SecKey>?()
                                         ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:487:42: error: operator is not a known binary operator
        var privateRef = Unmanaged<SecKey>?()
                                         ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:487:42: error: operator is not a known binary operator
        var privateRef = Unmanaged<SecKey>?()
                                         ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:502:47: error: 'Int' is not convertible to 'UInt'
        SecRandomCopyBytes(kSecRandomDefault, keySize, &result)
                                              ^
Security.count:1:5: note: in initialization of parameter 'count'
let count: UInt
    ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:522:180: error: 'Int' is not convertible to 'UInt'
                let status = CCCrypt(CCOperation(kCCEncrypt), CCAlgorithm(kCCAlgorithmAES128), CCOptions(kCCOptionECBMode + kCCOptionPKCS7Padding), keyData, keyLength, nil, data, dataLength, encryptedData, encryptedDataLength, &encryptedLength)
                                                                                                                                                                                   ^
CommonCrypto.dataInLength:1:5: note: in initialization of parameter 'dataInLength'
let dataInLength: UInt
    ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:547:185: error: 'Int' is not convertible to 'UInt'
            let status = CCCrypt(CCOperation(kCCDecrypt), CCAlgorithm(kCCAlgorithmAES128), CCOptions(kCCOptionECBMode + kCCOptionPKCS7Padding), keyData, keyLength, nil, encryptedData, encryptedDataLength, decryptedData, decryptedDataLength, &decryptedLength)
                                                                                                                                                                                        ^
CommonCrypto.dataInLength:1:5: note: in initialization of parameter 'dataInLength'
let dataInLength: UInt
    ^
<path>Heimdall/Heimdall/Heimdall/Heimdall.swift:670:68: error: extra argument 'octetBytes' in call
            if keyBytes[i++] == 0x02, let modulusLength = NSInteger(octetBytes: keyBytes, startIdx: &i) {
testower commented 9 years ago

Are you making this library on a developer preview version of Xcode?

vrwim commented 9 years ago

Build succeeds on Swift 1.2, Xcode 6.3.1 (6D1002), OS X 10.10.3, MacBook Pro (13-inch, Early 2011).

Are you sure you are using Swift 1.2, because it fails on the as! in Heimdall, which was introduced in Swift 1.2?

henrinormak commented 9 years ago

I should probably list this in the README, the project does indeed require Swift 1.2, all of it could be done below Swift 1.2, but I don't see a reason for that. If there is a specific reason for supporting < Swift 1.2, please let me know.

EDIT: For clarification, the Xcode version available on App Store builds Heimdall just fine - Version 6.3.1 (6D1002)

testower commented 9 years ago

I thought I had the latest Xcode, not having been notified about any updates. Please forgive my ignorance - and thanks for the info :-)