-
Notifications
You must be signed in to change notification settings - Fork 29.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
v21.6.0 proposal #51342
v21.6.0 proposal #51342
Conversation
- Add support for --build-snapshot-config which allows passing snapshot configurations via a JSON configuration file. - Add support for node::SnapshotConfig in the embedder API The initial configurable options are: - "builder" (SnapshotConfig::builder_script_path): path to the builder script. - "withoutCodeCache" (SnapshotFlags::kWithoutCodeCache): disable code cache generation. PR-URL: #50453 Refs: #42566 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Stephen Belanger <[email protected]>
PR-URL: #50453 Refs: #42566 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Stephen Belanger <[email protected]>
PR-URL: #51105 Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Marco Ippolito <[email protected]>
PR-URL: #51177 Reviewed-By: Yagiz Nizipli <[email protected]> Reviewed-By: Luigi Pinca <[email protected]>
PR-URL: #51160 Fixes: #51159 Reviewed-By: Moshe Atlow <[email protected]> Reviewed-By: Marco Ippolito <[email protected]>
PR-URL: #50897 Reviewed-By: Antoine du Hamel <[email protected]>
PR-URL: #50897 Reviewed-By: Antoine du Hamel <[email protected]>
PR-URL: #51062 Refs: #50842 Reviewed-By: Moshe Atlow <[email protected]> Reviewed-By: Raz Luvaton <[email protected]>
Currently, node.js http/2 is limited in sending SETTINGs, that are currently implemented by nghttp2. However, nghttp2 has the ability to send arbitary SETTINGs, that are not known beforehand. This patch adds this feature including a fall back mechanism, if a SETTING is implemented in a later nghttp2 or node version. Fixes: #1337 PR-URL: #49025 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Marco Ippolito <[email protected]>
PR-URL: #51181 Fixes: #51174 Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Moshe Atlow <[email protected]> Reviewed-By: Chemi Atlow <[email protected]>
PR-URL: #50946 Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Daijiro Wachi <[email protected]> Reviewed-By: James M Snell <[email protected]>
PR-URL: #51027 Reviewed-By: Matteo Collina <[email protected]>
PR-URL: #51185 Reviewed-By: Marco Ippolito <[email protected]> Reviewed-By: Michael Dawson <[email protected]>
PR-URL: #51194 Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Marco Ippolito <[email protected]> Reviewed-By: Michael Dawson <[email protected]> Reviewed-By: Trivikram Kamat <[email protected]>
We define a new type called `node_api_nogc_env` as the `const` version of `napi_env` and `node_api_nogc_finalize` as a variant of `napi_finalize` that accepts a `node_api_nogc_env` as its first argument. We then modify those APIs which do not affect GC state as accepting a `node_api_nogc_env`. APIs accepting finalizer callbacks are modified to accept `node_api_nogc_finalize` callbacks. Thus, the only way to attach a `napi_finalize` callback, wherein Node-APIs affecting GC state may be called is to call `node_api_post_finalizer` from a `node_api_nogc_finalize` callback. In keeping with the process of introducing new Node-APIs, this feature is guarded by `NAPI_EXPERIMENTAL`. Since this feature modifies APIs already marked as stable, it is additionally guared by `NODE_API_EXPERIMENTAL_NOGC_ENV`, so as to provide a further buffer to adoption. Nevertheless, both guards must be removed upon releasing a new version of Node-API. PR-URL: #50060 Reviewed-By: Chengzhong Wu <[email protected]> Reviewed-By: Vladimir Morozov <[email protected]> Reviewed-By: Michael Dawson <[email protected]>
PR-URL: #33633 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Paolo Insogna <[email protected]> Reviewed-By: James M Snell <[email protected]>
Those create unreasonable maintenance burden as updating one dependency will conflict with another one. It's unclear we get much value out from duplicating this information in this document, so this commit removes it PR-URL: #51195 Reviewed-By: Yagiz Nizipli <[email protected]> Reviewed-By: Marco Ippolito <[email protected]> Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Richard Lau <[email protected]> Reviewed-By: Rafael Gonzaga <[email protected]>
PR-URL: #51193 Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Marco Ippolito <[email protected]>
PR-URL: #50457 Reviewed-By: Mohammed Keyvanzadeh <[email protected]> Reviewed-By: Moshe Atlow <[email protected]> Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Marco Ippolito <[email protected]>
PR-URL: #50457 Reviewed-By: Mohammed Keyvanzadeh <[email protected]> Reviewed-By: Moshe Atlow <[email protected]> Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Marco Ippolito <[email protected]>
PR-URL: #50840 Reviewed-By: Yagiz Nizipli <[email protected]> Reviewed-By: Joyee Cheung <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Vinícius Lourenço Claro Cardoso <[email protected]>
The issue arises from the `getFreeCallCount()` function yielding the initial value of 0. Upon instantiation of the `Worker` object, it increments to 1. In the case of this flaky test, if the creation of the `Worker` object is faster, the subsequent `getFreeCallCount()` call always returns 1 instead of the expected 0. Fixes: #51003 PR-URL: #51013 Reviewed-By: Vinícius Lourenço Claro Cardoso <[email protected]> Reviewed-By: Joyee Cheung <[email protected]> Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: James M Snell <[email protected]>
Signed-off-by: Matteo Collina <[email protected]> PR-URL: #51056 Reviewed-By: Chemi Atlow <[email protected]> Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Moshe Atlow <[email protected]> Reviewed-By: James M Snell <[email protected]>
PR-URL: #51078 Reviewed-By: Vinícius Lourenço Claro Cardoso <[email protected]> Reviewed-By: Matteo Collina <[email protected]>
PR-URL: #51191 Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Marco Ippolito <[email protected]> Reviewed-By: Tobias Nießen <[email protected]>
PR-URL: #51104 Reviewed-By: Marco Ippolito <[email protected]> Reviewed-By: Michael Dawson <[email protected]>
PR-URL: #51178 Refs: #51107 Reviewed-By: Richard Lau <[email protected]> Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Moshe Atlow <[email protected]>
Use `tmpdir.refresh()` in `test/es-module/test-esm-json.mjs` so that the temporary directory is removed when the test exits. PR-URL: #51205 Reviewed-By: Vinícius Lourenço Claro Cardoso <[email protected]> Reviewed-By: Debadree Chatterjee <[email protected]>
Use `tmpdir.refresh()` in `test/es-module/test-esm-loader-resolve-type.mjs` so that the temporary directory is removed when the test exits. PR-URL: #51206 Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Vinícius Lourenço Claro Cardoso <[email protected]>
PR-URL: #51207 Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Tobias Nießen <[email protected]>
@nodejs/single-executable-admins I need some help with failing tests on plinux-rhel8-ppc64le |
Can you include #51290? It should be landing now. |
@joyeecheung could the SIGSEV errors be related to your changes in |
There have been some known flakes from SEA on that platform for a while, see #50740 I suspect it may be more of a bug of postject (alignment issues?) but it is difficult to chase down. |
Wait, it's on PowerPC, sea tests should be skipped there. |
@joyeecheung not since #48111 |
Ah I think I see some issues:
PR: #51422 |
At the point of `FreeEnvironment` and onwards, no JavaScript execution associated with the Environment should be triggered. Avoid draining platform tasks that can trigger JavaScript execution in `FreeEnvironment`. The holder of `node::Environment` should immediately call `node::MultiIsolatePlatform::UnregisterIsolate` and `v8::Isolate::Dispose` to cancel pending foreground tasks and join concurrent tasks after the environment was freed. `NodePlatform` can properly handle the case in `RunForegroundTask` when an Isolate out-lives its associated `node::Environment`. PR-URL: #51290 Fixes: #47748 Fixes: #49344 Reviewed-By: Vinícius Lourenço Claro Cardoso <[email protected]> Reviewed-By: Matteo Collina <[email protected]>
In test status files, `$system` will be the OS and not the arch (which would be `$arch`). Add missing single-executable-application test to the list of tests marked flaky on Linux ppc64le. PR-URL: #51422 Refs: #50828 Refs: #50740 Reviewed-By: Rafael Gonzaga <[email protected]> Reviewed-By: Michael Dawson <[email protected]> Reviewed-By: Yagiz Nizipli <[email protected]> Reviewed-By: Joyee Cheung <[email protected]> Reviewed-By: Luigi Pinca <[email protected]>
Notable changes: doc: * (SEMVER-MINOR) add documentation for --build-snapshot-config (Anna Henningsen) #50453 lib,src,permission: * (SEMVER-MINOR) port path.resolve to C++ (Rafael Gonzaga) #50758 net: * (SEMVER-MINOR) add connection attempt events (Paolo Insogna) #51045 src: * (SEMVER-MINOR) support configurable snapshot (Joyee Cheung) #50453 src,permission: * (SEMVER-MINOR) add --allow-addon flag (Rafael Gonzaga) #51183 timers: * (SEMVER-MINOR) export timers.promises (Marco Ippolito) #51246 PR-URL: #51342 Signed-off-by: RafaelGSS <[email protected]>
f3105d3
to
f38a9a5
Compare
It would be phenomenal if #51431 could be pulled in 🙄 |
Notable changes: doc: * (SEMVER-MINOR) add documentation for --build-snapshot-config (Anna Henningsen) #50453 lib,src,permission: * (SEMVER-MINOR) port path.resolve to C++ (Rafael Gonzaga) #50758 net: * (SEMVER-MINOR) add connection attempt events (Paolo Insogna) #51045 src: * (SEMVER-MINOR) support configurable snapshot (Joyee Cheung) #50453 src,permission: * (SEMVER-MINOR) add --allow-addon flag (Rafael Gonzaga) #51183 timers: * (SEMVER-MINOR) export timers.promises (Marco Ippolito) #51246 PR-URL: #51342 Signed-off-by: RafaelGSS <[email protected]>
Notable changes: doc: * (SEMVER-MINOR) add documentation for --build-snapshot-config (Anna Henningsen) nodejs#50453 lib,src,permission: * (SEMVER-MINOR) port path.resolve to C++ (Rafael Gonzaga) nodejs#50758 net: * (SEMVER-MINOR) add connection attempt events (Paolo Insogna) nodejs#51045 src: * (SEMVER-MINOR) support configurable snapshot (Joyee Cheung) nodejs#50453 src,permission: * (SEMVER-MINOR) add --allow-addon flag (Rafael Gonzaga) nodejs#51183 timers: * (SEMVER-MINOR) export timers.promises (Marco Ippolito) nodejs#51246 PR-URL: nodejs#51342 Signed-off-by: RafaelGSS <[email protected]>
2024-01-15, Version 21.6.0 (Current), @RafaelGSS
New connection attempt events
Three new events were added in the
net.createConnection
flow:connectionAttempt
: Emitted when a new connection attempt is established. In case of Happy Eyeballs, this might emitted multiple times.connectionAttemptFailed
: Emitted when a connection attempt failed. In case of Happy Eyeballs, this might emitted multiple times.connectionAttemptTimeout
: Emitted when a connection attempt timed out. In case of Happy Eyeballs, this will not be emitted for the last attempt. This is not emitted at all if Happy Eyeballs is not used.Additionally, a previous bug has been fixed where a new connection attempt could have been started after a previous one failed and after the connection was destroyed by the user.
This led to a failed assertion.
Contributed by Paolo Insogna in #51045.
Changes to the Permission Model
Node.js 21.6.0 comes with several fixes for the experimental permission model and two new semver-minor commits.
We're adding a new flag
--allow-addons
to enable addon usage when using the Permission Model.$ node --experimental-permission --allow-addons
Contributed by Rafael Gonzaga in #51183
And relative paths are now supported through the
--allow-fs-*
flags.Therefore, with this release one can use:
$ node --experimental-permission --allow-fs-read=./index.js
To give only read access to the entrypoint of the application.
Contributed by Rafael Gonzaga and Carlos Espa in #50758
Support configurable snapshot through
--build-snapshot-config
flagWe are adding a new flag
--build-snapshot-config
to configure snapshots through a custom JSON configuration file.$ node --build-snapshot-config=/path/to/myconfig.json
When using this flag, additional script files provided on the command line will
not be executed and instead be interpreted as regular command line arguments.
These changes were contributed by Joyee Cheung and Anna Henningsen in #50453
Other Notable Changes
c31ed51373
] - (SEMVER-MINOR) timers: export timers.promises (Marco Ippolito) #51246Commits
13a1241b83
] - assert,crypto: make KeyObject and CryptoKey testable for equality (Filip Skokan) #508974dcc5114aa
] - benchmark: remove dependency on unshipped tools (Adam Majer) #511462eb41f86b3
] - build: fix for VScode "Reopen in Container" (Serg Kryvonos) #51271e03ac83c19
] - build: fix arm64 cross-compilation (Michaël Zasso) #51256cd61fce34e
] - build: add-flax-vector-conversions
to V8 build (Michaël Zasso) #51257e5017a522e
] - crypto: update CryptoKey symbol properties (Filip Skokan) #50897c0d2e8be11
] - deps: update corepack to 0.24.0 (Node.js GitHub Bot) #5131824a9a72492
] - deps: update acorn to 8.11.3 (Node.js GitHub Bot) #51317e53cbb22c2
] - deps: update ngtcp2 and nghttp3 (James M Snell) #51291f00f1204f1
] - deps: update brotli to 1.1.0 (Node.js GitHub Bot) #50804a41dca0c51
] - deps: update zlib to 1.3.0.1-motley-40e35a7 (Node.js GitHub Bot) #51274efa12a89c6
] - deps: update simdutf to 4.0.8 (Node.js GitHub Bot) #5100025eba3d20b
] - deps: V8: cherry-pick de611e69ad51 (Keyhan Vakil) #51200a07d6e23e4
] - deps: update simdjson to 3.6.3 (Node.js GitHub Bot) #511046d1bfcb2dd
] - deps: update googletest to 530d5c8 (Node.js GitHub Bot) #5119175e5615c43
] - deps: update acorn-walk to 8.3.1 (Node.js GitHub Bot) #504573ecc7dcc00
] - deps: update acorn-walk to 8.3.0 (Node.js GitHub Bot) #50457e2f8d741c8
] - deps: update zlib to 1.3.0.1-motley-dd5fc13 (Node.js GitHub Bot) #511054a5d3bda72
] - doc: the GN files should use Node's license (Cheng Zhao) #5069484127514ba
] - doc: improve localWindowSize event descriptions (Davy Landman) #510718ee882a49c
] - doc: mark--jitless
as experimental (Antoine du Hamel) #51247876743ece1
] - doc: run license-builder (github-actions[bot]) #51199ec6fcff009
] - doc: fix limitations and known issues in pm (Rafael Gonzaga) #51184c13a5c0373
] - doc: mention node:wasi in the Threat Model (Rafael Gonzaga) #512114b19e62444
] - doc: remove ambiguous 'considered' (Rich Trott) #512075453abd6ad
] - doc: set exit code in custom test runner example (Matteo Collina) #51056f9d4e07faf
] - doc: remove version frommaintaining-dependencies.md
(Antoine du Hamel) #51195df8927a073
] - doc: mention native addons are restricted in pm (Rafael Gonzaga) #51185e636d83914
] - doc: correct note on behavior of stats.isDirectory (Nick Reilingh) #509461c71435c2a
] - doc: fixTestsStream
parent class (Jungku Lee) #511812c227b0d64
] - doc: fix simdjson wrong link (Marco Ippolito) #51177efa13e1943
] - (SEMVER-MINOR) doc: add documentation for --build-snapshot-config (Anna Henningsen) #50453941aedc6fc
] - errors: fix stacktrace of SystemError (uzlopak) #4995647548d9e61
] - esm: fix hint on invalid module specifier (Antoine du Hamel) #51223091098f40a
] - fs: fix fs.promises.realpath for long paths on Windows (翠 / green) #51032e5a8fa01aa
] - fs: make offset, position & length args in fh.read() optional (Pulkit Gupta) #51087c87e5d51cc
] - fs: add missing jsdoc parameters toreadSync
(Yagiz Nizipli) #51225e24249cf37
] - fs: removeinternalModuleReadJSON
binding (Yagiz Nizipli) #512247421467812
] - fs: improve mkdtemp performance for buffer prefix (Yagiz Nizipli) #510785b229d775f
] - fs: validate fd synchronously on c++ (Yagiz Nizipli) #51027c7a135962d
] - http: remove misleading warning (Luigi Pinca) #51204a325746ff4
] - http: do not override user-provided options object (KuthorX) #3363389eee7763f
] - http2: addtl http/2 settings (Marten Richter) #49025624142947f
] - lib: fix use of--frozen-intrinsics
with--jitless
(Antoine du Hamel) #512488f845eb001
] - lib: move function declaration outside of loop (Sanjaiyan Parthipan) #51242ed7305e49b
] - lib: reduce overhead ofSafePromiseAllSettledReturnVoid
calls (Antoine du Hamel) #51243291265ce27
] - lib: expose default prepareStackTrace (Chengzhong Wu) #508278ff6bc45ca
] - lib,permission: handle buffer on fs.symlink (Rafael Gonzaga) #51212416b4f8063
] - (SEMVER-MINOR) lib,src,permission: port path.resolve to C++ (Rafael Gonzaga) #507586648a5c576
] - meta: notify tsc on changes in SECURITY.md (Rafael Gonzaga) #5125983a99ccedd
] - meta: update artifact actions to v4 (Michaël Zasso) #51219b621ada69a
] - module: move the CJS exports cache to internal/modules/cjs/loader (Joyee Cheung) #51157e4be5b60f0
] - (SEMVER-MINOR) net: add connection attempt events (Paolo Insogna) #510453a492056e2
] - node-api: type tag external values without v8::Private (Chengzhong Wu) #51149b2135ae7dc
] - node-api: segregate nogc APIs from rest via type system (Gabriel Schulhof) #500608f4325dcd5
] - permission: fix wildcard when children > 1 (Rafael Gonzaga) #512097ecf99404e
] - quic: update quic impl to use latest ngtcp2/nghttp3 (James M Snell) #512915b32e21f3b
] - quic: add quic internalBinding, refine Endpoint, add types (James M Snell) #511123310095bea
] - repl: fix prepareStackTrace frames array order (Chengzhong Wu) #50827a0ff00b526
] - src: avoid draining platform tasks at FreeEnvironment (Chengzhong Wu) #51290115e0585cd
] - src: add fast api for Histogram (James M Snell) #5129629b81576c6
] - src: refactorGetCreationContext
calls (Yagiz Nizipli) #5128754dd978400
] - src: enter isolate before destructing IsolateData (Ben Noordhuis) #51138864ecb0dfa
] - src: do not treat all paths ending with node_modules as such (Michaël Zasso) #51269df31c8114c
] - src: eliminate duplicate code in histogram.cc (James M Snell) #5126317c73e6d0c
] - src: fix unix abstract socket path for trace event (theanarkh) #5085896d64edc94
] - src: use BignumPointer and use BN_clear_free (James M Snell) #504548a2dd93a14
] - src: implement FastByteLengthUtf8 with simdutf::utf8_length_from_latin1 (Daniel Lemire) #50840e54ddf898f
] - (SEMVER-MINOR) src: support configurable snapshot (Joyee Cheung) #50453a69c7d7bc3
] - (SEMVER-MINOR) src,permission: add --allow-addon flag (Rafael Gonzaga) #51183e7925e66fc
] - src,stream: improve WriteString (ywave620) #5115582de6603af
] - stream: fix code style (Mattias Buelens) #51168e443953656
] - stream: fix cloned webstreams not being unref'd (James M Snell) #51255757a84c9ea
] - test: fix flaky conditions for ppc64 SEA tests (Richard Lau) #5142285ee2f7255
] - test: replace forEach() with for...of (Alexander Jones) #50608549e4b4142
] - test: replace forEach with for...of (Ospite Privilegiato) #50787ef44f9bef2
] - test: replace foreach with for of (lucacapocci94-dev) #50790652af45485
] - test: replace forEach() with for...of (Jia) #50610684dd9db2f
] - test: fix inconsistency write size intest-fs-readfile-tostring-fail
(Jungku Lee) #51141aaf710f535
] - test: replace forEach test-http-server-multiheaders2 (Marco Mac) #5079457c64550cc
] - test: replace forEach with for-of in test-webcrypto-export-import-ec (Chiara Ricciardi) #5124988e865181b
] - test: move to for of loop in test-http-hostname-typechecking.js (Luca Del Puppo) #507823db376f67a
] - test: skip test-watch-mode-inspect on arm (Michael Dawson) #5121038232d1c52
] - test: replace forEach with for of in file test-trace-events-net.js (Ianna83) #50789f1cb58355a
] - test: replace forEach() with for...of in test/parallel/test-util-log.js (Edoardo Dusi) #507839bfd84c117
] - test: replace forEach with for of in test-trace-events-api.js (Andrea Pavone) #507847e9834915a
] - test: replace forEach with for-of in test-v8-serders.js (Mattia Iannone) #50791b6f232e841
] - test: add URL tests to fs-read in pm (Rafael Gonzaga) #512138a2178c5f5
] - test: use tmpdir.refresh() in test-esm-loader-resolve-type.mjs (Luigi Pinca) #512067e9a0b192a
] - test: use tmpdir.refresh() in test-esm-json.mjs (Luigi Pinca) #51205d7c2572fe0
] - test: fix flakiness in worker*.test-free-called (Jithil P Ponnan) #51013979cebc955
] - test_runner: fixed test object is incorrectly passed to setup() (Pulkit Gupta) #5098263db82abe6
] - test_runner: fixed to run after hook if before throws an error (Pulkit Gupta) #51062c31ed51373
] - (SEMVER-MINOR) timers: export timers.promises (Marco Ippolito) #51246fc10f889eb
] - tools: update lint-md-dependencies to [email protected] (Node.js GitHub Bot) #51320d5a5f12d15
] - tools: fix dep_updaters dir updates (Michaël Zasso) #51294bdcb5ed510
] - tools: update inspector_protocol to c488ba2 (cola119) #5129369a46add77
] - tools: update inspector_protocol to 9b4a4aa (cola119) #51293e325f49d19
] - tools: update inspector_protocol to 2f51e05 (cola119) #5129360d804851b
] - tools: update inspector_protocol to d7b099b (cola119) #51293d18168489f
] - tools: update inspector_protocol to 912eb68 (cola119) #51293ef4f46fc39
] - tools: update inspector_protocol to 547c5b8 (cola119) #51293c3126fc016
] - tools: update inspector_protocol to ca525fc (cola119) #51293917d887dde
] - tools: update lint-md-dependencies to [email protected] (Node.js GitHub Bot) #5127637594918e0
] - tools: check timezone current version (Marco Ippolito) #51178d0d2faf899
] - tools: update lint-md-dependencies to [email protected] (Node.js GitHub Bot) #51193c96ef6533c
] - tools: update eslint to 8.56.0 (Node.js GitHub Bot) #51194f4f781d493
] - util: pass invalidSubtypeIndex instead of trimmedSubtype to error (Gaurish Sethia) #51264867b484429
] - watch: clarify that the fileName parameter can be null (Luigi Pinca) #5130556e8969b65
] - watch: fix nullfileName
on windows systems (vnc5) #498913f4fd6efbb
] - watch: fix infinite loop when passing --watch=true flag (Pulkit Gupta) #51160