zkcloudworker 0.2.7 → 0.2.9

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.
@@ -1,5 +1,5 @@
1
1
  import { zkCloudWorker, Cloud } from "../cloud/cloud";
2
- import { JobData } from "../cloud/job";
2
+ import { blockchain } from "../networks";
3
3
  /**
4
4
  * API class for interacting with the zkCloudWorker
5
5
  * @property jwt The jwt token for authentication, get it at https://t.me/minanft_bot?start=auth
@@ -8,13 +8,17 @@ import { JobData } from "../cloud/job";
8
8
  export declare class zkCloudWorkerClient {
9
9
  readonly jwt: string;
10
10
  readonly endpoint: string;
11
- readonly localJobs: Map<string, JobData>;
12
- readonly localWorker: (cloud: Cloud) => Promise<zkCloudWorker> | undefined;
11
+ readonly chain: blockchain;
12
+ readonly localWorker?: (cloud: Cloud) => Promise<zkCloudWorker>;
13
13
  /**
14
14
  * Constructor for the API class
15
15
  * @param jwt The jwt token for authentication, get it at https://t.me/minanft_bot?start=auth
16
16
  */
17
- constructor(jwt: string, zkcloudworker?: ((cloud: Cloud) => Promise<zkCloudWorker>) | undefined);
17
+ constructor(params: {
18
+ jwt: string;
19
+ zkcloudworker?: (cloud: Cloud) => Promise<zkCloudWorker>;
20
+ chain?: blockchain;
21
+ });
18
22
  /**
19
23
  * Starts a new job for the proof calculation using serverless api call
20
24
  * The developer and name should correspond to the BackupPlugin of the API
@@ -59,7 +63,7 @@ export declare class zkCloudWorkerClient {
59
63
  execute(data: {
60
64
  developer: string;
61
65
  repo: string;
62
- task?: string;
66
+ task: string;
63
67
  userId?: string;
64
68
  args?: string;
65
69
  metadata?: string;
@@ -19,10 +19,11 @@ class zkCloudWorkerClient {
19
19
  * Constructor for the API class
20
20
  * @param jwt The jwt token for authentication, get it at https://t.me/minanft_bot?start=auth
21
21
  */
