Commit Graph

339 Commits

Author SHA1 Message Date
Christoph Reimann 22e1013131 added accessors for special cases
major bugfixes include: rewrite of prefix related functions, merge of serialize/unserialize/... generators, extended field name resolution
2010-08-16 18:19:16 +02:00
Christoph Reimann fe0e32b5fa special case 'intermixed variable and fixed size fields': fixed reply side, needs testing 2010-08-08 21:25:13 +02:00
Christoph Reimann 77b594f958 renamed most _unserialize() functions to _sizeof() and fixed _unserialize() for the special case of intermixed variable and fixed size fields 2010-08-05 15:55:28 +02:00
Christoph Reimann b187f029d6 attempt to fix special case: variable fields followed by fixed size fields 2010-08-02 23:30:42 +02:00
Christoph Reimann a700eeb502 bug fixes for all kinds of 'special cases' 2010-08-01 23:40:20 +02:00
Christoph Reimann 1c590d5a86 partial rewrite of serialize helper functions completed;
_serialize() & _unserialize() have been tested for switch derived from valueparam
2010-07-22 16:41:15 +02:00
Christoph Reimann 566ae9baee preliminary handling of further special cases in unserialize
first attempts to unify serialize and unserialize
2010-07-20 22:46:37 +02:00
Christoph Reimann 4e665e1580 added generating code for _serialize() in case of variable sized structs (largely untested) 2010-07-15 18:43:43 +02:00
Christoph Reimann 86704124b1 new and still preliminary functions for switch; feautures include
- API compatibility with valueparam
- request _aux() auxiliary functions
- _serialize() and _unserialize() auxiliary functions
- new data type that allows mixing of fixed and variable size members
2010-07-13 20:06:08 +02:00
Christoph Reimann 80322d1163 xkb: updated configure.ac/Makefile.am 2010-07-13 19:59:23 +02:00
Christoph Reimann 8c2707773b added xcb_sumof() with restriction to uint8_t 2010-07-13 19:56:44 +02:00
Jamey Sharp 496efb7624 _xcb_conn_wait: Fix whitespace.
Signed-off-by: Jamey Sharp <jamey@minilop.net>
2010-07-13 07:10:50 -07:00
Pauli Nieminen de3cdad87a xcb_connect_to_display_with_auth_info: Fix memory leak
protocol and host are allocated in _xcb_parse_display but ownership of
them is passed to the caller. They have to be freed in
xcb_connect_to_display_with_auth_info.

Signed-off-by: Pauli Nieminen <ext-pauli.nieminen@nokia.com>
Signed-off-by: Peter Harris <pharris@opentext.com>
2010-06-15 13:16:45 -04:00
Pauli Nieminen 18718d483e _xcb_parse_display: Fix error path
xcb_parse_display claims that there is no side effects when failing.
That requires _xcb_parse_display to free the memory in failure case.

Signed-off-by: Pauli Nieminen <ext-pauli.nieminen@nokia.com>
Signed-off-by: Peter Harris <pharris@opentext.com>
2010-06-15 13:16:45 -04:00
Jeremy Huddleston 3f79628bec xcb_open: Improve protocol/host parsing
Support scenarios where host is not set and protocol is.  eg:

DISPLAY=tcp/:0

as well as the "inet" and "inet6" alias for "tcp" for compatability
with Xlib

Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
Reviewed-by: Jamey Sharp <jamey@minilop.net>
2010-05-14 14:28:53 -07:00
Marcin Kościelnicki e4b746ac13 Add ~ operator support in code generator
Reviewed-by: Julien Cristau <jcristau@debian.org>
Signed-off-by: Julien Danjou <julien@danjou.info>
2010-05-14 13:19:28 +02:00
Arnaud Fontaine 5e86cb0566 Fix GCC error on undeclared variable when not using abstract socket
This is a regression found by tinderbox in previous commit:

xcb_util.c: In function '_xcb_open':
xcb_util.c:213: error: 'fd' undeclared (first use in this function)
2010-04-30 18:49:18 +01:00
Arnaud Fontaine a546d00091 Get rid of PATH_MAX and MAXPATHLEN
There could be no upper limit on the length of a path according
to POSIX, therefore these macros may not be defined at all on
some systems (such as GNU Hurd).

