@civiq/entity-resolution 0.1.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 (81) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +135 -0
  3. package/data/bioguide-fec-mapping.json +4186 -0
  4. package/data/sec-sic-data.json +10427 -0
  5. package/dist/__tests__/company-entity-resolver.test.d.ts +6 -0
  6. package/dist/__tests__/company-entity-resolver.test.d.ts.map +1 -0
  7. package/dist/__tests__/company-entity-resolver.test.js +267 -0
  8. package/dist/__tests__/company-entity-resolver.test.js.map +1 -0
  9. package/dist/__tests__/entity-resolution.test.d.ts +2 -0
  10. package/dist/__tests__/entity-resolution.test.d.ts.map +1 -0
  11. package/dist/__tests__/entity-resolution.test.js +296 -0
  12. package/dist/__tests__/entity-resolution.test.js.map +1 -0
  13. package/dist/__tests__/fec-entity-resolution.test.d.ts +2 -0
  14. package/dist/__tests__/fec-entity-resolution.test.d.ts.map +1 -0
  15. package/dist/__tests__/fec-entity-resolution.test.js +49 -0
  16. package/dist/__tests__/fec-entity-resolution.test.js.map +1 -0
  17. package/dist/bioguide-fec-mapping.d.ts +27 -0
  18. package/dist/bioguide-fec-mapping.d.ts.map +1 -0
  19. package/dist/bioguide-fec-mapping.js +57 -0
  20. package/dist/bioguide-fec-mapping.js.map +1 -0
  21. package/dist/cache.d.ts +18 -0
  22. package/dist/cache.d.ts.map +1 -0
  23. package/dist/cache.js +18 -0
  24. package/dist/cache.js.map +1 -0
  25. package/dist/committee-agency-map.d.ts +58 -0
  26. package/dist/committee-agency-map.d.ts.map +1 -0
  27. package/dist/committee-agency-map.js +658 -0
  28. package/dist/committee-agency-map.js.map +1 -0
  29. package/dist/committee-alias-table.d.ts +11 -0
  30. package/dist/committee-alias-table.d.ts.map +1 -0
  31. package/dist/committee-alias-table.js +191 -0
  32. package/dist/committee-alias-table.js.map +1 -0
  33. package/dist/company-alias-table.d.ts +36 -0
  34. package/dist/company-alias-table.d.ts.map +1 -0
  35. package/dist/company-alias-table.js +1307 -0
  36. package/dist/company-alias-table.js.map +1 -0
  37. package/dist/company-entity-resolver.d.ts +94 -0
  38. package/dist/company-entity-resolver.d.ts.map +1 -0
  39. package/dist/company-entity-resolver.js +282 -0
  40. package/dist/company-entity-resolver.js.map +1 -0
  41. package/dist/configure.d.ts +15 -0
  42. package/dist/configure.d.ts.map +1 -0
  43. package/dist/configure.js +19 -0
  44. package/dist/configure.js.map +1 -0
  45. package/dist/fec-entity-resolution.d.ts +88 -0
  46. package/dist/fec-entity-resolution.d.ts.map +1 -0
  47. package/dist/fec-entity-resolution.js +407 -0
  48. package/dist/fec-entity-resolution.js.map +1 -0
  49. package/dist/index.d.ts +30 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +33 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/industry-taxonomy.d.ts +90 -0
  54. package/dist/industry-taxonomy.d.ts.map +1 -0
  55. package/dist/industry-taxonomy.js +1026 -0
  56. package/dist/industry-taxonomy.js.map +1 -0
  57. package/dist/lda-issue-policy-map.d.ts +13 -0
  58. package/dist/lda-issue-policy-map.d.ts.map +1 -0
  59. package/dist/lda-issue-policy-map.js +193 -0
  60. package/dist/lda-issue-policy-map.js.map +1 -0
  61. package/dist/lobbying-committee-resolver.d.ts +23 -0
  62. package/dist/lobbying-committee-resolver.d.ts.map +1 -0
  63. package/dist/lobbying-committee-resolver.js +158 -0
  64. package/dist/lobbying-committee-resolver.js.map +1 -0
  65. package/dist/logger.d.ts +20 -0
  66. package/dist/logger.d.ts.map +1 -0
  67. package/dist/logger.js +20 -0
  68. package/dist/logger.js.map +1 -0
  69. package/dist/sic-sector-map.d.ts +32 -0
  70. package/dist/sic-sector-map.d.ts.map +1 -0
  71. package/dist/sic-sector-map.js +109 -0
  72. package/dist/sic-sector-map.js.map +1 -0
  73. package/dist/ticker-industry-resolver.d.ts +22 -0
  74. package/dist/ticker-industry-resolver.d.ts.map +1 -0
  75. package/dist/ticker-industry-resolver.js +254 -0
  76. package/dist/ticker-industry-resolver.js.map +1 -0
  77. package/dist/types.d.ts +30 -0
  78. package/dist/types.d.ts.map +1 -0
  79. package/dist/types.js +6 -0
  80. package/dist/types.js.map +1 -0
  81. package/package.json +51 -0
