Commit Graph

91 Commits

Author SHA1 Message Date
koda@google.com c2da2d9830 Make ASAN/MSAN ignore Dart frames.
Frames initialized by generated code are unknown to ASAN/MSAN, so we must explicitly mark it as initialized.

For some (unknown) reason, this only caused failures on the build bot.

TBR=asiva@google.com

Review URL: https://codereview.chromium.org//915723002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@43661 260f80e4-7a28-3924-810f-c04153c831b5
2015-02-10 18:43:27 +00:00
johnmccutchan@google.com 420aa94c56 Split profiler.cc into profiler.cc and profiler_service.cc
BUG=
R=asiva@google.com

Review URL: https://codereview.chromium.org//864173008

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@43623 260f80e4-7a28-3924-810f-c04153c831b5
2015-02-09 23:22:19 +00:00
turnidge@google.com e65e6fab9d Begin migrating the vm service from a rest-style interface to a json-rpc style interface.
BUG=

Review URL: https://codereview.chromium.org//823403004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@43370 260f80e4-7a28-3924-810f-c04153c831b5
2015-02-02 23:15:40 +00:00
johnmccutchan@google.com bedcc03afb Remove unsupported --profile-dir flag and related code
BUG=
R=asiva@google.com

Review URL: https://codereview.chromium.org//877143002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@43198 260f80e4-7a28-3924-810f-c04153c831b5
2015-01-27 18:31:41 +00:00
johnmccutchan@google.com 81ce3ffef4 Speedup profile generation for stress test benchmark by 176x
Processed 779753 frames
CodeTables: live=9604 dead=5345 tag=51

FixTopFrame took 158092 millis.
CodeRegionTableBuilder took 13616 millis.
CodeRegionExclusiveTrieBuilder took 283 millis.
CodeRegionTableCallersBuilder took 57 millis.
CodeTableStream took 5637 millis.

~176 seconds

--- Fix PageSpace::FindObject to fast path executable pages

Processed 648584 frames
CodeTables: live=9398 dead=4655 tag=45

FixTopFrame took 68401 millis.
CodeRegionTableBuilder took 6401 millis.
CodeRegionExclusiveTrieBuilder took 222 millis.
CodeRegionTableCallersBuilder took 45 millis.
CodeTableStream took 267 millis.

~74 seconds

--- Fix PageSpace::Contains to fast path executable pages

Processed 690756 frames
CodeTables: live=9329 dead=5310 tag=49

FixTopFrame took 234 millis.
CodeRegionTableBuilder took 173 millis.
CodeRegionExclusiveTrieBuilder took 265 millis.
CodeRegionTableCallersBuilder took 60 millis.
CodeTableStream took 331 millis.

~1 second

R=iposva@google.com

Review URL: https://codereview.chromium.org//839833003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@42672 260f80e4-7a28-3924-810f-c04153c831b5
2015-01-07 21:39:49 +00:00
koda@google.com a1faa84c2a Make all tests pass ASAN.
Unpoison additional locations touched by profiler's stack walking.
Use return value of Isolate::GetProfilerStackBounds.

Commands to build and test:

export CXX="third_party/clang/linux/bin/clang++ -fsanitize=address -fPIC"

gclient runhooks

./tools/build.py -m debug -a x64 runtime

ASAN_OPTIONS=handle_segv=0 python tools/test.py --report --time --mode=debug --arch=x64 --compiler=none --runtime=vm --failure-summary --write-debug-log --write-test-outcome-log --copy-coredumps --exclude-suite=pkg --checked
R=iposva@google.com

Review URL: https://codereview.chromium.org//813163010

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@42635 260f80e4-7a28-3924-810f-c04153c831b5
2015-01-06 15:44:26 +00:00
koda@google.com 08edbbd6b4 MemorySanitizer support.
Enables building (including generating snapshot) and running simple scripts under MemorySanitizer.
Not all tests pass yet.

R=asiva@google.com

Review URL: https://codereview.chromium.org//816123002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@42561 260f80e4-7a28-3924-810f-c04153c831b5
2014-12-23 01:07:58 +00:00
johnmccutchan@google.com 456bdc4ea3 Enable the profiler on the simulator
R=asiva@google.com