Signed-off-by: Arnaud Fontaine <arnau@debian.org>
Reviewed-by: Peter Harris <pharris@opentext.com>
2010-04-30 14:47:16 +02:00
Jeremy Huddleston d068572173 Use limits.h instead of syslimits.h
Regression found by tinderbox in 89b3485dad

xcb_util.c:31:27: error: sys/syslimits.h: No such file or directory
xcb_util.c: In function '_xcb_open':
xcb_util.c:148: error: 'PATH_MAX' undeclared (first use in this function)

Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
2010-04-23 21:57:26 -07:00
Jeremy Huddleston 89b3485dad Reworked launchd support to work better with _xcb_parse_display
Fixes: http://xquartz.macosforge.org/trac/ticket/390

Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
2010-04-23 17:29:25 -07:00
Jeetu Golani 2dcf8b025b Replaced read() in read_block and _xcb_in_read() with recv for all
platforms. MSG_WAITALL is undefined in MinGW so it's been explicitly
defined in xcb_in.c
2010-04-23 00:47:16 +05:30
Jeetu Golani 56962e42a5 Set errno=0 in read_block. On Win32 there is no errno and this makes the
do..while loop execute only once. Also set the return value to -1 in
_xcb_open if control reaches the end - if all goes well it shouldn't
reach there.
2010-04-22 23:23:27 +05:30
Jamey Sharp b0525e2423 Always wake up readers after writing.
Since writers must make sure they read as well, threads may have gone to
sleep waiting for the opportunity to read. The writer must wake up one
of those readers or the application can hang.

Signed-off-by: Jamey Sharp <jamey@minilop.net>
Reviewed-by: Josh Triplett <josh@freedesktop.org>
2010-04-17 18:20:41 -07:00
Jamey Sharp eff3851ba8 Fix strict-aliasing warning when getting generic event length.
xcb_ge_event_t has its length field in the same place that
xcb_generic_reply_t does, so there's no need to cast the generic reply.

Signed-off-by: Jamey Sharp <jamey@minilop.net>
Cc: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Julien Danjou <julien@danjou.info>
2010-04-17 18:20:41 -07:00
Jamey Sharp 6dd8228a13 Delete a useless level of indirection from _xcb_out_send's parameters.
_xcb_out_send needs _xcb_conn_wait to store back its progress so it can
be reinvoked to pick up where it left off---but then _xcb_out_send
guarantees that it leaves either an empty output vector or a shut-down
connection, so *its* callers never care how much progress was made.

Signed-off-by: Jamey Sharp <jamey@minilop.net>
Reviewed-by: Josh Triplett <josh@freedesktop.org>
2010-04-17 18:20:40 -07:00
Rémi Denis-Courmont a1d9aa6e07 Fail if fd is too big and poll() is not available
Depending on the process file limit, a file descriptor can be larger
than the capacity of fd_set. There is no portable way to create a
large enough fd_set at run-time. So we just fail if the file descriptor
number is too high and poll() is not available.

Reviewed-by: Jamey Sharp <jamey@minilop.net>
Signed-off-by: Julien Danjou <julien@danjou.info>
2010-04-08 12:05:00 +02:00
Jeetu Golani 0e0c80e749 xcb_in.c #ifndef _WIN32 inside of #if USE_POLL redundant and removed 2010-03-31 22:00:04 +05:30
Jeetu Golani e8009194c9 restablished inclusion of fcntl.h and netinet/tcp.h in xcb_util.c -- without these the code no longer compiled on *ix 2010-03-31 09:50:51 +05:30
Jeetu Golani d302f1e9b1 changes in xcb_windefs.h - the flag _XCB_WINDEFS_H replaces WINDEFS_H 2010-03-29 22:37:33 +05:30
Jeetu Golani 36c9a985aa windefs.h is now called xcb_windefs.h - changed all includes to reflect that.Replaced one instance ofWIN32 with _WIN32 in each xcb_in.c and xcb_conn.c 2010-03-29 22:31:49 +05:30
Jeetu Golani bce72f63d2 Win32 code for xcb-1.5 2010-03-26 09:40:09 +05:30
Samuel Thibault d18d03d6f3 Fix authentication on hpux and Hurd
libxcb's 010e5661 (Fix XDM-AUTHORIZATION-1 (bug #14202)) mistakenly
inverted a few lines of code, making local socket authentication fail on
hpux and Hurd: when getpeername fails, sockname needs to be initialized
by getsockname before its address family can be checked.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Signed-off-by: Julien Danjou <julien@danjou.info>
2010-03-13 16:20:12 +01:00
Rémi Denis-Courmont 53a9834e4c Open the X11 socket with close-on-exec flag
This saves the X11 connection from leaking into children processes.
On Linux, this is fully thread-safe using SOCK_CLOEXEC. On other
systems, there is a small race condition.

Signed-off-by: Julien Danjou <julien@danjou.info>
2010-02-17 10:09:43 +01:00
Peter Harris 367882fa32 Support xcb_discard_reply
This function is useful for dynamic language garbage collectors. Frequently
a GC cycle may run before you want to block wainting for a reply.

This function is also marginally useful for libxcb apps that issue
speculative requests (eg. xlsclients).

Reviewed-by: Jamey Sharp <jamey@minilop.net>
Tested-by: Eamon Walsh <efw@eamonwalsh.com>
Signed-off-by: Peter Harris <pharris@opentext.com>
2010-02-11 14:35:37 -05:00
Rémi Denis-Courmont be7e528eae xcb_connect_to_fd: fix descriptor leak on memory error path
Signed-off-by: Julien Danjou <julien@danjou.info>
2010-01-07 18:03:30 +01:00
Julien Danjou 6e875a82a8 build: simplify extension building
Signed-off-by: Julien Danjou <julien@danjou.info>
2009-12-03 11:34:18 +01:00
Adam Jackson 1cf2a87def setsockopt(SO_KEEPALIVE) on TCP display connections.
This matches xtrans behaviour in SocketINETConnect, and makes it so apps
don't hang forever if their display dies.

Signed-off-by: Adam Jackson <ajax@redhat.com>
2009-12-02 14:31:56 -05:00
Eric Anholt e82c34c2f7 Add DRI2 support. (v2)
v2: Build fix from jcristau.
2009-10-19 09:47:06 -07:00
Yaakov Selkowitz ff2e2e35bc Cygwin build fix: Add -no-undefined to libtool flags
-no-undefined is needed to tell libtool a shared library can be built
on platforms which require all references to be statisfied at link time.

Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk>
Signed-off-by: Julien Danjou <julien@danjou.info>
2009-08-31 17:48:32 +02:00
Arnaud Fontaine f4c2794bf5 Add majorCode, minorCode and resourceID fields to X generic error 2009-07-15 16:03:56 +01:00
Jamey Sharp e06955ed66 Fix precedence bug: wrong length for big-requests preceded by sync.
Also replace excessively clever use of bitwise OR with equivalent
addition.

Reported-by: Geoffrey Li <geoffrey@seitopos.com>
Signed-off-by: Jamey Sharp <jamey@minilop.net>
Signed-off-by: Josh Triplett <josh@joshtriplett.org>
2009-07-06 13:14:35 -07:00
Julien Cristau 9e191c722a Fix libxcb-randr version info
The SONAME shouldn't have been bumped in 1.3, only new symbols were
added.

