Return-Path: Delivered-To: apmail-db-jdo-dev-archive@www.apache.org Received: (qmail 39813 invoked from network); 29 Jun 2005 22:21:05 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 29 Jun 2005 22:21:05 -0000 Received: (qmail 35565 invoked by uid 500); 29 Jun 2005 22:21:04 -0000 Mailing-List: contact jdo-dev-help@db.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: jdo-dev@db.apache.org Delivered-To: mailing list jdo-dev@db.apache.org Received: (qmail 35552 invoked by uid 99); 29 Jun 2005 22:21:04 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 29 Jun 2005 15:21:04 -0700 X-ASF-Spam-Status: No, hits=0.1 required=10.0 tests=HTML_50_60,HTML_MESSAGE X-Spam-Check-By: apache.org Received-SPF: pass (asf.osuosl.org: local policy) Received: from [192.18.98.36] (HELO brmea-mail-4.sun.com) (192.18.98.36) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 29 Jun 2005 15:21:06 -0700 Received: from fe1.sun.com ([192.18.108.78]) by brmea-mail-4.sun.com (8.12.10/8.12.9) with ESMTP id j5TML3GY009641 for ; Wed, 29 Jun 2005 16:21:03 -0600 (MDT) Received: from conversion-daemon.fe1.sun.com by fe1.sun.com (Sun Java System Messaging Server 6.1 HotFix 0.02 (built Aug 25 2004)) id <0IIV00C019QZA400@fe1.sun.com> (original mail from Craig.Russell@Sun.COM) for jdo-dev@db.apache.org; Wed, 29 Jun 2005 16:21:03 -0600 (MDT) Received: from [10.0.5.238] ([216.111.165.59]) by fe1.sun.com (Sun Java System Messaging Server 6.1 HotFix 0.02 (built Aug 25 2004)) with ESMTPSA id <0IIV00C6VA2N590A@fe1.sun.com> for jdo-dev@db.apache.org; Wed, 29 Jun 2005 16:21:02 -0600 (MDT) Date: Wed, 29 Jun 2005 12:31:20 -0700 From: Craig Russell Subject: SingleFieldIdentity In-reply-to: <42C274A1.1010902@spree.de> To: jdo-dev@db.apache.org Message-id: MIME-version: 1.0 X-Mailer: Apple Mail (2.730) Content-type: multipart/signed; protocol="application/pkcs7-signature"; boundary=Apple-Mail-14-32361250; micalg=sha1 References: <42C274A1.1010902@spree.de> X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N --Apple-Mail-14-32361250 Content-Type: multipart/alternative; boundary=Apple-Mail-13-32360131 --Apple-Mail-13-32360131 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed Hi Michael,, On Jun 29, 2005, at 3:14 AM, Michael Watzek wrote: > Hi Craig, > > I like to agree on the general implementation strategy for the > single field test cases (your issue 3). This is the proposal: > > We introduce new PC classes as you pointed out below for each > single field identity type. Furthermore, we introduce an abstract > super class for all tests implementing single field assertions. > That class extends JDO_Test and overrides method "localSetUp", > creating some pc instances and adding tear down classes. > > The tests for assertion A7.12-38 are negative tests forcing the > implementation to throw an exception. The exception handler checks for > JDOFatalInternalException. If it is a different exception then the > tests fail, else they succeed. > > Question: How can I force a persistent pc instance to have non- > initialized primary key fields? The spec is misleading here. It currently reads as if an instance must be persistent before calling this method, but in fact, a transient instance that is becoming persistent can also supply the oid. So the test here should be for classes whose pk field is an object type. Create an instance of the class where the pk field is null, and the method should throw an exception. Here's the rewritten spec: For classes using single field identity, this method must be called on an instance of a persistence-capable class with its primary key field initialized (not null), or a JDOFatalInternalException is thrown. > > The tests for assertion A7.12-39 are positive tests, checking if > the key of the returned single field identity instance equals the > value of the primary key field. > > The tests for assertion A7.12-25 implement a new implementation > class for "PersistenceCapable.ObjectIdFieldConsumer". You can use an inner class of the test class if that is convenient. I don't know that this will be used outside the test. > They create an oid, they create a new pc instance, having different > primary key values compared to the oid. Afterwards, they call > "JDOImplHelper.copyKeyFieldsFromObjectId". Finally, they check the > copied values. > > Question: Does it make sence to implement assertion A7.12-7 [public > void jdoCopyKeyFieldsToObjectId(ObjectIdFieldSupplier > fs, Object oid);] right away? This should throw an exception for single field identity. The enhancement code is on Martin's list of action items. It's already been implemented for the CMP team and "just" needs to be ported back to JDO. Then it will work. But there is no harm in implementing the test. It's a five liner negative test. Craig > > Regards, > Michael > > >> 3. Write test cases for assertions here for single field identity. >> Add a new property so JDO_Test can tell whether the test is being >> run for application identity and return without running the test >> if in datastore identity, similar to unsupported option. Like >> isRunningDatastoreIdentity and isRunningApplicationIdentity. >> A7.12-38 [For classes using single field identity, this method >> must be called on a persistent instance with its primary key field >> initialized (not null), or a JDOFatalInternalException is thrown.] >> api.persistencecapable.NewObjectIdInstance >> testSingleFieldIdentityNotIntializedInteger >> api.persistencecapable.NewObjectIdInstance >> testSingleFieldIdentityNotIntializedShort >> api.persistencecapable.NewObjectIdInstance >> testSingleFieldIdentityNotIntializedLong >> api.persistencecapable.NewObjectIdInstance >> testSingleFieldIdentityNotIntializedCharacter >> api.persistencecapable.NewObjectIdInstance >> testSingleFieldIdentityNotIntializedByte >> api.persistencecapable.NewObjectIdInstance >> testSingleFieldIdentityNotIntializedString >> A7.12-39 [The instance returned is initialized with the value of >> the primary key field of the instance on which the method is called.] >> api.persistencecapable.NewObjectIdInstance >> testSingleFieldIdentityInitializedint >> api.persistencecapable.NewObjectIdInstance >> testSingleFieldIdentityInitializedInteger >> api.persistencecapable.NewObjectIdInstance >> testSingleFieldIdentityInitializedshort >> api.persistencecapable.NewObjectIdInstance >> testSingleFieldIdentityInitializedShort >> api.persistencecapable.NewObjectIdInstance >> testSingleFieldIdentityInitializedlong >> api.persistencecapable.NewObjectIdInstance >> testSingleFieldIdentityInitializedLong >> api.persistencecapable.NewObjectIdInstance >> testSingleFieldIdentityInitializedchar >> api.persistencecapable.NewObjectIdInstance >> testSingleFieldIdentityInitializedCharacter >> api.persistencecapable.NewObjectIdInstance >> testSingleFieldIdentityInitializedbyte >> api.persistencecapable.NewObjectIdInstance >> testSingleFieldIdentityInitializedByte >> api.persistencecapable.NewObjectIdInstance >> testSingleFieldIdentityInitializedString >> A7.12-25 [public void jdoCopyKeyFieldsFromObjectId >> (ObjectIdFieldConsumer fc, Object oid); >> This method copies fields to the field manager instance from the >> second parameter instance. >> api.persistencecapable.CopyKeyFieldsFromObjectId >> testSingleFieldIdentity times 11! >> You will need new classes and .jdo files for single field >> identity. Copy pc.mylib.PCPoint from application identity but >> redefine it to use SFI and call them >> pc.singlefieldidentity.PCPointSingleFieldint >> pc.singlefieldidentity.PCPointSingleFieldInteger >> pc.singlefieldidentity.PCPointSingleFieldshort >> pc.singlefieldidentity.PCPointSingleFieldShort >> pc.singlefieldidentity.PCPointSingleFieldlong >> pc.singlefieldidentity.PCPointSingleFieldLong >> pc.singlefieldidentity.PCPointSingleFieldchar >> pc.singlefieldidentity.PCPointSingleFieldCharacter >> pc.singlefieldidentity.PCPointSingleFieldbyte >> pc.singlefieldidentity.PCPointSingleFieldByte >> pc.singlefieldidentity.PCPointSingleFieldString >> 4. Update existing tests or write new tests for JDO 2 JDOHelper 8.6: >> A8.6-13 [public static >> PersistenceManagerFactory getPersistenceManagerFactory >> (File file);] >> A8.6-14 [public static >> PersistenceManagerFactory getPersistenceManagerFactory >> (File file, ClassLoader loader);] >> A8.6-15 [public static >> PersistenceManagerFactory getPersistenceManagerFactory >> (String resourceName);] >> A8.6-16 [public static >> PersistenceManagerFactory getPersistenceManagerFactory >> (String resourceName, ClassLoader loader);] >> A8.6-17 [public static >> PersistenceManagerFactory getPersistenceManagerFactory >> (InputStream stream);] >> A8.6-18 [public static >> PersistenceManagerFactory getPersistenceManagerFactory >> (InputStream stream, ClassLoader loader);] These methods >> use the parameter(s) passed as arguments to construct a Properties >> instance, and then delegate to the static method >> getPersistenceManagerFactory in the class named in the property >> javax.jdo.PersistenceManagerFactoryClass. If there are any >> exceptions while trying to construct the Properties instance or to >> call the static method, then either A8.6-4 [JDOFatalUserException] >> or A8.6-5 [JDOFatalInternalException is thrown], depending on >> whether the exception is due to the user or the implementation. >> The nested exception indicates the cause of the exception. >> api.persistencemanagerfactory.GetPMFByFile >> api.persistencemanagerfactory.GetPMFByFileAndClassLoader >> api.persistencemanagerfactory.GetPMFByResource >> api.persistencemanagerfactory.GetPMFByResourceAndClassLoader >> api.persistencemanagerfactory.GetPMFByStream >> api.persistencemanagerfactory.GetPMFByStreamAndClassLoader >> These test classes might use the properties that are already >> configured to construct the File, Resource, and Stream objects for >> the test (to make sure that the properties are valid for the PMF >> under test). >> If you run out of work to do, please ask Michelle for her advice. >> Craig Russell >> Architect, Sun Java Enterprise System http://java.sun.com/products/ >> jdo >> 408 276-5638 mailto:Craig.Russell@sun.com >> P.S. A good JDO? O, Gasp! >> > > > -- > ------------------------------------------------------------------- > Michael Watzek Tech@Spree Engineering GmbH > mailto:mwa.tech@spree.de Buelowstr. 66 > Tel.: ++49/30/235 520 36 10783 Berlin - Germany > Fax.: ++49/30/217 520 12 http://www.spree.de/ > ------------------------------------------------------------------- > > Craig Russell Architect, Sun Java Enterprise System http://java.sun.com/products/jdo 408 276-5638 mailto:Craig.Russell@sun.com P.S. A good JDO? O, Gasp! --Apple-Mail-13-32360131 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=ISO-8859-1 Hi = Michael,,

