@lowlighter/toolbox 1.0.1

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 (47) hide show
  1. package/README.md +14 -0
  2. package/clone.d.ts +9 -0
  3. package/clone.js +37 -0
  4. package/deno.lock +53 -0
  5. package/env.d.ts +28 -0
  6. package/env.js +28 -0
  7. package/evaluate.d.ts +49 -0
  8. package/evaluate.js +90 -0
  9. package/events.d.ts +8 -0
  10. package/events.js +28 -0
  11. package/filesystem.d.ts +19 -0
  12. package/filesystem.js +40 -0
  13. package/fixtures/filesystem/a/b/foo.txt +1 -0
  14. package/fixtures/filesystem/a/c/bar.txt +1 -0
  15. package/fixtures/filesystem/a/c/baz.txt +1 -0
  16. package/fixtures/filesystem/a/d/qux.ts +1 -0
  17. package/format.d.ts +9 -0
  18. package/format.js +21 -0
  19. package/identicon.d.ts +6 -0
  20. package/identicon.js +32 -0
  21. package/imgb64.d.ts +1 -0
  22. package/imgb64.js +15 -0
  23. package/mod.ts +1 -0
  24. package/noop.d.ts +1 -0
  25. package/noop.js +2 -0
  26. package/package.json +116 -0
  27. package/permissions.d.ts +1 -0
  28. package/permissions.js +31 -0
  29. package/pluralize.d.ts +6 -0
  30. package/pluralize.js +44 -0
  31. package/promises.d.ts +1 -0
  32. package/promises.js +12 -0
  33. package/resolve.d.ts +5 -0
  34. package/resolve.js +18 -0
  35. package/scripts/code_quality.d.ts +0 -0
  36. package/scripts/code_quality.js +210 -0
  37. package/scripts/download_lambda_chromium.d.ts +10 -0
  38. package/scripts/download_lambda_chromium.js +133 -0
  39. package/scripts/highlight_coverage.d.ts +0 -0
  40. package/scripts/highlight_coverage.js +62 -0
  41. package/scripts/publish/_utils.js +95 -0
  42. package/scripts/publish/npm.d.ts +11 -0
  43. package/scripts/publish/npm.js +130 -0
  44. package/scripts/publish/x.d.ts +20 -0
  45. package/scripts/publish/x.js +303 -0
  46. package/timezone.d.ts +2 -0
  47. package/timezone.js +8 -0