22
- constructor(jwt, zkcloudworker = undefined) {
23
- this.localJobs = new Map();
22
+ constructor(params) {
23
+ const { jwt, zkcloudworker, chain } = params;
24
24
  this.jwt = jwt;
25
25
  this.endpoint = ZKCLOUDWORKER_API;
26
+ this.chain = chain ?? "berkeley";
26
27
  if (jwt === "local") {
27
28
  if (zkcloudworker === undefined)
28
29
  throw new Error("worker is required for local mode");
@@ -222,8 +223,11 @@ class zkCloudWorkerClient {
222
223
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
223
224
  ) {
224
225
  if (this.jwt === "local") {
226
+ if (this.localWorker === undefined)
227
+ throw new Error("localWorker is undefined");
225
228
  switch (command) {
226
229
  case "recursiveProof": {
230
+ console.log("calculating recursive proof locally...");
227
231
  const timeCreated = Date.now();
228
232
  const jobId = this.generateJobId();
229
233
  const job = {
@@ -243,7 +247,11 @@ class zkCloudWorkerClient {
243
247
  jobStatus: "started",
244
248
  maxAttempts: 0,
245
249
  };
246
- const cloud = new local_1.LocalCloud({ job });
250
+ const cloud = new local_1.LocalCloud({
251
+ job,
252
+ chain: this.chain,
253
+ localWorker: this.localWorker,
254
+ });
247
255
  const worker = await this.localWorker(cloud);
248
256
  if (worker === undefined)
249
257
  throw new Error("worker is undefined");
@@ -252,16 +260,22 @@ class zkCloudWorkerClient {
252
260
  data,
253
261
  });
254
262
  job.timeFinished = Date.now();
255
- job.jobStatus = "finished";
256
- job.result = proof;
257
263
  job.maxAttempts = 1;
258
- this.localJobs.set(jobId, job);
264
+ if (proof !== undefined) {
265
+ job.jobStatus = "finished";
266
+ job.result = proof;
267
+ }
268
+ else {
269
+ job.jobStatus = "failed";
270
+ }
271
+ local_1.LocalStorage.jobs[jobId] = job;
259
272
  return {
260
273
  success: true,
261
274
  data: jobId,
262
275
  };
263
276
  }
264
277
  case "execute": {
278
+ console.log("executing locally...");
265
279
  const timeCreated = Date.now();
266
280
  const jobId = this.generateJobId();
267
281
  const job = {
@@ -280,23 +294,32 @@ class zkCloudWorkerClient {
280
294
  jobStatus: "started",
281
295
  maxAttempts: 0,
282
296
  };
283
- const cloud = new local_1.LocalCloud({ job });
297
+ const cloud = new local_1.LocalCloud({
298
+ job,
299
+ chain: this.chain,
300
+ localWorker: this.localWorker,
301
+ });
284
302
  const worker = await this.localWorker(cloud);
285
303
  if (worker === undefined)
286
304
  throw new Error("worker is undefined");
287
305
  const result = await worker.execute();
288
306
  job.timeFinished = Date.now();
289
- job.jobStatus = "finished";
290
- job.result = result;
291
307
  job.maxAttempts = 1;
292
- this.localJobs.set(jobId, job);
308
+ if (result !== undefined) {
309
+ job.jobStatus = "finished";
310
+ job.result = result;
311
+ }
312
+ else {
313
+ job.jobStatus = "failed";
314
+ }
315
+ local_1.LocalStorage.jobs[jobId] = job;
293
316
  return {
294
317
  success: true,
295
318
  data: jobId,
296
319
  };
297
320
  }
298
321
  case "jobResult": {
299
- const job = this.localJobs.get(data.jobId);
322
+ const job = local_1.LocalStorage.jobs[data.jobId];
300
323
  if (job === undefined) {
301
324
  return {
302
325
  success: false,
@@ -333,6 +356,7 @@ class zkCloudWorkerClient {
333
356
  command: command,
334
357
  jwtToken: this.jwt,
335
358
  data: data,
359
+ chain: this.chain,
336
360
  };
337
361
  try {
338
362
  const response = await axios_1.default.post(this.endpoint, apiData);
@@ -16,6 +16,7 @@ export declare abstract class Cloud {
16
16
  readonly userId?: string;
17
17
  readonly args?: string;
18
18
  readonly metadata?: string;
19
+ readonly chain: blockchain;
19
20
  readonly isLocalCloud: boolean;
20
21
  constructor(params: {
21
22
  jobId: string;
@@ -28,6 +29,7 @@ export declare abstract class Cloud {
28
29
  args?: string;
29
30
  metadata?: string;
30
31
  isLocalCloud?: boolean;
32
+ chain: blockchain;
31
33
  });
32
34
  abstract getDeployer(): Promise<PrivateKey>;
33
35
  abstract log(msg: string): void;
@@ -36,12 +38,40 @@ export declare abstract class Cloud {
36
38
  abstract saveFile(filename: string, value: Buffer): Promise<void>;
37
39
  abstract loadFile(filename: string): Promise<Buffer | undefined>;
38
40
  abstract loadEnvironment(password: string): Promise<void>;
41
+ abstract recursiveProof(data: {
42
+ transactions: string[];
43
+ task?: string;
44
+ userId?: string;
45
+ args?: string;
46
+ metadata?: string;
47
+ }): Promise<string>;
48
+ abstract execute(data: {
49
+ task: string;
50
+ userId?: string;
51
+ args?: string;
52
+ metadata?: string;
53
+ }): Promise<string>;
54
+ abstract addTask(data: {
55
+ task: string;
56
+ userId?: string;
57
+ args?: string;
58
+ metadata?: string;
59
+ }): Promise<string>;
60
+ abstract deleteTask(taskId: string): Promise<void>;
61
+ abstract processTasks(): Promise<void>;
62
+ }
63
+ export interface CloudTransaction {
64
+ txId: string;
65
+ transaction: string;
66
+ timeReceived: number;
39
67
  }
40
68
  export declare abstract class zkCloudWorker {
41
69
  readonly cloud: Cloud;
42
70
  constructor(cloud: Cloud);
43
- abstract deployedContracts(): Promise<DeployedSmartContract[]>;
44
- abstract create(transaction: string): Promise<string | undefined>;
45
- abstract merge(proof1: string, proof2: string): Promise<string | undefined>;
46
- abstract execute(): Promise<string | undefined>;
71
+ deployedContracts(): Promise<DeployedSmartContract[]>;
72
+ create(transaction: string): Promise<string | undefined>;
73
+ merge(proof1: string, proof2: string): Promise<string | undefined>;
74
+ execute(): Promise<string | undefined>;
75
+ processTransactions(transactions: CloudTransaction[]): Promise<void>;
76
+ task(): Promise<string | undefined>;
47
77
  }
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.zkCloudWorker = exports.Cloud = void 0;
4
4
  class Cloud {
5
5
  constructor(params) {
6
- const { jobId, stepId, cache, developer, repo, task, userId, args, metadata, isLocalCloud, } = params;
6
+ const { jobId, stepId, cache, developer, repo, task, userId, args, metadata, isLocalCloud, chain, } = params;
7
7
  this.jobId = jobId;
8
8
  this.stepId = stepId;
9
9
  this.cache = cache;
@@ -14,6 +14,7 @@ class Cloud {
14
14
  this.args = args;
15
15
  this.metadata = metadata;
16
16
  this.isLocalCloud = isLocalCloud ?? false;
17
+ this.chain = chain;
17
18
  }
18
19
  }
19
20
  exports.Cloud = Cloud;
@@ -21,5 +22,26 @@ class zkCloudWorker {
21
22
  constructor(cloud) {
22
23
  this.cloud = cloud;
23
24
  }
25
+ // To verify the SmartContract code
26
+ async deployedContracts() {
27
+ return [];
28
+ }
29
+ // Those methods should be implemented for recursive proofs calculations
30
+ async create(transaction) {
31
+ return undefined;
32
+ }
33
+ async merge(proof1, proof2) {
34
+ return undefined;
35
+ }
36
+ // Those methods should be implemented for anything except for recursive proofs
37
+ async execute() {
38
+ return undefined;
39
+ }
40
+ // process the transactions received by the cloud
41
+ async processTransactions(transactions) { }
42
+ // process the task defined by the developer
43
+ async task() {
44
+ return undefined;
45
+ }
24
46
  }
25
47
  exports.zkCloudWorker = zkCloudWorker;
@@ -0,0 +1,11 @@
1
+ /// <reference types="node" />
2
+ export declare function saveFile(params: {
3
+ data: any;
4
+ filename: string;
5
+ }): Promise<string | undefined>;
6
+ export declare function loadFile(filename: string): Promise<any>;
7
+ export declare function saveBinaryFile(params: {
8
+ data: any;
9
+ filename: string;
10
+ }): Promise<string | undefined>;
11
+ export declare function loadBinaryFile(filename: string): Promise<Buffer | undefined>;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loadBinaryFile = exports.saveBinaryFile = exports.loadFile = exports.saveFile = void 0;
7
+ const promises_1 = __importDefault(require("fs/promises"));
8
+ async function saveFile(params) {
9
+ const { data, filename } = params;
10
+ const folder = "./data/";
11
+ const name = folder + filename + ".json";
12
+ try {
13
+ await promises_1.default.access("./data");
14
+ }
15
+ catch (e) {
16
+ // if not, create it
17
+ await promises_1.default.mkdir("./data");
18
+ }
19
+ try {
20
+ await promises_1.default.writeFile(name, JSON.stringify(data, null, 2));
21
+ return name;
22
+ }
23
+ catch (e) {
24
+ console.error(`Error writing file ${name}`);
25
+ return undefined;
26
+ }
27
+ }
28
+ exports.saveFile = saveFile;
29
+ async function loadFile(filename) {
30
+ const name = "./data/" + filename + ".json";
31
+ try {
32
+ const filedata = await promises_1.default.readFile(name, "utf8");
33
+ const data = JSON.parse(filedata);
34
+ return data;
35
+ }
36
+ catch (e) {
37
+ console.error(`File ${name} does not exist or has wrong format`);
38
+ return undefined;
39
+ }
40
+ }
41
+ exports.loadFile = loadFile;
42
+ async function saveBinaryFile(params) {
43
+ const { data, filename } = params;
44
+ const folder = "./data/";
45
+ const name = folder + filename + ".bin";
46
+ try {
47
+ await promises_1.default.access("./data");
48
+ }
49
+ catch (e) {
50
+ // if not, create it
51
+ await promises_1.default.mkdir("./data");
52
+ }
53
+ try {
54
+ await promises_1.default.writeFile(name, data);
55
+ return name;
56
+ }
57
+ catch (e) {
58
+ console.error(`Error writing file ${name}`);
59
+ return undefined;
60
+ }
61
+ }
62
+ exports.saveBinaryFile = saveBinaryFile;
63
+ async function loadBinaryFile(filename) {
64
+ const name = "./data/" + filename + ".bin";
65
+ try {
66
+ const data = await promises_1.default.readFile(name);
67
+ return data;
68
+ }
69
+ catch (e) {
70
+ console.error(`File ${name} does not exist or has wrong format`);
71
+ return undefined;
72
+ }
73
+ }
74
+ exports.loadBinaryFile = loadBinaryFile;
@@ -2,12 +2,16 @@
2
2
  import { Cache, PrivateKey } from "o1js";
3
3
  import { Cloud, zkCloudWorker } from "./cloud";
4
4
  import { JobData } from "./job";
5
+ import { TaskData } from "./task";
6
+ import { blockchain } from "../networks";
5
7
  export declare class LocalCloud extends Cloud {
6
- data: Map<string, string>;
8
+ readonly localWorker: (cloud: Cloud) => Promise<zkCloudWorker>;
7
9
  constructor(params: {
8
10
  job: JobData;
11
+ chain: blockchain;
9
12
  cache?: Cache;
10
13
  stepId?: string;
14
+ localWorker: (cloud: Cloud) => Promise<zkCloudWorker>;
11
15
  });
12
16
  getDeployer(): Promise<PrivateKey>;
13
17
  log(msg: string): Promise<void>;
@@ -16,6 +20,28 @@ export declare class LocalCloud extends Cloud {
16
20
  saveFile(filename: string, value: Buffer): Promise<void>;
17
21
  loadFile(filename: string): Promise<Buffer | undefined>;
18
22
  loadEnvironment(password: string): Promise<void>;
23
+ private generateId;
24
+ recursiveProof(data: {
25
+ transactions: string[];
26
+ task?: string;
27
+ userId?: string;
28
+ args?: string;
29
+ metadata?: string;
30
+ }): Promise<string>;
31
+ execute(data: {
32
+ task: string;
33
+ userId?: string;
34
+ args?: string;
35
+ metadata?: string;
36
+ }): Promise<string>;
37
+ addTask(data: {
38
+ task: string;
39
+ userId?: string;
40
+ args?: string;
41
+ metadata?: string;
42
+ }): Promise<string>;
43
+ deleteTask(taskId: string): Promise<void>;
44
+ processTasks(): Promise<void>;
19
45
  static sequencer(params: {
20
46
  worker: zkCloudWorker;
21
47
  data: {
@@ -29,3 +55,22 @@ export declare class LocalCloud extends Cloud {
29
55
  };
30
56
  }): Promise<string>;
31
57
  }
58
+ export declare class LocalStorage {
59
+ static jobs: {
60
+ [key: string]: JobData;
61
+ };
62
+ static data: {
63
+ [key: string]: string;
64
+ };
65
+ static transactions: {
66
+ [key: string]: {
67
+ transaction: string;
68
+ timeReceived: number;
69
+ };
70
+ };
71
+ static tasks: {
72
+ [key: string]: TaskData;
73
+ };
74
+ static saveData(name: string): Promise<void>;
75
+ static loadData(name: string): Promise<void>;
76
+ }
@@ -1,11 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LocalCloud = void 0;
3
+ exports.LocalStorage = exports.LocalCloud = void 0;
4
4
  const o1js_1 = require("o1js");
5
5
  const cloud_1 = require("./cloud");
6
+ const mina_1 = require("../mina");
7
+ const files_1 = require("./files");
6
8
  class LocalCloud extends cloud_1.Cloud {
7
9
  constructor(params) {
8
- const { job, cache, stepId } = params;
10
+ const { job, chain, cache, stepId, localWorker } = params;
9
11
  const { jobId, developer, repo, task, userId, args, metadata } = job;
10
12
  super({
11
13
  jobId: jobId,
@@ -18,8 +20,9 @@ class LocalCloud extends cloud_1.Cloud {
18
20
  args: args,
19
21
  metadata: metadata,
20
22
  isLocalCloud: true,
23
+ chain,
21
24
  });
22
- this.data = new Map();
25
+ this.localWorker = localWorker;
23
26
  }
24
27
  async getDeployer() {
25
28
  throw new Error("Method not implemented.");
@@ -28,21 +31,157 @@ class LocalCloud extends cloud_1.Cloud {
28
31
  console.log("LocalCloud:", msg);
29
32
  }
30
33
  async getDataByKey(key) {
31
- const value = this.data.get(key);
34
+ const value = LocalStorage.data[key];
32
35
  return value;
33
36
  }
34
37
  async saveDataByKey(key, value) {
35
- this.data.set(key, value);
38
+ LocalStorage.data[key] = value;
36
39
  }
37
40
  async saveFile(filename, value) {
38
- throw new Error("Method not implemented.");
41
+ await (0, files_1.saveBinaryFile)({ data: value, filename });
39
42
  }
40
43
  async loadFile(filename) {
41
- throw new Error("Method not implemented.");
44
+ const data = await (0, files_1.loadBinaryFile)(filename);
45
+ return data;
42
46
  }
43
47
  async loadEnvironment(password) {
44
48
  throw new Error("Method not implemented.");
45
49
  }
50
+ generateId() {
51
+ return "local." + Date.now().toString() + "." + (0, mina_1.makeString)(32);
52
+ }
53
+ async recursiveProof(data) {
54
+ console.log("calculating recursive proof locally...");
55
+ const timeCreated = Date.now();
56
+ const jobId = this.generateId();
57
+ const job = {
58
+ id: "local",
59
+ jobId: jobId,
60
+ developer: this.developer,
61
+ repo: this.repo,
62
+ task: data.task,
63
+ userId: data.userId,
64
+ args: data.args,
65
+ metadata: data.metadata,
66
+ filename: "recursiveProof.json",
67
+ txNumber: data.transactions.length,
68
+ timeCreated,
69
+ timeCreatedString: new Date(timeCreated).toISOString(),
70
+ timeStarted: timeCreated,
71
+ jobStatus: "started",
72
+ maxAttempts: 0,
73
+ };
74
+ const cloud = new LocalCloud({
75
+ job,
76
+ chain: this.chain,
77
+ localWorker: this.localWorker,
78
+ });
79
+ const worker = await this.localWorker(cloud);
80
+ if (worker === undefined)
81
+ throw new Error("worker is undefined");
82
+ const proof = await LocalCloud.sequencer({
83
+ worker,
84
+ data: { ...data, developer: this.developer, repo: this.repo },
85
+ });
86
+ job.timeFinished = Date.now();
87
+ job.jobStatus = "finished";
88
+ job.result = proof;
89
+ job.maxAttempts = 1;
90
+ LocalStorage.jobs[jobId] = job;
91
+ return jobId;
92
+ }
93
+ async execute(data) {
94
+ console.log("executing locally...");
95
+ const timeCreated = Date.now();
96
+ const jobId = this.generateId();
97
+ const job = {
98
+ id: "local",
99
+ jobId: jobId,
100
+ developer: this.developer,
101
+ repo: this.repo,
102
+ task: data.task,
103
+ userId: data.userId,
104
+ args: data.args,
105
+ metadata: data.metadata,
106
+ txNumber: 1,
107
+ timeCreated,
108
+ timeCreatedString: new Date(timeCreated).toISOString(),
109
+ timeStarted: timeCreated,
110
+ jobStatus: "started",
111
+ maxAttempts: 0,
112
+ };
113
+ const cloud = new LocalCloud({
114
+ job,
115
+ chain: this.chain,
116
+ localWorker: this.localWorker,
117
+ });
118
+ const worker = await this.localWorker(cloud);
119
+ if (worker === undefined)
120
+ throw new Error("worker is undefined");
121
+ const result = await worker.execute();
122
+ job.timeFinished = Date.now();
123
+ job.jobStatus = "finished";
124
+ job.result = result;
125
+ job.maxAttempts = 1;
126
+ LocalStorage.jobs[jobId] = job;
127
+ return jobId;
128
+ }
129
+ async addTask(data) {
130
+ const taskId = this.generateId();
131
+ LocalStorage.tasks[taskId] = {
132
+ ...data,
133
+ id: "local",
134
+ taskId,
135
+ developer: this.developer,
136
+ repo: this.repo,
137
+ };
138
+ return taskId;
139
+ }
140
+ async deleteTask(taskId) {
141
+ delete LocalStorage.tasks[taskId];
142
+ }
143
+ async processTasks() {
144
+ for (const taskId in LocalStorage.tasks) {
145
+ const data = LocalStorage.tasks[taskId];
146
+ const jobId = this.generateId();
147
+ const timeCreated = Date.now();
148
+ const job = {
149
+ id: "local",
150
+ jobId: jobId,
151
+ developer: this.developer,
152
+ repo: this.repo,
153
+ task: data.task,
154
+ userId: data.userId,
155
+ args: data.args,
156
+ metadata: data.metadata,
157
+ txNumber: 1,
158
+ timeCreated: timeCreated,
159
+ timeCreatedString: new Date(timeCreated).toISOString(),
160
+ timeStarted: Date.now(),
161
+ jobStatus: "started",
162
+ maxAttempts: 0,
163
+ };
164
+ const cloud = new LocalCloud({
165
+ job,
166
+ chain: this.chain,
167
+ localWorker: this.localWorker,
168
+ });
169
+ const worker = await this.localWorker(cloud);
170
+ console.log("Executing task", { taskId, data });
171
+ const result = await worker.task();
172
+ job.timeFinished = Date.now();
173
+ job.maxAttempts = 1;
174
+ job.billedDuration = job.timeFinished - timeCreated;
175
+ if (result !== undefined) {
176
+ job.jobStatus = "finished";
177
+ job.result = result;
178
+ }
179
+ else {
180
+ job.jobStatus = "failed";
181
+ }
182
+ LocalStorage.jobs[jobId] = job;
183
+ }
184
+ }
46
185
  static async sequencer(params) {
47
186
  const { worker, data } = params;
48
187
  const { transactions } = data;
@@ -66,3 +205,30 @@ class LocalCloud extends cloud_1.Cloud {
66
205
  }
67
206
  }
68
207
  exports.LocalCloud = LocalCloud;
208
+ class LocalStorage {
209
+ static async saveData(name) {
210
+ const data = {
211
+ jobs: LocalStorage.jobs,
212
+ data: LocalStorage.data,
213
+ transactions: LocalStorage.transactions,
214
+ tasks: LocalStorage.tasks,
215
+ };
216
+ const filename = name + ".cloud";
217
+ await (0, files_1.saveFile)({ data, filename });
218
+ }
219
+ static async loadData(name) {
220
+ const filename = name + ".cloud";
221
+ const data = await (0, files_1.loadFile)(filename);
222
+ if (data === undefined)
223
+ return;
224
+ LocalStorage.jobs = data.jobs;
225
+ LocalStorage.data = data.data;
226
+ LocalStorage.transactions = data.transactions;
227
+ LocalStorage.tasks = data.tasks;
228
+ }
229
+ }
230
+ exports.LocalStorage = LocalStorage;
231
+ LocalStorage.jobs = {};
232
+ LocalStorage.data = {};
233
+ LocalStorage.transactions = {};
234
+ LocalStorage.tasks = {};
@@ -0,0 +1,10 @@
1
+ export interface TaskData {
2
+ id: string;
3
+ taskId: string;
4
+ developer: string;
5
+ repo: string;
6
+ task: string;
7
+ userId?: string;
8
+ args?: string;
9
+ metadata?: string;
10
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });