skypilot-nightly 1.0.0.dev20250603__py3-none-any.whl → 1.0.0.dev20250605__py3-none-any.whl

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 (142) hide show
  1. sky/__init__.py +3 -3
  2. sky/adaptors/kubernetes.py +8 -0
  3. sky/admin_policy.py +5 -0
  4. sky/backends/backend_utils.py +1 -0
  5. sky/backends/cloud_vm_ray_backend.py +8 -4
  6. sky/{clouds/service_catalog → catalog}/__init__.py +6 -17
  7. sky/{clouds/service_catalog → catalog}/aws_catalog.py +3 -3
  8. sky/{clouds/service_catalog → catalog}/azure_catalog.py +2 -2
  9. sky/{clouds/service_catalog → catalog}/common.py +2 -2
  10. sky/{clouds/service_catalog → catalog}/cudo_catalog.py +1 -1
  11. sky/{clouds/service_catalog → catalog}/data_fetchers/analyze.py +1 -1
  12. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_aws.py +1 -1
  13. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_vsphere.py +1 -1
  14. sky/{clouds/service_catalog → catalog}/do_catalog.py +1 -1
  15. sky/{clouds/service_catalog → catalog}/fluidstack_catalog.py +1 -1
  16. sky/{clouds/service_catalog → catalog}/gcp_catalog.py +2 -2
  17. sky/{clouds/service_catalog → catalog}/ibm_catalog.py +1 -1
  18. sky/{clouds/service_catalog → catalog}/kubernetes_catalog.py +2 -2
  19. sky/{clouds/service_catalog → catalog}/lambda_catalog.py +1 -1
  20. sky/{clouds/service_catalog → catalog}/nebius_catalog.py +1 -1
  21. sky/{clouds/service_catalog → catalog}/oci_catalog.py +1 -1
  22. sky/{clouds/service_catalog → catalog}/paperspace_catalog.py +1 -1
  23. sky/{clouds/service_catalog → catalog}/runpod_catalog.py +1 -1
  24. sky/{clouds/service_catalog → catalog}/scp_catalog.py +1 -1
  25. sky/{clouds/service_catalog → catalog}/ssh_catalog.py +3 -3
  26. sky/{clouds/service_catalog → catalog}/vast_catalog.py +1 -1
  27. sky/{clouds/service_catalog → catalog}/vsphere_catalog.py +1 -1
  28. sky/cli.py +16 -13
  29. sky/client/cli.py +16 -13
  30. sky/client/sdk.py +30 -12
  31. sky/clouds/aws.py +41 -40
  32. sky/clouds/azure.py +31 -34
  33. sky/clouds/cloud.py +8 -8
  34. sky/clouds/cudo.py +26 -26
  35. sky/clouds/do.py +24 -24
  36. sky/clouds/fluidstack.py +27 -29
  37. sky/clouds/gcp.py +42 -42
  38. sky/clouds/ibm.py +26 -26
  39. sky/clouds/kubernetes.py +24 -12
  40. sky/clouds/lambda_cloud.py +28 -30
  41. sky/clouds/nebius.py +26 -28
  42. sky/clouds/oci.py +32 -32
  43. sky/clouds/paperspace.py +24 -26
  44. sky/clouds/runpod.py +26 -28
  45. sky/clouds/scp.py +37 -36
  46. sky/clouds/utils/gcp_utils.py +3 -2
  47. sky/clouds/vast.py +27 -27
  48. sky/clouds/vsphere.py +12 -15
  49. sky/core.py +2 -2
  50. sky/dashboard/out/404.html +1 -1
  51. sky/dashboard/out/_next/static/chunks/614-635a84e87800f99e.js +66 -0
  52. sky/dashboard/out/_next/static/chunks/{856-f1b1f7f47edde2e8.js → 856-3a32da4b84176f6d.js} +1 -1
  53. sky/dashboard/out/_next/static/chunks/937.3759f538f11a0953.js +1 -0
  54. sky/dashboard/out/_next/static/chunks/pages/config-1a1eeb949dab8897.js +6 -0
  55. sky/dashboard/out/_next/static/chunks/pages/users-262aab38b9baaf3a.js +16 -0
  56. sky/dashboard/out/_next/static/chunks/pages/workspaces-384ea5fa0cea8f28.js +1 -0
  57. sky/dashboard/out/_next/static/chunks/{webpack-f27c9a32aa3d9c6d.js → webpack-65d465f948974c0d.js} +1 -1
  58. sky/dashboard/out/_next/static/css/667d941a2888ce6e.css +3 -0
  59. sky/dashboard/out/_next/static/qjhIe-yC6nHcLKBqpzO1M/_buildManifest.js +1 -0
  60. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  61. sky/dashboard/out/clusters/[cluster].html +1 -1
  62. sky/dashboard/out/clusters.html +1 -1
  63. sky/dashboard/out/config.html +1 -1
  64. sky/dashboard/out/index.html +1 -1
  65. sky/dashboard/out/infra/[context].html +1 -1
  66. sky/dashboard/out/infra.html +1 -1
  67. sky/dashboard/out/jobs/[job].html +1 -1
  68. sky/dashboard/out/jobs.html +1 -1
  69. sky/dashboard/out/users.html +1 -1
  70. sky/dashboard/out/workspace/new.html +1 -1
  71. sky/dashboard/out/workspaces/[name].html +1 -1
  72. sky/dashboard/out/workspaces.html +1 -1
  73. sky/data/storage_utils.py +5 -2
  74. sky/execution.py +44 -46
  75. sky/global_user_state.py +119 -86
  76. sky/jobs/client/sdk.py +4 -1
  77. sky/jobs/server/core.py +6 -2
  78. sky/models.py +1 -0
  79. sky/optimizer.py +1 -1
  80. sky/provision/cudo/cudo_machine_type.py +1 -1
  81. sky/provision/kubernetes/utils.py +35 -22
  82. sky/provision/vast/utils.py +1 -1
  83. sky/provision/vsphere/common/vim_utils.py +1 -2
  84. sky/provision/vsphere/instance.py +1 -1
  85. sky/provision/vsphere/vsphere_utils.py +7 -11
  86. sky/resources.py +24 -3
  87. sky/serve/server/core.py +1 -1
  88. sky/server/constants.py +3 -1
  89. sky/server/requests/executor.py +4 -1
  90. sky/server/requests/payloads.py +25 -0
  91. sky/server/requests/serializers/decoders.py +1 -1
  92. sky/server/server.py +33 -12
  93. sky/server/stream_utils.py +2 -38
  94. sky/setup_files/MANIFEST.in +1 -0
  95. sky/setup_files/dependencies.py +2 -0
  96. sky/skylet/constants.py +10 -4
  97. sky/skypilot_config.py +92 -39
  98. sky/templates/websocket_proxy.py +11 -1
  99. sky/usage/usage_lib.py +4 -3
  100. sky/users/__init__.py +0 -0
  101. sky/users/model.conf +15 -0
  102. sky/users/permission.py +178 -0
  103. sky/users/rbac.py +86 -0
  104. sky/users/server.py +66 -0
  105. sky/utils/accelerator_registry.py +3 -3
  106. sky/utils/kubernetes/deploy_remote_cluster.py +2 -1
  107. sky/utils/schemas.py +20 -10
  108. sky/workspaces/core.py +2 -2
  109. {skypilot_nightly-1.0.0.dev20250603.dist-info → skypilot_nightly-1.0.0.dev20250605.dist-info}/METADATA +3 -1
  110. {skypilot_nightly-1.0.0.dev20250603.dist-info → skypilot_nightly-1.0.0.dev20250605.dist-info}/RECORD +134 -130
  111. sky/clouds/service_catalog/constants.py +0 -8
  112. sky/dashboard/out/_next/static/chunks/614-3d29f98e0634b179.js +0 -66
  113. sky/dashboard/out/_next/static/chunks/937.f97f83652028e944.js +0 -1
  114. sky/dashboard/out/_next/static/chunks/pages/config-35383adcb0edb5e2.js +0 -6
  115. sky/dashboard/out/_next/static/chunks/pages/users-07b523ccb19317ad.js +0 -6
  116. sky/dashboard/out/_next/static/chunks/pages/workspaces-f54921ec9eb20965.js +0 -1
  117. sky/dashboard/out/_next/static/css/63d3995d8b528eb1.css +0 -3
  118. sky/dashboard/out/_next/static/zTAFq_Iv6_yxQj3fXvJWR/_buildManifest.js +0 -1
  119. /sky/{clouds/service_catalog → catalog}/config.py +0 -0
  120. /sky/{clouds/service_catalog → catalog}/data_fetchers/__init__.py +0 -0
  121. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_azure.py +0 -0
  122. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_cudo.py +0 -0
  123. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_fluidstack.py +0 -0
  124. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_gcp.py +0 -0
  125. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_ibm.py +0 -0
  126. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_lambda_cloud.py +0 -0
  127. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_vast.py +0 -0
  128. /sky/dashboard/out/_next/static/chunks/{121-8f55ee3fa6301784.js → 121-865d2bf8a3b84c6a.js} +0 -0
  129. /sky/dashboard/out/_next/static/chunks/{236-fef38aa6e5639300.js → 236-4c0dc6f63ccc6319.js} +0 -0
  130. /sky/dashboard/out/_next/static/chunks/{37-947904ccc5687bac.js → 37-beedd583fea84cc8.js} +0 -0
  131. /sky/dashboard/out/_next/static/chunks/{682-2be9b0f169727f2f.js → 682-6647f0417d5662f0.js} +0 -0
  132. /sky/dashboard/out/_next/static/chunks/{843-a097338acb89b7d7.js → 843-c296541442d4af88.js} +0 -0
  133. /sky/dashboard/out/_next/static/chunks/{969-d7b6fb7f602bfcb3.js → 969-c7abda31c10440ac.js} +0 -0
  134. /sky/dashboard/out/_next/static/chunks/pages/{_app-67925f5e6382e22f.js → _app-cb81dc4d27f4d009.js} +0 -0
  135. /sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/{[job]-158b70da336d8607.js → [job]-65d04d5d77cbb6b6.js} +0 -0
  136. /sky/dashboard/out/_next/static/chunks/pages/clusters/{[cluster]-62c9982dc3675725.js → [cluster]-beabbcd7606c1a23.js} +0 -0
  137. /sky/dashboard/out/_next/static/chunks/pages/jobs/{[job]-a62a3c65dc9bc57c.js → [job]-86c47edc500f15f9.js} +0 -0
  138. /sky/dashboard/out/_next/static/{zTAFq_Iv6_yxQj3fXvJWR → qjhIe-yC6nHcLKBqpzO1M}/_ssgManifest.js +0 -0
  139. {skypilot_nightly-1.0.0.dev20250603.dist-info → skypilot_nightly-1.0.0.dev20250605.dist-info}/WHEEL +0 -0
  140. {skypilot_nightly-1.0.0.dev20250603.dist-info → skypilot_nightly-1.0.0.dev20250605.dist-info}/entry_points.txt +0 -0
  141. {skypilot_nightly-1.0.0.dev20250603.dist-info → skypilot_nightly-1.0.0.dev20250605.dist-info}/licenses/LICENSE +0 -0
  142. {skypilot_nightly-1.0.0.dev20250603.dist-info → skypilot_nightly-1.0.0.dev20250605.dist-info}/top_level.txt +0 -0
sky/clouds/vast.py CHANGED
@@ -3,8 +3,8 @@
3
3
  import typing
4
4
  from typing import Dict, Iterator, List, Optional, Tuple, Union
5
5
 
6
+ from sky import catalog
6
7
  from sky import clouds
7
- from sky.clouds import service_catalog
8
8
  from sky.utils import registry
9
9
  from sky.utils import resources_utils
10
10
 
@@ -73,7 +73,7 @@ class Vast(clouds.Cloud):
73
73
  zone: Optional[str]) -> List[clouds.Region]:
74
74
  assert zone is None, 'Vast does not support zones.'
75
75
  del accelerators, zone # unused
76
- regions = service_catalog.get_region_zones_for_instance_type(
76
+ regions = catalog.get_region_zones_for_instance_type(
77
77
  instance_type, use_spot, 'vast')
78
78
 
79
79
  if region is not None:
@@ -85,8 +85,8 @@ class Vast(clouds.Cloud):
85
85
  cls,
86
86
  instance_type: str,
87
87
  ) -> Tuple[Optional[float], Optional[float]]:
88
- return service_catalog.get_vcpus_mem_from_instance_type(instance_type,
89
- clouds='vast')
88
+ return catalog.get_vcpus_mem_from_instance_type(instance_type,
89
+ clouds='vast')
90
90
 
