Commit Graph
25040 Commits
Author SHA1 Message Date
Domagoj Kriskovic 8ccdc0fbc4 Add markdown link tooltip support to the visual editor
GitOrigin-RevId: 7ab4fd0793f057c86e4fc0307d81df376efe4d34
2026-06-16 08:05:46 +00:00
Lucie GermainandClaude Sonnet 4.6 93a4f0c88a Remove unused celebrate dependency from project-history (#34604)
celebrate is declared in project-history's package.json but never imported
anywhere in the service. Dropping it removes one of the consumers pulling in
joi@17 and shrinks the dependency surface. docstore still uses celebrate, so
it remains in the lockfile.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
GitOrigin-RevId: 171c3e5435495d20256bd9b95158a275ec42f7e3
2026-06-15 08:08:10 +00:00
Jakob Ackermann b193fe7121 [real-time] flag mismatching update.doc field and add fallback (#34531)
GitOrigin-RevId: ade5aefc473a74da8a99df7cc33a88bc49885d5d
2026-06-15 08:08:05 +00:00
Jakob Ackermann 58970cd6ea [clsi] prepare for non-representative clsiServerIds (#34546)
* [clsi] forward instanceType to web

* [clsi] expose zone in compile response

* [clsi-perf] add new fields for instanceType and zone

* [clsi] expose isPreEmptible flag in compile response

* [clsi-perf] also add isPreEmptible field

* [clsi] rename isPreEmptible -> isSpotInstance

GitOrigin-RevId: 2bc2d772e0b14da83afb51f5f3e4fefd3f60b733
2026-06-15 08:08:00 +00:00
Jakob Ackermann d5384d9fdb [web] add LRU cache for geoip details (#34521)
GitOrigin-RevId: 0c96b53228b3e4fd764ac09e029db8b3f2b45de7
2026-06-15 08:07:55 +00:00
Eric Mc Sween 8c9a80925e Merge pull request #34565 from overleaf/em-bibtex-modal-scroll
Make BibTeX modals scrollable

GitOrigin-RevId: 3ef2d2e7ac5e481c0e31c937b62ff4467c23f220
2026-06-15 08:07:29 +00:00
Antoine Clausse 5a2794e632 [web] Add ai-limit-upgrade-copy split test on the interstitial (#34525)
* [web] Add ai-limit-upgrade-copy split test on the interstitial

* Add french translations

* Exclude trials from ai-limit-copy

* Add `workbench` and `assistant` to the paywall-types having the updated copy

GitOrigin-RevId: 8da856c17718280c74919a38ec78345d0bd5f781
2026-06-15 08:07:09 +00:00
32664a1d12 [web] Update Share modal paywall CTAs to point to the plans interstitial (#34410)
* [web] Send paywall upgrade CTAs to the plans interstitial

* fix: encode upgradePlan campaign source with URLSearchParams

Co-authored-by: lzear <8427791+lzear@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
GitOrigin-RevId: ddde4d77d72e649f5ded5839a2a2155e5f679f53
2026-06-15 08:07:04 +00:00
Mathias Jakobsen a4c91ce671 Merge pull request #34453 from overleaf/mj-outline-style-cleanup
[web] Clean up outline styles post-editor redesign

GitOrigin-RevId: 43ac3aae6be79fe0844add32cb01d465db82b29e
2026-06-15 08:06:59 +00:00
Mathias Jakobsen 948ea8ac09 Merge pull request #34466 from overleaf/mj-logs-style-cleanup
[web] Clean up logs styles post-editor redesign

GitOrigin-RevId: 90e4a8ea1d3d02bc623847b1257cc1011e5c04c9
2026-06-15 08:06:54 +00:00
Mathias Jakobsen e2e01090a6 [web] Add custom stylelint rule for catching themed variables in :root selector (#34571)
* [web] Add custom stylelint rule for catching themed variables in root selector

* [web] Add lint rule for themed custom property naming

GitOrigin-RevId: 989452e26e427a93f9276ecf011ab7434f96efb1
2026-06-15 08:06:50 +00:00
Domagoj Kriskovic 74fa4d95b2 Refactor visual editor extension handling
GitOrigin-RevId: e4571d33a36d786997e9de80a8413ca84e8ddf04
2026-06-15 08:06:33 +00:00
Domagoj Kriskovic 7b3692ce6f Module for loading per language visual editor extensions
GitOrigin-RevId: 5244e754337a1e48b8de63e881648b2397500b25
2026-06-15 08:06:28 +00:00
Jakob Ackermann 9743c7006e [clsi] tests: remove verbose after hook for printing metrics (#34532)
This was useful when iterating on the pdf-caching feature.
PDF caching has been stable for years. We can remove the logging now.

GitOrigin-RevId: 826c91c1e45d3dae1bb3ce5aeb7b6a3f9283392c
2026-06-15 08:06:23 +00:00
Tim Down 0559f26753 Merge pull request #34230 from overleaf/td-pricing-accordion-bottom-border
Remove bottom border on FAQs accordion on pricing page

GitOrigin-RevId: 11e09bafab34eedbd80e20702e8c893a311fb6d0
2026-06-15 08:06:10 +00:00
Tim Down db2fe61a20 Merge pull request #34373 from overleaf/td-latex-parser-relax-text-restriction
Allow ^ and _ in text nodes by default in LaTeX grammar

GitOrigin-RevId: 9e94d86f7a0540431eb28d29c0fa79a0ea889855
2026-06-15 08:06:05 +00:00
Tim Down 1d30b81068 Merge pull request #34558 from overleaf/td-safari-15
Make browser policies relating to Safari 14.x match

GitOrigin-RevId: 3b82bcb3acedfda9b8835413a92da322619a8571
2026-06-15 08:05:59 +00:00
Jessica Lawshe 035549dec0 Merge pull request #34214 from overleaf/kc-domain-capture-grace-period-ui
[web] Domain capture grace period UI

GitOrigin-RevId: 90ff8cc186ec12d5cd227d52405862ddca63c33d
2026-06-12 08:06:43 +00:00
Miguel Serrano 4ba7f01ba4 [git-bridge] Cache maven artifacts in base layer (#34424)
* [git-bridge] Cache maven artifacts in base layer

Adds a Dockerfile stage to resolve dependencies in the `base` layer, which is cached for production and e2e/dev builds.

GitOrigin-RevId: 0830a3be0c02e5e09e370cf64cdccc30ebf42d7a
2026-06-12 08:06:25 +00:00
David f27112179a Merge pull request #33771 from overleaf/mj-git-bridge-default-main
[git-bridge] Default new projects to main rather than master

GitOrigin-RevId: 3d7d60c0aab6e5d0d10d282d6d491d4f735ed94c
2026-06-12 08:06:20 +00:00
MoxAmber 886985d91c Merge pull request #33717 from overleaf/as-new-link-sharing-pass-groups
[web] Pass project owner link sharing settings to frontend

GitOrigin-RevId: ff000f38ef36a3d448a2934d0c5963139852eee2
2026-06-12 08:06:12 +00:00
Jessica Lawshe ea8cc47ee2 Merge pull request #34330 from overleaf/jel-web-save-captured_by_group
[web] Send email alert when domain is captured or not

GitOrigin-RevId: 5554d82653be3226e5d72a0e42ca8aaa9a9b8f41
2026-06-11 08:05:44 +00:00
Brian Gough 57d76da263 drop zero-length retain operations in project-history (#34427)
GitOrigin-RevId: ec3069a3ea3b7d487548ba181a2dde9772e308e5
2026-06-11 08:05:33 +00:00
Brian GoughandCopilot Autofix powered by AI da85973cca add script for uploading a file to a project (#33874)
* add script for uploading a file to a project

* fix default source name in script

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* reject folders as an upload destination

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* validate destination path when normalizing

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
GitOrigin-RevId: 4a6ce79652074475fc2065156718a23156e8b0bd
2026-06-11 08:05:29 +00:00
David be5f8b425a Merge pull request #34450 from overleaf/dp-handle-dot-git-error
[git-bridge] Surface GitUserException messages to the git client

GitOrigin-RevId: 45256ca8005142a0f70839e2567341a5984955a7
2026-06-11 08:05:18 +00:00
David bfc46c4591 Merge pull request #34467 from overleaf/dp-git-bridge-dynamic-port
[git-bridge] Bind integration test server to a dynamic port

GitOrigin-RevId: 12b570dbb4bc092c05e864c28ff554d672084804
2026-06-11 08:05:14 +00:00
roo hutton a36a6731b6 Merge pull request #34442 from overleaf/rh-cio-sdk-proxy
Strip page title from customer.io page views

GitOrigin-RevId: 06fbc785e7fa3d5e51afe16a887e342d4868c3ef
2026-06-10 11:59:11 +00:00
Rebeka Dekany 5a821a055b Show tax note conditionally and update zero-tax disclaimer wording (#34454)
* Hide tax note when tax is included and update zero-tax disclaimer wording

* fix: update taxes_may_be_added key in all non-English locale files

GitOrigin-RevId: 9cd0e0aba6d548221e97d383b0a2e52a2e0a077c
2026-06-10 11:59:06 +00:00
Anna Claire Fields b2edd33ca5 [PnP Migration] update ESLint cache location to use a unified .cache directory (#34485)
GitOrigin-RevId: 3b4551405e4b9fa552d6f289a31dd4eb2a73d875
2026-06-10 11:58:34 +00:00
Olzhas Askar 5ae13ef025 Merge pull request #34374 from overleaf/oa-extend-telemetry
[web] Extend paywall telemetry

GitOrigin-RevId: 20efca13734a3aafe70a56fee19b76c62503b828
2026-06-10 11:58:24 +00:00
Malik Glossop 6794af0ede Merge pull request #34110 from overleaf/mg-toolbar-language-suggestions
Add language suggestion controls to editor toolbar

GitOrigin-RevId: fe52b909b44ef8ccfc1449366bbf62f2d9d7ee4e
2026-06-10 11:58:20 +00:00
Miguel Serrano c981330cc1 [web] Disabled AI state for project collaborators (#34256)
* [web] Disabled AI state for project collaborators

Displays a disabled state, along with an informative tooltip in Editor AI controls.

GitOrigin-RevId: a749cd25d54f6ef3d7bf4276343400894bc193a4
2026-06-10 11:58:01 +00:00
Miguel Serrano a4d682719b [web] Hide privilege matrix tab in CE/SP (#34339)
The privilege matrix is only available in saas.

GitOrigin-RevId: 72156e82d5039bc622e0119e07d2b4c5b9fdc10d
2026-06-10 11:57:56 +00:00
Miguel Serrano 4ab8de3e38 [web] Skip GeoIpLookup on CE/SP (#34348)
The regression was introduced in 487e1767b8ac531588a272f0492a900c24162b33.

GeoIp is not configured in CE/SP, yielding an error log when rendering the project list.

GitOrigin-RevId: 55410611a5fef95daa5914a31969893107777593
2026-06-10 11:57:51 +00:00
ilkin-overleaf c9e4ab8b99 Merge pull request #33166 from overleaf/ii-share-modal-copy-link
[web] Share modal copy sharing link button

GitOrigin-RevId: a95f879196528ec3bc998558a6838c52aac33069
2026-06-10 11:57:42 +00:00
Davinder Singh 820d5a45ec [WEB] Remove the left border at the start of the toolbar (#34174)
* removing the first child left border

* adding border for review panel

GitOrigin-RevId: 53f1afc63f0860bc46acff4875652454cf6ced6b
2026-06-10 08:07:14 +00:00
ilkin-overleaf 952266da94 Merge pull request #33553 from overleaf/ii-share-modal-privileges-2
[web] Hook up project access controls and privileges to sharing link API

GitOrigin-RevId: 05407476340cabf1ab56a18008f9f3fa978b9d79
2026-06-10 08:06:55 +00:00
Antoine ClausseandClaude Opus 4.7 9dde7d3d71 [web] Add ESLint rules for locale JSON (#34221)
* Remove double spaces

* Enforce curly apostrophes

* Enforce French typographic spaces in fr.json

Add vitest test enforcing French spacing rules per
https://typographisme.net/post/Les-espaces-typographiques-et-le-web:
  - NNBSP (U+202F) before ? ! ;
  - NBSP (U+00A0) before :
  - NBSP (U+00A0) around guillemets « »

Fix 38 fr.json values that were using NBSP (or no space) before ? ! ;.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Extend French typography test to numbers and percent signs

Add rules per https://typographisme.net/post/Les-espaces-typographiques-et-le-web:
  - NNBSP (U+202F) between digit groups (thousands separator)
  - NBSP (U+00A0) between a number and a following word/unit
  - NBSP (U+00A0) before %

Fix 9 fr.json values where a regular space was used instead of NBSP between
a number and a following word (e.g. "1 résultat", "10 jetons", "7 jours").

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Use point médian for inclusive writing in fr.json

Replace parenthetical gender/plural markers like "sûr(e)", "abonné(e)",
"licence(s)" with the point médian "·" (e.g. "sûr·e", "abonné·e",
"licence·s") per modern French écriture inclusive.

Add a vitest rule rejecting "word(suffix)" patterns where suffix is 1-3
letters and there is no space before the opening parenthesis.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Simplify inclusive-writing check to "(e)" substring match

The previous regex (matchAll without the /g flag) would have thrown at
runtime. Drop matchAll entirely and use includes('(e)').

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Add point médian to participles in fr.json

Apply inclusive writing (·e) to past participles agreeing with the
addressed user ("affilié·e", "invité·e", "connecté·e", "abonné·e", etc.).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Use inclusive forms in fr.json

* Change "de Overleaf" to "d’Overleaf"

* Fix tests

* Check for consecutive spaces, not just double spaces

* Update comment about guillemets

* Add ESLint rules for locale JSON conventions

Add three rules to @overleaf/eslint-plugin that run against locale JSON
files via @eslint/json:

- no-consecutive-spaces-in-locales
- no-straight-apostrophes-in-locales
- french-typography-in-locales

Wire them up in services/web/eslint.config.mjs against `locales/*.json`
(and `locales/fr.json` for the French-typography rule).

* Add `@eslint/json` so JSON files can be parsed

* Scope JS/TS-specific config to JS/TS files only so that built-in rules aren't applied to JSON files

* Disable `no-irregular-whitespace` in french-typography-in-locales.js

* Make the rules fixable

* Improve regexes: user `\s` instead of custom matchers

* Add sorted-keys-in-locales ESLint rule

Mirrors scripts/translations/sort.js as a fixable ESLint rule:
require top-level keys in locale JSON files to be sorted alphabetically.
The autofix re-serializes the file with sorted keys.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Add no-unused-locale-keys ESLint rule

Mirrors scripts/translations/cleanupUnusedLocales.js as a fixable ESLint
rule applied only to en.json. Shells out to `find` + `cat` once per
process (cached) to grep all candidate source files for key references,
then reports any en.json key that isn't found. The autofix re-serializes
en.json without the unused keys.

Hardcoded ALWAYS_USED set covers keys built at runtime (month names,
third-party-datastore notifications) that the regex scan can't see.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Add locale-variables-match-en ESLint rule

Mirrors scripts/translations/checkVariables.js as an ESLint rule applied
to non-en locale JSON files. Reads en.json (cached) and reports any
member whose `__name__` placeholders differ from the base.

GLOBALS (e.g. __appName__) are allowed as extras; IGNORE_NESTING_FOR
preserves the script's per-key exceptions.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Replace some double linebreak (@overleaf/no-consecutive-spaces-in-locales)

* Add no-orphan-locale-keys ESLint rule

Detect translation keys in non-en locale files that aren't present in
en.json. Mirrors the `--sync-non-en` flag of cleanupUnusedLocales.js.
The autofix re-serializes the locale file without the orphan keys,
sorted alphabetically.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Add tests for the locale JSON ESLint rules

Cover the four single-file rules:
  - no-consecutive-spaces-in-locales
  - no-straight-apostrophes-in-locales
  - sorted-keys-in-locales
  - french-typography-in-locales (including the inclusive-writing
    suggestion for "(e)")

The three cross-file rules (no-unused-locale-keys, no-orphan-locale-keys,
locale-variables-match-en) read from disk and aren't covered here; they
need integration tests via fixtures.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Drop bin/lint_locales — checks are now covered by ESLint rules

The four checks in bin/lint_locales are duplicated by the new
@overleaf/eslint-plugin rules:

  - sort.js --check                  → sorted-keys-in-locales
  - cleanupUnusedLocales.js --check  → no-unused-locale-keys
                                     + no-orphan-locale-keys
  - checkVariables.js                → locale-variables-match-en
  - single-quote grep                → no-straight-apostrophes-in-locales

`yarn lint` runs the ESLint rules against locales/*.json, so the
lint_locales script and Makefile target are redundant.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Remove Locales.test.mjs

* Delete scripts replaced by @overleaf/eslint-plugin rules

Remove the three locale scripts now superseded by ESLint rules:

  - scripts/translations/sort.js                   → sorted-keys-in-locales
  - scripts/translations/cleanupUnusedLocales.js   → no-unused-locale-keys
                                                   + no-orphan-locale-keys
  - scripts/translations/checkVariables.js         → locale-variables-match-en

Also drop the matching Makefile targets (sort_locales,
cleanup_unused_locales), update AGENTS.md / copilot-instructions.md to
point at `yarn lint --fix` instead, and prune the deleted entries from
the esm-check-migration allowlist.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Delete redundant scripts/translations/sort-locale-file.js

Single-file sort utility — superseded by `yarn lint --fix path/to/file.json`
via the sorted-keys-in-locales ESLint rule. No callers in repo.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Update comments and messages

* Add test file pattern to ESLint configuration

* Reorder "Backend specific rules" so `no-extraneous-dependencies` doesn't fail on test files

* Make french-typography fixes idempotent and catch edge cases

Apply Copilot's review feedback on PR #34221:

  - autoFix() now uses `\\s*`/`\\s+` instead of `\\s?`/`\\s` so it
    collapses any run of mixed whitespace into the correct NBSP/NNBSP,
    making the fix idempotent and order-independent.
  - The `:` lint regex now captures optional whitespace and reports
    when it isn't NBSP (catches `"Liste :"` with a regular space).
  - The `%` lint regex now matches the missing-space case (`"10%"`)
    via `\\s*` instead of requiring one char between digit and `%`.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Remove sort-locale-file.js from pre-commit

* Revert no-unused-locale-keys ESLint rule; Restore lint_locales scripts

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
GitOrigin-RevId: 8351fab074e6e7f77920b70237df1cd1c781e053
2026-06-10 08:06:44 +00:00
Antoine Clausse 998f3a598a [web] Remove deprecated welcome email (#34320)
It was replaced by `welcomeWithoutCTA` a long time ago

GitOrigin-RevId: 688edafcdaf6acb20cb12346335db480d4973159
2026-06-10 08:06:39 +00:00
Alf EatonandClaude Opus 4.7 68ce10440a Add Dimensions search via module and rail panel (#33773)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
GitOrigin-RevId: 5c2811c155c7a1d577c08f6d01564b621b3b264c
2026-06-10 08:06:22 +00:00
MoxAmber 28210bcaeb Merge pull request #32111 from overleaf/as-new-link-sharing-backend
[web] Support link sharing using ProjectInvite

GitOrigin-RevId: 45d988dd6451f962f2709bb1e72a715570816d9c
2026-06-10 08:06:04 +00:00
Chris Dryden b90a8500d5 Merge pull request #34363 from overleaf/cd-migrate-python-runner-to-modules
Migrate the Python script runner into a closed python-runner module

GitOrigin-RevId: ac22f45bcf744c693591076f0b41e8d52249dcbf
2026-06-10 08:06:00 +00:00
Davinder Singh dceb766db0 [WEB] Add AI generator items to the Insert menu (#33967)
* adding  abstract generator in the dropdown

* add abstract generator to Insert menu dropdown

* add Keywords generator to Insert menu

* adding title generator and removing some unused code

* adding spanish translations

* adding buildOpenGeneratorHandler

* changing the approach to slots approach

* removing the feature flag

* niptick

* rename the file

* adding tests

* [WEB] Style changes for Writefull pop-up component   (#34067)

GitOrigin-RevId: 0bc97c2c1f3dc458a2ca30e8cc54dddfd5bc9b3b
2026-06-10 08:05:49 +00:00
Mathias Jakobsen 8a68f89a03 Merge pull request #34415 from overleaf/mj-file-tree-permanent-tabs
[web] Make tab permanent on file tree double click

GitOrigin-RevId: 8fe725eb3235e35d2070d806ad4f57e7f475d188
2026-06-10 08:05:41 +00:00
Jakob AckermannandAnna Claire Fields a8a58f59a4 [monorepo] remove haproxy from service-to-service communication (#34391)
* [web] gracefully handle notifications being down on project dashboard

* [monorepo] remove haproxy from service-to-service communication

Co-authored-by: Anna Claire Fields <acfields11@gmail.com>

* [monorepo] fix OVERLEAF_LATEXQC_API_BASE_URL in dev-env

* [SaaS test fix] update history v1 export base url

---------

Co-authored-by: Anna Claire Fields <acfields11@gmail.com>
GitOrigin-RevId: cf355ef061412a1b57b5383cb60d4be574055af5
2026-06-10 08:05:37 +00:00
Andrew Rumble cc2d74a44d Merge pull request #34406 from overleaf/lg-xmldom-security-fix
[Security upgrade] update @xmldom/xmldom to ^0.8.13 in services/web

GitOrigin-RevId: 2a7d55f73a71c6eb2f82821069cd3a8b367a55a0
2026-06-10 08:05:33 +00:00
David 1542fbab57 Merge pull request #33770 from overleaf/mj-git-bridge-hook-readbranch
[git-bridge] Ensure pushed branches match branch on disk

GitOrigin-RevId: 9fb6b6f6475790ad83b560a84b625e6a2b806254
2026-06-10 08:05:29 +00:00
jmescuderowritefull 2334a95b44 Clean up advance paraphrase experiment and pre-rebranding components (phase1) (#34231)
GitOrigin-RevId: 5481fcd105d0797e099a9c23c51bf18b086631a8
2026-06-10 08:05:21 +00:00
Jakob Ackermann 7f5af99ee9 [web] determine rootResourcePath if not set in compile request (#34398)
* [web] determine rootResourcePath if not set in compile request

This affects the following compile requests:
- compile request from "Download PDF" button on project dashboard
  Pre-resolving the rootResourcePath for all projects is too expensive.
  Adding an endpoint to resolve it is too slow and doubles project auth
  check.
- custom frontends
  Can't do much about these. I tried blocking them, requests still come
  in after weeks of returning 400s.

The rootDoc maintenance methods now return {rootResourcePath,rootDocId}
rather than just the rootDocId. This avoids an extra project lookup when
the rootDocId was updated.

GitOrigin-RevId: ab7c539b7ffd162bde0903fe1040a48834a245f5
2026-06-09 08:07:36 +00:00
Eric Mc Sween 5eb1f41ef7 Merge pull request #34421 from overleaf/em-revert-modals-scrolling
Revert changes to BibTeX modals scrolling

GitOrigin-RevId: a04c3eaeafa08339f2725db13e8fee5d1e7da182
2026-06-09 08:07:31 +00:00