@@ -0,0 +1,49 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { entitiesMatch, normalizeEntity } from '../fec-entity-resolution';
3
+ describe('entitiesMatch - abbreviation expansion', () => {
4
+ it('matches J&J to Johnson & Johnson', () => {
5
+ expect(entitiesMatch({ name: 'J&J' }, { name: 'Johnson & Johnson' })).toBe(true);
6
+ });
7
+ it('matches GM to General Motors Corp', () => {
8
+ expect(entitiesMatch({ name: 'GM' }, { name: 'General Motors Corp' })).toBe(true);
9
+ });
10
+ it('matches GE to General Electric', () => {
11
+ expect(entitiesMatch({ name: 'GE' }, { name: 'General Electric' })).toBe(true);
12
+ });
13
+ it('does not match IBM to Intl Business Machines (partial abbreviation not in table)', () => {
14
+ expect(entitiesMatch({ name: 'IBM' }, { name: 'Intl Business Machines' })).toBe(false);
15
+ });
16
+ it('matches AT&T to AT&T Inc', () => {
17
+ expect(entitiesMatch({ name: 'AT&T' }, { name: 'AT&T Inc' })).toBe(true);
18
+ });
19
+ it('matches JPMorgan to JPMorgan Chase', () => {
20
+ expect(entitiesMatch({ name: 'JPMorgan' }, { name: 'JPMorgan Chase' })).toBe(true);
21
+ });
22
+ it('matches BofA to Bank of America', () => {
23
+ expect(entitiesMatch({ name: 'BofA' }, { name: 'Bank of America' })).toBe(true);
24
+ });
25
+ });
26
+ describe('entitiesMatch - existing Levenshtein behavior preserved', () => {
27
+ it('matches exact names', () => {
28
+ expect(entitiesMatch({ name: 'Google Inc' }, { name: 'Google Inc' })).toBe(true);
29
+ });
30
+ it('matches similar names above threshold', () => {
31
+ expect(entitiesMatch({ name: 'Google Inc' }, { name: 'Google Inc.' })).toBe(true);
32
+ });
33
+ it('rejects dissimilar names', () => {
34
+ expect(entitiesMatch({ name: 'Google' }, { name: 'Microsoft' })).toBe(false);
35
+ });
36
+ });
37
+ describe('normalizeEntity', () => {
38
+ it('normalizes organization names', () => {
39
+ const result = normalizeEntity('Google Inc.');
40
+ expect(result.entityType).toBe('organization');
41
+ expect(result.normalizedName).toBe('GOOGLE');
42
+ });
43
+ it('normalizes individual names from LAST, FIRST format', () => {
44
+ const result = normalizeEntity('SMITH, JOHN');
45
+ expect(result.entityType).toBe('individual');
46
+ expect(result.displayName).toBe('JOHN SMITH');
47
+ });
48
+ });
49
+ //# sourceMappingURL=fec-entity-resolution.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fec-entity-resolution.test.js","sourceRoot":"","sources":["../../src/__tests__/fec-entity-resolution.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Copyright (c) 2019-2025 Mark Sandford
3
+ * Licensed under the MIT License. See LICENSE and NOTICE files.
4
+ */
5
+ export interface FECMapping {
6
+ fecId: string;
7
+ name: string;
8
+ state: string;
9
+ district?: string;
10
+ office: 'H' | 'S';
11
+ lastUpdated: string;
12
+ }
13
+ export declare const bioguideToFECMapping: Record<string, FECMapping>;
14
+ export declare function getFECIdFromBioguide(bioguideId: string): string | null;
15
+ export declare function hasFECMapping(bioguideId: string): boolean;
16
+ export declare function addFECMapping(bioguideId: string, mapping: FECMapping): void;
17
+ export declare function getBioguideFromFEC(fecCandidateId: string): string | null;
18
+ export declare function getMappingByFEC(fecCandidateId: string): (FECMapping & {
19
+ bioguideId: string;
20
+ }) | null;
21
+ export declare function getMappingStats(): {
22
+ totalMappings: number;
23
+ houseMembers: number;
24
+ senateMembers: number;
25
+ lastUpdated: string;
26
+ };
27
+ //# sourceMappingURL=bioguide-fec-mapping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bioguide-fec-mapping.d.ts","sourceRoot":"","sources":["../src/bioguide-fec-mapping.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAGD,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAG3D,CAAC;AAGF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGtE;AAGD,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEzD;AAGD,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI,CAE3E;AAQD,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAExE;AAGD,wBAAgB,eAAe,CAC7B,cAAc,EAAE,MAAM,GACrB,CAAC,UAAU,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,CAM9C;AAGD,wBAAgB,eAAe,IAAI;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB,CAQA"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Copyright (c) 2019-2025 Mark Sandford
3
+ * Licensed under the MIT License. See LICENSE and NOTICE files.
4
+ */
5
+ // Bioguide ID to FEC Candidate ID mapping
6
+ // This mapping helps match Congressional representatives to their FEC campaign finance records
7
+ // Format: bioguideId -> { fecId, name, state, district?, office, lastUpdated }
8
+ //
9
+ // AUTO-GENERATED FROM congress-legislators data on 2025-09-18
10
+ // Source: https://github.com/unitedstates/congress-legislators
11
+ // To regenerate: npm run generate-fec-mappings
12
+ // MANUALLY UPDATED: 2026-01-08 - Removed departed members (Greene, LaMalfa, Sherrill)
13
+ // Added new members (Grijalva, Van Epps, Walkinshaw)
14
+ // Data stored in bioguide-fec-mapping.json, loaded via JSON import
15
+ import jsonData from '../data/bioguide-fec-mapping.json';
16
+ // Complete mappings for 119th Congress (537 representatives)
17
+ export const bioguideToFECMapping = jsonData;
18
+ // Helper function to get FEC ID from Bioguide ID
19
+ export function getFECIdFromBioguide(bioguideId) {
20
+ const mapping = bioguideToFECMapping[bioguideId];
21
+ return mapping ? mapping.fecId : null;
22
+ }
23
+ // Helper function to check if a mapping exists
24
+ export function hasFECMapping(bioguideId) {
25
+ return bioguideId in bioguideToFECMapping;
26
+ }
27
+ // Function to add or update a mapping (for future use)
28
+ export function addFECMapping(bioguideId, mapping) {
29
+ bioguideToFECMapping[bioguideId] = mapping;
30
+ }
31
+ // Reverse mapping: FEC Candidate ID -> Bioguide ID (computed once at module load)
32
+ const fecToBioguideMapping = Object.fromEntries(Object.entries(bioguideToFECMapping).map(([bioguideId, mapping]) => [mapping.fecId, bioguideId]));
33
+ // Reverse lookup: get bioguideId from FEC candidate ID
34
+ export function getBioguideFromFEC(fecCandidateId) {
35
+ return fecToBioguideMapping[fecCandidateId] ?? null;
36
+ }
37
+ // Get the full mapping entry by FEC candidate ID
38
+ export function getMappingByFEC(fecCandidateId) {
39
+ const bioguideId = fecToBioguideMapping[fecCandidateId];
40
+ if (!bioguideId)
41
+ return null;
42
+ const mapping = bioguideToFECMapping[bioguideId];
43
+ if (!mapping)
44
+ return null;
45
+ return { ...mapping, bioguideId };
46
+ }
47
+ // Get mapping statistics
48
+ export function getMappingStats() {
49
+ const mappings = Object.values(bioguideToFECMapping);
50
+ return {
51
+ totalMappings: mappings.length,
52
+ houseMembers: mappings.filter(m => m.office === 'H').length,
53
+ senateMembers: mappings.filter(m => m.office === 'S').length,
54
+ lastUpdated: '2025-09-18',
55
+ };
56
+ }
57
+ //# sourceMappingURL=bioguide-fec-mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bioguide-fec-mapping.js","sourceRoot":"","sources":["../src/bioguide-fec-mapping.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,0CAA0C;AAC1C,+FAA+F;AAC/F,+EAA+E;AAC/E,EAAE;AACF,8DAA8D;AAC9D,+DAA+D;AAC/D,+CAA+C;AAC/C,sFAAsF;AACtF,mFAAmF;AACnF,mEAAmE;AAEnE,OAAO,QAAQ,MAAM,mCAAmC,CAAC;AAWzD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,oBAAoB,GAA+B,QAG/D,CAAC;AAEF,iDAAiD;AACjD,MAAM,UAAU,oBAAoB,CAAC,UAAkB;IACrD,MAAM,OAAO,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACjD,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,OAAO,UAAU,IAAI,oBAAoB,CAAC;AAC5C,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,OAAmB;IACnE,oBAAoB,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;AAC7C,CAAC;AAED,kFAAkF;AAClF,MAAM,oBAAoB,GAA2B,MAAM,CAAC,WAAW,CACrE,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CACjG,CAAC;AAEF,uDAAuD;AACvD,MAAM,UAAU,kBAAkB,CAAC,cAAsB;IACvD,OAAO,oBAAoB,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC;AACtD,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,eAAe,CAC7B,cAAsB;IAEtB,MAAM,UAAU,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,OAAO,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,CAAC;AACpC,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,eAAe;IAM7B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACrD,OAAO;QACL,aAAa,EAAE,QAAQ,CAAC,MAAM;QAC9B,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM;QAC3D,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM;QAC5D,WAAW,EAAE,YAAY;KAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Copyright (c) 2019-2025 Mark Sandford
3
+ * Licensed under the MIT License. See LICENSE and NOTICE files.
4
+ */
5
+ /**
6
+ * Cache adapter interface for the entity-resolution package.
7
+ * Consumers provide their own cache via setCache() or configure().
8
+ * Default is a no-op cache (always misses).
9
+ */
10
+ export interface CacheAdapter {
11
+ get<T>(key: string): Promise<T | null>;
12
+ set(key: string, value: unknown, ttlSeconds: number): Promise<void>;
13
+ }
14
+ /** Set the cache adapter implementation for this package. */
15
+ export declare function setCache(cache: CacheAdapter): void;
16
+ /** Get the current cache adapter. */
17
+ export declare function getCache(): CacheAdapter;
18
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE;AASD,6DAA6D;AAC7D,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAElD;AAED,qCAAqC;AACrC,wBAAgB,QAAQ,IAAI,YAAY,CAEvC"}
package/dist/cache.js ADDED
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Copyright (c) 2019-2025 Mark Sandford
3
+ * Licensed under the MIT License. See LICENSE and NOTICE files.
4
+ */
5
+ const noopCache = {
6
+ get: async () => null,
7
+ set: async () => { },
8
+ };
9
+ let currentCache = noopCache;
10
+ /** Set the cache adapter implementation for this package. */
11
+ export function setCache(cache) {
12
+ currentCache = cache;
13
+ }
14
+ /** Get the current cache adapter. */
15
+ export function getCache() {
16
+ return currentCache;
17
+ }
18
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,MAAM,SAAS,GAAiB;IAC9B,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;IACrB,GAAG,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;CACpB,CAAC;AAEF,IAAI,YAAY,GAAiB,SAAS,CAAC;AAE3C,6DAA6D;AAC7D,MAAM,UAAU,QAAQ,CAAC,KAAmB;IAC1C,YAAY,GAAG,KAAK,CAAC;AACvB,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,QAAQ;IACtB,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Copyright (c) 2019-2025 Mark Sandford
3
+ * Licensed under the MIT License. See LICENSE and NOTICE files.
4
+ */
5
+ /**
6
+ * Committee to Agency Mapping
7
+ *
8
+ * Maps congressional committees to the federal agencies they oversee.
9
+ * This enables hypertext connections between representatives (via their
10
+ * committee assignments) and relevant federal spending, regulations,
11
+ * and executive actions.
12
+ */
13
+ export interface AgencyInfo {
14
+ name: string;
15
+ slug: string;
16
+ abbreviation: string;
17
+ keywords: string[];
18
+ }
19
+ export interface CommitteeMapping {
20
+ committeeCode: string;
21
+ committeeName: string;
22
+ chamber: 'House' | 'Senate' | 'Joint';
23
+ agencies: AgencyInfo[];
24
+ topics: string[];
25
+ }
26
+ /**
27
+ * House committee mappings
28
+ */
29
+ export declare const HOUSE_COMMITTEE_MAPPINGS: CommitteeMapping[];
30
+ /**
31
+ * Senate committee mappings
32
+ */
33
+ export declare const SENATE_COMMITTEE_MAPPINGS: CommitteeMapping[];
34
+ /**
35
+ * All committee mappings combined
36
+ */
37
+ export declare const ALL_COMMITTEE_MAPPINGS: CommitteeMapping[];
38
+ /**
39
+ * Get agencies for a committee by name (fuzzy match)
40
+ */
41
+ export declare function getAgenciesForCommittee(committeeName: string): AgencyInfo[];
42
+ /**
43
+ * Get topics for a committee by name (fuzzy match)
44
+ */
45
+ export declare function getTopicsForCommittee(committeeName: string): string[];
46
+ /**
47
+ * Get all agencies for multiple committees
48
+ */
49
+ export declare function getAgenciesForCommittees(committeeNames: string[]): AgencyInfo[];
50
+ /**
51
+ * Get committees that oversee a given agency (reverse lookup).
52
+ */
53
+ export declare function getCommitteesForAgency(agencySlug: string): CommitteeMapping[];
54
+ /**
55
+ * Get all topics for multiple committees
56
+ */
57
+ export declare function getTopicsForCommittees(committeeNames: string[]): string[];
58
+ //# sourceMappingURL=committee-agency-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"committee-agency-map.d.ts","sourceRoot":"","sources":["../src/committee-agency-map.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACtC,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,gBAAgB,EAqTtD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,yBAAyB,EAAE,gBAAgB,EA+QvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,gBAAgB,EAGpD,CAAC;AAEF;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,EAAE,CAa3E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAarE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAW/E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAI7E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAWzE"}