@discordeno/rest 19.0.0-next.fe00a6f → 19.0.0

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 (44) hide show
  1. package/README.md +15 -1
  2. package/dist/esm/index.js +8 -0
  3. package/dist/esm/invalidBucket.js +82 -0
  4. package/dist/esm/manager.js +1493 -0
  5. package/dist/esm/queue.js +154 -0
  6. package/dist/esm/routes.js +579 -0
  7. package/dist/esm/types.js +3 -0
  8. package/dist/esm/typings/routes.js +3 -0
  9. package/dist/types/index.d.ts.map +1 -0
  10. package/dist/{invalidBucket.d.ts → types/invalidBucket.d.ts} +5 -0
  11. package/dist/types/invalidBucket.d.ts.map +1 -0
  12. package/dist/types/manager.d.ts.map +1 -0
  13. package/dist/{queue.d.ts → types/queue.d.ts} +12 -1
  14. package/dist/types/queue.d.ts.map +1 -0
  15. package/dist/types/routes.d.ts.map +1 -0
  16. package/dist/{types.d.ts → types/types.d.ts} +798 -317
  17. package/dist/types/types.d.ts.map +1 -0
  18. package/dist/{typings → types/typings}/routes.d.ts +69 -6
  19. package/dist/types/typings/routes.d.ts.map +1 -0
  20. package/package.json +34 -30
  21. package/dist/index.d.ts.map +0 -1
  22. package/dist/index.js +0 -8
  23. package/dist/index.js.map +0 -1
  24. package/dist/invalidBucket.d.ts.map +0 -1
  25. package/dist/invalidBucket.js +0 -82
  26. package/dist/invalidBucket.js.map +0 -1
  27. package/dist/manager.d.ts.map +0 -1
  28. package/dist/manager.js +0 -1139
  29. package/dist/manager.js.map +0 -1
  30. package/dist/queue.d.ts.map +0 -1
  31. package/dist/queue.js +0 -153
  32. package/dist/queue.js.map +0 -1
  33. package/dist/routes.d.ts.map +0 -1
  34. package/dist/routes.js +0 -487
  35. package/dist/routes.js.map +0 -1
  36. package/dist/types.d.ts.map +0 -1
  37. package/dist/types.js +0 -3
  38. package/dist/types.js.map +0 -1
  39. package/dist/typings/routes.d.ts.map +0 -1
  40. package/dist/typings/routes.js +0 -3
  41. package/dist/typings/routes.js.map +0 -1
  42. /package/dist/{index.d.ts → types/index.d.ts} +0 -0
  43. /package/dist/{manager.d.ts → types/manager.d.ts} +0 -0
  44. /package/dist/{routes.d.ts → types/routes.d.ts} +0 -0
package/README.md CHANGED
@@ -1,6 +1,14 @@
1
1
  # Discordeno Rest
2
2
 
