How can i store pdf file on google cloud storage?

8 views
Skip to first unread message

pastien via StackOverflow

unread,
Feb 9, 2016, 6:41:05 AM2/9/16
to google-appengin...@googlegroups.com

im using spring and google appengine and i try to store Pdf file fore all users on my app but i can't find a solution with GcsFile

can you help me please?

thanks

 GcsFileOptions options = new GcsFileOptions.Builder()
                              .mimeType("application/pdf")
                              .acl("public-read")
                              .build();

                      GcsOutputChannel writeChannel = gcsService.createOrReplace(filename, options);

                      ServletFileUpload uploadGcs = new ServletFileUpload();   
                      try {
                          byte[] bytes = ByteStreams.toByteArray(stream);
                           try {
                               writeChannel.write(ByteBuffer.wrap(bytes));
                               } finally { 
                                   writeChannel.close();
                                   stream.close();
                                   }        
                      } catch (Exception e) {
                          e.printStackTrace();
                      }     


Please DO NOT REPLY directly to this email but go to StackOverflow:
http://stackoverflow.com/questions/35291046/how-can-i-store-pdf-file-on-google-cloud-storage

pastien via StackOverflow

unread,
Feb 9, 2016, 8:46:04 AM2/9/16
to google-appengin...@googlegroups.com

this what i see if i try to save a pdf file with below code:

     févr. 09, 2016 1:37:29 PM com.google.appengine.tools.cloudstorage.RetryHelper doRetry
INFOS: RetryHelper(94,66 ms, 1 attempts, com.google.appengine.tools.cloudstorage.GcsOutputChannelImpl$1@15fac57): Attempt #1 failed [java.io.IOException: java.lang.reflect.InvocationTargetException], sleeping for 279 ms
févr. 09, 2016 1:37:29 PM com.google.appengine.tools.cloudstorage.RetryHelper doRetry
INFOS: RetryHelper(395,3 ms, 2 attempts, com.google.appengine.tools.cloudstorage.GcsOutputChannelImpl$1@15fac57): Attempt #2 failed [java.io.IOException: java.lang.reflect.InvocationTargetException], sleeping for 390 ms
févr. 09, 2016 1:37:30 PM com.google.appengine.tools.cloudstorage.RetryHelper doRetry
INFOS: RetryHelper(786,2 ms, 3 attempts, com.google.appengine.tools.cloudstorage.GcsOutputChannelImpl$1@15fac57): Attempt #3 failed [java.io.IOException: java.lang.reflect.InvocationTargetException], sleeping for 778 ms
févr. 09, 2016 1:37:30 PM com.google.appengine.tools.cloudstorage.RetryHelper doRetry
INFOS: RetryHelper(1,566 s, 4 attempts, com.google.appengine.tools.cloudstorage.GcsOutputChannelImpl$1@15fac57): Attempt #4 failed [java.io.IOException: java.lang.reflect.InvocationTargetException], sleeping for 2226 ms
févr. 09, 2016 1:37:33 PM com.google.appengine.tools.cloudstorage.RetryHelper doRetry
INFOS: RetryHelper(3,796 s, 5 attempts, com.google.appengine.tools.cloudstorage.GcsOutputChannelImpl$1@15fac57): Attempt #5 failed [java.io.IOException: java.lang.reflect.InvocationTargetException], sleeping for 3772 ms
com.google.appengine.tools.cloudstorage.RetriesExhaustedException: RetryHelper(7,573 s, 6 attempts, com.google.appengine.tools.cloudstorage.GcsOutputChannelImpl$1@15fac57): Too many failures, giving up
    at com.google.appengine.tools.cloudstorage.RetryHelper.doRetry(RetryHelper.java:127)
    at com.google.appengine.tools.cloudstorage.RetryHelper.runWithRetries(RetryHelper.java:166)
    at com.google.appengine.tools.cloudstorage.RetryHelper.runWithRetries(RetryHelper.java:156)
    at com.google.appengine.tools.cloudstorage.GcsOutputChannelImpl.close(GcsOutputChannelImpl.java:198)
    at com.reservos.webapp.controller.BusinessController.uploadBusinessPhoto(BusinessController.java:1181)
    at com.reservos.webapp.controller.BusinessController$$FastClassByCGLIB$$92d8aa81.invoke(<generated>)
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:689)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
    at com.reservos.webapp.controller.BusinessController$$EnhancerByCGLIB$$3bda6d01.uploadBusinessPhoto(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:115)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.googlecode.objectify.ObjectifyFilter.doFilter(ObjectifyFilter.java:48)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:127)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:491)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: java.io.IOException: java.lang.reflect.InvocationTargetException
    at com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService$BlobStorageAdapter.storeBlob(LocalRawGcsService.java:161)
    at com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService.finishObjectCreation(LocalRawGcsService.java:336)
    at com.google.appengine.tools.cloudstorage.GcsOutputChannelImpl$1.call(GcsOutputChannelImpl.java:201)
    at com.google.appengine.tools.cloudstorage.GcsOutputChannelImpl$1.call(GcsOutputChannelImpl.java:198)
    at com.google.appengine.tools.cloudstorage.RetryHelper.doRetry(RetryHelper.java:108)
    ... 69 more
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:115)
    at com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService$BlobStorageAdapter.storeBlob(LocalRawGcsService.java:153)
    ... 73 more