Review URL: https://codereview.chromium.org//718393005

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@41752 260f80e4-7a28-3924-810f-c04153c831b5
2014-11-14 23:15:00 +00:00
zra@google.com 816bf5af2e Fixes for the profiler on arm64.
On arm64, in Dart code, R18(SP) is the stack pointer.
In C++ code, R31(CSP) is the stack pointer.
The profiler must choose the right one when performing
its bounds checks.

This change also fixes a bug in the InvokeDartCode stub
on arm64 so that CSP is set to the Isolate's stack
limit immediately, rather than a bit later. When it was
set a bit later, if a profiler interrupt came in in the
interim, the stack would be smashed.

R=johnmccutchan@google.com

Review URL: https://codereview.chromium.org//583683002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@40502 260f80e4-7a28-3924-810f-c04153c831b5
2014-09-19 16:25:16 +00:00
johnmccutchan@google.com 3c6822fde3 - Keep track of stack base whenever Dart code is invoked.
- Update stack limit based on stack base.

R=asiva@google.com, turnidge@google.com

Review URL: https://codereview.chromium.org//506933002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@39613 260f80e4-7a28-3924-810f-c04153c831b5
2014-08-27 18:28:47 +00:00
turnidge@google.com 4d5f3ba638 vmservice protocol cleanup
user_name -> name
name -> vmName

Also, vmName is now only provided when it differs from name.

R=johnmccutchan@google.com

Review URL: https://codereview.chromium.org//487023003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@39525 260f80e4-7a28-3924-810f-c04153c831b5
2014-08-25 18:53:43 +00:00
iposva@google.com 14ecdbd66a - Separate the thread implementation used in bin/ and vm/
to allow us to make VM specific changes.

R=asiva@google.com

Review URL: https://codereview.chromium.org//463993002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@39172 260f80e4-7a28-3924-810f-c04153c831b5
2014-08-12 23:19:53 +00:00
johnmccutchan@google.com 207752927d Disable ProfilerNativeStackWalker on Win64
BUG=

Review URL: https://codereview.chromium.org//455873002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@39041 260f80e4-7a28-3924-810f-c04153c831b5
2014-08-08 16:50:04 +00:00
vegorov@google.com 26376a1e58 Don't try to read return address from the stack of another thread on Win64.
This is not safe unless we are inside the Dart code.

Remove incorrect code that was trying to guard against STATUS_GUARD_PAGE_VIOLATION by checking FP.

BUG=http://dartbug.com/20421
R=johnmccutchan@google.com

Review URL: https://codereview.chromium.org//451033002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@39035 260f80e4-7a28-3924-810f-c04153c831b5
2014-08-08 13:43:08 +00:00
johnmccutchan@google.com ae9b2a9dd5 Add build configuration variable 'c_frame_pointers' to control whether or not frame pointers are included and which stack walker the profiler uses.
BUG=
R=iposva@google.com

Review URL: https://codereview.chromium.org//414303004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@38711 260f80e4-7a28-3924-810f-c04153c831b5
2014-07-29 22:48:57 +00:00
johnmccutchan@google.com 6f0b2bb2a9 Profiler tweaks
* Rename Script tag to Dart tag.
* Respect ignore bit on samples.
* Mark samples collected with an exit frame.
* Don't give exclusive CPU ticks to top frame on samples collected from an exit frame (because CPU usage is in the native code we've called out to not the function waiting to return).

R=asiva@google.com

Review URL: https://codereview.chromium.org//418433002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@38522 260f80e4-7a28-3924-810f-c04153c831b5
2014-07-23 21:09:25 +00:00
iposva@google.com 28c8553cb6 - Fix a lot of warnings generated by -Wshorten-64-to-32
when compiling for ia32 on Mac.

R=vegorov@google.com

Review URL: https://codereview.chromium.org//415513002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@38499 260f80e4-7a28-3924-810f-c04153c831b5
2014-07-23 14:10:13 +00:00
johnmccutchan@google.com 2abbaca938 Add Dart stack walker that relies on frame pointers.
* It is used only when we don't have a top exit frame and we have the script tag set.
* Steps across exit frames and only collects Dart frames.

R=asiva@google.com

Review URL: https://codereview.chromium.org//408663004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@38475 260f80e4-7a28-3924-810f-c04153c831b5
2014-07-22 21:08:22 +00:00
johnmccutchan@google.com 98a959ff35 Really fix the build
BUG=