3
- A standalone and server-less REST module with functionality of REST, independently.
3
+ <img align="right" src="https://raw.githubusercontent.com/discordeno/discordeno/main/website/static/img/logo.png" height="150px" />
4
+
5
+ Discord API library for [Node.JS](https://nodejs.org), [Deno](https://deno.land) & [Bun](https://bun.sh/)
6
+
7
+ [![Discord](https://img.shields.io/discord/785384884197392384?color=7289da&logo=discord&logoColor=dark)](https://discord.com/invite/5vBgXk3UcZ)
8
+ [![codecov](https://codecov.io/gh/discordeno/discordeno/branch/main/graph/badge.svg?token=SQI9OYJ7AK)](https://codecov.io/gh/discordeno/discordeno)
9
+ ![action status](https://github.com/discordeno/discordeno/actions/workflows/lib-check.yml/badge.svg?event=push)
10
+
11
+ A standalone REST module with functionality of REST, independently.
4
12
 
5
13
  - Easily host on any serverless infrastructure.
6
14
  - Easy to use and setup with Cloudflare Workers (FREE for 100K requests per day!)
@@ -14,3 +22,9 @@ A standalone and server-less REST module with functionality of REST, independent
14
22
  - Seamless updates! When you want to update and reboot the bot, you could potentially lose tons of messages or
15
23
  responses that are in queue. Using this you could restart your bot without ever worrying about losing any responses.
16
24
  - Scalability! Scalability! Scalability!
25
+
26
+ ## Links
27
+
28
+ - [Website](https://discordeno.js.org/)
29
+ - [Documentation](https://doc.deno.land/https/deno.land/x/discordeno/mod.ts)
30
+ - [Discord](https://discord.com/invite/5vBgXk3UcZ)
@@ -0,0 +1,8 @@
1
+ export * from './typings/routes.js';
2
+ export * from './invalidBucket.js';
3
+ export * from './manager.js';
4
+ export * from './queue.js';
5
+ export * from './routes.js';
6
+ export * from './types.js';
7
+
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3R5cGluZ3Mvcm91dGVzLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi9pbnZhbGlkQnVja2V0LmpzJ1xuZXhwb3J0ICogZnJvbSAnLi9tYW5hZ2VyLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi9xdWV1ZS5qcydcbmV4cG9ydCAqIGZyb20gJy4vcm91dGVzLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy5qcydcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHNCQUFxQjtBQUNuQyxjQUFjLHFCQUFvQjtBQUNsQyxjQUFjLGVBQWM7QUFDNUIsY0FBYyxhQUFZO0FBQzFCLGNBQWMsY0FBYTtBQUMzQixjQUFjLGFBQVkifQ==
@@ -0,0 +1,82 @@
1
+ import { delay, logger } from '@discordeno/utils';
2
+ /**
3
+ * A invalid request bucket is used in a similar manner as a leaky bucket but a invalid request bucket can be refilled as needed.
4
+ * It's purpose is to make sure the bot does not hit the limit to getting a 1 hr ban.
5
+ *
6
+ * @param options The options used to configure this bucket.
7
+ * @returns RefillingBucket
8
+ */ export function createInvalidRequestBucket(options) {
9
+ const bucket = {
10
+ invalidRequests: options.current ?? 0,
11
+ max: options.max ?? 10000,
12
+ interval: options.interval ?? 600_000,
13
+ resetAt: options.resetAt,
14
+ safety: options.safety ?? 1,
15
+ errorStatuses: options.errorStatuses ?? [
16
+ 401,
17
+ 403,
18
+ 429
19
+ ],
20
+ activeRequests: options.requested ?? 0,
21
+ processing: false,
22
+ logger: options.logger ?? logger,
23
+ waiting: [],
24
+ requestsAllowed: function() {
25
+ if (bucket.resetAt !== undefined && Date.now() >= bucket.resetAt) {
26
+ bucket.invalidRequests = 0;
27
+ bucket.resetAt = Date.now() + bucket.interval;
28
+ }
29
+ return bucket.max - bucket.invalidRequests - bucket.activeRequests - bucket.safety;
30
+ },
31
+ isRequestAllowed: function() {
32
+ return bucket.requestsAllowed() > 0;
33
+ },
34
+ waitUntilRequestAvailable: async function() {
35
+ return await new Promise(async (resolve)=>{
36
+ // If whatever amount of requests is left is more than the safety margin, allow the request
37
+ if (bucket.isRequestAllowed()) {
38
+ bucket.activeRequests += 1;
39
+ resolve();
40
+ } else {
41
+ bucket.waiting.push(resolve);
42
+ await bucket.processWaiting();
43
+ }
44
+ });
45
+ },
46
+ processWaiting: async function() {
47
+ // If already processing, that loop will handle all waiting requests.
48
+ if (bucket.processing) return;
49
+ // Mark as processing so other loops don't start
50
+ bucket.processing = true;
51
+ while(bucket.waiting.length > 0){
52
+ bucket.logger.info(`[InvalidBucket] processing waiting queue while loop ran with ${bucket.waiting.length} pending requests to be made. ${JSON.stringify(bucket)}`);
53
+ if (!bucket.isRequestAllowed() && bucket.resetAt !== undefined) {
54
+ bucket.logger.warn(`[InvalidBucket] processing waiting queue is now paused until more requests are available. ${bucket.waiting.length} pending requests. ${JSON.stringify(bucket)}`);
55
+ await delay(bucket.resetAt - Date.now());
56
+ }
57
+ bucket.activeRequests += 1;
58
+ // Resolve the next item in the queue
59
+ bucket.waiting.shift()?.();
60
+ }
61
+ // Mark as false so next pending request can be triggered by new loop.
62
+ bucket.processing = false;
63
+ },
64
+ handleCompletedRequest: function(code, sharedScope) {
65
+ // Since request is complete, we can remove one from requested.
66
+ bucket.activeRequests -= 1;
67
+ // Since it is as a valid request, we don't need to do anything
68
+ if (!bucket.errorStatuses.includes(code)) return;
69
+ // Shared scope is not considered invalid
70
+ if (code === 429 && sharedScope) return;
71
+ // INVALID REQUEST WAS MADE
72
+ if (bucket.resetAt === undefined) {
73
+ bucket.resetAt = Date.now() + bucket.interval;
74
+ }
75
+ bucket.invalidRequests += 1;
76
+ bucket.logger.warn(`[InvalidBucket] an invalid request was made. Increasing invalidRequests count to ${bucket.invalidRequests}`);
77
+ }
78
+ };
79
+ return bucket;
80
+ }
81
+
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnZhbGlkQnVja2V0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlbGF5LCBsb2dnZXIgfSBmcm9tICdAZGlzY29yZGVuby91dGlscydcblxuLyoqXG4gKiBBIGludmFsaWQgcmVxdWVzdCBidWNrZXQgaXMgdXNlZCBpbiBhIHNpbWlsYXIgbWFubmVyIGFzIGEgbGVha3kgYnVja2V0IGJ1dCBhIGludmFsaWQgcmVxdWVzdCBidWNrZXQgY2FuIGJlIHJlZmlsbGVkIGFzIG5lZWRlZC5cbiAqIEl0J3MgcHVycG9zZSBpcyB0byBtYWtlIHN1cmUgdGhlIGJvdCBkb2VzIG5vdCBoaXQgdGhlIGxpbWl0IHRvIGdldHRpbmcgYSAxIGhyIGJhbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGlzIGJ1Y2tldC5cbiAqIEByZXR1cm5zIFJlZmlsbGluZ0J1Y2tldFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQob3B0aW9uczogSW52YWxpZFJlcXVlc3RCdWNrZXRPcHRpb25zKTogSW52YWxpZFJlcXVlc3RCdWNrZXQge1xuICBjb25zdCBidWNrZXQ6IEludmFsaWRSZXF1ZXN0QnVja2V0ID0ge1xuICAgIGludmFsaWRSZXF1ZXN0czogb3B0aW9ucy5jdXJyZW50ID8/IDAsXG4gICAgbWF4OiBvcHRpb25zLm1heCA/PyAxMDAwMCxcbiAgICBpbnRlcnZhbDogb3B0aW9ucy5pbnRlcnZhbCA/PyA2MDBfMDAwLCAvLyAxMCBtaW51dGVzXG4gICAgcmVzZXRBdDogb3B0aW9ucy5yZXNldEF0LFxuICAgIHNhZmV0eTogb3B0aW9ucy5zYWZldHkgPz8gMSxcbiAgICBlcnJvclN0YXR1c2VzOiBvcHRpb25zLmVycm9yU3RhdHVzZXMgPz8gWzQwMSwgNDAzLCA0MjldLFxuICAgIGFjdGl2ZVJlcXVlc3RzOiBvcHRpb25zLnJlcXVlc3RlZCA/PyAwLFxuICAgIHByb2Nlc3Npbmc6IGZhbHNlLFxuICAgIGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyLFxuXG4gICAgd2FpdGluZzogW10sXG5cbiAgICByZXF1ZXN0c0FsbG93ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChidWNrZXQucmVzZXRBdCAhPT0gdW5kZWZpbmVkICYmIERhdGUubm93KCkgPj0gYnVja2V0LnJlc2V0QXQpIHtcbiAgICAgICAgYnVja2V0LmludmFsaWRSZXF1ZXN0cyA9IDBcbiAgICAgICAgYnVja2V0LnJlc2V0QXQgPSBEYXRlLm5vdygpICsgYnVja2V0LmludGVydmFsXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBidWNrZXQubWF4IC0gYnVja2V0LmludmFsaWRSZXF1ZXN0cyAtIGJ1Y2tldC5hY3RpdmVSZXF1ZXN0cyAtIGJ1Y2tldC5zYWZldHlcbiAgICB9LFxuXG4gICAgaXNSZXF1ZXN0QWxsb3dlZDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGJ1Y2tldC5yZXF1ZXN0c0FsbG93ZWQoKSA+IDBcbiAgICB9LFxuXG4gICAgd2FpdFVudGlsUmVxdWVzdEF2YWlsYWJsZTogYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICAgIC8vIElmIHdoYXRldmVyIGFtb3VudCBvZiByZXF1ZXN0cyBpcyBsZWZ0IGlzIG1vcmUgdGhhbiB0aGUgc2FmZXR5IG1hcmdpbiwgYWxsb3cgdGhlIHJlcXVlc3RcbiAgICAgICAgaWYgKGJ1Y2tldC5pc1JlcXVlc3RBbGxvd2VkKCkpIHtcbiAgICAgICAgICBidWNrZXQuYWN0aXZlUmVxdWVzdHMgKz0gMVxuICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1Y2tldC53YWl0aW5nLnB1c2gocmVzb2x2ZSlcbiAgICAgICAgICBhd2FpdCBidWNrZXQucHJvY2Vzc1dhaXRpbmcoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBwcm9jZXNzV2FpdGluZzogYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gSWYgYWxyZWFkeSBwcm9jZXNzaW5nLCB0aGF0IGxvb3Agd2lsbCBoYW5kbGUgYWxsIHdhaXRpbmcgcmVxdWVzdHMuXG4gICAgICBpZiAoYnVja2V0LnByb2Nlc3NpbmcpIHJldHVyblxuXG4gICAgICAvLyBNYXJrIGFzIHByb2Nlc3Npbmcgc28gb3RoZXIgbG9vcHMgZG9uJ3Qgc3RhcnRcbiAgICAgIGJ1Y2tldC5wcm9jZXNzaW5nID0gdHJ1ZVxuXG4gICAgICB3aGlsZSAoYnVja2V0LndhaXRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICBidWNrZXQubG9nZ2VyLmluZm8oXG4gICAgICAgICAgYFtJbnZhbGlkQnVja2V0XSBwcm9jZXNzaW5nIHdhaXRpbmcgcXVldWUgd2hpbGUgbG9vcCByYW4gd2l0aCAke2J1Y2tldC53YWl0aW5nLmxlbmd0aH0gcGVuZGluZyByZXF1ZXN0cyB0byBiZSBtYWRlLiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgYnVja2V0LFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKVxuXG4gICAgICAgIGlmICghYnVja2V0LmlzUmVxdWVzdEFsbG93ZWQoKSAmJiBidWNrZXQucmVzZXRBdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYnVja2V0LmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFtJbnZhbGlkQnVja2V0XSBwcm9jZXNzaW5nIHdhaXRpbmcgcXVldWUgaXMgbm93IHBhdXNlZCB1bnRpbCBtb3JlIHJlcXVlc3RzIGFyZSBhdmFpbGFibGUuICR7XG4gICAgICAgICAgICAgIGJ1Y2tldC53YWl0aW5nLmxlbmd0aFxuICAgICAgICAgICAgfSBwZW5kaW5nIHJlcXVlc3RzLiAke0pTT04uc3RyaW5naWZ5KGJ1Y2tldCl9YCxcbiAgICAgICAgICApXG4gICAgICAgICAgYXdhaXQgZGVsYXkoYnVja2V0LnJlc2V0QXQgLSBEYXRlLm5vdygpKVxuICAgICAgICB9XG5cbiAgICAgICAgYnVja2V0LmFjdGl2ZVJlcXVlc3RzICs9IDFcbiAgICAgICAgLy8gUmVzb2x2ZSB0aGUgbmV4dCBpdGVtIGluIHRoZSBxdWV1ZVxuICAgICAgICBidWNrZXQud2FpdGluZy5zaGlmdCgpPy4oKVxuICAgICAgfVxuXG4gICAgICAvLyBNYXJrIGFzIGZhbHNlIHNvIG5leHQgcGVuZGluZyByZXF1ZXN0IGNhbiBiZSB0cmlnZ2VyZWQgYnkgbmV3IGxvb3AuXG4gICAgICBidWNrZXQucHJvY2Vzc2luZyA9IGZhbHNlXG4gICAgfSxcblxuICAgIGhhbmRsZUNvbXBsZXRlZFJlcXVlc3Q6IGZ1bmN0aW9uIChjb2RlLCBzaGFyZWRTY29wZSkge1xuICAgICAgLy8gU2luY2UgcmVxdWVzdCBpcyBjb21wbGV0ZSwgd2UgY2FuIHJlbW92ZSBvbmUgZnJvbSByZXF1ZXN0ZWQuXG4gICAgICBidWNrZXQuYWN0aXZlUmVxdWVzdHMgLT0gMVxuICAgICAgLy8gU2luY2UgaXQgaXMgYXMgYSB2YWxpZCByZXF1ZXN0LCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nXG4gICAgICBpZiAoIWJ1Y2tldC5lcnJvclN0YXR1c2VzLmluY2x1ZGVzKGNvZGUpKSByZXR1cm5cbiAgICAgIC8vIFNoYXJlZCBzY29wZSBpcyBub3QgY29uc2lkZXJlZCBpbnZhbGlkXG4gICAgICBpZiAoY29kZSA9PT0gNDI5ICYmIHNoYXJlZFNjb3BlKSByZXR1cm5cblxuICAgICAgLy8gSU5WQUxJRCBSRVFVRVNUIFdBUyBNQURFXG4gICAgICBpZiAoYnVja2V0LnJlc2V0QXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBidWNrZXQucmVzZXRBdCA9IERhdGUubm93KCkgKyBidWNrZXQuaW50ZXJ2YWxcbiAgICAgIH1cblxuICAgICAgYnVja2V0LmludmFsaWRSZXF1ZXN0cyArPSAxXG4gICAgICBidWNrZXQubG9nZ2VyLndhcm4oYFtJbnZhbGlkQnVja2V0XSBhbiBpbnZhbGlkIHJlcXVlc3Qgd2FzIG1hZGUuIEluY3JlYXNpbmcgaW52YWxpZFJlcXVlc3RzIGNvdW50IHRvICR7YnVja2V0LmludmFsaWRSZXF1ZXN0c31gKVxuICAgIH0sXG4gIH1cblxuICByZXR1cm4gYnVja2V0XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52YWxpZFJlcXVlc3RCdWNrZXRPcHRpb25zIHtcbiAgLyoqIGN1cnJlbnQgaW52YWxpZCBhbW91bnQgKi9cbiAgY3VycmVudD86IG51bWJlclxuICAvKiogbWF4IGludmFsaWQgcmVxdWVzdHMgYWxsb3dlZCB1bnRpbCBiYW4uIERlZmF1bHRzIHRvIDEwLDAwMCAqL1xuICBtYXg/OiBudW1iZXJcbiAgLyoqIFRoZSB0aW1lIHRoYXQgZGlzY29yZCBhbGxvd3MgdG8gbWFrZSB0aGUgbWF4IG51bWJlciBvZiBpbnZhbGlkIHJlcXVlc3RzLiBEZWZhdWx0cyB0byAxMCBtaW51dGVzICovXG4gIGludGVydmFsPzogbnVtYmVyXG4gIC8qKiBXaGVuIHRoZSB0aW1lb3V0IGZvciB0aGUgYnVja2V0IGhhcyBzdGFydGVkIGF0LiAqL1xuICByZXNldEF0PzogbnVtYmVyXG4gIC8qKiBob3cgc2FmZSB0byBiZSBmcm9tIG1heC4gRGVmYXVsdHMgdG8gMSAqL1xuICBzYWZldHk/OiBudW1iZXJcbiAgLyoqIFRoZSByZXF1ZXN0IHN0YXR1c2VzIHRoYXQgY291bnQgYXMgYW4gaW52YWxpZCByZXF1ZXN0LiAqL1xuICBlcnJvclN0YXR1c2VzPzogbnVtYmVyW11cbiAgLyoqIFRoZSBhbW91bnQgb2YgcmVxdWVzdHMgdGhhdCB3ZXJlIHJlcXVlc3RlZCBmcm9tIHRoaXMgYnVja2V0LiAqL1xuICByZXF1ZXN0ZWQ/OiBudW1iZXJcbiAgLyoqIFRoZSBsb2dnZXIgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBidWNrZXQgKi9cbiAgbG9nZ2VyPzogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52YWxpZFJlcXVlc3RCdWNrZXQge1xuICAvKiogY3VycmVudCBpbnZhbGlkIGFtb3VudCAqL1xuICBpbnZhbGlkUmVxdWVzdHM6IG51bWJlclxuICAvKiogbWF4IGludmFsaWQgcmVxdWVzdHMgYWxsb3dlZCB1bnRpbCBiYW4uIERlZmF1bHRzIHRvIDEwLDAwMCAqL1xuICBtYXg6IG51bWJlclxuICAvKiogVGhlIHRpbWUgdGhhdCBkaXNjb3JkIGFsbG93cyB0byBtYWtlIHRoZSBtYXggbnVtYmVyIG9mIGludmFsaWQgcmVxdWVzdHMuIERlZmF1bHRzIHRvIDEwIG1pbnV0ZXMgKi9cbiAgaW50ZXJ2YWw6IG51bWJlclxuICAvKiogV2hlbiB0aGUgdGltZW91dCBmb3IgdGhpcyBidWNrZXQgaGFzIHN0YXJ0ZWQgYXQuICovXG4gIHJlc2V0QXQ6IG51bWJlciB8IHVuZGVmaW5lZFxuICAvKiogaG93IHNhZmUgdG8gYmUgZnJvbSBtYXguIERlZmF1bHRzIHRvIDEgKi9cbiAgc2FmZXR5OiBudW1iZXJcbiAgLyoqIFRoZSByZXF1ZXN0IHN0YXR1c2VzIHRoYXQgY291bnQgYXMgYW4gaW52YWxpZCByZXF1ZXN0LiAqL1xuICBlcnJvclN0YXR1c2VzOiBudW1iZXJbXVxuICAvKiogVGhlIGFtb3VudCBvZiByZXF1ZXN0cyB0aGF0IHdlcmUgcmVxdWVzdGVkIGZyb20gdGhpcyBidWNrZXQuICovXG4gIGFjdGl2ZVJlcXVlc3RzOiBudW1iZXJcbiAgLyoqIFRoZSByZXF1ZXN0cyB0aGF0IGFyZSBjdXJyZW50bHkgcGVuZGluZy4gKi9cbiAgd2FpdGluZzogQXJyYXk8KHZhbHVlOiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD4pID0+IHZvaWQ+XG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgd2FpdGluZyBxdWV1ZSBpcyBhbHJlYWR5IHByb2Nlc3NpbmcuICovXG4gIHByb2Nlc3Npbmc6IGJvb2xlYW5cbiAgLyoqIFRoZSBsb2dnZXIgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBidWNrZXQgKi9cbiAgbG9nZ2VyOiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cblxuICAvKiogR2l2ZXMgdGhlIG51bWJlciBvZiByZXF1ZXN0cyB0aGF0IGFyZSBjdXJyZW50bHkgYWxsb3dlZC4gKi9cbiAgcmVxdWVzdHNBbGxvd2VkOiAoKSA9PiBudW1iZXJcbiAgLyoqIENoZWNrcyBpZiBhIHJlcXVlc3QgaXMgYWxsb3dlZCBhdCB0aGlzIHRpbWUuICovXG4gIGlzUmVxdWVzdEFsbG93ZWQ6ICgpID0+IGJvb2xlYW5cbiAgLyoqIFdhaXRzIHVudGlsIGEgcmVxdWVzdCBpcyBhdmFpbGFibGUgKi9cbiAgd2FpdFVudGlsUmVxdWVzdEF2YWlsYWJsZTogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogQmVnaW5zIHByb2Nlc3NpbmcgdGhlIHdhaXRpbmcgcXVldWUgb2YgcmVxdWVzdHMuICovXG4gIHByb2Nlc3NXYWl0aW5nOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBIYW5kbGVyIGZvciB3aGVuZXZlciBhIHJlcXVlc3QgaXMgdmFsaWRhdGVkLiBUaGlzIHNob3VsZCB1cGRhdGUgdGhlIHJlcXVlc3RlZCB2YWx1ZXMgb3IgdHJpZ2dlciBhbnkgb3RoZXIgbmVjZXNzYXJ5IHN0dWZmLiAqL1xuICBoYW5kbGVDb21wbGV0ZWRSZXF1ZXN0OiAoY29kZTogbnVtYmVyLCBzaGFyZWRTY29wZTogYm9vbGVhbikgPT4gdm9pZFxufVxuIl0sIm5hbWVzIjpbImRlbGF5IiwibG9nZ2VyIiwiY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQiLCJvcHRpb25zIiwiYnVja2V0IiwiaW52YWxpZFJlcXVlc3RzIiwiY3VycmVudCIsIm1heCIsImludGVydmFsIiwicmVzZXRBdCIsInNhZmV0eSIsImVycm9yU3RhdHVzZXMiLCJhY3RpdmVSZXF1ZXN0cyIsInJlcXVlc3RlZCIsInByb2Nlc3NpbmciLCJ3YWl0aW5nIiwicmVxdWVzdHNBbGxvd2VkIiwidW5kZWZpbmVkIiwiRGF0ZSIsIm5vdyIsImlzUmVxdWVzdEFsbG93ZWQiLCJ3YWl0VW50aWxSZXF1ZXN0QXZhaWxhYmxlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJwdXNoIiwicHJvY2Vzc1dhaXRpbmciLCJsZW5ndGgiLCJpbmZvIiwiSlNPTiIsInN0cmluZ2lmeSIsIndhcm4iLCJzaGlmdCIsImhhbmRsZUNvbXBsZXRlZFJlcXVlc3QiLCJjb2RlIiwic2hhcmVkU2NvcGUiLCJpbmNsdWRlcyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsS0FBSyxFQUFFQyxNQUFNLFFBQVEsb0JBQW1CO0FBRWpEOzs7Ozs7Q0FNQyxHQUNELE9BQU8sU0FBU0MsMkJBQTJCQyxPQUFvQztJQUM3RSxNQUFNQyxTQUErQjtRQUNuQ0MsaUJBQWlCRixRQUFRRyxPQUFPLElBQUk7UUFDcENDLEtBQUtKLFFBQVFJLEdBQUcsSUFBSTtRQUNwQkMsVUFBVUwsUUFBUUssUUFBUSxJQUFJO1FBQzlCQyxTQUFTTixRQUFRTSxPQUFPO1FBQ3hCQyxRQUFRUCxRQUFRTyxNQUFNLElBQUk7UUFDMUJDLGVBQWVSLFFBQVFRLGFBQWEsSUFBSTtZQUFDO1lBQUs7WUFBSztTQUFJO1FBQ3ZEQyxnQkFBZ0JULFFBQVFVLFNBQVMsSUFBSTtRQUNyQ0MsWUFBWTtRQUNaYixRQUFRRSxRQUFRRixNQUFNLElBQUlBO1FBRTFCYyxTQUFTLEVBQUU7UUFFWEMsaUJBQWlCO1lBQ2YsSUFBSVosT0FBT0ssT0FBTyxLQUFLUSxhQUFhQyxLQUFLQyxHQUFHLE1BQU1mLE9BQU9LLE9BQU8sRUFBRTtnQkFDaEVMLE9BQU9DLGVBQWUsR0FBRztnQkFDekJELE9BQU9LLE9BQU8sR0FBR1MsS0FBS0MsR0FBRyxLQUFLZixPQUFPSSxRQUFRO1lBQy9DO1lBRUEsT0FBT0osT0FBT0csR0FBRyxHQUFHSCxPQUFPQyxlQUFlLEdBQUdELE9BQU9RLGNBQWMsR0FBR1IsT0FBT00sTUFBTTtRQUNwRjtRQUVBVSxrQkFBa0I7WUFDaEIsT0FBT2hCLE9BQU9ZLGVBQWUsS0FBSztRQUNwQztRQUVBSywyQkFBMkI7WUFDekIsT0FBTyxNQUFNLElBQUlDLFFBQVEsT0FBT0M7Z0JBQzlCLDJGQUEyRjtnQkFDM0YsSUFBSW5CLE9BQU9nQixnQkFBZ0IsSUFBSTtvQkFDN0JoQixPQUFPUSxjQUFjLElBQUk7b0JBQ3pCVztnQkFDRixPQUFPO29CQUNMbkIsT0FBT1csT0FBTyxDQUFDUyxJQUFJLENBQUNEO29CQUNwQixNQUFNbkIsT0FBT3FCLGNBQWM7Z0JBQzdCO1lBQ0Y7UUFDRjtRQUVBQSxnQkFBZ0I7WUFDZCxxRUFBcUU7WUFDckUsSUFBSXJCLE9BQU9VLFVBQVUsRUFBRTtZQUV2QixnREFBZ0Q7WUFDaERWLE9BQU9VLFVBQVUsR0FBRztZQUVwQixNQUFPVixPQUFPVyxPQUFPLENBQUNXLE1BQU0sR0FBRyxFQUFHO2dCQUNoQ3RCLE9BQU9ILE1BQU0sQ0FBQzBCLElBQUksQ0FDaEIsQ0FBQyw2REFBNkQsRUFBRXZCLE9BQU9XLE9BQU8sQ0FBQ1csTUFBTSxDQUFDLDhCQUE4QixFQUFFRSxLQUFLQyxTQUFTLENBQ2xJekIsU0FDQztnQkFHTCxJQUFJLENBQUNBLE9BQU9nQixnQkFBZ0IsTUFBTWhCLE9BQU9LLE9BQU8sS0FBS1EsV0FBVztvQkFDOURiLE9BQU9ILE1BQU0sQ0FBQzZCLElBQUksQ0FDaEIsQ0FBQywwRkFBMEYsRUFDekYxQixPQUFPVyxPQUFPLENBQUNXLE1BQU0sQ0FDdEIsbUJBQW1CLEVBQUVFLEtBQUtDLFNBQVMsQ0FBQ3pCLFNBQVM7b0JBRWhELE1BQU1KLE1BQU1JLE9BQU9LLE9BQU8sR0FBR1MsS0FBS0MsR0FBRztnQkFDdkM7Z0JBRUFmLE9BQU9RLGNBQWMsSUFBSTtnQkFDekIscUNBQXFDO2dCQUNyQ1IsT0FBT1csT0FBTyxDQUFDZ0IsS0FBSztZQUN0QjtZQUVBLHNFQUFzRTtZQUN0RTNCLE9BQU9VLFVBQVUsR0FBRztRQUN0QjtRQUVBa0Isd0JBQXdCLFNBQVVDLElBQUksRUFBRUMsV0FBVztZQUNqRCwrREFBK0Q7WUFDL0Q5QixPQUFPUSxjQUFjLElBQUk7WUFDekIsK0RBQStEO1lBQy9ELElBQUksQ0FBQ1IsT0FBT08sYUFBYSxDQUFDd0IsUUFBUSxDQUFDRixPQUFPO1lBQzFDLHlDQUF5QztZQUN6QyxJQUFJQSxTQUFTLE9BQU9DLGFBQWE7WUFFakMsMkJBQTJCO1lBQzNCLElBQUk5QixPQUFPSyxPQUFPLEtBQUtRLFdBQVc7Z0JBQ2hDYixPQUFPSyxPQUFPLEdBQUdTLEtBQUtDLEdBQUcsS0FBS2YsT0FBT0ksUUFBUTtZQUMvQztZQUVBSixPQUFPQyxlQUFlLElBQUk7WUFDMUJELE9BQU9ILE1BQU0sQ0FBQzZCLElBQUksQ0FBQyxDQUFDLGlGQUFpRixFQUFFMUIsT0FBT0MsZUFBZSxFQUFFO1FBQ2pJO0lBQ0Y7SUFFQSxPQUFPRDtBQUNUIn0=