@@ -0,0 +1,303 @@
1
+ // deno-lint-ignore-file no-console
2
+ /**
3
+ * Publish a package on deno.land/x.
4
+ *
5
+ * 1. Check whether `https://deno.land/x/<name>@<version>` is already published (in which case there is nothing to do)
6
+ * 2. When `map` is set, create a temporary git branch where all imports are resolved against import maps
7
+ * (raw imports served by deno.land/x cannot resolve import maps, so bare specifiers are rewritten to fully qualified ones)
8
+ * 3. Search the github repository for the deno.land/x webhook, and activate it when `reactive` is set
9
+ * (this lets you keep the hook disabled by default so unrelated tags are not published)
10
+ * 4. Create and push a git tag named after `version` to trigger the webhook
11
+ * 5. Wait for the webhook payload delivery and for the version to be published on deno.land/x
12
+ * 6. Restore the webhook state, and clean up the temporary branch and tag (when `remove` is set)
13
+ *
14
+ * Note that you must configure the webhook on deno.land/x prior to using this script.
15
+ *
16
+ * @module
17
+ */ // Imports
18
+ import { parseArgs } from "@std/cli";
19
+ import { expandGlob } from "@std/fs";
20
+ import { dirname, resolve } from "@std/path";
21
+ import { command } from "@lowlighter/run/command";
22
+ import { commit, pull, push, tag } from "@lowlighter/git";
23
+ import { manifest, unmap, workspaceImports } from "./_utils.js";
24
+ import { cyan, gray, green, yellow } from "@std/fmt/colors";
25
+ /** Publish a package on deno.land/x. */ export async function publish({ token, repository, name, version, directory = "", map = "", reactive = false, remove = false, attempts = 30, delay = 30000, dryrun = false, fetcher = fetch }) {
26
+ directory = directory.trim().replace(/\/$/, "");
27
+ const hooked = `https://api.deno.land/webhook/gh/${name}${directory ? `?subdir=${encodeURIComponent(`/${directory}/`)}` : ""}`;
28
+ const url = `https://deno.land/x/${name}@${version}`;
29
+ const github = (path, init = {})=>fetcher(`https://api.github.com/repos/${repository}${path}`, {
30
+ ...init,
31
+ headers: {
32
+ Accept: "application/vnd.github+json",
33
+ Authorization: `Bearer ${token}`
34
+ }
35
+ }).then(async (response)=>{
36
+ if (!response.ok) {
37
+ await response.body?.cancel();
38
+ throw new Error(`GitHub API request failed with status ${response.status}: ${path}`);
39
+ }
40
+ return response.json();
41
+ });
42
+ const published = ()=>fetcher(url, {
43
+ headers: {
44
+ Accept: "text/html"
45
+ }
46
+ }).then(async (response)=>{
47
+ await response.body?.cancel();
48
+ return response.ok;
49
+ });
50
+ const sleep = ()=>new Promise((resolve)=>setTimeout(resolve, delay));
51
+ // Check if package is already published
52
+ if (await published()) {
53
+ console.error(`${url} is already published, nothing to do`);
54
+ return {
55
+ name,
56
+ version,
57
+ url,
58
+ changed: false
59
+ };
60
+ }
61
+ // Resolve imports on a temporary branch if needed
62
+ const branch = {
63
+ current: "",
64
+ temporary: ""
65
+ };
66
+ try {
67
+ if (map) {
68
+ branch.current = command("git", [
69
+ "rev-parse",
70
+ "--abbrev-ref",
71
+ "HEAD"
72
+ ], {
73
+ sync: true,
74
+ throw: true
75
+ }).stdout.trim();
76
+ branch.temporary = `x-${name}-${version}`;
77
+ console.error(`switching from ${branch.current} to temporary branch ${branch.temporary}`);
78
+ if (!dryrun) {
79
+ command("git", [
80
+ "switch",
81
+ "--create",
82
+ branch.temporary
83
+ ], {
84
+ sync: true,
85
+ throw: true
86
+ });
87
+ push(branch.temporary);
88
+ command("git", [
89
+ "branch",
90
+ "--set-upstream-to",
91
+ `origin/${branch.temporary}`
92
+ ], {
93
+ sync: true,
94
+ throw: true
95
+ });
96
+ }
97
+ const cwd = resolve(Deno.cwd());
98
+ const workspace = await workspaceImports(cwd);
99
+ const mapped = manifest(dirname(resolve(cwd, map)))?.imports ?? {};
100
+ const exclude = [
101
+ ...new Set([
102
+ ...manifest(cwd)?.publish?.exclude ?? [],
103
+ "node_modules",
104
+ ".git",
105
+ "coverage",
106
+ ".github"
107
+ ])
108
+ ];
109
+ for await (const { path } of expandGlob("**/*.ts", {
110
+ root: cwd,
111
+ includeDirs: false,
112
+ exclude
113
+ })){
114
+ // Resolve against workspace members, the nearest manifest imports and the specified map
115
+ let local = {};
116
+ for(let base = dirname(path); base.startsWith(cwd); base = dirname(base)){
117
+ const parsed = manifest(base);
118
+ if (parsed) {
119
+ local = parsed.imports ?? {};
120
+ break;
121
+ }
122
+ }
123
+ const { result, resolved } = unmap(await Deno.readTextFile(path), {
124
+ ...workspace,
125
+ ...local,
126
+ ...mapped
127
+ });
128
+ if (resolved) {
129
+ console.error(gray(`resolved ${resolved} imports in ${path}`));
130
+ if (!dryrun) await Deno.writeTextFile(path, result);
131
+ }
132
+ }
133
+ console.error(gray(`committing resolved imports on ${branch.temporary}`));
134
+ if (!dryrun) {
135
+ commit(`build(${name}): deno.land/x@${version}`, {
136
+ all: true
137
+ });
138
+ push(branch.temporary);
139
+ }
140
+ }
141
+ // Search webhook and activate it if needed
142
+ const webhooks = await github("/hooks");
143
+ const hook = webhooks.find(({ config })=>config.url === hooked);
144
+ if (!hook) throw new Error(`Could not find a hook with expected url: ${hooked}`);
145
+ console.error(`found hook ${hook.id} (active: ${hook.active})`);
146
+ if (reactive && !hook.active) {
147
+ console.error(yellow("hook is inactive prior publishing, activating"));
148
+ if (!dryrun) await github(`/hooks/${hook.id}`, {
149
+ method: "PATCH",
150
+ body: JSON.stringify({
151
+ active: true
152
+ })
153
+ });
154
+ }
155
+ try {
156
+ // Create and push tag to trigger webhook
157
+ console.error(`creating and pushing tag ${version}`);
158
+ const pushed = Date.now();
159
+ if (!dryrun) {
160
+ tag(version, {
161
+ force: true
162
+ });
163
+ pull({
164
+ rebase: true
165
+ });
166
+ push(version);
167
+ }
168
+ // Wait for webhook payload delivery and deno.land/x publishing
169
+ if (!dryrun) {
170
+ for(let attempt = 0;; attempt++){
171
+ const deliveries = await github(`/hooks/${hook.id}/deliveries`);
172
+ if (deliveries.some(({ event, delivered_at })=>event === "create" && Date.parse(delivered_at) >= pushed - delay)) break;
173
+ if (attempt >= attempts) throw new Error("Webhook payload has not been delivered in the expected time frame");
174
+ console.error(gray("webhook payload has not been delivered yet"));
175
+ await sleep();
176
+ }
177
+ console.error(cyan("webhook payload has been delivered"));
178
+ for(let attempt = 0;; attempt++){
179
+ if (await published()) break;
180
+ if (attempt >= attempts) throw new Error("Package has not been published in the expected time frame");
181
+ console.error(gray("package has not been published yet"));
182
+ await sleep();
183
+ }
184
+ }
185
+ console.error(green(`published on ${url}`));
186
+ } finally{
187
+ // Restore hook state if needed
188
+ if (reactive && !hook.active) {
189
+ console.error(yellow("hook was inactive prior publishing, restoring state"));
190
+ if (!dryrun) await github(`/hooks/${hook.id}`, {
191
+ method: "PATCH",
192
+ body: JSON.stringify({
193
+ active: false
194
+ })
195
+ });
196
+ }
197
+ // Remove tag if needed
198
+ if (remove && !dryrun) {
199
+ console.error(gray(`removing tag ${version} locally and from origin`));
200
+ command("git", [
201
+ "tag",
202
+ "--delete",
203
+ version
204
+ ], {
205
+ sync: true
206
+ });
207
+ push(version, {
208
+ args: [
209
+ "--delete"
210
+ ]
211
+ });
212
+ }
213
+ }
214
+ } finally{
215
+ // Remove temporary branch if needed
216
+ if (map && !dryrun && branch.temporary) {
217
+ console.error(`switching back to ${branch.current} and deleting temporary branch ${branch.temporary}`);
218
+ command("git", [
219
+ "switch",
220
+ branch.current
221
+ ], {
222
+ sync: true
223
+ });
224
+ command("git", [
225
+ "branch",
226
+ "--delete",
227
+ "--force",
228
+ branch.temporary
229
+ ], {
230
+ sync: true
231
+ });
232
+ push(branch.temporary, {
233
+ args: [
234
+ "--delete"
235
+ ]
236
+ });
237
+ }
238
+ }
239
+ return {
240
+ name,
241
+ version,
242
+ url,
243
+ changed: true
244
+ };
245
+ }
246
+ // Entry point
247
+ if (import.meta.main) {
248
+ const args = parseArgs(Deno.args, {
249
+ string: [
250
+ "token",
251
+ "repository",
252
+ "name",
253
+ "version",
254
+ "directory",
255
+ "map",
256
+ "attempts",
257
+ "delay"
258
+ ],
259
+ boolean: [
260
+ "reactive",
261
+ "remove",
262
+ "dryrun",
263
+ "help"
264
+ ]
265
+ });
266
+ if (args.help) {
267
+ console.error("Usage: deno run --allow-all jsr:@libs/toolbox/scripts/publish/x --token <token> --repository <owner/repo> [options]");
268
+ console.error("");
269
+ console.error("Options:");
270
+ console.error(" --token <token> GitHub API token");
271
+ console.error(" --repository <owner/repo> GitHub repository");
272
+ console.error(" --name [name] Package name on deno.land/x (defaults to the unscoped name from the deno.json(c) in the current directory)");
273
+ console.error(" --version [version] Version to publish (defaults to the version from the deno.json(c) in the current directory)");
274
+ console.error(" --directory [directory] Subdirectory of the repository to publish");
275
+ console.error(" --map [map] Import map path, when specified imports are resolved on a temporary branch which is published instead");
276
+ console.error(" --reactive Activate the webhook before publishing and restore its state afterwards");
277
+ console.error(" --remove Remove the tag after publishing");
278
+ console.error(" --attempts [attempts=30] Maximum number of attempts for publishing operations to complete");
279
+ console.error(" --delay [delay=30000] Delay between each attempt (in milliseconds)");
280
+ console.error(" --dryrun Do not actually publish");
281
+ Deno.exit(2);
282
+ }
283
+ if (!args.name || !args.version) {
284
+ const { name = "", version = "" } = await manifest(Deno.cwd()) ?? {};
285
+ args.name ||= name.split("/").at(-1);
286
+ args.version ||= version;
287
+ }
288
+ const { token = "", repository = "", name = "", version = "", directory, map, reactive, remove, dryrun } = args;
289
+ await publish({
290
+ token,
291
+ repository,
292
+ name,
293
+ version,
294
+ directory,
295
+ map,
296
+ reactive,
297
+ remove,
298
+ dryrun,
299
+ attempts: Number(args.attempts) || undefined,
300
+ delay: Number(args.delay) || undefined
301
+ });
302
+ }
303
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvdG9vbGJveC9zY3JpcHRzL3B1Ymxpc2gveC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBkZW5vLWxpbnQtaWdub3JlLWZpbGUgbm8tY29uc29sZVxuLyoqXG4gKiBQdWJsaXNoIGEgcGFja2FnZSBvbiBkZW5vLmxhbmQveC5cbiAqXG4gKiAxLiBDaGVjayB3aGV0aGVyIGBodHRwczovL2Rlbm8ubGFuZC94LzxuYW1lPkA8dmVyc2lvbj5gIGlzIGFscmVhZHkgcHVibGlzaGVkIChpbiB3aGljaCBjYXNlIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8pXG4gKiAyLiBXaGVuIGBtYXBgIGlzIHNldCwgY3JlYXRlIGEgdGVtcG9yYXJ5IGdpdCBicmFuY2ggd2hlcmUgYWxsIGltcG9ydHMgYXJlIHJlc29sdmVkIGFnYWluc3QgaW1wb3J0IG1hcHNcbiAqICAgIChyYXcgaW1wb3J0cyBzZXJ2ZWQgYnkgZGVuby5sYW5kL3ggY2Fubm90IHJlc29sdmUgaW1wb3J0IG1hcHMsIHNvIGJhcmUgc3BlY2lmaWVycyBhcmUgcmV3cml0dGVuIHRvIGZ1bGx5IHF1YWxpZmllZCBvbmVzKVxuICogMy4gU2VhcmNoIHRoZSBnaXRodWIgcmVwb3NpdG9yeSBmb3IgdGhlIGRlbm8ubGFuZC94IHdlYmhvb2ssIGFuZCBhY3RpdmF0ZSBpdCB3aGVuIGByZWFjdGl2ZWAgaXMgc2V0XG4gKiAgICAodGhpcyBsZXRzIHlvdSBrZWVwIHRoZSBob29rIGRpc2FibGVkIGJ5IGRlZmF1bHQgc28gdW5yZWxhdGVkIHRhZ3MgYXJlIG5vdCBwdWJsaXNoZWQpXG4gKiA0LiBDcmVhdGUgYW5kIHB1c2ggYSBnaXQgdGFnIG5hbWVkIGFmdGVyIGB2ZXJzaW9uYCB0byB0cmlnZ2VyIHRoZSB3ZWJob29rXG4gKiA1LiBXYWl0IGZvciB0aGUgd2ViaG9vayBwYXlsb2FkIGRlbGl2ZXJ5IGFuZCBmb3IgdGhlIHZlcnNpb24gdG8gYmUgcHVibGlzaGVkIG9uIGRlbm8ubGFuZC94XG4gKiA2LiBSZXN0b3JlIHRoZSB3ZWJob29rIHN0YXRlLCBhbmQgY2xlYW4gdXAgdGhlIHRlbXBvcmFyeSBicmFuY2ggYW5kIHRhZyAod2hlbiBgcmVtb3ZlYCBpcyBzZXQpXG4gKlxuICogTm90ZSB0aGF0IHlvdSBtdXN0IGNvbmZpZ3VyZSB0aGUgd2ViaG9vayBvbiBkZW5vLmxhbmQveCBwcmlvciB0byB1c2luZyB0aGlzIHNjcmlwdC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuLy8gSW1wb3J0c1xuaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSBcIkBzdGQvY2xpXCJcbmltcG9ydCB7IGV4cGFuZEdsb2IgfSBmcm9tIFwiQHN0ZC9mc1wiXG5pbXBvcnQgeyBkaXJuYW1lLCByZXNvbHZlIH0gZnJvbSBcIkBzdGQvcGF0aFwiXG5pbXBvcnQgeyBjb21tYW5kIH0gZnJvbSBcIkBsaWJzL3J1bi9jb21tYW5kXCJcbmltcG9ydCB7IGNvbW1pdCwgcHVsbCwgcHVzaCwgdGFnIH0gZnJvbSBcIkBsaWJzL2dpdFwiXG5pbXBvcnQgeyBtYW5pZmVzdCwgdW5tYXAsIHdvcmtzcGFjZUltcG9ydHMgfSBmcm9tIFwiLi9fdXRpbHMuanNcIlxuaW1wb3J0IHsgY3lhbiwgZ3JheSwgZ3JlZW4sIHllbGxvdyB9IGZyb20gXCJAc3RkL2ZtdC9jb2xvcnNcIlxuXG4vKiogUHVibGlzaCBhIHBhY2thZ2Ugb24gZGVuby5sYW5kL3guICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVibGlzaCh7IHRva2VuLCByZXBvc2l0b3J5LCBuYW1lLCB2ZXJzaW9uLCBkaXJlY3RvcnkgPSBcIlwiLCBtYXAgPSBcIlwiLCByZWFjdGl2ZSA9IGZhbHNlLCByZW1vdmUgPSBmYWxzZSwgYXR0ZW1wdHMgPSAzMCwgZGVsYXkgPSAzMDAwMCwgZHJ5cnVuID0gZmFsc2UsIGZldGNoZXIgPSBmZXRjaCB9OiBPcHRpb25zKTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nOyB1cmw6IHN0cmluZzsgY2hhbmdlZDogYm9vbGVhbiB9PiB7XG4gIGRpcmVjdG9yeSA9IGRpcmVjdG9yeS50cmltKCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpXG4gIGNvbnN0IGhvb2tlZCA9IGBodHRwczovL2FwaS5kZW5vLmxhbmQvd2ViaG9vay9naC8ke25hbWV9JHtkaXJlY3RvcnkgPyBgP3N1YmRpcj0ke2VuY29kZVVSSUNvbXBvbmVudChgLyR7ZGlyZWN0b3J5fS9gKX1gIDogXCJcIn1gXG4gIGNvbnN0IHVybCA9IGBodHRwczovL2Rlbm8ubGFuZC94LyR7bmFtZX1AJHt2ZXJzaW9ufWBcbiAgY29uc3QgZ2l0aHViID0gKHBhdGg6IHN0cmluZywgaW5pdCA9IHt9IGFzIFJlcXVlc3RJbml0KSA9PlxuICAgIGZldGNoZXIoYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtyZXBvc2l0b3J5fSR7cGF0aH1gLCB7IC4uLmluaXQsIGhlYWRlcnM6IHsgQWNjZXB0OiBcImFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvblwiLCBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCB9IH0pLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmJvZHk/LmNhbmNlbCgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgR2l0SHViIEFQSSByZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c306ICR7cGF0aH1gKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKVxuICAgIH0pXG4gIGNvbnN0IHB1Ymxpc2hlZCA9ICgpID0+XG4gICAgZmV0Y2hlcih1cmwsIHsgaGVhZGVyczogeyBBY2NlcHQ6IFwidGV4dC9odG1sXCIgfSB9KS50aGVuKGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKClcbiAgICAgIHJldHVybiByZXNwb25zZS5va1xuICAgIH0pXG4gIGNvbnN0IHNsZWVwID0gKCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKVxuXG4gIC8vIENoZWNrIGlmIHBhY2thZ2UgaXMgYWxyZWFkeSBwdWJsaXNoZWRcbiAgaWYgKGF3YWl0IHB1Ymxpc2hlZCgpKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHt1cmx9IGlzIGFscmVhZHkgcHVibGlzaGVkLCBub3RoaW5nIHRvIGRvYClcbiAgICByZXR1cm4geyBuYW1lLCB2ZXJzaW9uLCB1cmwsIGNoYW5nZWQ6IGZhbHNlIH1cbiAgfVxuXG4gIC8vIFJlc29sdmUgaW1wb3J0cyBvbiBhIHRlbXBvcmFyeSBicmFuY2ggaWYgbmVlZGVkXG4gIGNvbnN0IGJyYW5jaCA9IHsgY3VycmVudDogXCJcIiwgdGVtcG9yYXJ5OiBcIlwiIH1cbiAgdHJ5IHtcbiAgICBpZiAobWFwKSB7XG4gICAgICBicmFuY2guY3VycmVudCA9IGNvbW1hbmQoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiLS1hYmJyZXYtcmVmXCIsIFwiSEVBRFwiXSwgeyBzeW5jOiB0cnVlLCB0aHJvdzogdHJ1ZSB9KS5zdGRvdXQudHJpbSgpXG4gICAgICBicmFuY2gudGVtcG9yYXJ5ID0gYHgtJHtuYW1lfS0ke3ZlcnNpb259YFxuICAgICAgY29uc29sZS5lcnJvcihgc3dpdGNoaW5nIGZyb20gJHticmFuY2guY3VycmVudH0gdG8gdGVtcG9yYXJ5IGJyYW5jaCAke2JyYW5jaC50ZW1wb3Jhcnl9YClcbiAgICAgIGlmICghZHJ5cnVuKSB7XG4gICAgICAgIGNvbW1hbmQoXCJnaXRcIiwgW1wic3dpdGNoXCIsIFwiLS1jcmVhdGVcIiwgYnJhbmNoLnRlbXBvcmFyeV0sIHsgc3luYzogdHJ1ZSwgdGhyb3c6IHRydWUgfSlcbiAgICAgICAgcHVzaChicmFuY2gudGVtcG9yYXJ5KVxuICAgICAgICBjb21tYW5kKFwiZ2l0XCIsIFtcImJyYW5jaFwiLCBcIi0tc2V0LXVwc3RyZWFtLXRvXCIsIGBvcmlnaW4vJHticmFuY2gudGVtcG9yYXJ5fWBdLCB7IHN5bmM6IHRydWUsIHRocm93OiB0cnVlIH0pXG4gICAgICB9XG4gICAgICBjb25zdCBjd2QgPSByZXNvbHZlKERlbm8uY3dkKCkpXG4gICAgICBjb25zdCB3b3Jrc3BhY2UgPSBhd2FpdCB3b3Jrc3BhY2VJbXBvcnRzKGN3ZClcbiAgICAgIGNvbnN0IG1hcHBlZCA9IG1hbmlmZXN0KGRpcm5hbWUocmVzb2x2ZShjd2QsIG1hcCkpKT8uaW1wb3J0cyA/PyB7fVxuICAgICAgY29uc3QgZXhjbHVkZSA9IFsuLi5uZXcgU2V0KFsuLi4obWFuaWZlc3QoY3dkKT8ucHVibGlzaD8uZXhjbHVkZSA/PyBbXSksIFwibm9kZV9tb2R1bGVzXCIsIFwiLmdpdFwiLCBcImNvdmVyYWdlXCIsIFwiLmdpdGh1YlwiXSldXG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IHsgcGF0aCB9IG9mIGV4cGFuZEdsb2IoXCIqKi8qLnRzXCIsIHsgcm9vdDogY3dkLCBpbmNsdWRlRGlyczogZmFsc2UsIGV4Y2x1ZGUgfSkpIHtcbiAgICAgICAgLy8gUmVzb2x2ZSBhZ2FpbnN0IHdvcmtzcGFjZSBtZW1iZXJzLCB0aGUgbmVhcmVzdCBtYW5pZmVzdCBpbXBvcnRzIGFuZCB0aGUgc3BlY2lmaWVkIG1hcFxuICAgICAgICBsZXQgbG9jYWwgPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgICAgIGZvciAobGV0IGJhc2UgPSBkaXJuYW1lKHBhdGgpOyBiYXNlLnN0YXJ0c1dpdGgoY3dkKTsgYmFzZSA9IGRpcm5hbWUoYmFzZSkpIHtcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBtYW5pZmVzdChiYXNlKVxuICAgICAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgICAgIGxvY2FsID0gcGFyc2VkLmltcG9ydHMgPz8ge31cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgcmVzdWx0LCByZXNvbHZlZCB9ID0gdW5tYXAoYXdhaXQgRGVuby5yZWFkVGV4dEZpbGUocGF0aCksIHsgLi4ud29ya3NwYWNlLCAuLi5sb2NhbCwgLi4ubWFwcGVkIH0pXG4gICAgICAgIGlmIChyZXNvbHZlZCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZ3JheShgcmVzb2x2ZWQgJHtyZXNvbHZlZH0gaW1wb3J0cyBpbiAke3BhdGh9YCkpXG4gICAgICAgICAgaWYgKCFkcnlydW4pXG4gICAgICAgICAgICBhd2FpdCBEZW5vLndyaXRlVGV4dEZpbGUocGF0aCwgcmVzdWx0KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zb2xlLmVycm9yKGdyYXkoYGNvbW1pdHRpbmcgcmVzb2x2ZWQgaW1wb3J0cyBvbiAke2JyYW5jaC50ZW1wb3Jhcnl9YCkpXG4gICAgICBpZiAoIWRyeXJ1bikge1xuICAgICAgICBjb21taXQoYGJ1aWxkKCR7bmFtZX0pOiBkZW5vLmxhbmQveEAke3ZlcnNpb259YCwgeyBhbGw6IHRydWUgfSlcbiAgICAgICAgcHVzaChicmFuY2gudGVtcG9yYXJ5KVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNlYXJjaCB3ZWJob29rIGFuZCBhY3RpdmF0ZSBpdCBpZiBuZWVkZWRcbiAgICBjb25zdCB3ZWJob29rcyA9IGF3YWl0IGdpdGh1YihcIi9ob29rc1wiKSBhcyBBcnJheTx7IGlkOiBudW1iZXI7IGFjdGl2ZTogYm9vbGVhbjsgY29uZmlnOiB7IHVybD86IHN0cmluZyB9IH0+XG4gICAgY29uc3QgaG9vayA9IHdlYmhvb2tzLmZpbmQoKHsgY29uZmlnIH0pID0+IGNvbmZpZy51cmwgPT09IGhvb2tlZClcbiAgICBpZiAoIWhvb2spXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGEgaG9vayB3aXRoIGV4cGVjdGVkIHVybDogJHtob29rZWR9YClcbiAgICBjb25zb2xlLmVycm9yKGBmb3VuZCBob29rICR7aG9vay5pZH0gKGFjdGl2ZTogJHtob29rLmFjdGl2ZX0pYClcbiAgICBpZiAocmVhY3RpdmUgJiYgKCFob29rLmFjdGl2ZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoeWVsbG93KFwiaG9vayBpcyBpbmFjdGl2ZSBwcmlvciBwdWJsaXNoaW5nLCBhY3RpdmF0aW5nXCIpKVxuICAgICAgaWYgKCFkcnlydW4pXG4gICAgICAgIGF3YWl0IGdpdGh1YihgL2hvb2tzLyR7aG9vay5pZH1gLCB7IG1ldGhvZDogXCJQQVRDSFwiLCBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGl2ZTogdHJ1ZSB9KSB9KVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBDcmVhdGUgYW5kIHB1c2ggdGFnIHRvIHRyaWdnZXIgd2ViaG9va1xuICAgICAgY29uc29sZS5lcnJvcihgY3JlYXRpbmcgYW5kIHB1c2hpbmcgdGFnICR7dmVyc2lvbn1gKVxuICAgICAgY29uc3QgcHVzaGVkID0gRGF0ZS5ub3coKVxuICAgICAgaWYgKCFkcnlydW4pIHtcbiAgICAgICAgdGFnKHZlcnNpb24sIHsgZm9yY2U6IHRydWUgfSlcbiAgICAgICAgcHVsbCh7IHJlYmFzZTogdHJ1ZSB9KVxuICAgICAgICBwdXNoKHZlcnNpb24pXG4gICAgICB9XG5cbiAgICAgIC8vIFdhaXQgZm9yIHdlYmhvb2sgcGF5bG9hZCBkZWxpdmVyeSBhbmQgZGVuby5sYW5kL3ggcHVibGlzaGluZ1xuICAgICAgaWYgKCFkcnlydW4pIHtcbiAgICAgICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7OyBhdHRlbXB0KyspIHtcbiAgICAgICAgICBjb25zdCBkZWxpdmVyaWVzID0gYXdhaXQgZ2l0aHViKGAvaG9va3MvJHtob29rLmlkfS9kZWxpdmVyaWVzYCkgYXMgQXJyYXk8eyBldmVudDogc3RyaW5nOyBkZWxpdmVyZWRfYXQ6IHN0cmluZyB9PlxuICAgICAgICAgIGlmIChkZWxpdmVyaWVzLnNvbWUoKHsgZXZlbnQsIGRlbGl2ZXJlZF9hdCB9KSA9PiAoZXZlbnQgPT09IFwiY3JlYXRlXCIpICYmIChEYXRlLnBhcnNlKGRlbGl2ZXJlZF9hdCkgPj0gcHVzaGVkIC0gZGVsYXkpKSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgaWYgKGF0dGVtcHQgPj0gYXR0ZW1wdHMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXZWJob29rIHBheWxvYWQgaGFzIG5vdCBiZWVuIGRlbGl2ZXJlZCBpbiB0aGUgZXhwZWN0ZWQgdGltZSBmcmFtZVwiKVxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZ3JheShcIndlYmhvb2sgcGF5bG9hZCBoYXMgbm90IGJlZW4gZGVsaXZlcmVkIHlldFwiKSlcbiAgICAgICAgICBhd2FpdCBzbGVlcCgpXG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5lcnJvcihjeWFuKFwid2ViaG9vayBwYXlsb2FkIGhhcyBiZWVuIGRlbGl2ZXJlZFwiKSlcbiAgICAgICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7OyBhdHRlbXB0KyspIHtcbiAgICAgICAgICBpZiAoYXdhaXQgcHVibGlzaGVkKCkpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGlmIChhdHRlbXB0ID49IGF0dGVtcHRzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFja2FnZSBoYXMgbm90IGJlZW4gcHVibGlzaGVkIGluIHRoZSBleHBlY3RlZCB0aW1lIGZyYW1lXCIpXG4gICAgICAgICAgY29uc29sZS5lcnJvcihncmF5KFwicGFja2FnZSBoYXMgbm90IGJlZW4gcHVibGlzaGVkIHlldFwiKSlcbiAgICAgICAgICBhd2FpdCBzbGVlcCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuZXJyb3IoZ3JlZW4oYHB1Ymxpc2hlZCBvbiAke3VybH1gKSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gUmVzdG9yZSBob29rIHN0YXRlIGlmIG5lZWRlZFxuICAgICAgaWYgKHJlYWN0aXZlICYmICghaG9vay5hY3RpdmUpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoeWVsbG93KFwiaG9vayB3YXMgaW5hY3RpdmUgcHJpb3IgcHVibGlzaGluZywgcmVzdG9yaW5nIHN0YXRlXCIpKVxuICAgICAgICBpZiAoIWRyeXJ1bilcbiAgICAgICAgICBhd2FpdCBnaXRodWIoYC9ob29rcy8ke2hvb2suaWR9YCwgeyBtZXRob2Q6IFwiUEFUQ0hcIiwgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhY3RpdmU6IGZhbHNlIH0pIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSB0YWcgaWYgbmVlZGVkXG4gICAgICBpZiAocmVtb3ZlICYmICghZHJ5cnVuKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGdyYXkoYHJlbW92aW5nIHRhZyAke3ZlcnNpb259IGxvY2FsbHkgYW5kIGZyb20gb3JpZ2luYCkpXG4gICAgICAgIGNvbW1hbmQoXCJnaXRcIiwgW1widGFnXCIsIFwiLS1kZWxldGVcIiwgdmVyc2lvbl0sIHsgc3luYzogdHJ1ZSB9KVxuICAgICAgICBwdXNoKHZlcnNpb24sIHsgYXJnczogW1wiLS1kZWxldGVcIl0gfSlcbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgLy8gUmVtb3ZlIHRlbXBvcmFyeSBicmFuY2ggaWYgbmVlZGVkXG4gICAgaWYgKG1hcCAmJiAoIWRyeXJ1bikgJiYgYnJhbmNoLnRlbXBvcmFyeSkge1xuICAgICAgY29uc29sZS5lcnJvcihgc3dpdGNoaW5nIGJhY2sgdG8gJHticmFuY2guY3VycmVudH0gYW5kIGRlbGV0aW5nIHRlbXBvcmFyeSBicmFuY2ggJHticmFuY2gudGVtcG9yYXJ5fWApXG4gICAgICBjb21tYW5kKFwiZ2l0XCIsIFtcInN3aXRjaFwiLCBicmFuY2guY3VycmVudF0sIHsgc3luYzogdHJ1ZSB9KVxuICAgICAgY29tbWFuZChcImdpdFwiLCBbXCJicmFuY2hcIiwgXCItLWRlbGV0ZVwiLCBcIi0tZm9yY2VcIiwgYnJhbmNoLnRlbXBvcmFyeV0sIHsgc3luYzogdHJ1ZSB9KVxuICAgICAgcHVzaChicmFuY2gudGVtcG9yYXJ5LCB7IGFyZ3M6IFtcIi0tZGVsZXRlXCJdIH0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgbmFtZSwgdmVyc2lvbiwgdXJsLCBjaGFuZ2VkOiB0cnVlIH1cbn1cblxuLyoqIFB1Ymxpc2hpbmcgb3B0aW9ucyBmb3Ige0BsaW5rY29kZSBwdWJsaXNoKCl9LiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtcbiAgLyoqIEdpdEh1YiBBUEkgdG9rZW4uICovXG4gIHRva2VuOiBzdHJpbmdcbiAgLyoqIEdpdEh1YiByZXBvc2l0b3J5IChlLmcuIGBvY3RvY2F0L2hlbGxvLXdvcmxkYCkuICovXG4gIHJlcG9zaXRvcnk6IHN0cmluZ1xuICAvKiogUGFja2FnZSBuYW1lIG9uIGRlbm8ubGFuZC94LiAqL1xuICBuYW1lOiBzdHJpbmdcbiAgLyoqIFZlcnNpb24gdG8gcHVibGlzaC4gKi9cbiAgdmVyc2lvbjogc3RyaW5nXG4gIC8qKiBTdWJkaXJlY3Rvcnkgb2YgdGhlIHJlcG9zaXRvcnkgdG8gcHVibGlzaCAob3B0aW9uYWwpLiAqL1xuICBkaXJlY3Rvcnk/OiBzdHJpbmdcbiAgLyoqIFBhdGggdG8gYW4gaW1wb3J0IG1hcC4gV2hlbiBzcGVjaWZpZWQsIGEgdGVtcG9yYXJ5IGJyYW5jaCB3aXRoIGFsbCBpbXBvcnRzIHJlc29sdmVkIGlzIGNyZWF0ZWQgYW5kIHB1Ymxpc2hlZCBpbnN0ZWFkLiAqL1xuICBtYXA/OiBzdHJpbmdcbiAgLyoqIEFjdGl2YXRlIHRoZSB3ZWJob29rIGJlZm9yZSBwdWJsaXNoaW5nIGFuZCByZXN0b3JlIGl0cyBzdGF0ZSBhZnRlcndhcmRzLiAqL1xuICByZWFjdGl2ZT86IGJvb2xlYW5cbiAgLyoqIFJlbW92ZSB0aGUgdGFnIGFmdGVyIHB1Ymxpc2hpbmcuICovXG4gIHJlbW92ZT86IGJvb2xlYW5cbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzIGZvciBwdWJsaXNoaW5nIG9wZXJhdGlvbnMgdG8gY29tcGxldGUuICovXG4gIGF0dGVtcHRzPzogbnVtYmVyXG4gIC8qKiBEZWxheSBiZXR3ZWVuIGVhY2ggYXR0ZW1wdCAoaW4gbWlsbGlzZWNvbmRzKS4gKi9cbiAgZGVsYXk/OiBudW1iZXJcbiAgLyoqIERvIG5vdCBhY3R1YWxseSBwdWJsaXNoIChubyBmaWxlIGlzIHdyaXR0ZW4gYW5kIG5vIG11dGF0aW5nIGdpdCBvciByZW1vdGUgY2FsbCBpcyBtYWRlKS4gKi9cbiAgZHJ5cnVuPzogYm9vbGVhblxuICAvKiogRmV0Y2ggaW1wbGVtZW50YXRpb24gKG1vc3RseSB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzKS4gKi9cbiAgZmV0Y2hlcj86IHR5cGVvZiBmZXRjaFxufVxuXG4vLyBFbnRyeSBwb2ludFxuaWYgKGltcG9ydC5tZXRhLm1haW4pIHtcbiAgY29uc3QgYXJncyA9IHBhcnNlQXJncyhEZW5vLmFyZ3MsIHtcbiAgICBzdHJpbmc6IFtcInRva2VuXCIsIFwicmVwb3NpdG9yeVwiLCBcIm5hbWVcIiwgXCJ2ZXJzaW9uXCIsIFwiZGlyZWN0b3J5XCIsIFwibWFwXCIsIFwiYXR0ZW1wdHNcIiwgXCJkZWxheVwiXSxcbiAgICBib29sZWFuOiBbXCJyZWFjdGl2ZVwiLCBcInJlbW92ZVwiLCBcImRyeXJ1blwiLCBcImhlbHBcIl0sXG4gIH0pXG4gIGlmIChhcmdzLmhlbHApIHtcbiAgICBjb25zb2xlLmVycm9yKFwiVXNhZ2U6IGRlbm8gcnVuIC0tYWxsb3ctYWxsIGpzcjpAbGlicy90b29sYm94L3NjcmlwdHMvcHVibGlzaC94IC0tdG9rZW4gPHRva2VuPiAtLXJlcG9zaXRvcnkgPG93bmVyL3JlcG8+IFtvcHRpb25zXVwiKVxuICAgIGNvbnNvbGUuZXJyb3IoXCJcIilcbiAgICBjb25zb2xlLmVycm9yKFwiT3B0aW9uczpcIilcbiAgICBjb25zb2xlLmVycm9yKFwiICAtLXRva2VuIDx0b2tlbj4gICAgICAgICAgICBHaXRIdWIgQVBJIHRva2VuXCIpXG4gICAgY29uc29sZS5lcnJvcihcIiAgLS1yZXBvc2l0b3J5IDxvd25lci9yZXBvPiAgR2l0SHViIHJlcG9zaXRvcnlcIilcbiAgICBjb25zb2xlLmVycm9yKFwiICAtLW5hbWUgW25hbWVdICAgICAgICAgICAgICBQYWNrYWdlIG5hbWUgb24gZGVuby5sYW5kL3ggKGRlZmF1bHRzIHRvIHRoZSB1bnNjb3BlZCBuYW1lIGZyb20gdGhlIGRlbm8uanNvbihjKSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpXCIpXG4gICAgY29uc29sZS5lcnJvcihcIiAgLS12ZXJzaW9uIFt2ZXJzaW9uXSAgICAgICAgVmVyc2lvbiB0byBwdWJsaXNoIChkZWZhdWx0cyB0byB0aGUgdmVyc2lvbiBmcm9tIHRoZSBkZW5vLmpzb24oYykgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5KVwiKVxuICAgIGNvbnNvbGUuZXJyb3IoXCIgIC0tZGlyZWN0b3J5IFtkaXJlY3RvcnldICAgIFN1YmRpcmVjdG9yeSBvZiB0aGUgcmVwb3NpdG9yeSB0byBwdWJsaXNoXCIpXG4gICAgY29uc29sZS5lcnJvcihcIiAgLS1tYXAgW21hcF0gICAgICAgICAgICAgICAgSW1wb3J0IG1hcCBwYXRoLCB3aGVuIHNwZWNpZmllZCBpbXBvcnRzIGFyZSByZXNvbHZlZCBvbiBhIHRlbXBvcmFyeSBicmFuY2ggd2hpY2ggaXMgcHVibGlzaGVkIGluc3RlYWRcIilcbiAgICBjb25zb2xlLmVycm9yKFwiICAtLXJlYWN0aXZlICAgICAgICAgICAgICAgICBBY3RpdmF0ZSB0aGUgd2ViaG9vayBiZWZvcmUgcHVibGlzaGluZyBhbmQgcmVzdG9yZSBpdHMgc3RhdGUgYWZ0ZXJ3YXJkc1wiKVxuICAgIGNvbnNvbGUuZXJyb3IoXCIgIC0tcmVtb3ZlICAgICAgICAgICAgICAgICAgIFJlbW92ZSB0aGUgdGFnIGFmdGVyIHB1Ymxpc2hpbmdcIilcbiAgICBjb25zb2xlLmVycm9yKFwiICAtLWF0dGVtcHRzIFthdHRlbXB0cz0zMF0gICBNYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyBmb3IgcHVibGlzaGluZyBvcGVyYXRpb25zIHRvIGNvbXBsZXRlXCIpXG4gICAgY29uc29sZS5lcnJvcihcIiAgLS1kZWxheSBbZGVsYXk9MzAwMDBdICAgICAgRGVsYXkgYmV0d2VlbiBlYWNoIGF0dGVtcHQgKGluIG1pbGxpc2Vjb25kcylcIilcbiAgICBjb25zb2xlLmVycm9yKFwiICAtLWRyeXJ1biAgICAgICAgICAgICAgICAgICBEbyBub3QgYWN0dWFsbHkgcHVibGlzaFwiKVxuICAgIERlbm8uZXhpdCgyKVxuICB9XG4gIGlmICgoIWFyZ3MubmFtZSkgfHwgKCFhcmdzLnZlcnNpb24pKSB7XG4gICAgY29uc3QgeyBuYW1lID0gXCJcIiwgdmVyc2lvbiA9IFwiXCIgfSA9IChhd2FpdCBtYW5pZmVzdChEZW5vLmN3ZCgpKSkgPz8ge31cbiAgICBhcmdzLm5hbWUgfHw9IG5hbWUuc3BsaXQoXCIvXCIpLmF0KC0xKSFcbiAgICBhcmdzLnZlcnNpb24gfHw9IHZlcnNpb25cbiAgfVxuICBjb25zdCB7IHRva2VuID0gXCJcIiwgcmVwb3NpdG9yeSA9IFwiXCIsIG5hbWUgPSBcIlwiLCB2ZXJzaW9uID0gXCJcIiwgZGlyZWN0b3J5LCBtYXAsIHJlYWN0aXZlLCByZW1vdmUsIGRyeXJ1biB9ID0gYXJnc1xuICBhd2FpdCBwdWJsaXNoKHsgdG9rZW4sIHJlcG9zaXRvcnksIG5hbWUsIHZlcnNpb24sIGRpcmVjdG9yeSwgbWFwLCByZWFjdGl2ZSwgcmVtb3ZlLCBkcnlydW4sIGF0dGVtcHRzOiBOdW1iZXIoYXJncy5hdHRlbXB0cykgfHwgdW5kZWZpbmVkLCBkZWxheTogTnVtYmVyKGFyZ3MuZGVsYXkpIHx8IHVuZGVmaW5lZCB9KVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1DQUFtQztBQUNuQzs7Ozs7Ozs7Ozs7Ozs7O0NBZUMsR0FFRCxVQUFVO0FBQ1YsU0FBUyxTQUFTLFFBQVEsV0FBVTtBQUNwQyxTQUFTLFVBQVUsUUFBUSxVQUFTO0FBQ3BDLFNBQVMsT0FBTyxFQUFFLE9BQU8sUUFBUSxZQUFXO0FBQzVDLFNBQVMsT0FBTyxRQUFRLG9CQUFtQjtB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
package/timezone.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ /** Supported timezones in the current runtime. */ export declare const timezones: string[];
2
+ /** Current timezone in the runtime. */ export declare const timezone: string;
package/timezone.js ADDED
@@ -0,0 +1,8 @@
1
+ /** Supported timezones in the current runtime. */ export const timezones = [
2
+ ...new Set([
3
+ ...Intl.supportedValuesOf("timeZone"),
4
+ "UTC"
5
+ ])
6
+ ];
7
+ /** Current timezone in the runtime. */ export const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvdG9vbGJveC90aW1lem9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogU3VwcG9ydGVkIHRpbWV6b25lcyBpbiB0aGUgY3VycmVudCBydW50aW1lLiAqL1xuZXhwb3J0IGNvbnN0IHRpbWV6b25lcyA9IFsuLi5uZXcgU2V0KFsuLi5JbnRsLnN1cHBvcnRlZFZhbHVlc09mKFwidGltZVpvbmVcIiksIFwiVVRDXCJdKV0gYXMgc3RyaW5nW11cblxuLyoqIEN1cnJlbnQgdGltZXpvbmUgaW4gdGhlIHJ1bnRpbWUuICovXG5leHBvcnQgY29uc3QgdGltZXpvbmUgPSBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUgYXMgc3RyaW5nXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0RBQWdELEdBQ2hELE9BQU8sTUFBTSxZQUFZO0tBQUksSUFBSSxJQUFJO09BQUksS0FBSyxpQkFBaUIsQ0FBQztJQUFhO0dBQU07Q0FBRSxDQUFZO0FBRWpHLHFDQUFxQyxHQUNyQyxPQUFPLE1BQU0sV0FBVyxLQUFLLGNBQWMsR0FBRyxlQUFlLEdBQUcsUUFBUSxDQUFVIn0=