From 4098c90a19f2702a4468450828960f29f5fd1353 Mon Sep 17 00:00:00 2001 From: Shunsuke Shibayama Date: Fri, 23 Jun 2023 00:52:37 +0900 Subject: [PATCH] build: update deps --- Cargo.lock | 224 ++++++++++++++++++++++++++++++--------- Cargo.toml | 6 +- README.md | 9 +- crates/py2erg/convert.rs | 38 +++---- 4 files changed, 202 insertions(+), 75 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 42c051a..5037ebb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -109,9 +109,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "cpufeatures" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +checksum = "03e69e28e9f7f77debdedbaafa2866e1de9ba56df55a8bd7cfc724c25a09987c" dependencies = [ "libc", ] @@ -152,9 +152,9 @@ checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "els" -version = "0.1.27-nightly.1" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27d9f6b1daecf4f75a6157caf93841f30bf28e194e8229ab69ff408fd9f836c1" +checksum = "dc58697436d5d2d38a45084e11a578acae88baab0b4abc2bee30fd10074258a4" dependencies = [ "erg_common", "erg_compiler", @@ -177,18 +177,20 @@ dependencies = [ [[package]] name = "erg_common" -version = "0.6.15-nightly.1" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "720647c8de2c9c9d86ff3956144e629bf55f4d657a2a7df15ffe653eb00d9176" +checksum = "d6f80e8dcd1eb5baf07d06cad9169d5e5402d3c8bd73624571531b54ba04e327" dependencies = [ "backtrace-on-stack-overflow", + "parking_lot", + "thread_local", ] [[package]] name = "erg_compiler" -version = "0.6.15-nightly.1" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7efb254c49281d259fc50c066ef98600aa39f5a5965f5b0e9fc557d84b846a6" +checksum = "e236c7894103dc2a56a885326ff6cad362658d8efec11a41a08bee5658cb29df" dependencies = [ "erg_common", "erg_parser", @@ -196,9 +198,9 @@ dependencies = [ [[package]] name = "erg_parser" -version = "0.6.15-nightly.1" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d55758bbca26a76c4d09f4be6b95b683a91061aa56a962749854e8db0a52e71" +checksum = "01d2b744efcb776f33ef7dfccf0aa5f34d0e7ed14caa308e753611f152a03a6a" dependencies = [ "erg_common", "unicode-xid", @@ -206,9 +208,9 @@ dependencies = [ [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -236,15 +238,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.2" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" [[package]] name = "idna" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -304,18 +306,25 @@ checksum = "3f35c735096c0293d313e8f2a641627472b83d01b937177fe76e5e2708d31e0d" [[package]] name = "libc" -version = "0.2.144" +version = "0.2.146" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" +checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" + +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", +] [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "lsp-types" @@ -447,18 +456,18 @@ dependencies = [ [[package]] name = "object" -version = "0.30.3" +version = "0.30.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" +checksum = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "opaque-debug" @@ -466,6 +475,29 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + [[package]] name = "paste" version = "1.0.12" @@ -474,9 +506,9 @@ checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "phf" @@ -535,9 +567,9 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.58" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa1fb82fc0c281dd9671101b66b771ebbe1eaf967b96ac8740dcba4b70005ca8" +checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" dependencies = [ "unicode-ident", ] @@ -566,9 +598,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" dependencies = [ "proc-macro2", ] @@ -629,10 +661,19 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + [[package]] name = "ruff_source_location" version = "0.0.0" -source = "git+https://github.com/RustPython/Parser#b2f95e284852cb25d6e510c127260d03573d9f0c" +source = "git+https://github.com/RustPython/Parser#69d27d924c877b6f2fa5dc75c9589ab505d5b3f1" dependencies = [ "memchr", "once_cell", @@ -642,7 +683,7 @@ dependencies = [ [[package]] name = "ruff_text_size" version = "0.0.0" -source = "git+https://github.com/RustPython/Parser#b2f95e284852cb25d6e510c127260d03573d9f0c" +source = "git+https://github.com/RustPython/Parser#69d27d924c877b6f2fa5dc75c9589ab505d5b3f1" [[package]] name = "rustc-demangle" @@ -668,7 +709,7 @@ dependencies = [ [[package]] name = "rustpython-ast" version = "0.2.0" -source = "git+https://github.com/RustPython/Parser#b2f95e284852cb25d6e510c127260d03573d9f0c" +source = "git+https://github.com/RustPython/Parser#69d27d924c877b6f2fa5dc75c9589ab505d5b3f1" dependencies = [ "is-macro", "malachite-bigint", @@ -679,7 +720,7 @@ dependencies = [ [[package]] name = "rustpython-parser" version = "0.2.0" -source = "git+https://github.com/RustPython/Parser#b2f95e284852cb25d6e510c127260d03573d9f0c" +source = "git+https://github.com/RustPython/Parser#69d27d924c877b6f2fa5dc75c9589ab505d5b3f1" dependencies = [ "anyhow", "is-macro", @@ -702,7 +743,7 @@ dependencies = [ [[package]] name = "rustpython-parser-core" version = "0.2.0" -source = "git+https://github.com/RustPython/Parser#b2f95e284852cb25d6e510c127260d03573d9f0c" +source = "git+https://github.com/RustPython/Parser#69d27d924c877b6f2fa5dc75c9589ab505d5b3f1" dependencies = [ "is-macro", "memchr", @@ -716,6 +757,12 @@ version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + [[package]] name = "semver" version = "1.0.17" @@ -724,29 +771,29 @@ checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "serde" -version = "1.0.163" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.163" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" +checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "bdf3bf93142acad5821c99197022e170842cdbc1c30482b98750c688c640842a" dependencies = [ "itoa", "ryu", @@ -761,7 +808,7 @@ checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -782,6 +829,12 @@ version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + [[package]] name = "static_assertions" version = "1.1.0" @@ -801,15 +854,25 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.16" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" +checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "tiny-keccak" version = "2.0.2" @@ -900,9 +963,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" [[package]] name = "unicode-normalization" @@ -929,9 +992,9 @@ dependencies = [ [[package]] name = "url" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", "idna", @@ -950,3 +1013,60 @@ name = "wasi" version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" diff --git a/Cargo.toml b/Cargo.toml index f5188f3..fb70534 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,9 +22,9 @@ edition = "2021" repository = "https://github.com/mtshiba/pylyzer" [workspace.dependencies] -erg_common = { version = "0.6.15-nightly.1", features = ["py_compat", "els"] } -erg_compiler = { version = "0.6.15-nightly.1", features = ["py_compat", "els"] } -els = { version = "0.1.27-nightly.1", features = ["py_compat"] } +erg_common = { version = "0.6.15", features = ["py_compat", "els"] } +erg_compiler = { version = "0.6.15", features = ["py_compat", "els"] } +els = { version = "0.1.27", features = ["py_compat"] } rustpython-parser = { git = "https://github.com/RustPython/Parser", version = "0.2.0", features = ["all-nodes-with-ranges", "location"] } rustpython-ast = { git = "https://github.com/RustPython/Parser", version = "0.2.0", features = ["all-nodes-with-ranges", "location"] } # erg_compiler = { git = "https://github.com/erg-lang/erg", branch = "main", features = ["py_compat", "els"] } diff --git a/README.md b/README.md index ada29dc..8649e10 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,15 @@ ### cargo (rust package manager) +> ```bash +> cargo install pylyzer +> ``` + +**NOTE**: Installation by `cargo install pylyzer` is currently unavailable due to using a version of [the parser](https://github.com/RustPython/Parser/) not published on crates.io. Please clone the repository and build it directly. + ```bash -cargo install pylyzer +git clone https://github.com/mtshiba/pylyzer.git +cargo install --path . ``` Make sure that `cargo/rustc` is up-to-date, as pylyzer may be written with the latest language features. diff --git a/crates/py2erg/convert.rs b/crates/py2erg/convert.rs index a2bea81..8bd0af0 100644 --- a/crates/py2erg/convert.rs +++ b/crates/py2erg/convert.rs @@ -23,8 +23,8 @@ use erg_compiler::erg_parser::token::{Token, TokenKind, COLON, DOT, EQUAL}; use erg_compiler::erg_parser::Parser; use erg_compiler::error::{CompileError, CompileErrors}; use rustpython_parser::ast::located::{ - self as py_ast, Alias, Arg, Arguments, Boolop, Cmpop, ExprConstant, Keyword, Located, - ModModule, Operator, Stmt, String, Suite, Unaryop, + self as py_ast, Alias, Arg, Arguments, BoolOp, CmpOp, ExprConstant, Keyword, Located, + ModModule, Operator, Stmt, String, Suite, UnaryOp as UnOp, }; use rustpython_parser::source_code::{ OneIndexed, SourceLocation as PyLocation, SourceRange as PySourceRange, @@ -1051,10 +1051,10 @@ impl ASTConverter { py_ast::Expr::UnaryOp(un) => { let rhs = self.convert_expr(*un.operand); let (kind, cont) = match un.op { - Unaryop::UAdd => (TokenKind::PrePlus, "+"), - // Unaryop::Not => (TokenKind::PreBitNot, "not"), - Unaryop::USub => (TokenKind::PreMinus, "-"), - Unaryop::Invert => (TokenKind::PreBitNot, "~"), + UnOp::UAdd => (TokenKind::PrePlus, "+"), + // UnOp::Not => (TokenKind::PreBitNot, "not"), + UnOp::USub => (TokenKind::PreMinus, "-"), + UnOp::Invert => (TokenKind::PreBitNot, "~"), _ => return Expr::Dummy(Dummy::new(None, vec![rhs])), }; let op = Token::from_str(kind, cont); @@ -1065,27 +1065,27 @@ impl ASTConverter { let lhs = self.convert_expr(boole.values.remove(0)); let rhs = self.convert_expr(boole.values.remove(0)); let (kind, cont) = match boole.op { - Boolop::And => (TokenKind::AndOp, "and"), - Boolop::Or => (TokenKind::OrOp, "or"), + BoolOp::And => (TokenKind::AndOp, "and"), + BoolOp::Or => (TokenKind::OrOp, "or"), }; let op = Token::from_str(kind, cont); Expr::BinOp(BinOp::new(op, lhs, rhs)) } - // TODO: multiple Cmpops + // TODO: multiple CmpOps py_ast::Expr::Compare(mut cmp) => { let lhs = self.convert_expr(*cmp.left); let rhs = self.convert_expr(cmp.comparators.remove(0)); let (kind, cont) = match cmp.ops.remove(0) { - Cmpop::Eq => (TokenKind::DblEq, "=="), - Cmpop::NotEq => (TokenKind::NotEq, "!="), - Cmpop::Lt => (TokenKind::Less, "<"), - Cmpop::LtE => (TokenKind::LessEq, "<="), - Cmpop::Gt => (TokenKind::Gre, ">"), - Cmpop::GtE => (TokenKind::GreEq, ">="), - Cmpop::Is => (TokenKind::IsOp, "is!"), - Cmpop::IsNot => (TokenKind::IsNotOp, "isnot!"), - Cmpop::In => (TokenKind::InOp, "in"), - Cmpop::NotIn => (TokenKind::NotInOp, "notin"), + CmpOp::Eq => (TokenKind::DblEq, "=="), + CmpOp::NotEq => (TokenKind::NotEq, "!="), + CmpOp::Lt => (TokenKind::Less, "<"), + CmpOp::LtE => (TokenKind::LessEq, "<="), + CmpOp::Gt => (TokenKind::Gre, ">"), + CmpOp::GtE => (TokenKind::GreEq, ">="), + CmpOp::Is => (TokenKind::IsOp, "is!"), + CmpOp::IsNot => (TokenKind::IsNotOp, "isnot!"), + CmpOp::In => (TokenKind::InOp, "in"), + CmpOp::NotIn => (TokenKind::NotInOp, "notin"), }; let op = Token::from_str(kind, cont); Expr::BinOp(BinOp::new(op, lhs, rhs))