https://github.com/apple/swift

sort by:
Revision Author Date Message Commit Date
c505dc5 Merge pull request #22838 from shajrawi/access_dom_nested DominatedAccessRemoval: fix a bug wherein we incorrectly removes nested conflicting accesses 28 February 2019, 22:04:48 UTC
d1dd7be Merge pull request #22833 from shajrawi/access_opts_assert AccessEnforcementOpts: Fix a bug that caused a compiler assert when dealing with nested scopes 28 February 2019, 22:04:47 UTC
234e525 Merge pull request #22965 from jckarter/opaque-type-ast-5.1 [5.1] Opaque types prototype 28 February 2019, 21:22:54 UTC
ebc7dcc Merge pull request #22821 from bob-wilson/cherry-picks-for-5.1 Cherry pick fixes from 5.0 to swift-5.1-branch 28 February 2019, 21:06:52 UTC
7710d63 Merge pull request #22913 from rintaro/5.1-sema-implicitselfinclosure-rdar47895109 [5.1][Sema] Add defensive guard for implicit use of self in closure check 28 February 2019, 01:41:08 UTC
9dbe676 Merge pull request #22930 from lorentey/xfail-dictionary-invalidation-test-5.1 [5.1][test] Dictionary: Skip a failing index validation test 28 February 2019, 01:27:56 UTC
32f75fd Add test for deserializing opaque types across modules 28 February 2019, 00:54:37 UTC
51f27a9 Sema: Don't allow properties with inferred types to infer opaque result types. This prevents opaque result types from propagating nontrivially into other declarations' types, which may be confusing and create implementation complexities. 28 February 2019, 00:54:37 UTC
f1fcb1f Remove ResilienceExpansion from substOpaqueTypes for now. It's currently meaningless, and it'll require thought to pass the correct value when it becomes meaningful. 28 February 2019, 00:54:37 UTC
95d1a07 Mangle opaque types without underlying types as ErrorType for now. 28 February 2019, 00:54:37 UTC
0fdad00 Respond to Slava's feedback 28 February 2019, 00:54:37 UTC
a1b7f29 Enable opaque result types. 28 February 2019, 00:54:37 UTC
83fbc62 IRGen: Substitute out opaque types when emitting associated types. 28 February 2019, 00:54:37 UTC
d731d37 Serialization: Serialize opaque types and their decls. 28 February 2019, 00:54:37 UTC
7c5b4dd Support nested types on opaque archetypes (and maybe opened ones). 28 February 2019, 00:54:37 UTC
d817986 SILGen: Substitute away opaque types. 28 February 2019, 00:54:37 UTC
a59f67a Sema: Infer the underlying type for opaque return types from function bodies. 28 February 2019, 00:54:37 UTC
26e6e7e Add an OpaqueTypeArchetypeType subclass. 28 February 2019, 00:54:37 UTC
b31eca0 AST: Represent OpaqueTypeDecls. To represent the abstracted interface of an opaque type, we need a generic signature that refines the outer context generic signature with an additional generic parameter representing the underlying type and its exposed constraints. Opaque types also need to be keyed by their originating decl, so that we can treat values of the same opaque type as the same. When we check a FuncDecl with an opaque type specified as its return type, create an OpaqueTypeDecl and associate it with the originating decl. (A representation for *types* derived from the opaque decl will come next.) 28 February 2019, 00:54:37 UTC
8a0154e Parse opaque types. 28 February 2019, 00:54:36 UTC
342575d Serialization: Rework serialization of nested archetypes. Explicitly serialize the parent archetype so that it can be any kind of root archetype. 28 February 2019, 00:54:36 UTC
c4e501b Give opened archetypes a generic environment. And maybe allow nested types to live on them. 28 February 2019, 00:54:36 UTC
81d7060 Merge pull request #22948 from nathawes/unterminated-raw-string-syntax-highlighting-5.1 [5.1][IDE][syntax-coloring] Treat unterminated raw strings as strings for syntax coloring purposes 27 February 2019, 23:41:55 UTC
40f766c Merge pull request #22952 from nkcsgexi/cherry-pick-ide [5.1] cherry pick recent sourcekitd/IDE fixes 27 February 2019, 23:32:42 UTC
cafdf05 Disable merging of read/modify exclusivity access markers. When two access scopes have different access types, it is not safe to merge them into one access. Doing so will introduce false conflicts which manifest as crashes in user code. To do this optimization, we would need additional data flow information about *potential* read conflicts before converting a read to a modify access. Fixes rdar://48239213: Fatal access conflict detected. 27 February 2019, 21:52:05 UTC
9f3db6d Merge pull request #22959 from benlangmuir/disable-another-5.1 [5.1] Disable sourcekit-lsp on Linux asan preset 27 February 2019, 20:15:26 UTC
b8326b0 Disable sourcekit-lsp on Linux asan preset This was an oversight and should not have been enabled (yet). When we're ready we should enabled asan testing on macOS as well. rdar://47973246 27 February 2019, 19:55:38 UTC
e4cdc8a refactoring: add a defensive check for nullptr. rdar://48290050 27 February 2019, 19:21:32 UTC
0a6f705 sourcekitd: update in-proc sourcekitd API. 27 February 2019, 19:21:23 UTC
76b638f sourcekitd: define a new custom buffer for expression type response. This custom buffer encapsulates the memory layout details of the response for the expression type request. From the client side, each expression type is represented as a tuple of {expr_offset, expr_length, printed_type}. rdar://35199889 27 February 2019, 19:21:14 UTC
562926c doc-serialization: diagnose missing group-info file or corrupted one. rdar://45903094 27 February 2019, 19:21:06 UTC
a01db92 Docs/SourceKit: add some documentation for expression type request. 27 February 2019, 19:20:58 UTC
8e1ca39 SourceKit: Add a new request to collect expression types in a source file. This request collects the types of all expressions in a source file after type checking. To fulfill this task, the client must provide the path to the Swift source file under type checking and the necessary compiler arguments to help resolve all dependencies. Request: { <key.request>: (UID) <source.request.expression.type>, <key.sourcefile>: (string) // Absolute path to the file. <key.compilerargs>: [string*] // Array of zero or more strings for the compiler arguments, // e.g ["-sdk", "/path/to/sdk"]. If key.sourcefile is provided, // these must include the path to that file. } Response: { <key.printedtypebuffer>: (string) // A text buffer where all expression types are printed to. <key.expression_type_list>: (array) [expr-type-info*] // A list of expression and type } expr-type-info ::= { <key.expression_offset>: (int64) // Offset of an expression in the source file <key.expression_length>: (int64) // Length of an expression in the source file <key.type_offset>: (int64) // Offset of the printed type of the expression in the printed type buffer <key.type_length>: (int64) // Length of the printed type of the expression in the printed type buffer } rdar:://35199889 27 February 2019, 19:20:51 UTC
827d330 IDE: implement an IDE action to collect types of all expressions in a source file. This is libIDE side implementation for collecting all type information in a source file. When several expression share the same source range, we always report the type of the outermost expression. rdar://35199889 27 February 2019, 19:20:42 UTC
5588a11 Merge pull request #22762 from rintaro/5.1-sourcekit-conformingmethods [5.1][IDE/SourceKit] New SourceKit request for filtered method list 27 February 2019, 19:18:15 UTC
c0cc878 [IDE][syntax-coloring] Treat unterminated raw strings as strings for syntax coloring purposes The existing check assumed unterminated strings started with " which is no longer true now we have raw strings. Resolves rdar://problem/48269826 27 February 2019, 16:59:23 UTC
4cc52aa Merge pull request #22810 from adrian-prantl/47798056-5.1 [5.1] Replace mapIntoContext with DWARF Archetype name lookup. 27 February 2019, 16:16:39 UTC
1d952f4 Merge pull request #22935 from slavapestov/fix-remoteast-asan-failure-5.0 RemoteAST: Try to fix a use-after-free in swift-remoteast-test [5.1] 27 February 2019, 12:31:33 UTC
f53baf9 Merge pull request #22818 from rjmccall/empty-field-offset-variables-5.1 [5.1] Always give known-empty class properties a zero offset in the static layout. 27 February 2019, 03:57:17 UTC
009dc06 Merge pull request #22917 from DougGregor/objc-renamed-protocol-metadata-5.1 [5.1] [IRGen] Mangle Swift @objc(renamed) protocols as Objective-C in metadata 27 February 2019, 03:48:04 UTC
d1a54e2 RemoteAST: Try to fix a use-after-free in swift-remoteast-test Fixes <rdar://problem/48067187>. We keep a global context alive now, but we have to destroy it before Swift's ASTContext is torn down. 27 February 2019, 02:52:31 UTC
04f3751 [Driver] Always fall back to an arclite in the Xcode default toolchain (#22923) ...instead of the current toolchain, which we would have just searched by looking relative to the swiftc binary. rdar://problem/48044350 (cherry picked from commit e76b5a847ced33291f96470ae40407f928dc31dd) 27 February 2019, 00:03:14 UTC
957a26a [test] Dictionary: Skip a test that currently fails when compiled with -O rdar://problem/47973577 26 February 2019, 23:43:41 UTC
8c3a077 Merge pull request #22880 from aschwaighofer/dynamic_replacement_fixes_5.1 [5.1] Dynamic replacement fixes 26 February 2019, 22:12:02 UTC
e80da7b Always give known-empty class properties a zero offset in the static layout. Field offset vectors are always filled out with either zero or the static layout's offset, depending on the metadata initialization strategy. This change means that the static layout's offset will only be non-zero for properties with a statically-known layout. Existing runtimes doing dynamic class layout assign class properties a zero offset if the field offset vector entry is zero and the property is zero-sized. So this effectively brings the compiler into accord with the runtime (for all newly-compiled Swift code, which will eventually be all Swift code because the current public releases of Swift 5 are not yet considered ABI-stable) and guarantees a zero value for the offset everywhere. Since the runtime will agree with the compiler about the zero value of the offset, the compiler can continue to emit such offset variables as constant. The exception to this rule is if the class has non-fragile ObjC ancestry, in which case the ObjC runtime (which is not aware of this special rule for empty fields) will attempt to slide it along with everything else. Fixes rdar://48031465, in which the `FixedClassMetadataBuilder` for a class with a legacy-fixed layout was writing a non-zero offset for an empty field into the field offset vector, causing the runtime to not apply the special case and thus to compute a non-zero offset, which it then attempted to copy into the global field offset variable, which the compiler had emitted as a true-constant zero. 26 February 2019, 20:58:24 UTC
c94688b Merge pull request #22819 from slavapestov/cherry-pick-5.1-branch Cherry pick some fixes to qualification branch 26 February 2019, 18:54:00 UTC
e974ffb [IRGen] Document a bool parameter at the call site. NFC 26 February 2019, 06:40:12 UTC
46a08a9 [IRGen] Mangle Swift @objc(renamed) protocols as Objective-C in metadata. When emitting metadata for a Swift-defined @objc protocol that has provided a specific Objective-C name (e.g., via @objc(renamed)), mangle such protocols using their Objective-C names so they can be found at runtime. Only do this for metadata, because doing it anywhere else would cause an ABI break. Fixes rdar://problem/47877748. 26 February 2019, 06:40:12 UTC
8b01751 MetadataReader: Fix reading obfuscated tagged pointers Turns out the tags are shuffled around by XORing with a per-process hash, and we have to deobfuscate the tag before checking if its an extended tag. There's no test for this; just running the existing tests several times in a row is sufficient to trigger the problem. 26 February 2019, 05:22:50 UTC
413d7eb [Sema] Add defensive guard for implicit use of self in closure check Add assetion along with defensive guard to avoid crashing in release build. Hopefully, sourcekitd Stress Tester find a reproducer for the crash. rdar://problem/47895109 (cherry picked from commit ce30a72e2ae2f45074ce9e76cbcbf94b982df95f) 26 February 2019, 02:37:12 UTC
09e0937 [sil-combine] When simplifying convert functions, base whether or not an apply has nothrow on the actual function_ref. Previously, we based it off of whether or not the original apply had a nothrow bit. This is incorrect in the case where we added an error result to a function without an error result. In such a case, we need to /not/ put on the nothrow bit. This commit generalizes this idea slightly by assuming that if we are asked to perform this transformation we should just match what the underlying function_ref (i.e. setting nothrow if the underlying function type has an error result and not setting nothrow if the underlying function type does not have an error result). rdar://47828439 26 February 2019, 02:02:28 UTC
8bfefc1 [5.1] Sema: Infer @objc for dynamic replacement rdar://48259565 25 February 2019, 16:46:21 UTC
3adc814 [5.1] SILGen: Fix the logic of dynamic replacements for class constructors rdar://48125765 25 February 2019, 16:45:56 UTC
9599228 [5.1] Diagnostic: dynamic replacement and replaced function's @objc attribute must match rdar://48259565 25 February 2019, 16:42:12 UTC
3307685 [5.1] Allow dynamic replacement initializers to be non delegating rdar://48125765 25 February 2019, 16:42:08 UTC
4611412 IRGen: Fix isResilientConformance() check If the conforming type is generic, we have to treat the conformance as resilient if it is defined outside of the current module. This is because it can resiliently change from being non-dependent to dependent. 22 February 2019, 23:46:55 UTC
1c4d512 IRGen: Move isResilientConformance() and isDependentConformance() to IRGenModule 22 February 2019, 23:46:55 UTC
8b02a61 [CodeCompletion] Analyze the parent of initializer For `Initializer` decl context, type context analyzer should look into its parent context because that might constrain initializer's type. rdar://problem/48208253 22 February 2019, 19:53:42 UTC
d9984c3 SIL: Don't serialize imported conformances nested in non-public types Apparently you can use a swift_name attribute in Clang to import types as members of Swift types. If the Swift type is not public, we would still try to serialize the witness thunks, which tripped SIL verifier checks since the witnesses themselves were not serialized. Note that the fix here is to just delete the special case of an imported conformance; the regular "type is public and protocol is public" condition suffices here. Fixes <rdar://problem/48218483>. 22 February 2019, 19:18:21 UTC
cdeb61f SIL: Plumb ResilienceExpansion through TypeLowering more carefully The basic theory here is as follows: - The resilience expansion never changes the lowered type, only the SIL type category (object or address). This means that function types always pass resilient values indirectly regardless of expansion, etc. - The getTypeLowering() methods all take an optional 'forExpansion' parameter. Soon, these will become non-optional and I'll audit all call sites to pass the right expansion; for convenience, the entry points on SILFunction will pass the right expansion. Places I need to revisit and pass the right expansion in are marked as 'FIXME: Expansion'. For now, this just fixes a SILCombiner bug. After some more plumbing this will enable SILGen to produce better code. Progress on <rdar://problem/24057844>, <https://bugs.swift.org/browse/SR-261>. 22 February 2019, 19:07:15 UTC
b4185bd SIL: Remove some obsolete mentions of 'uncurry level' from TypeLowering 22 February 2019, 19:07:10 UTC
c66708b SIL: Remove unused getSemanticType{,Lowering}() 22 February 2019, 19:07:04 UTC
a982426 SILBuilder: Fix incorrect logic in isLoadableOrOpaque() 22 February 2019, 19:07:00 UTC
30c88f2 SILOptimizer: Fix potential crashes with uses of replaceLoadSequence() This utility is generally a horrible idea but even worse the callers were not doing anything to ensure the required invariants actually held. Add a new canReplaceLoadSequence() method and chek it in the right places. 22 February 2019, 19:06:55 UTC
f8e989b SILOptimizer: Remove unnecessary code from replaceLoadsByKnownValue() We no longer store the 'transparent' bit in the ApplyInst, so there's no need to recreate them. 22 February 2019, 19:06:49 UTC
ac78469 Minor code cleanups (NFC) (cherry picked from commit 3b7353a2a71f21887341cc829b7645f0bee32549) 22 February 2019, 17:13:52 UTC
c28c9cc Debug Info: Encode Archetype names in DWARF Currently LLDB calls into ide::getDeclFromMangledSymbolName() to get to this information and we would like to get rid of this call. rdar://problem/47798056 (cherry picked from commit 54af8e461f608744b706a3696306a64ddf2ab939) 22 February 2019, 17:13:52 UTC
3a3769e IRGen: DebugTypeInfo doesn't need a DeclContext or GenericEnvironment (cherry picked from commit c8622538ca8f01ce4b6d6d43058393c13a0c6193) 22 February 2019, 17:13:52 UTC
bfd09ed Merge pull request #22782 from apple/shahmishal/5.1/pr-corelibs-foundation-preset [5.1] [Preset] Add corelibs foundation presets (SR-9950) 22 February 2019, 01:02:27 UTC
f8a7171 Remove install-swift from build_swiftsyntax_release preset was added when cherry-picking the commit from master, we don't need this preset on swift-5.1-branch. 21 February 2019, 17:01:58 UTC
6461a30 [Preset] Update the foundation preset to use mixin from swift Linux preset (cherry picked from commit 42346ac96f2acda81630f6e50cadd7b53506963f) 21 February 2019, 07:56:38 UTC
669cbb6 [Preset] Add corelibs foundation presets (SR-9950) (cherry picked from commit e8733ced34db1244abca5052664492997772f573) 21 February 2019, 07:56:36 UTC
4997a3f [SourceKit] Fix memory issue in response construction for typecontextinfo Buffer may be reallocated during the construction. We can't modify buffer `SmallString` after getting 'StringRef' out of it. 20 February 2019, 21:58:27 UTC
3cbb827 [IDE] Use 'Demangle::getTypeForMangling()' instead of 'getDeclFromMangledSymbolName()' 20 February 2019, 21:57:47 UTC
317ec1f [IDE] Give default implementation for completion callbacks 20 February 2019, 21:57:41 UTC
d631b3b [IDE/SourceKit] New SourceKit request for filtered method list `source.request.conformingmethods` is a new SourceKit request which receives a source position and a list of protocol namses, returns a list of methods whose return type conforms to the requested protocols. rdar://problem/44699573 20 February 2019, 21:57:35 UTC
48e4b26 Update lldb branch for swift-5.1-branch 18 February 2019, 20:54:43 UTC
4f969b4 Merge pull request #22641 from fredriss/fixes-for-lldb-5.1 Fixes for lldb 5.1 16 February 2019, 15:29:41 UTC
663f49c [GSB] Consistently use nested type name match constraints. We generated a mix of "inferred" and "nested type name match" constraints for the case where we had two nested types with the same name and inferred that they are equal. Make them consistent by always using nested type name match constraints. This fixes a bug where we would get different canonical generic signatures in different source files because we inferred the same-type constraint with different requirement sources. Fixes rdar://problem/48049725. 16 February 2019, 01:00:12 UTC
c6b1b63 migrator: add ! to property access whose definition changes from nonnull to nullable. rdar://48090648 16 February 2019, 00:59:50 UTC
8c3a8bc [Preset] Add preset to build no-assertion build without test suite 16 February 2019, 00:58:12 UTC
14c838e [TypeChecker] Disable perf test-case for rdar://problem/21398466 Looks like obsoleted initializer has been removed, and there are no solutions available for 'init(truncatingBitPattern:)' which leads to performance regression with designated types enabled. Resolves: rdar://problem/48061151 16 February 2019, 00:57:31 UTC
c476fce [DebuggerSupport] Unbreak closures in the expression parser. The new trick is that of leavign an unresolved identifier for the expression parser to fill in. <rdar://problem/47982630> 16 February 2019, 00:56:55 UTC
0e8fc0c [Parse] Add a test for the change. 16 February 2019, 00:56:40 UTC
8f3cd35 [CSBindings] Preserve l-valueness of optional object type Result of force unwrap is always connected to its base optional type via `OptionalObject` constraint which preserves l-valueness, so in case where object type got inferred before optional type (because it got the type from context e.g. parameter type of a function call), we need to test type with and without l-value after delaying bindings for as long as possible. Resolves: rdar://problem/47967277 16 February 2019, 00:56:40 UTC
de378c3 Remove overly-permissive UnsafePointer init 16 February 2019, 00:56:40 UTC
188eff5 Fix crashes in Unsafe[Raw]BufferPointer with nil baseAddress. This fix updates various initializers to handle incoming empty buffers that happen to have a nil base. They should simply create another buffer with nil base rather than crashing! It is valid for an Unsafe[Raw]BufferPointer can have a nil base address. This allows round-tripping with C code that takes a pointer/length pair and uses `0` as the pointer value. The original design wrongly assumed that we would use a sentinel value for empty buffers and was never updated for or tested with the current design. Fixes <rdar://problem/47946984> Regression in Foundation.Data's UnsafeBufferPointer constructor. 16 February 2019, 00:56:40 UTC
ee0476d Extend transitive availability checking to initial value expressions Because initial value expressions aren't actually considered /within/ the VarDecl or PatternBindingDecl they're initializing, the existing logic to search for availability attributes wasn't kicking in, leading to errors when a conditionally-unavailable value was used in an initial value expression for a conditionally-unavailable binding. Fix this by walking the enclosing type or extension to find the appropriate PatternBindingDecl. https://bugs.swift.org/browse/SR-9867 16 February 2019, 00:56:40 UTC
a01fb66 Merge pull request #22661 from bob-wilson/rdar47777548 [master-next] Remove workaround for -Wobjc-property-assign-on-object-type 15 February 2019, 23:56:00 UTC
f1a6c4a [master-next] Remove workaround for -Wobjc-property-assign-on-object-type The issue was fixed in https://github.com/apple/swift/pull/19167 so we no longer need to disable this warning. rdar://problem/47777548 15 February 2019, 22:04:28 UTC
28d1cd3 [DebuggerSupport] Unbreak closures in the expression parser. The new trick is that of leavign an unresolved identifier for the expression parser to fill in. <rdar://problem/47982630> (cherry picked from commit 49b2f4eba7f438cae2072813579ee089a8dc2c31) 15 February 2019, 01:36:00 UTC
fbe3f49 RemoteAST: Clean up use of std::pair and std::tuple for opened existentials with named structs (cherry picked from commit 905a6def79fb70b7bc88dd3da0c917971f664c33) 15 February 2019, 01:20:29 UTC
7b9c8c6 RemoteAST: Tweak swift-remoteast-test to reuse the context I need this to reproduce a test failure. (cherry picked from commit c16fed7d71450a12e48c013faf9b504ca553a014) 15 February 2019, 01:20:29 UTC
2d7f4c1 RemoteAST: Add new entry point to unwrap an Error existential container The getDynamicTypeAndAddressForExistential() function takes the address of an existential value; so when looking at an Error, this is the address of the reference, not the address of the instance. lldb needs to look at Error instances too, so add a new entry point named getDynamicTypeAndAddressForError() which avoids the extra dereference. This will be tested on the lldb side. (cherry picked from commit 56a74c4cd399037059621dac0186343bd45461c4) 15 February 2019, 01:06:31 UTC
7bb21b1 RemoteAST: More consistent behavior of existentials inside classes LLDB calls getDynamicTypeAndAddressForExistential() on an existential value without knowing if its a class existential or opaque existential. Class existentials return the address of the instance itself here, whereas opaque existentials always returned the address of the payload value. This meant the caller could not usefully operate on the payload value if it was of class type, because there was no way of knowing if the extra dereference had occurred or not. Now, always load the reference if the wrapped type is a class, even if the existential is opaque. Will be tested on the lldb side with another change I'm working on. (cherry picked from commit bd3b45138f39d1885e9fbc88a3b541f0f9506a17) 15 February 2019, 01:06:27 UTC
ad1c3d4 RemoteAST: Re-enable existentials_objc.swift test now that its fixed (cherry picked from commit 1dd6765c84ff4979645936e0e24236c6169ca8f7) 15 February 2019, 00:56:02 UTC
f1e0b36 MetadataReader: Add support for NSError toll-free bridging An Error existential value can directly store a reference to an NSError instance without wrapping it in an Error container. When "projecting" such an existential, the dynamic type is the NSError's isa pointer, and the payload is the address of the instance itself. (cherry picked from commit 76ebaee07839f6dd7d7bed69eacc1bf3c672449e) 15 February 2019, 00:55:56 UTC
a663d2f MetadataReader: Fix caching of Objective C class metadata If resolving the type of an instance produces a class metadata for which we cannot build a type (for example, a special class like __NSCFNumber, which the ClangImporter does not produce a ClassDecl for), we try the superclass. The caching logic was broken in this case, so subsequent calls would return an empty type. (cherry picked from commit 28f305bf75faed937fdca155b2f2e03d5febe1d9) 15 February 2019, 00:55:50 UTC
b8ead05 [remote-ast] Disable non-deterministic test failure. This is failing for me ~10% of the time. It is resulting in spurious PR testing failures. SR-9908 (cherry picked from commit fffbbfe4de44ca005dabd2e9266b8caaa8b4d29e) 15 February 2019, 00:55:39 UTC
8ec4e5c MetadataReader: Add support for Objective-C tagged pointers (#22498) This allows Remote Mirrors and RemoteAST to inspect existentials containing instances of imported classes. (cherry picked from commit dc3abd14c370d214349ac15ff8862ea3f395b28f) 15 February 2019, 00:55:32 UTC
back to top