github-issue-tower-defence-management 1.104.3 → 1.104.4

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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [1.104.4](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.104.3...v1.104.4) (2026-06-26)
2
+
3
+
4
+ ### Performance Improvements
5
+
6
+ * **schedule:** replace fetchProjectItems blanket 5s page sleep with reactive rate-limit backoff ([#993](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/993)) ([b8077a6](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/b8077a606ff0a589a2163e0bb611382c5ccaecca)), closes [#992](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/992)
7
+
1
8
  ## [1.104.3](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.104.2...v1.104.3) (2026-06-26)
2
9
 
3
10
 
@@ -1,14 +1,95 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
5
35
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.GraphqlProjectItemRepository = exports.FETCH_PROJECT_ITEMS_GRAPHQL_ERROR_PAYLOAD_MAX_LENGTH = exports.FETCH_PROJECT_ITEMS_INITIAL_PAGE_SIZE = exports.PAGINATION_DELAY_MS = void 0;
7
- const ky_1 = __importDefault(require("ky"));
36
+ exports.GraphqlProjectItemRepository = exports.callWithRateLimitRetry = exports.RATE_LIMIT_MAX_BACKOFF_MS = exports.RATE_LIMIT_DEFAULT_BACKOFF_MS = exports.RATE_LIMIT_MIN_BACKOFF_MS = exports.RATE_LIMIT_MAX_RETRIES = exports.FETCH_PROJECT_ITEMS_GRAPHQL_ERROR_PAYLOAD_MAX_LENGTH = exports.FETCH_PROJECT_ITEMS_INITIAL_PAGE_SIZE = exports.PAGINATION_DELAY_MS = void 0;
37
+ const ky_1 = __importStar(require("ky"));
8
38
  const BaseGitHubRepository_1 = require("../BaseGitHubRepository");
9
- exports.PAGINATION_DELAY_MS = 5000;
39
+ exports.PAGINATION_DELAY_MS = 500;
10
40
  exports.FETCH_PROJECT_ITEMS_INITIAL_PAGE_SIZE = 100;
11
41
  exports.FETCH_PROJECT_ITEMS_GRAPHQL_ERROR_PAYLOAD_MAX_LENGTH = 4000;
42
+ exports.RATE_LIMIT_MAX_RETRIES = 6;
43
+ exports.RATE_LIMIT_MIN_BACKOFF_MS = 1000;
44
+ exports.RATE_LIMIT_DEFAULT_BACKOFF_MS = 60000;
45
+ exports.RATE_LIMIT_MAX_BACKOFF_MS = 300000;
46
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
47
+ const parseNonNegativeIntegerHeader = (value) => {
48
+ if (value === null) {
49
+ return null;
50
+ }
51
+ const trimmed = value.trim();
52
+ if (!/^\d+$/.test(trimmed)) {
53
+ return null;
54
+ }
55
+ const parsed = Number.parseInt(trimmed, 10);
56
+ return Number.isFinite(parsed) ? parsed : null;
57
+ };
58
+ const computeRateLimitBackoffMs = (headers, attempt, nowMs) => {
59
+ const exponentialMs = Math.min(exports.RATE_LIMIT_MAX_BACKOFF_MS, exports.RATE_LIMIT_DEFAULT_BACKOFF_MS * Math.pow(2, attempt));
60
+ const retryAfterSeconds = parseNonNegativeIntegerHeader(headers?.get('retry-after') ?? null);
61
+ if (retryAfterSeconds !== null) {
62
+ return Math.min(exports.RATE_LIMIT_MAX_BACKOFF_MS, Math.max(exports.RATE_LIMIT_MIN_BACKOFF_MS, retryAfterSeconds * 1000));
63
+ }
64
+ const remaining = parseNonNegativeIntegerHeader(headers?.get('x-ratelimit-remaining') ?? null);
65
+ const resetEpochSeconds = parseNonNegativeIntegerHeader(headers?.get('x-ratelimit-reset') ?? null);
66
+ if (remaining === 0 && resetEpochSeconds !== null) {
67
+ const waitMs = resetEpochSeconds * 1000 - nowMs;
68
+ return Math.min(exports.RATE_LIMIT_MAX_BACKOFF_MS, Math.max(exports.RATE_LIMIT_MIN_BACKOFF_MS, waitMs));
69
+ }
70
+ return Math.max(exports.RATE_LIMIT_MIN_BACKOFF_MS, exponentialMs);
71
+ };
72
+ const isRateLimitStatus = (status) => status === 429 || status === 403;
73
+ const callWithRateLimitRetry = async (request) => {
74
+ let attempt = 0;
75
+ for (;;) {
76
+ try {
77
+ return await request();
78
+ }
79
+ catch (error) {
80
+ if (!(error instanceof ky_1.HTTPError) ||
81
+ !isRateLimitStatus(error.response.status) ||
82
+ attempt >= exports.RATE_LIMIT_MAX_RETRIES) {
83
+ throw error;
84
+ }
85
+ const backoffMs = computeRateLimitBackoffMs(error.response.headers, attempt, Date.now());
86
+ console.log(`fetchProjectItems: GitHub returned ${error.response.status} (rate limit). Backing off ${backoffMs}ms before retry ${attempt + 1}/${exports.RATE_LIMIT_MAX_RETRIES}.`);
87
+ await sleep(backoffMs);
88
+ attempt++;
89
+ }
90
+ }
91
+ };
92
+ exports.callWithRateLimitRetry = callWithRateLimitRetry;
12
93
  const stringifyGraphqlErrorsForLog = (errors) => {
13
94
  const serialized = JSON.stringify(errors);
14
95
  if (serialized.length <= exports.FETCH_PROJECT_ITEMS_GRAPHQL_ERROR_PAYLOAD_MAX_LENGTH) {
@@ -192,14 +273,14 @@ query GetProjectItems($projectId: ID!, $after: String, $first: Int!) {
192
273
  first: first,
193
274
  },
194
275
  };
195
- const response = await ky_1.default
276
+ const response = await (0, exports.callWithRateLimitRetry)(() => ky_1.default
196
277
  .post('https://api.github.com/graphql', {
197
278
  json: graphqlQuery,
198
279
  headers: {
199
280
  Authorization: `Bearer ${this.ghToken}`,
200
281
  },
201
282
  })
202
- .json();
283
+ .json());
203
284
  if (response.errors && response.errors.length > 0) {
204
285
  throw new Error(`GitHub GraphQL errors: ${stringifyGraphqlErrorsForLog(response.errors)}`);
205
286
  }
@@ -222,6 +303,10 @@ query GetProjectItems($projectId: ID!, $after: String, $first: Int!) {
222
303
  }
223
304
  catch (error) {
224
305
  lastError = error;
306
+ if (error instanceof ky_1.HTTPError &&
307
+ isRateLimitStatus(error.response.status)) {
308
+ throw error;
309
+ }
225
310
  if (attemptFirst === 1) {
226
311
  throw error;
227
312
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GraphqlProjectItemRepository.js","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/GraphqlProjectItemRepository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GraphqlProjectItemRepository.js","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/GraphqlProjectItemRepository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAmC;AACnC,kEAA+D;AAqBlD,QAAA,mBAAmB,GAAG,GAAG,CAAC;AAC1B,QAAA,qCAAqC,GAAG,GAAG,CAAC;AAC5C,QAAA,oDAAoD,GAAG,IAAI,CAAC;AAC5D,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAC3B,QAAA,yBAAyB,GAAG,IAAI,CAAC;AACjC,QAAA,6BAA6B,GAAG,KAAK,CAAC;AACtC,QAAA,yBAAyB,GAAG,MAAM,CAAC;AAEhD,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAC1C,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAEpD,MAAM,6BAA6B,GAAG,CAAC,KAAoB,EAAiB,EAAE;IAC5E,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAChC,OAA4B,EAC5B,OAAe,EACf,KAAa,EACL,EAAE;IACV,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAC5B,iCAAyB,EACzB,qCAA6B,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CACrD,CAAC;IACF,MAAM,iBAAiB,GAAG,6BAA6B,CACrD,OAAO,EAAE,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CACpC,CAAC;IACF,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,GAAG,CACb,iCAAyB,EACzB,IAAI,CAAC,GAAG,CAAC,iCAAyB,EAAE,iBAAiB,GAAG,IAAI,CAAC,CAC9D,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,6BAA6B,CAC7C,OAAO,EAAE,GAAG,CAAC,uBAAuB,CAAC,IAAI,IAAI,CAC9C,CAAC;IACF,MAAM,iBAAiB,GAAG,6BAA6B,CACrD,OAAO,EAAE,GAAG,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAC1C,CAAC;IACF,IAAI,SAAS,KAAK,CAAC,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,iBAAiB,GAAG,IAAI,GAAG,KAAK,CAAC;QAChD,OAAO,IAAI,CAAC,GAAG,CACb,iCAAyB,EACzB,IAAI,CAAC,GAAG,CAAC,iCAAyB,EAAE,MAAM,CAAC,CAC5C,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,iCAAyB,EAAE,aAAa,CAAC,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAW,EAAE,CACpD,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;AAE5B,MAAM,sBAAsB,GAAG,KAAK,EACzC,OAAyB,EACb,EAAE;IACd,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,SAAS,CAAC;QACR,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IACE,CAAC,CAAC,KAAK,YAAY,cAAS,CAAC;gBAC7B,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACzC,OAAO,IAAI,8BAAsB,EACjC,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,SAAS,GAAG,yBAAyB,CACzC,KAAK,CAAC,QAAQ,CAAC,OAAO,EACtB,OAAO,EACP,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;YACF,OAAO,CAAC,GAAG,CACT,sCAAsC,KAAK,CAAC,QAAQ,CAAC,MAAM,8BAA8B,SAAS,mBAAmB,OAAO,GAAG,CAAC,IAAI,8BAAsB,GAAG,CAC9J,CAAC;YACF,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AA3BW,QAAA,sBAAsB,0BA2BjC;AAEF,MAAM,4BAA4B,GAAG,CACnC,MAA6B,EACrB,EAAE;IACV,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1C,IACE,UAAU,CAAC,MAAM,IAAI,4DAAoD,EACzE,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,4DAAoD,CAAC,gBAAgB,CAAC;AACtG,CAAC,CAAC;AAEF,MAAa,4BAA6B,SAAQ,2CAAoB;IAAtE;;QACE,gBAAW,GAAG,KAAK,EACjB,SAAiB,EACjB,KAAa,EACb,cAAsB,EACtB,WAAmB,EACU,EAAE;YAC/B,MAAM,YAAY,GAAG;gBACnB,KAAK,EAAE;;;;;;;;;;;;;EAaX;gBACI,SAAS,EAAE;oBACT,SAAS,EAAE,SAAS;oBACpB,KAAK,EAAE,KAAK;oBACZ,IAAI,EAAE,cAAc;oBACpB,WAAW,EAAE,WAAW;iBACzB;aACF,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,YAAE;qBACtB,IAAI,CAAC,gCAAgC,EAAE;oBACtC,IAAI,EAAE,YAAY;oBAClB,OAAO,EAAE;wBACP,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,EAAE;qBACxC;iBACF,CAAC;qBACD,IAAI,EAcD,CAAC;gBAEP,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACnB,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM;wBACnC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;wBAClD,CAAC,CAAC,2BAA2B,CAAC;oBAChC,MAAM,IAAI,KAAK,CACb,wDAAwD,aAAa,EAAE,CACxE,CAAC;gBACJ,CAAC;gBACD,MAAM,YAAY,GAGZ,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC;gBACxD,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CACrC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CACxC,EAAE,EAAE,CAAC;gBACN,OAAO,aAAa,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;gBAC7D,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;QACF,sBAAiB,GAAG,KAAK,EAAE,SAAiB,EAA0B,EAAE;YACtE,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmH9B,CAAC;YACE,MAAM,WAAW,GAAG,KAAK,EACvB,SAAiB,EACjB,KAAoB,EACpB,KAAa,EAqCZ,EAAE;gBACH,MAAM,YAAY,GAAG;oBACnB,KAAK,EAAE,kBAAkB;oBACzB,SAAS,EAAE;wBACT,SAAS,EAAE,SAAS;wBACpB,KAAK,EAAE,KAAK;wBACZ,KAAK,EAAE,KAAK;qBACb;iBACF,CAAC;gBACF,MAAM,QAAQ,GAAG,MAAM,IAAA,8BAAsB,EAAC,GAAG,EAAE,CACjD,YAAE;qBACC,IAAI,CAAC,gCAAgC,EAAE;oBACtC,IAAI,EAAE,YAAY;oBAClB,OAAO,EAAE;wBACP,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,EAAE;qBACxC;iBACF,CAAC;qBACD,IAAI,EAuCD,CACP,CAAC;gBACF,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAClD,MAAM,IAAI,KAAK,CACb,0BAA0B,4BAA4B,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAC1E,CAAC;gBACJ,CAAC;gBACD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC;gBAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBACtD,CAAC;gBACD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;gBAC7B,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;oBACrB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBACtD,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YAC3B,CAAC,CAAC;YACF,MAAM,8BAA8B,GAAG,KAAK,EAC1C,KAAoB,EAqCnB,EAAE;gBACH,IAAI,YAAY,GAAG,6CAAqC,CAAC;gBACzD,IAAI,SAAS,GAAY,IAAI,CAAC;gBAC9B,OAAO,YAAY,IAAI,CAAC,EAAE,CAAC;oBACzB,IAAI,CAAC;wBACH,OAAO,MAAM,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;oBAC3D,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,SAAS,GAAG,KAAK,CAAC;wBAClB,IACE,KAAK,YAAY,cAAS;4BAC1B,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EACxC,CAAC;4BACD,MAAM,KAAK,CAAC;wBACd,CAAC;wBACD,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;4BACvB,MAAM,KAAK,CAAC;wBACd,CAAC;wBACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;wBAC5D,OAAO,CAAC,GAAG,CACT,8CAA8C,YAAY,6BAA6B,SAAS,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC9J,CAAC;wBACF,YAAY,GAAG,SAAS,CAAC;oBAC3B,CAAC;gBACH,CAAC;gBACD,MAAM,SAAS,YAAY,KAAK;oBAC9B,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YACnC,CAAC,CAAC;YACF,MAAM,MAAM,GAAkB,EAAE,CAAC;YACjC,IAAI,KAAK,GAAkB,IAAI,CAAC;YAChC,IAAI,WAAW,GAAG,IAAI,CAAC;YACvB,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,kBAAkB,GAAG,CAAC,CAAC;YAC3B,IAAI,SAAS,GAAG,CAAC,CAAC;YAElB,OAAO,WAAW,EAAE,CAAC;gBACnB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5B,UAAU,CAAC,OAAO,EAAE,2BAAmB,CAAC,CACzC,CAAC;gBACJ,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,8BAA8B,CAAC,KAAK,CAAC,CAAC;gBACzD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;gBACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAC1C,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;gBACxC,kBAAkB,IAAI,SAAS,CAAC,MAAM,CAAC;gBACvC,SAAS,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CACT,2BAA2B,SAAS,YAAY,SAAS,CAAC,MAAM,iBAAiB,kBAAkB,IAAI,UAAU,EAAE,CACpH,CAAC;gBACF,MAAM,YAAY,GAyBZ,SAAS,CAAC;gBAChB,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC5B,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;wBACvD,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC;wBACV,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa;wBACpD,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;wBAC3B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;wBACzB,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;wBACjD,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;wBACrB,IAAI,EAAE,IAAI;wBACV,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;wBAC5D,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;wBACnE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBAC7D,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;wBACxC,yBAAyB,EACvB,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,KAAK;4BACzC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;6BACxB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE;wBAC1C,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK;6BACjC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;6BAChC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;4BACb,OAAO;gCACL,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;gCACtB,KAAK,EACH,KAAK,CAAC,IAAI;oCACV,KAAK,CAAC,IAAI;oCACV,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE;oCACxB,KAAK,CAAC,IAAI;oCACV,IAAI;6BACP,CAAC;wBACJ,CAAC,CAAC;qBACL,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;gBACH,IACE,SAAS,CAAC,MAAM,GAAG,CAAC;oBACpB,CAAC,QAAQ,CAAC,WAAW;oBACrB,kBAAkB,GAAG,UAAU,EAC/B,CAAC;oBACD,MAAM,IAAI,KAAK,CACb,2BAA2B,SAAS,QAAQ,SAAS,CAAC,MAAM,0CAA0C,kBAAkB,IAAI,UAAU,oBAAoB,CAC3J,CAAC;gBACJ,CAAC;gBACD,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;gBACnC,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;YAC7B,CAAC;YACD,OAAO,CAAC,GAAG,CACT,6CAA6C,UAAU,yBAAyB,kBAAkB,aAAa,MAAM,CAAC,MAAM,EAAE,CAC/H,CAAC;YACF,IAAI,kBAAkB,KAAK,UAAU,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CACb,+BAA+B,UAAU,0BAA0B,kBAAkB,EAAE,CACxF,CAAC;YACJ,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;QACF,qCAAgC,GAAG,KAAK,EACtC,QAAgB,EAMhB,EAAE;YACF,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACxE,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAC7D,CAAC,CAAC;QAEF,yBAAoB,GAAG,KAAK,EAC1B,KAAa,EACb,cAAsB,EACtB,WAAmB,EAMnB,EAAE;YACF,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8D9B,CAAC;YACE,MAAM,YAAY,GAAG;gBACnB,KAAK,EAAE,kBAAkB;gBACzB,SAAS,EAAE;oBACT,KAAK,EAAE,KAAK;oBACZ,UAAU,EAAE,cAAc;oBAC1B,WAAW,EAAE,WAAW;iBACzB;aACF,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,YAAE;iBACtB,IAAI,CAAC,gCAAgC,EAAE;gBACtC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,EAAE;iBACxC;aACF,CAAC;iBACD,IAAI,EAwBD,CAAC;YAEP,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM;oBACnC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;oBAClD,CAAC,CAAC,2BAA2B,CAAC;gBAChC,MAAM,IAAI,KAAK,CACb,iEAAiE,aAAa,EAAE,CACjF,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC3B,MAAM,WAAW,GAGX,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBAC3B,OAAO,WAAW,CAAC;YACrB,CAAC;YACD,MAAM,YAAY,GAcZ,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC;YACpE,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC5B,WAAW,CAAC,IAAI,CAAC;oBACf,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE;oBACjC,UAAU,EACR,IAAI,CAAC,IAAI;wBACT,IAAI,CAAC,IAAI;wBACT,IAAI,CAAC,IAAI;wBACT,IAAI,CAAC,UAAU,EAAE,IAAI;wBACrB,IAAI,CAAC,IAAI,EAAE,KAAK;wBAChB,EAAE;iBACL,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,OAAO,WAAW,CAAC;QACrB,CAAC,CAAC;QACF,0BAAqB,GAAG,KAAK,EAC3B,QAAgB,EAChB,SAAkB,EACW,EAAE;YAC/B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACxE,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkKlB,CAAC;YACC,MAAM,YAAY,GAAG;gBACnB,KAAK,EAAE,OAAO;gBACd,SAAS,EAAE;oBACT,KAAK,EAAE,KAAK;oBACZ,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,WAAW;iBACpB;aACF,CAAC;YA+BF,MAAM,QAAQ,GAAG,MAAM,YAAE;iBACtB,IAAI,CAAC,gCAAgC,EAAE;gBACtC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,EAAE;iBACxC;aACF,CAAC;iBACD,IAAI,EAQD,CAAC;YACP,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM;oBACnC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;oBAClD,CAAC,CAAC,2BAA2B,CAAC;gBAChC,MAAM,IAAI,KAAK,CACb,kEAAkE,aAAa,EAAE,CAClF,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;YACrE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC;YAChD,MAAM,IAAI,GAAG,SAAS;gBACpB,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,SAAS,CAAC;gBAC7D,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CACV,SAAS;oBACP,CAAC,CAAC,mCAAmC,QAAQ,eAAe,SAAS,EAAE;oBACvE,CAAC,CAAC,mCAAmC,QAAQ,EAAE,CAClD,CAAC;gBACF,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,aAAa,EAAE,OAAO,CAAC,UAAU,CAAC,aAAa;gBAC/C,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC5C,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;gBACvD,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;gBAC9D,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACxD,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;gBACnC,yBAAyB,EACvB,OAAO,CAAC,uBAAuB,EAAE,KAAK;oBACpC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;qBACxB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE;gBAC1C,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK;qBACjC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;qBAChC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;oBACb,OAAO;wBACL,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;wBACtB,KAAK,EACH,KAAK,CAAC,IAAI;4BACV,KAAK,CAAC,IAAI;4BACV,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE;4BACxB,KAAK,CAAC,IAAI;4BACV,IAAI;qBACP,CAAC;gBACJ,CAAC,CAAC;aACL,CAAC;QACJ,CAAC,CAAC;QACF,sBAAiB,GAAG,CAAC,KAAa,EAAgC,EAAE;YAClE,OAAO,KAAK,KAAK,QAAQ;gBACvB,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,KAAK,KAAK,QAAQ;oBAClB,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,KAAK,KAAK,MAAM;wBAChB,CAAC,CAAC,MAAM;wBACR,CAAC,CAAC,MAAM,CAAC;QACjB,CAAC,CAAC;QAEF,uBAAkB,GAAG,KAAK,EACxB,SAAiB,EACjB,OAAe,EACf,MAAc,EACd,KAIoC,EACrB,EAAE;YACjB,MAAM,YAAY,GAAG;gBACnB,KAAK,EAAE;;sBAES,SAAS;oBACX,OAAO;mBACR,MAAM;iBACR,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC;;;;MAI9D;aACD,CAAC;YAEF,MAAM,GAAG,GAAG,MAAM,YAAE;iBACjB,IAAI,CAAC,gCAAgC,EAAE;gBACtC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,EAAE;iBACxC;aACF,CAAC;iBACD,IAAI,EAOD,CAAC;YACP,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC,CAAC;QAEF,sBAAiB,GAAG,KAAK,EACvB,SAAiB,EACjB,OAAe,EACf,MAAc,EACC,EAAE;YACjB,MAAM,YAAY,GAAG;gBACnB,KAAK,EAAE;;sBAES,SAAS;oBACX,OAAO;mBACR,MAAM;;;;MAInB;aACD,CAAC;YAEF,MAAM,GAAG,GAAG,MAAM,YAAE;iBACjB,IAAI,CAAC,gCAAgC,EAAE;gBACtC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,EAAE;iBACxC;aACF,CAAC;iBACD,IAAI,EAOD,CAAC;YACP,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC,CAAC;QACF,2BAAsB,GAAG,KAAK,EAC5B,OAAsB,EACtB,OAAe,EACf,KAAsB,EACtB,IAAY,EACG,EAAE;YACjB,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,CAAC,CAAC;QAEF,0BAAqB,GAAG,KAAK,EAC3B,SAAiB,EACjB,MAAc,EACC,EAAE;YACjB,MAAM,YAAY,GAAG;gBACnB,KAAK,EAAE;;;;QAIL;gBACF,SAAS,EAAE;oBACT,SAAS;oBACT,MAAM;iBACP;aACF,CAAC;YAEF,MAAM,GAAG,GAAG,MAAM,YAAE;iBACjB,IAAI,CAAC,gCAAgC,EAAE;gBACtC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,EAAE;iBACxC;aACF,CAAC;iBACD,IAAI,EAOD,CAAC;YAEP,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC,CAAC;QAEF,oCAA+B,GAAG,KAAK,EACrC,QAAgB,EAChB,SAAiB,EACF,EAAE;YACjB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACxE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAC3E,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CACb,oCAAoC,QAAQ,iBAAiB,SAAS,EAAE,CACzE,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC,CAAC;QAEF,sBAAiB,GAAG,KAAK,EACvB,SAAiB,EACjB,QAAgB,EACC,EAAE;YACnB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACxE,MAAM,WAAW,GAAG;gBAClB,KAAK,EAAE;;;;;;;;;;;QAWL;gBACF,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE;aAChD,CAAC;YACF,MAAM,SAAS,GAAG,MAAM,YAAE;iBACvB,IAAI,CAAC,gCAAgC,EAAE;gBACtC,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,EAAE;iBACxC;aACF,CAAC;iBACD,IAAI,EASD,CAAC;YACP,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACrE,CAAC;YACD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACnE,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;YAC3D,CAAC;YAED,MAAM,QAAQ,GAAG;gBACf,KAAK,EAAE;;;;QAIL;gBACF,SAAS,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE;aACpC,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,YAAE;iBACpB,IAAI,CAAC,gCAAgC,EAAE;gBACtC,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,EAAE;iBACxC;aACF,CAAC;iBACD,IAAI,EAOD,CAAC;YACP,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,CAAC,CAAC;IACJ,CAAC;CAAA;AA3nCD,oEA2nCC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-issue-tower-defence-management",
3
- "version": "1.104.3",
3
+ "version": "1.104.4",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -1,22 +1,29 @@
1
1
  const mockPost = jest.fn();
2
2
 
3
- jest.mock('ky', () => ({
4
- default: {
5
- post: mockPost,
6
- get: jest.fn(),
7
- put: jest.fn(),
8
- patch: jest.fn(),
9
- delete: jest.fn(),
10
- extend: jest.fn(),
11
- create: jest.fn(),
12
- stop: jest.fn(),
13
- },
14
- __esModule: true,
15
- }));
3
+ jest.mock('ky', () => {
4
+ const actualKy: typeof import('ky') = jest.requireActual('ky');
5
+ return {
6
+ default: {
7
+ post: mockPost,
8
+ get: jest.fn(),
9
+ put: jest.fn(),
10
+ patch: jest.fn(),
11
+ delete: jest.fn(),
12
+ extend: jest.fn(),
13
+ create: jest.fn(),
14
+ stop: jest.fn(),
15
+ },
16
+ HTTPError: actualKy.HTTPError,
17
+ __esModule: true,
18
+ };
19
+ });
16
20
 
21
+ import { HTTPError } from 'ky';
17
22
  import {
18
23
  GraphqlProjectItemRepository,
19
24
  PAGINATION_DELAY_MS,
25
+ RATE_LIMIT_MAX_RETRIES,
26
+ callWithRateLimitRetry,
20
27
  } from './GraphqlProjectItemRepository';
21
28
  import { LocalStorageRepository } from '../LocalStorageRepository';
22
29
 
@@ -24,6 +31,30 @@ const mockJsonResponse = <T>(data: T) => ({
24
31
  json: jest.fn().mockResolvedValue(data),
25
32
  });
26
33
 
34
+ const makeHttpError = (
35
+ status: number,
36
+ headers: Record<string, string> = {},
37
+ ): HTTPError => {
38
+ const response = new Response('rate limited', {
39
+ status,
40
+ headers,
41
+ });
42
+ const request = new Request('https://api.github.com/graphql');
43
+ const normalizedOptions: ConstructorParameters<typeof HTTPError>[2] = {
44
+ method: 'post',
45
+ retry: {},
46
+ prefix: '',
47
+ onDownloadProgress: undefined,
48
+ onUploadProgress: undefined,
49
+ context: {},
50
+ };
51
+ return new HTTPError(response, request, normalizedOptions);
52
+ };
53
+
54
+ const mockRejectedJsonResponse = (error: HTTPError) => ({
55
+ json: jest.fn().mockRejectedValue(error),
56
+ });
57
+
27
58
  const isRecord = (value: unknown): value is Record<string, unknown> =>
28
59
  typeof value === 'object' && value !== null;
29
60
 
@@ -434,6 +465,229 @@ describe('GraphqlProjectItemRepository', () => {
434
465
  );
435
466
  expect(requestedFirstSeries).toEqual([100, 50, 25, 12, 6, 3, 1]);
436
467
  });
468
+
469
+ it('should not sleep the legacy 5000ms blanket delay between pages', async () => {
470
+ const localStorageRepository = new LocalStorageRepository();
471
+ const repository = new GraphqlProjectItemRepository(
472
+ localStorageRepository,
473
+ 'dummy-token',
474
+ );
475
+
476
+ const setTimeoutSpy = jest.spyOn(global, 'setTimeout');
477
+ mockPost
478
+ .mockReturnValueOnce(makePageResponse(true, 'cursor-1'))
479
+ .mockReturnValueOnce(makePageResponse(false, 'cursor-2'));
480
+
481
+ const resultPromise = repository.fetchProjectItems('test-project-id');
482
+ await jest.advanceTimersByTimeAsync(PAGINATION_DELAY_MS);
483
+ const result = await resultPromise;
484
+
485
+ expect(result).toHaveLength(2);
486
+ expect(PAGINATION_DELAY_MS).toBeLessThanOrEqual(500);
487
+ expect(setTimeoutSpy).not.toHaveBeenCalledWith(
488
+ expect.any(Function),
489
+ 5000,
490
+ );
491
+ setTimeoutSpy.mockRestore();
492
+ });
493
+
494
+ it('should back off and retry once when GitHub responds 429, then succeed', async () => {
495
+ const localStorageRepository = new LocalStorageRepository();
496
+ const repository = new GraphqlProjectItemRepository(
497
+ localStorageRepository,
498
+ 'dummy-token',
499
+ );
500
+
501
+ mockPost
502
+ .mockReturnValueOnce(
503
+ mockRejectedJsonResponse(makeHttpError(429, { 'retry-after': '3' })),
504
+ )
505
+ .mockReturnValueOnce(makePageResponse(false, 'cursor-1', 1));
506
+
507
+ const resultPromise = repository.fetchProjectItems('test-project-id');
508
+ await jest.advanceTimersByTimeAsync(3000);
509
+ const result = await resultPromise;
510
+
511
+ expect(result).toHaveLength(1);
512
+ expect(mockPost).toHaveBeenCalledTimes(2);
513
+ });
514
+
515
+ it('should honor the retry-after header duration before retrying after a 429', async () => {
516
+ const localStorageRepository = new LocalStorageRepository();
517
+ const repository = new GraphqlProjectItemRepository(
518
+ localStorageRepository,
519
+ 'dummy-token',
520
+ );
521
+
522
+ mockPost
523
+ .mockReturnValueOnce(
524
+ mockRejectedJsonResponse(makeHttpError(429, { 'retry-after': '7' })),
525
+ )
526
+ .mockReturnValueOnce(makePageResponse(false, 'cursor-1', 1));
527
+
528
+ const resultPromise = repository.fetchProjectItems('test-project-id');
529
+ await jest.advanceTimersByTimeAsync(6999);
530
+ expect(mockPost).toHaveBeenCalledTimes(1);
531
+ await jest.advanceTimersByTimeAsync(1);
532
+ const result = await resultPromise;
533
+
534
+ expect(result).toHaveLength(1);
535
+ expect(mockPost).toHaveBeenCalledTimes(2);
536
+ });
537
+
538
+ it('should wait until x-ratelimit-reset when 403 has no retry-after and remaining is 0', async () => {
539
+ const localStorageRepository = new LocalStorageRepository();
540
+ const repository = new GraphqlProjectItemRepository(
541
+ localStorageRepository,
542
+ 'dummy-token',
543
+ );
544
+
545
+ const resetEpochSeconds = Math.floor(Date.now() / 1000) + 4;
546
+ mockPost
547
+ .mockReturnValueOnce(
548
+ mockRejectedJsonResponse(
549
+ makeHttpError(403, {
550
+ 'x-ratelimit-remaining': '0',
551
+ 'x-ratelimit-reset': String(resetEpochSeconds),
552
+ }),
553
+ ),
554
+ )
555
+ .mockReturnValueOnce(makePageResponse(false, 'cursor-1', 1));
556
+
557
+ const resultPromise = repository.fetchProjectItems('test-project-id');
558
+ await jest.advanceTimersByTimeAsync(5000);
559
+ const result = await resultPromise;
560
+
561
+ expect(result).toHaveLength(1);
562
+ expect(mockPost).toHaveBeenCalledTimes(2);
563
+ });
564
+
565
+ it('should give up and rethrow after exhausting rate-limit retries', async () => {
566
+ const localStorageRepository = new LocalStorageRepository();
567
+ const repository = new GraphqlProjectItemRepository(
568
+ localStorageRepository,
569
+ 'dummy-token',
570
+ );
571
+
572
+ mockPost.mockReturnValue(
573
+ mockRejectedJsonResponse(makeHttpError(429, { 'retry-after': '1' })),
574
+ );
575
+
576
+ const resultPromise = repository
577
+ .fetchProjectItems('test-project-id')
578
+ .catch((error: unknown) => error);
579
+ await jest.runAllTimersAsync();
580
+ const caught = await resultPromise;
581
+
582
+ expect(caught).toBeInstanceOf(HTTPError);
583
+ expect(mockPost).toHaveBeenCalledTimes(RATE_LIMIT_MAX_RETRIES + 1);
584
+ }, 30000);
585
+
586
+ it('should not let the page-size halving fallback re-issue a rate-limit request', async () => {
587
+ const localStorageRepository = new LocalStorageRepository();
588
+ const repository = new GraphqlProjectItemRepository(
589
+ localStorageRepository,
590
+ 'dummy-token',
591
+ );
592
+
593
+ mockPost.mockReturnValue(
594
+ mockRejectedJsonResponse(makeHttpError(429, { 'retry-after': '1' })),
595
+ );
596
+
597
+ const resultPromise = repository
598
+ .fetchProjectItems('test-project-id')
599
+ .catch((error: unknown) => error);
600
+ await jest.runAllTimersAsync();
601
+ await resultPromise;
602
+
603
+ const requestedFirstSeries = mockPost.mock.calls.map((call) =>
604
+ extractRequestedFirstFromMockCall(call),
605
+ );
606
+ expect(requestedFirstSeries.every((first) => first === 100)).toBe(true);
607
+ }, 30000);
608
+ });
609
+
610
+ describe('callWithRateLimitRetry', () => {
611
+ beforeEach(() => {
612
+ jest.useFakeTimers();
613
+ });
614
+
615
+ afterEach(() => {
616
+ jest.useRealTimers();
617
+ });
618
+
619
+ it('should return the result without retrying when the request succeeds', async () => {
620
+ const request = jest.fn().mockResolvedValue('ok');
621
+
622
+ const result = await callWithRateLimitRetry(request);
623
+
624
+ expect(result).toBe('ok');
625
+ expect(request).toHaveBeenCalledTimes(1);
626
+ });
627
+
628
+ it('should retry on a 429 then return the eventual success value', async () => {
629
+ const request = jest
630
+ .fn()
631
+ .mockRejectedValueOnce(makeHttpError(429, { 'retry-after': '2' }))
632
+ .mockResolvedValueOnce('recovered');
633
+
634
+ const resultPromise = callWithRateLimitRetry(request);
635
+ await jest.advanceTimersByTimeAsync(2000);
636
+ const result = await resultPromise;
637
+
638
+ expect(result).toBe('recovered');
639
+ expect(request).toHaveBeenCalledTimes(2);
640
+ });
641
+
642
+ it('should retry on a 403 rate-limit response then succeed', async () => {
643
+ const resetEpochSeconds = Math.floor(Date.now() / 1000) + 3;
644
+ const request = jest
645
+ .fn()
646
+ .mockRejectedValueOnce(
647
+ makeHttpError(403, {
648
+ 'x-ratelimit-remaining': '0',
649
+ 'x-ratelimit-reset': String(resetEpochSeconds),
650
+ }),
651
+ )
652
+ .mockResolvedValueOnce('recovered');
653
+
654
+ const resultPromise = callWithRateLimitRetry(request);
655
+ await jest.advanceTimersByTimeAsync(4000);
656
+ const result = await resultPromise;
657
+
658
+ expect(result).toBe('recovered');
659
+ expect(request).toHaveBeenCalledTimes(2);
660
+ });
661
+
662
+ it('should not retry a non-rate-limit HTTP error such as 500', async () => {
663
+ const httpError = makeHttpError(500);
664
+ const request = jest.fn().mockRejectedValue(httpError);
665
+
666
+ await expect(callWithRateLimitRetry(request)).rejects.toBe(httpError);
667
+ expect(request).toHaveBeenCalledTimes(1);
668
+ });
669
+
670
+ it('should rethrow immediately for a non-HTTPError', async () => {
671
+ const plainError = new Error('boom');
672
+ const request = jest.fn().mockRejectedValue(plainError);
673
+
674
+ await expect(callWithRateLimitRetry(request)).rejects.toBe(plainError);
675
+ expect(request).toHaveBeenCalledTimes(1);
676
+ });
677
+
678
+ it('should stop after the maximum number of rate-limit retries', async () => {
679
+ const httpError = makeHttpError(429, { 'retry-after': '1' });
680
+ const request = jest.fn().mockRejectedValue(httpError);
681
+
682
+ const resultPromise = callWithRateLimitRetry(request).catch(
683
+ (error: unknown) => error,
684
+ );
685
+ await jest.runAllTimersAsync();
686
+ const caught = await resultPromise;
687
+
688
+ expect(caught).toBe(httpError);
689
+ expect(request).toHaveBeenCalledTimes(RATE_LIMIT_MAX_RETRIES + 1);
690
+ }, 30000);
437
691
  });
438
692
 
439
693
  describe('getProjectItemFields', () => {
@@ -1,4 +1,4 @@
1
- import ky from 'ky';
1
+ import ky, { HTTPError } from 'ky';
2
2
  import { BaseGitHubRepository } from '../BaseGitHubRepository';
3
3
  import { Project } from '../../../domain/entities/Project';
4
4
  import { Issue } from '../../../domain/entities/Issue';
@@ -20,9 +20,94 @@ export type ProjectItem = {
20
20
  value: string | null;
21
21
  }[];
22
22
  };
23
- export const PAGINATION_DELAY_MS = 5000;
23
+ export const PAGINATION_DELAY_MS = 500;
24
24
  export const FETCH_PROJECT_ITEMS_INITIAL_PAGE_SIZE = 100;
25
25
  export const FETCH_PROJECT_ITEMS_GRAPHQL_ERROR_PAYLOAD_MAX_LENGTH = 4000;
26
+ export const RATE_LIMIT_MAX_RETRIES = 6;
27
+ export const RATE_LIMIT_MIN_BACKOFF_MS = 1000;
28
+ export const RATE_LIMIT_DEFAULT_BACKOFF_MS = 60000;
29
+ export const RATE_LIMIT_MAX_BACKOFF_MS = 300000;
30
+
31
+ const sleep = (ms: number): Promise<void> =>
32
+ new Promise((resolve) => setTimeout(resolve, ms));
33
+
34
+ const parseNonNegativeIntegerHeader = (value: string | null): number | null => {
35
+ if (value === null) {
36
+ return null;
37
+ }
38
+ const trimmed = value.trim();
39
+ if (!/^\d+$/.test(trimmed)) {
40
+ return null;
41
+ }
42
+ const parsed = Number.parseInt(trimmed, 10);
43
+ return Number.isFinite(parsed) ? parsed : null;
44
+ };
45
+
46
+ const computeRateLimitBackoffMs = (
47
+ headers: Headers | undefined,
48
+ attempt: number,
49
+ nowMs: number,
50
+ ): number => {
51
+ const exponentialMs = Math.min(
52
+ RATE_LIMIT_MAX_BACKOFF_MS,
53
+ RATE_LIMIT_DEFAULT_BACKOFF_MS * Math.pow(2, attempt),
54
+ );
55
+ const retryAfterSeconds = parseNonNegativeIntegerHeader(
56
+ headers?.get('retry-after') ?? null,
57
+ );
58
+ if (retryAfterSeconds !== null) {
59
+ return Math.min(
60
+ RATE_LIMIT_MAX_BACKOFF_MS,
61
+ Math.max(RATE_LIMIT_MIN_BACKOFF_MS, retryAfterSeconds * 1000),
62
+ );
63
+ }
64
+ const remaining = parseNonNegativeIntegerHeader(
65
+ headers?.get('x-ratelimit-remaining') ?? null,
66
+ );
67
+ const resetEpochSeconds = parseNonNegativeIntegerHeader(
68
+ headers?.get('x-ratelimit-reset') ?? null,
69
+ );
70
+ if (remaining === 0 && resetEpochSeconds !== null) {
71
+ const waitMs = resetEpochSeconds * 1000 - nowMs;
72
+ return Math.min(
73
+ RATE_LIMIT_MAX_BACKOFF_MS,
74
+ Math.max(RATE_LIMIT_MIN_BACKOFF_MS, waitMs),
75
+ );
76
+ }
77
+ return Math.max(RATE_LIMIT_MIN_BACKOFF_MS, exponentialMs);
78
+ };
79
+
80
+ const isRateLimitStatus = (status: number): boolean =>
81
+ status === 429 || status === 403;
82
+
83
+ export const callWithRateLimitRetry = async <T>(
84
+ request: () => Promise<T>,
85
+ ): Promise<T> => {
86
+ let attempt = 0;
87
+ for (;;) {
88
+ try {
89
+ return await request();
90
+ } catch (error) {
91
+ if (
92
+ !(error instanceof HTTPError) ||
93
+ !isRateLimitStatus(error.response.status) ||
94
+ attempt >= RATE_LIMIT_MAX_RETRIES
95
+ ) {
96
+ throw error;
97
+ }
98
+ const backoffMs = computeRateLimitBackoffMs(
99
+ error.response.headers,
100
+ attempt,
101
+ Date.now(),
102
+ );
103
+ console.log(
104
+ `fetchProjectItems: GitHub returned ${error.response.status} (rate limit). Backing off ${backoffMs}ms before retry ${attempt + 1}/${RATE_LIMIT_MAX_RETRIES}.`,
105
+ );
106
+ await sleep(backoffMs);
107
+ attempt++;
108
+ }
109
+ }
110
+ };
26
111
 
27
112
  const stringifyGraphqlErrorsForLog = (
28
113
  errors: { message: string }[],
@@ -277,53 +362,55 @@ query GetProjectItems($projectId: ID!, $after: String, $first: Int!) {
277
362
  first: first,
278
363
  },
279
364
  };
280
- const response = await ky
281
- .post('https://api.github.com/graphql', {
282
- json: graphqlQuery,
283
- headers: {
284
- Authorization: `Bearer ${this.ghToken}`,
285
- },
286
- })
287
- .json<{
288
- data: {
289
- node: {
290
- items: {
291
- totalCount: number;
292
- pageInfo: {
293
- endCursor: string;
294
- startCursor: string;
295
- hasNextPage: boolean;
296
- };
297
- nodes: {
298
- id: string;
299
- fieldValues: {
300
- nodes: {
301
- text: string;
302
- number: number;
303
- date: string;
304
- field: {
305
- name: string;
306
- };
307
- }[];
365
+ const response = await callWithRateLimitRetry(() =>
366
+ ky
367
+ .post('https://api.github.com/graphql', {
368
+ json: graphqlQuery,
369
+ headers: {
370
+ Authorization: `Bearer ${this.ghToken}`,
371
+ },
372
+ })
373
+ .json<{
374
+ data: {
375
+ node: {
376
+ items: {
377
+ totalCount: number;
378
+ pageInfo: {
379
+ endCursor: string;
380
+ startCursor: string;
381
+ hasNextPage: boolean;
308
382
  };
309
- content: {
310
- repository: { nameWithOwner: string };
311
- number: number;
312
- title: string;
313
- state: string;
314
- url: string;
315
- createdAt: string;
316
- author: { login: string } | null;
317
- labels: { nodes: { name: string }[] };
318
- assignees: { nodes: { login: string }[] };
319
- closingIssuesReferences?: { nodes: { url: string }[] };
320
- };
321
- }[];
322
- };
383
+ nodes: {
384
+ id: string;
385
+ fieldValues: {
386
+ nodes: {
387
+ text: string;
388
+ number: number;
389
+ date: string;
390
+ field: {
391
+ name: string;
392
+ };
393
+ }[];
394
+ };
395
+ content: {
396
+ repository: { nameWithOwner: string };
397
+ number: number;
398
+ title: string;
399
+ state: string;
400
+ url: string;
401
+ createdAt: string;
402
+ author: { login: string } | null;
403
+ labels: { nodes: { name: string }[] };
404
+ assignees: { nodes: { login: string }[] };
405
+ closingIssuesReferences?: { nodes: { url: string }[] };
406
+ };
407
+ }[];
408
+ };
409
+ } | null;
323
410
  } | null;
324
- } | null;
325
- errors?: { message: string }[];
326
- }>();
411
+ errors?: { message: string }[];
412
+ }>(),
413
+ );
327
414
  if (response.errors && response.errors.length > 0) {
328
415
  throw new Error(
329
416
  `GitHub GraphQL errors: ${stringifyGraphqlErrorsForLog(response.errors)}`,
@@ -385,6 +472,12 @@ query GetProjectItems($projectId: ID!, $after: String, $first: Int!) {
385
472
  return await callGraphql(projectId, after, attemptFirst);
386
473
  } catch (error) {
387
474
  lastError = error;
475
+ if (
476
+ error instanceof HTTPError &&
477
+ isRateLimitStatus(error.response.status)
478
+ ) {
479
+ throw error;
480
+ }
388
481
  if (attemptFirst === 1) {
389
482
  throw error;
390
483
  }
@@ -19,9 +19,14 @@ export type ProjectItem = {
19
19
  value: string | null;
20
20
  }[];
21
21
  };
22
- export declare const PAGINATION_DELAY_MS = 5000;
22
+ export declare const PAGINATION_DELAY_MS = 500;
23
23
  export declare const FETCH_PROJECT_ITEMS_INITIAL_PAGE_SIZE = 100;
24
24
  export declare const FETCH_PROJECT_ITEMS_GRAPHQL_ERROR_PAYLOAD_MAX_LENGTH = 4000;
25
+ export declare const RATE_LIMIT_MAX_RETRIES = 6;
26
+ export declare const RATE_LIMIT_MIN_BACKOFF_MS = 1000;
27
+ export declare const RATE_LIMIT_DEFAULT_BACKOFF_MS = 60000;
28
+ export declare const RATE_LIMIT_MAX_BACKOFF_MS = 300000;
29
+ export declare const callWithRateLimitRetry: <T>(request: () => Promise<T>) => Promise<T>;
25
30
  export declare class GraphqlProjectItemRepository extends BaseGitHubRepository {
26
31
  fetchItemId: (projectId: string, owner: string, repositoryName: string, issueNumber: number) => Promise<string | undefined>;
27
32
  fetchProjectItems: (projectId: string) => Promise<ProjectItem[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"GraphqlProjectItemRepository.d.ts","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/GraphqlProjectItemRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB,EAAE,MAAM,EAAE,CAAC;IACpC,YAAY,EAAE;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;KACtB,EAAE,CAAC;CACL,CAAC;AACF,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,eAAO,MAAM,qCAAqC,MAAM,CAAC;AACzD,eAAO,MAAM,oDAAoD,OAAO,CAAC;AAczE,qBAAa,4BAA6B,SAAQ,oBAAoB;IACpE,WAAW,GACT,WAAW,MAAM,EACjB,OAAO,MAAM,EACb,gBAAgB,MAAM,EACtB,aAAa,MAAM,KAClB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoE5B;IACF,iBAAiB,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAwYnE;IACF,gCAAgC,GAC9B,UAAU,MAAM,KACf,OAAO,CACR;QACE,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,EAAE,CACJ,CAGC;IAEF,oBAAoB,GAClB,OAAO,MAAM,EACb,gBAAgB,MAAM,EACtB,aAAa,MAAM,KAClB,OAAO,CACR;QACE,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,EAAE,CACJ,CAqJC;IACF,qBAAqB,GACnB,UAAU,MAAM,EAChB,YAAY,MAAM,KACjB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAkR5B;IACF,iBAAiB,GAAI,OAAO,MAAM,KAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAQ/D;IAEF,kBAAkB,GAChB,WAAW,MAAM,EACjB,SAAS,MAAM,EACf,QAAQ,MAAM,EACd,OACI;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAChB;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAClB;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAChB;QAAE,oBAAoB,EAAE,MAAM,CAAA;KAAE,KACnC,OAAO,CAAC,IAAI,CAAC,CAgCd;IAEF,iBAAiB,GACf,WAAW,MAAM,EACjB,SAAS,MAAM,EACf,QAAQ,MAAM,KACb,OAAO,CAAC,IAAI,CAAC,CA+Bd;IACF,sBAAsB,GACpB,SAAS,OAAO,CAAC,IAAI,CAAC,EACtB,SAAS,MAAM,EACf,OAAO,KAAK,CAAC,QAAQ,CAAC,EACtB,MAAM,MAAM,KACX,OAAO,CAAC,IAAI,CAAC,CAEd;IAEF,qBAAqB,GACnB,WAAW,MAAM,EACjB,QAAQ,MAAM,KACb,OAAO,CAAC,IAAI,CAAC,CAgCd;IAEF,+BAA+B,GAC7B,UAAU,MAAM,EAChB,WAAW,MAAM,KAChB,OAAO,CAAC,IAAI,CAAC,CASd;IAEF,iBAAiB,GACf,WAAW,MAAM,EACjB,UAAU,MAAM,KACf,OAAO,CAAC,MAAM,CAAC,CAqEhB;CACH"}
1
+ {"version":3,"file":"GraphqlProjectItemRepository.d.ts","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/GraphqlProjectItemRepository.ts"],"names":[],"mappings":"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"}