On Jun 29, 2005, at 3:14 AM, Michael Watzek = wrote:

Hi Craig,

I like = to agree on the general implementation strategy for the
single field test cases (your issue 3). This is the = proposal:

We introduce new PC classes as you pointed out below = for each single field identity type. Furthermore, we introduce an = abstract super class for all tests implementing single field assertions. = That class extends JDO_Test and overrides method "localSetUp", creating = some pc instances and adding tear down classes.

The = tests for assertion A7.12-38 are negative tests forcing the
implementation to throw an exception. The exception = handler checks for
JDOFatalInternalException. = If it is a different exception then the tests fail, else they = succeed.

Question: How can I force a persistent pc instance = to have non-initialized primary key fields?

The spec is misleading here. It = currently reads as if an instance must be persistent before calling this = method, but in fact, a transient instance that is becoming persistent = can also supply the oid. So the test here should be for classes whose pk = field is an object type. Create an instance of the class where the pk = field is null, and the method should throw an exception.

Here's the rewritten = spec:

<spec>
For = classes using single field identity, this method must be called on an = instance of a persistence-capable class with its primary key field = initialized (not null), or a JDOFatalInternalException is = thrown.
</spec>


The tests for assertion A7.12-39 are positive tests, = checking if the key of the returned single field identity instance = equals the value of the primary key field.