Review URL: https://codereview.chromium.org//408493004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@38412 260f80e4-7a28-3924-810f-c04153c831b5
2014-07-18 21:11:45 +00:00
johnmccutchan@google.com 597caa1754 Fix build breakage introduced in r38409
BUG=

Review URL: https://codereview.chromium.org//403003003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@38411 260f80e4-7a28-3924-810f-c04153c831b5
2014-07-18 21:04:36 +00:00
johnmccutchan@google.com 86bf7bb898 Profiler cleanup
BUG=
R=asiva@google.com

Review URL: https://codereview.chromium.org//397163002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@38409 260f80e4-7a28-3924-810f-c04153c831b5
2014-07-18 20:55:24 +00:00
johnmccutchan@google.com e7ddd5d047 Move some isolate state setup from C++ code to JumpToExceptionHandler stub (take 3).
- CL is the same as take 2, but, I now prohibit the profiler from walking the call stack when the isolate is executing the jump to exception handler.

R=asiva@google.com

Review URL: https://codereview.chromium.org//395233002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@38300 260f80e4-7a28-3924-810f-c04153c831b5
2014-07-16 18:03:17 +00:00
johnmccutchan@google.com 7366afd86e Revert r38240
BUG=

Review URL: https://codereview.chromium.org//393103002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@38257 260f80e4-7a28-3924-810f-c04153c831b5
2014-07-15 20:48:20 +00:00
johnmccutchan@google.com efc684e4a8 Move some isolate state setup from C++ code to JumpToExceptionHandler stub
This change means that the isolate's top exit frame info and vm tag will only be updated after setting the frame pointer.

This is step one in a series of changes to allow the profiler to walk the stack when there is no frame pointer.

R=asiva@google.com

Review URL: https://codereview.chromium.org//393693002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@38240 260f80e4-7a28-3924-810f-c04153c831b5
2014-07-15 16:39:19 +00:00
johnmccutchan@google.com 9812f8a581 - Enable top exit frame profiler mode by default
- Final Windows fixes for using StackFrameIterator from different thread.

R=asiva@google.com

Review URL: https://codereview.chromium.org//360373003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@37918 260f80e4-7a28-3924-810f-c04153c831b5
2014-07-01 22:21:43 +00:00
johnmccutchan@google.com ef2adfc5c6 Allow StackFrameIterator to be used on a different thread than the isolate whose stack frames are being iterated over.
This is necessary to be able to use this in the profiler.

BUG=
R=asiva@google.com

Review URL: https://codereview.chromium.org//354063004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@37886 260f80e4-7a28-3924-810f-c04153c831b5
2014-07-01 17:38:13 +00:00
johnmccutchan@google.com 59a859c2e8 Switch to old stackwalker until Windows crashes are fixed
BUG=

Review URL: https://codereview.chromium.org//351363003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@37769 260f80e4-7a28-3924-810f-c04153c831b5
2014-06-26 22:47:47 +00:00
johnmccutchan@google.com 70e89dc996 Use Dart stack walker when we have an exit frame.
This makes the profiler more Dart developer friendly (but less VM developer friendly).

Also, fixes a bug where the top exit frame info would be invalid after an exception occurs.

The flag: --profile-vm allows for profiling of VM internals.

R=asiva@google.com

Review URL: https://codereview.chromium.org//341083002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@37767 260f80e4-7a28-3924-810f-c04153c831b5
2014-06-26 22:06:34 +00:00
johnmccutchan@google.com c897df4e7b Make size of sample variable based on the profile depth flag.
R=iposva@google.com

Review URL: https://codereview.chromium.org//345713006

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@37553 260f80e4-7a28-3924-810f-c04153c831b5
2014-06-20 14:46:54 +00:00
zra@google.com e3f564fb6c Changes for running tests on arm64 hardware.
R=regis@google.com

Review URL: https://codereview.chromium.org//311413002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@37046 260f80e4-7a28-3924-810f-c04153c831b5
2014-06-05 18:43:55 +00:00
johnmccutchan@google.com 01a2e6ae49 WakeUp thread interrupter when isolate is made current
BUG=
R=iposva@google.com

