kernel-checkpoint 0.1.5__tar.gz → 0.1.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/PKG-INFO +1 -1
  2. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/jupyter-notebook-image/Dockerfile +1 -1
  3. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/kernel_checkpoint/__init__.py +1 -0
  4. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/kernel_checkpoint/_version.py +1 -1
  5. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/kernel_checkpoint/labextension/build_log.json +1 -1
  6. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/kernel_checkpoint/labextension/package.json +2 -2
  7. kernel_checkpoint-0.1.5/kernel_checkpoint/labextension/static/lib_index_js.bcb2d92b281a36765a67.js → kernel_checkpoint-0.1.7/kernel_checkpoint/labextension/static/lib_index_js.3571ff1d8cbf7ea37b2e.js +21 -8
  8. kernel_checkpoint-0.1.7/kernel_checkpoint/labextension/static/lib_index_js.3571ff1d8cbf7ea37b2e.js.map +1 -0
  9. kernel_checkpoint-0.1.5/kernel_checkpoint/labextension/static/remoteEntry.ff55aa1cac6b05f762e9.js → kernel_checkpoint-0.1.7/kernel_checkpoint/labextension/static/remoteEntry.900312eadd6aa5546ed7.js +3 -3
  10. kernel_checkpoint-0.1.5/kernel_checkpoint/labextension/static/remoteEntry.ff55aa1cac6b05f762e9.js.map → kernel_checkpoint-0.1.7/kernel_checkpoint/labextension/static/remoteEntry.900312eadd6aa5546ed7.js.map +1 -1
  11. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/package.json +1 -1
  12. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/src/checkpoint-panel.tsx +12 -3
  13. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/src/index.ts +5 -2
  14. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/src/types.ts +10 -1
  15. kernel_checkpoint-0.1.5/kernel_checkpoint/labextension/static/lib_index_js.bcb2d92b281a36765a67.js.map +0 -1
  16. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/.copier-answers.yml +0 -0
  17. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/.gitignore +0 -0
  18. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/.prettierignore +0 -0
  19. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/.yarnrc.yml +0 -0
  20. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/4 +0 -0
  21. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/=4 +0 -0
  22. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/CHANGELOG.md +0 -0
  23. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/LICENSE +0 -0
  24. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/README.md +0 -0
  25. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/RELEASE.md +0 -0
  26. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/babel.config.js +0 -0
  27. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/cursor_jupyterlab_extension_for_checkpo.md +0 -0
  28. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/install.json +0 -0
  29. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/jest.config.js +0 -0
  30. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/jupyter-config/jupyter_server_config.d/kernel_checkpoint.json +0 -0
  31. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/kernel_checkpoint/Untitled.ipynb +0 -0
  32. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/kernel_checkpoint/handlers.py +0 -0
  33. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/kernel_checkpoint/labextension/static/style.js +0 -0
  34. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/kernel_checkpoint/labextension/static/style_index_js.c3e72438ed03e9dee0fc.js +0 -0
  35. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/kernel_checkpoint/labextension/static/style_index_js.c3e72438ed03e9dee0fc.js.map +0 -0
  36. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/pyproject.toml +0 -0
  37. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/setup.py +0 -0
  38. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/src/__tests__/kernel_checkpoint.spec.ts +0 -0
  39. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/src/api.ts +0 -0
  40. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/style/base.css +0 -0
  41. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/style/index.css +0 -0
  42. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/style/index.js +0 -0
  43. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/tsconfig.json +0 -0
  44. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/tsconfig.test.json +0 -0
  45. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/ui-tests/README.md +0 -0
  46. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/ui-tests/jupyter_server_test_config.py +0 -0
  47. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/ui-tests/package.json +0 -0
  48. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/ui-tests/playwright.config.js +0 -0
  49. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/ui-tests/tests/kernel_checkpoint.spec.ts +0 -0
  50. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/ui-tests/yarn.lock +0 -0
  51. {kernel_checkpoint-0.1.5 → kernel_checkpoint-0.1.7}/yarn.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kernel_checkpoint
3
- Version: 0.1.5
3
+ Version: 0.1.7
4
4
  Summary: An extension for saving and restoring kernel pod state with jupyter enterprise gateway
5
5
  Project-URL: Homepage, https://github.com/lehuannhatrang/kernel-checkpoint-extension.git
6
6
  Project-URL: Bug Tracker, https://github.com/lehuannhatrang/kernel-checkpoint-extension.git/issues
@@ -4,6 +4,6 @@ USER root
4
4
 
5
5
  RUN pip install --upgrade pip
6
6
 
7
- RUN pip install --no-cache-dir kernel-checkpoint==0.1.5
7
+ RUN pip install --no-cache-dir kernel-checkpoint==0.1.6
8
8
 
9
9
  USER jovyan
@@ -86,6 +86,7 @@ def _patch_kernel_handler_for_env_passthrough(server_app):
86
86
  "KERNEL_CHECKPOINT_NAME",
87
87
  "KERNEL_CHECKPOINT_FILE_PATH",
88
88
  "KERNEL_CHECKPOINT_CONTAINER_NAME",
89
+ "KERNEL_ID",
89
90
  ]
90
91
  except Exception:
91
92
  pass
@@ -1,4 +1,4 @@
1
1
  # This file is auto-generated by Hatchling. As such, do not:
2
2
  # - modify
3
3
  # - track in version control e.g. be sure to add to .gitignore
4
- __version__ = VERSION = '0.1.5'
4
+ __version__ = VERSION = '0.1.7'
@@ -700,7 +700,7 @@
700
700
  "singleton": true
701
701
  },
702
702
  "kernel-checkpoint": {
703
- "version": "0.1.2",
703
+ "version": "0.1.6",
704
704
  "singleton": true,
705
705
  "import": "/home/ubuntu/projects/kernel-checkpoint-extension/lib/index.js"
706
706
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kernel-checkpoint",
3
- "version": "0.1.2",
3
+ "version": "0.1.6",
4
4
  "description": "An extension for saving and restoring kernel pod state with jupyter enterprise gateway",
5
5
  "keywords": [
6
6
  "jupyter",
@@ -114,7 +114,7 @@
114
114
  },
115
115
  "outputDir": "kernel_checkpoint/labextension",
116
116
  "_build": {
117
- "load": "static/remoteEntry.ff55aa1cac6b05f762e9.js",
117
+ "load": "static/remoteEntry.900312eadd6aa5546ed7.js",
118
118
  "extension": "./extension",
119
119
  "style": "./style"
120
120
  }
@@ -119,7 +119,7 @@ function formatDate(iso) {
119
119
  return new Date(iso).toLocaleString();
120
120
  }
121
121
  function CheckpointPanel(props) {
122
- const { namespace, kernelId, onRestore } = props;
122
+ const { namespace, kernelId, kernelSpecName, notebookName, onRestore } = props;
123
123
  const [checkpoints, setCheckpoints] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);
124
124
  const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);
125
125
  const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
@@ -174,7 +174,12 @@ function CheckpointPanel(props) {
174
174
  name: newName.trim(),
175
175
  namespace,
176
176
  kernelId,
177
- buildImage: false
177
+ buildImage: false,
178
+ metadata: {
179
+ kernelId,
180
+ kernelName: kernelSpecName,
181
+ notebookName
182
+ }
178
183
  });
179
184
  setNewName('');
180
185
  setShowCreateForm(false);
@@ -237,11 +242,15 @@ function CheckpointPanel(props) {
237
242
  setFlash(null);
238
243
  try {
239
244
  const detail = await _api__WEBPACK_IMPORTED_MODULE_1__.CheckpointAPI.getCheckpoint(namespace, checkpointName);
240
- const filePath = (_c = (_b = (_a = detail.checkpointFiles) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.filePath) !== null && _c !== void 0 ? _c : '';
241
- if (!filePath) {
245
+ const checkpointFile = (_a = detail.checkpointFiles) === null || _a === void 0 ? void 0 : _a[0];
246
+ if (!(checkpointFile === null || checkpointFile === void 0 ? void 0 : checkpointFile.storagePath)) {
242
247
  throw new Error('No checkpoint file path available for this checkpoint');
243
248
  }
244
- await onRestore(checkpointName, filePath);
249
+ const cpKernelId = (_c = (_b = detail.metadata) === null || _b === void 0 ? void 0 : _b.kernelId) !== null && _c !== void 0 ? _c : '';
250
+ if (!cpKernelId) {
251
+ throw new Error('No kernel ID found in checkpoint metadata');
252
+ }
253
+ await onRestore(checkpointName, checkpointFile.storagePath, checkpointFile.containerName, cpKernelId);
245
254
  setFlash({
246
255
  type: 'success',
247
256
  text: `Kernel restored from "${checkpointName}". The kernel is restarting.`
@@ -451,7 +460,8 @@ const plugin = {
451
460
  }
452
461
  const kernelId = kernel.id;
453
462
  const kernelSpecName = kernel.name || 'python_kubernetes';
454
- const onRestore = async (checkpointName, checkpointFilePath) => {
463
+ const notebookName = panel.title.label || '';
464
+ const onRestore = async (checkpointName, checkpointFilePath, containerName, cpKernelId) => {
455
465
  const settings = _jupyterlab_services__WEBPACK_IMPORTED_MODULE_3__.ServerConnection.makeSettings();
456
466
  const kernelUrl = _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2__.URLExt.join(settings.baseUrl, 'api', 'kernels');
457
467
  const response = await _jupyterlab_services__WEBPACK_IMPORTED_MODULE_3__.ServerConnection.makeRequest(kernelUrl, {
@@ -461,7 +471,9 @@ const plugin = {
461
471
  name: kernelSpecName,
462
472
  env: {
463
473
  KERNEL_CHECKPOINT_NAME: checkpointName,
464
- KERNEL_CHECKPOINT_FILE_PATH: checkpointFilePath
474
+ KERNEL_CHECKPOINT_FILE_PATH: checkpointFilePath,
475
+ KERNEL_CHECKPOINT_CONTAINER_NAME: containerName,
476
+ KERNEL_ID: cpKernelId
465
477
  }
466
478
  })
467
479
  }, settings);
@@ -476,6 +488,7 @@ const plugin = {
476
488
  namespace: config.namespace,
477
489
  kernelId,
478
490
  kernelSpecName,
491
+ notebookName,
479
492
  onRestore
480
493
  });
481
494
  await (0,_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.showDialog)({
@@ -505,4 +518,4 @@ const plugin = {
505
518
  /***/ }
506
519
 
507
520
  }]);
508
- //# sourceMappingURL=lib_index_js.bcb2d92b281a36765a67.js.map
521
+ //# sourceMappingURL=lib_index_js.3571ff1d8cbf7ea37b2e.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib_index_js.3571ff1d8cbf7ea37b2e.js","mappings":";;;;;;;;;;;;;;;;;AAA+C;AACS;AAQxD,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAE1C,SAAS,WAAW,CAClB,QAAgB,EAChB,OAAoB,EAAE;IAEtB,MAAM,QAAQ,GAAG,kEAAgB,CAAC,YAAY,EAAE,CAAC;IACjD,MAAM,GAAG,GAAG,yDAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;IACnE,OAAO,kEAAgB,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,IAAS;IACzC,OAAO;QACL,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAAI,QAAkB;IACjD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9D,CAAC;QAAC,WAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAEM,IAAU,aAAa,CAkE7B;AAlED,WAAiB,aAAa;IACrB,KAAK,UAAU,SAAS;QAC7B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,cAAc,CAAoB,IAAI,CAAC,CAAC;IACjD,CAAC;IAHqB,uBAAS,YAG9B;IAEM,KAAK,UAAU,eAAe,CACnC,SAAiB;QAEjB,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,yBAAyB,kBAAkB,CAAC,SAAS,CAAC,EAAE,CACzD,CAAC;QACF,OAAO,cAAc,CAA0B,IAAI,CAAC,CAAC;IACvD,CAAC;IAPqB,6BAAe,kBAOpC;IAEM,KAAK,UAAU,aAAa,CACjC,SAAiB,EACjB,IAAY;QAEZ,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,eAAe,kBAAkB,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAC3E,CAAC;QACF,OAAO,cAAc,CAAc,IAAI,CAAC,CAAC;IAC3C,CAAC;IARqB,2BAAa,gBAQlC;IAEM,KAAK,UAAU,gBAAgB,CACpC,OAAiC;QAEjC,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,aAAa,EACb,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAC1B,CAAC;QACF,OAAO,cAAc,CAAc,IAAI,CAAC,CAAC;IAC3C,CAAC;IARqB,8BAAgB,mBAQrC;IAEM,KAAK,UAAU,gBAAgB,CACpC,SAAiB,EACjB,IAAY;QAEZ,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,eAAe,kBAAkB,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAC1E,EAAE,MAAM,EAAE,QAAQ,EAAE,CACrB,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,IAAI,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC/B,MAAM,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC9D,CAAC;YAAC,WAAM,CAAC;gBACP,iBAAiB;YACnB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAlBqB,8BAAgB,mBAkBrC;IAEM,KAAK,UAAU,gBAAgB,CACpC,SAAiB,EACjB,IAAY,EACZ,IAAyB;QAEzB,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,eAAe,kBAAkB,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAC1E,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CACtB,CAAC;QACF,OAAO,cAAc,CAAc,IAAI,CAAC,CAAC;IAC3C,CAAC;IAVqB,8BAAgB,mBAUrC;AACH,CAAC,EAlEgB,aAAa,KAAb,aAAa,QAkE7B;;;;;;;;;;;;;;;;;;AC5G+D;AAE1B;AAEtC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAEtC,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC;AAED,SAAS,cAAc,CAAC,EAAE,KAAK,EAAqB;IAClD,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,qEAAM,SAAS,EAAE,qBAAqB,GAAG,EAAE,IAAG,OAAO,CAAQ,CAAC;AACvE,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;AACxC,CAAC;AAEM,SAAS,eAAe,CAAC,KAA4B;IAC1D,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAE/E,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,+CAAQ,CAAgB,EAAE,CAAC,CAAC;IAClE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,+CAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,+CAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,+CAAQ,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,+CAAQ,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,+CAAQ,CAAC,KAAK,CAAC,CAAC;IAEhD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,+CAAQ,CAAgB,IAAI,CAAC,CAAC;IAChE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,+CAAQ,CAAgB,IAAI,CAAC,CAAC;IAC1E,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,+CAAQ,CAAqB,IAAI,CAAC,CAAC;IAEvE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,+CAAQ,CAAgB,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,+CAAQ,CAAC,EAAE,CAAC,CAAC;IAEnD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,+CAAQ,CAGxB,IAAI,CAAC,CAAC;IAEhB,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,+CAAQ,CAAgB,IAAI,CAAC,CAAC;IACxE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,+CAAQ,CAAgB,IAAI,CAAC,CAAC;IAE1E,wEAAwE;IACxE,yEAAyE;IACzE,wEAAwE;IAExE,MAAM,gBAAgB,GAAG,kDAAW,CAAC,KAAK,IAAI,EAAE;;QAC9C,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,+CAAa,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAC9D,cAAc,CAAC,YAAM,CAAC,KAAK,mCAAI,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC,SAAG,CAAC,OAAO,mCAAI,4BAA4B,CAAC,CAAC;QACxD,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,gDAAS,CAAC,GAAG,EAAE;QACb,gBAAgB,EAAE,CAAC;IACrB,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB,gDAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,WAAW,CAAC,gBAAgB,EAAE,2BAA2B,GAAG,IAAI,CAAC,CAAC;QAC7E,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB,wEAAwE;IACxE,yEAAyE;IACzE,wEAAwE;IAExE,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;;QAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,+CAAa,CAAC,gBAAgB,CAAC;gBACnC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;gBACpB,SAAS;gBACT,QAAQ;gBACR,UAAU,EAAE,KAAK;gBACjB,QAAQ,EAAE;oBACR,QAAQ;oBACR,UAAU,EAAE,cAAc;oBAC1B,YAAY;iBACb;aACF,CAAC,CAAC;YACH,UAAU,CAAC,EAAE,CAAC,CAAC;YACf,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACzB,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,kCAAkC,EAAE,CAAC,CAAC;YACxE,MAAM,gBAAgB,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC;gBACP,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAG,CAAC,OAAO,mCAAI,6BAA6B;aACnD,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;;QAC1C,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,+CAAa,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACtD,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,IAAI,YAAY,EAAE,CAAC,CAAC;YACrE,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;gBAC5B,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBACxB,aAAa,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;YACD,MAAM,gBAAgB,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC;gBACP,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAG,CAAC,OAAO,mCAAI,6BAA6B;aACnD,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;;QAC9C,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;YAC5B,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,+CAAa,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAClE,aAAa,CAAC,MAAM,CAAC,CAAC;YACtB,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC;gBACP,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAG,CAAC,OAAO,mCAAI,kCAAkC;aACxD,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK,EAAE,cAAsB,EAAE,EAAE;;QACrD,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACxB,YAAY,CAAC,cAAc,CAAC,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,+CAAa,CAAC,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAC5E,MAAM,cAAc,GAAG,YAAM,CAAC,eAAe,0CAAG,CAAC,CAAC,CAAC;YACnD,IAAI,CAAC,eAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,WAAW,GAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC3E,CAAC;YACD,MAAM,UAAU,GAAG,kBAAM,CAAC,QAAQ,0CAAE,QAAQ,mCAAI,EAAE,CAAC;YACnD,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YACtG,QAAQ,CAAC;gBACP,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,yBAAyB,cAAc,8BAA8B;aAC5E,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC;gBACP,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAG,CAAC,OAAO,mCAAI,8BAA8B;aACpD,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,EAAE,OAAe,EAAE,EAAE;;QAC7C,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACpC,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,+CAAa,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE;gBACvD,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;YACH,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,0BAA0B,OAAO,IAAI,EAAE,CAAC,CAAC;YAC3E,MAAM,gBAAgB,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC;gBACP,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAG,CAAC,OAAO,mCAAI,6BAA6B;aACnD,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,wEAAwE;IACxE,yEAAyE;IACzE,wEAAwE;IAExE,OAAO,CACL,oEAAK,SAAS,EAAC,UAAU;QAEtB,KAAK,IAAI,CACR,oEAAK,SAAS,EAAE,qBAAqB,KAAK,CAAC,IAAI,EAAE;YAC/C,yEAAO,KAAK,CAAC,IAAI,CAAQ;YACzB,uEACE,SAAS,EAAC,gBAAgB,EAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,aAGtB,CACL,CACP;QAGD,oEAAK,SAAS,EAAC,mBAAmB,IAC/B,CAAC,cAAc,CAAC,CAAC,CAAC,CACjB,uEACE,SAAS,EAAC,uBAAuB,EACjC,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,wBAG/B,CACV,CAAC,CAAC,CAAC,CACF,oEAAK,SAAS,EAAC,gBAAgB;YAC7B,sEACE,SAAS,EAAC,UAAU,EACpB,IAAI,EAAC,MAAM,EACX,WAAW,EAAC,6BAAwB,EACpC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,SAAS,EAAE,CAAC,CAAC,EAAE;oBACb,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;wBACtB,YAAY,EAAE,CAAC;oBACjB,CAAC;gBACH,CAAC,EACD,SAAS,QACT,QAAQ,EAAE,QAAQ,GAClB;YACF,uEACE,SAAS,EAAC,uBAAuB,EACjC,QAAQ,EAAE,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EACrC,OAAO,EAAE,YAAY,IAEpB,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CACvB;YACT,uEACE,SAAS,EAAC,QAAQ,EAClB,OAAO,EAAE,GAAG,EAAE;oBACZ,iBAAiB,CAAC,KAAK,CAAC,CAAC;oBACzB,UAAU,CAAC,EAAE,CAAC,CAAC;gBACjB,CAAC,aAGM,CACL,CACP,CACG;QAGN,oEAAK,SAAS,EAAC,SAAS,IACrB,OAAO,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACrC,oEAAK,SAAS,EAAC,gBAAgB,gCAA2B,CAC3D,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CACV,oEAAK,SAAS,EAAC,qCAAqC,IAAE,KAAK,CAAO,CACnE,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC7B,oEAAK,SAAS,EAAC,gBAAgB,+EAGzB,CACP,CAAC,CAAC,CAAC,CACF,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CACpB,oEAAK,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,EAAC,SAAS;YAEpC,oEAAK,SAAS,EAAC,gBAAgB;gBAC7B,oEAAK,SAAS,EAAC,cAAc;oBAC1B,YAAY,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAC1B,oEAAK,SAAS,EAAC,gBAAgB;wBAC7B,sEACE,SAAS,EAAC,sBAAsB,EAChC,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC7C,SAAS,EAAE,CAAC,CAAC,EAAE;gCACb,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;oCACtB,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;gCACxB,CAAC;gCACD,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;oCACvB,eAAe,CAAC,IAAI,CAAC,CAAC;gCACxB,CAAC;4BACH,CAAC,EACD,SAAS,SACT;wBACF,uEACE,SAAS,EAAC,kBAAkB,EAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,SAG7B;wBACT,uEACE,SAAS,EAAC,kBAAkB,EAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,aAG7B,CACL,CACP,CAAC,CAAC,CAAC,CACF,qEAAM,SAAS,EAAC,cAAc,EAAC,KAAK,EAAE,EAAE,CAAC,IAAI,IAC1C,EAAE,CAAC,IAAI,CACH,CACR;oBACD,oEAAK,SAAS,EAAC,cAAc;wBAC3B,2DAAC,cAAc,IAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAI;wBACnC,qEAAM,SAAS,EAAC,cAAc,IAC3B,UAAU,CAAC,EAAE,CAAC,SAAS,CAAC,CACpB,CACH,CACF;gBAEN,oEAAK,SAAS,EAAC,iBAAiB;oBAC9B,uEACE,SAAS,EAAC,kBAAkB,EAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,CAAC,IAEvC,cAAc,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CACzC;oBACT,uEACE,SAAS,EAAC,kBAAkB,EAC5B,OAAO,EAAE,GAAG,EAAE;4BACZ,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;4BACzB,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;wBAC1B,CAAC,aAGM;oBACR,aAAa,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAC3B;wBACE,qEAAM,SAAS,EAAC,kBAAkB,cAAe;wBACjD,uEACE,SAAS,EAAC,gCAAgC,EAC1C,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,UAG7B;wBACT,uEACE,SAAS,EAAC,kBAAkB,EAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAG9B,CACR,CACJ,CAAC,CAAC,CAAC,CACF,uEACE,SAAS,EAAC,gCAAgC,EAC1C,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,CAAC,aAGjC,CACV;oBACA,cAAc,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAC5B;wBACE,qEAAM,SAAS,EAAC,kBAAkB,eAAgB;wBAClD,uEACE,SAAS,EAAC,iCAAiC,EAC3C,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,UAG9B;wBACT,uEACE,SAAS,EAAC,kBAAkB,EAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAG/B,CACR,CACJ,CAAC,CAAC,CAAC,CACF,uEACE,SAAS,EAAC,iCAAiC,EAC3C,QAAQ,EACN,SAAS,KAAK,IAAI,IAAI,EAAE,CAAC,KAAK,KAAK,WAAW,EAEhD,KAAK,EACH,EAAE,CAAC,KAAK,KAAK,WAAW;4BACtB,CAAC,CAAC,yCAAyC;4BAC3C,CAAC,CAAC,8BAA8B,EAEpC,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,IAAI,CAAC,IAExC,SAAS,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAC1C,CACV,CACG,CACF;YAGL,cAAc,KAAK,EAAE,CAAC,IAAI,IAAI,UAAU,IAAI,CAC3C,oEAAK,SAAS,EAAC,WAAW;gBACxB,oEAAK,SAAS,EAAC,eAAe;oBAC5B,qEAAM,SAAS,EAAC,iBAAiB,aAAc;oBAC/C,yEAAO,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,CAAQ,CAC5C;gBACN,oEAAK,SAAS,EAAC,eAAe;oBAC5B,qEAAM,SAAS,EAAC,iBAAiB,cAAe;oBAChD,yEAAO,UAAU,CAAC,OAAO,CAAQ,CAC7B;gBACL,UAAU,CAAC,MAAM,IAAI,CACpB,oEAAK,SAAS,EAAC,eAAe;oBAC5B,qEAAM,SAAS,EAAC,iBAAiB,UAAW;oBAC5C,yEAAO,UAAU,CAAC,MAAM,CAAC,IAAI,CAAQ,CACjC,CACP;gBACA,UAAU,CAAC,eAAe;oBACzB,UAAU,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,CACvC,oEAAK,SAAS,EAAC,mBAAmB;oBAChC,qEAAM,SAAS,EAAC,iBAAiB,uBAE1B;oBACN,UAAU,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACxC,oEAAK,GAAG,EAAE,CAAC,EAAE,SAAS,EAAC,gBAAgB;wBACrC,yEAAO,CAAC,CAAC,aAAa,CAAQ;wBAC9B,qEAAM,SAAS,EAAC,gBAAgB,IAC7B,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CACxB,CACH,CACP,CAAC,CACE,CACP;gBACF,UAAU,CAAC,WAAW;oBACrB,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CACnC,oEAAK,SAAS,EAAC,mBAAmB;oBAChC,qEAAM,SAAS,EAAC,iBAAiB,mBAAoB;oBACpD,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACtC,oEAAK,GAAG,EAAE,CAAC,EAAE,SAAS,EAAC,gBAAgB;wBACrC,qEAAM,SAAS,EAAC,sBAAsB,IACnC,GAAG,CAAC,SAAS,CACT;wBACP,qEAAM,SAAS,EAAC,gBAAgB,IAC7B,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CACrB,CACH,CACP,CAAC,CACE,CACP,CACC,CACP,CACG,CACP,CAAC,CACH,CACG,CAEF,CACP,CAAC;AACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjcsE;AAMzC;AACiB;AACS;AAC9B;AAE2B;AACf;AAGtC;;;GAGG;AACH,MAAM,oBAAqB,SAAQ,6DAAW;IAG5C,YAAY,KAA4B;QACtC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAClC,CAAC;IAES,MAAM;QACd,OAAO,0DAAmB,CAAC,8DAAe,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3D,CAAC;CACF;AAED,MAAM,UAAU,GAAG,wBAAwB,CAAC;AAE5C,MAAM,MAAM,GAAgC;IAC1C,EAAE,EAAE,0BAA0B;IAC9B,WAAW,EACT,wFAAwF;IAC1F,SAAS,EAAE,IAAI;IACf,QAAQ,EAAE,CAAC,kEAAgB,CAAC;IAC5B,QAAQ,EAAE,CAAC,GAAoB,EAAE,eAAiC,EAAE,EAAE;QACpE,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QAEpE,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE;YAClC,KAAK,EAAE,eAAe;YACtB,OAAO,EAAE,2BAA2B;YACpC,OAAO,EAAE,KAAK,IAAI,EAAE;;gBAClB,MAAM,KAAK,GAAG,eAAe,CAAC,aAAa,CAAC;gBAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO;gBACT,CAAC;gBAED,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;gBAC5C,MAAM,cAAc,CAAC,KAAK,CAAC;gBAE3B,IAAI,MAAM,CAAC;gBACX,IAAI,CAAC;oBACH,MAAM,GAAG,MAAM,+CAAa,CAAC,SAAS,EAAE,CAAC;gBAC3C,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,gEAAU,CAAC;wBACf,KAAK,EAAE,qBAAqB;wBAC5B,IAAI,EAAE,4EAA4E;wBAClF,OAAO,EAAE,CAAC,wDAAM,CAAC,QAAQ,EAAE,CAAC;qBAC7B,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;oBACtB,MAAM,gEAAU,CAAC;wBACf,KAAK,EAAE,qBAAqB;wBAC5B,IAAI,EAAE,kGAAkG;wBACxG,OAAO,EAAE,CAAC,wDAAM,CAAC,QAAQ,EAAE,CAAC;qBAC7B,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,MAAM,MAAM,GAAG,oBAAc,CAAC,OAAO,0CAAE,MAAM,CAAC;gBAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,gEAAU,CAAC;wBACf,KAAK,EAAE,WAAW;wBAClB,IAAI,EAAE,sDAAsD;wBAC5D,OAAO,EAAE,CAAC,wDAAM,CAAC,QAAQ,EAAE,CAAC;qBAC7B,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;gBAC3B,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,IAAI,mBAAmB,CAAC;gBAC1D,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;gBAE7C,MAAM,SAAS,GAAG,KAAK,EAAE,cAAsB,EAAE,kBAA0B,EAAE,aAAqB,EAAE,UAAkB,EAAiB,EAAE;oBACvI,MAAM,QAAQ,GAAG,kEAAgB,CAAC,YAAY,EAAE,CAAC;oBACjD,MAAM,SAAS,GAAG,yDAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;oBAElE,MAAM,QAAQ,GAAG,MAAM,kEAAgB,CAAC,WAAW,CACjD,SAAS,EACT;wBACE,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;wBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,IAAI,EAAE,cAAc;4BACpB,GAAG,EAAE;gCACH,sBAAsB,EAAE,cAAc;gCACtC,2BAA2B,EAAE,kBAAkB;gCAC/C,gCAAgC,EAAE,aAAa;gCAC/C,SAAS,EAAE,UAAU;6BACtB;yBACF,CAAC;qBACH,EACD,QAAQ,CACT,CAAC;oBAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;wBACjB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;wBACtC,MAAM,IAAI,KAAK,CAAC,qCAAqC,OAAO,EAAE,CAAC,CAAC;oBAClE,CAAC;oBAED,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACzC,MAAM,cAAc,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3D,CAAC,CAAC;gBAEF,MAAM,IAAI,GAAG,IAAI,oBAAoB,CAAC;oBACpC,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,QAAQ;oBACR,cAAc;oBACd,YAAY;oBACZ,SAAS;iBACV,CAAC,CAAC;gBAEH,MAAM,gEAAU,CAAC;oBACf,KAAK,EAAE,oBAAoB;oBAC3B,IAAI;oBACJ,OAAO,EAAE,CAAC,wDAAM,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;iBACnD,CAAC,CAAC;gBAEH,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,CAAC;SACF,CAAC,CAAC;QAEH,oDAAoD;QACpD,eAAe,CAAC,WAAW,CAAC,OAAO,CACjC,CAAC,OAAyB,EAAE,KAAoB,EAAE,EAAE;YAClD,MAAM,MAAM,GAAG,IAAI,+DAAa,CAAC;gBAC/B,KAAK,EAAE,eAAe;gBACtB,OAAO,EAAE,gCAAgC;gBACzC,OAAO,EAAE,GAAG,EAAE;oBACZ,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACnC,CAAC;aACF,CAAC,CAAC;YACH,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAC5D,CAAC,CACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,iEAAe,MAAM,EAAC","sources":["webpack://kernel-checkpoint/./src/api.ts","webpack://kernel-checkpoint/./src/checkpoint-panel.tsx","webpack://kernel-checkpoint/./src/index.ts"],"sourcesContent":["import { URLExt } from '@jupyterlab/coreutils';\nimport { ServerConnection } from '@jupyterlab/services';\nimport {\n ICheckpointConfig,\n ICheckpointListResponse,\n ICheckpoint,\n ICreateCheckpointRequest\n} from './types';\n\nconst API_NAMESPACE = 'kernel-checkpoint';\n\nfunction makeRequest(\n endpoint: string,\n init: RequestInit = {}\n): Promise<Response> {\n const settings = ServerConnection.makeSettings();\n const url = URLExt.join(settings.baseUrl, API_NAMESPACE, endpoint);\n return ServerConnection.makeRequest(url, init, settings);\n}\n\nfunction jsonInit(method: string, data: any): RequestInit {\n return {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data)\n };\n}\n\nasync function handleResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n let detail = response.statusText;\n try {\n const body = await response.json();\n detail = body.message || body.error || JSON.stringify(body);\n } catch {\n // use statusText\n }\n throw new Error(detail);\n }\n return response.json();\n}\n\nexport namespace CheckpointAPI {\n export async function getConfig(): Promise<ICheckpointConfig> {\n const resp = await makeRequest('config');\n return handleResponse<ICheckpointConfig>(resp);\n }\n\n export async function listCheckpoints(\n namespace: string\n ): Promise<ICheckpointListResponse> {\n const resp = await makeRequest(\n `checkpoints?namespace=${encodeURIComponent(namespace)}`\n );\n return handleResponse<ICheckpointListResponse>(resp);\n }\n\n export async function getCheckpoint(\n namespace: string,\n name: string\n ): Promise<ICheckpoint> {\n const resp = await makeRequest(\n `checkpoints/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`\n );\n return handleResponse<ICheckpoint>(resp);\n }\n\n export async function createCheckpoint(\n request: ICreateCheckpointRequest\n ): Promise<ICheckpoint> {\n const resp = await makeRequest(\n 'checkpoints',\n jsonInit('POST', request)\n );\n return handleResponse<ICheckpoint>(resp);\n }\n\n export async function deleteCheckpoint(\n namespace: string,\n name: string\n ): Promise<void> {\n const resp = await makeRequest(\n `checkpoints/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`,\n { method: 'DELETE' }\n );\n if (!resp.ok) {\n let detail = resp.statusText;\n try {\n const body = await resp.json();\n detail = body.message || body.error || JSON.stringify(body);\n } catch {\n // use statusText\n }\n throw new Error(detail);\n }\n }\n\n export async function updateCheckpoint(\n namespace: string,\n name: string,\n data: Record<string, any>\n ): Promise<ICheckpoint> {\n const resp = await makeRequest(\n `checkpoints/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`,\n jsonInit('PUT', data)\n );\n return handleResponse<ICheckpoint>(resp);\n }\n}\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { ICheckpoint, ICheckpointPanelProps } from './types';\nimport { CheckpointAPI } from './api';\n\nconst CHECKPOINT_REFRESH_INTERVAL = 3;\n\nfunction mapPhaseDisplay(phase: string): string {\n return phase === 'Completed' ? 'Ready' : 'Pending';\n}\n\nfunction PhaseIndicator({ phase }: { phase: string }): JSX.Element {\n const display = mapPhaseDisplay(phase);\n const cls = display.toLowerCase().replace(/\\s+/g, '-');\n return <span className={`kc-phase kc-phase-${cls}`}>{display}</span>;\n}\n\nfunction formatDate(iso: string): string {\n return new Date(iso).toLocaleString();\n}\n\nexport function CheckpointPanel(props: ICheckpointPanelProps): JSX.Element {\n const { namespace, kernelId, kernelSpecName, notebookName, onRestore } = props;\n\n const [checkpoints, setCheckpoints] = useState<ICheckpoint[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const [showCreateForm, setShowCreateForm] = useState(false);\n const [newName, setNewName] = useState('');\n const [creating, setCreating] = useState(false);\n\n const [restoring, setRestoring] = useState<string | null>(null);\n const [expandedDetail, setExpandedDetail] = useState<string | null>(null);\n const [detailData, setDetailData] = useState<ICheckpoint | null>(null);\n\n const [renamingName, setRenamingName] = useState<string | null>(null);\n const [renameValue, setRenameValue] = useState('');\n\n const [flash, setFlash] = useState<{\n type: 'success' | 'error';\n text: string;\n } | null>(null);\n\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [confirmRestore, setConfirmRestore] = useState<string | null>(null);\n\n /* ------------------------------------------------------------------ */\n /* Data fetching */\n /* ------------------------------------------------------------------ */\n\n const fetchCheckpoints = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await CheckpointAPI.listCheckpoints(namespace);\n setCheckpoints(result.items ?? []);\n } catch (err: any) {\n setError(err.message ?? 'Failed to load checkpoints');\n } finally {\n setLoading(false);\n }\n }, [namespace]);\n\n useEffect(() => {\n fetchCheckpoints();\n }, [fetchCheckpoints]);\n\n useEffect(() => {\n const id = setInterval(fetchCheckpoints, CHECKPOINT_REFRESH_INTERVAL * 1000);\n return () => clearInterval(id);\n }, [fetchCheckpoints]);\n\n /* ------------------------------------------------------------------ */\n /* Actions */\n /* ------------------------------------------------------------------ */\n\n const handleCreate = async () => {\n if (!newName.trim()) {\n return;\n }\n setCreating(true);\n setFlash(null);\n try {\n await CheckpointAPI.createCheckpoint({\n name: newName.trim(),\n namespace,\n kernelId,\n buildImage: false,\n metadata: {\n kernelId,\n kernelName: kernelSpecName,\n notebookName\n }\n });\n setNewName('');\n setShowCreateForm(false);\n setFlash({ type: 'success', text: 'Checkpoint created successfully.' });\n await fetchCheckpoints();\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to create checkpoint'\n });\n } finally {\n setCreating(false);\n }\n };\n\n const handleDelete = async (name: string) => {\n setFlash(null);\n setConfirmDelete(null);\n try {\n await CheckpointAPI.deleteCheckpoint(namespace, name);\n setFlash({ type: 'success', text: `Checkpoint \"${name}\" deleted.` });\n if (expandedDetail === name) {\n setExpandedDetail(null);\n setDetailData(null);\n }\n await fetchCheckpoints();\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to delete checkpoint'\n });\n }\n };\n\n const handleViewStatus = async (name: string) => {\n if (expandedDetail === name) {\n setExpandedDetail(null);\n setDetailData(null);\n return;\n }\n try {\n const detail = await CheckpointAPI.getCheckpoint(namespace, name);\n setDetailData(detail);\n setExpandedDetail(name);\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to get checkpoint details'\n });\n }\n };\n\n const handleRestore = async (checkpointName: string) => {\n setConfirmRestore(null);\n setRestoring(checkpointName);\n setFlash(null);\n try {\n const detail = await CheckpointAPI.getCheckpoint(namespace, checkpointName);\n const checkpointFile = detail.checkpointFiles?.[0];\n if (!checkpointFile?.storagePath) {\n throw new Error('No checkpoint file path available for this checkpoint');\n }\n const cpKernelId = detail.metadata?.kernelId ?? '';\n if (!cpKernelId) {\n throw new Error('No kernel ID found in checkpoint metadata');\n }\n await onRestore(checkpointName, checkpointFile.storagePath, checkpointFile.containerName, cpKernelId);\n setFlash({\n type: 'success',\n text: `Kernel restored from \"${checkpointName}\". The kernel is restarting.`\n });\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to restore checkpoint'\n });\n } finally {\n setRestoring(null);\n }\n };\n\n const handleRename = async (oldName: string) => {\n const trimmed = renameValue.trim();\n if (!trimmed || trimmed === oldName) {\n setRenamingName(null);\n return;\n }\n setFlash(null);\n try {\n await CheckpointAPI.updateCheckpoint(namespace, oldName, {\n name: trimmed\n });\n setRenamingName(null);\n setFlash({ type: 'success', text: `Checkpoint renamed to \"${trimmed}\".` });\n await fetchCheckpoints();\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to rename checkpoint'\n });\n }\n };\n\n /* ------------------------------------------------------------------ */\n /* Render */\n /* ------------------------------------------------------------------ */\n\n return (\n <div className=\"kc-panel\">\n {/* Flash message */}\n {flash && (\n <div className={`kc-flash kc-flash-${flash.type}`}>\n <span>{flash.text}</span>\n <button\n className=\"kc-flash-close\"\n onClick={() => setFlash(null)}\n >\n &times;\n </button>\n </div>\n )}\n\n {/* Create checkpoint */}\n <div className=\"kc-create-section\">\n {!showCreateForm ? (\n <button\n className=\"kc-btn kc-btn-primary\"\n onClick={() => setShowCreateForm(true)}\n >\n Save Kernel State\n </button>\n ) : (\n <div className=\"kc-create-form\">\n <input\n className=\"kc-input\"\n type=\"text\"\n placeholder=\"Enter checkpoint name…\"\n value={newName}\n onChange={e => setNewName(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleCreate();\n }\n }}\n autoFocus\n disabled={creating}\n />\n <button\n className=\"kc-btn kc-btn-primary\"\n disabled={creating || !newName.trim()}\n onClick={handleCreate}\n >\n {creating ? 'Saving…' : 'Save'}\n </button>\n <button\n className=\"kc-btn\"\n onClick={() => {\n setShowCreateForm(false);\n setNewName('');\n }}\n >\n Cancel\n </button>\n </div>\n )}\n </div>\n\n {/* Checkpoint list */}\n <div className=\"kc-list\">\n {loading && checkpoints.length === 0 ? (\n <div className=\"kc-placeholder\">Loading checkpoints…</div>\n ) : error ? (\n <div className=\"kc-placeholder kc-placeholder-error\">{error}</div>\n ) : checkpoints.length === 0 ? (\n <div className=\"kc-placeholder\">\n No checkpoints found. Click &ldquo;Save Kernel State&rdquo; to\n create one.\n </div>\n ) : (\n checkpoints.map(cp => (\n <div key={cp.name} className=\"kc-item\">\n {/* Header row */}\n <div className=\"kc-item-header\">\n <div className=\"kc-item-info\">\n {renamingName === cp.name ? (\n <div className=\"kc-rename-form\">\n <input\n className=\"kc-input kc-input-sm\"\n type=\"text\"\n value={renameValue}\n onChange={e => setRenameValue(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleRename(cp.name);\n }\n if (e.key === 'Escape') {\n setRenamingName(null);\n }\n }}\n autoFocus\n />\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => handleRename(cp.name)}\n >\n OK\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => setRenamingName(null)}\n >\n Cancel\n </button>\n </div>\n ) : (\n <span className=\"kc-item-name\" title={cp.name}>\n {cp.name}\n </span>\n )}\n <div className=\"kc-item-meta\">\n <PhaseIndicator phase={cp.phase} />\n <span className=\"kc-item-date\">\n {formatDate(cp.createdAt)}\n </span>\n </div>\n </div>\n\n <div className=\"kc-item-actions\">\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => handleViewStatus(cp.name)}\n >\n {expandedDetail === cp.name ? 'Hide' : 'Details'}\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => {\n setRenamingName(cp.name);\n setRenameValue(cp.name);\n }}\n >\n Rename\n </button>\n {confirmDelete === cp.name ? (\n <>\n <span className=\"kc-confirm-label\">Delete?</span>\n <button\n className=\"kc-btn kc-btn-xs kc-btn-danger\"\n onClick={() => handleDelete(cp.name)}\n >\n Yes\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => setConfirmDelete(null)}\n >\n No\n </button>\n </>\n ) : (\n <button\n className=\"kc-btn kc-btn-xs kc-btn-danger\"\n onClick={() => setConfirmDelete(cp.name)}\n >\n Delete\n </button>\n )}\n {confirmRestore === cp.name ? (\n <>\n <span className=\"kc-confirm-label\">Restore?</span>\n <button\n className=\"kc-btn kc-btn-xs kc-btn-restore\"\n onClick={() => handleRestore(cp.name)}\n >\n Yes\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => setConfirmRestore(null)}\n >\n No\n </button>\n </>\n ) : (\n <button\n className=\"kc-btn kc-btn-xs kc-btn-restore\"\n disabled={\n restoring !== null || cp.phase !== 'Completed'\n }\n title={\n cp.phase !== 'Completed'\n ? 'Checkpoint must be completed to restore'\n : 'Restore from this checkpoint'\n }\n onClick={() => setConfirmRestore(cp.name)}\n >\n {restoring === cp.name ? 'Restoring…' : 'Restore'}\n </button>\n )}\n </div>\n </div>\n\n {/* Expanded detail */}\n {expandedDetail === cp.name && detailData && (\n <div className=\"kc-detail\">\n <div className=\"kc-detail-row\">\n <span className=\"kc-detail-label\">Status</span>\n <span>{mapPhaseDisplay(detailData.phase)}</span>\n </div>\n <div className=\"kc-detail-row\">\n <span className=\"kc-detail-label\">Message</span>\n <span>{detailData.message}</span>\n </div>\n {detailData.podRef && (\n <div className=\"kc-detail-row\">\n <span className=\"kc-detail-label\">Pod</span>\n <span>{detailData.podRef.name}</span>\n </div>\n )}\n {detailData.checkpointFiles &&\n detailData.checkpointFiles.length > 0 && (\n <div className=\"kc-detail-section\">\n <span className=\"kc-detail-label\">\n Checkpoint Files\n </span>\n {detailData.checkpointFiles.map((f, i) => (\n <div key={i} className=\"kc-detail-file\">\n <span>{f.containerName}</span>\n <span className=\"kc-detail-time\">\n {formatDate(f.checkpointTime)}\n </span>\n </div>\n ))}\n </div>\n )}\n {detailData.builtImages &&\n detailData.builtImages.length > 0 && (\n <div className=\"kc-detail-section\">\n <span className=\"kc-detail-label\">Built Images</span>\n {detailData.builtImages.map((img, i) => (\n <div key={i} className=\"kc-detail-file\">\n <span className=\"kc-detail-image-name\">\n {img.imageName}\n </span>\n <span className=\"kc-detail-time\">\n {formatDate(img.buildTime)}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n ))\n )}\n </div>\n\n </div>\n );\n}\n","import {\n JupyterFrontEnd,\n JupyterFrontEndPlugin\n} from '@jupyterlab/application';\nimport { INotebookTracker, NotebookPanel } from '@jupyterlab/notebook';\nimport {\n Dialog,\n ReactWidget,\n showDialog,\n ToolbarButton\n} from '@jupyterlab/apputils';\nimport { URLExt } from '@jupyterlab/coreutils';\nimport { ServerConnection } from '@jupyterlab/services';\nimport React from 'react';\n\nimport { CheckpointPanel } from './checkpoint-panel';\nimport { CheckpointAPI } from './api';\nimport { ICheckpointPanelProps } from './types';\n\n/**\n * ReactWidget wrapper that hosts the CheckpointPanel React tree inside a\n * JupyterLab Dialog body.\n */\nclass CheckpointDialogBody extends ReactWidget {\n private _props: ICheckpointPanelProps;\n\n constructor(props: ICheckpointPanelProps) {\n super();\n this._props = props;\n this.addClass('kc-dialog-body');\n }\n\n protected render(): React.ReactElement {\n return React.createElement(CheckpointPanel, this._props);\n }\n}\n\nconst COMMAND_ID = 'kernel-checkpoint:open';\n\nconst plugin: JupyterFrontEndPlugin<void> = {\n id: 'kernel-checkpoint:plugin',\n description:\n 'An extension for saving and restoring kernel pod state with jupyter enterprise gateway',\n autoStart: true,\n requires: [INotebookTracker],\n activate: (app: JupyterFrontEnd, notebookTracker: INotebookTracker) => {\n console.log('JupyterLab extension kernel-checkpoint is activated!');\n\n app.commands.addCommand(COMMAND_ID, {\n label: 'Saving Points',\n caption: 'Manage kernel checkpoints',\n execute: async () => {\n const panel = notebookTracker.currentWidget;\n if (!panel) {\n return;\n }\n\n const sessionContext = panel.sessionContext;\n await sessionContext.ready;\n\n let config;\n try {\n config = await CheckpointAPI.getConfig();\n } catch (err) {\n await showDialog({\n title: 'Configuration Error',\n body: 'Failed to load checkpoint configuration. Ensure CHECKPOINT_API_URL is set.',\n buttons: [Dialog.okButton()]\n });\n return;\n }\n\n if (!config.namespace) {\n await showDialog({\n title: 'Configuration Error',\n body: 'Namespace not configured. Set CHECKPOINT_NAMESPACE environment variable or deploy in Kubernetes.',\n buttons: [Dialog.okButton()]\n });\n return;\n }\n\n const kernel = sessionContext.session?.kernel;\n if (!kernel) {\n await showDialog({\n title: 'No Kernel',\n body: 'No kernel is connected. Please start a kernel first.',\n buttons: [Dialog.okButton()]\n });\n return;\n }\n\n const kernelId = kernel.id;\n const kernelSpecName = kernel.name || 'python_kubernetes';\n const notebookName = panel.title.label || '';\n\n const onRestore = async (checkpointName: string, checkpointFilePath: string, containerName: string, cpKernelId: string): Promise<void> => {\n const settings = ServerConnection.makeSettings();\n const kernelUrl = URLExt.join(settings.baseUrl, 'api', 'kernels');\n\n const response = await ServerConnection.makeRequest(\n kernelUrl,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: kernelSpecName,\n env: {\n KERNEL_CHECKPOINT_NAME: checkpointName,\n KERNEL_CHECKPOINT_FILE_PATH: checkpointFilePath,\n KERNEL_CHECKPOINT_CONTAINER_NAME: containerName,\n KERNEL_ID: cpKernelId\n }\n })\n },\n settings\n );\n\n if (!response.ok) {\n const errText = await response.text();\n throw new Error(`Failed to create restored kernel: ${errText}`);\n }\n\n const kernelData = await response.json();\n await sessionContext.changeKernel({ id: kernelData.id });\n };\n\n const body = new CheckpointDialogBody({\n namespace: config.namespace,\n kernelId,\n kernelSpecName,\n notebookName,\n onRestore\n });\n\n await showDialog({\n title: 'Kernel Checkpoints',\n body,\n buttons: [Dialog.cancelButton({ label: 'Close' })]\n });\n\n body.dispose();\n }\n });\n\n // Inject a toolbar button into every notebook panel\n notebookTracker.widgetAdded.connect(\n (_sender: INotebookTracker, panel: NotebookPanel) => {\n const button = new ToolbarButton({\n label: 'Saving Points',\n tooltip: 'Open kernel checkpoint manager',\n onClick: () => {\n app.commands.execute(COMMAND_ID);\n }\n });\n panel.toolbar.insertItem(10, 'kernel-checkpoint', button);\n }\n );\n }\n};\n\nexport default plugin;\n"],"names":[],"sourceRoot":""}
@@ -130,7 +130,7 @@ __webpack_require__.d(exports, {
130
130
  /******/ // This function allow to reference async chunks
131
131
  /******/ __webpack_require__.u = (chunkId) => {
132
132
  /******/ // return url for filenames based on template
133
- /******/ return "" + chunkId + "." + {"lib_index_js":"bcb2d92b281a36765a67","style_index_js":"c3e72438ed03e9dee0fc"}[chunkId] + ".js";
133
+ /******/ return "" + chunkId + "." + {"lib_index_js":"3571ff1d8cbf7ea37b2e","style_index_js":"c3e72438ed03e9dee0fc"}[chunkId] + ".js";
134
134
  /******/ };
135
135
  /******/ })();
136
136
  /******/
@@ -248,7 +248,7 @@ __webpack_require__.d(exports, {
248
248
  /******/ var promises = [];
249
249
  /******/ switch(name) {
250
250
  /******/ case "default": {
251
- /******/ register("kernel-checkpoint", "0.1.2", () => (__webpack_require__.e("lib_index_js").then(() => (() => (__webpack_require__(/*! ./lib/index.js */ "./lib/index.js"))))));
251
+ /******/ register("kernel-checkpoint", "0.1.6", () => (__webpack_require__.e("lib_index_js").then(() => (() => (__webpack_require__(/*! ./lib/index.js */ "./lib/index.js"))))));
252
252
  /******/ }
253
253
  /******/ break;
254
254
  /******/ }
@@ -559,4 +559,4 @@ __webpack_require__.d(exports, {
559
559
  /******/
560
560
  /******/ })()
561
561
  ;
562
- //# sourceMappingURL=remoteEntry.ff55aa1cac6b05f762e9.js.map
562
+ //# sourceMappingURL=remoteEntry.900312eadd6aa5546ed7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"remoteEntry.ff55aa1cac6b05f762e9.js","mappings":";;;;;;;;;;;AAAA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC,E;;;;;;UCpCD;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;;;;;WClCA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF,E;;;;;WCRA;WACA;WACA;WACA,8BAA8B,8EAA8E;WAC5G,E;;;;;WCJA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC,I;;;;;WCPD,wF;;;;;WCAA;WACA;WACA;WACA;WACA,uBAAuB,4BAA4B;WACnD;WACA;WACA;WACA,iBAAiB,oBAAoB;WACrC;WACA,mGAAmG,YAAY;WAC/G;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,mEAAmE,iCAAiC;WACpG;WACA;WACA;WACA,E;;;;;WCxCA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;WCNA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,oJAAoJ;WACpJ;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,IAAI,aAAa;WACjB;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,E;;;;;WC7CA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,kC;;;;;WClBA;WACA;WACA,WAAW,4BAA4B,iBAAiB,EAAE,qEAAqE;WAC/H;WACA;WACA;WACA,qCAAqC,aAAa,EAAE,wDAAwD,2BAA2B,4BAA4B,2BAA2B,+CAA+C,mCAAmC;WAChR;WACA;WACA;WACA,qBAAqB,8BAA8B,SAAS,sDAAsD,gBAAgB,eAAe,KAAK,6DAA6D,SAAS,SAAS,QAAQ,eAAe,KAAK,eAAe,qGAAqG,WAAW,aAAa;WAC7Y;WACA;WACA;WACA,gBAAgB,8BAA8B,qBAAqB,YAAY,sBAAsB,SAAS,iDAAiD,6FAA6F,WAAW,uBAAuB,2BAA2B,wBAAwB,KAAK,oCAAoC,oBAAoB,wBAAwB,oBAAoB,SAAS,KAAK,yBAAyB,KAAK,gCAAgC,yBAAyB,QAAQ,eAAe,KAAK,eAAe,4DAA4D;WACtoB;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE,IAAI;WACN;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;;WAED;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM;WACN,KAAK,WAAW;WAChB;WACA,GAAG;WACH;WACA,C;;;;;WCzKA;;WAEA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA,iCAAiC;;WAEjC;WACA;WACA;WACA,KAAK;WACL,eAAe;WACf;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM,qBAAqB;WAC3B;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;WACA;WACA,4G;;;;;WCrFA,mC;;;;;UEAA;UACA;UACA;UACA","sources":["webpack://kernel-checkpoint/webpack/container-entry","webpack://kernel-checkpoint/webpack/bootstrap","webpack://kernel-checkpoint/webpack/runtime/compat get default export","webpack://kernel-checkpoint/webpack/runtime/define property getters","webpack://kernel-checkpoint/webpack/runtime/ensure chunk","webpack://kernel-checkpoint/webpack/runtime/get javascript chunk filename","webpack://kernel-checkpoint/webpack/runtime/global","webpack://kernel-checkpoint/webpack/runtime/hasOwnProperty shorthand","webpack://kernel-checkpoint/webpack/runtime/load script","webpack://kernel-checkpoint/webpack/runtime/make namespace object","webpack://kernel-checkpoint/webpack/runtime/sharing","webpack://kernel-checkpoint/webpack/runtime/publicPath","webpack://kernel-checkpoint/webpack/runtime/consumes","webpack://kernel-checkpoint/webpack/runtime/jsonp chunk loading","webpack://kernel-checkpoint/webpack/runtime/nonce","webpack://kernel-checkpoint/webpack/before-startup","webpack://kernel-checkpoint/webpack/startup","webpack://kernel-checkpoint/webpack/after-startup"],"sourcesContent":["var moduleMap = {\n\t\"./index\": () => {\n\t\treturn __webpack_require__.e(\"lib_index_js\").then(() => (() => ((__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\")))));\n\t},\n\t\"./extension\": () => {\n\t\treturn __webpack_require__.e(\"lib_index_js\").then(() => (() => ((__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\")))));\n\t},\n\t\"./style\": () => {\n\t\treturn __webpack_require__.e(\"style_index_js\").then(() => (() => ((__webpack_require__(/*! ./style/index.js */ \"./style/index.js\")))));\n\t}\n};\nvar get = (module, getScope) => {\n\t__webpack_require__.R = getScope;\n\tgetScope = (\n\t\t__webpack_require__.o(moduleMap, module)\n\t\t\t? moduleMap[module]()\n\t\t\t: Promise.resolve().then(() => {\n\t\t\t\tthrow new Error('Module \"' + module + '\" does not exist in container.');\n\t\t\t})\n\t);\n\t__webpack_require__.R = undefined;\n\treturn getScope;\n};\nvar init = (shareScope, initScope) => {\n\tif (!__webpack_require__.S) return;\n\tvar name = \"default\"\n\tvar oldScope = __webpack_require__.S[name];\n\tif(oldScope && oldScope !== shareScope) throw new Error(\"Container initialization failed as it has already been initialized with a different share scope\");\n\t__webpack_require__.S[name] = shareScope;\n\treturn __webpack_require__.I(name, initScope);\n};\n\n// This exports getters to disallow modifications\n__webpack_require__.d(exports, {\n\tget: () => (get),\n\tinit: () => (init)\n});","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\tif (!(moduleId in __webpack_modules__)) {\n\t\tdelete __webpack_module_cache__[moduleId];\n\t\tvar e = new Error(\"Cannot find module '\" + moduleId + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// expose the module cache\n__webpack_require__.c = __webpack_module_cache__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"lib_index_js\":\"bcb2d92b281a36765a67\",\"style_index_js\":\"c3e72438ed03e9dee0fc\"}[chunkId] + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"kernel-checkpoint:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.S = {};\nvar initPromises = {};\nvar initTokens = {};\n__webpack_require__.I = (name, initScope) => {\n\tif(!initScope) initScope = [];\n\t// handling circular init calls\n\tvar initToken = initTokens[name];\n\tif(!initToken) initToken = initTokens[name] = {};\n\tif(initScope.indexOf(initToken) >= 0) return;\n\tinitScope.push(initToken);\n\t// only runs once\n\tif(initPromises[name]) return initPromises[name];\n\t// creates a new share scope if needed\n\tif(!__webpack_require__.o(__webpack_require__.S, name)) __webpack_require__.S[name] = {};\n\t// runs all init snippets from all modules reachable\n\tvar scope = __webpack_require__.S[name];\n\tvar warn = (msg) => {\n\t\tif (typeof console !== \"undefined\" && console.warn) console.warn(msg);\n\t};\n\tvar uniqueName = \"kernel-checkpoint\";\n\tvar register = (name, version, factory, eager) => {\n\t\tvar versions = scope[name] = scope[name] || {};\n\t\tvar activeVersion = versions[version];\n\t\tif(!activeVersion || (!activeVersion.loaded && (!eager != !activeVersion.eager ? eager : uniqueName > activeVersion.from))) versions[version] = { get: factory, from: uniqueName, eager: !!eager };\n\t};\n\tvar initExternal = (id) => {\n\t\tvar handleError = (err) => (warn(\"Initialization of sharing external failed: \" + err));\n\t\ttry {\n\t\t\tvar module = __webpack_require__(id);\n\t\t\tif(!module) return;\n\t\t\tvar initFn = (module) => (module && module.init && module.init(__webpack_require__.S[name], initScope))\n\t\t\tif(module.then) return promises.push(module.then(initFn, handleError));\n\t\t\tvar initResult = initFn(module);\n\t\t\tif(initResult && initResult.then) return promises.push(initResult['catch'](handleError));\n\t\t} catch(err) { handleError(err); }\n\t}\n\tvar promises = [];\n\tswitch(name) {\n\t\tcase \"default\": {\n\t\t\tregister(\"kernel-checkpoint\", \"0.1.2\", () => (__webpack_require__.e(\"lib_index_js\").then(() => (() => (__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\"))))));\n\t\t}\n\t\tbreak;\n\t}\n\tif(!promises.length) return initPromises[name] = 1;\n\treturn initPromises[name] = Promise.all(promises).then(() => (initPromises[name] = 1));\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","var parseVersion = (str) => {\n\t// see webpack/lib/util/semver.js for original code\n\tvar p=p=>{return p.split(\".\").map(p=>{return+p==p?+p:p})},n=/^([^-+]+)?(?:-([^+]+))?(?:\\+(.+))?$/.exec(str),r=n[1]?p(n[1]):[];return n[2]&&(r.length++,r.push.apply(r,p(n[2]))),n[3]&&(r.push([]),r.push.apply(r,p(n[3]))),r;\n}\nvar versionLt = (a, b) => {\n\t// see webpack/lib/util/semver.js for original code\n\ta=parseVersion(a),b=parseVersion(b);for(var r=0;;){if(r>=a.length)return r<b.length&&\"u\"!=(typeof b[r])[0];var e=a[r],n=(typeof e)[0];if(r>=b.length)return\"u\"==n;var t=b[r],f=(typeof t)[0];if(n!=f)return\"o\"==n&&\"n\"==f||(\"s\"==f||\"u\"==n);if(\"o\"!=n&&\"u\"!=n&&e!=t)return e<t;r++}\n}\nvar rangeToString = (range) => {\n\t// see webpack/lib/util/semver.js for original code\n\tvar r=range[0],n=\"\";if(1===range.length)return\"*\";if(r+.5){n+=0==r?\">=\":-1==r?\"<\":1==r?\"^\":2==r?\"~\":r>0?\"=\":\"!=\";for(var e=1,a=1;a<range.length;a++){e--,n+=\"u\"==(typeof(t=range[a]))[0]?\"-\":(e>0?\".\":\"\")+(e=2,t)}return n}var g=[];for(a=1;a<range.length;a++){var t=range[a];g.push(0===t?\"not(\"+o()+\")\":1===t?\"(\"+o()+\" || \"+o()+\")\":2===t?g.pop()+\" \"+g.pop():rangeToString(t))}return o();function o(){return g.pop().replace(/^\\((.+)\\)$/,\"$1\")}\n}\nvar satisfy = (range, version) => {\n\t// see webpack/lib/util/semver.js for original code\n\tif(0 in range){version=parseVersion(version);var e=range[0],r=e<0;r&&(e=-e-1);for(var n=0,i=1,a=!0;;i++,n++){var f,s,g=i<range.length?(typeof range[i])[0]:\"\";if(n>=version.length||\"o\"==(s=(typeof(f=version[n]))[0]))return!a||(\"u\"==g?i>e&&!r:\"\"==g!=r);if(\"u\"==s){if(!a||\"u\"!=g)return!1}else if(a)if(g==s)if(i<=e){if(f!=range[i])return!1}else{if(r?f>range[i]:f<range[i])return!1;f!=range[i]&&(a=!1)}else if(\"s\"!=g&&\"n\"!=g){if(r||i<=e)return!1;a=!1,i--}else{if(i<=e||s<g!=r)return!1;a=!1}else\"s\"!=g&&\"n\"!=g&&(a=!1,i--)}}var t=[],o=t.pop.bind(t);for(n=1;n<range.length;n++){var u=range[n];t.push(1==u?o()|o():2==u?o()&o():u?satisfy(u,version):!o())}return!!o();\n}\nvar exists = (scope, key) => {\n\treturn scope && __webpack_require__.o(scope, key);\n}\nvar get = (entry) => {\n\tentry.loaded = 1;\n\treturn entry.get()\n};\nvar eagerOnly = (versions) => {\n\treturn Object.keys(versions).reduce((filtered, version) => {\n\t\t\tif (versions[version].eager) {\n\t\t\t\tfiltered[version] = versions[version];\n\t\t\t}\n\t\t\treturn filtered;\n\t}, {});\n};\nvar findLatestVersion = (scope, key, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\tvar key = Object.keys(versions).reduce((a, b) => {\n\t\treturn !a || versionLt(a, b) ? b : a;\n\t}, 0);\n\treturn key && versions[key];\n};\nvar findSatisfyingVersion = (scope, key, requiredVersion, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\tvar key = Object.keys(versions).reduce((a, b) => {\n\t\tif (!satisfy(requiredVersion, b)) return a;\n\t\treturn !a || versionLt(a, b) ? b : a;\n\t}, 0);\n\treturn key && versions[key]\n};\nvar findSingletonVersionKey = (scope, key, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\treturn Object.keys(versions).reduce((a, b) => {\n\t\treturn !a || (!versions[a].loaded && versionLt(a, b)) ? b : a;\n\t}, 0);\n};\nvar getInvalidSingletonVersionMessage = (scope, key, version, requiredVersion) => {\n\treturn \"Unsatisfied version \" + version + \" from \" + (version && scope[key][version].from) + \" of shared singleton module \" + key + \" (required \" + rangeToString(requiredVersion) + \")\"\n};\nvar getInvalidVersionMessage = (scope, scopeName, key, requiredVersion, eager) => {\n\tvar versions = scope[key];\n\treturn \"No satisfying version (\" + rangeToString(requiredVersion) + \")\" + (eager ? \" for eager consumption\" : \"\") + \" of shared module \" + key + \" found in shared scope \" + scopeName + \".\\n\" +\n\t\t\"Available versions: \" + Object.keys(versions).map((key) => {\n\t\treturn key + \" from \" + versions[key].from;\n\t}).join(\", \");\n};\nvar fail = (msg) => {\n\tthrow new Error(msg);\n}\nvar failAsNotExist = (scopeName, key) => {\n\treturn fail(\"Shared module \" + key + \" doesn't exist in shared scope \" + scopeName);\n}\nvar warn = /*#__PURE__*/ (msg) => {\n\tif (typeof console !== \"undefined\" && console.warn) console.warn(msg);\n};\nvar init = (fn) => (function(scopeName, key, eager, c, d) {\n\tvar promise = __webpack_require__.I(scopeName);\n\tif (promise && promise.then && !eager) {\n\t\treturn promise.then(fn.bind(fn, scopeName, __webpack_require__.S[scopeName], key, false, c, d));\n\t}\n\treturn fn(scopeName, __webpack_require__.S[scopeName], key, eager, c, d);\n});\n\nvar useFallback = (scopeName, key, fallback) => {\n\treturn fallback ? fallback() : failAsNotExist(scopeName, key);\n}\nvar load = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\treturn get(findLatestVersion(scope, key, eager));\n});\nvar loadVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager);\n\tif (satisfyingVersion) return get(satisfyingVersion);\n\twarn(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager))\n\treturn get(findLatestVersion(scope, key, eager));\n});\nvar loadStrictVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager);\n\tif (satisfyingVersion) return get(satisfyingVersion);\n\tif (fallback) return fallback();\n\tfail(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager));\n});\nvar loadSingleton = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\treturn get(scope[key][version]);\n});\nvar loadSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\tif (!satisfy(requiredVersion, version)) {\n\t\twarn(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion));\n\t}\n\treturn get(scope[key][version]);\n});\nvar loadStrictSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\tif (!satisfy(requiredVersion, version)) {\n\t\tfail(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion));\n\t}\n\treturn get(scope[key][version]);\n});\nvar installedModules = {};\nvar moduleToHandlerMapping = {\n\t\"webpack/sharing/consume/default/@jupyterlab/notebook\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/notebook\", false, [1,4,3,6])),\n\t\"webpack/sharing/consume/default/@jupyterlab/apputils\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/apputils\", false, [1,4,4,6])),\n\t\"webpack/sharing/consume/default/@jupyterlab/coreutils\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/coreutils\", false, [1,6,3,6])),\n\t\"webpack/sharing/consume/default/@jupyterlab/services\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/services\", false, [1,7,3,6])),\n\t\"webpack/sharing/consume/default/react\": () => (loadSingletonVersion(\"default\", \"react\", false, [1,18,2,0]))\n};\n// no consumes in initial chunks\nvar chunkMapping = {\n\t\"lib_index_js\": [\n\t\t\"webpack/sharing/consume/default/@jupyterlab/notebook\",\n\t\t\"webpack/sharing/consume/default/@jupyterlab/apputils\",\n\t\t\"webpack/sharing/consume/default/@jupyterlab/coreutils\",\n\t\t\"webpack/sharing/consume/default/@jupyterlab/services\",\n\t\t\"webpack/sharing/consume/default/react\"\n\t]\n};\nvar startedInstallModules = {};\n__webpack_require__.f.consumes = (chunkId, promises) => {\n\tif(__webpack_require__.o(chunkMapping, chunkId)) {\n\t\tchunkMapping[chunkId].forEach((id) => {\n\t\t\tif(__webpack_require__.o(installedModules, id)) return promises.push(installedModules[id]);\n\t\t\tif(!startedInstallModules[id]) {\n\t\t\tvar onFactory = (factory) => {\n\t\t\t\tinstalledModules[id] = 0;\n\t\t\t\t__webpack_require__.m[id] = (module) => {\n\t\t\t\t\tdelete __webpack_require__.c[id];\n\t\t\t\t\tmodule.exports = factory();\n\t\t\t\t}\n\t\t\t};\n\t\t\tstartedInstallModules[id] = true;\n\t\t\tvar onError = (error) => {\n\t\t\t\tdelete installedModules[id];\n\t\t\t\t__webpack_require__.m[id] = (module) => {\n\t\t\t\t\tdelete __webpack_require__.c[id];\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tvar promise = moduleToHandlerMapping[id]();\n\t\t\t\tif(promise.then) {\n\t\t\t\t\tpromises.push(installedModules[id] = promise.then(onFactory)['catch'](onError));\n\t\t\t\t} else onFactory(promise);\n\t\t\t} catch(e) { onError(e); }\n\t\t\t}\n\t\t});\n\t}\n}","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"kernel-checkpoint\": 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkkernel_checkpoint\"] = self[\"webpackChunkkernel_checkpoint\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","","// module cache are used so entry inlining is disabled\n// startup\n// Load entry module and return exports\nvar __webpack_exports__ = __webpack_require__(\"webpack/container/entry/kernel-checkpoint\");\n",""],"names":[],"sourceRoot":""}
1
+ {"version":3,"file":"remoteEntry.900312eadd6aa5546ed7.js","mappings":";;;;;;;;;;;AAAA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC,E;;;;;;UCpCD;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;;;;;WClCA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF,E;;;;;WCRA;WACA;WACA;WACA,8BAA8B,8EAA8E;WAC5G,E;;;;;WCJA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC,I;;;;;WCPD,wF;;;;;WCAA;WACA;WACA;WACA;WACA,uBAAuB,4BAA4B;WACnD;WACA;WACA;WACA,iBAAiB,oBAAoB;WACrC;WACA,mGAAmG,YAAY;WAC/G;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,mEAAmE,iCAAiC;WACpG;WACA;WACA;WACA,E;;;;;WCxCA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;WCNA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,oJAAoJ;WACpJ;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,IAAI,aAAa;WACjB;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,E;;;;;WC7CA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,kC;;;;;WClBA;WACA;WACA,WAAW,4BAA4B,iBAAiB,EAAE,qEAAqE;WAC/H;WACA;WACA;WACA,qCAAqC,aAAa,EAAE,wDAAwD,2BAA2B,4BAA4B,2BAA2B,+CAA+C,mCAAmC;WAChR;WACA;WACA;WACA,qBAAqB,8BAA8B,SAAS,sDAAsD,gBAAgB,eAAe,KAAK,6DAA6D,SAAS,SAAS,QAAQ,eAAe,KAAK,eAAe,qGAAqG,WAAW,aAAa;WAC7Y;WACA;WACA;WACA,gBAAgB,8BAA8B,qBAAqB,YAAY,sBAAsB,SAAS,iDAAiD,6FAA6F,WAAW,uBAAuB,2BAA2B,wBAAwB,KAAK,oCAAoC,oBAAoB,wBAAwB,oBAAoB,SAAS,KAAK,yBAAyB,KAAK,gCAAgC,yBAAyB,QAAQ,eAAe,KAAK,eAAe,4DAA4D;WACtoB;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE,IAAI;WACN;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;;WAED;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA,CAAC;WACD;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM;WACN,KAAK,WAAW;WAChB;WACA,GAAG;WACH;WACA,C;;;;;WCzKA;;WAEA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA,iCAAiC;;WAEjC;WACA;WACA;WACA,KAAK;WACL,eAAe;WACf;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM,qBAAqB;WAC3B;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;WACA;WACA,4G;;;;;WCrFA,mC;;;;;UEAA;UACA;UACA;UACA","sources":["webpack://kernel-checkpoint/webpack/container-entry","webpack://kernel-checkpoint/webpack/bootstrap","webpack://kernel-checkpoint/webpack/runtime/compat get default export","webpack://kernel-checkpoint/webpack/runtime/define property getters","webpack://kernel-checkpoint/webpack/runtime/ensure chunk","webpack://kernel-checkpoint/webpack/runtime/get javascript chunk filename","webpack://kernel-checkpoint/webpack/runtime/global","webpack://kernel-checkpoint/webpack/runtime/hasOwnProperty shorthand","webpack://kernel-checkpoint/webpack/runtime/load script","webpack://kernel-checkpoint/webpack/runtime/make namespace object","webpack://kernel-checkpoint/webpack/runtime/sharing","webpack://kernel-checkpoint/webpack/runtime/publicPath","webpack://kernel-checkpoint/webpack/runtime/consumes","webpack://kernel-checkpoint/webpack/runtime/jsonp chunk loading","webpack://kernel-checkpoint/webpack/runtime/nonce","webpack://kernel-checkpoint/webpack/before-startup","webpack://kernel-checkpoint/webpack/startup","webpack://kernel-checkpoint/webpack/after-startup"],"sourcesContent":["var moduleMap = {\n\t\"./index\": () => {\n\t\treturn __webpack_require__.e(\"lib_index_js\").then(() => (() => ((__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\")))));\n\t},\n\t\"./extension\": () => {\n\t\treturn __webpack_require__.e(\"lib_index_js\").then(() => (() => ((__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\")))));\n\t},\n\t\"./style\": () => {\n\t\treturn __webpack_require__.e(\"style_index_js\").then(() => (() => ((__webpack_require__(/*! ./style/index.js */ \"./style/index.js\")))));\n\t}\n};\nvar get = (module, getScope) => {\n\t__webpack_require__.R = getScope;\n\tgetScope = (\n\t\t__webpack_require__.o(moduleMap, module)\n\t\t\t? moduleMap[module]()\n\t\t\t: Promise.resolve().then(() => {\n\t\t\t\tthrow new Error('Module \"' + module + '\" does not exist in container.');\n\t\t\t})\n\t);\n\t__webpack_require__.R = undefined;\n\treturn getScope;\n};\nvar init = (shareScope, initScope) => {\n\tif (!__webpack_require__.S) return;\n\tvar name = \"default\"\n\tvar oldScope = __webpack_require__.S[name];\n\tif(oldScope && oldScope !== shareScope) throw new Error(\"Container initialization failed as it has already been initialized with a different share scope\");\n\t__webpack_require__.S[name] = shareScope;\n\treturn __webpack_require__.I(name, initScope);\n};\n\n// This exports getters to disallow modifications\n__webpack_require__.d(exports, {\n\tget: () => (get),\n\tinit: () => (init)\n});","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\tif (!(moduleId in __webpack_modules__)) {\n\t\tdelete __webpack_module_cache__[moduleId];\n\t\tvar e = new Error(\"Cannot find module '\" + moduleId + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// expose the module cache\n__webpack_require__.c = __webpack_module_cache__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"lib_index_js\":\"3571ff1d8cbf7ea37b2e\",\"style_index_js\":\"c3e72438ed03e9dee0fc\"}[chunkId] + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"kernel-checkpoint:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.S = {};\nvar initPromises = {};\nvar initTokens = {};\n__webpack_require__.I = (name, initScope) => {\n\tif(!initScope) initScope = [];\n\t// handling circular init calls\n\tvar initToken = initTokens[name];\n\tif(!initToken) initToken = initTokens[name] = {};\n\tif(initScope.indexOf(initToken) >= 0) return;\n\tinitScope.push(initToken);\n\t// only runs once\n\tif(initPromises[name]) return initPromises[name];\n\t// creates a new share scope if needed\n\tif(!__webpack_require__.o(__webpack_require__.S, name)) __webpack_require__.S[name] = {};\n\t// runs all init snippets from all modules reachable\n\tvar scope = __webpack_require__.S[name];\n\tvar warn = (msg) => {\n\t\tif (typeof console !== \"undefined\" && console.warn) console.warn(msg);\n\t};\n\tvar uniqueName = \"kernel-checkpoint\";\n\tvar register = (name, version, factory, eager) => {\n\t\tvar versions = scope[name] = scope[name] || {};\n\t\tvar activeVersion = versions[version];\n\t\tif(!activeVersion || (!activeVersion.loaded && (!eager != !activeVersion.eager ? eager : uniqueName > activeVersion.from))) versions[version] = { get: factory, from: uniqueName, eager: !!eager };\n\t};\n\tvar initExternal = (id) => {\n\t\tvar handleError = (err) => (warn(\"Initialization of sharing external failed: \" + err));\n\t\ttry {\n\t\t\tvar module = __webpack_require__(id);\n\t\t\tif(!module) return;\n\t\t\tvar initFn = (module) => (module && module.init && module.init(__webpack_require__.S[name], initScope))\n\t\t\tif(module.then) return promises.push(module.then(initFn, handleError));\n\t\t\tvar initResult = initFn(module);\n\t\t\tif(initResult && initResult.then) return promises.push(initResult['catch'](handleError));\n\t\t} catch(err) { handleError(err); }\n\t}\n\tvar promises = [];\n\tswitch(name) {\n\t\tcase \"default\": {\n\t\t\tregister(\"kernel-checkpoint\", \"0.1.6\", () => (__webpack_require__.e(\"lib_index_js\").then(() => (() => (__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\"))))));\n\t\t}\n\t\tbreak;\n\t}\n\tif(!promises.length) return initPromises[name] = 1;\n\treturn initPromises[name] = Promise.all(promises).then(() => (initPromises[name] = 1));\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","var parseVersion = (str) => {\n\t// see webpack/lib/util/semver.js for original code\n\tvar p=p=>{return p.split(\".\").map(p=>{return+p==p?+p:p})},n=/^([^-+]+)?(?:-([^+]+))?(?:\\+(.+))?$/.exec(str),r=n[1]?p(n[1]):[];return n[2]&&(r.length++,r.push.apply(r,p(n[2]))),n[3]&&(r.push([]),r.push.apply(r,p(n[3]))),r;\n}\nvar versionLt = (a, b) => {\n\t// see webpack/lib/util/semver.js for original code\n\ta=parseVersion(a),b=parseVersion(b);for(var r=0;;){if(r>=a.length)return r<b.length&&\"u\"!=(typeof b[r])[0];var e=a[r],n=(typeof e)[0];if(r>=b.length)return\"u\"==n;var t=b[r],f=(typeof t)[0];if(n!=f)return\"o\"==n&&\"n\"==f||(\"s\"==f||\"u\"==n);if(\"o\"!=n&&\"u\"!=n&&e!=t)return e<t;r++}\n}\nvar rangeToString = (range) => {\n\t// see webpack/lib/util/semver.js for original code\n\tvar r=range[0],n=\"\";if(1===range.length)return\"*\";if(r+.5){n+=0==r?\">=\":-1==r?\"<\":1==r?\"^\":2==r?\"~\":r>0?\"=\":\"!=\";for(var e=1,a=1;a<range.length;a++){e--,n+=\"u\"==(typeof(t=range[a]))[0]?\"-\":(e>0?\".\":\"\")+(e=2,t)}return n}var g=[];for(a=1;a<range.length;a++){var t=range[a];g.push(0===t?\"not(\"+o()+\")\":1===t?\"(\"+o()+\" || \"+o()+\")\":2===t?g.pop()+\" \"+g.pop():rangeToString(t))}return o();function o(){return g.pop().replace(/^\\((.+)\\)$/,\"$1\")}\n}\nvar satisfy = (range, version) => {\n\t// see webpack/lib/util/semver.js for original code\n\tif(0 in range){version=parseVersion(version);var e=range[0],r=e<0;r&&(e=-e-1);for(var n=0,i=1,a=!0;;i++,n++){var f,s,g=i<range.length?(typeof range[i])[0]:\"\";if(n>=version.length||\"o\"==(s=(typeof(f=version[n]))[0]))return!a||(\"u\"==g?i>e&&!r:\"\"==g!=r);if(\"u\"==s){if(!a||\"u\"!=g)return!1}else if(a)if(g==s)if(i<=e){if(f!=range[i])return!1}else{if(r?f>range[i]:f<range[i])return!1;f!=range[i]&&(a=!1)}else if(\"s\"!=g&&\"n\"!=g){if(r||i<=e)return!1;a=!1,i--}else{if(i<=e||s<g!=r)return!1;a=!1}else\"s\"!=g&&\"n\"!=g&&(a=!1,i--)}}var t=[],o=t.pop.bind(t);for(n=1;n<range.length;n++){var u=range[n];t.push(1==u?o()|o():2==u?o()&o():u?satisfy(u,version):!o())}return!!o();\n}\nvar exists = (scope, key) => {\n\treturn scope && __webpack_require__.o(scope, key);\n}\nvar get = (entry) => {\n\tentry.loaded = 1;\n\treturn entry.get()\n};\nvar eagerOnly = (versions) => {\n\treturn Object.keys(versions).reduce((filtered, version) => {\n\t\t\tif (versions[version].eager) {\n\t\t\t\tfiltered[version] = versions[version];\n\t\t\t}\n\t\t\treturn filtered;\n\t}, {});\n};\nvar findLatestVersion = (scope, key, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\tvar key = Object.keys(versions).reduce((a, b) => {\n\t\treturn !a || versionLt(a, b) ? b : a;\n\t}, 0);\n\treturn key && versions[key];\n};\nvar findSatisfyingVersion = (scope, key, requiredVersion, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\tvar key = Object.keys(versions).reduce((a, b) => {\n\t\tif (!satisfy(requiredVersion, b)) return a;\n\t\treturn !a || versionLt(a, b) ? b : a;\n\t}, 0);\n\treturn key && versions[key]\n};\nvar findSingletonVersionKey = (scope, key, eager) => {\n\tvar versions = eager ? eagerOnly(scope[key]) : scope[key];\n\treturn Object.keys(versions).reduce((a, b) => {\n\t\treturn !a || (!versions[a].loaded && versionLt(a, b)) ? b : a;\n\t}, 0);\n};\nvar getInvalidSingletonVersionMessage = (scope, key, version, requiredVersion) => {\n\treturn \"Unsatisfied version \" + version + \" from \" + (version && scope[key][version].from) + \" of shared singleton module \" + key + \" (required \" + rangeToString(requiredVersion) + \")\"\n};\nvar getInvalidVersionMessage = (scope, scopeName, key, requiredVersion, eager) => {\n\tvar versions = scope[key];\n\treturn \"No satisfying version (\" + rangeToString(requiredVersion) + \")\" + (eager ? \" for eager consumption\" : \"\") + \" of shared module \" + key + \" found in shared scope \" + scopeName + \".\\n\" +\n\t\t\"Available versions: \" + Object.keys(versions).map((key) => {\n\t\treturn key + \" from \" + versions[key].from;\n\t}).join(\", \");\n};\nvar fail = (msg) => {\n\tthrow new Error(msg);\n}\nvar failAsNotExist = (scopeName, key) => {\n\treturn fail(\"Shared module \" + key + \" doesn't exist in shared scope \" + scopeName);\n}\nvar warn = /*#__PURE__*/ (msg) => {\n\tif (typeof console !== \"undefined\" && console.warn) console.warn(msg);\n};\nvar init = (fn) => (function(scopeName, key, eager, c, d) {\n\tvar promise = __webpack_require__.I(scopeName);\n\tif (promise && promise.then && !eager) {\n\t\treturn promise.then(fn.bind(fn, scopeName, __webpack_require__.S[scopeName], key, false, c, d));\n\t}\n\treturn fn(scopeName, __webpack_require__.S[scopeName], key, eager, c, d);\n});\n\nvar useFallback = (scopeName, key, fallback) => {\n\treturn fallback ? fallback() : failAsNotExist(scopeName, key);\n}\nvar load = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\treturn get(findLatestVersion(scope, key, eager));\n});\nvar loadVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager);\n\tif (satisfyingVersion) return get(satisfyingVersion);\n\twarn(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager))\n\treturn get(findLatestVersion(scope, key, eager));\n});\nvar loadStrictVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager);\n\tif (satisfyingVersion) return get(satisfyingVersion);\n\tif (fallback) return fallback();\n\tfail(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager));\n});\nvar loadSingleton = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\treturn get(scope[key][version]);\n});\nvar loadSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\tif (!satisfy(requiredVersion, version)) {\n\t\twarn(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion));\n\t}\n\treturn get(scope[key][version]);\n});\nvar loadStrictSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => {\n\tif (!exists(scope, key)) return useFallback(scopeName, key, fallback);\n\tvar version = findSingletonVersionKey(scope, key, eager);\n\tif (!satisfy(requiredVersion, version)) {\n\t\tfail(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion));\n\t}\n\treturn get(scope[key][version]);\n});\nvar installedModules = {};\nvar moduleToHandlerMapping = {\n\t\"webpack/sharing/consume/default/@jupyterlab/notebook\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/notebook\", false, [1,4,3,6])),\n\t\"webpack/sharing/consume/default/@jupyterlab/apputils\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/apputils\", false, [1,4,4,6])),\n\t\"webpack/sharing/consume/default/@jupyterlab/coreutils\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/coreutils\", false, [1,6,3,6])),\n\t\"webpack/sharing/consume/default/@jupyterlab/services\": () => (loadSingletonVersion(\"default\", \"@jupyterlab/services\", false, [1,7,3,6])),\n\t\"webpack/sharing/consume/default/react\": () => (loadSingletonVersion(\"default\", \"react\", false, [1,18,2,0]))\n};\n// no consumes in initial chunks\nvar chunkMapping = {\n\t\"lib_index_js\": [\n\t\t\"webpack/sharing/consume/default/@jupyterlab/notebook\",\n\t\t\"webpack/sharing/consume/default/@jupyterlab/apputils\",\n\t\t\"webpack/sharing/consume/default/@jupyterlab/coreutils\",\n\t\t\"webpack/sharing/consume/default/@jupyterlab/services\",\n\t\t\"webpack/sharing/consume/default/react\"\n\t]\n};\nvar startedInstallModules = {};\n__webpack_require__.f.consumes = (chunkId, promises) => {\n\tif(__webpack_require__.o(chunkMapping, chunkId)) {\n\t\tchunkMapping[chunkId].forEach((id) => {\n\t\t\tif(__webpack_require__.o(installedModules, id)) return promises.push(installedModules[id]);\n\t\t\tif(!startedInstallModules[id]) {\n\t\t\tvar onFactory = (factory) => {\n\t\t\t\tinstalledModules[id] = 0;\n\t\t\t\t__webpack_require__.m[id] = (module) => {\n\t\t\t\t\tdelete __webpack_require__.c[id];\n\t\t\t\t\tmodule.exports = factory();\n\t\t\t\t}\n\t\t\t};\n\t\t\tstartedInstallModules[id] = true;\n\t\t\tvar onError = (error) => {\n\t\t\t\tdelete installedModules[id];\n\t\t\t\t__webpack_require__.m[id] = (module) => {\n\t\t\t\t\tdelete __webpack_require__.c[id];\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tvar promise = moduleToHandlerMapping[id]();\n\t\t\t\tif(promise.then) {\n\t\t\t\t\tpromises.push(installedModules[id] = promise.then(onFactory)['catch'](onError));\n\t\t\t\t} else onFactory(promise);\n\t\t\t} catch(e) { onError(e); }\n\t\t\t}\n\t\t});\n\t}\n}","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"kernel-checkpoint\": 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkkernel_checkpoint\"] = self[\"webpackChunkkernel_checkpoint\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","","// module cache are used so entry inlining is disabled\n// startup\n// Load entry module and return exports\nvar __webpack_exports__ = __webpack_require__(\"webpack/container/entry/kernel-checkpoint\");\n",""],"names":[],"sourceRoot":""}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kernel-checkpoint",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "An extension for saving and restoring kernel pod state with jupyter enterprise gateway",
5
5
  "keywords": [
6
6
  "jupyter",
@@ -19,7 +19,7 @@ function formatDate(iso: string): string {
19
19
  }
20
20
 
21
21
  export function CheckpointPanel(props: ICheckpointPanelProps): JSX.Element {
22
- const { namespace, kernelId, onRestore } = props;
22
+ const { namespace, kernelId, kernelSpecName, notebookName, onRestore } = props;
23
23
 
24
24
  const [checkpoints, setCheckpoints] = useState<ICheckpoint[]>([]);
25
25
  const [loading, setLoading] = useState(true);
@@ -85,7 +85,12 @@ export function CheckpointPanel(props: ICheckpointPanelProps): JSX.Element {
85
85
  name: newName.trim(),
86
86
  namespace,
87
87
  kernelId,
88
- buildImage: false
88
+ buildImage: false,
89
+ metadata: {
90
+ kernelId,
91
+ kernelName: kernelSpecName,
92
+ notebookName
93
+ }
89
94
  });
90
95
  setNewName('');
91
96
  setShowCreateForm(false);
@@ -148,7 +153,11 @@ export function CheckpointPanel(props: ICheckpointPanelProps): JSX.Element {
148
153
  if (!checkpointFile?.storagePath) {
149
154
  throw new Error('No checkpoint file path available for this checkpoint');
150
155
  }
151
- await onRestore(checkpointName, checkpointFile.storagePath, checkpointFile.containerName);
156
+ const cpKernelId = detail.metadata?.kernelId ?? '';
157
+ if (!cpKernelId) {
158
+ throw new Error('No kernel ID found in checkpoint metadata');
159
+ }
160
+ await onRestore(checkpointName, checkpointFile.storagePath, checkpointFile.containerName, cpKernelId);
152
161
  setFlash({
153
162
  type: 'success',
154
163
  text: `Kernel restored from "${checkpointName}". The kernel is restarting.`
@@ -91,8 +91,9 @@ const plugin: JupyterFrontEndPlugin<void> = {
91
91
 
92
92
  const kernelId = kernel.id;
93
93
  const kernelSpecName = kernel.name || 'python_kubernetes';
94
+ const notebookName = panel.title.label || '';
94
95
 
95
- const onRestore = async (checkpointName: string, checkpointFilePath: string, containerName: string): Promise<void> => {
96
+ const onRestore = async (checkpointName: string, checkpointFilePath: string, containerName: string, cpKernelId: string): Promise<void> => {
96
97
  const settings = ServerConnection.makeSettings();
97
98
  const kernelUrl = URLExt.join(settings.baseUrl, 'api', 'kernels');
98
99
 
@@ -106,7 +107,8 @@ const plugin: JupyterFrontEndPlugin<void> = {
106
107
  env: {
107
108
  KERNEL_CHECKPOINT_NAME: checkpointName,
108
109
  KERNEL_CHECKPOINT_FILE_PATH: checkpointFilePath,
109
- KERNEL_CHECKPOINT_CONTAINER_NAME: containerName
110
+ KERNEL_CHECKPOINT_CONTAINER_NAME: containerName,
111
+ KERNEL_ID: cpKernelId
110
112
  }
111
113
  })
112
114
  },
@@ -126,6 +128,7 @@ const plugin: JupyterFrontEndPlugin<void> = {
126
128
  namespace: config.namespace,
127
129
  kernelId,
128
130
  kernelSpecName,
131
+ notebookName,
129
132
  onRestore
130
133
  });
131
134
 
@@ -24,6 +24,12 @@ export interface IResourceRef {
24
24
  namespace: string;
25
25
  }
26
26
 
27
+ export interface ICheckpointMetadata {
28
+ kernelId: string;
29
+ kernelName: string;
30
+ notebookName: string;
31
+ }
32
+
27
33
  export interface ICheckpoint {
28
34
  name: string;
29
35
  namespace: string;
@@ -31,6 +37,7 @@ export interface ICheckpoint {
31
37
  message: string;
32
38
  schedule: string;
33
39
  buildImage?: boolean;
40
+ metadata?: ICheckpointMetadata;
34
41
  podRef: IPodRef;
35
42
  resourceRef: IResourceRef;
36
43
  checkpointFiles?: ICheckpointFile[];
@@ -53,11 +60,13 @@ export interface ICreateCheckpointRequest {
53
60
  namespace: string;
54
61
  kernelId: string;
55
62
  buildImage: boolean;
63
+ metadata: ICheckpointMetadata;
56
64
  }
57
65
 
58
66
  export interface ICheckpointPanelProps {
59
67
  namespace: string;
60
68
  kernelId: string;
61
69
  kernelSpecName: string;
62
- onRestore: (checkpointName: string, checkpointFilePath: string, containerName: string) => Promise<void>;
70
+ notebookName: string;
71
+ onRestore: (checkpointName: string, checkpointFilePath: string, containerName: string, kernelId: string) => Promise<void>;
63
72
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"lib_index_js.bcb2d92b281a36765a67.js","mappings":"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","sources":["webpack://kernel-checkpoint/./src/api.ts","webpack://kernel-checkpoint/./src/checkpoint-panel.tsx","webpack://kernel-checkpoint/./src/index.ts"],"sourcesContent":["import { URLExt } from '@jupyterlab/coreutils';\nimport { ServerConnection } from '@jupyterlab/services';\nimport {\n ICheckpointConfig,\n ICheckpointListResponse,\n ICheckpoint,\n ICreateCheckpointRequest\n} from './types';\n\nconst API_NAMESPACE = 'kernel-checkpoint';\n\nfunction makeRequest(\n endpoint: string,\n init: RequestInit = {}\n): Promise<Response> {\n const settings = ServerConnection.makeSettings();\n const url = URLExt.join(settings.baseUrl, API_NAMESPACE, endpoint);\n return ServerConnection.makeRequest(url, init, settings);\n}\n\nfunction jsonInit(method: string, data: any): RequestInit {\n return {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data)\n };\n}\n\nasync function handleResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n let detail = response.statusText;\n try {\n const body = await response.json();\n detail = body.message || body.error || JSON.stringify(body);\n } catch {\n // use statusText\n }\n throw new Error(detail);\n }\n return response.json();\n}\n\nexport namespace CheckpointAPI {\n export async function getConfig(): Promise<ICheckpointConfig> {\n const resp = await makeRequest('config');\n return handleResponse<ICheckpointConfig>(resp);\n }\n\n export async function listCheckpoints(\n namespace: string\n ): Promise<ICheckpointListResponse> {\n const resp = await makeRequest(\n `checkpoints?namespace=${encodeURIComponent(namespace)}`\n );\n return handleResponse<ICheckpointListResponse>(resp);\n }\n\n export async function getCheckpoint(\n namespace: string,\n name: string\n ): Promise<ICheckpoint> {\n const resp = await makeRequest(\n `checkpoints/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`\n );\n return handleResponse<ICheckpoint>(resp);\n }\n\n export async function createCheckpoint(\n request: ICreateCheckpointRequest\n ): Promise<ICheckpoint> {\n const resp = await makeRequest(\n 'checkpoints',\n jsonInit('POST', request)\n );\n return handleResponse<ICheckpoint>(resp);\n }\n\n export async function deleteCheckpoint(\n namespace: string,\n name: string\n ): Promise<void> {\n const resp = await makeRequest(\n `checkpoints/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`,\n { method: 'DELETE' }\n );\n if (!resp.ok) {\n let detail = resp.statusText;\n try {\n const body = await resp.json();\n detail = body.message || body.error || JSON.stringify(body);\n } catch {\n // use statusText\n }\n throw new Error(detail);\n }\n }\n\n export async function updateCheckpoint(\n namespace: string,\n name: string,\n data: Record<string, any>\n ): Promise<ICheckpoint> {\n const resp = await makeRequest(\n `checkpoints/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`,\n jsonInit('PUT', data)\n );\n return handleResponse<ICheckpoint>(resp);\n }\n}\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { ICheckpoint, ICheckpointPanelProps } from './types';\nimport { CheckpointAPI } from './api';\n\nconst CHECKPOINT_REFRESH_INTERVAL = 3;\n\nfunction mapPhaseDisplay(phase: string): string {\n return phase === 'Completed' ? 'Ready' : 'Pending';\n}\n\nfunction PhaseIndicator({ phase }: { phase: string }): JSX.Element {\n const display = mapPhaseDisplay(phase);\n const cls = display.toLowerCase().replace(/\\s+/g, '-');\n return <span className={`kc-phase kc-phase-${cls}`}>{display}</span>;\n}\n\nfunction formatDate(iso: string): string {\n return new Date(iso).toLocaleString();\n}\n\nexport function CheckpointPanel(props: ICheckpointPanelProps): JSX.Element {\n const { namespace, kernelId, onRestore } = props;\n\n const [checkpoints, setCheckpoints] = useState<ICheckpoint[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const [showCreateForm, setShowCreateForm] = useState(false);\n const [newName, setNewName] = useState('');\n const [creating, setCreating] = useState(false);\n\n const [restoring, setRestoring] = useState<string | null>(null);\n const [expandedDetail, setExpandedDetail] = useState<string | null>(null);\n const [detailData, setDetailData] = useState<ICheckpoint | null>(null);\n\n const [renamingName, setRenamingName] = useState<string | null>(null);\n const [renameValue, setRenameValue] = useState('');\n\n const [flash, setFlash] = useState<{\n type: 'success' | 'error';\n text: string;\n } | null>(null);\n\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [confirmRestore, setConfirmRestore] = useState<string | null>(null);\n\n /* ------------------------------------------------------------------ */\n /* Data fetching */\n /* ------------------------------------------------------------------ */\n\n const fetchCheckpoints = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await CheckpointAPI.listCheckpoints(namespace);\n setCheckpoints(result.items ?? []);\n } catch (err: any) {\n setError(err.message ?? 'Failed to load checkpoints');\n } finally {\n setLoading(false);\n }\n }, [namespace]);\n\n useEffect(() => {\n fetchCheckpoints();\n }, [fetchCheckpoints]);\n\n useEffect(() => {\n const id = setInterval(fetchCheckpoints, CHECKPOINT_REFRESH_INTERVAL * 1000);\n return () => clearInterval(id);\n }, [fetchCheckpoints]);\n\n /* ------------------------------------------------------------------ */\n /* Actions */\n /* ------------------------------------------------------------------ */\n\n const handleCreate = async () => {\n if (!newName.trim()) {\n return;\n }\n setCreating(true);\n setFlash(null);\n try {\n await CheckpointAPI.createCheckpoint({\n name: newName.trim(),\n namespace,\n kernelId,\n buildImage: false\n });\n setNewName('');\n setShowCreateForm(false);\n setFlash({ type: 'success', text: 'Checkpoint created successfully.' });\n await fetchCheckpoints();\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to create checkpoint'\n });\n } finally {\n setCreating(false);\n }\n };\n\n const handleDelete = async (name: string) => {\n setFlash(null);\n setConfirmDelete(null);\n try {\n await CheckpointAPI.deleteCheckpoint(namespace, name);\n setFlash({ type: 'success', text: `Checkpoint \"${name}\" deleted.` });\n if (expandedDetail === name) {\n setExpandedDetail(null);\n setDetailData(null);\n }\n await fetchCheckpoints();\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to delete checkpoint'\n });\n }\n };\n\n const handleViewStatus = async (name: string) => {\n if (expandedDetail === name) {\n setExpandedDetail(null);\n setDetailData(null);\n return;\n }\n try {\n const detail = await CheckpointAPI.getCheckpoint(namespace, name);\n setDetailData(detail);\n setExpandedDetail(name);\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to get checkpoint details'\n });\n }\n };\n\n const handleRestore = async (checkpointName: string) => {\n setConfirmRestore(null);\n setRestoring(checkpointName);\n setFlash(null);\n try {\n const detail = await CheckpointAPI.getCheckpoint(namespace, checkpointName);\n const filePath = detail.checkpointFiles?.[0]?.filePath ?? '';\n if (!filePath) {\n throw new Error('No checkpoint file path available for this checkpoint');\n }\n await onRestore(checkpointName, filePath);\n setFlash({\n type: 'success',\n text: `Kernel restored from \"${checkpointName}\". The kernel is restarting.`\n });\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to restore checkpoint'\n });\n } finally {\n setRestoring(null);\n }\n };\n\n const handleRename = async (oldName: string) => {\n const trimmed = renameValue.trim();\n if (!trimmed || trimmed === oldName) {\n setRenamingName(null);\n return;\n }\n setFlash(null);\n try {\n await CheckpointAPI.updateCheckpoint(namespace, oldName, {\n name: trimmed\n });\n setRenamingName(null);\n setFlash({ type: 'success', text: `Checkpoint renamed to \"${trimmed}\".` });\n await fetchCheckpoints();\n } catch (err: any) {\n setFlash({\n type: 'error',\n text: err.message ?? 'Failed to rename checkpoint'\n });\n }\n };\n\n /* ------------------------------------------------------------------ */\n /* Render */\n /* ------------------------------------------------------------------ */\n\n return (\n <div className=\"kc-panel\">\n {/* Flash message */}\n {flash && (\n <div className={`kc-flash kc-flash-${flash.type}`}>\n <span>{flash.text}</span>\n <button\n className=\"kc-flash-close\"\n onClick={() => setFlash(null)}\n >\n &times;\n </button>\n </div>\n )}\n\n {/* Create checkpoint */}\n <div className=\"kc-create-section\">\n {!showCreateForm ? (\n <button\n className=\"kc-btn kc-btn-primary\"\n onClick={() => setShowCreateForm(true)}\n >\n Save Kernel State\n </button>\n ) : (\n <div className=\"kc-create-form\">\n <input\n className=\"kc-input\"\n type=\"text\"\n placeholder=\"Enter checkpoint name…\"\n value={newName}\n onChange={e => setNewName(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleCreate();\n }\n }}\n autoFocus\n disabled={creating}\n />\n <button\n className=\"kc-btn kc-btn-primary\"\n disabled={creating || !newName.trim()}\n onClick={handleCreate}\n >\n {creating ? 'Saving…' : 'Save'}\n </button>\n <button\n className=\"kc-btn\"\n onClick={() => {\n setShowCreateForm(false);\n setNewName('');\n }}\n >\n Cancel\n </button>\n </div>\n )}\n </div>\n\n {/* Checkpoint list */}\n <div className=\"kc-list\">\n {loading && checkpoints.length === 0 ? (\n <div className=\"kc-placeholder\">Loading checkpoints…</div>\n ) : error ? (\n <div className=\"kc-placeholder kc-placeholder-error\">{error}</div>\n ) : checkpoints.length === 0 ? (\n <div className=\"kc-placeholder\">\n No checkpoints found. Click &ldquo;Save Kernel State&rdquo; to\n create one.\n </div>\n ) : (\n checkpoints.map(cp => (\n <div key={cp.name} className=\"kc-item\">\n {/* Header row */}\n <div className=\"kc-item-header\">\n <div className=\"kc-item-info\">\n {renamingName === cp.name ? (\n <div className=\"kc-rename-form\">\n <input\n className=\"kc-input kc-input-sm\"\n type=\"text\"\n value={renameValue}\n onChange={e => setRenameValue(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleRename(cp.name);\n }\n if (e.key === 'Escape') {\n setRenamingName(null);\n }\n }}\n autoFocus\n />\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => handleRename(cp.name)}\n >\n OK\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => setRenamingName(null)}\n >\n Cancel\n </button>\n </div>\n ) : (\n <span className=\"kc-item-name\" title={cp.name}>\n {cp.name}\n </span>\n )}\n <div className=\"kc-item-meta\">\n <PhaseIndicator phase={cp.phase} />\n <span className=\"kc-item-date\">\n {formatDate(cp.createdAt)}\n </span>\n </div>\n </div>\n\n <div className=\"kc-item-actions\">\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => handleViewStatus(cp.name)}\n >\n {expandedDetail === cp.name ? 'Hide' : 'Details'}\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => {\n setRenamingName(cp.name);\n setRenameValue(cp.name);\n }}\n >\n Rename\n </button>\n {confirmDelete === cp.name ? (\n <>\n <span className=\"kc-confirm-label\">Delete?</span>\n <button\n className=\"kc-btn kc-btn-xs kc-btn-danger\"\n onClick={() => handleDelete(cp.name)}\n >\n Yes\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => setConfirmDelete(null)}\n >\n No\n </button>\n </>\n ) : (\n <button\n className=\"kc-btn kc-btn-xs kc-btn-danger\"\n onClick={() => setConfirmDelete(cp.name)}\n >\n Delete\n </button>\n )}\n {confirmRestore === cp.name ? (\n <>\n <span className=\"kc-confirm-label\">Restore?</span>\n <button\n className=\"kc-btn kc-btn-xs kc-btn-restore\"\n onClick={() => handleRestore(cp.name)}\n >\n Yes\n </button>\n <button\n className=\"kc-btn kc-btn-xs\"\n onClick={() => setConfirmRestore(null)}\n >\n No\n </button>\n </>\n ) : (\n <button\n className=\"kc-btn kc-btn-xs kc-btn-restore\"\n disabled={\n restoring !== null || cp.phase !== 'Completed'\n }\n title={\n cp.phase !== 'Completed'\n ? 'Checkpoint must be completed to restore'\n : 'Restore from this checkpoint'\n }\n onClick={() => setConfirmRestore(cp.name)}\n >\n {restoring === cp.name ? 'Restoring…' : 'Restore'}\n </button>\n )}\n </div>\n </div>\n\n {/* Expanded detail */}\n {expandedDetail === cp.name && detailData && (\n <div className=\"kc-detail\">\n <div className=\"kc-detail-row\">\n <span className=\"kc-detail-label\">Status</span>\n <span>{mapPhaseDisplay(detailData.phase)}</span>\n </div>\n <div className=\"kc-detail-row\">\n <span className=\"kc-detail-label\">Message</span>\n <span>{detailData.message}</span>\n </div>\n {detailData.podRef && (\n <div className=\"kc-detail-row\">\n <span className=\"kc-detail-label\">Pod</span>\n <span>{detailData.podRef.name}</span>\n </div>\n )}\n {detailData.checkpointFiles &&\n detailData.checkpointFiles.length > 0 && (\n <div className=\"kc-detail-section\">\n <span className=\"kc-detail-label\">\n Checkpoint Files\n </span>\n {detailData.checkpointFiles.map((f, i) => (\n <div key={i} className=\"kc-detail-file\">\n <span>{f.containerName}</span>\n <span className=\"kc-detail-time\">\n {formatDate(f.checkpointTime)}\n </span>\n </div>\n ))}\n </div>\n )}\n {detailData.builtImages &&\n detailData.builtImages.length > 0 && (\n <div className=\"kc-detail-section\">\n <span className=\"kc-detail-label\">Built Images</span>\n {detailData.builtImages.map((img, i) => (\n <div key={i} className=\"kc-detail-file\">\n <span className=\"kc-detail-image-name\">\n {img.imageName}\n </span>\n <span className=\"kc-detail-time\">\n {formatDate(img.buildTime)}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n ))\n )}\n </div>\n\n </div>\n );\n}\n","import {\n JupyterFrontEnd,\n JupyterFrontEndPlugin\n} from '@jupyterlab/application';\nimport { INotebookTracker, NotebookPanel } from '@jupyterlab/notebook';\nimport {\n Dialog,\n ReactWidget,\n showDialog,\n ToolbarButton\n} from '@jupyterlab/apputils';\nimport { URLExt } from '@jupyterlab/coreutils';\nimport { ServerConnection } from '@jupyterlab/services';\nimport React from 'react';\n\nimport { CheckpointPanel } from './checkpoint-panel';\nimport { CheckpointAPI } from './api';\nimport { ICheckpointPanelProps } from './types';\n\n/**\n * ReactWidget wrapper that hosts the CheckpointPanel React tree inside a\n * JupyterLab Dialog body.\n */\nclass CheckpointDialogBody extends ReactWidget {\n private _props: ICheckpointPanelProps;\n\n constructor(props: ICheckpointPanelProps) {\n super();\n this._props = props;\n this.addClass('kc-dialog-body');\n }\n\n protected render(): React.ReactElement {\n return React.createElement(CheckpointPanel, this._props);\n }\n}\n\nconst COMMAND_ID = 'kernel-checkpoint:open';\n\nconst plugin: JupyterFrontEndPlugin<void> = {\n id: 'kernel-checkpoint:plugin',\n description:\n 'An extension for saving and restoring kernel pod state with jupyter enterprise gateway',\n autoStart: true,\n requires: [INotebookTracker],\n activate: (app: JupyterFrontEnd, notebookTracker: INotebookTracker) => {\n console.log('JupyterLab extension kernel-checkpoint is activated!');\n\n app.commands.addCommand(COMMAND_ID, {\n label: 'Saving Points',\n caption: 'Manage kernel checkpoints',\n execute: async () => {\n const panel = notebookTracker.currentWidget;\n if (!panel) {\n return;\n }\n\n const sessionContext = panel.sessionContext;\n await sessionContext.ready;\n\n let config;\n try {\n config = await CheckpointAPI.getConfig();\n } catch (err) {\n await showDialog({\n title: 'Configuration Error',\n body: 'Failed to load checkpoint configuration. Ensure CHECKPOINT_API_URL is set.',\n buttons: [Dialog.okButton()]\n });\n return;\n }\n\n if (!config.namespace) {\n await showDialog({\n title: 'Configuration Error',\n body: 'Namespace not configured. Set CHECKPOINT_NAMESPACE environment variable or deploy in Kubernetes.',\n buttons: [Dialog.okButton()]\n });\n return;\n }\n\n const kernel = sessionContext.session?.kernel;\n if (!kernel) {\n await showDialog({\n title: 'No Kernel',\n body: 'No kernel is connected. Please start a kernel first.',\n buttons: [Dialog.okButton()]\n });\n return;\n }\n\n const kernelId = kernel.id;\n const kernelSpecName = kernel.name || 'python_kubernetes';\n\n const onRestore = async (checkpointName: string, checkpointFilePath: string): Promise<void> => {\n const settings = ServerConnection.makeSettings();\n const kernelUrl = URLExt.join(settings.baseUrl, 'api', 'kernels');\n\n const response = await ServerConnection.makeRequest(\n kernelUrl,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: kernelSpecName,\n env: {\n KERNEL_CHECKPOINT_NAME: checkpointName,\n KERNEL_CHECKPOINT_FILE_PATH: checkpointFilePath\n }\n })\n },\n settings\n );\n\n if (!response.ok) {\n const errText = await response.text();\n throw new Error(`Failed to create restored kernel: ${errText}`);\n }\n\n const kernelData = await response.json();\n await sessionContext.changeKernel({ id: kernelData.id });\n };\n\n const body = new CheckpointDialogBody({\n namespace: config.namespace,\n kernelId,\n kernelSpecName,\n onRestore\n });\n\n await showDialog({\n title: 'Kernel Checkpoints',\n body,\n buttons: [Dialog.cancelButton({ label: 'Close' })]\n });\n\n body.dispose();\n }\n });\n\n // Inject a toolbar button into every notebook panel\n notebookTracker.widgetAdded.connect(\n (_sender: INotebookTracker, panel: NotebookPanel) => {\n const button = new ToolbarButton({\n label: 'Saving Points',\n tooltip: 'Open kernel checkpoint manager',\n onClick: () => {\n app.commands.execute(COMMAND_ID);\n }\n });\n panel.toolbar.insertItem(10, 'kernel-checkpoint', button);\n }\n );\n }\n};\n\nexport default plugin;\n"],"names":[],"sourceRoot":""}
File without changes
File without changes