The tests for = assertion A7.12-25 implement a new implementation class for = "PersistenceCapable.ObjectIdFieldConsumer". =

You can use an inner class of = the test class if that is convenient. I don't know that this will be = used outside the test.

They create an oid, they create a new pc instance, = having different primary key values compared to the oid. Afterwards, = they call "JDOImplHelper.copyKeyFieldsFromObjectId". Finally, they check = the copied values.
Question: Does it make sence to = implement assertion A7.12-7 [public void = jdoCopyKeyFieldsToObjectId(ObjectIdFieldSupplier
fs, Object oid);] right = away?

This should throw an exception = for single field identity. The enhancement code is on Martin's list of = action items. It's already been implemented for the CMP team and "just" = needs to be ported back to JDO. Then it will work. But there is no harm = in implementing the test. It's a five liner negative test.

Craig


Regards,

=
3. Write test = cases for assertions here for single field identity. Add a new property = so JDO_Test can tell whether the test is being run for application = identity and return without running the test if in datastore identity, = similar to unsupported option. Like isRunningDatastoreIdentity and = isRunningApplicationIdentity.
A7.12-38 [For = classes using single field identity, this method must be called on a = persistent instance with its primary key field initialized (not null), = or a JDOFatalInternalException is thrown.]
api.persistencecapable.NewObjectIdInstance = testSingleFieldIdentityNotIntializedByte
A7.12-39 = [The instance returned is initialized with the value of the primary key = field of the instance on which the method is called.]
api.persistencecapable.NewObjectIdInstance = testSingleFieldIdentityInitializedint
A7.12-25 = [public void jdoCopyKeyFieldsFromObjectId(ObjectIdFieldConsumer fc, = Object oid);
This method copies fields to the = field manager instance from the second parameter instance.
api.persistencecapable.CopyKeyFieldsFromObjectId = testSingleFieldIdentity times 11!
You will need = new classes and .jdo files for single field identity. Copy = pc.mylib.PCPoint from application identity but redefine it to use SFI = and call them pc.singlefieldidentity.PCPointSingleFieldint
4. Update existing tests or write new tests for JDO = 2 JDOHelper 8.6:
A8.6-13 [public static
=A0 =A0 = PersistenceManagerFactory getPersistenceManagerFactory
=A0 =A0 =A0 =A0 = (File file);]
A8.6-14 [public = static
=A0 =A0 PersistenceManagerFactory = getPersistenceManagerFactory
=A0 =A0 =A0 =A0 (File file, = ClassLoader loader);]
A8.6-15 [public = static
=A0 =A0 PersistenceManagerFactory = getPersistenceManagerFactory
=A0 =A0 =A0 =A0 (String = resourceName);]
A8.6-16 [public static
=A0 =A0 = PersistenceManagerFactory getPersistenceManagerFactory
=A0 =A0 =A0 =A0 = (String resourceName, ClassLoader loader);]
A8.6-17 [public static
=A0 =A0 PersistenceManagerFactory = getPersistenceManagerFactory
=A0 =A0 =A0 =A0 (InputStream = stream);]
A8.6-18 [public static
=A0 =A0 = PersistenceManagerFactory getPersistenceManagerFactory
=A0 =A0 =A0 =A0 = (InputStream stream, ClassLoader loader);] These methods use the = parameter(s) passed as arguments to construct a Properties instance, and = then delegate to the static method getPersistenceManagerFactory in the = class named in the property javax.jdo.PersistenceManagerFactoryClass. If = there are any exceptions while trying to construct the Properties = instance or to call the static method, then either A8.6-4 = [JDOFatalUserException] or A8.6-5 [JDOFatalInternalException is thrown], = depending on whether the exception is due to the user or the = implementation. The nested exception indicates the cause of the = exception.
These test classes might use the properties that are = already configured to construct the File, Resource, and Stream objects = for the test (to make sure that the properties are valid for the PMF = under test).
If you run out of work to do, = please ask Michelle for her advice.
Craig = Russell
Architect, Sun Java Enterprise = System http://java.sun.com/products/jdo=
408 276-5638 mailto:Craig.Russell@sun.com
P.S. A good JDO? O, Gasp!
=


--=A0
Michael Watzek=A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 Tech@Spree Engineering = GmbH
mailto:mwa.tech@spree.de=A0 =A0 =A0 =A0 Buelowstr. = 66
Tel.:=A0 = ++49/30/235 520 36 =A0 =A0 = =A0 10783 Berlin - Germany
Fax.:=A0 ++49/30/217 520 12 =A0 =A0 =A0 http://www.spree.de/



Craig Russell
Architect, Sun Java Enterprise System http://java.sun.com/products/jdo=
P.S. A good JDO? O, = Gasp!

= --Apple-Mail-13-32360131-- --Apple-Mail-14-32361250 Content-Transfer-Encoding: base64 Content-Type: application/pkcs7-signature; name=smime.p7s Content-Disposition: attachment; filename=smime.p7s MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIGHjCCAtcw ggJAoAMCAQICAw3FWTANBgkqhkiG9w0BAQQFADBiMQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhh d3RlIENvbnN1bHRpbmcgKFB0eSkgTHRkLjEsMCoGA1UEAxMjVGhhd3RlIFBlcnNvbmFsIEZyZWVt YWlsIElzc3VpbmcgQ0EwHhcNMDUwMTEwMDA0MTA5WhcNMDYwMTEwMDA0MTA5WjBHMR8wHQYDVQQD ExZUaGF3dGUgRnJlZW1haWwgTWVtYmVyMSQwIgYJKoZIhvcNAQkBFhVDcmFpZy5SdXNzZWxsQFN1 bi5DT00wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDti7ZE4rO6oXKbLM02AG9WY55t udmBVL53fb3V3X5S1kvcJOk1NEMIYT/T7Ww+/hE955zvHT29+mIoNe8AW/yj1WUH8uGG2HxhwCHI UQTHmN/ioVJgjwUaYbtNMKbL/NRpnL0QWewdMJS+6IFzFyX7ADFW5cJ+UWNLvNeWAQtN0mtLildn vdOgh50i8YPvACNkCHoomGjXx0azcXbe1X3c5AgRI6e2CZe5k2lRFQFUMqkjdoMtQPoNqJ1BxH9l i4cnabl8mcTwHHl44hrvb8ThqwRf2pfJh2vVuwmgK6z4IWjOk4RQM+0ODsRdq67mBdimJYmPMK1p RMBHzrUsfKxNAgMBAAGjMjAwMCAGA1UdEQQZMBeBFUNyYWlnLlJ1c3NlbGxAU3VuLkNPTTAMBgNV HRMBAf8EAjAAMA0GCSqGSIb3DQEBBAUAA4GBAIj86LzxCHedStDLMEeqHLy+UFG7zIRHfChSIV42 +MvXicydXEBh8v0Ry1V2d/lY4jS78G5yW5R9fKt1U5nlRBCOVzdhomvSolnNRIT71wPVVDrAIVlA YpXKxSmVBq7+4hV+3ZLHDeq3qZnNmiJR0sTEUD16xZX1RJs9dRYPCHoRMIIDPzCCAqigAwIBAgIB DTANBgkqhkiG9w0BAQUFADCB0TELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTES MBAGA1UEBxMJQ2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMf Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFs IEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUuY29t MB4XDTAzMDcxNzAwMDAwMFoXDTEzMDcxNjIzNTk1OVowYjELMAkGA1UEBhMCWkExJTAjBgNVBAoT HFRoYXd0ZSBDb25zdWx0aW5nIChQdHkpIEx0ZC4xLDAqBgNVBAMTI1RoYXd0ZSBQZXJzb25hbCBG cmVlbWFpbCBJc3N1aW5nIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEpjxVc1X7TrnK mVoeaMB1BHCd3+n/ox7svc31W/Iadr1/DDph8r9RzgHU5VAKMNcCY1osiRVwjt3J8CuFWqo/cVbL rzwLB+fxH5E2JCoTzyvV84J3PQO+K/67GD4Hv0CAAmTXp6a7n2XRxSpUhQ9IBH+nttE8YQRAHmQZ cmC3+wIDAQABo4GUMIGRMBIGA1UdEwEB/wQIMAYBAf8CAQAwQwYDVR0fBDwwOjA4oDagNIYyaHR0 cDovL2NybC50aGF3dGUuY29tL1RoYXd0ZVBlcnNvbmFsRnJlZW1haWxDQS5jcmwwCwYDVR0PBAQD AgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFQcml2YXRlTGFiZWwyLTEzODANBgkqhkiG9w0B AQUFAAOBgQBIjNFQg+oLLswNo2asZw9/r6y+whehQ5aUnX9MIbj4Nh+qLZ82L8D0HFAgk3A8/a3h YWLD2ToZfoSxmRsAxRoLgnSeJVCUYsfbJ3FXJY3dqZw5jowgT2Vfldr394fWxghOrvbqNOUQGls1 TXfjViF4gtwhGTXeJLHTHUb/XV9lTzGCAucwggLjAgEBMGkwYjELMAkGA1UEBhMCWkExJTAjBgNV BAoTHFRoYXd0ZSBDb25zdWx0aW5nIChQdHkpIEx0ZC4xLDAqBgNVBAMTI1RoYXd0ZSBQZXJzb25h bCBGcmVlbWFpbCBJc3N1aW5nIENBAgMNxVkwCQYFKw4DAhoFAKCCAVMwGAYJKoZIhvcNAQkDMQsG CSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMDUwNjI5MTkzMTIxWjAjBgkqhkiG9w0BCQQxFgQU Cw0li4b3hvIn5nM0GzOEhVibHrkweAYJKwYBBAGCNxAEMWswaTBiMQswCQYDVQQGEwJaQTElMCMG A1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkgTHRkLjEsMCoGA1UEAxMjVGhhd3RlIFBlcnNv bmFsIEZyZWVtYWlsIElzc3VpbmcgQ0ECAw3FWTB6BgsqhkiG9w0BCRACCzFroGkwYjELMAkGA1UE BhMCWkExJTAjBgNVBAoTHFRoYXd0ZSBDb25zdWx0aW5nIChQdHkpIEx0ZC4xLDAqBgNVBAMTI1Ro YXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBJc3N1aW5nIENBAgMNxVkwDQYJKoZIhvcNAQEBBQAEggEA kq3wHwiTjBprFhkJt/auLVbqv8Lu/mOLZ+XsPcm1qDawaQnYg2n3hXYifzNJ7oH2tKpSE44Xh+2p AS1cIOe0RG0+VxBTyoeU1eSb5kXWhPE2UJC2QInvnFL+jrYyrqk+zl/nSRzbAWvo5WkQxWk2ACxI rJmvGbCJxCVQWxAlIe6X/RB1bk2fQfksoOTP+1Z+Aq7w1nO8h5H4SXUak+jjmpumIxkvPc61sCRH ICPu09Gktev6ofDGqLJoqZ0VrHZAO4MGWyDlJUqKWZPOBoT/u6rK/nuzJyXGCeVP52MCwfDPj/lA SrpH2Pwm4EcktnXm6tbeQ5VUcg6Bb71IuufilAAAAAAAAA== --Apple-Mail-14-32361250--