Review URL: https://codereview.chromium.org//302433007

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@36639 260f80e4-7a28-3924-810f-c04153c831b5
2014-05-26 15:55:48 +00:00
johnmccutchan@google.com b3f2fb14d0 Reduce CPU usage when no isolates need to be profiled (e.g. when an isolate calls readLineSync or sleep the isolate owns the thread but is blocked).
This CL does the following:

- Introduces two new API entry points: Dart_IsolateBlocked and Dart_IsolateUnblocked.
- The thread interrupter thread goes into a deep sleep if no isolates need to be profiled (not scheduled on a thread or are in a blocking call).
- When an isolate unblocks, the thread interrupter thread resumes regular interrupts.
- dart:io readLineSync and sleep mark that they are making a blocking call.

This fixes https://code.google.com/p/dart/issues/detail?id=18126 reducing CPU usage to 0% when waiting for stdin or sleeping.

R=ajohnsen@google.com, iposva@google.com

Review URL: https://codereview.chromium.org//297183003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@36632 260f80e4-7a28-3924-810f-c04153c831b5
2014-05-26 11:53:49 +00:00
ajohnsen@google.com 8e06e7c859 Guard against frames across pages, in the profiler.
On Windows, if a page is not touched yet by the stack's thread, the page may be a guard page.

BUG=
R=johnmccutchan@google.com

Review URL: https://codereview.chromium.org//293133007

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@36623 260f80e4-7a28-3924-810f-c04153c831b5
2014-05-26 09:12:46 +00:00
ajohnsen@google.com 02332b5539 Fix thread-interrupter shutdown on Windows.
This reworks the ThreadId on Windows to be the tid, and not an open HANDLE.

BUG=
R=johnmccutchan@google.com

Review URL: https://codereview.chromium.org//294193003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@36502 260f80e4-7a28-3924-810f-c04153c831b5
2014-05-22 15:12:09 +00:00
johnmccutchan@google.com 6858b4d4af Fix edge case where profiler would miss the caller of the top frame.
Some stubs (and intrinsics) do not push a frame onto the stack leaving
the frame pointer in the caller.

  PC -> STUB
  FP -> DART3  <-+
        DART2  <-|  <- TOP FRAME RETURN ADDRESS.
        DART1  <-|
        .....

In this case, traversing the linked stack frames will not collect a PC
inside DART3. The stack will incorrectly be: STUB, DART2, DART1.
In Dart code, after pushing the FP onto the stack, an IP in the current
function is pushed onto the stack as well. This stack slot is called
the PC marker. We can use the PC marker to insert DART3 into the stack
so that it will correctly be: STUB, DART3, DART2, DART1. Note the
inserted PC may not accurately reflect the true return address from STUB.

R=asiva@google.com, srdjan@google.com

Review URL: https://codereview.chromium.org//264933006

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@35762 260f80e4-7a28-3924-810f-c04153c831b5
2014-05-05 20:04:16 +00:00
turnidge@google.com 9243ffc4ff Always use the same json for null in the vm service.
PrintToJSONStream -> PrintJSON.

ALSO:

Fix <em> tags in the Observatory.

BUG=
R=johnmccutchan@google.com

Review URL: https://codereview.chromium.org//257053003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@35532 260f80e4-7a28-3924-810f-c04153c831b5
2014-04-29 18:10:02 +00:00
johnmccutchan@google.com 15eff079d7 Collect samples during isolate startup
BUG=
R=asiva@google.com

Review URL: https://codereview.chromium.org//250883017

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@35522 260f80e4-7a28-3924-810f-c04153c831b5
2014-04-29 14:17:31 +00:00
zra@google.com 37baacb116 Small fixes for Android.
R=johnmccutchan@google.com

Review URL: https://codereview.chromium.org//254383003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@35342 260f80e4-7a28-3924-810f-c04153c831b5
2014-04-23 23:20:24 +00:00
johnmccutchan@google.com 1e72c0f6c4 Disable applyAuthorStyles
This allows us to remove the dependency on bootstrap.css (removal of bootstrap.css from third_party will happen in follow up CL).

As a side effect of this, the following changes have occurred:

- Removed Google Charts Table from allocation profile pane.
- Add a SortedTable view-model (used in allocation profile).
- Changes to CPU profile tree view.
- Consolidate string formatting utility functions.

There is some UI regression (font size is one size too small) that will have to be addressed in follow up CLs.

