helloadhavan/github_issues huggingface dataset:
Repository: ollama/ollama
Pull request: use ollama engine for bert models

register bpe tokenizer which enables granite-embedding


Changed files:
filename: fs/ggml/ggml.go
patch: @@ -241,19 +241,20 @@ func (kv KV) Bools(key string, defaultValue ...[]bool) []bool {
 
 func (kv KV) OllamaEngineRequired() bool {
 	return slices.Contains([]string{
+		"bert",
+		"deepseek2",
+		"deepseekocr",
 		"gemma3",
 		"gemma3n",
 		"gptoss", "gpt-oss",
 		"llama4",
 		"mistral3",
 		"mllama",
+		"nomic-bert",
+		"olmo3",
 		"qwen25vl",
 		"qwen3", "qwen3moe",
 		"qwen3vl", "qwen3vlmoe",
-		"deepseekocr",
-		"deepseek2",
-		"nomic-bert",
-		"olmo3",
 	}, kv.Architecture())
 }
 
@@ -839,6 +840,7 @@ func (f GGML) SupportsFlashAttention() bool {
 // FlashAttention checks if the model should enable flash attention
 func (f GGML) FlashAttention() bool {
 	return slices.Contains([]string{
+		"bert",
 		"gemma3",
 		"gptoss", "gpt-oss",
 		"mistral3",

filename: model/models/bert/embed.go
patch: @@ -129,35 +129,36 @@ func (o Options) headDim() int {
 }
 
 func New(c fs.Config) (model.Model, error) {
+	vocab := &model.Vocabulary{
+		Values: c.Strings("tokenizer.ggml.tokens"),
+		Scores: c.Floats("tokenizer.ggml.scores"),
+		Types:  c.Ints("tokenizer.ggml.token_type"),
+		AddBOS: c.Bool("tokenizer.ggml.add_bos_token", true),
+		BOS: []int32{
+			int32(cmp.Or(
+				c.Uint("tokenizer.ggml.cls_token_id"),
+				c.Uint("tokenizer.ggml.bos_token_id"),
+			)),
+		},
+		AddEOS: c.Bool("tokenizer.ggml.add_eos_token", true),
+		EOS: []int32{
+			int32(cmp.Or(
+				c.Uint("tokenizer.ggml.separator_token_id"),
+				//nolint:misspell
+				// NOTE: "seperator_token_id" is a typo in model metadata but we need to
+				// support it for compatibility.
+				c.Uint("tokenizer.ggml.seperator_token_id"),
+				c.Uint("tokenizer.ggml.eos_token_id"),
+			)),
+		},
+	}
+
 	var processor model.TextProcessor
 	switch c.String("tokenizer.ggml.model", "bert") {
 	case "bert":
-		processor = model.NewWordPiece(
-			&model.Vocabulary{
-				Values: c.Strings("tokenizer.ggml.tokens"),
-				Scores: c.Floats("tokenizer.ggml.scores"),
-				Types:  c.Ints("tokenizer.ggml.token_type"),
-				AddBOS: c.Bool("tokenizer.ggml.add_bos_token", true),
-				BOS: []int32{
-					int32(cmp.Or(
-						c.Uint("tokenizer.ggml.cls_token_id"),
-						c.Uint("tokenizer.ggml.bos_token_id"),
-					)),
-				},
-				AddEOS: c.Bool("tokenizer.ggml.add_eos_token", true),
-				EOS: []int32{
-					int32(cmp.Or(
-						c.Uint("tokenizer.ggml.separator_token_id"),
-						//nolint:misspell
-						// NOTE: "seperator_token_id" is a typo in model metadata but we need to
-						// support it for compatibility.
-						c.Uint("tokenizer.ggml.seperator_token_id"),
-						c.Uint("tokenizer.ggml.eos_token_id"),
-					)),
-				},
-			},
-			true,
-		)
+		processor = model.NewWordPiece(vocab, true)
+	case "gpt2":
+		processor = model.NewBytePairEncoding(vocab)
 	default:
 		return nil, model.ErrUnsupportedTokenizer
 	}
Repository: electron/electron
Pull request: fix: correctly track BaseWindow::IsActive() on MacOS

#### Description of Change

Extend https://github.com/electron/electron/pull/24286 to BaseWindow

#### Checklist
<!-- Remove items that do not apply. For completed items, change [ ] to [x]. -->

- [x] [PR release notes](https://github.com/electron/clerk/blob/main/README.md) describe the change in a way relevant to app developers, and are [capitalized, punctuated, and past tense](https://github.com/electron/clerk/blob/main/README.md#examples).

#### Release Notes

Notes: Fixed improper focus tracking in BaseWindow on MacOS

Changed files:
filename: shell/browser/api/electron_api_base_window.cc
patch: @@ -307,6 +307,12 @@ void BaseWindow::OnWindowSheetEnd() {
   Emit("sheet-end");
 }
 
+void BaseWindow::OnWindowIsKeyChanged(bool is_key) {
+#if BUILDFLAG(IS_MAC)
+  window()->SetActive(is_key);
+#endif
+}
+
 void BaseWindow::OnWindowEnterHtmlFullScreen() {
   Emit("enter-html-full-screen");
 }

filename: shell/browser/api/electron_api_base_window.h
patch: @@ -84,6 +84,7 @@ class BaseWindow : public gin_helper::TrackableObject<BaseWindow>,
   void OnWindowRotateGesture(float rotation) override;
   void OnWindowSheetBegin() override;
   void OnWindowSheetEnd() override;
+  void OnWindowIsKeyChanged(bool is_key) override;
   void OnWindowEnterFullScreen() override;
   void OnWindowLeaveFullScreen() override;
   void OnWindowEnterHtmlFullScreen() override;
Repository: facebook/react
Pull request: [Flight] Complete list of Node.js' internal Promise awaits

`Promise.any` and `Promise.withResolvers` also have an additional await internally.

Changed files:
filename: packages/react-server/src/ReactFlightServer.js
patch: @@ -339,8 +339,10 @@ function isPromiseAwaitInternal(url: string, functionName: string): boolean {
     case 'Function.resolve':
     case 'Function.all':
     case 'Function.allSettled':
+    case 'Function.any':
     case 'Function.race':
     case 'Function.try':
+    case 'Function.withResolvers':
       return true;
     default:
       return false;
Repository: nodejs/node
Pull request: doc: add note (and caveat) for `mock.module` about customization hooks

So for instance, if mocking a `tsx` module and a loader was registered via the **`async`** API (`module.register()`, `--loader`, etc), the test-runner doesn't use it and throws trying to validate `format` (even though it will actually work):

https://github.com/nodejs/node/blob/f8d5bad52f6df23dab94cdca5e33e491b00efbfe/lib/internal/test_runner/mock/mock.js#L650-L653

This is mainly problem within the `ModuleLoader` itself, which checks whether sync hooks exist; when they do, it uses that chain and ignores the potential existence of registered async hooks:

https://github.com/nodejs/node/blob/f8d5bad52f6df23dab94cdca5e33e491b00efbfe/lib/internal/modules/esm/loader.js#L727-L734

The problem for the test runner was created/exposed by switching the test-runner's loader to sync registration, which ensures there's always a **sync** chain (causing the async chain to be ignored internally).

Geoffrey, Joyee, Matteo, and I discussed this scenario ~a year ago in Dublin. The fix is not simple.

<details>
<summary>It would need to do something like this</summary>

![Leveraging async and sync hooks together, constantly jumping into and back out of the upside-down](https://github.com/user-attachments/assets/8f8486f4-1412-44b5-b883-c39ab2a79083)

[slack convo](https://openjs-foundation.slack.com/archives/C053UCCP940/p1743628186276709)
</details>

Changed files:
filename: doc/api/test.md
patch: @@ -2500,6 +2500,11 @@ Node.js builtin modules. Any references to the original module prior to mocking
 order to enable module mocking, Node.js must be started with the
 [`--experimental-test-module-mocks`][] command-line flag.
 
+**Note**: [module customization hooks][] registered via the **synchronous** API effect resolution of
+the `specifier` provided to `mock.module`. Customization hooks registered via the **asynchronous**
+API are currently ignored (because the test runner's loader is synchronous, and node does not
+support multi-chain / cross-chain loading).
+
 The following example demonstrates how a mock is created for a module.
 
 ```js
@@ -4247,6 +4252,7 @@ Can be used to abort test subtasks when the test has been aborted.
 [configuration files]: cli.md#--experimental-config-fileconfig
 [describe options]: #describename-options-fn
 [it options]: #testname-options-fn
+[module customization hooks]: module.md#customization-hooks
 [running tests from the command line]: #running-tests-from-the-command-line
 [stream.compose]: stream.md#streamcomposestreams
 [subtests]: #subtests
Repository: electron/electron
Pull request: fix: correctly track BaseWindow::IsActive() on MacOS

Backport of #49460

See that PR for details.


Notes: Fixed improper focus tracking in BaseWindow on MacOS

Changed files:
filename: shell/browser/api/electron_api_base_window.cc
patch: @@ -317,6 +317,12 @@ void BaseWindow::OnWindowSheetEnd() {
   Emit("sheet-end");
 }
 
+void BaseWindow::OnWindowIsKeyChanged(bool is_key) {
+#if BUILDFLAG(IS_MAC)
+  window()->SetActive(is_key);
+#endif
+}
+
 void BaseWindow::OnWindowEnterHtmlFullScreen() {
   Emit("enter-html-full-screen");
 }

filename: shell/browser/api/electron_api_base_window.h
patch: @@ -85,6 +85,7 @@ class BaseWindow : public gin_helper::TrackableObject<BaseWindow>,
   void OnWindowRotateGesture(float rotation) override;
   void OnWindowSheetBegin() override;
   void OnWindowSheetEnd() override;
+  void OnWindowIsKeyChanged(bool is_key) override;
   void OnWindowEnterFullScreen() override;
   void OnWindowLeaveFullScreen() override;
   void OnWindowEnterHtmlFullScreen() override;
Repository: facebook/react
Pull request: [Flight] Fix pending chunks count for streams & async iterables in DEV

In DEV, we need to prevent the response from being GC'd while there are still pending chunks for ReadableSteams or pending results for AsyncIterables.

Changed files:
filename: packages/react-client/src/ReactFlightClient.js
patch: @@ -813,6 +813,12 @@ function createInitializedStreamChunk<
   value: T,
   controller: FlightStreamController,
 ): InitializedChunk<T> {
+  if (__DEV__) {
+    // Retain a strong reference to the Response while we wait for chunks.
+    if (response._pendingChunks++ === 0) {
+      response._weakResponse.response = response;
+    }
+  }
   // We use the reason field to stash the controller since we already have that
   // field. It's a bit of a hack but efficient.
   // $FlowFixMe[invalid-constructor] Flow doesn't support functions as constructors
@@ -3075,7 +3081,6 @@ function resolveStream<T: ReadableStream | $AsyncIterable<any, any, void>>(
     // We already resolved. We didn't expect to see this.
     return;
   }
-  releasePendingChunk(response, chunk);
 
   const resolveListeners = chunk.value;
 
@@ -3375,6 +3380,14 @@ function stopStream(
     // We didn't expect not to have an existing stream;
     return;
   }
+  if (__DEV__) {
+    if (--response._pendingChunks === 0) {
+      // We're no longer waiting for any more chunks. We can release the strong
+      // reference to the response. We'll regain it if we ask for any more data
+      // later on.
+      response._weakResponse.response = null;
+    }
+  }
   const streamChunk: InitializedStreamChunk<any> = (chunk: any);
   const controller = streamChunk.reason;
   controller.close(row === '' ? '"$undefined"' : row);
Repository: facebook/react
Pull request: [compiler] fix bad rebase from sapling

---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed with [ReviewStack](https://reviewstack.dev/facebook/react/pull/35145).
* #35144
* __->__ #35145

Changed files:
filename: compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/error.todo-repro-destructure-from-prop-with-default-value.expect.md
patch: @@ -1,43 +0,0 @@
-
-## Input
-
-```javascript
-export function useFormatRelativeTime(opts = {}) {
-  const {timeZone, minimal} = opts;
-  const format = useCallback(function formatWithUnit() {}, [minimal]);
-  // We record `{timeZone}` as capturing timeZone into the object,
-  // then assume that dateTimeFormat() mutates that object,
-  // which in turn can mutate timeZone and the object it came from,
-  // which means that the value `minimal` is derived from can change.
-  //
-  // The bug is that we shouldn't be recording a Capture effect given
-  // that `opts` is known maybe-frozen. If we correctly recorded
-  // an ImmutableCapture, this wouldn't be mistaken as mutating
-  // opts/minimal
-  dateTimeFormat({timeZone});
-  return format;
-}
-
-```
-
-
-## Error
-
-```
-Found 1 error:
-
-Compilation Skipped: Existing memoization could not be preserved
-
-React Compiler has skipped optimizing this component because the existing manual memoization could not be preserved. This dependency may be mutated later, which could cause the value to change unexpectedly.
-
-error.todo-repro-destructure-from-prop-with-default-value.ts:3:60
-  1 | export function useFormatRelativeTime(opts = {}) {
-  2 |   const {timeZone, minimal} = opts;
-> 3 |   const format = useCallback(function formatWithUnit() {}, [minimal]);
-    |                                                             ^^^^^^^ This dependency may be modified later
-  4 |   // We record `{timeZone}` as capturing timeZone into the object,
-  5 |   // then assume that dateTimeFormat() mutates that object,
-  6 |   // which in turn can mutate timeZone and the object it came from,
-```
-          
-      
\ No newline at end of file

filename: compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/error.todo-repro-destructure-from-prop-with-default-value.js
patch: @@ -1,15 +0,0 @@
-export function useFormatRelativeTime(opts = {}) {
-  const {timeZone, minimal} = opts;
-  const format = useCallback(function formatWithUnit() {}, [minimal]);
-  // We record `{timeZone}` as capturing timeZone into the object,
-  // then assume that dateTimeFormat() mutates that object,
-  // which in turn can mutate timeZone and the object it came from,
-  // which means that the value `minimal` is derived from can change.
-  //
-  // The bug is that we shouldn't be recording a Capture effect given
-  // that `opts` is known maybe-frozen. If we correctly recorded
-  // an ImmutableCapture, this wouldn't be mistaken as mutating
-  // opts/minimal
-  dateTimeFormat({timeZone});
-  return format;
-}
Repository: ollama/ollama
Pull request: fix: define GGML_VERSION variables for proper SOVERSION expansion

## Summary
Fixes the issue where `libggml-base.so` was being installed with a literal "SOVERSION" suffix instead of the actual version number.

**Before:** `libggml-base.so.SOVERSION` (broken)
**After:** `libggml-base.so.0` (correct)

## Problem
The `ggml/src/CMakeLists.txt` uses `${GGML_VERSION_MAJOR}` for the shared library SOVERSION property:
```cmake
set_target_properties(ggml-base PROPERTIES
    VERSION ${GGML_VERSION}
    SOVERSION ${GGML_VERSION_MAJOR}
)
```

However, ollama's `CMakeLists.txt` directly includes the `ggml/src` subdirectory without the parent CMakeLists.txt that defines these variables in the upstream ggml project.

Since `GGML_VERSION_MAJOR` was undefined, CMake used an empty/literal string, resulting in the malformed library name.

## Solution
Added the required GGML_VERSION variables before including the ggml subdirectory:
```cmake
set(GGML_VERSION_MAJOR 0)
set(GGML_VERSION_MINOR 0)
set(GGML_VERSION_PATCH 0)
set(GGML_VERSION "${GGML_VERSION_MAJOR}.${GGML_VERSION_MINOR}.${GGML_VERSION_PATCH}")
```

## Test plan
- [x] Go tests pass
- [ ] Linux build produces correctly named library files (needs CI verification)

Fixes #13436

Changed files:
filename: CMakeLists.txt
patch: @@ -54,6 +54,13 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ml/backend/ggml/ggml/src/ggml-cp
 
 add_compile_definitions(NDEBUG GGML_VERSION=0x0 GGML_COMMIT=0x0)
 
+# Define GGML version variables for shared library SOVERSION
+# These are required by ggml/src/CMakeLists.txt for proper library versioning
+set(GGML_VERSION_MAJOR 0)
+set(GGML_VERSION_MINOR 0)
+set(GGML_VERSION_PATCH 0)
+set(GGML_VERSION "${GGML_VERSION_MAJOR}.${GGML_VERSION_MINOR}.${GGML_VERSION_PATCH}")
+
 set(GGML_CPU ON)
 add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/ml/backend/ggml/ggml/src)
 set_property(TARGET ggml PROPERTY EXCLUDE_FROM_ALL TRUE)
Repository: nodejs/node
Pull request: crypto: read algorithm name property only once in normalizeAlgorithm

Refs: https://redirect.github.com/web-platform-tests/wpt/pull/57614#pullrequestreview-3808145365

Changed files:
filename: lib/internal/crypto/util.js
patch: @@ -565,10 +565,13 @@ function normalizeAlgorithm(algorithm, op) {
     return { name: algName };
 
   // 6.
-  const normalizedAlgorithm = webidl.converters[desiredType](algorithm, {
-    prefix: 'Failed to normalize algorithm',
-    context: 'passed algorithm',
-  });
+  const normalizedAlgorithm = webidl.converters[desiredType](
+    { __proto__: algorithm, name: algName },
+    {
+      prefix: 'Failed to normalize algorithm',
+      context: 'passed algorithm',
+    },
+  );
   // 7.
   normalizedAlgorithm.name = algName;
 

filename: test/parallel/test-webcrypto-util.js
patch: @@ -17,3 +17,35 @@ const {
   assert.strictEqual(normalizeAlgorithm(algorithm, 'sign') !== algorithm, true);
   assert.deepStrictEqual(algorithm, { name: 'ECDSA', hash: 'SHA-256' });
 }
+
+// The algorithm name getter should only be invoked once during
+// normalizeAlgorithm, including for algorithms with a non-null desiredType
+// where step 6 runs the specialized dictionary converter.
+// Refs: https://github.com/web-platform-tests/wpt/pull/57614#pullrequestreview-3808145365
+{
+  let nameReadCount = 0;
+  const algorithm = {
+    get name() {
+      nameReadCount++;
+      return 'AES-GCM';
+    },
+    iv: new Uint8Array(12),
+  };
+  const normalized = normalizeAlgorithm(algorithm, 'encrypt');
+  assert.strictEqual(normalized.name, 'AES-GCM');
+  assert.strictEqual(nameReadCount, 1);
+}
+
+{
+  let nameReadCount = 0;
+  const algorithm = {
+    get name() {
+      nameReadCount++;
+      return 'ECDSA';
+    },
+    hash: 'SHA-256',
+  };
+  const normalized = normalizeAlgorithm(algorithm, 'sign');
+  assert.strictEqual(normalized.name, 'ECDSA');
+  assert.strictEqual(nameReadCount, 1);
+}
Repository: huggingface/transformers
Pull request: Fix off-by-one in decode_spans boundary check

# What does this PR do?

Fixes an off-by-one error in `decode_spans()` in the document question answering pipeline that causes a `ValueError: kth(=N) out of bounds` crash when `len(scores_flat) == topk`.

The boundary check on line 97 uses `<` but should use `<=`. When the flattened candidate array has exactly `topk` elements, `np.argpartition(-scores_flat, topk)` is called with `kth=topk`, which is out of bounds (0-indexed). Changing to `<=` ensures we fall through to `argsort` in this edge case.

Fixes #44327

## Before submitting
- [ ] This PR fixes a typo or improves the docs (you can dismiss the other checks if that's the case).
- [x] Did you read the [contributor guideline](https://github.com/huggingface/transformers/blob/main/CONTRIBUTING.md#create-a-pull-request),
      Pull Request section?
- [x] Was this discussed/approved via a Github issue or the [forum](https://discuss.huggingface.co/)? Please add a link
      to it if that's the case. https://github.com/huggingface/transformers/issues/44327
- [ ] Did you make sure to update the documentation with your changes? Here are the
      [documentation guidelines](https://github.com/huggingface/transformers/tree/main/docs), and
      [here are tips on formatting docstrings](https://github.com/huggingface/transformers/tree/main/docs#writing-source-documentation).
- [x] Did you write any new necessary tests?

## Who can review?

@Rocketknight1 (pipelines)

This contribution was developed with AI assistance (Claude Code).

Changed files:
filename: src/transformers/pipelines/document_question_answering.py
patch: @@ -94,7 +94,7 @@ def decode_spans(
     scores_flat = candidates.flatten()
     if topk == 1:
         idx_sort = [np.argmax(scores_flat)]
-    elif len(scores_flat) < topk:
+    elif len(scores_flat) <= topk:
         idx_sort = np.argsort(-scores_flat)
     else:
         idx = np.argpartition(-scores_flat, topk)[0:topk]
Repository: huggingface/transformers
Pull request: Remove useless identity assignment

# What does this PR do?

Small mistake in https://github.com/huggingface/transformers/pull/44432. cc @zucchini-nlp, was it intended to remove the scaling? (I assume so since the embedding now has the saling baked in, and I guess paligemma always uses gemma?)

Changed files:
filename: src/transformers/models/paligemma/modeling_paligemma.py
patch: @@ -268,7 +268,6 @@ def get_image_features(
         image_outputs = self.vision_tower(pixel_values, return_dict=True, **kwargs)
         selected_image_feature = image_outputs.last_hidden_state
         image_features = self.multi_modal_projector(selected_image_feature)
-        image_features = image_features
         image_outputs.pooler_output = image_features
 
         return image_outputs
Repository: facebook/react
Pull request: [react-dom] Batch updates from `resize` until next frame

Resize is closer to scroll events which are already batched during a frame. We previously flushed state updates from resize events when new discrete events came in. Now resize is batched with other continuous events.

We stil flush before the next frame is painted.

Changed files:
filename: packages/react-dom-bindings/src/events/ReactDOMEventListener.js
patch: @@ -341,7 +341,6 @@ export function getEventPriority(domEventName: DOMEventName): EventPriority {
     case 'pointerup':
     case 'ratechange':
     case 'reset':
-    case 'resize':
     case 'seeked':
     case 'submit':
     case 'toggle':
@@ -380,6 +379,7 @@ export function getEventPriority(domEventName: DOMEventName): EventPriority {
     case 'pointermove':
     case 'pointerout':
     case 'pointerover':
+    case 'resize':
     case 'scroll':
     case 'touchmove':
     case 'wheel':
Repository: nodejs/node
Pull request: doc: reserve NMV 146 for Electron 42

<!--
Before submitting a pull request, please read:

- the CONTRIBUTING guide at https://github.com/nodejs/node/blob/HEAD/CONTRIBUTING.md
- the commit message formatting guidelines at
  https://github.com/nodejs/node/blob/HEAD/doc/contributing/pull-requests.md#commit-message-guidelines

For code changes:
1. Include tests for any bug fixes or new features.
2. Update documentation if relevant.
3. Ensure that `make -j4 test` (UNIX), or `vcbuild test` (Windows) passes.

If you believe this PR should be highlighted in the Node.js CHANGELOG
please add the `notable-change` label.

Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
    have the right to submit it under the open source license
    indicated in the file; or

(b) The contribution is based upon previous work that, to the best
    of my knowledge, is covered under an appropriate open source
    license and I have the right under that license to submit that
    work with modifications, whether created in whole or in part
    by me, under the same open source license (unless I am
    permitted to submit under a different license), as indicated
    in the file; or

(c) The contribution was provided directly to me by some other
    person who certified (a), (b) or (c) and I have not modified
    it.

(d) I understand and agree that this project and the contribution
    are public and that a record of the contribution (including all
    personal information I submit with it, including my sign-off) is
    maintained indefinitely and may be redistributed consistent with
    this project or the open source license(s) involved.
-->

Reserves NMV 146 for Electron 42. Thank you! 🙂

[Relevant Electron task.](https://github.com/orgs/electron/projects/120/views/3?pane=issue&itemId=150589510)

Changed files:
filename: doc/abi_version_registry.json
patch: @@ -1,5 +1,6 @@
 {
   "NODE_MODULE_VERSION": [
+    { "modules": 146,"runtime": "electron", "variant": "electron",             "versions": "42" },
     { "modules": 145,"runtime": "electron", "variant": "electron",             "versions": "41" },
     { "modules": 144,"runtime": "node",     "variant": "v8_14.3",              "versions": "26.0.0-pre" },
     { "modules": 143,"runtime": "electron", "variant": "electron",             "versions": "40" },