Caused by: java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\dev\sourceir\trunk\src\main\webapp\WEB-INF\appengine-generated\encoded_gs_key:L2dzL2lyZXNlcnZvcy8xZjdkZGY4Zi02NTBmLTRkZjMtYjhkOC02MTUyZDFmZTkwZDYucGRm" "write")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:372)
    at java.security.AccessController.checkPermission(AccessController.java:559)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:429)
    at java.lang.SecurityManager.checkWrite(SecurityManager.java:979)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:209)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:171)
    at com.google.appengine.api.blobstore.dev.FileBlobStorage.storeBlob(FileBlobStorage.java:46)
    ... 79 more
Hibernate: insert into tbu1218 (businessid, picKey, typePic) values (?, ?, ?)
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [BIGINT] - 172
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [2] as [VARCHAR] - 1f7ddf8f-650f-4df3-b8d8-6152d1fe90d6.pdf
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [3] as [VARCHAR] - profile
com.google.appengine.api.datastore.EntityNotFoundException: No entity was found matching the key: BusinessSearch(172)
    at com.google.appengine.api.datastore.DatastoreServiceImpl.get(DatastoreServiceImpl.java:58)
    at com.reservos.webapp.controller.BusinessController.uploadBusinessPhoto(BusinessController.java:1198)
    at com.reservos.webapp.controller.BusinessController$$FastClassByCGLIB$$92d8aa81.invoke(<generated>)
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:689)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
    at com.reservos.webapp.controller.BusinessController$$EnhancerByCGLIB$$3bda6d01.uploadBusinessPhoto(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:115)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.googlecode.objectify.ObjectifyFilter.doFilter(ObjectifyFilter.java:48)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:127)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:491)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)


Please DO NOT REPLY directly to this email but go to StackOverflow:
http://stackoverflow.com/questions/35291046/how-can-i-store-pdf-file-on-google-cloud-storage/35293675#35293675

pastien via StackOverflow

unread,
Feb 9, 2016, 8:56:09 AM2/9/16
to google-appengin...@googlegroups.com

im using spring and google appengine and i try to store Pdf file fore all users on my app but i can't find a solution with GcsFile

can you help me please?

thanks

Code:

GcsFileOptions options = new GcsFileOptions.Builder()
        .mimeType("application/pdf")
        .acl("public-read")
        .build();

GcsOutputChannel writeChannel = gcsService.createOrReplace(filename, options);

ServletFileUpload uploadGcs = new ServletFileUpload();
try

{
    byte[] bytes = ByteStreams.toByteArray(stream);
    try {
        writeChannel.write(ByteBuffer.wrap(bytes));
    } finally {
        writeChannel.close();
        stream.close();
    }
} catch (Exception e) {
    e.printStackTrace();
}

Stacktrace:

Nick via StackOverflow

unread,
Feb 9, 2016, 6:16:03 PM2/9/16
to google-appengin...@googlegroups.com

Writing to Cloud Storage is one of the most basic operations you can do, and you should read the documentation which contains explanations and examples.



Please DO NOT REPLY directly to this email but go to StackOverflow:
http://stackoverflow.com/questions/35291046/how-can-i-store-pdf-file-on-google-cloud-storage/35304077#35304077

konqi via StackOverflow

unread,
Feb 10, 2016, 3:41:05 AM2/10/16
to google-appengin...@googlegroups.com

If your error on the live system really looks like this

java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\dev\sourceir\trunk\src\main\webapp\WEB-INF\appengine-generated\encoded_gs_key:L2dzL2lyZXNlcnZvcy8xZjdkZGY4Zi02NTBmLTRkZjMtYjhkOC02MTUyZDFmZTkwZDYucGRm" "write")

you're doing something seriously wrong. But I assume the issue is in fact, that you're using an invalid filename. So please check whether the bucket you're trying to write to exists and if it is writable by your application. The GcsFilename should look like this:

GcsFilename newGcsFilename = new GcsFilename("bucketname", filePathDestination);

In case you want to use the default bucket, the bucket name would be identical to your appengine id (yourappengine-id.appspot.com). Please double check if that bucket exists in the developers console.

In case the default bucket does not exist (which apparently is the default at least in all my projects):

  1. Open appengine.google.com
  2. Select your project
  3. Go to Application Settings and
  4. Scroll down to the headline that says Cloud Integration.
  5. There should be a button that will automatically create the default bucket for you in cloud storage.


Please DO NOT REPLY directly to this email but go to StackOverflow:
http://stackoverflow.com/questions/35291046/how-can-i-store-pdf-file-on-google-cloud-storage/35310288#35310288
Reply all
Reply to author
Forward
0 new messages