R=turnidge@google.com

Review URL: https://codereview.chromium.org//237683004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@35266 260f80e4-7a28-3924-810f-c04153c831b5
2014-04-22 16:01:14 +00:00
johnmccutchan@google.com 8f0056371d Initial UserTag and dart:profiler library
R=asiva@google.com, srdjan@google.com

Review URL: https://codereview.chromium.org//230863005

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@34949 260f80e4-7a28-3924-810f-c04153c831b5
2014-04-10 22:32:45 +00:00
johnmccutchan@google.com ef666553a1 Add runtime and native entry tags
- Split runtime and native entry tags.
- Set runtime / native entry address as vm tag in stubs.
- Add reverse native entry resolver (pc to name) to public API (breaking change).
- Hookup reverse resolver for standalone VM (io + bootstrap + builtin natives).
- Runtime entries are registered with tags.
- Profiler queries for tag names via the reverse native entry resolver.
- Profiler outputs named entry tags as children under parent tag (runtime or native).

R=asiva@google.com

Review URL: https://codereview.chromium.org//227433004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@34941 260f80e4-7a28-3924-810f-c04153c831b5
2014-04-10 20:26:45 +00:00
johnmccutchan@google.com 182fcd0921 Add isolate tag-profile model and UI.
Distinction between a Dart Error and a ServiceError/ServiceException.
Better Observatory behaviour when a ServiceError/ServiceExceptions occurs.
Display isolate's sticky error.

R=turnidge@google.com

Review URL: https://codereview.chromium.org//205713004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@34377 260f80e4-7a28-3924-810f-c04153c831b5
2014-03-25 18:09:02 +00:00
johnmccutchan@google.com 6952f5ddfe Use VM tag in profile and add stack trace trie
R=asiva@google.com, turnidge@google.com

Review URL: https://codereview.chromium.org//201213004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@34064 260f80e4-7a28-3924-810f-c04153c831b5
2014-03-18 21:20:41 +00:00
johnmccutchan@google.com 239c0d564c Fix C++11 compilation error
BUG=

Review URL: https://codereview.chromium.org//197763011

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@33666 260f80e4-7a28-3924-810f-c04153c831b5
2014-03-13 21:18:27 +00:00
johnmccutchan@google.com 6ea46abd34 Create a shadow table to track CodeRegions of reused code address space.
R=asiva@google.com, turnidge@google.com

Review URL: https://codereview.chromium.org//197803004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@33665 260f80e4-7a28-3924-810f-c04153c831b5
2014-03-13 21:00:44 +00:00
johnmccutchan@google.com 6edd276df8 Switch Observatory to use only ServiceObject instances.
All fetched objects are upgraded to a ServiceObject.
ServiceObjectCache.
Uniform updating / refreshing.
Fix UTF8 string escaping in TextBuffer (should fix invalid character bug https://code.google.com/p/dart/issues/detail?id=16590)

R=turnidge@google.com

Review URL: https://codereview.chromium.org//192443004

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@33541 260f80e4-7a28-3924-810f-c04153c831b5
2014-03-11 17:48:09 +00:00
johnmccutchan@google.com 97fe225e63 Display sample count and refresh time.
Fix some uninitialized variables.
Don't send disassembly by default.

R=turnidge@google.com

Review URL: https://codereview.chromium.org//185563013

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@33380 260f80e4-7a28-3924-810f-c04153c831b5
2014-03-06 16:48:49 +00:00
johnmccutchan@google.com e9e54f6af6 Cleanup native, collected, and stub code handling in profiler
R=iposva@google.com, turnidge@google.com

Review URL: https://codereview.chromium.org//182703003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@33177 260f80e4-7a28-3924-810f-c04153c831b5
2014-02-28 22:55:53 +00:00
johnmccutchan@google.com 36ae6bf453 Turn stack walking verification into a flag
BUG=
R=asiva@google.com

Review URL: https://codereview.chromium.org//183633002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@33129 260f80e4-7a28-3924-810f-c04153c831b5
2014-02-27 19:35:57 +00:00
johnmccutchan@google.com 34dc7adc64 Fix usage of heap_
BUG=

Review URL: https://codereview.chromium.org//183113005

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@33124 260f80e4-7a28-3924-810f-c04153c831b5
2014-02-27 18:07:22 +00:00