91
91
  @classmethod
92
92
  def zones_provision_loop(
@@ -113,11 +113,11 @@ class Vast(clouds.Cloud):
113
113
  use_spot: bool,
114
114
  region: Optional[str] = None,
115
115
  zone: Optional[str] = None) -> float:
116
- return service_catalog.get_hourly_cost(instance_type,
117
- use_spot=use_spot,
118
- region=region,
119
- zone=zone,
120
- clouds='vast')
116
+ return catalog.get_hourly_cost(instance_type,
117
+ use_spot=use_spot,
118
+ region=region,
119
+ zone=zone,
120
+ clouds='vast')
121
121
 
122
122
  def accelerators_to_hourly_cost(self,
123
123
  accelerators: Dict[str, int],
@@ -139,16 +139,16 @@ class Vast(clouds.Cloud):
139
139
  disk_tier: Optional[resources_utils.DiskTier] = None
140
140
  ) -> Optional[str]:
141
141
  """Returns the default instance type for Vast."""
142
- return service_catalog.get_default_instance_type(cpus=cpus,
143
- memory=memory,
144
- disk_tier=disk_tier,
145
- clouds='vast')
142
+ return catalog.get_default_instance_type(cpus=cpus,
143
+ memory=memory,
144
+ disk_tier=disk_tier,
145
+ clouds='vast')
146
146
 
147
147
  @classmethod
148
148
  def get_accelerators_from_instance_type(
149
149
  cls, instance_type: str) -> Optional[Dict[str, Union[int, float]]]:
150
- return service_catalog.get_accelerators_from_instance_type(
151
- instance_type, clouds='vast')
150
+ return catalog.get_accelerators_from_instance_type(instance_type,
151
+ clouds='vast')
152
152
 
153
153
  @classmethod
154
154
  def get_zone_shell_cmd(cls) -> Optional[str]:
@@ -223,16 +223,16 @@ class Vast(clouds.Cloud):
223
223
 
224
224
  assert len(accelerators) == 1, resources
225
225
  acc, acc_count = list(accelerators.items())[0]
226
- (instance_list, fuzzy_candidate_list
227
- ) = service_catalog.get_instance_type_for_accelerator(
228
- acc,
229
- acc_count,
230
- use_spot=resources.use_spot,
231
- cpus=resources.cpus,
232
- region=resources.region,
233
- zone=resources.zone,
234
- memory=resources.memory,
235
- clouds='vast')
226
+ (instance_list,
227
+ fuzzy_candidate_list) = catalog.get_instance_type_for_accelerator(
228
+ acc,
229
+ acc_count,
230
+ use_spot=resources.use_spot,
231
+ cpus=resources.cpus,
232
+ region=resources.region,
233
+ zone=resources.zone,
234
+ memory=resources.memory,
235
+ clouds='vast')
236
236
  if instance_list is None:
237
237
  return resources_utils.FeasibleResources([], fuzzy_candidate_list,
238
238
  None)
@@ -276,10 +276,10 @@ class Vast(clouds.Cloud):
276
276
  return None
277
277
 
278
278
  def instance_type_exists(self, instance_type: str) -> bool:
279
- return service_catalog.instance_type_exists(instance_type, 'vast')
279
+ return catalog.instance_type_exists(instance_type, 'vast')
280
280
 
281
281
  def validate_region_zone(self, region: Optional[str], zone: Optional[str]):
282
- return service_catalog.validate_region_zone(region, zone, clouds='vast')
282
+ return catalog.validate_region_zone(region, zone, clouds='vast')
283
283
 
284
284
  @classmethod
285
285
  def get_image_size(cls, image_id: str, region: Optional[str]) -> float:
sky/clouds/vsphere.py CHANGED
@@ -3,9 +3,9 @@ import subprocess
3
3
  import typing
4
4
  from typing import Dict, Iterator, List, Optional, Tuple, Union
5
5
 
6
+ from sky import catalog
6
7
  from sky import clouds
7
8
  from sky.adaptors import common as adaptors_common
8
- from sky.clouds import service_catalog
9
9
  from sky.provision.vsphere import vsphere_utils
10
10
  from sky.provision.vsphere.vsphere_utils import get_vsphere_credentials
11
11
  from sky.provision.vsphere.vsphere_utils import initialize_vsphere_data
@@ -90,7 +90,7 @@ class Vsphere(clouds.Cloud):
90
90
  zone: Optional[str],
91
91
  ) -> List[clouds.Region]:
92
92
  del accelerators, zone # unused
93
- regions = service_catalog.get_region_zones_for_instance_type(
93
+ regions = catalog.get_region_zones_for_instance_type(
94
94
  instance_type, use_spot, _CLOUD_VSPHERE)
95
95
 
96
96
  if region is not None:
@@ -151,17 +151,17 @@ class Vsphere(clouds.Cloud):
151
151
  memory: Optional[str] = None,
152
152
  disk_tier: Optional[resources_utils.DiskTier] = None,
153
153
  ) -> Optional[str]:
154
- return service_catalog.get_default_instance_type(cpus=cpus,
155
- memory=memory,
156
- disk_tier=disk_tier,
157
- clouds=_CLOUD_VSPHERE)
154
+ return catalog.get_default_instance_type(cpus=cpus,
155
+ memory=memory,
156
+ disk_tier=disk_tier,
157
+ clouds=_CLOUD_VSPHERE)
158
158
 
159
159
  @classmethod
160
160
  def get_accelerators_from_instance_type(
161
161
  cls,
162
162
  instance_type: str,
163
163
  ) -> Optional[Dict[str, Union[int, float]]]:
164
- return service_catalog.get_accelerators_from_instance_type(
164
+ return catalog.get_accelerators_from_instance_type(
165
165
  instance_type, clouds=_CLOUD_VSPHERE)
166
166
 
167
167
  @classmethod
@@ -169,8 +169,8 @@ class Vsphere(clouds.Cloud):
169
169
  cls,
170
170
  instance_type: str,
171
171
  ) -> Tuple[Optional[float], Optional[float]]:
172
- return service_catalog.get_vcpus_mem_from_instance_type(
173
- instance_type, clouds=_CLOUD_VSPHERE)
172
+ return catalog.get_vcpus_mem_from_instance_type(instance_type,
173
+ clouds=_CLOUD_VSPHERE)
174
174
 
175
175
  @classmethod
176
176
  def get_zone_shell_cmd(cls) -> Optional[str]:
@@ -247,7 +247,7 @@ class Vsphere(clouds.Cloud):
247
247
  (
248
248
  instance_list,
249
249
  fuzzy_candidate_list,
250
- ) = service_catalog.get_instance_type_for_accelerator(
250
+ ) = catalog.get_instance_type_for_accelerator(
251
251
  acc,
252
252
  acc_count,
253
253
  use_spot=resources.use_spot,
@@ -325,10 +325,7 @@ class Vsphere(clouds.Cloud):
325
325
  return None
326
326
 
327
327
  def instance_type_exists(self, instance_type: str) -> bool:
328
- return service_catalog.instance_type_exists(instance_type,
329
- _CLOUD_VSPHERE)
328
+ return catalog.instance_type_exists(instance_type, _CLOUD_VSPHERE)
330
329
 
331
330
  def validate_region_zone(self, region: Optional[str], zone: Optional[str]):
332
- return service_catalog.validate_region_zone(region,
333
- zone,
334
- clouds=_CLOUD_VSPHERE)
331
+ return catalog.validate_region_zone(region, zone, clouds=_CLOUD_VSPHERE)
sky/core.py CHANGED
@@ -8,6 +8,7 @@ import colorama
8
8
 
9
9
  from sky import admin_policy
10
10
  from sky import backends
11
+ from sky import catalog
11
12
  from sky import check as sky_check
12
13
  from sky import clouds
13
14
  from sky import dag as dag_lib
@@ -21,7 +22,6 @@ from sky import skypilot_config
21
22
  from sky import task as task_lib
22
23
  from sky.backends import backend_utils
23
24
  from sky.clouds import cloud as sky_cloud
24
- from sky.clouds import service_catalog
25
25
  from sky.jobs.server import core as managed_jobs_core
26
26
  from sky.provision.kubernetes import constants as kubernetes_constants
27
27
  from sky.provision.kubernetes import utils as kubernetes_utils
@@ -1061,7 +1061,7 @@ def realtime_kubernetes_gpu_availability(
1061
1061
  name_filter: Optional[str] = None,
1062
1062
  quantity_filter: Optional[int] = None
1063
1063
  ) -> List[models.RealtimeGpuAvailability]:
1064
- counts, capacity, available = service_catalog.list_accelerator_realtime(
1064
+ counts, capacity, available = catalog.list_accelerator_realtime(
1065
1065
  gpus_only=True,
1066
1066
  clouds='ssh' if is_ssh else 'kubernetes',
1067
1067
  name_filter=name_filter,
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><title>404: This page could not be found</title><meta name="next-head-count" content="3"/><link rel="preload" href="/dashboard/_next/static/css/63d3995d8b528eb1.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/63d3995d8b528eb1.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-f27c9a32aa3d9c6d.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-87d061ee6ed71b28.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-e0e2335212e72357.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-67925f5e6382e22f.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-1be831200e60c5c0.js" defer=""></script><script src="/dashboard/_next/static/zTAFq_Iv6_yxQj3fXvJWR/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/zTAFq_Iv6_yxQj3fXvJWR/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">This page could not be found<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"zTAFq_Iv6_yxQj3fXvJWR","assetPrefix":"/dashboard","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><title>404: This page could not be found</title><meta name="next-head-count" content="3"/><link rel="preload" href="/dashboard/_next/static/css/667d941a2888ce6e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/667d941a2888ce6e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-65d465f948974c0d.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-87d061ee6ed71b28.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-e0e2335212e72357.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-cb81dc4d27f4d009.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-1be831200e60c5c0.js" defer=""></script><script src="/dashboard/_next/static/qjhIe-yC6nHcLKBqpzO1M/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/qjhIe-yC6nHcLKBqpzO1M/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">This page could not be found<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"qjhIe-yC6nHcLKBqpzO1M","assetPrefix":"/dashboard","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>