Signed-off-by: Julien Danjou <julien@danjou.info>
2009-05-29 17:05:11 +02:00
elupus ee89850e68 Disable Nagle on TCP socket
Signed-off-by: Julien Danjou <julien@danjou.info>
2009-05-26 16:14:48 +02:00
Julien Danjou efbe96ee0a depends on recent xcb-proto and bump version of randr
Signed-off-by: Julien Danjou <julien@danjou.info>
2009-05-09 17:39:34 +02:00
Bart Massey 010e566126 Fix XDM-AUTHORIZATION-1 (bug #14202)
With this patch, we know use correctly the socket address or peer
address for authentication purpose.

Signed-off-by: Julien Danjou <julien@danjou.info>
2009-04-21 08:41:34 +02:00
Julien Danjou ca978a9dae util: remove useless strlen calls from decnet opening
Signed-off-by: Julien Danjou <julien@danjou.info>
2009-04-10 09:59:49 +02:00
Julien Danjou cc19143141 util: merge common code for xcb_connect
Many code was duplicated between xcb_connect_to_display_with_auth_info
and xcb_connect(). We merge both, since the difference is just about the
xcb_auth_info_t pointer being supplied, or not.

Signed-off-by: Julien Danjou <julien@danjou.info>
2009-04-10 09:59:49 +02:00
Julien Danjou 8797e053b2 util: open_abstract gets filelen as parameters
That saves us from a couple of strlen() calls.

Signed-off-by: Julien Danjou <julien@danjou.info>
2009-04-10 09:59:49 +02:00
Julien Danjou f0b2981974 auth: use snprintf() return value
That save us from a strlen().

Signed-off-by: Julien Danjou <julien@danjou.info>
2009-04-10 09:59:49 +02:00
Julien Danjou 9f24c91f91 auth: precompute authnameslen
Signed-off-by: Julien Danjou <julien@danjou.info>
2009-04-10 09:59:49 +02:00
Samuel Thibault 6e2e87d0bb Local socket connections do not work on hurd-i386
Local socket connections currently do not work on hurd-i386 because
xcb_auth calls getpeername() on the client socket, but hurd-i386 does
not implement anything in that case (I actually wonder what reasonable
value could be returned).  In such case the xcb code does not actually
need the peer name anyway.

Signed-off-by: Julien Danjou <julien@danjou.info>
2009-04-06 16:53:11 +02:00
Michael Ost f916062edf use poll() instead of select() when available
Signed-off-by: Julien Danjou <julien@danjou.info>
2009-03-30 11:09:32 +02:00
Bart Massey beccb0be15 kludgily hand-merged xid fixes
Signed-off-by: Bart Massey <bart@cs.pdx.edu>
Signed-off-by: Julien Danjou <julien@danjou.info>
2009-03-28 14:59:01 +01:00
Julien Danjou 1e9c0f1012 Fix do_append() arguments
Signed-off-by: Julien Danjou <julien@danjou.info>
2009-03-16 10:26:37 +01:00
Julien Danjou fcb433db80 Copy full IPv4 mapping (Bug #20665)
Signed-off-by: Julien Danjou <julien@danjou.info>
2009-03-15 19:57:56 +01:00
Peter Harris eaa71eac02 Avoid name collisions between xidtype and enum.
These changes are necessary to build with latest xcb/proto.

Signed-off-by: Peter Harris <pharris@opentext.com>
2009-03-14 12:34:31 -04:00
Peter Harris e986d1ee5a Revert "Don't use enums in generated C code"
This commit broke xcb/util.

This reverts commit 9984b72888.

Signed-off-by: Peter Harris <pharris@opentext.com>
2009-03-13 15:25:30 -04:00
Peter Harris 9984b72888 Don't use enums in generated C code - use integer constants instead.
Signed-off-by: Peter Harris <pharris@opentext.com>
2009-02-25 19:07:23 -05:00
Julien Danjou 2e65188f91 Stop providing autogenerated files in tarball
Signed-off-by: Julien Danjou <julien@danjou.info>
2009-02-16 11:44:20 +01:00
Jeremy Huddleston f896ae8c53 Shutup compiler warning about unused variable... 2008-11-23 17:25:21 -08:00
Jeremy Huddleston d79621b25b Apple: Apple launchd cleanup
Added --with-launchd option instead of just using __APPLE__
Fixed opening launchd fd when displayname=NULL
2008-11-23 17:23:17 -08:00
Jeremy Huddleston 9b79ae49f7 Apple: Enable support for launchd DISPLAY socket 2008-11-23 16:18:25 -08:00
Peter Harris 43b612a5e9 Treat XIDs the same as other cardinal values.
This fixes a bug where c_client.py wasn't generating *_end functions,
but expected them to exist in order to find the subsequent list's start.

Signed-off-by: Peter Harris <peter.harris@hummingbird.com>
2008-11-19 11:06:01 -05:00
Josh Triplett fa452cc9b2 Support handing off socket write permission to external code.
Libraries like Xlib, some XCB language bindings, and potentially others
have a common problem: they want to share the X connection with XCB. This
requires coordination of request sequence numbers.  Previously, XCB had an
Xlib-specific lock, and allowed Xlib to block XCB from making requests.
Now we've replaced that lock with a handoff mechanism, xcb_take_socket,
allowing external code to ask XCB for permission to take over the write
side of the socket and send raw data with xcb_writev.  The caller of
xcb_take_socket must supply a callback which XCB can call when it wants
the write side of the socket back to make a request.  This callback
synchronizes with the external socket owner, flushes any output queues if
appropriate, and then returns the sequence number of the last request sent
over the socket.

Commit by Josh Triplett and Jamey Sharp.
Handoff mechanism inspired by Keith Packard.
2008-10-29 15:40:41 -07:00
Jamey Sharp baff35a04b Track 64-bit sequence numbers internally.
External APIs that used 32-bit sequence numbers continue to do so.

Commit by Josh Triplett and Jamey Sharp.
2008-10-29 15:40:41 -07:00
Jamey Sharp 96e55444b9 Use sequence number ranges in pending replies
This allows optimizing adjacent pending replies with the same flags, and
will help support default flags for a range of future requests.

Commit by Josh Triplett and Jamey Sharp.
2008-10-29 15:40:41 -07:00
Jamey Sharp 059ca642c7 Inline _xcb_lock_io, _xcb_unlock_io, and _xcb_wait_io.
These functions are once again a single pthread call, so just make that
call directly.
2008-10-29 15:40:41 -07:00
Jamey Sharp d989656cde Remove libxcb-xlib and xcbxlib.h. 2008-10-29 15:40:04 -07:00
Julien Danjou cebd482a20 allow compile-time setting for XCB queue buffer size
Signed-off-by: Julien Danjou <julien@danjou.info>
2008-10-14 20:38:47 +02:00
Henning Sten db332dcda9 fix tiny memory leak in read_packet (leak only happens when malloc returns NULL so it's very rare)
Signed-off-by: Julien Danjou <julien@danjou.info>
2008-09-20 14:21:17 +02:00
Carsten Meier 9afadd2aef Added generation of extern "C" for compatibility with C++
The auto-generated header files now include an extern "C"
declaration for compatibility with C++.

Signed-off-by: Julien Danjou <julien@danjou.info>
2008-09-09 15:00:38 +02:00
Julien Cristau 25e59ccc0d Add support for the abstract socket namespace under Linux
Based on same in Xtrans.

Signed-off-by: Julien Danjou <julien@danjou.info>
2008-09-09 14:44:54 +02:00
Julien Cristau f3f8738436 Fix some fd leaks in _xcb_open_*()
Signed-off-by: Julien Danjou <julien@danjou.info>
2008-09-09 14:44:54 +02:00
Bart Massey d6d44e1bf0 fixed overly aggressive warning about fixed field following variable 2008-09-03 13:52:58 -07:00
Bart Massey 7e0674e761 added small fix to support trailing fixed fields; also warning for non-pad fixed fields 2008-09-03 11:58:14 -07:00
Vincent Torri 2d04a1e6ce factorize m4 macros and add one to set X extensions
Signed-off-by: Julien Danjou <julien@danjou.info>
2008-08-31 10:33:31 +02:00
Julien Danjou bcf662c1b4 Initialize all fields of addrinfo
Signed-off-by: Julien Danjou <julien@danjou.info>
2008-08-28 14:35:54 +02:00
Julien Danjou baf31b1bf2 Use ifdef instead of if for defined value
Signed-off-by: Julien Danjou <julien@danjou.info>
2008-08-28 13:51:38 +02:00
Julien Danjou 38d5de3a55 Set namelen unsigned
Signed-off-by: Julien Danjou <julien@danjou.info>
2008-08-28 13:49:21 +02:00
Julien Danjou 9c9c09b376 Rename index to idx to avoid shadowing
Signed-off-by: Julien Danjou <julien@danjou.info>
2008-08-28 13:49:21 +02:00
Julien Danjou c5b2e53abf Use a signed size in read_block()
Signed-off-by: Julien Danjou <julien@danjou.info>
2008-08-28 13:49:21 +02:00
Julien Danjou 1bbdba5211 Use unsigned to compare and rename sync
- i must be unsigned to be compare in the loop
- sync shadow global sync() function

Signed-off-by: Julien Danjou <julien@danjou.info>
2008-08-28 13:49:21 +02:00
Julien Danjou 6438584285 Fix htonl() arg & convert sizeof() to signed
Signed-off-by: Julien Danjou <julien@danjou.info>
2008-08-28 13:49:21 +02:00
Julien Danjou 1ead02e88e initialize global_id to 0
Signed-off-by: Julien Danjou <julien@danjou.info>
2008-08-28 13:49:21 +02:00
Julien Cristau cdc3479387 Make EXTHEADERS, EXTSOURCES, EXTENSION_XML unconditional of configure flags.
yay, make distcheck works now even when some extensions are disabled.

Acked-by: Peter Hutterer <peter.hutterer@who-t.net>
2008-07-16 23:25:04 +09:30
Petr Salinger a9d15a0845 fix FreeBSD support
The GNU/kFreeBSD (and BSDs in general) have a different
layout of struct sockaddr, sockaddr_in, sockaddr_un ...

The first member do not have to be "sa_family",
they also have "sa_len" field.

Signed-off-by: Julien Danjou <julien@danjou.info>
2008-07-07 17:57:37 +02:00
Josh Triplett 424ad131b7 Fix variable declaration formatting 2008-05-28 12:26:13 -07:00
Peter Hutterer 6532c715c3 Add xcb_ge_event_t and handling for long events.
GenericEvent can be more than 32 bytes long. Ensure that the required data is
pulled off the wire and tack it onto the event.

Due to the structure of the xcb_generic_event_t, the data is appended AFTER
the full_sequence field.
2008-05-21 21:22:13 +09:30
Oswald Buddenhagen b08a5909da Fix libxcb/src compile with srcdir != builddir. 2008-05-01 16:17:55 -04:00
Eamon Walsh 4a405feba8 Replace a stray c-client.xsl in the libxcb SOURCES. Fixes make distcheck. 2008-04-23 20:28:13 -04:00
Eamon Walsh 40566c36d5 Use the python install path from xcb-xproto.pc to locate the xcbgen package. 2008-04-23 20:25:57 -04:00
Jeremy Kolb b3832bcc46 Add mention of PYTHONPATH if xcbgen cannot be found. 2008-04-20 16:26:51 -04:00
Eamon Walsh 5ee915e12a Add Python parser C language-dependent part. 2008-04-19 04:44:29 -04:00
Eamon Walsh 947a2e26e4 Add SELinux extension support, disabled by default. 2008-01-24 16:02:34 -05:00
Eamon Walsh 0b5f684eb0 Add XInput extension support, disabled by default. 2008-01-24 15:57:35 -05:00
Eamon Walsh 7a74ba3d02 Generated the configure.ac and Makefile.am's in libxcb with the idea of
making each extension library individually selectable for build.

Signed-off-by: Eamon Walsh <ewalsh@tycho.nsa.gov>
2007-12-07 16:22:04 -05:00
Bart Massey 9bf8329b50 make IPv6 optional 2007-11-24 14:53:54 -08:00
Eamon Walsh 46413cd85e Add comment noting the requirement to free replies when finished. 2007-11-16 19:34:42 -05:00
Jamey Sharp af50de26c1 Revert "Generate error constants as XCB_BAD_*, similar to Xlib."
Since several extensions named their errors like "BadFoo", this patch
results in names like XCB_EXT_BAD_BAD_FOO, which is really awful. Those
extensions are already kind of awful, as they produce structure names
like xcb_ext_bad_foo_error_t, which is redundant.

A patch that removes "Bad" from the XML extension descriptions, while
maintaining API and ABI compatibility in XCB, is needed before this
patch can be released.

This reverts commit 158c9b6ba1.
2007-11-04 17:26:21 -08:00
Jamey Sharp a29fbc2645 Don't hold the xlib-xcb lock while sleeping: that allows deadlock.
With this patch, `ico -threads 2` runs without deadlock.

Many thanks to Christoph Pfister <christophpfister@gmail.com> for
pointing out the problem, providing detailed analyses, explaining it to
me repeatedly until I understood what was going on, and proposing and
reviewing possible solutions.

Signed-off-by: Jamey Sharp <jamey@minilop.net>
Acked-by: Christoph Pfister <christophpfister@gmail.com>
2007-10-28 13:28:18 -07:00