@singi-labs/sifa-sdk 0.10.9 → 0.10.10
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/dist/index.cjs +17 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +17 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/taxonomy/continents.ts","../src/taxonomy/countries.ts","../src/taxonomy/employment-type.ts","../src/taxonomy/industry-taxonomy.ts","../src/taxonomy/open-to.ts","../src/taxonomy/workplace-type.ts","../src/taxonomy/platforms.ts","../src/taxonomy/skill-categories.ts","../src/taxonomy/skill-grouping.ts","../src/taxonomy/app-categories.ts","../src/taxonomy/app-category-map.ts","../src/taxonomy/activity-tiers.json","../src/taxonomy/activity-tiers.ts","../src/format/format-time.ts","../src/format/sort-by-date.ts","../src/format/handle-utils.ts","../src/format/location-utils.ts","../src/format/pds-utils.ts","../src/format/text-sanitize.ts","../src/format/text-truncate.ts","../src/format/time-utils.ts","../src/format/wcag-contrast.ts","../src/cards/app-url-patterns.ts","../src/cards/resolve-card-url.ts","../src/cards/visibility.ts","../src/cards/adult-content.ts","../src/publishers/registry.ts","../src/logic/profile-completeness.ts","../src/logic/profile-dimensions.ts","../src/logic/primary-position.ts","../src/schemas/shared.ts","../src/schemas/endorsement-confirmation.ts","../src/schemas/endorsement.ts","../src/schemas/graph-follow.ts","../src/schemas/follow-profile.ts","../src/schemas/feed.ts","../src/schemas/profile-certification.ts","../src/schemas/profile-course.ts","../src/schemas/profile-education.ts","../src/schemas/profile-external-account.ts","../src/schemas/profile-honor.ts","../src/schemas/profile-language.ts","../src/schemas/profile-position.ts","../src/schemas/profile-project.ts","../src/schemas/profile-publication.ts","../src/schemas/profile-self.ts","../src/schemas/profile-skill.ts","../src/schemas/profile-volunteering.ts","../src/index.ts"],"names":["z","parsed"],"mappings":";;;;;AAEO,IAAM,UAAA,GAAmE;AAAA,EAC9E,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,EAC3B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,eAAA,EAAgB;AAAA,EACpC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,eAAA;AACtB;AAEA,IAAM,oBAAA,GAAsD;AAAA,EAC1D,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EA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","file":"index.cjs","sourcesContent":["export type ContinentCode = 'AF' | 'AN' | 'AS' | 'EU' | 'NA' | 'OC' | 'SA';\n\nexport const CONTINENTS: ReadonlyArray<{ code: ContinentCode; name: string }> = [\n { code: 'AF', name: 'Africa' },\n { code: 'AN', name: 'Antarctica' },\n { code: 'AS', name: 'Asia' },\n { code: 'EU', name: 'Europe' },\n { code: 'NA', name: 'North America' },\n { code: 'OC', name: 'Oceania' },\n { code: 'SA', name: 'South America' },\n];\n\nconst COUNTRY_TO_CONTINENT: Record<string, ContinentCode> = {\n AD: 'EU',\n AE: 'AS',\n AF: 'AS',\n AG: 'NA',\n AL: 'EU',\n AM: 'AS',\n AO: 'AF',\n AR: 'SA',\n AT: 'EU',\n AU: 'OC',\n AZ: 'AS',\n BA: 'EU',\n BB: 'NA',\n BD: 'AS',\n BE: 'EU',\n BF: 'AF',\n BG: 'EU',\n BH: 'AS',\n BI: 'AF',\n BJ: 'AF',\n BN: 'AS',\n BO: 'SA',\n BR: 'SA',\n BS: 'NA',\n BT: 'AS',\n BW: 'AF',\n BY: 'EU',\n BZ: 'NA',\n CA: 'NA',\n CD: 'AF',\n CF: 'AF',\n CG: 'AF',\n CH: 'EU',\n CI: 'AF',\n CL: 'SA',\n CM: 'AF',\n CN: 'AS',\n CO: 'SA',\n CR: 'NA',\n CU: 'NA',\n CV: 'AF',\n CY: 'AS',\n CZ: 'EU',\n DE: 'EU',\n DJ: 'AF',\n DK: 'EU',\n DM: 'NA',\n DO: 'NA',\n DZ: 'AF',\n EC: 'SA',\n EE: 'EU',\n EG: 'AF',\n ER: 'AF',\n ES: 'EU',\n ET: 'AF',\n FI: 'EU',\n FJ: 'OC',\n FR: 'EU',\n GA: 'AF',\n GB: 'EU',\n GD: 'NA',\n GE: 'AS',\n GH: 'AF',\n GM: 'AF',\n GN: 'AF',\n GQ: 'AF',\n GR: 'EU',\n GT: 'NA',\n GW: 'AF',\n GY: 'SA',\n HK: 'AS',\n HN: 'NA',\n HR: 'EU',\n HT: 'NA',\n HU: 'EU',\n ID: 'AS',\n IE: 'EU',\n IL: 'AS',\n IN: 'AS',\n IQ: 'AS',\n IR: 'AS',\n IS: 'EU',\n IT: 'EU',\n JM: 'NA',\n JO: 'AS',\n JP: 'AS',\n KE: 'AF',\n KG: 'AS',\n KH: 'AS',\n KM: 'AF',\n KN: 'NA',\n KP: 'AS',\n KR: 'AS',\n KW: 'AS',\n KZ: 'AS',\n LA: 'AS',\n LB: 'AS',\n LC: 'NA',\n LI: 'EU',\n LK: 'AS',\n LR: 'AF',\n LS: 'AF',\n LT: 'EU',\n LU: 'EU',\n LV: 'EU',\n LY: 'AF',\n MA: 'AF',\n MC: 'EU',\n MD: 'EU',\n ME: 'EU',\n MG: 'AF',\n MK: 'EU',\n ML: 'AF',\n MM: 'AS',\n MN: 'AS',\n MO: 'AS',\n MR: 'AF',\n MT: 'EU',\n MU: 'AF',\n MV: 'AS',\n MW: 'AF',\n MX: 'NA',\n MY: 'AS',\n MZ: 'AF',\n NA: 'AF',\n NE: 'AF',\n NG: 'AF',\n NI: 'NA',\n NL: 'EU',\n NO: 'EU',\n NP: 'AS',\n NZ: 'OC',\n OM: 'AS',\n PA: 'NA',\n PE: 'SA',\n PG: 'OC',\n PH: 'AS',\n PK: 'AS',\n PL: 'EU',\n PR: 'NA',\n PS: 'AS',\n PT: 'EU',\n PY: 'SA',\n QA: 'AS',\n RO: 'EU',\n RS: 'EU',\n RU: 'EU',\n RW: 'AF',\n SA: 'AS',\n SB: 'OC',\n SC: 'AF',\n SD: 'AF',\n SE: 'EU',\n SG: 'AS',\n SI: 'EU',\n SK: 'EU',\n SL: 'AF',\n SM: 'EU',\n SN: 'AF',\n SO: 'AF',\n SR: 'SA',\n SS: 'AF',\n ST: 'AF',\n SV: 'NA',\n SY: 'AS',\n SZ: 'AF',\n TD: 'AF',\n TG: 'AF',\n TH: 'AS',\n TJ: 'AS',\n TL: 'AS',\n TM: 'AS',\n TN: 'AF',\n TO: 'OC',\n TR: 'AS',\n TT: 'NA',\n TW: 'AS',\n TZ: 'AF',\n UA: 'EU',\n UG: 'AF',\n US: 'NA',\n UY: 'SA',\n UZ: 'AS',\n VA: 'EU',\n VC: 'NA',\n VE: 'SA',\n VN: 'AS',\n VU: 'OC',\n WS: 'OC',\n XK: 'EU',\n YE: 'AS',\n ZA: 'AF',\n ZM: 'AF',\n ZW: 'AF',\n};\n\nexport function getContinent(countryCode: string): ContinentCode | null {\n if (!countryCode) return null;\n return COUNTRY_TO_CONTINENT[countryCode.toUpperCase()] ?? null;\n}\n","/** ISO 3166-1 country list for local fallback when GeoNames is unavailable. */\nexport const COUNTRIES: ReadonlyArray<{ code: string; name: string }> = [\n { code: 'AF', name: 'Afghanistan' },\n { code: 'AL', name: 'Albania' },\n { code: 'DZ', name: 'Algeria' },\n { code: 'AD', name: 'Andorra' },\n { code: 'AO', name: 'Angola' },\n { code: 'AG', name: 'Antigua and Barbuda' },\n { code: 'AR', name: 'Argentina' },\n { code: 'AM', name: 'Armenia' },\n { code: 'AU', name: 'Australia' },\n { code: 'AT', name: 'Austria' },\n { code: 'AZ', name: 'Azerbaijan' },\n { code: 'BS', name: 'Bahamas' },\n { code: 'BH', name: 'Bahrain' },\n { code: 'BD', name: 'Bangladesh' },\n { code: 'BB', name: 'Barbados' },\n { code: 'BY', name: 'Belarus' },\n { code: 'BE', name: 'Belgium' },\n { code: 'BZ', name: 'Belize' },\n { code: 'BJ', name: 'Benin' },\n { code: 'BT', name: 'Bhutan' },\n { code: 'BO', name: 'Bolivia' },\n { code: 'BA', name: 'Bosnia and Herzegovina' },\n { code: 'BW', name: 'Botswana' },\n { code: 'BR', name: 'Brazil' },\n { code: 'BN', name: 'Brunei' },\n { code: 'BG', name: 'Bulgaria' },\n { code: 'BF', name: 'Burkina Faso' },\n { code: 'BI', name: 'Burundi' },\n { code: 'CV', name: 'Cabo Verde' },\n { code: 'KH', name: 'Cambodia' },\n { code: 'CM', name: 'Cameroon' },\n { code: 'CA', name: 'Canada' },\n { code: 'CF', name: 'Central African Republic' },\n { code: 'TD', name: 'Chad' },\n { code: 'CL', name: 'Chile' },\n { code: 'CN', name: 'China' },\n { code: 'CO', name: 'Colombia' },\n { code: 'KM', name: 'Comoros' },\n { code: 'CG', name: 'Congo' },\n { code: 'CD', name: 'Congo (DRC)' },\n { code: 'CR', name: 'Costa Rica' },\n { code: 'CI', name: \"Cote d'Ivoire\" },\n { code: 'HR', name: 'Croatia' },\n { code: 'CU', name: 'Cuba' },\n { code: 'CY', name: 'Cyprus' },\n { code: 'CZ', name: 'Czechia' },\n { code: 'DK', name: 'Denmark' },\n { code: 'DJ', name: 'Djibouti' },\n { code: 'DM', name: 'Dominica' },\n { code: 'DO', name: 'Dominican Republic' },\n { code: 'EC', name: 'Ecuador' },\n { code: 'EG', name: 'Egypt' },\n { code: 'SV', name: 'El Salvador' },\n { code: 'GQ', name: 'Equatorial Guinea' },\n { code: 'ER', name: 'Eritrea' },\n { code: 'EE', name: 'Estonia' },\n { code: 'SZ', name: 'Eswatini' },\n { code: 'ET', name: 'Ethiopia' },\n { code: 'FJ', name: 'Fiji' },\n { code: 'FI', name: 'Finland' },\n { code: 'FR', name: 'France' },\n { code: 'GA', name: 'Gabon' },\n { code: 'GM', name: 'Gambia' },\n { code: 'GE', name: 'Georgia' },\n { code: 'DE', name: 'Germany' },\n { code: 'GH', name: 'Ghana' },\n { code: 'GR', name: 'Greece' },\n { code: 'GD', name: 'Grenada' },\n { code: 'GT', name: 'Guatemala' },\n { code: 'GN', name: 'Guinea' },\n { code: 'GW', name: 'Guinea-Bissau' },\n { code: 'GY', name: 'Guyana' },\n { code: 'HT', name: 'Haiti' },\n { code: 'HN', name: 'Honduras' },\n { code: 'HU', name: 'Hungary' },\n { code: 'IS', name: 'Iceland' },\n { code: 'IN', name: 'India' },\n { code: 'ID', name: 'Indonesia' },\n { code: 'IR', name: 'Iran' },\n { code: 'IQ', name: 'Iraq' },\n { code: 'IE', name: 'Ireland' },\n { code: 'IL', name: 'Israel' },\n { code: 'IT', name: 'Italy' },\n { code: 'JM', name: 'Jamaica' },\n { code: 'JP', name: 'Japan' },\n { code: 'JO', name: 'Jordan' },\n { code: 'KZ', name: 'Kazakhstan' },\n { code: 'KE', name: 'Kenya' },\n { code: 'KI', name: 'Kiribati' },\n { code: 'KP', name: 'North Korea' },\n { code: 'KR', name: 'South Korea' },\n { code: 'KW', name: 'Kuwait' },\n { code: 'KG', name: 'Kyrgyzstan' },\n { code: 'LA', name: 'Laos' },\n { code: 'LV', name: 'Latvia' },\n { code: 'LB', name: 'Lebanon' },\n { code: 'LS', name: 'Lesotho' },\n { code: 'LR', name: 'Liberia' },\n { code: 'LY', name: 'Libya' },\n { code: 'LI', name: 'Liechtenstein' },\n { code: 'LT', name: 'Lithuania' },\n { code: 'LU', name: 'Luxembourg' },\n { code: 'MG', name: 'Madagascar' },\n { code: 'MW', name: 'Malawi' },\n { code: 'MY', name: 'Malaysia' },\n { code: 'MV', name: 'Maldives' },\n { code: 'ML', name: 'Mali' },\n { code: 'MT', name: 'Malta' },\n { code: 'MH', name: 'Marshall Islands' },\n { code: 'MR', name: 'Mauritania' },\n { code: 'MU', name: 'Mauritius' },\n { code: 'MX', name: 'Mexico' },\n { code: 'FM', name: 'Micronesia' },\n { code: 'MD', name: 'Moldova' },\n { code: 'MC', name: 'Monaco' },\n { code: 'MN', name: 'Mongolia' },\n { code: 'ME', name: 'Montenegro' },\n { code: 'MA', name: 'Morocco' },\n { code: 'MZ', name: 'Mozambique' },\n { code: 'MM', name: 'Myanmar' },\n { code: 'NA', name: 'Namibia' },\n { code: 'NR', name: 'Nauru' },\n { code: 'NP', name: 'Nepal' },\n { code: 'NL', name: 'Netherlands' },\n { code: 'NZ', name: 'New Zealand' },\n { code: 'NI', name: 'Nicaragua' },\n { code: 'NE', name: 'Niger' },\n { code: 'NG', name: 'Nigeria' },\n { code: 'MK', name: 'North Macedonia' },\n { code: 'NO', name: 'Norway' },\n { code: 'OM', name: 'Oman' },\n { code: 'PK', name: 'Pakistan' },\n { code: 'PW', name: 'Palau' },\n { code: 'PS', name: 'Palestine' },\n { code: 'PA', name: 'Panama' },\n { code: 'PG', name: 'Papua New Guinea' },\n { code: 'PY', name: 'Paraguay' },\n { code: 'PE', name: 'Peru' },\n { code: 'PH', name: 'Philippines' },\n { code: 'PL', name: 'Poland' },\n { code: 'PT', name: 'Portugal' },\n { code: 'QA', name: 'Qatar' },\n { code: 'RO', name: 'Romania' },\n { code: 'RU', name: 'Russia' },\n { code: 'RW', name: 'Rwanda' },\n { code: 'KN', name: 'Saint Kitts and Nevis' },\n { code: 'LC', name: 'Saint Lucia' },\n { code: 'VC', name: 'Saint Vincent and the Grenadines' },\n { code: 'WS', name: 'Samoa' },\n { code: 'SM', name: 'San Marino' },\n { code: 'ST', name: 'Sao Tome and Principe' },\n { code: 'SA', name: 'Saudi Arabia' },\n { code: 'SN', name: 'Senegal' },\n { code: 'RS', name: 'Serbia' },\n { code: 'SC', name: 'Seychelles' },\n { code: 'SL', name: 'Sierra Leone' },\n { code: 'SG', name: 'Singapore' },\n { code: 'SK', name: 'Slovakia' },\n { code: 'SI', name: 'Slovenia' },\n { code: 'SB', name: 'Solomon Islands' },\n { code: 'SO', name: 'Somalia' },\n { code: 'ZA', name: 'South Africa' },\n { code: 'SS', name: 'South Sudan' },\n { code: 'ES', name: 'Spain' },\n { code: 'LK', name: 'Sri Lanka' },\n { code: 'SD', name: 'Sudan' },\n { code: 'SR', name: 'Suriname' },\n { code: 'SE', name: 'Sweden' },\n { code: 'CH', name: 'Switzerland' },\n { code: 'SY', name: 'Syria' },\n { code: 'TW', name: 'Taiwan' },\n { code: 'TJ', name: 'Tajikistan' },\n { code: 'TZ', name: 'Tanzania' },\n { code: 'TH', name: 'Thailand' },\n { code: 'TL', name: 'Timor-Leste' },\n { code: 'TG', name: 'Togo' },\n { code: 'TO', name: 'Tonga' },\n { code: 'TT', name: 'Trinidad and Tobago' },\n { code: 'TN', name: 'Tunisia' },\n { code: 'TR', name: 'Turkey' },\n { code: 'TM', name: 'Turkmenistan' },\n { code: 'TV', name: 'Tuvalu' },\n { code: 'UG', name: 'Uganda' },\n { code: 'UA', name: 'Ukraine' },\n { code: 'AE', name: 'United Arab Emirates' },\n { code: 'GB', name: 'United Kingdom' },\n { code: 'US', name: 'United States' },\n { code: 'UY', name: 'Uruguay' },\n { code: 'UZ', name: 'Uzbekistan' },\n { code: 'VU', name: 'Vanuatu' },\n { code: 'VA', name: 'Vatican City' },\n { code: 'VE', name: 'Venezuela' },\n { code: 'VN', name: 'Vietnam' },\n { code: 'YE', name: 'Yemen' },\n { code: 'ZM', name: 'Zambia' },\n { code: 'ZW', name: 'Zimbabwe' },\n] as const;\n","/**\n * Employment-type taxonomy. Mirrors `id.sifa.defs#employmentType.knownValues`\n * from sifa-lexicons. Surfaces both a flat NSID→label map (for read-only\n * display) and a grouped structure (for editor dropdowns).\n */\n\nexport interface EmploymentTypeOption {\n value: string;\n label: string;\n}\n\nexport interface EmploymentTypeGroup {\n label: string;\n items: EmploymentTypeOption[];\n}\n\nexport const EMPLOYMENT_TYPE_GROUPS: EmploymentTypeGroup[] = [\n {\n label: 'Employee',\n items: [\n { value: 'id.sifa.defs#fullTime', label: 'Full-time' },\n { value: 'id.sifa.defs#partTime', label: 'Part-time' },\n { value: 'id.sifa.defs#temporary', label: 'Temporary' },\n { value: 'id.sifa.defs#seasonal', label: 'Seasonal' },\n ],\n },\n {\n label: 'Independent',\n items: [\n { value: 'id.sifa.defs#contract', label: 'Contract' },\n { value: 'id.sifa.defs#freelance', label: 'Freelance' },\n { value: 'id.sifa.defs#selfEmployed', label: 'Self-employed' },\n { value: 'id.sifa.defs#independentWork', label: 'Independent work' },\n ],\n },\n {\n label: 'Training & early-career',\n items: [\n { value: 'id.sifa.defs#internship', label: 'Internship' },\n { value: 'id.sifa.defs#apprenticeship', label: 'Apprenticeship' },\n { value: 'id.sifa.defs#fellowship', label: 'Fellowship' },\n { value: 'id.sifa.defs#trainee', label: 'Trainee' },\n ],\n },\n {\n label: 'Other',\n items: [{ value: 'id.sifa.defs#volunteer', label: 'Volunteer' }],\n },\n];\n\nexport const EMPLOYMENT_TYPE_LABELS: Record<string, string> = Object.fromEntries(\n EMPLOYMENT_TYPE_GROUPS.flatMap((g) => g.items).map((o) => [o.value, o.label]),\n);\n\n/** Resolve a label for an employment-type token. Falls back to the raw value. */\nexport function getEmploymentTypeLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return EMPLOYMENT_TYPE_LABELS[value] ?? value;\n}\n","/** Two-level industry/domain taxonomy for profile classification. */\n\nexport interface IndustryOption {\n value: string;\n labelKey: string;\n domains: { value: string; labelKey: string }[];\n}\n\nexport const INDUSTRY_OPTIONS: IndustryOption[] = [\n {\n value: 'id.sifa.defs#industryTechnology',\n labelKey: 'industryTechnology',\n domains: [\n { value: 'id.sifa.defs#domainSoftwareEngineering', labelKey: 'domainSoftwareEngineering' },\n { value: 'id.sifa.defs#domainDataScience', labelKey: 'domainDataScience' },\n { value: 'id.sifa.defs#domainCybersecurity', labelKey: 'domainCybersecurity' },\n { value: 'id.sifa.defs#domainDevops', labelKey: 'domainDevops' },\n { value: 'id.sifa.defs#domainProductDesign', labelKey: 'domainProductDesign' },\n { value: 'id.sifa.defs#domainGameDev', labelKey: 'domainGameDev' },\n ],\n },\n {\n value: 'id.sifa.defs#industryFinance',\n labelKey: 'industryFinance',\n domains: [\n { value: 'id.sifa.defs#domainBanking', labelKey: 'domainBanking' },\n { value: 'id.sifa.defs#domainFintech', labelKey: 'domainFintech' },\n { value: 'id.sifa.defs#domainInsurance', labelKey: 'domainInsurance' },\n { value: 'id.sifa.defs#domainInvestmentMgmt', labelKey: 'domainInvestmentMgmt' },\n ],\n },\n {\n value: 'id.sifa.defs#industryHealthcare',\n labelKey: 'industryHealthcare',\n domains: [\n { value: 'id.sifa.defs#domainClinicalResearch', labelKey: 'domainClinicalResearch' },\n { value: 'id.sifa.defs#domainHealthtech', labelKey: 'domainHealthtech' },\n { value: 'id.sifa.defs#domainPharma', labelKey: 'domainPharma' },\n ],\n },\n {\n value: 'id.sifa.defs#industryEducation',\n labelKey: 'industryEducation',\n domains: [\n { value: 'id.sifa.defs#domainHigherEd', labelKey: 'domainHigherEd' },\n { value: 'id.sifa.defs#domainEdtech', labelKey: 'domainEdtech' },\n { value: 'id.sifa.defs#domainPrimarySecondary', labelKey: 'domainPrimarySecondary' },\n ],\n },\n {\n value: 'id.sifa.defs#industryMedia',\n labelKey: 'industryMedia',\n domains: [\n { value: 'id.sifa.defs#domainJournalism', labelKey: 'domainJournalism' },\n { value: 'id.sifa.defs#domainFilmVideo', labelKey: 'domainFilmVideo' },\n { value: 'id.sifa.defs#domainGaming', labelKey: 'domainGaming' },\n { value: 'id.sifa.defs#domainAdvertising', labelKey: 'domainAdvertising' },\n ],\n },\n {\n value: 'id.sifa.defs#industryRetail',\n labelKey: 'industryRetail',\n domains: [\n { value: 'id.sifa.defs#domainEcommerce', labelKey: 'domainEcommerce' },\n { value: 'id.sifa.defs#domainSupplyChain', labelKey: 'domainSupplyChain' },\n ],\n },\n {\n value: 'id.sifa.defs#industryManufacturing',\n labelKey: 'industryManufacturing',\n domains: [\n { value: 'id.sifa.defs#domainAutomotive', labelKey: 'domainAutomotive' },\n { value: 'id.sifa.defs#domainAerospace', labelKey: 'domainAerospace' },\n { value: 'id.sifa.defs#domainHardware', labelKey: 'domainHardware' },\n ],\n },\n {\n value: 'id.sifa.defs#industryEnergy',\n labelKey: 'industryEnergy',\n domains: [\n { value: 'id.sifa.defs#domainRenewables', labelKey: 'domainRenewables' },\n { value: 'id.sifa.defs#domainOilGas', labelKey: 'domainOilGas' },\n { value: 'id.sifa.defs#domainClimateTech', labelKey: 'domainClimateTech' },\n ],\n },\n {\n value: 'id.sifa.defs#industryGovernment',\n labelKey: 'industryGovernment',\n domains: [\n { value: 'id.sifa.defs#domainPublicPolicy', labelKey: 'domainPublicPolicy' },\n { value: 'id.sifa.defs#domainDefense', labelKey: 'domainDefense' },\n ],\n },\n {\n value: 'id.sifa.defs#industryLegal',\n labelKey: 'industryLegal',\n domains: [\n { value: 'id.sifa.defs#domainIpLaw', labelKey: 'domainIpLaw' },\n { value: 'id.sifa.defs#domainCompliance', labelKey: 'domainCompliance' },\n ],\n },\n {\n value: 'id.sifa.defs#industryConsulting',\n labelKey: 'industryConsulting',\n domains: [\n { value: 'id.sifa.defs#domainManagementConsulting', labelKey: 'domainManagementConsulting' },\n { value: 'id.sifa.defs#domainDevrel', labelKey: 'domainDevrel' },\n { value: 'id.sifa.defs#domainHrRecruitment', labelKey: 'domainHrRecruitment' },\n ],\n },\n {\n value: 'id.sifa.defs#industryNonprofit',\n labelKey: 'industryNonprofit',\n domains: [\n { value: 'id.sifa.defs#domainHumanRights', labelKey: 'domainHumanRights' },\n { value: 'id.sifa.defs#domainOpenSource', labelKey: 'domainOpenSource' },\n ],\n },\n {\n value: 'id.sifa.defs#industryRealEstate',\n labelKey: 'industryRealEstate',\n domains: [{ value: 'id.sifa.defs#domainProptech', labelKey: 'domainProptech' }],\n },\n {\n value: 'id.sifa.defs#industryTransport',\n labelKey: 'industryTransport',\n domains: [\n { value: 'id.sifa.defs#domainAutonomousVehicles', labelKey: 'domainAutonomousVehicles' },\n { value: 'id.sifa.defs#domainLogistics', labelKey: 'domainLogistics' },\n ],\n },\n {\n value: 'id.sifa.defs#industryAgriculture',\n labelKey: 'industryAgriculture',\n domains: [\n { value: 'id.sifa.defs#domainAgritech', labelKey: 'domainAgritech' },\n { value: 'id.sifa.defs#domainFoodTech', labelKey: 'domainFoodTech' },\n ],\n },\n {\n value: 'id.sifa.defs#industryHospitality',\n labelKey: 'industryHospitality',\n domains: [\n { value: 'id.sifa.defs#domainHotels', labelKey: 'domainHotels' },\n { value: 'id.sifa.defs#domainTravelTourism', labelKey: 'domainTravelTourism' },\n { value: 'id.sifa.defs#domainFoodBeverage', labelKey: 'domainFoodBeverage' },\n ],\n },\n {\n value: 'id.sifa.defs#industryTelecom',\n labelKey: 'industryTelecom',\n domains: [\n { value: 'id.sifa.defs#domainNetworkInfra', labelKey: 'domainNetworkInfra' },\n { value: 'id.sifa.defs#domainMobileServices', labelKey: 'domainMobileServices' },\n ],\n },\n {\n value: 'id.sifa.defs#industryMining',\n labelKey: 'industryMining',\n domains: [\n { value: 'id.sifa.defs#domainExtraction', labelKey: 'domainExtraction' },\n { value: 'id.sifa.defs#domainGeological', labelKey: 'domainGeological' },\n ],\n },\n {\n value: 'id.sifa.defs#industryFashion',\n labelKey: 'industryFashion',\n domains: [\n { value: 'id.sifa.defs#domainFashionDesign', labelKey: 'domainFashionDesign' },\n { value: 'id.sifa.defs#domainTextileManufacturing', labelKey: 'domainTextileManufacturing' },\n ],\n },\n {\n value: 'id.sifa.defs#industryMaritime',\n labelKey: 'industryMaritime',\n domains: [\n { value: 'id.sifa.defs#domainShipping', labelKey: 'domainShipping' },\n { value: 'id.sifa.defs#domainPortOperations', labelKey: 'domainPortOperations' },\n { value: 'id.sifa.defs#domainNavalArchitecture', labelKey: 'domainNavalArchitecture' },\n ],\n },\n {\n value: 'id.sifa.defs#industryOther',\n labelKey: 'industryOther',\n domains: [],\n },\n];\n\n/** Find the industry option for a given industry value. */\nexport function findIndustry(value: string | undefined | null): IndustryOption | undefined {\n if (!value) return undefined;\n return INDUSTRY_OPTIONS.find((i) => i.value === value);\n}\n\n/** Get the label key for an industry or domain token, falling back to the raw value. */\nexport function getIndustryLabelKey(value: string): string {\n for (const industry of INDUSTRY_OPTIONS) {\n if (industry.value === value) return industry.labelKey;\n for (const domain of industry.domains) {\n if (domain.value === value) return domain.labelKey;\n }\n }\n return value;\n}\n","/**\n * \"Open to\" taxonomy. Mirrors `id.sifa.defs#openToWorkStatus.knownValues` from\n * sifa-lexicons. Surfaces a single source of truth for the editor (where the\n * user picks values) and the IdentityCard (where badges are rendered).\n *\n * Shape matches `INDUSTRY_OPTIONS`: `{ value, labelKey }` so consumers can run\n * `labelKey` through their own i18n layer (e.g. next-intl `useTranslations`).\n */\n\nexport type OpenToGroup = 'work' | 'mentorship' | 'peer';\n\nexport interface OpenToOption {\n value: string;\n labelKey: string;\n token: string;\n group: OpenToGroup;\n}\n\nexport const OPEN_TO_OPTIONS: OpenToOption[] = [\n {\n value: 'id.sifa.defs#fullTimeRoles',\n labelKey: 'fullTimeRoles',\n token: 'fullTime',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#partTimeRoles',\n labelKey: 'partTimeRoles',\n token: 'partTime',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#contractRoles',\n labelKey: 'contractRoles',\n token: 'contract',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#commissions',\n labelKey: 'commissions',\n token: 'commissions',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#boardPositions',\n labelKey: 'boardPositions',\n token: 'board',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#mentoringOthers',\n labelKey: 'mentoringOthers',\n token: 'mentor',\n group: 'mentorship',\n },\n {\n value: 'id.sifa.defs#beingMentored',\n labelKey: 'beingMentored',\n token: 'mentee',\n group: 'mentorship',\n },\n {\n value: 'id.sifa.defs#collaborations',\n labelKey: 'collaborations',\n token: 'collab',\n group: 'peer',\n },\n];\n\n/** Map short token (e.g. \"fullTime\") -> lex value (e.g. \"id.sifa.defs#fullTimeRoles\"). */\nexport const OPEN_TO_TOKEN_TO_VALUE: Record<string, string> = Object.fromEntries(\n OPEN_TO_OPTIONS.map((o) => [o.token, o.value]),\n);\n\n/** Map lex value -> short token. */\nexport const OPEN_TO_VALUE_TO_TOKEN: Record<string, string> = Object.fromEntries(\n OPEN_TO_OPTIONS.map((o) => [o.value, o.token]),\n);\n\n/** All valid tokens, useful for runtime validation. */\nexport const OPEN_TO_TOKENS: readonly string[] = OPEN_TO_OPTIONS.map((o) => o.token);\n\n/** Resolve a token to its lex value, returning `undefined` if unknown. */\nexport function openToTokenToValue(token: string | undefined | null): string | undefined {\n if (!token) return undefined;\n return OPEN_TO_TOKEN_TO_VALUE[token];\n}\n\n/** Resolve a lex value to its token, returning `undefined` if unknown. */\nexport function openToValueToToken(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return OPEN_TO_VALUE_TO_TOKEN[value];\n}\n\n/**\n * Legacy aliases — tokens the lexicon used to expose but doesn't anymore.\n * Records written before the lexicon migration may still carry them; resolve\n * them to the closest current `labelKey` for display.\n */\nconst OPEN_TO_LEGACY_ALIASES: Record<string, string> = {\n 'id.sifa.defs#mentoring': 'mentoringOthers',\n};\n\nconst OPEN_TO_LABEL_KEY_MAP: Record<string, string> = {\n ...Object.fromEntries(OPEN_TO_OPTIONS.map((o) => [o.value, o.labelKey])),\n ...OPEN_TO_LEGACY_ALIASES,\n};\n\n/**\n * Resolve a `labelKey` for an `openToWorkStatus` token. Returns `undefined`\n * for tokens not in the canonical set or the legacy alias map, so callers\n * can choose their own fallback (e.g. render the raw value).\n */\nexport function getOpenToLabelKey(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return OPEN_TO_LABEL_KEY_MAP[value];\n}\n","/**\n * Workplace-type taxonomy. Mirrors `id.sifa.defs#workplaceType.knownValues`\n * from sifa-lexicons. `remote` is retained for legacy records but the scoped\n * variants (`remoteLocal`, `remoteRegion`, `remoteGlobal`) are preferred for\n * new records per the lexicon description.\n */\n\nexport interface WorkplaceTypeOption {\n value: string;\n label: string;\n}\n\nexport const WORKPLACE_TYPE_OPTIONS: WorkplaceTypeOption[] = [\n { value: 'id.sifa.defs#onSite', label: 'On-site' },\n { value: 'id.sifa.defs#hybrid', label: 'Hybrid' },\n { value: 'id.sifa.defs#remoteLocal', label: 'Remote (same country)' },\n { value: 'id.sifa.defs#remoteRegion', label: 'Remote (same region)' },\n { value: 'id.sifa.defs#remoteGlobal', label: 'Remote (anywhere)' },\n];\n\nexport const WORKPLACE_TYPE_LABELS: Record<string, string> = {\n ...Object.fromEntries(WORKPLACE_TYPE_OPTIONS.map((o) => [o.value, o.label])),\n 'id.sifa.defs#remote': 'Remote',\n};\n\n/** Resolve a label for a workplace-type token. Falls back to the raw value. */\nexport function getWorkplaceTypeLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return WORKPLACE_TYPE_LABELS[value] ?? value;\n}\n","/**\n * Platform identifiers, labels, and URL helpers used in profile external accounts.\n *\n * This file is intentionally data-only -- icon mapping is platform-specific\n * (React DOM components on web, React Native components on mobile) and lives\n * in the consumer.\n */\n\nexport const PLATFORM_LABELS = {\n bluesky: 'Bluesky',\n github: 'GitHub',\n codeberg: 'Codeberg',\n gitlab: 'GitLab',\n forgejo: 'Forgejo',\n gitea: 'Gitea',\n linkedin: 'LinkedIn',\n youtube: 'YouTube',\n twitter: 'X (Twitter)',\n instagram: 'Instagram',\n substack: 'Substack',\n tangled: 'Tangled',\n dns: 'Domain',\n website: 'Website',\n rss: 'RSS',\n fediverse: 'Fediverse',\n orcid: 'ORCID',\n keyoxide: 'Keyoxide',\n} as const;\n\nexport type PlatformId = keyof typeof PLATFORM_LABELS;\n\nexport function isKnownPlatform(platform: string): platform is PlatformId {\n return platform in PLATFORM_LABELS;\n}\n\nexport function getPlatformLabel(platform: string): string {\n return isKnownPlatform(platform) ? PLATFORM_LABELS[platform] : PLATFORM_LABELS.website;\n}\n\n/** Platforms excluded from the \"Add Links\" dropdown (auto-derived or not accepted by API). */\nconst EXCLUDED_FROM_DROPDOWN = new Set<PlatformId>(['bluesky', 'dns', 'tangled']);\n\n/** Platforms available in the \"Add Links\" dropdown. */\nexport const PLATFORM_OPTIONS: ReadonlyArray<{ value: PlatformId; label: string }> = (\n Object.entries(PLATFORM_LABELS) as [PlatformId, string][]\n)\n .filter(([value]) => !EXCLUDED_FROM_DROPDOWN.has(value))\n .map(([value, label]) => ({ value, label }));\n\n/**\n * Build a favicon URL for a given site URL using Google's public favicon service.\n * Returns `null` if the URL cannot be parsed.\n */\nexport function getFaviconUrl(siteUrl: string): string | null {\n try {\n const { hostname } = new URL(siteUrl);\n return `https://www.google.com/s2/favicons?domain=${encodeURIComponent(hostname)}&sz=32`;\n } catch {\n return null;\n }\n}\n","export const SKILL_CATEGORIES = [\n { value: 'technical', label: 'Technical' },\n { value: 'business', label: 'Business' },\n { value: 'creative', label: 'Creative' },\n { value: 'interpersonal', label: 'Interpersonal' },\n { value: 'industry', label: 'Industry' },\n { value: 'community', label: 'Community' },\n { value: 'security', label: 'Security' },\n] as const;\n\nexport type SkillCategory = (typeof SKILL_CATEGORIES)[number]['value'];\n\nexport const CATEGORY_ORDER: ReadonlyArray<SkillCategory> = SKILL_CATEGORIES.map((c) => c.value);\n\nexport const CATEGORY_LABELS: Record<SkillCategory | 'other', string> = {\n ...(Object.fromEntries(SKILL_CATEGORIES.map((c) => [c.value, c.label])) as Record<\n SkillCategory,\n string\n >),\n other: 'Other',\n};\n","import type { ProfileSkill } from '../types/index.js';\n\nimport { CATEGORY_ORDER } from './skill-categories.js';\n\nexport type MergedProfileSkill = ProfileSkill & {\n mergedRkeys: string[];\n positionRkeys?: string[];\n};\n\n/**\n * Collapses skills that resolve to the same name (case-insensitive, trimmed).\n *\n * LinkedIn import creates one skill record per (skill, position) pair, so a\n * profile can have several \"Ruby\" rows. We surface them as a single chip with\n * all underlying rkeys exposed via `mergedRkeys` so edit/delete can fan out.\n */\nexport function dedupeSkills(skills: ProfileSkill[]): MergedProfileSkill[] {\n const groups = new Map<string, MergedProfileSkill>();\n\n for (const skill of skills) {\n const key = skill.name.trim().toLowerCase();\n const existing = groups.get(key);\n const positions = (skill as ProfileSkill & { positionRkeys?: string[] }).positionRkeys ?? [];\n\n if (!existing) {\n groups.set(key, {\n ...skill,\n mergedRkeys: [skill.rkey],\n positionRkeys: [...positions],\n });\n continue;\n }\n\n existing.mergedRkeys.push(skill.rkey);\n if (!existing.category && skill.category) existing.category = skill.category;\n if ((skill.endorsementCount ?? 0) > (existing.endorsementCount ?? 0)) {\n existing.endorsementCount = skill.endorsementCount;\n }\n if (skill.endorsed) existing.endorsed = true;\n if (skill.activityBacked) existing.activityBacked = true;\n const merged = new Set([...(existing.positionRkeys ?? []), ...positions]);\n existing.positionRkeys = Array.from(merged);\n }\n\n return Array.from(groups.values());\n}\n\n/**\n * Groups skills by category in CATEGORY_ORDER, with unknown/empty categories\n * collected under \"other\". Within each group: sorted by endorsementCount desc,\n * then alphabetical by name. Empty groups are omitted.\n */\nexport function groupSkillsByCategory<T extends ProfileSkill>(skills: T[]): [string, T[]][] {\n const grouped = new Map<string, T[]>();\n\n for (const skill of skills) {\n const normalised = skill.category?.toLowerCase().trim() ?? '';\n const key = (CATEGORY_ORDER as readonly string[]).includes(normalised) ? normalised : 'other';\n const bucket = grouped.get(key) ?? [];\n bucket.push(skill);\n grouped.set(key, bucket);\n }\n\n for (const [, groupSkills] of grouped) {\n groupSkills.sort((a, b) => {\n const countDiff = (b.endorsementCount ?? 0) - (a.endorsementCount ?? 0);\n if (countDiff !== 0) return countDiff;\n return a.name.localeCompare(b.name);\n });\n }\n\n const ordered: [string, T[]][] = [];\n for (const cat of CATEGORY_ORDER) {\n const group = grouped.get(cat);\n if (group?.length) ordered.push([cat, group]);\n }\n const otherGroup = grouped.get('other');\n if (otherGroup?.length) ordered.push(['other', otherGroup]);\n\n return ordered;\n}\n","/**\n * App-category taxonomy for AT Protocol apps tracked by Sifa.\n *\n * Categories group apps by what kind of activity they produce (Posts, Photos,\n * Code, ...). They drive the pill-size icon shown in `<AppPill>` and the\n * fallback glyph used in activity-card headers when no app-specific logo\n * exists.\n *\n * This file is intentionally data-only -- icon mapping is renderer-specific\n * (React DOM Phosphor components on web, React Native components on mobile)\n * and lives in the consumer. The `phosphorIcon` field is the Phosphor icon\n * NAME, not a component reference.\n *\n * Categories are an internal grouping; we do not surface this taxonomy in\n * public-facing copy.\n */\n\nexport const APP_CATEGORIES = {\n Articles: { phosphorIcon: 'Article' },\n Chat: { phosphorIcon: 'ChatsCircle' },\n Code: { phosphorIcon: 'Code' },\n Endorsements: { phosphorIcon: 'HandHeart' },\n Events: { phosphorIcon: 'CalendarBlank' },\n Links: { phosphorIcon: 'LinkSimple' },\n Lists: { phosphorIcon: 'ListBullets' },\n Music: { phosphorIcon: 'MusicNote' },\n Pages: { phosphorIcon: 'Browser' },\n Pastes: { phosphorIcon: 'Clipboard' },\n Photos: { phosphorIcon: 'Camera' },\n Places: { phosphorIcon: 'MapPin' },\n Posts: { phosphorIcon: 'ChatCircle' },\n 'Q&A': { phosphorIcon: 'Question' },\n Research: { phosphorIcon: 'Path' },\n Reviews: { phosphorIcon: 'Star' },\n Social: { phosphorIcon: 'UsersThree' },\n Verification: { phosphorIcon: 'Key' },\n Video: { phosphorIcon: 'VideoCamera' },\n} as const;\n\nexport type AppCategoryId = keyof typeof APP_CATEGORIES;\n\nexport const APP_CATEGORY_IDS = Object.keys(APP_CATEGORIES) as AppCategoryId[];\n\nexport function isAppCategory(value: string): value is AppCategoryId {\n return Object.prototype.hasOwnProperty.call(APP_CATEGORIES, value);\n}\n\nexport function getAppCategoryIcon(category: AppCategoryId): string {\n return APP_CATEGORIES[category].phosphorIcon;\n}\n","/**\n * Maps every AT Protocol app Sifa tracks to its `AppCategoryId`. Single source\n * of truth for what category an app belongs to; sifa-api and sifa-web both\n * import from here.\n *\n * Add a new app: pick the category whose generic glyph best represents the\n * activity. If no existing category fits, add a new one to APP_CATEGORIES\n * rather than introducing a per-app override.\n */\n\nimport type { AppCategoryId } from './app-categories.js';\n\nexport const APP_CATEGORY_MAP = {\n // Backend-scanned (sifa-api APP_REGISTRY)\n bluesky: 'Posts',\n tangled: 'Code',\n github: 'Code',\n smokesignal: 'Events',\n flashes: 'Photos',\n grain: 'Photos',\n whitewind: 'Articles',\n frontpage: 'Links',\n pastesphere: 'Pastes',\n standard: 'Articles',\n aetheros: 'Pages',\n roomy: 'Social',\n keytrace: 'Verification',\n popfeed: 'Reviews',\n streamplace: 'Video',\n semble: 'Research',\n youandme: 'Social',\n leaflet: 'Articles',\n colibri: 'Social',\n collectivesocial: 'Lists',\n bookhive: 'Reviews',\n beaconbits: 'Places',\n passports: 'Places',\n asq: 'Q&A',\n spark: 'Posts',\n nooki: 'Social',\n atstore: 'Reviews',\n plyr: 'Music',\n anisota: 'Posts',\n atfund: 'Endorsements',\n\n // Web-only (rendered in pills/cards via sifa-web atproto-apps.ts;\n // no backend scan collection yet)\n linkat: 'Links',\n kipclip: 'Links',\n statusphere: 'Social',\n margin: 'Research',\n} as const satisfies Record<string, AppCategoryId>;\n\nexport type KnownAppId = keyof typeof APP_CATEGORY_MAP;\n\nexport function isKnownAppId(appId: string): appId is KnownAppId {\n return Object.prototype.hasOwnProperty.call(APP_CATEGORY_MAP, appId);\n}\n\nexport function categoryForApp(appId: string): AppCategoryId | undefined {\n return isKnownAppId(appId) ? APP_CATEGORY_MAP[appId] : undefined;\n}\n","{\n \"$schema\": \"https://sifa.id/schemas/activity-tiers/v1.json\",\n \"version\": \"1.0.0\",\n \"updated\": \"2026-05-28\",\n \"tiers\": {\n \"creation\": {\n \"label\": \"Made\",\n \"description\": \"Substantive records the actor authored: posts, articles, repos, galleries, livestreams, RSVPs, CV entries. Surfaced on the public profile and in the network timeline.\",\n \"shownOnPublicProfile\": true\n },\n \"action\": {\n \"label\": \"Did\",\n \"description\": \"Engagement records (likes, reposts, follows, votes, stars, reactions). Visible to the actor on the 'What is public about me' page and on the originating app, but not surfaced on the Sifa public profile.\",\n \"shownOnPublicProfile\": false\n },\n \"filtered\": {\n \"label\": null,\n \"description\": \"Configuration, infrastructure, moderation, game state, ephemeral consumption signals (bookmarks, highlights), and other records Sifa does not display anywhere. The records remain public on the actor's PDS regardless.\",\n \"shownOnPublicProfile\": false\n }\n },\n \"lexicons\": {\n \"app.bsky.feed.post\": {\n \"tier\": \"creation\",\n \"app\": \"bluesky\",\n \"notes\": \"Ambiguous: many posts are casual, but the lexicon also carries long-form posts and threads. Treated as creation; empty quote-posts (no text + record embed) are filtered at the consumer layer, not here.\"\n },\n \"app.bsky.feed.like\": { \"tier\": \"action\", \"app\": \"bluesky\" },\n \"app.bsky.feed.repost\": { \"tier\": \"action\", \"app\": \"bluesky\" },\n \"app.bsky.feed.generator\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"Feed generator definition record, not personal activity.\"\n },\n \"app.bsky.graph.follow\": { \"tier\": \"action\", \"app\": \"bluesky\" },\n \"app.bsky.graph.block\": { \"tier\": \"filtered\", \"app\": \"bluesky\", \"notes\": \"Moderation record.\" },\n \"app.bsky.graph.mute\": { \"tier\": \"filtered\", \"app\": \"bluesky\", \"notes\": \"Moderation record.\" },\n \"app.bsky.graph.listblock\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"Moderation record.\"\n },\n \"app.bsky.graph.listitem\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"List membership; rendered via the parent list, not as standalone activity.\"\n },\n \"app.bsky.graph.list\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"User-curated list metadata; not surfaced as profile activity.\"\n },\n \"app.bsky.graph.starterpack\": { \"tier\": \"filtered\", \"app\": \"bluesky\" },\n \"app.bsky.actor.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"Profile metadata record.\"\n },\n\n \"sh.tangled.repo\": { \"tier\": \"creation\", \"app\": \"tangled\" },\n \"sh.tangled.repo.issue\": { \"tier\": \"creation\", \"app\": \"tangled\" },\n \"sh.tangled.repo.pull\": { \"tier\": \"creation\", \"app\": \"tangled\" },\n \"sh.tangled.feed.star\": { \"tier\": \"action\", \"app\": \"tangled\" },\n \"sh.tangled.graph.follow\": { \"tier\": \"action\", \"app\": \"tangled\" },\n \"sh.tangled.actor.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"tangled\",\n \"notes\": \"Profile metadata record.\"\n },\n\n \"community.lexicon.calendar.rsvp\": {\n \"tier\": \"creation\",\n \"app\": \"smokesignal\",\n \"notes\": \"Ambiguous: RSVPs are reactions to events, but they are public commitments and the only Smoke Signal record Sifa scans today. Classified as creation.\"\n },\n \"events.smokesignal.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"smokesignal\",\n \"notes\": \"Profile metadata record.\"\n },\n\n \"blue.flashes.feed.post\": { \"tier\": \"creation\", \"app\": \"flashes\" },\n\n \"social.grain.gallery\": { \"tier\": \"creation\", \"app\": \"grain\" },\n \"social.grain.gallery.item\": {\n \"tier\": \"filtered\",\n \"app\": \"grain\",\n \"notes\": \"Item-within-gallery; rendered via parent gallery.\"\n },\n \"social.grain.photo\": {\n \"tier\": \"filtered\",\n \"app\": \"grain\",\n \"notes\": \"Raw photo asset; surfaced via the gallery that references it.\"\n },\n \"social.grain.photo.exif\": {\n \"tier\": \"filtered\",\n \"app\": \"grain\",\n \"notes\": \"EXIF metadata for a photo.\"\n },\n \"social.grain.story\": {\n \"tier\": \"filtered\",\n \"app\": \"grain\",\n \"notes\": \"Ephemeral story format.\"\n },\n\n \"com.whtwnd.blog.entry\": { \"tier\": \"creation\", \"app\": \"whitewind\" },\n\n \"fyi.unravel.frontpage.post\": { \"tier\": \"creation\", \"app\": \"frontpage\" },\n \"fyi.unravel.frontpage.vote\": { \"tier\": \"action\", \"app\": \"frontpage\" },\n\n \"social.psky.feed.post\": { \"tier\": \"creation\", \"app\": \"picosky\" },\n\n \"link.pastesphere.snippet\": { \"tier\": \"creation\", \"app\": \"pastesphere\" },\n\n \"site.standard.document\": { \"tier\": \"creation\", \"app\": \"standard\" },\n\n \"computer.aetheros.page\": { \"tier\": \"creation\", \"app\": \"aetheros\" },\n\n \"space.roomy.space.personal\": { \"tier\": \"creation\", \"app\": \"roomy\" },\n\n \"dev.keytrace.claim\": { \"tier\": \"creation\", \"app\": \"keytrace\" },\n\n \"social.popfeed.feed.review\": { \"tier\": \"creation\", \"app\": \"popfeed\" },\n \"social.popfeed.feed.post\": { \"tier\": \"creation\", \"app\": \"popfeed\" },\n \"social.popfeed.feed.note\": { \"tier\": \"creation\", \"app\": \"popfeed\" },\n \"social.popfeed.feed.like\": { \"tier\": \"action\", \"app\": \"popfeed\" },\n \"social.popfeed.challenge.participation\": {\n \"tier\": \"filtered\",\n \"app\": \"popfeed\",\n \"notes\": \"Challenge participation tracking.\"\n },\n \"social.popfeed.actor.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"popfeed\",\n \"notes\": \"Profile metadata record.\"\n },\n\n \"place.stream.livestream\": { \"tier\": \"creation\", \"app\": \"streamplace\" },\n \"place.stream.broadcast.origin\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Broadcast origin/infrastructure record.\"\n },\n \"place.stream.key\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Stream key — sensitive infrastructure record.\"\n },\n \"place.stream.metadata.configuration\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Stream configuration metadata.\"\n },\n \"place.stream.chat.message\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Ephemeral chat message.\"\n },\n \"place.stream.chat.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Chat profile metadata.\"\n },\n\n \"app.sidetrail.trail\": { \"tier\": \"creation\", \"app\": \"semble\" },\n \"app.sidetrail.walk\": { \"tier\": \"creation\", \"app\": \"semble\" },\n\n \"at.youandme.connection\": { \"tier\": \"creation\", \"app\": \"youandme\" },\n\n \"pub.leaflet.comment\": { \"tier\": \"creation\", \"app\": \"leaflet\" },\n \"pub.leaflet.interactions.recommend\": { \"tier\": \"action\", \"app\": \"leaflet\" },\n \"pub.leaflet.authFullPermissions\": {\n \"tier\": \"filtered\",\n \"app\": \"leaflet\",\n \"notes\": \"OAuth permission record.\"\n },\n\n \"social.colibri.membership\": { \"tier\": \"creation\", \"app\": \"colibri\" },\n \"social.colibri.message\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Chat message — high-volume conversational signal, not portfolio.\"\n },\n \"social.colibri.reaction\": { \"tier\": \"filtered\", \"app\": \"colibri\", \"notes\": \"Chat reaction.\" },\n \"social.colibri.channel\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Channel definition.\"\n },\n \"social.colibri.community\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Community definition.\"\n },\n \"social.colibri.approval\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Moderation approval record.\"\n },\n \"social.colibri.category\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Category metadata.\"\n },\n \"social.colibri.channel.read\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Read-state marker.\"\n },\n \"social.colibri.actor.data\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Actor metadata.\"\n },\n \"social.colibri.richtext.facet\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Richtext facet sub-record.\"\n },\n\n \"app.collectivesocial.feed.list\": {\n \"tier\": \"creation\",\n \"app\": \"collectivesocial\",\n \"notes\": \"Auto-created default Inbox lists are filtered at the consumer layer via isDefault=true predicate.\"\n },\n\n \"net.alternativeproto.vote\": {\n \"tier\": \"action\",\n \"notes\": \"Vote record on a third-party protocol.\"\n },\n \"network.cosmik.collection\": {\n \"tier\": \"filtered\",\n \"notes\": \"Stale registry id — Cosmik formerly in app registry.\"\n },\n \"network.cosmik.collectionLink\": { \"tier\": \"filtered\" },\n \"network.cosmik.connection\": { \"tier\": \"filtered\" },\n \"network.cosmik.follow\": { \"tier\": \"filtered\" },\n \"network.cosmik.card\": { \"tier\": \"filtered\", \"notes\": \"Link-in-bio card; consumption signal.\" },\n\n \"social.pinksky.app.preference\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"Pinkleap (Bluesky client) app preferences.\"\n },\n\n \"at.margin.bookmark\": {\n \"tier\": \"filtered\",\n \"notes\": \"Bookmark — consumption signal, not creation.\"\n },\n \"at.margin.highlight\": {\n \"tier\": \"filtered\",\n \"notes\": \"Highlight — consumption signal, not creation.\"\n },\n \"community.lexicon.bookmarks.bookmark\": {\n \"tier\": \"filtered\",\n \"notes\": \"Bookmark — consumption signal.\"\n },\n \"blue.linkat.board\": { \"tier\": \"filtered\", \"notes\": \"Link-in-bio board; consumption signal.\" },\n\n \"dev.skyboard.board\": { \"tier\": \"filtered\", \"notes\": \"Skyboard task-board metadata.\" },\n \"dev.skyboard.op\": { \"tier\": \"filtered\", \"notes\": \"Skyboard operation log.\" },\n \"dev.skyboard.task\": { \"tier\": \"filtered\", \"notes\": \"Skyboard task record.\" },\n\n \"net.anisota.player.state\": { \"tier\": \"filtered\", \"notes\": \"Anisota game player state.\" },\n \"xyz.statusphere.status\": {\n \"tier\": \"filtered\",\n \"notes\": \"Statusphere emoji status — leisure signal.\"\n },\n\n \"id.sifa.profile.self\": {\n \"tier\": \"creation\",\n \"app\": \"sifa\",\n \"notes\": \"Sifa professional profile root.\"\n },\n \"id.sifa.profile.position\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.education\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.skill\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.certification\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.project\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.volunteering\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.publication\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.course\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.honor\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.language\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.externalAccount\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.location\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.endorsement\": {\n \"tier\": \"creation\",\n \"app\": \"sifa\",\n \"notes\": \"Endorsement authored by the actor about another profile.\"\n },\n \"id.sifa.endorsement.confirmation\": {\n \"tier\": \"action\",\n \"app\": \"sifa\",\n \"notes\": \"Confirmation/acceptance of an endorsement received.\"\n },\n \"id.sifa.graph.follow\": { \"tier\": \"action\", \"app\": \"sifa\" },\n \"id.sifa.graph.connection\": {\n \"tier\": \"creation\",\n \"app\": \"sifa\",\n \"notes\": \"Mutual professional connection record.\"\n },\n \"id.sifa.project.self\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.project.member\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.project.membership\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.meeting\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.authProfile\": { \"tier\": \"filtered\", \"app\": \"sifa\", \"notes\": \"OAuth scope record.\" },\n \"id.sifa.authProfileAccess\": {\n \"tier\": \"filtered\",\n \"app\": \"sifa\",\n \"notes\": \"OAuth profile-access record.\"\n },\n \"id.sifa.authProject\": { \"tier\": \"filtered\", \"app\": \"sifa\", \"notes\": \"OAuth scope record.\" },\n \"id.sifa.authConnection\": { \"tier\": \"filtered\", \"app\": \"sifa\", \"notes\": \"OAuth scope record.\" },\n \"id.sifa.authMeet\": { \"tier\": \"filtered\", \"app\": \"sifa\", \"notes\": \"OAuth scope record.\" },\n\n \"forum.barazo.post\": { \"tier\": \"creation\", \"app\": \"barazo\" },\n \"forum.barazo.community.member\": { \"tier\": \"creation\", \"app\": \"barazo\" },\n \"forum.barazo.reputation.event\": { \"tier\": \"creation\", \"app\": \"barazo\" },\n \"forum.barazo.reaction\": { \"tier\": \"action\", \"app\": \"barazo\" },\n \"forum.barazo.reply\": {\n \"tier\": \"action\",\n \"app\": \"barazo\",\n \"notes\": \"Short conversational reply — engagement signal.\"\n },\n \"forum.barazo.flag\": { \"tier\": \"filtered\", \"app\": \"barazo\", \"notes\": \"Moderation flag.\" }\n }\n}\n","import { z } from 'zod';\n\nimport rawTaxonomy from './activity-tiers.json' with { type: 'json' };\n\nexport type ActivityTier = 'creation' | 'action' | 'filtered';\n\nexport interface TierMeta {\n label: string | null;\n description: string;\n shownOnPublicProfile: boolean;\n}\n\nexport interface LexiconEntry {\n tier: ActivityTier;\n app?: string;\n notes?: string;\n}\n\nexport interface ActivityTaxonomy {\n version: string;\n updated: string;\n tiers: Record<ActivityTier, TierMeta>;\n lexicons: Record<string, LexiconEntry>;\n}\n\nconst tierMetaSchema = z.object({\n label: z.string().nullable(),\n description: z.string(),\n shownOnPublicProfile: z.boolean(),\n});\n\nconst lexiconEntrySchema = z.object({\n tier: z.enum(['creation', 'action', 'filtered']),\n app: z.string().optional(),\n notes: z.string().optional(),\n});\n\nconst taxonomySchema = z.object({\n version: z.string(),\n updated: z.string(),\n tiers: z.object({\n creation: tierMetaSchema,\n action: tierMetaSchema,\n filtered: tierMetaSchema,\n }),\n lexicons: z.record(z.string(), lexiconEntrySchema),\n});\n\nconst parsed: ActivityTaxonomy = taxonomySchema.parse(rawTaxonomy);\n\nexport const ACTIVITY_TIERS: Readonly<ActivityTaxonomy> = Object.freeze(parsed);\n\n/**\n * Returns the activity tier for a given AT Protocol NSID.\n * Returns 'filtered' for unknown/unclassified NSIDs (safe default — won't\n * leak unknown records to public profile surfaces).\n */\nexport function getActivityTier(nsid: string): ActivityTier {\n if (!nsid) return 'filtered';\n const entry = ACTIVITY_TIERS.lexicons[nsid];\n return entry ? entry.tier : 'filtered';\n}\n\n/**\n * Returns the full lexicon entry (tier + app + notes), or null if unknown.\n */\nexport function getLexiconEntry(nsid: string): LexiconEntry | null {\n if (!nsid) return null;\n const entry = ACTIVITY_TIERS.lexicons[nsid];\n return entry ?? null;\n}\n\n/**\n * Returns tier metadata (label, description, public visibility).\n */\nexport function getTierMeta(tier: ActivityTier): TierMeta {\n return ACTIVITY_TIERS.tiers[tier];\n}\n\n/**\n * Returns the taxonomy version + updated date for diagnostics and\n * version-skew detection between SDK consumers and the canonical taxonomy.\n */\nexport function getActivityTaxonomyVersion(): { version: string; updated: string } {\n return { version: ACTIVITY_TIERS.version, updated: ACTIVITY_TIERS.updated };\n}\n","/**\n * Format a date string as a relative time (e.g. \"5m ago\", \"3d ago\").\n * Returns an empty string for invalid or future dates.\n */\nexport function formatRelativeTime(dateString: string): string {\n const date = new Date(dateString);\n if (isNaN(date.getTime())) return '';\n\n const now = Date.now();\n const diffMs = now - date.getTime();\n if (diffMs < 0) return '';\n\n const seconds = Math.floor(diffMs / 1000);\n if (seconds < 60) return `${seconds}s ago`;\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days}d ago`;\n\n const months = Math.floor(days / 30);\n if (months < 12) return `${months}mo ago`;\n\n const years = Math.floor(months / 12);\n return `${years}y ago`;\n}\n","/**\n * Sort profile section items from newest to oldest.\n *\n * Rules:\n * - Items with no end date (ongoing/current) sort to the top.\n * - Primary sort: end date descending (newest first).\n * - Secondary sort: start date descending (newest first).\n * - Items with no dates sort to the bottom.\n *\n * Date strings are ISO-ish (\"2024\", \"2024-03\", \"2024-03-15\") and\n * lexicographic comparison works correctly for them.\n */\n\ninterface DateRange {\n startDate?: string;\n endDate?: string;\n current?: boolean;\n}\n\ntype DateExtractor<T> = (item: T) => DateRange;\n\nconst FAR_FUTURE = '9999-12-31';\nconst FAR_PAST = '0000-01-01';\n\nexport function sortByDateDesc<T>(items: T[], extract: DateExtractor<T>): T[] {\n return [...items].sort((a, b) => {\n const da = extract(a);\n const db = extract(b);\n\n const endA = da.current ? FAR_FUTURE : (da.endDate ?? '');\n const endB = db.current ? FAR_FUTURE : (db.endDate ?? '');\n\n // Items with any date beat items with no dates at all\n const hasDateA = endA || da.startDate;\n const hasDateB = endB || db.startDate;\n if (hasDateA && !hasDateB) return -1;\n if (!hasDateA && hasDateB) return 1;\n\n // Primary: end date descending\n if (endA !== endB) return endB.localeCompare(endA);\n\n // Secondary: start date descending\n const startA = da.startDate ?? FAR_PAST;\n const startB = db.startDate ?? FAR_PAST;\n return startB.localeCompare(startA);\n });\n}\n\n/**\n * Convenience extractor for items that use `startDate` / `endDate` fields directly.\n * Used by volunteering, projects, and other sections that still use startDate/endDate.\n */\nexport function dateRangeExtractor<\n T extends { startDate?: string; endDate?: string; current?: boolean },\n>(item: T): DateRange {\n return { startDate: item.startDate, endDate: item.endDate, current: item.current };\n}\n\n/**\n * Extractor for lexicon-aligned items that use `startedAt` / `endedAt` fields.\n * Used by positions and education (current derived from !endedAt).\n */\nexport function lexiconDateExtractor<T extends { startedAt?: string; endedAt?: string }>(\n item: T,\n): DateRange {\n return { startDate: item.startedAt, endDate: item.endedAt, current: !item.endedAt };\n}\n\n/**\n * Convenience extractor for items with a single `date` field.\n */\nexport function singleDateExtractor<T extends { date?: string }>(item: T): DateRange {\n return { endDate: item.date };\n}\n\n/**\n * Extractor for certifications which use `issueDate` / `expiryDate`.\n */\nexport function certDateExtractor<T extends { issueDate?: string; expiryDate?: string }>(\n item: T,\n): DateRange {\n return { startDate: item.issueDate, endDate: item.expiryDate ?? item.issueDate };\n}\n","/**\n * Sanitize raw user input into a valid AT Protocol identifier (handle or DID).\n *\n * Handles common mistakes:\n * - Pasting a full Bluesky profile URL\n * - Pasting a raw HTTPS URL to a PDS domain\n * - Using an at:// URI\n * - Prefixing with @\n * - Entering a bare username without .bsky.social\n */\nexport function sanitizeHandleInput(raw: string): string {\n let identifier = raw\n .trim()\n .replace(/^https?:\\/\\/bsky\\.app\\/profile\\//i, '')\n .replace(/^at:\\/\\//i, '')\n .replace(/^@/, '')\n .replace(/^https?:\\/\\//i, '');\n if (!identifier.startsWith('did:')) {\n identifier = identifier.split('/')[0] ?? identifier;\n }\n identifier = identifier.replace(/\\.$/, '');\n if (!identifier.startsWith('did:')) {\n identifier = identifier.toLowerCase();\n }\n\n // Auto-append .bsky.social for bare usernames (no dots, not a DID)\n if (identifier && !identifier.startsWith('did:') && !identifier.includes('.')) {\n identifier = `${identifier}.bsky.social`;\n }\n\n return identifier;\n}\n","import type { LocationValue } from '../types/index.js';\n\n/**\n * Format a LocationValue for display.\n *\n * Prefers `locality` (the community.lexicon.location.address field) and\n * falls back to the legacy `city` slot so values produced before the\n * sifa-api alias migration still render correctly during the additive\n * transition window.\n */\nexport function formatLocation(loc: LocationValue | null | undefined): string {\n if (!loc) return '';\n const locality = loc.locality ?? loc.city;\n const parts = [locality, loc.region, loc.country].filter(Boolean);\n if (loc.postalCode && !locality) {\n return `${loc.postalCode}, ${loc.country}`;\n }\n return parts.join(', ');\n}\n\n/** Parse a display string back into a LocationValue (best-effort for legacy data) */\nexport function parseLocationString(str: string): LocationValue | null {\n if (!str.trim()) return null;\n const parts = str\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n if (parts.length >= 3) {\n return {\n city: parts[0],\n region: parts[1],\n country: parts[parts.length - 1]!,\n };\n }\n if (parts.length === 2) {\n return {\n city: parts[0],\n country: parts[1]!,\n };\n }\n return { country: parts[0]! };\n}\n\n/** Convert ISO 3166-1 alpha-2 country code to flag emoji */\nexport function countryCodeToFlag(code: string | undefined): string {\n if (!code || code.length !== 2) return '';\n const upper = code.toUpperCase();\n const a = upper.codePointAt(0);\n const b = upper.codePointAt(1);\n if (a === undefined || b === undefined) return '';\n return String.fromCodePoint(a - 0x41 + 0x1f1e6, b - 0x41 + 0x1f1e6);\n}\n","import type { PdsProviderInfo } from '../types/index.js';\n\nexport interface PdsProvider {\n name: string;\n profileUrl: string;\n host?: string;\n}\n\nconst BSKY_PROFILE_BASE = 'https://bsky.app/profile/';\n\nconst PDS_PROVIDERS: { suffix: string; name: string }[] = [\n { suffix: '.bsky.social', name: 'bluesky' },\n { suffix: '.blacksky.app', name: 'blacksky' },\n { suffix: '.eurosky.social', name: 'eurosky' },\n { suffix: '.northsky.social', name: 'northsky' },\n];\n\nconst KNOWN_PROVIDER_NAMES = new Set(PDS_PROVIDERS.map((p) => p.name));\n\nconst ICON_ONLY_PROVIDERS = new Set(['selfhosted-social', 'selfhosted']);\n\nexport function pdsProviderFromApi(\n apiProvider: PdsProviderInfo | null | undefined,\n handle: string,\n): PdsProvider | null {\n if (!apiProvider) return null;\n if (ICON_ONLY_PROVIDERS.has(apiProvider.name)) {\n return { name: apiProvider.name, profileUrl: '', host: apiProvider.host };\n }\n if (!KNOWN_PROVIDER_NAMES.has(apiProvider.name)) return null;\n return {\n name: apiProvider.name,\n profileUrl: `${BSKY_PROFILE_BASE}${handle}`,\n host: apiProvider.host,\n };\n}\n\nexport function getHandleStem(handle: string): string {\n const lower = handle.toLowerCase();\n for (const provider of PDS_PROVIDERS) {\n if (lower.endsWith(provider.suffix) && lower.length > provider.suffix.length) {\n return handle.slice(0, -provider.suffix.length);\n }\n }\n return handle;\n}\n\nexport function getDisplayLabel(displayName: string | undefined, handle: string): string {\n if (displayName) return displayName;\n return getHandleStem(handle);\n}\n\n/**\n * Combine optional structured name fields (`id.sifa.profile.self.givenName`,\n * `familyName`) into a single string in Schema.org `Person` order — given\n * before family. Returns `undefined` when both are absent so callers can\n * fall back to `displayName`. Whitespace-only inputs are treated as absent.\n * Does not impose cultural ordering: users whose preferred presentation\n * differs (e.g. Eastern name order) should set `displayName` accordingly,\n * which this helper deliberately does not consult.\n */\nexport function formatStructuredName(\n givenName: string | undefined,\n familyName: string | undefined,\n): string | undefined {\n const given = givenName?.trim();\n const family = familyName?.trim();\n if (given && family) return `${given} ${family}`;\n return given || family || undefined;\n}\n\nconst PDS_DISPLAY_NAMES: Record<string, string> = {\n bluesky: 'Bluesky',\n blacksky: 'BlackSky',\n eurosky: 'EuroSky',\n northsky: 'NorthSky',\n 'selfhosted-social': 'Self-hosted',\n selfhosted: 'Self-hosted',\n};\n\nexport function getPdsDisplayName(providerName: string): string {\n return PDS_DISPLAY_NAMES[providerName] ?? providerName;\n}\n\nexport function detectPdsProvider(handle: string): PdsProvider | null {\n const lower = handle.toLowerCase();\n for (const provider of PDS_PROVIDERS) {\n if (lower.endsWith(provider.suffix)) {\n return {\n name: provider.name,\n profileUrl: `${BSKY_PROFILE_BASE}${handle}`,\n };\n }\n }\n return null;\n}\n","const COMBINING_MARK = /\\p{M}/u;\nconst BIDI_CONTROLS = /[--]/gu;\n\n/**\n * Limit runs of Unicode combining marks (`\\p{M}`) to at most `maxPerBase`\n * marks following any single base character. Defuses \"Zalgo\" text where\n * dozens of stacked combining marks render outside the line box and bleed\n * into neighbouring UI.\n *\n * `maxPerBase` defaults to 4 — high enough to preserve legitimate stacks\n * in Thai, Arabic, Vietnamese, and IPA, low enough to neutralise the\n * vertical-overflow attack vector.\n */\nexport function limitCombiningMarks(value: string, maxPerBase = 4): string {\n if (!value || !COMBINING_MARK.test(value)) return value;\n\n let out = '';\n let combiningRun = 0;\n for (const char of value) {\n if (/\\p{M}/u.test(char)) {\n if (combiningRun < maxPerBase) {\n out += char;\n combiningRun += 1;\n }\n } else {\n out += char;\n combiningRun = 0;\n }\n }\n return out;\n}\n\n/**\n * Sanitise untrusted display text from PDS records before rendering in UI:\n * - strips bidi formatting controls (LRM/RLM/LRE/RLE/PDF/LRO/RLO/LRI/RLI/FSI/PDI)\n * that can hijack reading order or crash `next/og` (see Satori LRM+emoji bug)\n * - limits stacked combining marks (Zalgo defence)\n *\n * Preserves ZWJ (U+200D) so emoji sequences keep rendering.\n */\nexport function sanitizeDisplayText(value: string, maxCombiningPerBase = 4): string {\n if (!value) return value;\n return limitCombiningMarks(value.replace(BIDI_CONTROLS, ''), maxCombiningPerBase);\n}\n","const ELLIPSIS = '\\u2026';\n\n/**\n * Truncate a string to at most `maxLen` grapheme clusters, appending an\n * ellipsis when the string was shortened. Grapheme-aware so it never splits\n * emoji sequences (ZWJ, regional indicators, combining marks, surrogate pairs).\n */\nexport function truncateGraphemes(value: string, maxLen: number): string {\n if (maxLen <= 0) return '';\n const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n const graphemes = Array.from(segmenter.segment(value), (s) => s.segment);\n if (graphemes.length <= maxLen) return value;\n if (maxLen === 1) return ELLIPSIS;\n return graphemes.slice(0, maxLen - 1).join('') + ELLIPSIS;\n}\n","/**\n * Format a date as a relative time string (e.g. \"2 minutes ago\", \"3 days ago\").\n */\nexport function formatDistanceToNow(date: Date): string {\n const seconds = Math.floor((Date.now() - date.getTime()) / 1000);\n if (seconds < 60) return 'just now';\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d ago`;\n\n const weeks = Math.floor(days / 7);\n if (weeks < 5) return `${weeks}w ago`;\n\n const months = Math.floor(days / 30);\n return `${months}mo ago`;\n}\n","/**\n * WCAG 2.2 contrast ratio utilities for validating publication theme colors.\n * Implements the relative luminance and contrast ratio formulas from\n * https://www.w3.org/TR/WCAG22/#dfn-relative-luminance\n */\n\nexport interface RgbColor {\n r: number;\n g: number;\n b: number;\n}\n\n/**\n * Return true when the value is an RgbColor with all channels as integers in [0, 255].\n * Use this before passing untrusted data to the luminance / contrast functions.\n */\nexport function isValidRgbColor(value: unknown): value is RgbColor {\n if (value == null || typeof value !== 'object') return false;\n const { r, g, b } = value as Record<string, unknown>;\n return (\n typeof r === 'number' &&\n typeof g === 'number' &&\n typeof b === 'number' &&\n Number.isFinite(r) &&\n Number.isFinite(g) &&\n Number.isFinite(b) &&\n r >= 0 &&\n r <= 255 &&\n g >= 0 &&\n g <= 255 &&\n b >= 0 &&\n b <= 255\n );\n}\n\n/**\n * Serialize an RgbColor to a CSS `rgb(...)` string.\n * Channels are floored to integers to prevent sub-pixel drift.\n */\nexport function rgbToString(color: RgbColor): string {\n return `rgb(${Math.floor(color.r)}, ${Math.floor(color.g)}, ${Math.floor(color.b)})`;\n}\n\n/**\n * Calculate relative luminance of an sRGB color per WCAG 2.2.\n * Input channels must be numbers in [0, 255].\n */\nexport function relativeLuminance(color: RgbColor): number {\n const [rs, gs, bs] = [color.r / 255, color.g / 255, color.b / 255];\n\n const r = rs <= 0.04045 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const g = gs <= 0.04045 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const b = bs <= 0.04045 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/**\n * Calculate WCAG 2.2 contrast ratio between two colors.\n * Returns a value between 1 (identical) and 21 (black/white).\n */\nexport function contrastRatio(color1: RgbColor, color2: RgbColor): number {\n const l1 = relativeLuminance(color1);\n const l2 = relativeLuminance(color2);\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * Check if two colors meet WCAG 2.2 AA contrast requirement (4.5:1 for normal text).\n */\nexport function meetsContrastAA(foreground: RgbColor, background: RgbColor): boolean {\n return contrastRatio(foreground, background) >= 4.5;\n}\n","/**\n * URL patterns per app, mirroring the sifa-web registry.\n *\n * These describe how to build a clickable URL for an activity card given\n * the author's handle/did and the record rkey. The patterns are templates\n * with `{handle}`, `{did}`, and `{rkey}` placeholders; each variable is\n * URI-encoded when interpolated.\n *\n * Tier semantics:\n * - `urlPattern`: per-item URL (a specific post/event/repo). Preferred.\n * - `profileUrlPattern`: per-user profile URL on the app. Fallback.\n *\n * Apps without either pattern are not clickable.\n */\nexport interface AppUrlPatterns {\n urlPattern?: string;\n profileUrlPattern?: string;\n}\n\nexport const APP_URL_PATTERNS: Readonly<Record<string, AppUrlPatterns>> = Object.freeze({\n bluesky: {\n urlPattern: 'https://bsky.app/profile/{handle}/post/{rkey}',\n profileUrlPattern: 'https://bsky.app/profile/{handle}',\n },\n tangled: {\n profileUrlPattern: 'https://tangled.sh/{handle}',\n },\n smokesignal: {\n urlPattern: 'https://smokesignal.events/{did}/{rkey}',\n profileUrlPattern: 'https://smokesignal.events/{did}',\n },\n whitewind: {\n urlPattern: 'https://whtwnd.com/{handle}/{rkey}',\n profileUrlPattern: 'https://whtwnd.com/{handle}',\n },\n frontpage: {\n urlPattern: 'https://frontpage.fyi/post/{did}/{rkey}',\n profileUrlPattern: 'https://frontpage.fyi/profile/{did}',\n },\n linkat: {\n profileUrlPattern: 'https://linkat.blue/{handle}',\n },\n pastesphere: {\n urlPattern: 'https://pastesphere.link/user/{handle}/snippet/{rkey}',\n profileUrlPattern: 'https://pastesphere.link/user/{handle}',\n },\n kipclip: {\n profileUrlPattern: 'https://kipclip.com/{handle}',\n },\n keytrace: {\n profileUrlPattern: 'https://keytrace.dev/@{handle}',\n },\n sifa: {\n profileUrlPattern: 'https://sifa.id/p/{handle}',\n },\n popfeed: {\n urlPattern: 'https://popfeed.social/profile/{handle}',\n profileUrlPattern: 'https://popfeed.social/profile/{handle}',\n },\n streamplace: {\n profileUrlPattern: 'https://stream.place/{handle}',\n },\n semble: {\n profileUrlPattern: 'https://semble.so/profile/{handle}',\n },\n grain: {\n urlPattern: 'https://grain.social/profile/{did}/gallery/{rkey}',\n profileUrlPattern: 'https://grain.social/profile/{did}',\n },\n youandme: { profileUrlPattern: 'https://youandme.at' },\n // anisota: upgraded with per-record URL pattern below.\n margin: { profileUrlPattern: 'https://margin.at' },\n beaconbits: { profileUrlPattern: 'https://beaconbits.app' },\n bookhive: { profileUrlPattern: 'https://bookhive.buzz/profile/{handle}' },\n colibri: { profileUrlPattern: 'https://colibri.social' },\n collectivesocial: { profileUrlPattern: 'https://app.collectivesocial.app' },\n github: {},\n asq: {\n // Questions live at /q/{did}/{rkey}. Answer cards build their own URL\n // from the parsed subject.uri (which points to the question), so the\n // pattern below is invoked only for question records.\n urlPattern: 'https://asq.fyi/q/{did}/{rkey}',\n profileUrlPattern: 'https://asq.fyi',\n },\n passports: {\n // Per-record URLs don't exist on passports.social — its SvelteKit routes\n // stop at /profile/{handle}/{passport_slug}. Profile-level fallback only.\n profileUrlPattern: 'https://passports.social/profile/{handle}',\n },\n leaflet: {\n // Per-document URLs are short and rkey-only: https://leaflet.pub/{rkey}.\n // Each publication has its own base_path subdomain (e.g. zzstoatzz.leaflet.pub)\n // but the canonical short URL renders the same document. There is no\n // per-user profile route on leaflet.pub, so the profile fallback points\n // at the marketing site.\n urlPattern: 'https://leaflet.pub/{rkey}',\n profileUrlPattern: 'https://leaflet.pub',\n },\n spark: {\n // Verified live: GET /post/{did}/{rkey} returns 200.\n urlPattern: 'https://sprk.so/post/{did}/{rkey}',\n profileUrlPattern: 'https://sprk.so/profile/{handle}',\n },\n anisota: {\n urlPattern: 'https://anisota.net/post/{did}/{rkey}',\n profileUrlPattern: 'https://anisota.net/profile/{handle}',\n },\n nooki: {\n // Per-post URLs use slug-based routing (e.g. /post/{slug}), not rkey —\n // can't be constructed from a record. Profile fallback only.\n profileUrlPattern: 'https://nooki.me/user/{handle}',\n },\n atstore: {\n // atstore.fyi has no user-profile pages (the legacy `/@{handle}` pattern\n // resolved to a 404), and no per-review deep link exists. The per-product\n // page (https://atstore.fyi/products/{slug}) is the most specific URL\n // available — resolveCardUrl builds it from record.listingMeta.slug,\n // which sifa-api enriches by resolving the review's `subject` to the\n // referenced listing.detail record.\n profileUrlPattern: 'https://atstore.fyi',\n },\n plyr: {\n // SPA — per-record URLs require JS routing. plyr.fm doesn't expose a\n // public per-handle profile page server-side either; falls back to root.\n profileUrlPattern: 'https://plyr.fm',\n },\n atfund: {\n // at.fund is auth-gated — `/give/{did}` 307s to `/` when not signed in,\n // and there's no public per-endorsement permalink. Profile fallback only,\n // pointing at the main /give listing.\n profileUrlPattern: 'https://www.at.fund/give',\n },\n});\n\n/**\n * Map collection NSID prefixes to app ids. Order matters: longer / more\n * specific prefixes must come before broader ones.\n */\nexport const COLLECTION_TO_APP: ReadonlyArray<readonly [prefix: string, appId: string]> = [\n ['app.bsky.', 'bluesky'],\n ['sh.tangled.', 'tangled'],\n ['events.smokesignal.', 'smokesignal'],\n ['community.lexicon.calendar.', 'smokesignal'],\n ['community.lexicon.bookmarks.', 'kipclip'],\n ['com.kipclip.', 'kipclip'],\n ['blue.flashes.', 'flashes'],\n ['social.grain.', 'grain'],\n ['com.whtwnd.', 'whitewind'],\n ['fyi.unravel.frontpage.', 'frontpage'],\n ['social.psky.', 'picosky'],\n ['blue.linkat.', 'linkat'],\n ['link.pastesphere.', 'pastesphere'],\n ['site.standard.', 'standard'],\n ['computer.aetheros.', 'aetheros'],\n ['space.roomy.', 'roomy'],\n ['dev.keytrace.', 'keytrace'],\n ['social.popfeed.', 'popfeed'],\n ['app.popsky.', 'popfeed'],\n ['place.stream.', 'streamplace'],\n ['app.sidetrail.', 'semble'],\n ['network.cosmik.', 'cosmik'],\n ['id.sifa.', 'sifa'],\n ['forum.barazo.', 'barazo'],\n ['xyz.statusphere.', 'statusphere'],\n ['at.youandme.', 'youandme'],\n ['net.anisota.', 'anisota'],\n ['at.margin.', 'margin'],\n ['app.beaconbits.', 'beaconbits'],\n ['buzz.bookhive.', 'bookhive'],\n ['social.colibri.', 'colibri'],\n ['social.passports.', 'passports'],\n ['fyi.asq.', 'asq'],\n ['pub.leaflet.', 'leaflet'],\n ['so.sprk.', 'spark'],\n ['community.nooki.', 'nooki'],\n ['fyi.atstore.', 'atstore'],\n ['fm.plyr.', 'plyr'],\n ['fund.at.', 'atfund'],\n];\n","import { APP_URL_PATTERNS, COLLECTION_TO_APP } from './app-url-patterns.js';\n\n/**\n * An activity item as consumed by the Sifa activity-card components and\n * the sifa-api external-URL health scanner. The shape mirrors the props\n * the cards already use, so the resolver returns the same URL the UI\n * renders.\n */\nexport interface ActivityItemForUrl {\n /** Collection NSID, e.g. \"sh.tangled.graph.repo\". */\n collection: string;\n /** The raw record from the PDS / API. */\n record: Record<string, unknown>;\n /** Full at-uri of the record (used by collections that derive URL from uri). */\n uri: string;\n /** Record key. */\n rkey: string;\n /** DID of the author of the record. */\n authorDid: string;\n /** Optional handle (cards prefer handle in URL paths when available). */\n authorHandle?: string;\n}\n\n/**\n * Map a collection NSID to its app id, mirroring the sifa-web prefix map.\n *\n * Falls back to the first two NSID segments (e.g. \"org.hyperboards\") when\n * the prefix is not registered, matching the existing card behaviour.\n */\nexport function getAppIdForCollection(collection: string): string {\n for (const [prefix, appId] of COLLECTION_TO_APP) {\n if (collection.startsWith(prefix)) return appId;\n }\n const parts = collection.split('.');\n if (parts.length >= 2) return `${parts[0]}.${parts[1]}`;\n return collection;\n}\n\nfunction interpolate(pattern: string, vars: Record<string, string | undefined>): string | null {\n let result = pattern;\n for (const [key, value] of Object.entries(vars)) {\n if (result.includes(`{${key}}`)) {\n if (!value) return null;\n result = result.replaceAll(`{${key}}`, encodeURIComponent(value));\n }\n }\n return result;\n}\n\n/**\n * Whether the per-item `urlPattern` for `appId` is appropriate for `collection`.\n *\n * For bluesky, the per-item URL pattern only matches `app.bsky.feed.post` —\n * other `app.bsky.*` collections (`actor.status`, `graph.cancellation`, etc.)\n * use rkeys that would 404 at `bsky.app/profile/{handle}/post/{rkey}`. Fall\n * back to the profile URL for those. See sifa-web#1070 / sifa-web#1073.\n *\n * When `collection` is undefined we err on the safe side for bluesky and\n * prefer the profile URL.\n */\nfunction shouldUseItemPattern(appId: string, collection: string | undefined): boolean {\n if (appId === 'bluesky') {\n return collection === 'app.bsky.feed.post';\n }\n return true;\n}\n\nfunction patternUrl(\n appId: string,\n vars: { handle?: string; did?: string; rkey?: string },\n collection?: string,\n): string | null {\n const patterns = APP_URL_PATTERNS[appId];\n if (!patterns) return null;\n\n if (patterns.urlPattern && shouldUseItemPattern(appId, collection)) {\n const url = interpolate(patterns.urlPattern, vars);\n if (url) return url;\n }\n if (patterns.profileUrlPattern) {\n const url = interpolate(patterns.profileUrlPattern, vars);\n if (url) return url;\n }\n return null;\n}\n\n/**\n * Valid tangled repo slug: alphanumeric, dot, dash, underscore. No whitespace,\n * slashes, or URL-encodable special characters. Multi-segment aggregate `name`\n * values produce 404 URLs, so callers fall back to the profile URL when\n * invalid. See sifa-web#1071 / sifa-web#1072.\n */\nconst TANGLED_REPO_SLUG = /^[a-zA-Z0-9._-]+$/;\n\nfunction stringOrNull(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\n// at://did:plc:xxx/community.lexicon.calendar.event/rkey\n// -> { did: \"did:plc:xxx\", rkey: \"rkey\" }\nfunction parseAtUri(atUri: string): { did: string; rkey: string } | null {\n const match = atUri.match(/^at:\\/\\/(did:[^/]+)\\/[^/]+\\/(.+)$/);\n if (!match || !match[1] || !match[2]) return null;\n return { did: match[1], rkey: match[2] };\n}\n\n/**\n * Resolve the canonical clickable URL for an activity item — the same URL\n * the activity-card UI in sifa-web renders.\n *\n * Returns `null` when no link is appropriate (the card would render\n * non-clickable, or hide itself entirely).\n *\n * Used by:\n * - sifa-web activity cards (single source of truth for href)\n * - sifa-api external-URL health scanner (must match what the UI links to,\n * so broken-link detection lines up with what users actually click)\n *\n * Resolution order:\n * 1. Per-collection bespoke logic (tangled, kipclip, margin, smokesignal\n * rsvp, standard documents). These mirror the inline logic in the\n * individual card components.\n * 2. Generic `record.url` field (used by hyperboards and similar).\n * 3. Pattern-based per-item / profile URL from the registry.\n */\nexport function resolveCardUrl(item: ActivityItemForUrl): string | null {\n const { collection, record, uri, rkey, authorDid, authorHandle } = item;\n const appId = getAppIdForCollection(collection);\n\n // --- Per-collection bespoke logic (mirrors the card components) ---\n\n // Tangled: prefer per-repo URL `https://tangled.sh/{handle}/{record.name}`.\n // Only when record.name is a valid repo slug — multi-segment aggregate names\n // (whitespace, slashes, special chars) would 404. See sifa-web#1071.\n if (collection.startsWith('sh.tangled.')) {\n const repoName = stringOrNull(record.name);\n if (repoName && authorHandle && TANGLED_REPO_SLUG.test(repoName)) {\n return `https://tangled.sh/${authorHandle}/${repoName}`;\n }\n return patternUrl('tangled', { handle: authorHandle, did: authorDid, rkey }, collection);\n }\n\n // Kipclip / community.lexicon.bookmarks: the bookmark subject IS the URL\n if (\n collection.startsWith('com.kipclip.') ||\n collection.startsWith('community.lexicon.bookmarks.')\n ) {\n const subject = stringOrNull(record.subject);\n if (subject) return subject;\n return patternUrl('kipclip', { handle: authorHandle, did: authorDid, rkey });\n }\n\n // Margin bookmark: card returns null entirely without record.source\n if (collection === 'at.margin.bookmark') {\n const source = stringOrNull(record.source);\n if (source) return source;\n return null;\n }\n\n // Margin annotation: target.source -> fall back to margin app URL\n if (collection === 'at.margin.annotation') {\n const target = record.target;\n if (target != null && typeof target === 'object') {\n const source = stringOrNull((target as Record<string, unknown>).source);\n if (source) return source;\n }\n return APP_URL_PATTERNS.margin?.profileUrlPattern ?? null;\n }\n\n // Smokesignal RSVP: parse the linked event uri\n if (collection === 'community.lexicon.calendar.rsvp') {\n const subject = record.subject;\n if (subject != null && typeof subject === 'object') {\n const subjectUri = stringOrNull((subject as Record<string, unknown>).uri);\n if (subjectUri) {\n const parsed = parseAtUri(subjectUri);\n if (parsed) {\n return `https://smokesignal.events/${parsed.did}/${parsed.rkey}`;\n }\n }\n }\n return null;\n }\n\n // Smokesignal event itself: use item's own uri\n if (collection === 'community.lexicon.calendar.event') {\n const parsed = parseAtUri(uri);\n if (parsed) {\n return `https://smokesignal.events/${parsed.did}/${parsed.rkey}`;\n }\n return null;\n }\n\n // atstore reviews: no per-review URL exists on atstore.fyi, and user profile\n // pages don't exist either. Deep-link to the reviewed product instead.\n // The slug comes from record.listingMeta (enriched by sifa-api from the\n // review's `subject` at-uri → fyi.atstore.listing.detail record).\n if (collection === 'fyi.atstore.listing.review') {\n const listingMeta = record.listingMeta;\n if (listingMeta != null && typeof listingMeta === 'object') {\n const slug = stringOrNull((listingMeta as Record<string, unknown>).slug);\n if (slug) return `https://atstore.fyi/products/${encodeURIComponent(slug)}`;\n }\n return APP_URL_PATTERNS.atstore?.profileUrlPattern ?? null;\n }\n\n // Standard documents: siteUrl + path (or just siteUrl)\n if (collection.startsWith('site.standard.')) {\n const siteUrl = stringOrNull(record.siteUrl);\n const path = stringOrNull(record.path);\n if (siteUrl && path) return `${siteUrl}${path}`;\n if (siteUrl) return siteUrl;\n // Fall through to generic record.url / patterns\n }\n\n // --- Generic fallbacks ---\n\n // record.url is a common ad-hoc per-item URL (hyperboards, etc.)\n const recordUrl = stringOrNull(record.url);\n if (recordUrl) return recordUrl;\n\n // Pattern-based fallback. Pass `collection` so app-specific guards (bluesky\n // restricting /post/{rkey} to app.bsky.feed.post) can apply.\n return patternUrl(appId, { handle: authorHandle, did: authorDid, rkey }, collection);\n}\n","/**\n * Per-collection visibility rules for activity items.\n *\n * These rules express \"this record has nothing meaningful to render as a card\"\n * — e.g. a BookHive shelf-add with no review/stars, or a BeaconBits pin with\n * no shout. They are a UX/card concern, distinct from the api-side blocklists\n * in sifa-api/atproto-app-registry that exclude whole collections (likes,\n * follows, games) or filter spammy record shapes (empty quote posts).\n *\n * Used in two places:\n * - sifa-api's activity feed pagination, so a page-of-N returns N visible\n * items rather than silently-dropped placeholders.\n * - sifa-web's activity-feed component (and as defense-in-depth in the card\n * components themselves), so the client never relies on a stale api.\n *\n * Adding a new rule = one PR to this file. Unknown collections default to\n * visible, so the rule set is purely additive — adding a rule can only ever\n * hide more, never expose what was hidden before.\n */\n\ntype VisibilityPredicate = (record: Record<string, unknown>) => boolean;\n\nfunction isNonEmptyString(value: unknown): boolean {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction bookhiveHasOpinion(record: Record<string, unknown>): boolean {\n const review = typeof record.review === 'string' ? record.review.trim() : '';\n const stars = typeof record.stars === 'number' ? record.stars : 0;\n return review.length > 0 || stars > 0;\n}\n\nfunction beaconbitsHasContent(record: Record<string, unknown>): boolean {\n return isNonEmptyString(record.shout) || record.post != null;\n}\n\nfunction marginBookmarkHasSource(record: Record<string, unknown>): boolean {\n return isNonEmptyString(record.source);\n}\n\nfunction marginAnnotationHasBody(record: Record<string, unknown>): boolean {\n const body = record.body;\n if (typeof body === 'string') return body.trim().length > 0;\n if (body != null && typeof body === 'object') {\n const value = (body as Record<string, unknown>).value;\n return typeof value === 'string' && value.trim().length > 0;\n }\n return false;\n}\n\nexport const ACTIVITY_VISIBILITY_RULES: Readonly<Record<string, VisibilityPredicate>> =\n Object.freeze({\n 'buzz.bookhive.book': bookhiveHasOpinion,\n 'app.beaconbits.beacon': beaconbitsHasContent,\n 'at.margin.bookmark': marginBookmarkHasSource,\n 'at.margin.annotation': marginAnnotationHasBody,\n });\n\n/**\n * Return true if the activity item should render a card in the timeline.\n * Records that fail the rule for their collection are dropped silently —\n * they exist in the user's PDS but carry no card-worthy content.\n *\n * Unknown collections (no registered rule) default to visible.\n */\nexport function isVisibleActivityItem(collection: string, record: unknown): boolean {\n if (record === null || typeof record !== 'object') return false;\n const rule = ACTIVITY_VISIBILITY_RULES[collection];\n if (!rule) return true;\n return rule(record as Record<string, unknown>);\n}\n","/**\n * Adult-content gating for Bluesky activity items.\n *\n * Bluesky's official moderation labeler attaches content labels to\n * `app.bsky.feed.defs#postView.labels`. The four sex-and-violence labels\n * below are the ones we hide by default on Sifa: media is replaced with an\n * `<AdultContentWarning>` placeholder card in sifa-web. Authenticated\n * viewers can reveal per-card; anonymous viewers cannot.\n *\n * The list mirrors Bluesky's own globalLabelStrings; if the official set\n * grows (e.g. a new `extreme-violence` label), update this constant.\n *\n * Why a constant + predicate live in the SDK: the same logic needs to run\n * in sifa-web today and sifa-app tomorrow, and the API only forwards the\n * raw labels — the hide decision is a client concern.\n */\n\nexport const ADULT_CONTENT_LABELS = ['porn', 'sexual', 'nudity', 'graphic-media'] as const;\n\nexport type AdultContentLabel = (typeof ADULT_CONTENT_LABELS)[number];\n\n/**\n * A single label entry as emitted by `app.bsky.feed.defs#postView.labels`.\n * Matches `com.atproto.label.defs#label` (the on-wire shape after the AppView\n * resolves a `postView`). `neg: true` marks a retraction.\n */\nexport interface ActivityLabel {\n val: string;\n src: string;\n uri: string;\n cts?: string;\n neg?: boolean;\n}\n\n/**\n * Return true if the item carries at least one adult-content label that is\n * not negated. Items without a `labels` field (every non-Bluesky source,\n * legacy responses) are treated as safe.\n */\nexport function hasAdultContent(item: { labels?: ActivityLabel[] }): boolean {\n const labels = item.labels;\n if (!labels || labels.length === 0) return false;\n return labels.some(\n (label) => !label.neg && (ADULT_CONTENT_LABELS as readonly string[]).includes(label.val),\n );\n}\n","/**\n * Publisher registry — single source of truth for apps that publish documents\n * through the shared `site.standard.*` namespace (Leaflet, Pckt, Offprint, …).\n *\n * Why this exists:\n * A document published via Leaflet, Pckt, Offprint, etc. lives canonically as a\n * `site.standard.document` record. The publisher is metadata, identifiable from\n * the publication's hostname. The activity-card, the publication merger in\n * sifa-api, and the external-URL health scanner all need the same hostname →\n * publisher mapping. Keeping it in one place stops the registry from drifting.\n *\n * What lives here:\n * - `id` — stable appId, also keys sifa-web's branding (logo, color)\n * - `name` — display name\n * - `hostSuffixes` — hostnames that identify a publication URL as this publisher\n * - `homeUrl` — last-resort URL when no per-document URL is available\n *\n * What does NOT live here:\n * - Logo components, color tokens, React chrome — those belong in sifa-web\n * keyed by `id`.\n * - Per-document URL construction — Standard documents are always\n * `${publication.url}${document.path}`. The publisher doesn't change that.\n */\n\nexport interface Publisher {\n /**\n * Stable identifier. Used as the `appId` across Sifa so that sifa-web's\n * `getAppMeta(id)` lookup yields the right logo and color, and so that\n * activity-stat rows tag correctly.\n */\n id: string;\n\n /** Display name shown in pills and headers. */\n name: string;\n\n /**\n * Hostnames that identify a publication URL as belonging to this publisher.\n * Matches the publication URL's hostname when it equals the suffix\n * (e.g. `leaflet.pub`) OR ends with it as a dotted suffix\n * (e.g. `notesbyarielm.leaflet.pub`).\n *\n * Allow multiple entries to future-proof against rebrands or aliases.\n */\n hostSuffixes: readonly string[];\n\n /** Public homepage of the publisher, used as a profile-level fallback URL. */\n homeUrl: string;\n}\n\n/**\n * Neutral fallback used when no branded publisher matches.\n *\n * Synthetic publishers returned by `getPublisherFromSiteUrl` use this `id` but\n * carry the document's own hostname in `name`, so cards can still show e.g.\n * \"feeds.byarielm.fyi\" as the publisher label.\n */\nexport const STANDARD_PUBLISHER_ID = 'standard' as const;\n\nexport const PUBLISHERS: readonly Publisher[] = Object.freeze([\n {\n id: 'leaflet',\n name: 'Leaflet',\n hostSuffixes: ['leaflet.pub'],\n homeUrl: 'https://leaflet.pub',\n },\n {\n id: 'pckt',\n name: 'pckt',\n hostSuffixes: ['pckt.blog'],\n homeUrl: 'https://pckt.blog',\n },\n {\n id: 'offprint',\n name: 'Offprint',\n hostSuffixes: ['offprint.app'],\n homeUrl: 'https://offprint.app',\n },\n {\n id: 'whitewind',\n name: 'WhiteWind',\n hostSuffixes: ['whtwnd.com'],\n homeUrl: 'https://whtwnd.com',\n },\n {\n id: 'unthread',\n name: 'Unthread',\n hostSuffixes: ['unthread.at'],\n homeUrl: 'https://unthread.at',\n },\n {\n id: 'blento',\n name: 'Blento',\n hostSuffixes: ['blento.io'],\n homeUrl: 'https://blento.io',\n },\n]);\n\nconst PUBLISHERS_BY_ID: ReadonlyMap<string, Publisher> = new Map(PUBLISHERS.map((p) => [p.id, p]));\n\n/** Lookup a registered publisher by id. Returns `undefined` for unknown ids. */\nexport function getPublisherById(id: string): Publisher | undefined {\n return PUBLISHERS_BY_ID.get(id);\n}\n\n/**\n * Match a hostname against the registry. Returns the registered publisher when\n * the hostname equals or is a dotted-subdomain of any of its `hostSuffixes`.\n * Returns `undefined` when no match is found (caller decides on the fallback).\n */\nexport function getPublisherByHost(hostname: string): Publisher | undefined {\n const host = hostname.toLowerCase();\n for (const publisher of PUBLISHERS) {\n for (const suffix of publisher.hostSuffixes) {\n if (host === suffix || host.endsWith(`.${suffix}`)) {\n return publisher;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Resolve the publisher for a publication's site URL.\n *\n * - On a branded host: returns the registered `Publisher` verbatim.\n * - On any other valid URL: returns a synthetic neutral publisher with\n * `id: 'standard'`, `name: <hostname>`, `hostSuffixes: []`, and the URL\n * as `homeUrl`. Cards can therefore always render a meaningful pill label.\n * - On an unparseable string: returns the same neutral shape with the raw\n * input as `name` and `homeUrl` (defensive — should never happen for data\n * coming from a valid `site.standard.publication`).\n */\nexport function getPublisherFromSiteUrl(siteUrl: string): Publisher {\n let hostname: string;\n let homeUrl: string;\n try {\n const parsed = new URL(siteUrl);\n hostname = parsed.hostname;\n homeUrl = `${parsed.protocol}//${parsed.hostname}`;\n } catch {\n return {\n id: STANDARD_PUBLISHER_ID,\n name: siteUrl,\n hostSuffixes: [],\n homeUrl: siteUrl,\n };\n }\n\n const matched = getPublisherByHost(hostname);\n if (matched) return matched;\n\n return {\n id: STANDARD_PUBLISHER_ID,\n name: hostname,\n hostSuffixes: [],\n homeUrl,\n };\n}\n","/**\n * Profile completeness scoring.\n *\n * Six binary signals, equal weight: headline filled, about filled, has at least\n * one position, education, skill, certification.\n *\n * Score: integer 0..6. Percent: round(score / 6 * 100) -- discrete values\n * {0, 17, 33, 50, 67, 83, 100}.\n *\n * Canonical source of truth for completeness scoring across Sifa clients.\n * sifa-api computes the underlying `ProfileCompletion` shape inline (in SQL\n * for admin-stats queries, in route handlers elsewhere) but defers scoring\n * to this module.\n */\n\nexport const COMPLETENESS_MAX_SCORE = 6;\n\nexport interface ProfileCompletion {\n hasHeadline: boolean;\n hasAbout: boolean;\n positionCount: number;\n educationCount: number;\n skillCount: number;\n certificationCount: number;\n}\n\n/** Pure-TS computation of the 0..6 score. */\nexport function completenessScore(c: ProfileCompletion): number {\n let filled = 0;\n if (c.hasHeadline) filled++;\n if (c.hasAbout) filled++;\n if (c.positionCount > 0) filled++;\n if (c.educationCount > 0) filled++;\n if (c.skillCount > 0) filled++;\n if (c.certificationCount > 0) filled++;\n return filled;\n}\n\n/** Completion as a rounded 0..100 integer percent (matches API serialisation). */\nexport function completenessPercent(c: ProfileCompletion): number {\n return Math.round((completenessScore(c) / COMPLETENESS_MAX_SCORE) * 100);\n}\n","/**\n * Profile dimensions -- the routing signal used by the Sifa homepage to choose\n * between the V3 \"still building\" and V4 \"established\" variants.\n *\n * Six binary signals, equal weight: avatar, headline, about, current position,\n * minimum-skill threshold, and at least one education entry. The routing\n * threshold itself (e.g. \">= 4 of 6 -> ESTABLISHED\") lives in the consumer\n * because different surfaces may want to cut at different bars over time.\n *\n * Canonical source of truth for dimension scoring across Sifa clients.\n * sifa-api computes the underlying `ProfileDimensionInputs` shape inline\n * (in SQL on the session route) but defers scoring to this module so the\n * frontend and backend cannot drift on what \"filled\" means.\n *\n * See `docs/plans/2026-04-27-homepage-variants.md` (sifa-web) for the\n * history of why these six were chosen over the original eight.\n */\n\nimport type { Profile, ProfilePosition } from '../types/index.js';\n\nexport const DIMENSIONS_MAX_SCORE = 6;\nexport const MIN_SKILLS = 3;\n\nexport type DimensionKey =\n | 'avatar'\n | 'headline'\n | 'about'\n | 'currentPosition'\n | 'skills'\n | 'education';\n\nexport type DimensionMap = Record<DimensionKey, boolean>;\n\n/**\n * Minimal raw inputs needed to compute the dimension map. sifa-api can\n * populate this from a single composite SQL query without loading the full\n * Profile shape, which is the whole point of putting this in the SDK.\n */\nexport interface ProfileDimensionInputs {\n hasAvatar: boolean;\n hasHeadline: boolean;\n hasAbout: boolean;\n currentPositionCount: number;\n skillCount: number;\n educationCount: number;\n}\n\nfunction nonEmptyString(value: string | undefined | null): boolean {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\n/**\n * Pure-TS computation of the 6-key boolean map from minimal inputs.\n * Use this when you already have aggregate counts (e.g. server-side).\n */\nexport function dimensionsFromInputs(inputs: ProfileDimensionInputs): DimensionMap {\n return {\n avatar: inputs.hasAvatar,\n headline: inputs.hasHeadline,\n about: inputs.hasAbout,\n currentPosition: inputs.currentPositionCount > 0,\n skills: inputs.skillCount >= MIN_SKILLS,\n education: inputs.educationCount > 0,\n };\n}\n\n/**\n * Derives `ProfileDimensionInputs` from a full Profile. Use this on the\n * client when you already have the profile loaded.\n */\nexport function profileToDimensionInputs(profile: Profile): ProfileDimensionInputs {\n const positions = profile.positions ?? [];\n const skills = profile.skills ?? [];\n const education = profile.education ?? [];\n const currentPositionCount = positions.filter((p: ProfilePosition) => !p.endedAt).length;\n return {\n hasAvatar: nonEmptyString(profile.avatar),\n hasHeadline: nonEmptyString(profile.headline),\n hasAbout: nonEmptyString(profile.about),\n currentPositionCount,\n skillCount: skills.length,\n educationCount: education.length,\n };\n}\n\n/** Convenience: full Profile -> dimension boolean map. */\nexport function getFilledDimensionsMap(profile: Profile): DimensionMap {\n return dimensionsFromInputs(profileToDimensionInputs(profile));\n}\n\n/** Count of filled dimensions, 0..6. Accepts either raw inputs or a full Profile. */\nexport function countFilledDimensions(input: ProfileDimensionInputs | Profile): number {\n const map = 'hasAvatar' in input ? dimensionsFromInputs(input) : getFilledDimensionsMap(input);\n let n = 0;\n for (const v of Object.values(map)) {\n if (v) n++;\n }\n return n;\n}\n","/**\n * Canonical rule for picking the \"primary\" position to surface on profile cards,\n * social previews, and structured-data outputs.\n *\n * Without this shared helper, different surfaces (visible hero, OG image,\n * <meta description>, JSON-LD) re-derived \"primary\" inconsistently and diverged\n * for users with multiple concurrent roles.\n *\n * Rules (in order):\n * 1. A position the user explicitly flagged `primary` AND that is still active.\n * 2. Otherwise, the active position with the most recent `startedAt`.\n * 3. Otherwise, undefined (no active position).\n */\n\nexport interface PrimaryPositionCandidate {\n startedAt?: string;\n endedAt?: string;\n primary?: boolean;\n}\n\nexport function pickPrimaryPosition<T extends PrimaryPositionCandidate>(\n positions: readonly T[] | undefined,\n): T | undefined {\n if (!positions || positions.length === 0) return undefined;\n\n const active = positions.filter((p) => !p.endedAt);\n if (active.length === 0) return undefined;\n\n const flagged = active.find((p) => p.primary === true);\n if (flagged) return flagged;\n\n return [...active].sort((a, b) => (b.startedAt ?? '').localeCompare(a.startedAt ?? ''))[0];\n}\n","import { z } from 'zod';\n\n/**\n * Grapheme-aware refinement matching the AT Protocol lexicon `maxGraphemes`\n * constraint. JS strings are sequences of UTF-16 code units, but lexicon\n * `maxGraphemes` counts user-perceived characters (grapheme clusters), so\n * emoji sequences, regional indicators, ZWJ joins, and combining marks all\n * count as one unit each. We use `Intl.Segmenter` to enforce this correctly.\n */\nexport function maxGraphemes(max: number) {\n return (value: string): boolean => {\n const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n let count = 0;\n for (const _ of segmenter.segment(value)) {\n count++;\n if (count > max) return false;\n }\n return true;\n };\n}\n\n/** Decentralized identifier, AT Protocol `format: did`. */\nexport const didSchema = z.string().regex(/^did:[a-z]+:[a-zA-Z0-9._:%-]+$/, 'Invalid DID');\n\n/** RFC 3339 datetime with timezone offset, AT Protocol `format: datetime`. */\nexport const datetimeSchema = z.string().datetime({ offset: true });\n\n/** Generic AT-URI, AT Protocol `format: at-uri`. */\nexport const atUriSchema = z.string().regex(/^at:\\/\\/[^\\s]+$/, 'Invalid AT-URI');\n\n/** Content identifier, AT Protocol `format: cid`. Loose validation -- accepts CIDv0 and CIDv1. */\nexport const cidSchema = z\n .string()\n .regex(/^(Qm[1-9A-HJ-NP-Za-km-z]{44}|b[A-Za-z0-9+/=]+)$/, 'Invalid CID');\n\n/** BCP 47 language tag, AT Protocol `format: language`. */\nexport const languageTagSchema = z\n .string()\n .regex(/^[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*$/, 'Invalid BCP 47 language tag');\n\n/** Generic URI, AT Protocol `format: uri`. */\nexport const uriSchema = z.string().url();\n\n/**\n * StrongRef shape from `com.atproto.repo.strongRef` -- pins a record by both\n * AT-URI (identity) and CID (version).\n */\nexport const strongRefSchema = z.object({\n uri: atUriSchema,\n cid: cidSchema,\n});\n\n/**\n * Self-labels shape from `com.atproto.label.defs#selfLabels`. Modelled\n * permissively because clients rarely construct this directly; the AppView\n * handles label validation.\n */\nexport const selfLabelsSchema = z.object({\n $type: z.literal('com.atproto.label.defs#selfLabels').optional(),\n values: z.array(z.object({ val: z.string() })),\n});\n","import { z } from 'zod';\n\nimport { datetimeSchema, strongRefSchema } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.endorsement.confirmation` records.\n * Lives in the endorsee's PDS to approve display of an endorsement.\n */\nexport const EndorsementConfirmationRecordSchema = z.object({\n endorsement: strongRefSchema,\n createdAt: datetimeSchema,\n});\n\nexport type EndorsementConfirmationRecord = z.infer<typeof EndorsementConfirmationRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes, strongRefSchema } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.endorsement` records. Lives in the endorser's PDS;\n * the endorser identity is implicit (whoever owns the repository).\n */\nexport const EndorsementRecordSchema = z.object({\n subject: didSchema,\n skill: strongRefSchema,\n skillName: z.string().min(1).refine(maxGraphemes(64)).max(640),\n comment: z.string().refine(maxGraphemes(300)).max(3000).optional(),\n createdAt: datetimeSchema,\n});\n\nexport type EndorsementRecord = z.infer<typeof EndorsementRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.graph.follow` records.\n *\n * One-way professional follow; the record lives in the follower's PDS. Per\n * iter-1 decisions (`plans/2026-06-01-in-sifa-follow-primitive.md`), this is\n * a **distinct** graph from `app.bsky.graph.follow`, not a superset — but\n * the required field shape (`subject` + `createdAt`) is intentionally\n * identical so generic Bluesky `listRecords` consumers get usable records.\n *\n * `note` is a Sifa addition: an optional reason for the follow (\"why I\n * followed\"). Capped at 200 graphemes to match other profile-flavored\n * lexicon fields.\n */\nexport const GraphFollowRecordSchema = z.object({\n subject: didSchema,\n createdAt: datetimeSchema,\n note: z.string().refine(maxGraphemes(200), 'note must be at most 200 graphemes').optional(),\n});\n\nexport type GraphFollowRecord = z.infer<typeof GraphFollowRecordSchema>;\n\n/**\n * Build a `GraphFollowRecordSchema` that rejects self-follow at the Zod\n * layer (CLAUDE.md mandatory standards #3 — input validation; sifa-api#673\n * E8 — defence in depth).\n *\n * Use this on the **client side** when constructing a new follow record\n * (the follower DID is the authenticated user). The plain\n * {@link GraphFollowRecordSchema} stays without the refine so firehose\n * consumers can validate records without context.\n */\nexport function makeGraphFollowRecordSchema(followerDid: string) {\n return GraphFollowRecordSchema.refine((record) => record.subject !== followerDid, {\n message: 'Self-follow is not allowed',\n path: ['subject'],\n });\n}\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema } from './shared.js';\n\n/**\n * Profile row shared across `/api/following`, `/api/profile/:handleOrDid/mutuals`,\n * and `/api/me/bluesky-suggestions`. Matches the existing `FollowProfile` TS\n * interface byte-for-byte but adds runtime validation for the SDK's pagination\n * helpers and the upcoming `sifa-app` consumer (where we can't trust the wire).\n *\n * Per `sifa-api#674` PR body: mutuals + bluesky-suggestions reuse this shape\n * exactly, so a single Zod schema covers all three endpoints.\n */\nexport const FollowProfileSchema = z.object({\n did: didSchema,\n handle: z.string(),\n displayName: z.string().optional(),\n headline: z.string().optional(),\n avatarUrl: z.string().optional(),\n source: z.string(),\n claimed: z.boolean(),\n followedAt: datetimeSchema,\n blueskyVerified: z.boolean().optional(),\n blueskyVerifiedAt: datetimeSchema.nullable().optional(),\n});\n\nexport type FollowProfileItem = z.infer<typeof FollowProfileSchema>;\n\n/**\n * Cursor-paginated page of {@link FollowProfileSchema} rows. Used by mutuals\n * + bluesky-suggestions. The legacy `/api/following` endpoint uses a different\n * wrapper key (`follows` instead of `items`) and is intentionally NOT covered\n * by this schema.\n */\nexport const FollowProfilePageSchema = z.object({\n items: z.array(FollowProfileSchema),\n cursor: z.string().nullable(),\n});\n\nexport type FollowProfilePage = z.infer<typeof FollowProfilePageSchema>;\n\n/**\n * Per-flag allowlist row returned by `GET /api/admin/feature-allowlists/:flag`.\n * Mirrors the `feature_allowlists` table; `note` is optional free-form text.\n */\nexport const FeatureAllowlistEntrySchema = z.object({\n did: didSchema,\n addedAt: datetimeSchema,\n note: z.string().nullable().optional(),\n});\n\nexport type FeatureAllowlistEntry = z.infer<typeof FeatureAllowlistEntrySchema>;\n\n/**\n * Known feature flags accepted by the admin allowlist endpoints. Mirrors the\n * server-side `FEATURE_FLAGS` const in `sifa-api`. Kept as a `const` tuple so\n * consumers can `as const`-narrow when building UIs.\n */\nexport const FEATURE_FLAGS = ['FEED_V5_ENABLED'] as const;\nexport type FeatureFlag = (typeof FEATURE_FLAGS)[number];\n","import { z } from 'zod';\n\nimport { atUriSchema, cidSchema, datetimeSchema, didSchema } from './shared.js';\n\n/**\n * Feed item from `GET /api/following/feed`. Discriminated on `source`:\n *\n * - `sifa`: a Sifa-native event (e.g. profile update, endorsement).\n * - `atmosphere`: a curated creation event from another ATproto app\n * (Barazo post, etc.). Payload is the hydrated `app.bsky.embed.*#view`\n * shape, NOT the raw record (per memory `sifa-hydrated-view-embed-types`).\n *\n * Both variants share `actor`, `indexedAt`, and `id` (the materialized\n * `feed_events.id` row identifier, used in the cursor).\n */\nexport const FeedActorSchema = z.object({\n did: didSchema,\n handle: z.string(),\n displayName: z.string().optional(),\n avatarUrl: z.string().optional(),\n});\n\nexport type FeedActor = z.infer<typeof FeedActorSchema>;\n\nconst FeedItemBaseSchema = z.object({\n id: z.string(),\n actor: FeedActorSchema,\n indexedAt: datetimeSchema,\n eventType: z.string(),\n});\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport const SifaFeedItemSchema = FeedItemBaseSchema.extend({\n source: z.literal('sifa'),\n appId: z.literal('sifa').optional(),\n payload: z.record(z.string(), z.unknown()),\n});\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport type SifaFeedItem = z.infer<typeof SifaFeedItemSchema>;\n\n/**\n * ATmosphere feed item. `payload` is intentionally permissive: it carries\n * a hydrated `app.bsky.embed.*#view` shape that varies by source app. The\n * AppView resolves the hydration; clients render via the existing\n * embed-view union (mirrors `sifa-web/src/components/stream/`).\n *\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport const AtmosphereFeedItemSchema = FeedItemBaseSchema.extend({\n source: z.literal('atmosphere'),\n appId: z.string(),\n uri: atUriSchema.optional(),\n cid: cidSchema.optional(),\n payload: z.record(z.string(), z.unknown()),\n});\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport type AtmosphereFeedItem = z.infer<typeof AtmosphereFeedItemSchema>;\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport const FollowFeedItemSchema = z.discriminatedUnion('source', [\n SifaFeedItemSchema,\n AtmosphereFeedItemSchema,\n]);\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport type FollowFeedItem = z.infer<typeof FollowFeedItemSchema>;\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport const FollowFeedPageSchema = z.object({\n items: z.array(FollowFeedItemSchema),\n cursor: z.string().nullable(),\n});\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport type FollowFeedPage = z.infer<typeof FollowFeedPageSchema>;\n\n/**\n * Composite feed cursor `(indexedAt DESC, source, id)`. Encoded as a\n * URL-safe base64 string so it survives `URLSearchParams` round-trips\n * without further encoding. Decoupling encode/decode from the API call\n * lets consumers persist cursors (e.g. for \"jump-back-here\" UX) and\n * lets us unit-test the format.\n */\nexport interface FeedCursor {\n indexedAt: string;\n source: 'sifa' | 'atmosphere';\n id: string;\n}\n\nconst FeedCursorSchema = z.object({\n indexedAt: datetimeSchema,\n source: z.union([z.literal('sifa'), z.literal('atmosphere')]),\n id: z.string().min(1),\n});\n\ninterface BufferLike {\n from: (input: string, encoding: 'utf-8' | 'base64') => { toString: (encoding: string) => string };\n}\n\ninterface Base64Global {\n btoa?: (input: string) => string;\n atob?: (input: string) => string;\n Buffer?: BufferLike;\n}\n\nfunction toBase64Url(input: string): string {\n const g = globalThis as unknown as Base64Global;\n const b64: string =\n typeof g.btoa === 'function'\n ? g.btoa(unescape(encodeURIComponent(input)))\n : (g.Buffer as BufferLike).from(input, 'utf-8').toString('base64');\n // Strip up to 2 trailing '=' (base64 padding). CodeQL flags `/=+$/` as a\n // polynomial regex on tainted input; we don't accept tainted input here,\n // but the deterministic loop sidesteps the alert.\n let end = b64.length;\n while (end > 0 && b64.charCodeAt(end - 1) === 61) end--;\n return b64.slice(0, end).replace(/\\+/g, '-').replace(/\\//g, '_');\n}\n\nfunction fromBase64Url(input: string): string {\n const padded = input.replace(/-/g, '+').replace(/_/g, '/') + '==='.slice((input.length + 3) % 4);\n const g = globalThis as unknown as Base64Global;\n if (typeof g.atob === 'function') {\n return decodeURIComponent(escape(g.atob(padded)));\n }\n return (g.Buffer as BufferLike).from(padded, 'base64').toString('utf-8');\n}\n\nexport function encodeFeedCursor(cursor: FeedCursor): string {\n return toBase64Url(JSON.stringify(cursor));\n}\n\nexport function decodeFeedCursor(encoded: string): FeedCursor {\n const json = fromBase64Url(encoded);\n const parsed: unknown = JSON.parse(json);\n return FeedCursorSchema.parse(parsed);\n}\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes, selfLabelsSchema, uriSchema } from './shared.js';\n\n/** Zod schema for `id.sifa.profile.certification` records. */\nexport const ProfileCertificationRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n authority: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n authorityDid: didSchema.optional(),\n credentialId: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n credentialUrl: uriSchema.optional(),\n issuedAt: datetimeSchema.optional(),\n expiresAt: datetimeSchema.optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileCertificationRecord = z.infer<typeof ProfileCertificationRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, maxGraphemes, strongRefSchema } from './shared.js';\n\n/** Zod schema for `id.sifa.profile.course` records. */\nexport const ProfileCourseRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(200)).max(2000),\n number: z.string().refine(maxGraphemes(50)).max(500).optional(),\n institution: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n education: strongRefSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileCourseRecord = z.infer<typeof ProfileCourseRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes, selfLabelsSchema } from './shared.js';\n\n/** Zod schema for `id.sifa.profile.education` records. */\nexport const ProfileEducationRecordSchema = z.object({\n institution: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n institutionDid: didSchema.optional(),\n degree: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n fieldOfStudy: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n grade: z.string().refine(maxGraphemes(50)).max(500).optional(),\n activities: z.string().refine(maxGraphemes(1000)).max(10000).optional(),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n location: z.unknown().optional(),\n startedAt: datetimeSchema.optional(),\n endedAt: datetimeSchema.optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileEducationRecord = z.infer<typeof ProfileEducationRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, maxGraphemes, uriSchema } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.profile.externalAccount` records.\n *\n * `platform` is advisory (`knownValues` in the lexicon) -- known values live\n * under `id.sifa.defs#platform*` but unknown values are accepted.\n */\nexport const ProfileExternalAccountRecordSchema = z.object({\n platform: z.string(),\n url: uriSchema,\n label: z.string().refine(maxGraphemes(64)).max(640).optional(),\n feedUrl: uriSchema.optional(),\n isPrimary: z.boolean().optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileExternalAccountRecord = z.infer<typeof ProfileExternalAccountRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes } from './shared.js';\n\n/** Zod schema for `id.sifa.profile.honor` records. */\nexport const ProfileHonorRecordSchema = z.object({\n title: z.string().min(1).refine(maxGraphemes(200)).max(2000),\n issuer: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n issuerDid: didSchema.optional(),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n awardedAt: datetimeSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileHonorRecord = z.infer<typeof ProfileHonorRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, maxGraphemes } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.profile.language` records.\n *\n * `proficiency` is advisory (`knownValues` in the lexicon) -- known values\n * are the five-level LinkedIn-compatible scale under `id.sifa.defs#*`.\n */\nexport const ProfileLanguageRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(64)).max(640),\n proficiency: z.string().optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileLanguageRecord = z.infer<typeof ProfileLanguageRecordSchema>;\n","import { z } from 'zod';\n\nimport {\n datetimeSchema,\n didSchema,\n maxGraphemes,\n selfLabelsSchema,\n strongRefSchema,\n} from './shared.js';\n\n/** Zod schema for `id.sifa.profile.position` records. */\nexport const ProfilePositionRecordSchema = z.object({\n company: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n companyDid: didSchema.optional(),\n title: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n employmentType: z.string().optional(),\n workplaceType: z.string().optional(),\n location: z.unknown().optional(),\n startedAt: datetimeSchema,\n endedAt: datetimeSchema.optional(),\n skills: z.array(strongRefSchema).max(50).optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfilePositionRecord = z.infer<typeof ProfilePositionRecordSchema>;\n","import { z } from 'zod';\n\nimport {\n datetimeSchema,\n maxGraphemes,\n selfLabelsSchema,\n strongRefSchema,\n uriSchema,\n} from './shared.js';\n\n/** Zod schema for `id.sifa.profile.project` records. */\nexport const ProfileProjectRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n url: uriSchema.optional(),\n position: strongRefSchema.optional(),\n startedAt: datetimeSchema.optional(),\n endedAt: datetimeSchema.optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileProjectRecord = z.infer<typeof ProfileProjectRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes, uriSchema } from './shared.js';\n\n/** Author shape from `id.sifa.profile.publication#author`. */\nexport const PublicationAuthorSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n did: didSchema.optional(),\n});\n\nexport type PublicationAuthor = z.infer<typeof PublicationAuthorSchema>;\n\n/** Zod schema for `id.sifa.profile.publication` records. */\nexport const ProfilePublicationRecordSchema = z.object({\n title: z.string().min(1).refine(maxGraphemes(200)).max(2000),\n publisher: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n url: uriSchema.optional(),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n authors: z.array(PublicationAuthorSchema).max(50).optional(),\n publishedAt: datetimeSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfilePublicationRecord = z.infer<typeof ProfilePublicationRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, languageTagSchema, maxGraphemes, selfLabelsSchema } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.profile.self` records. Singleton (record key `self`).\n *\n * `knownValues` on `openTo` and `preferredWorkplace` are advisory per the\n * lexicon spec -- unknown values are allowed, but documented options live\n * under the `id.sifa.defs#*` namespace.\n */\nexport const ProfileSelfRecordSchema = z.object({\n headline: z.string().refine(maxGraphemes(120)).max(1200).optional(),\n about: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n industry: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n givenName: z.string().refine(maxGraphemes(64)).max(640).optional(),\n familyName: z.string().refine(maxGraphemes(64)).max(640).optional(),\n location: z.unknown().optional(),\n openTo: z.array(z.string()).max(10).optional(),\n preferredWorkplace: z.array(z.string()).max(3).optional(),\n langs: z.array(languageTagSchema).max(3).optional(),\n labels: selfLabelsSchema.optional(),\n discoverable: z.boolean().optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileSelfRecord = z.infer<typeof ProfileSelfRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, maxGraphemes } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.profile.skill` records.\n *\n * `category` is advisory (`knownValues` in the lexicon) -- known values live\n * under `id.sifa.defs#*` but unknown values are accepted.\n */\nexport const ProfileSkillRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(64)).max(640),\n category: z.string().optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileSkillRecord = z.infer<typeof ProfileSkillRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes } from './shared.js';\n\n/** Zod schema for `id.sifa.profile.volunteering` records. */\nexport const ProfileVolunteeringRecordSchema = z.object({\n organization: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n organizationDid: didSchema.optional(),\n role: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n cause: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n startedAt: datetimeSchema.optional(),\n endedAt: datetimeSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileVolunteeringRecord = z.infer<typeof ProfileVolunteeringRecordSchema>;\n","/**\n * Sifa SDK -- public client library for the Sifa AppView on AT Protocol.\n *\n * Pre-1.0: the public API is unstable and may change in any minor release.\n *\n * @see https://github.com/singi-labs/sifa-sdk\n */\n\ndeclare const __SIFA_SDK_VERSION__: string;\n\nexport const SIFA_SDK_VERSION: string = __SIFA_SDK_VERSION__;\n\nexport type {\n ActiveApp,\n Endorsement,\n EndorsementData,\n ExternalAccount,\n ExternalAccountKeytraceClaim,\n FeedItem,\n LanguageProficiency,\n LocationValue,\n PdsProviderInfo,\n Profile,\n ProfileCertification,\n ProfileCourse,\n ProfileEducation,\n ProfileHonor,\n ProfileIndustry,\n ProfileLanguage,\n ProfileLocation,\n ProfileOverrideSource,\n ProfilePosition,\n ProfileProject,\n ProfilePublication,\n ProfileSkill,\n ProfileVolunteering,\n PublicationContributor,\n SkillRef,\n SkillSuggestion,\n TrustStat,\n VerifiedAccount,\n} from './types/index.js';\n\nexport {\n ACTIVITY_TIERS,\n APP_CATEGORIES,\n APP_CATEGORY_IDS,\n APP_CATEGORY_MAP,\n CATEGORY_LABELS,\n CATEGORY_ORDER,\n CONTINENTS,\n COUNTRIES,\n EMPLOYMENT_TYPE_GROUPS,\n EMPLOYMENT_TYPE_LABELS,\n INDUSTRY_OPTIONS,\n OPEN_TO_OPTIONS,\n OPEN_TO_TOKENS,\n OPEN_TO_TOKEN_TO_VALUE,\n OPEN_TO_VALUE_TO_TOKEN,\n categoryForApp,\n findIndustry,\n getActivityTaxonomyVersion,\n getActivityTier,\n getAppCategoryIcon,\n getEmploymentTypeLabel,\n getIndustryLabelKey,\n getLexiconEntry,\n getOpenToLabelKey,\n openToTokenToValue,\n openToValueToToken,\n getTierMeta,\n getWorkplaceTypeLabel,\n isAppCategory,\n isKnownAppId,\n PLATFORM_LABELS,\n PLATFORM_OPTIONS,\n SKILL_CATEGORIES,\n WORKPLACE_TYPE_LABELS,\n WORKPLACE_TYPE_OPTIONS,\n dedupeSkills,\n getContinent,\n getFaviconUrl,\n getPlatformLabel,\n groupSkillsByCategory,\n isKnownPlatform,\n type ActivityTaxonomy,\n type ActivityTier,\n type AppCategoryId,\n type ContinentCode,\n type EmploymentTypeGroup,\n type EmploymentTypeOption,\n type IndustryOption,\n type KnownAppId,\n type LexiconEntry,\n type MergedProfileSkill,\n type OpenToGroup,\n type OpenToOption,\n type PlatformId,\n type SkillCategory,\n type TierMeta,\n type WorkplaceTypeOption,\n} from './taxonomy/index.js';\n\nexport {\n certDateExtractor,\n contrastRatio,\n countryCodeToFlag,\n dateRangeExtractor,\n detectPdsProvider,\n formatDistanceToNow,\n formatLocation,\n formatRelativeTime,\n getDisplayLabel,\n getHandleStem,\n getPdsDisplayName,\n isValidRgbColor,\n lexiconDateExtractor,\n limitCombiningMarks,\n meetsContrastAA,\n parseLocationString,\n pdsProviderFromApi,\n relativeLuminance,\n rgbToString,\n sanitizeDisplayText,\n sanitizeHandleInput,\n singleDateExtractor,\n sortByDateDesc,\n truncateGraphemes,\n type PdsProvider,\n type RgbColor,\n} from './format/index.js';\n\nexport {\n ACTIVITY_VISIBILITY_RULES,\n ADULT_CONTENT_LABELS,\n APP_URL_PATTERNS,\n COLLECTION_TO_APP,\n getAppIdForCollection,\n hasAdultContent,\n isVisibleActivityItem,\n resolveCardUrl,\n type ActivityItemForUrl,\n type ActivityLabel,\n type AdultContentLabel,\n type AppUrlPatterns,\n} from './cards/index.js';\n\nexport {\n PUBLISHERS,\n STANDARD_PUBLISHER_ID,\n getPublisherById,\n getPublisherByHost,\n getPublisherFromSiteUrl,\n type Publisher,\n} from './publishers/index.js';\n\nexport {\n COMPLETENESS_MAX_SCORE,\n completenessPercent,\n completenessScore,\n DIMENSIONS_MAX_SCORE,\n MIN_SKILLS,\n countFilledDimensions,\n dimensionsFromInputs,\n getFilledDimensionsMap,\n pickPrimaryPosition,\n profileToDimensionInputs,\n type DimensionKey,\n type DimensionMap,\n type PrimaryPositionCandidate,\n type ProfileCompletion,\n type ProfileDimensionInputs,\n} from './logic/index.js';\n\nexport {\n AtmosphereFeedItemSchema,\n EndorsementConfirmationRecordSchema,\n EndorsementRecordSchema,\n FEATURE_FLAGS,\n FeatureAllowlistEntrySchema,\n FeedActorSchema,\n FollowFeedItemSchema,\n FollowFeedPageSchema,\n FollowProfilePageSchema,\n FollowProfileSchema,\n GraphFollowRecordSchema,\n ProfileCertificationRecordSchema,\n ProfileCourseRecordSchema,\n ProfileEducationRecordSchema,\n ProfileExternalAccountRecordSchema,\n ProfileHonorRecordSchema,\n ProfileLanguageRecordSchema,\n ProfilePositionRecordSchema,\n ProfileProjectRecordSchema,\n ProfilePublicationRecordSchema,\n ProfileSelfRecordSchema,\n ProfileSkillRecordSchema,\n ProfileVolunteeringRecordSchema,\n PublicationAuthorSchema,\n SifaFeedItemSchema,\n atUriSchema,\n cidSchema,\n datetimeSchema,\n decodeFeedCursor,\n didSchema,\n encodeFeedCursor,\n languageTagSchema,\n makeGraphFollowRecordSchema,\n maxGraphemes,\n selfLabelsSchema,\n strongRefSchema,\n uriSchema,\n type AtmosphereFeedItem,\n type EndorsementConfirmationRecord,\n type EndorsementRecord,\n type FeatureAllowlistEntry,\n type FeatureFlag,\n type FeedActor,\n type FeedCursor,\n type FollowFeedItem,\n type FollowFeedPage,\n type FollowProfileItem,\n type FollowProfilePage,\n type GraphFollowRecord,\n type SifaFeedItem,\n type ProfileCertificationRecord,\n type ProfileCourseRecord,\n type ProfileEducationRecord,\n type ProfileExternalAccountRecord,\n type ProfileHonorRecord,\n type ProfileLanguageRecord,\n type ProfilePositionRecord,\n type ProfileProjectRecord,\n type ProfilePublicationRecord,\n type ProfileSelfRecord,\n type ProfileSkillRecord,\n type ProfileVolunteeringRecord,\n type PublicationAuthor,\n} from './schemas/index.js';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/taxonomy/continents.ts","../src/taxonomy/countries.ts","../src/taxonomy/employment-type.ts","../src/taxonomy/industry-taxonomy.ts","../src/taxonomy/open-to.ts","../src/taxonomy/workplace-type.ts","../src/taxonomy/platforms.ts","../src/taxonomy/skill-categories.ts","../src/taxonomy/skill-grouping.ts","../src/taxonomy/app-categories.ts","../src/taxonomy/app-category-map.ts","../src/taxonomy/activity-tiers.json","../src/taxonomy/activity-tiers.ts","../src/format/format-time.ts","../src/format/sort-by-date.ts","../src/format/handle-utils.ts","../src/format/location-utils.ts","../src/format/pds-utils.ts","../src/format/text-sanitize.ts","../src/format/text-truncate.ts","../src/format/time-utils.ts","../src/format/wcag-contrast.ts","../src/cards/app-url-patterns.ts","../src/cards/resolve-card-url.ts","../src/cards/visibility.ts","../src/cards/adult-content.ts","../src/publishers/registry.ts","../src/logic/profile-completeness.ts","../src/logic/profile-dimensions.ts","../src/logic/primary-position.ts","../src/schemas/shared.ts","../src/schemas/endorsement-confirmation.ts","../src/schemas/endorsement.ts","../src/schemas/graph-follow.ts","../src/schemas/follow-profile.ts","../src/schemas/feed.ts","../src/schemas/profile-certification.ts","../src/schemas/profile-course.ts","../src/schemas/profile-education.ts","../src/schemas/profile-external-account.ts","../src/schemas/profile-honor.ts","../src/schemas/profile-language.ts","../src/schemas/profile-position.ts","../src/schemas/profile-project.ts","../src/schemas/profile-publication.ts","../src/schemas/profile-self.ts","../src/schemas/profile-skill.ts","../src/schemas/profile-volunteering.ts","../src/index.ts"],"names":["z","parsed"],"mappings":";;;;;AAEO,IAAM,UAAA,GAAmE;AAAA,EAC9E,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,EAC3B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,eAAA,EAAgB;AAAA,EACpC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,eAAA;AACtB;AAEA,IAAM,oBAAA,GAAsD;AAAA,EAC1D,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEO,SAAS,aAAa,WAAA,EAA2C;AACtE,EAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AACzB,EAAA,OAAO,oBAAA,CAAqB,WAAA,CAAY,WAAA,EAAa,CAAA,IAAK,IAAA;AAC5D;;;ACnNO,IAAM,SAAA,GAA2D;AAAA,EACtE,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,aAAA,EAAc;AAAA,EAClC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,qBAAA,EAAsB;AAAA,EAC1C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,EAChC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,EAChC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,wBAAA,EAAyB;AAAA,EAC7C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,cAAA,EAAe;AAAA,EACnC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,0BAAA,EAA2B;AAAA,EAC/C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,EAC3B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,aAAA,EAAc;AAAA,EAClC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,eAAA,EAAgB;AAAA,EACpC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,EAC3B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,oBAAA,EAAqB;AAAA,EACzC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,aAAA,EAAc;AAAA,EAClC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,mBAAA,EAAoB;AAAA,EACxC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,EAC3B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,EAChC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,eAAA,EAAgB;AAAA,EACpC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,EAChC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,EAC3B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,EAC3B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,aAAA,EAAc;AAAA,EAClC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,aAAA,EAAc;AAAA,EAClC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,EAC3B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,eAAA,EAAgB;AAAA,EACpC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,EAChC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,EAC3B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,kBAAA,EAAmB;AAAA,EACvC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,EAChC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,aAAA,EAAc;AAAA,EAClC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,aAAA,EAAc;AAAA,EAClC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,EAChC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,iBAAA,EAAkB;AAAA,EACtC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,EAC3B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,EAChC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,kBAAA,EAAmB;AAAA,EACvC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,EAC3B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,aAAA,EAAc;AAAA,EAClC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,uBAAA,EAAwB;AAAA,EAC5C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,aAAA,EAAc;AAAA,EAClC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,kCAAA,EAAmC;AAAA,EACvD,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,uBAAA,EAAwB;AAAA,EAC5C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,cAAA,EAAe;AAAA,EACnC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,cAAA,EAAe;AAAA,EACnC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,EAChC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,iBAAA,EAAkB;AAAA,EACtC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,cAAA,EAAe;AAAA,EACnC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,aAAA,EAAc;AAAA,EAClC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,EAChC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,aAAA,EAAc;AAAA,EAClC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,aAAA,EAAc;AAAA,EAClC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,EAC3B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,qBAAA,EAAsB;AAAA,EAC1C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,cAAA,EAAe;AAAA,EACnC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,sBAAA,EAAuB;AAAA,EAC3C,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,gBAAA,EAAiB;AAAA,EACrC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,eAAA,EAAgB;AAAA,EACpC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,cAAA,EAAe;AAAA,EACnC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,EAChC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC5B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA;AACtB;;;ACtLO,IAAM,sBAAA,GAAgD;AAAA,EAC3D;AAAA,IACE,KAAA,EAAO,UAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,EAAE,KAAA,EAAO,uBAAA,EAAyB,KAAA,EAAO,WAAA,EAAY;AAAA,MACrD,EAAE,KAAA,EAAO,uBAAA,EAAyB,KAAA,EAAO,WAAA,EAAY;AAAA,MACrD,EAAE,KAAA,EAAO,wBAAA,EAA0B,KAAA,EAAO,WAAA,EAAY;AAAA,MACtD,EAAE,KAAA,EAAO,uBAAA,EAAyB,KAAA,EAAO,UAAA;AAAW;AACtD,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,aAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,EAAE,KAAA,EAAO,uBAAA,EAAyB,KAAA,EAAO,UAAA,EAAW;AAAA,MACpD,EAAE,KAAA,EAAO,wBAAA,EAA0B,KAAA,EAAO,WAAA,EAAY;AAAA,MACtD,EAAE,KAAA,EAAO,2BAAA,EAA6B,KAAA,EAAO,eAAA,EAAgB;AAAA,MAC7D,EAAE,KAAA,EAAO,8BAAA,EAAgC,KAAA,EAAO,kBAAA;AAAmB;AACrE,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,yBAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,EAAE,KAAA,EAAO,yBAAA,EAA2B,KAAA,EAAO,YAAA,EAAa;AAAA,MACxD,EAAE,KAAA,EAAO,6BAAA,EAA+B,KAAA,EAAO,gBAAA,EAAiB;AAAA,MAChE,EAAE,KAAA,EAAO,yBAAA,EAA2B,KAAA,EAAO,YAAA,EAAa;AAAA,MACxD,EAAE,KAAA,EAAO,sBAAA,EAAwB,KAAA,EAAO,SAAA;AAAU;AACpD,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,OAAA;AAAA,IACP,OAAO,CAAC,EAAE,OAAO,wBAAA,EAA0B,KAAA,EAAO,aAAa;AAAA;AAEnE;AAEO,IAAM,yBAAiD,MAAA,CAAO,WAAA;AAAA,EACnE,sBAAA,CAAuB,OAAA,CAAQ,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,CAAC,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAC;AAC9E;AAGO,SAAS,uBAAuB,KAAA,EAAsD;AAC3F,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,OAAO,sBAAA,CAAuB,KAAK,CAAA,IAAK,KAAA;AAC1C;;;AClDO,IAAM,gBAAA,GAAqC;AAAA,EAChD;AAAA,IACE,KAAA,EAAO,iCAAA;AAAA,IACP,QAAA,EAAU,oBAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,wCAAA,EAA0C,QAAA,EAAU,2BAAA,EAA4B;AAAA,MACzF,EAAE,KAAA,EAAO,gCAAA,EAAkC,QAAA,EAAU,mBAAA,EAAoB;AAAA,MACzE,EAAE,KAAA,EAAO,kCAAA,EAAoC,QAAA,EAAU,qBAAA,EAAsB;AAAA,MAC7E,EAAE,KAAA,EAAO,2BAAA,EAA6B,QAAA,EAAU,cAAA,EAAe;AAAA,MAC/D,EAAE,KAAA,EAAO,kCAAA,EAAoC,QAAA,EAAU,qBAAA,EAAsB;AAAA,MAC7E,EAAE,KAAA,EAAO,4BAAA,EAA8B,QAAA,EAAU,eAAA;AAAgB;AACnE,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,8BAAA;AAAA,IACP,QAAA,EAAU,iBAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,4BAAA,EAA8B,QAAA,EAAU,eAAA,EAAgB;AAAA,MACjE,EAAE,KAAA,EAAO,4BAAA,EAA8B,QAAA,EAAU,eAAA,EAAgB;AAAA,MACjE,EAAE,KAAA,EAAO,8BAAA,EAAgC,QAAA,EAAU,iBAAA,EAAkB;AAAA,MACrE,EAAE,KAAA,EAAO,mCAAA,EAAqC,QAAA,EAAU,sBAAA;AAAuB;AACjF,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,iCAAA;AAAA,IACP,QAAA,EAAU,oBAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,qCAAA,EAAuC,QAAA,EAAU,wBAAA,EAAyB;AAAA,MACnF,EAAE,KAAA,EAAO,+BAAA,EAAiC,QAAA,EAAU,kBAAA,EAAmB;AAAA,MACvE,EAAE,KAAA,EAAO,2BAAA,EAA6B,QAAA,EAAU,cAAA;AAAe;AACjE,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gCAAA;AAAA,IACP,QAAA,EAAU,mBAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,6BAAA,EAA+B,QAAA,EAAU,gBAAA,EAAiB;AAAA,MACnE,EAAE,KAAA,EAAO,2BAAA,EAA6B,QAAA,EAAU,cAAA,EAAe;AAAA,MAC/D,EAAE,KAAA,EAAO,qCAAA,EAAuC,QAAA,EAAU,wBAAA;AAAyB;AACrF,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,4BAAA;AAAA,IACP,QAAA,EAAU,eAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,+BAAA,EAAiC,QAAA,EAAU,kBAAA,EAAmB;AAAA,MACvE,EAAE,KAAA,EAAO,8BAAA,EAAgC,QAAA,EAAU,iBAAA,EAAkB;AAAA,MACrE,EAAE,KAAA,EAAO,2BAAA,EAA6B,QAAA,EAAU,cAAA,EAAe;AAAA,MAC/D,EAAE,KAAA,EAAO,gCAAA,EAAkC,QAAA,EAAU,mBAAA;AAAoB;AAC3E,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,6BAAA;AAAA,IACP,QAAA,EAAU,gBAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,8BAAA,EAAgC,QAAA,EAAU,iBAAA,EAAkB;AAAA,MACrE,EAAE,KAAA,EAAO,gCAAA,EAAkC,QAAA,EAAU,mBAAA;AAAoB;AAC3E,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,oCAAA;AAAA,IACP,QAAA,EAAU,uBAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,+BAAA,EAAiC,QAAA,EAAU,kBAAA,EAAmB;AAAA,MACvE,EAAE,KAAA,EAAO,8BAAA,EAAgC,QAAA,EAAU,iBAAA,EAAkB;AAAA,MACrE,EAAE,KAAA,EAAO,6BAAA,EAA+B,QAAA,EAAU,gBAAA;AAAiB;AACrE,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,6BAAA;AAAA,IACP,QAAA,EAAU,gBAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,+BAAA,EAAiC,QAAA,EAAU,kBAAA,EAAmB;AAAA,MACvE,EAAE,KAAA,EAAO,2BAAA,EAA6B,QAAA,EAAU,cAAA,EAAe;AAAA,MAC/D,EAAE,KAAA,EAAO,gCAAA,EAAkC,QAAA,EAAU,mBAAA;AAAoB;AAC3E,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,iCAAA;AAAA,IACP,QAAA,EAAU,oBAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,iCAAA,EAAmC,QAAA,EAAU,oBAAA,EAAqB;AAAA,MAC3E,EAAE,KAAA,EAAO,4BAAA,EAA8B,QAAA,EAAU,eAAA;AAAgB;AACnE,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,4BAAA;AAAA,IACP,QAAA,EAAU,eAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,0BAAA,EAA4B,QAAA,EAAU,aAAA,EAAc;AAAA,MAC7D,EAAE,KAAA,EAAO,+BAAA,EAAiC,QAAA,EAAU,kBAAA;AAAmB;AACzE,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,iCAAA;AAAA,IACP,QAAA,EAAU,oBAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,yCAAA,EAA2C,QAAA,EAAU,4BAAA,EAA6B;AAAA,MAC3F,EAAE,KAAA,EAAO,2BAAA,EAA6B,QAAA,EAAU,cAAA,EAAe;AAAA,MAC/D,EAAE,KAAA,EAAO,kCAAA,EAAoC,QAAA,EAAU,qBAAA;AAAsB;AAC/E,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gCAAA;AAAA,IACP,QAAA,EAAU,mBAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,gCAAA,EAAkC,QAAA,EAAU,mBAAA,EAAoB;AAAA,MACzE,EAAE,KAAA,EAAO,+BAAA,EAAiC,QAAA,EAAU,kBAAA;AAAmB;AACzE,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,iCAAA;AAAA,IACP,QAAA,EAAU,oBAAA;AAAA,IACV,SAAS,CAAC,EAAE,OAAO,6BAAA,EAA+B,QAAA,EAAU,kBAAkB;AAAA,GAChF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gCAAA;AAAA,IACP,QAAA,EAAU,mBAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,uCAAA,EAAyC,QAAA,EAAU,0BAAA,EAA2B;AAAA,MACvF,EAAE,KAAA,EAAO,8BAAA,EAAgC,QAAA,EAAU,iBAAA;AAAkB;AACvE,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,kCAAA;AAAA,IACP,QAAA,EAAU,qBAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,6BAAA,EAA+B,QAAA,EAAU,gBAAA,EAAiB;AAAA,MACnE,EAAE,KAAA,EAAO,6BAAA,EAA+B,QAAA,EAAU,gBAAA;AAAiB;AACrE,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,kCAAA;AAAA,IACP,QAAA,EAAU,qBAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,2BAAA,EAA6B,QAAA,EAAU,cAAA,EAAe;AAAA,MAC/D,EAAE,KAAA,EAAO,kCAAA,EAAoC,QAAA,EAAU,qBAAA,EAAsB;AAAA,MAC7E,EAAE,KAAA,EAAO,iCAAA,EAAmC,QAAA,EAAU,oBAAA;AAAqB;AAC7E,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,8BAAA;AAAA,IACP,QAAA,EAAU,iBAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,iCAAA,EAAmC,QAAA,EAAU,oBAAA,EAAqB;AAAA,MAC3E,EAAE,KAAA,EAAO,mCAAA,EAAqC,QAAA,EAAU,sBAAA;AAAuB;AACjF,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,6BAAA;AAAA,IACP,QAAA,EAAU,gBAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,+BAAA,EAAiC,QAAA,EAAU,kBAAA,EAAmB;AAAA,MACvE,EAAE,KAAA,EAAO,+BAAA,EAAiC,QAAA,EAAU,kBAAA;AAAmB;AACzE,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,8BAAA;AAAA,IACP,QAAA,EAAU,iBAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,kCAAA,EAAoC,QAAA,EAAU,qBAAA,EAAsB;AAAA,MAC7E,EAAE,KAAA,EAAO,yCAAA,EAA2C,QAAA,EAAU,4BAAA;AAA6B;AAC7F,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,+BAAA;AAAA,IACP,QAAA,EAAU,kBAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,6BAAA,EAA+B,QAAA,EAAU,gBAAA,EAAiB;AAAA,MACnE,EAAE,KAAA,EAAO,mCAAA,EAAqC,QAAA,EAAU,sBAAA,EAAuB;AAAA,MAC/E,EAAE,KAAA,EAAO,sCAAA,EAAwC,QAAA,EAAU,yBAAA;AAA0B;AACvF,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,4BAAA;AAAA,IACP,QAAA,EAAU,eAAA;AAAA,IACV,SAAS;AAAC;AAEd;AAGO,SAAS,aAAa,KAAA,EAA8D;AACzF,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,OAAO,iBAAiB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AACvD;AAGO,SAAS,oBAAoB,KAAA,EAAuB;AACzD,EAAA,KAAA,MAAW,YAAY,gBAAA,EAAkB;AACvC,IAAA,IAAI,QAAA,CAAS,KAAA,KAAU,KAAA,EAAO,OAAO,QAAA,CAAS,QAAA;AAC9C,IAAA,KAAA,MAAW,MAAA,IAAU,SAAS,OAAA,EAAS;AACrC,MAAA,IAAI,MAAA,CAAO,KAAA,KAAU,KAAA,EAAO,OAAO,MAAA,CAAO,QAAA;AAAA,IAC5C;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;;;ACzLO,IAAM,eAAA,GAAkC;AAAA,EAC7C;AAAA,IACE,KAAA,EAAO,4BAAA;AAAA,IACP,QAAA,EAAU,eAAA;AAAA,IACV,KAAA,EAAO,UAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,4BAAA;AAAA,IACP,QAAA,EAAU,eAAA;AAAA,IACV,KAAA,EAAO,UAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,4BAAA;AAAA,IACP,QAAA,EAAU,eAAA;AAAA,IACV,KAAA,EAAO,UAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,0BAAA;AAAA,IACP,QAAA,EAAU,aAAA;AAAA,IACV,KAAA,EAAO,aAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,6BAAA;AAAA,IACP,QAAA,EAAU,gBAAA;AAAA,IACV,KAAA,EAAO,OAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,8BAAA;AAAA,IACP,QAAA,EAAU,iBAAA;AAAA,IACV,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,4BAAA;AAAA,IACP,QAAA,EAAU,eAAA;AAAA,IACV,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,6BAAA;AAAA,IACP,QAAA,EAAU,gBAAA;AAAA,IACV,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO;AAAA;AAEX;AAGO,IAAM,yBAAiD,MAAA,CAAO,WAAA;AAAA,EACnE,eAAA,CAAgB,IAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAC;AAC/C;AAGO,IAAM,yBAAiD,MAAA,CAAO,WAAA;AAAA,EACnE,eAAA,CAAgB,IAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAC;AAC/C;AAGO,IAAM,iBAAoC,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK;AAG5E,SAAS,mBAAmB,KAAA,EAAsD;AACvF,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,OAAO,uBAAuB,KAAK,CAAA;AACrC;AAGO,SAAS,mBAAmB,KAAA,EAAsD;AACvF,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,OAAO,uBAAuB,KAAK,CAAA;AACrC;AAOA,IAAM,sBAAA,GAAiD;AAAA,EACrD,wBAAA,EAA0B;AAC5B,CAAA;AAEA,IAAM,qBAAA,GAAgD;AAAA,EACpD,GAAG,MAAA,CAAO,WAAA,CAAY,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,CAAC,CAAC,CAAA;AAAA,EACvE,GAAG;AACL,CAAA;AAOO,SAAS,kBAAkB,KAAA,EAAsD;AACtF,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,OAAO,sBAAsB,KAAK,CAAA;AACpC;;;ACxGO,IAAM,sBAAA,GAAgD;AAAA,EAC3D,EAAE,KAAA,EAAO,qBAAA,EAAuB,KAAA,EAAO,SAAA,EAAU;AAAA,EACjD,EAAE,KAAA,EAAO,qBAAA,EAAuB,KAAA,EAAO,QAAA,EAAS;AAAA,EAChD,EAAE,KAAA,EAAO,0BAAA,EAA4B,KAAA,EAAO,uBAAA,EAAwB;AAAA,EACpE,EAAE,KAAA,EAAO,2BAAA,EAA6B,KAAA,EAAO,sBAAA,EAAuB;AAAA,EACpE,EAAE,KAAA,EAAO,2BAAA,EAA6B,KAAA,EAAO,mBAAA;AAC/C;AAEO,IAAM,qBAAA,GAAgD;AAAA,EAC3D,GAAG,MAAA,CAAO,WAAA,CAAY,sBAAA,CAAuB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAAA,EAC3E,qBAAA,EAAuB;AACzB;AAGO,SAAS,sBAAsB,KAAA,EAAsD;AAC1F,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,OAAO,qBAAA,CAAsB,KAAK,CAAA,IAAK,KAAA;AACzC;;;ACrBO,IAAM,eAAA,GAAkB;AAAA,EAC7B,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO,OAAA;AAAA,EACP,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,SAAA,EAAW,WAAA;AAAA,EACX,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,GAAA,EAAK,QAAA;AAAA,EACL,OAAA,EAAS,SAAA;AAAA,EACT,GAAA,EAAK,KAAA;AAAA,EACL,SAAA,EAAW,WAAA;AAAA,EACX,KAAA,EAAO,OAAA;AAAA,EACP,QAAA,EAAU;AACZ;AAIO,SAAS,gBAAgB,QAAA,EAA0C;AACxE,EAAA,OAAO,QAAA,IAAY,eAAA;AACrB;AAEO,SAAS,iBAAiB,QAAA,EAA0B;AACzD,EAAA,OAAO,gBAAgB,QAAQ,CAAA,GAAI,eAAA,CAAgB,QAAQ,IAAI,eAAA,CAAgB,OAAA;AACjF;AAGA,IAAM,yCAAyB,IAAI,GAAA,CAAgB,CAAC,SAAA,EAAW,KAAA,EAAO,SAAS,CAAC,CAAA;AAGzE,IAAM,gBAAA,GACX,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,CAE7B,OAAO,CAAC,CAAC,KAAK,CAAA,KAAM,CAAC,sBAAA,CAAuB,IAAI,KAAK,CAAC,CAAA,CACtD,GAAA,CAAI,CAAC,CAAC,KAAA,EAAO,KAAK,CAAA,MAAO,EAAE,KAAA,EAAO,KAAA,EAAM,CAAE;AAMtC,SAAS,cAAc,OAAA,EAAgC;AAC5D,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,IAAI,IAAI,OAAO,CAAA;AACpC,IAAA,OAAO,CAAA,0CAAA,EAA6C,kBAAA,CAAmB,QAAQ,CAAC,CAAA,MAAA,CAAA;AAAA,EAClF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC5DO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,WAAA,EAAY;AAAA,EACzC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,EACvC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,EACvC,EAAE,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,eAAA,EAAgB;AAAA,EACjD,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,EACvC,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,WAAA,EAAY;AAAA,EACzC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA;AAC9B;AAIO,IAAM,iBAA+C,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK;AAExF,IAAM,eAAA,GAA2D;AAAA,EACtE,GAAI,MAAA,CAAO,WAAA,CAAY,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAAA,EAItE,KAAA,EAAO;AACT;;;ACJO,SAAS,aAAa,MAAA,EAA8C;AACzE,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAgC;AAEnD,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,IAAA,GAAO,WAAA,EAAY;AAC1C,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC/B,IAAA,MAAM,SAAA,GAAa,KAAA,CAAsD,aAAA,IAAiB,EAAC;AAE3F,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAA,CAAO,IAAI,GAAA,EAAK;AAAA,QACd,GAAG,KAAA;AAAA,QACH,WAAA,EAAa,CAAC,KAAA,CAAM,IAAI,CAAA;AAAA,QACxB,aAAA,EAAe,CAAC,GAAG,SAAS;AAAA,OAC7B,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,WAAA,CAAY,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACpC,IAAA,IAAI,CAAC,QAAA,CAAS,QAAA,IAAY,MAAM,QAAA,EAAU,QAAA,CAAS,WAAW,KAAA,CAAM,QAAA;AACpE,IAAA,IAAA,CAAK,KAAA,CAAM,gBAAA,IAAoB,CAAA,KAAM,QAAA,CAAS,oBAAoB,CAAA,CAAA,EAAI;AACpE,MAAA,QAAA,CAAS,mBAAmB,KAAA,CAAM,gBAAA;AAAA,IACpC;AACA,IAAA,IAAI,KAAA,CAAM,QAAA,EAAU,QAAA,CAAS,QAAA,GAAW,IAAA;AACxC,IAAA,IAAI,KAAA,CAAM,cAAA,EAAgB,QAAA,CAAS,cAAA,GAAiB,IAAA;AACpD,IAAA,MAAM,MAAA,mBAAS,IAAI,GAAA,CAAI,CAAC,GAAI,QAAA,CAAS,aAAA,IAAiB,EAAC,EAAI,GAAG,SAAS,CAAC,CAAA;AACxE,IAAA,QAAA,CAAS,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAAA,EAC5C;AAEA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA;AACnC;AAOO,SAAS,sBAA8C,MAAA,EAA8B;AAC1F,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAiB;AAErC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,aAAa,KAAA,CAAM,QAAA,EAAU,WAAA,EAAY,CAAE,MAAK,IAAK,EAAA;AAC3D,IAAA,MAAM,GAAA,GAAO,cAAA,CAAqC,QAAA,CAAS,UAAU,IAAI,UAAA,GAAa,OAAA;AACtF,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,GAAG,KAAK,EAAC;AACpC,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,EACzB;AAEA,EAAA,KAAA,MAAW,GAAG,WAAW,CAAA,IAAK,OAAA,EAAS;AACrC,IAAA,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACzB,MAAA,MAAM,SAAA,GAAA,CAAa,CAAA,CAAE,gBAAA,IAAoB,CAAA,KAAM,EAAE,gBAAA,IAAoB,CAAA,CAAA;AACrE,MAAA,IAAI,SAAA,KAAc,GAAG,OAAO,SAAA;AAC5B,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,UAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,OAAO,cAAA,EAAgB;AAChC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC7B,IAAA,IAAI,OAAO,MAAA,EAAQ,OAAA,CAAQ,KAAK,CAAC,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AACtC,EAAA,IAAI,YAAY,MAAA,EAAQ,OAAA,CAAQ,KAAK,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAE1D,EAAA,OAAO,OAAA;AACT;;;AC/DO,IAAM,cAAA,GAAiB;AAAA,EAC5B,QAAA,EAAU,EAAE,YAAA,EAAc,SAAA,EAAU;AAAA,EACpC,IAAA,EAAM,EAAE,YAAA,EAAc,aAAA,EAAc;AAAA,EACpC,IAAA,EAAM,EAAE,YAAA,EAAc,MAAA,EAAO;AAAA,EAC7B,YAAA,EAAc,EAAE,YAAA,EAAc,WAAA,EAAY;AAAA,EAC1C,MAAA,EAAQ,EAAE,YAAA,EAAc,eAAA,EAAgB;AAAA,EACxC,KAAA,EAAO,EAAE,YAAA,EAAc,YAAA,EAAa;AAAA,EACpC,KAAA,EAAO,EAAE,YAAA,EAAc,aAAA,EAAc;AAAA,EACrC,KAAA,EAAO,EAAE,YAAA,EAAc,WAAA,EAAY;AAAA,EACnC,KAAA,EAAO,EAAE,YAAA,EAAc,SAAA,EAAU;AAAA,EACjC,MAAA,EAAQ,EAAE,YAAA,EAAc,WAAA,EAAY;AAAA,EACpC,MAAA,EAAQ,EAAE,YAAA,EAAc,QAAA,EAAS;AAAA,EACjC,MAAA,EAAQ,EAAE,YAAA,EAAc,QAAA,EAAS;AAAA,EACjC,KAAA,EAAO,EAAE,YAAA,EAAc,YAAA,EAAa;AAAA,EACpC,KAAA,EAAO,EAAE,YAAA,EAAc,UAAA,EAAW;AAAA,EAClC,QAAA,EAAU,EAAE,YAAA,EAAc,MAAA,EAAO;AAAA,EACjC,OAAA,EAAS,EAAE,YAAA,EAAc,MAAA,EAAO;AAAA,EAChC,MAAA,EAAQ,EAAE,YAAA,EAAc,YAAA,EAAa;AAAA,EACrC,YAAA,EAAc,EAAE,YAAA,EAAc,KAAA,EAAM;AAAA,EACpC,KAAA,EAAO,EAAE,YAAA,EAAc,aAAA;AACzB;AAIO,IAAM,gBAAA,GAAmB,MAAA,CAAO,IAAA,CAAK,cAAc;AAEnD,SAAS,cAAc,KAAA,EAAuC;AACnE,EAAA,OAAO,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,gBAAgB,KAAK,CAAA;AACnE;AAEO,SAAS,mBAAmB,QAAA,EAAiC;AAClE,EAAA,OAAO,cAAA,CAAe,QAAQ,CAAA,CAAE,YAAA;AAClC;;;ACrCO,IAAM,gBAAA,GAAmB;AAAA;AAAA,EAE9B,OAAA,EAAS,OAAA;AAAA,EACT,OAAA,EAAS,MAAA;AAAA,EACT,MAAA,EAAQ,MAAA;AAAA,EACR,WAAA,EAAa,QAAA;AAAA,EACb,OAAA,EAAS,QAAA;AAAA,EACT,KAAA,EAAO,QAAA;AAAA,EACP,SAAA,EAAW,UAAA;AAAA,EACX,SAAA,EAAW,OAAA;AAAA,EACX,WAAA,EAAa,QAAA;AAAA,EACb,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU,OAAA;AAAA,EACV,KAAA,EAAO,QAAA;AAAA,EACP,QAAA,EAAU,cAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,WAAA,EAAa,OAAA;AAAA,EACb,MAAA,EAAQ,UAAA;AAAA,EACR,QAAA,EAAU,QAAA;AAAA,EACV,OAAA,EAAS,UAAA;AAAA,EACT,OAAA,EAAS,QAAA;AAAA,EACT,gBAAA,EAAkB,OAAA;AAAA,EAClB,QAAA,EAAU,SAAA;AAAA,EACV,UAAA,EAAY,QAAA;AAAA,EACZ,SAAA,EAAW,QAAA;AAAA,EACX,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,QAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,OAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,cAAA;AAAA,EACR,KAAA,EAAO,UAAA;AAAA;AAAA;AAAA,EAIP,MAAA,EAAQ,OAAA;AAAA,EACR,OAAA,EAAS,OAAA;AAAA,EACT,WAAA,EAAa,QAAA;AAAA,EACb,MAAA,EAAQ;AACV;AAIO,SAAS,aAAa,KAAA,EAAoC;AAC/D,EAAA,OAAO,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,kBAAkB,KAAK,CAAA;AACrE;AAEO,SAAS,eAAe,KAAA,EAA0C;AACvE,EAAA,OAAO,YAAA,CAAa,KAAK,CAAA,GAAI,gBAAA,CAAiB,KAAK,CAAA,GAAI,MAAA;AACzD;;;AC9DA,IAAA,sBAAA,GAAA;AAAA,EACE,OAAA,EAAW,gDAAA;AAAA,EACX,OAAA,EAAW,OAAA;AAAA,EACX,OAAA,EAAW,YAAA;AAAA,EACX,KAAA,EAAS;AAAA,IACP,QAAA,EAAY;AAAA,MACV,KAAA,EAAS,MAAA;AAAA,MACT,WAAA,EAAe,wKAAA;AAAA,MACf,oBAAA,EAAwB;AAAA,KAC1B;AAAA,IACA,MAAA,EAAU;AAAA,MACR,KAAA,EAAS,KAAA;AAAA,MACT,WAAA,EAAe,4MAAA;AAAA,MACf,oBAAA,EAAwB;AAAA,KAC1B;AAAA,IACA,QAAA,EAAY;AAAA,MACV,KAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAe,0NAAA;AAAA,MACf,oBAAA,EAAwB;AAAA;AAC1B,GACF;AAAA,EACA,QAAA,EAAY;AAAA,IACV,oBAAA,EAAsB;AAAA,MACpB,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,oBAAA,EAAsB,EAAE,IAAA,EAAQ,QAAA,EAAU,KAAO,SAAA,EAAU;AAAA,IAC3D,sBAAA,EAAwB,EAAE,IAAA,EAAQ,QAAA,EAAU,KAAO,SAAA,EAAU;AAAA,IAC7D,yBAAA,EAA2B;AAAA,MACzB,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,uBAAA,EAAyB,EAAE,IAAA,EAAQ,QAAA,EAAU,KAAO,SAAA,EAAU;AAAA,IAC9D,wBAAwB,EAAE,IAAA,EAAQ,YAAY,GAAA,EAAO,SAAA,EAAW,OAAS,oBAAA,EAAqB;AAAA,IAC9F,uBAAuB,EAAE,IAAA,EAAQ,YAAY,GAAA,EAAO,SAAA,EAAW,OAAS,oBAAA,EAAqB;AAAA,IAC7F,0BAAA,EAA4B;AAAA,MAC1B,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,yBAAA,EAA2B;AAAA,MACzB,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,qBAAA,EAAuB;AAAA,MACrB,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,4BAAA,EAA8B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,SAAA,EAAU;AAAA,IACrE,wBAAA,EAA0B;AAAA,MACxB,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IAEA,iBAAA,EAAmB,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,SAAA,EAAU;AAAA,IAC1D,uBAAA,EAAyB,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,SAAA,EAAU;AAAA,IAChE,sBAAA,EAAwB,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,SAAA,EAAU;AAAA,IAC/D,sBAAA,EAAwB,EAAE,IAAA,EAAQ,QAAA,EAAU,KAAO,SAAA,EAAU;AAAA,IAC7D,yBAAA,EAA2B,EAAE,IAAA,EAAQ,QAAA,EAAU,KAAO,SAAA,EAAU;AAAA,IAChE,0BAAA,EAA4B;AAAA,MAC1B,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IAEA,iCAAA,EAAmC;AAAA,MACjC,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,aAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,4BAAA,EAA8B;AAAA,MAC5B,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,aAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IAEA,wBAAA,EAA0B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,SAAA,EAAU;AAAA,IAEjE,sBAAA,EAAwB,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,OAAA,EAAQ;AAAA,IAC7D,2BAAA,EAA6B;AAAA,MAC3B,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,oBAAA,EAAsB;AAAA,MACpB,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,yBAAA,EAA2B;AAAA,MACzB,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,oBAAA,EAAsB;AAAA,MACpB,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IAEA,uBAAA,EAAyB,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,WAAA,EAAY;AAAA,IAElE,4BAAA,EAA8B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,WAAA,EAAY;AAAA,IACvE,4BAAA,EAA8B,EAAE,IAAA,EAAQ,QAAA,EAAU,KAAO,WAAA,EAAY;AAAA,IAErE,uBAAA,EAAyB,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,SAAA,EAAU;AAAA,IAEhE,0BAAA,EAA4B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,aAAA,EAAc;AAAA,IAEvE,wBAAA,EAA0B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,UAAA,EAAW;AAAA,IAElE,wBAAA,EAA0B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,UAAA,EAAW;AAAA,IAElE,4BAAA,EAA8B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,OAAA,EAAQ;AAAA,IAEnE,oBAAA,EAAsB,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,UAAA,EAAW;AAAA,IAE9D,4BAAA,EAA8B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,SAAA,EAAU;AAAA,IACrE,0BAAA,EAA4B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,SAAA,EAAU;AAAA,IACnE,0BAAA,EAA4B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,SAAA,EAAU;AAAA,IACnE,0BAAA,EAA4B,EAAE,IAAA,EAAQ,QAAA,EAAU,KAAO,SAAA,EAAU;AAAA,IACjE,wCAAA,EAA0C;AAAA,MACxC,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,8BAAA,EAAgC;AAAA,MAC9B,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IAEA,yBAAA,EAA2B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,aAAA,EAAc;AAAA,IACtE,+BAAA,EAAiC;AAAA,MAC/B,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,aAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,kBAAA,EAAoB;AAAA,MAClB,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,aAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,qCAAA,EAAuC;AAAA,MACrC,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,aAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,2BAAA,EAA6B;AAAA,MAC3B,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,aAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,2BAAA,EAA6B;AAAA,MAC3B,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,aAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IAEA,qBAAA,EAAuB,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,QAAA,EAAS;AAAA,IAC7D,oBAAA,EAAsB,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,QAAA,EAAS;AAAA,IAE5D,wBAAA,EAA0B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,UAAA,EAAW;AAAA,IAElE,qBAAA,EAAuB,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,SAAA,EAAU;AAAA,IAC9D,oCAAA,EAAsC,EAAE,IAAA,EAAQ,QAAA,EAAU,KAAO,SAAA,EAAU;AAAA,IAC3E,iCAAA,EAAmC;AAAA,MACjC,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IAEA,2BAAA,EAA6B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,SAAA,EAAU;AAAA,IACpE,wBAAA,EAA0B;AAAA,MACxB,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,2BAA2B,EAAE,IAAA,EAAQ,YAAY,GAAA,EAAO,SAAA,EAAW,OAAS,gBAAA,EAAiB;AAAA,IAC7F,wBAAA,EAA0B;AAAA,MACxB,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,0BAAA,EAA4B;AAAA,MAC1B,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,yBAAA,EAA2B;AAAA,MACzB,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,yBAAA,EAA2B;AAAA,MACzB,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,6BAAA,EAA+B;AAAA,MAC7B,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,2BAAA,EAA6B;AAAA,MAC3B,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,+BAAA,EAAiC;AAAA,MAC/B,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IAEA,gCAAA,EAAkC;AAAA,MAChC,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,kBAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IAEA,2BAAA,EAA6B;AAAA,MAC3B,IAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAS;AAAA,KACX;AAAA,IACA,2BAAA,EAA6B;AAAA,MAC3B,IAAA,EAAQ,UAAA;AAAA,MACR,KAAA,EAAS;AAAA,KACX;AAAA,IACA,+BAAA,EAAiC,EAAE,IAAA,EAAQ,UAAA,EAAW;AAAA,IACtD,2BAAA,EAA6B,EAAE,IAAA,EAAQ,UAAA,EAAW;AAAA,IAClD,uBAAA,EAAyB,EAAE,IAAA,EAAQ,UAAA,EAAW;AAAA,IAC9C,qBAAA,EAAuB,EAAE,IAAA,EAAQ,UAAA,EAAY,OAAS,uCAAA,EAAwC;AAAA,IAE9F,+BAAA,EAAiC;AAAA,MAC/B,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IAEA,oBAAA,EAAsB;AAAA,MACpB,IAAA,EAAQ,UAAA;AAAA,MACR,KAAA,EAAS;AAAA,KACX;AAAA,IACA,qBAAA,EAAuB;AAAA,MACrB,IAAA,EAAQ,UAAA;AAAA,MACR,KAAA,EAAS;AAAA,KACX;AAAA,IACA,sCAAA,EAAwC;AAAA,MACtC,IAAA,EAAQ,UAAA;AAAA,MACR,KAAA,EAAS;AAAA,KACX;AAAA,IACA,mBAAA,EAAqB,EAAE,IAAA,EAAQ,UAAA,EAAY,OAAS,wCAAA,EAAyC;AAAA,IAE7F,oBAAA,EAAsB,EAAE,IAAA,EAAQ,UAAA,EAAY,OAAS,+BAAA,EAAgC;AAAA,IACrF,iBAAA,EAAmB,EAAE,IAAA,EAAQ,UAAA,EAAY,OAAS,yBAAA,EAA0B;AAAA,IAC5E,mBAAA,EAAqB,EAAE,IAAA,EAAQ,UAAA,EAAY,OAAS,uBAAA,EAAwB;AAAA,IAE5E,0BAAA,EAA4B,EAAE,IAAA,EAAQ,UAAA,EAAY,OAAS,4BAAA,EAA6B;AAAA,IACxF,wBAAA,EAA0B;AAAA,MACxB,IAAA,EAAQ,UAAA;AAAA,MACR,KAAA,EAAS;AAAA,KACX;AAAA,IAEA,sBAAA,EAAwB;AAAA,MACtB,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,MAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,0BAAA,EAA4B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,MAAA,EAAO;AAAA,IAChE,2BAAA,EAA6B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,MAAA,EAAO;AAAA,IACjE,uBAAA,EAAyB,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,MAAA,EAAO;AAAA,IAC7D,+BAAA,EAAiC,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,MAAA,EAAO;AAAA,IACrE,yBAAA,EAA2B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,MAAA,EAAO;AAAA,IAC/D,8BAAA,EAAgC,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,MAAA,EAAO;AAAA,IACpE,6BAAA,EAA+B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,MAAA,EAAO;AAAA,IACnE,wBAAA,EAA0B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,MAAA,EAAO;AAAA,IAC9D,uBAAA,EAAyB,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,MAAA,EAAO;AAAA,IAC7D,0BAAA,EAA4B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,MAAA,EAAO;AAAA,IAChE,iCAAA,EAAmC,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,MAAA,EAAO;AAAA,IACvE,0BAAA,EAA4B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,MAAA,EAAO;AAAA,IAChE,qBAAA,EAAuB;AAAA,MACrB,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,MAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,kCAAA,EAAoC;AAAA,MAClC,IAAA,EAAQ,QAAA;AAAA,MACR,GAAA,EAAO,MAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,sBAAA,EAAwB,EAAE,IAAA,EAAQ,QAAA,EAAU,KAAO,MAAA,EAAO;AAAA,IAC1D,0BAAA,EAA4B;AAAA,MAC1B,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,MAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,sBAAA,EAAwB,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,MAAA,EAAO;AAAA,IAC5D,wBAAA,EAA0B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,MAAA,EAAO;AAAA,IAC9D,4BAAA,EAA8B,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,MAAA,EAAO;AAAA,IAClE,iBAAA,EAAmB,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,MAAA,EAAO;AAAA,IACvD,uBAAuB,EAAE,IAAA,EAAQ,YAAY,GAAA,EAAO,MAAA,EAAQ,OAAS,qBAAA,EAAsB;AAAA,IAC3F,2BAAA,EAA6B;AAAA,MAC3B,IAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAO,MAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,uBAAuB,EAAE,IAAA,EAAQ,YAAY,GAAA,EAAO,MAAA,EAAQ,OAAS,qBAAA,EAAsB;AAAA,IAC3F,0BAA0B,EAAE,IAAA,EAAQ,YAAY,GAAA,EAAO,MAAA,EAAQ,OAAS,qBAAA,EAAsB;AAAA,IAC9F,oBAAoB,EAAE,IAAA,EAAQ,YAAY,GAAA,EAAO,MAAA,EAAQ,OAAS,qBAAA,EAAsB;AAAA,IAExF,mBAAA,EAAqB,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,QAAA,EAAS;AAAA,IAC3D,+BAAA,EAAiC,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,QAAA,EAAS;AAAA,IACvE,+BAAA,EAAiC,EAAE,IAAA,EAAQ,UAAA,EAAY,KAAO,QAAA,EAAS;AAAA,IACvE,uBAAA,EAAyB,EAAE,IAAA,EAAQ,QAAA,EAAU,KAAO,QAAA,EAAS;AAAA,IAC7D,oBAAA,EAAsB;AAAA,MACpB,IAAA,EAAQ,QAAA;AAAA,MACR,GAAA,EAAO,QAAA;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,qBAAqB,EAAE,IAAA,EAAQ,YAAY,GAAA,EAAO,QAAA,EAAU,OAAS,kBAAA;AAAmB;AAE5F,CAAA;;;AC9SA,IAAM,cAAA,GAAiBA,MAAE,MAAA,CAAO;AAAA,EAC9B,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,WAAA,EAAaA,MAAE,MAAA,EAAO;AAAA,EACtB,oBAAA,EAAsBA,MAAE,OAAA;AAC1B,CAAC,CAAA;AAED,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EAClC,MAAMA,KAAA,CAAE,IAAA,CAAK,CAAC,UAAA,EAAY,QAAA,EAAU,UAAU,CAAC,CAAA;AAAA,EAC/C,GAAA,EAAKA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACzB,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACpB,CAAC,CAAA;AAED,IAAM,cAAA,GAAiBA,MAAE,MAAA,CAAO;AAAA,EAC9B,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,EAClB,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,EAClB,KAAA,EAAOA,MAAE,MAAA,CAAO;AAAA,IACd,QAAA,EAAU,cAAA;AAAA,IACV,MAAA,EAAQ,cAAA;AAAA,IACR,QAAA,EAAU;AAAA,GACX,CAAA;AAAA,EACD,UAAUA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,IAAU,kBAAkB;AACnD,CAAC,CAAA;AAED,IAAM,MAAA,GAA2B,cAAA,CAAe,KAAA,CAAM,sBAAW,CAAA;AAE1D,IAAM,cAAA,GAA6C,MAAA,CAAO,MAAA,CAAO,MAAM;AAOvE,SAAS,gBAAgB,IAAA,EAA4B;AAC1D,EAAA,IAAI,CAAC,MAAM,OAAO,UAAA;AAClB,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,QAAA,CAAS,IAAI,CAAA;AAC1C,EAAA,OAAO,KAAA,GAAQ,MAAM,IAAA,GAAO,UAAA;AAC9B;AAKO,SAAS,gBAAgB,IAAA,EAAmC;AACjE,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,QAAA,CAAS,IAAI,CAAA;AAC1C,EAAA,OAAO,KAAA,IAAS,IAAA;AAClB;AAKO,SAAS,YAAY,IAAA,EAA8B;AACxD,EAAA,OAAO,cAAA,CAAe,MAAM,IAAI,CAAA;AAClC;AAMO,SAAS,0BAAA,GAAmE;AACjF,EAAA,OAAO,EAAE,OAAA,EAAS,cAAA,CAAe,OAAA,EAAS,OAAA,EAAS,eAAe,OAAA,EAAQ;AAC5E;;;ACjFO,SAAS,mBAAmB,UAAA,EAA4B;AAC7D,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,UAAU,CAAA;AAChC,EAAA,IAAI,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,GAAG,OAAO,EAAA;AAElC,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,MAAM,MAAA,GAAS,GAAA,GAAM,IAAA,CAAK,OAAA,EAAQ;AAClC,EAAA,IAAI,MAAA,GAAS,GAAG,OAAO,EAAA;AAEvB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,GAAI,CAAA;AACxC,EAAA,IAAI,OAAA,GAAU,EAAA,EAAI,OAAO,CAAA,EAAG,OAAO,CAAA,KAAA,CAAA;AAEnC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACvC,EAAA,IAAI,OAAA,GAAU,EAAA,EAAI,OAAO,CAAA,EAAG,OAAO,CAAA,KAAA,CAAA;AAEnC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACrC,EAAA,IAAI,KAAA,GAAQ,EAAA,EAAI,OAAO,CAAA,EAAG,KAAK,CAAA,KAAA,CAAA;AAE/B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,CAAA;AAClC,EAAA,IAAI,IAAA,GAAO,EAAA,EAAI,OAAO,CAAA,EAAG,IAAI,CAAA,KAAA,CAAA;AAE7B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,EAAE,CAAA;AACnC,EAAA,IAAI,MAAA,GAAS,EAAA,EAAI,OAAO,CAAA,EAAG,MAAM,CAAA,MAAA,CAAA;AAEjC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,EAAE,CAAA;AACpC,EAAA,OAAO,GAAG,KAAK,CAAA,KAAA,CAAA;AACjB;;;ACRA,IAAM,UAAA,GAAa,YAAA;AACnB,IAAM,QAAA,GAAW,YAAA;AAEV,SAAS,cAAA,CAAkB,OAAY,OAAA,EAAgC;AAC5E,EAAA,OAAO,CAAC,GAAG,KAAK,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAC/B,IAAA,MAAM,EAAA,GAAK,QAAQ,CAAC,CAAA;AACpB,IAAA,MAAM,EAAA,GAAK,QAAQ,CAAC,CAAA;AAEpB,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,GAAU,UAAA,GAAc,GAAG,OAAA,IAAW,EAAA;AACtD,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,GAAU,UAAA,GAAc,GAAG,OAAA,IAAW,EAAA;AAGtD,IAAA,MAAM,QAAA,GAAW,QAAQ,EAAA,CAAG,SAAA;AAC5B,IAAA,MAAM,QAAA,GAAW,QAAQ,EAAA,CAAG,SAAA;AAC5B,IAAA,IAAI,QAAA,IAAY,CAAC,QAAA,EAAU,OAAO,EAAA;AAClC,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,EAAU,OAAO,CAAA;AAGlC,IAAA,IAAI,IAAA,KAAS,IAAA,EAAM,OAAO,IAAA,CAAK,cAAc,IAAI,CAAA;AAGjD,IAAA,MAAM,MAAA,GAAS,GAAG,SAAA,IAAa,QAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,GAAG,SAAA,IAAa,QAAA;AAC/B,IAAA,OAAO,MAAA,CAAO,cAAc,MAAM,CAAA;AAAA,EACpC,CAAC,CAAA;AACH;AAMO,SAAS,mBAEd,IAAA,EAAoB;AACpB,EAAA,OAAO,EAAE,WAAW,IAAA,CAAK,SAAA,EAAW,SAAS,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,IAAA,CAAK,OAAA,EAAQ;AACnF;AAMO,SAAS,qBACd,IAAA,EACW;AACX,EAAA,OAAO,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,OAAA,EAAS,KAAK,OAAA,EAAS,OAAA,EAAS,CAAC,IAAA,CAAK,OAAA,EAAQ;AACpF;AAKO,SAAS,oBAAiD,IAAA,EAAoB;AACnF,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,CAAK,IAAA,EAAK;AAC9B;AAKO,SAAS,kBACd,IAAA,EACW;AACX,EAAA,OAAO,EAAE,WAAW,IAAA,CAAK,SAAA,EAAW,SAAS,IAAA,CAAK,UAAA,IAAc,KAAK,SAAA,EAAU;AACjF;;;ACxEO,SAAS,oBAAoB,GAAA,EAAqB;AACvD,EAAA,IAAI,aAAa,GAAA,CACd,IAAA,GACA,OAAA,CAAQ,mCAAA,EAAqC,EAAE,CAAA,CAC/C,OAAA,CAAQ,WAAA,EAAa,EAAE,EACvB,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,CAChB,OAAA,CAAQ,iBAAiB,EAAE,CAAA;AAC9B,EAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA,EAAG;AAClC,IAAA,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,UAAA;AAAA,EAC3C;AACA,EAAA,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACzC,EAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA,EAAG;AAClC,IAAA,UAAA,GAAa,WAAW,WAAA,EAAY;AAAA,EACtC;AAGA,EAAA,IAAI,UAAA,IAAc,CAAC,UAAA,CAAW,UAAA,CAAW,MAAM,KAAK,CAAC,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AAC7E,IAAA,UAAA,GAAa,GAAG,UAAU,CAAA,YAAA,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,UAAA;AACT;;;ACrBO,SAAS,eAAe,GAAA,EAA+C;AAC5E,EAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AACjB,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,IAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,CAAC,QAAA,EAAU,GAAA,CAAI,QAAQ,GAAA,CAAI,OAAO,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAChE,EAAA,IAAI,GAAA,CAAI,UAAA,IAAc,CAAC,QAAA,EAAU;AAC/B,IAAA,OAAO,CAAA,EAAG,GAAA,CAAI,UAAU,CAAA,EAAA,EAAK,IAAI,OAAO,CAAA,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAGO,SAAS,oBAAoB,GAAA,EAAmC;AACrE,EAAA,IAAI,CAAC,GAAA,CAAI,IAAA,EAAK,EAAG,OAAO,IAAA;AACxB,EAAA,MAAM,KAAA,GAAQ,GAAA,CACX,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,OAAO,OAAO,CAAA;AACjB,EAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,MACb,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,MACf,OAAA,EAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC;AAAA,KACjC;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,MACb,OAAA,EAAS,MAAM,CAAC;AAAA,KAClB;AAAA,EACF;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,CAAC,CAAA,EAAG;AAC9B;AAGO,SAAS,kBAAkB,IAAA,EAAkC;AAClE,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,GAAG,OAAO,EAAA;AACvC,EAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,WAAA,CAAY,CAAC,CAAA;AAC7B,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,WAAA,CAAY,CAAC,CAAA;AAC7B,EAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,MAAA,EAAW,OAAO,EAAA;AAC/C,EAAA,OAAO,OAAO,aAAA,CAAc,CAAA,GAAI,KAAO,MAAA,EAAS,CAAA,GAAI,KAAO,MAAO,CAAA;AACpE;;;AC3CA,IAAM,iBAAA,GAAoB,2BAAA;AAE1B,IAAM,aAAA,GAAoD;AAAA,EACxD,EAAE,MAAA,EAAQ,cAAA,EAAgB,IAAA,EAAM,SAAA,EAAU;AAAA,EAC1C,EAAE,MAAA,EAAQ,eAAA,EAAiB,IAAA,EAAM,UAAA,EAAW;AAAA,EAC5C,EAAE,MAAA,EAAQ,iBAAA,EAAmB,IAAA,EAAM,SAAA,EAAU;AAAA,EAC7C,EAAE,MAAA,EAAQ,kBAAA,EAAoB,IAAA,EAAM,UAAA;AACtC,CAAA;AAEA,IAAM,oBAAA,GAAuB,IAAI,GAAA,CAAI,aAAA,CAAc,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAErE,IAAM,sCAAsB,IAAI,GAAA,CAAI,CAAC,mBAAA,EAAqB,YAAY,CAAC,CAAA;AAEhE,SAAS,kBAAA,CACd,aACA,MAAA,EACoB;AACpB,EAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AACzB,EAAA,IAAI,mBAAA,CAAoB,GAAA,CAAI,WAAA,CAAY,IAAI,CAAA,EAAG;AAC7C,IAAA,OAAO,EAAE,MAAM,WAAA,CAAY,IAAA,EAAM,YAAY,EAAA,EAAI,IAAA,EAAM,YAAY,IAAA,EAAK;AAAA,EAC1E;AACA,EAAA,IAAI,CAAC,oBAAA,CAAqB,GAAA,CAAI,WAAA,CAAY,IAAI,GAAG,OAAO,IAAA;AACxD,EAAA,OAAO;AAAA,IACL,MAAM,WAAA,CAAY,IAAA;AAAA,IAClB,UAAA,EAAY,CAAA,EAAG,iBAAiB,CAAA,EAAG,MAAM,CAAA,CAAA;AAAA,IACzC,MAAM,WAAA,CAAY;AAAA,GACpB;AACF;AAEO,SAAS,cAAc,MAAA,EAAwB;AACpD,EAAA,MAAM,KAAA,GAAQ,OAAO,WAAA,EAAY;AACjC,EAAA,KAAA,MAAW,YAAY,aAAA,EAAe;AACpC,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,CAAS,MAAM,KAAK,KAAA,CAAM,MAAA,GAAS,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ;AAC5E,MAAA,OAAO,OAAO,KAAA,CAAM,CAAA,EAAG,CAAC,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,IAChD;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,eAAA,CAAgB,aAAiC,MAAA,EAAwB;AACvF,EAAA,IAAI,aAAa,OAAO,WAAA;AACxB,EAAA,OAAO,cAAc,MAAM,CAAA;AAC7B;AAqBA,IAAM,iBAAA,GAA4C;AAAA,EAChD,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA,EACV,mBAAA,EAAqB,aAAA;AAAA,EACrB,UAAA,EAAY;AACd,CAAA;AAEO,SAAS,kBAAkB,YAAA,EAA8B;AAC9D,EAAA,OAAO,iBAAA,CAAkB,YAAY,CAAA,IAAK,YAAA;AAC5C;AAEO,SAAS,kBAAkB,MAAA,EAAoC;AACpE,EAAA,MAAM,KAAA,GAAQ,OAAO,WAAA,EAAY;AACjC,EAAA,KAAA,MAAW,YAAY,aAAA,EAAe;AACpC,IAAA,IAAI,KAAA,CAAM,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AACnC,MAAA,OAAO;AAAA,QACL,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,UAAA,EAAY,CAAA,EAAG,iBAAiB,CAAA,EAAG,MAAM,CAAA;AAAA,OAC3C;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;;;AC/FA,IAAM,cAAA,GAAiB,QAAA;AACvB,IAAM,aAAA,GAAgB,cAAA;AAYf,SAAS,mBAAA,CAAoB,KAAA,EAAe,UAAA,GAAa,CAAA,EAAW;AACzE,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,eAAe,IAAA,CAAK,KAAK,GAAG,OAAO,KAAA;AAElD,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AACvB,MAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,QAAA,GAAA,IAAO,IAAA;AACP,QAAA,YAAA,IAAgB,CAAA;AAAA,MAClB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,GAAA,IAAO,IAAA;AACP,MAAA,YAAA,GAAe,CAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAUO,SAAS,mBAAA,CAAoB,KAAA,EAAe,mBAAA,GAAsB,CAAA,EAAW;AAClF,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,OAAO,oBAAoB,KAAA,CAAM,OAAA,CAAQ,aAAA,EAAe,EAAE,GAAG,mBAAmB,CAAA;AAClF;;;AC3CA,IAAM,QAAA,GAAW,QAAA;AAOV,SAAS,iBAAA,CAAkB,OAAe,MAAA,EAAwB;AACvE,EAAA,IAAI,MAAA,IAAU,GAAG,OAAO,EAAA;AACxB,EAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,SAAA,CAAU,QAAW,EAAE,WAAA,EAAa,YAAY,CAAA;AAC3E,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA;AACvE,EAAA,IAAI,SAAA,CAAU,MAAA,IAAU,MAAA,EAAQ,OAAO,KAAA;AACvC,EAAA,IAAI,MAAA,KAAW,GAAG,OAAO,QAAA;AACzB,EAAA,OAAO,SAAA,CAAU,MAAM,CAAA,EAAG,MAAA,GAAS,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GAAI,QAAA;AACnD;;;ACXO,SAAS,oBAAoB,IAAA,EAAoB;AACtD,EAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAA,CAAO,IAAA,CAAK,KAAI,GAAI,IAAA,CAAK,OAAA,EAAQ,IAAK,GAAI,CAAA;AAC/D,EAAA,IAAI,OAAA,GAAU,IAAI,OAAO,UAAA;AAEzB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACvC,EAAA,IAAI,OAAA,GAAU,EAAA,EAAI,OAAO,CAAA,EAAG,OAAO,CAAA,KAAA,CAAA;AAEnC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACrC,EAAA,IAAI,KAAA,GAAQ,EAAA,EAAI,OAAO,CAAA,EAAG,KAAK,CAAA,KAAA,CAAA;AAE/B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,CAAA;AAClC,EAAA,IAAI,IAAA,GAAO,CAAA,EAAG,OAAO,CAAA,EAAG,IAAI,CAAA,KAAA,CAAA;AAE5B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA;AACjC,EAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,OAAO,CAAA,EAAG,KAAK,CAAA,KAAA,CAAA;AAE9B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,EAAE,CAAA;AACnC,EAAA,OAAO,GAAG,MAAM,CAAA,MAAA,CAAA;AAClB;;;ACLO,SAAS,gBAAgB,KAAA,EAAmC;AACjE,EAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AACvD,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,GAAI,KAAA;AACpB,EAAA,OACE,OAAO,CAAA,KAAM,QAAA,IACb,OAAO,CAAA,KAAM,QAAA,IACb,OAAO,CAAA,KAAM,QAAA,IACb,MAAA,CAAO,QAAA,CAAS,CAAC,KACjB,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IACjB,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IACjB,KAAK,CAAA,IACL,CAAA,IAAK,GAAA,IACL,CAAA,IAAK,CAAA,IACL,CAAA,IAAK,GAAA,IACL,CAAA,IAAK,KACL,CAAA,IAAK,GAAA;AAET;AAMO,SAAS,YAAY,KAAA,EAAyB;AACnD,EAAA,OAAO,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,EAAA,EAAK,KAAK,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,CAAA;AACnF;AAMO,SAAS,kBAAkB,KAAA,EAAyB;AACzD,EAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,CAAC,KAAA,CAAM,CAAA,GAAI,GAAA,EAAK,KAAA,CAAM,CAAA,GAAI,GAAA,EAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AAEjE,EAAA,MAAM,CAAA,GAAI,EAAA,IAAM,OAAA,GAAU,EAAA,GAAK,KAAA,GAAQ,KAAK,GAAA,CAAA,CAAK,EAAA,GAAK,KAAA,IAAS,KAAA,EAAO,GAAG,CAAA;AACzE,EAAA,MAAM,CAAA,GAAI,EAAA,IAAM,OAAA,GAAU,EAAA,GAAK,KAAA,GAAQ,KAAK,GAAA,CAAA,CAAK,EAAA,GAAK,KAAA,IAAS,KAAA,EAAO,GAAG,CAAA;AACzE,EAAA,MAAM,CAAA,GAAI,EAAA,IAAM,OAAA,GAAU,EAAA,GAAK,KAAA,GAAQ,KAAK,GAAA,CAAA,CAAK,EAAA,GAAK,KAAA,IAAS,KAAA,EAAO,GAAG,CAAA;AAEzE,EAAA,OAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,CAAA;AAC5C;AAMO,SAAS,aAAA,CAAc,QAAkB,MAAA,EAA0B;AACxE,EAAA,MAAM,EAAA,GAAK,kBAAkB,MAAM,CAAA;AACnC,EAAA,MAAM,EAAA,GAAK,kBAAkB,MAAM,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,EAAA,OAAA,CAAQ,OAAA,GAAU,SAAS,MAAA,GAAS,IAAA,CAAA;AACtC;AAKO,SAAS,eAAA,CAAgB,YAAsB,UAAA,EAA+B;AACnF,EAAA,OAAO,aAAA,CAAc,UAAA,EAAY,UAAU,CAAA,IAAK,GAAA;AAClD;;;ACvDO,IAAM,gBAAA,GAA6D,OAAO,MAAA,CAAO;AAAA,EACtF,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,+CAAA;AAAA,IACZ,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,WAAA,EAAa;AAAA,IACX,UAAA,EAAY,yCAAA;AAAA,IACZ,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,SAAA,EAAW;AAAA,IACT,UAAA,EAAY,oCAAA;AAAA,IACZ,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,SAAA,EAAW;AAAA,IACT,UAAA,EAAY,yCAAA;AAAA,IACZ,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,WAAA,EAAa;AAAA,IACX,UAAA,EAAY,uDAAA;AAAA,IACZ,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,QAAA,EAAU;AAAA,IACR,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,yCAAA;AAAA,IACZ,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,WAAA,EAAa;AAAA,IACX,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,mDAAA;AAAA,IACZ,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,QAAA,EAAU,EAAE,iBAAA,EAAmB,qBAAA,EAAsB;AAAA;AAAA,EAErD,MAAA,EAAQ,EAAE,iBAAA,EAAmB,mBAAA,EAAoB;AAAA,EACjD,UAAA,EAAY,EAAE,iBAAA,EAAmB,wBAAA,EAAyB;AAAA,EAC1D,QAAA,EAAU,EAAE,iBAAA,EAAmB,wCAAA,EAAyC;AAAA,EACxE,OAAA,EAAS,EAAE,iBAAA,EAAmB,wBAAA,EAAyB;AAAA,EACvD,gBAAA,EAAkB,EAAE,iBAAA,EAAmB,kCAAA,EAAmC;AAAA,EAC1E,QAAQ,EAAC;AAAA,EACT,GAAA,EAAK;AAAA;AAAA;AAAA;AAAA,IAIH,UAAA,EAAY,gCAAA;AAAA,IACZ,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,SAAA,EAAW;AAAA;AAAA;AAAA,IAGT,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,OAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMP,UAAA,EAAY,4BAAA;AAAA,IACZ,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,KAAA,EAAO;AAAA;AAAA,IAEL,UAAA,EAAY,mCAAA;AAAA,IACZ,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,uCAAA;AAAA,IACZ,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,KAAA,EAAO;AAAA;AAAA;AAAA,IAGL,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,OAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOP,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,IAAA,EAAM;AAAA;AAAA;AAAA,IAGJ,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,MAAA,EAAQ;AAAA;AAAA;AAAA;AAAA,IAIN,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOT,CAAC;AAMM,IAAM,iBAAA,GAA6E;AAAA,EACxF,CAAC,aAAa,SAAS,CAAA;AAAA,EACvB,CAAC,eAAe,SAAS,CAAA;AAAA,EACzB,CAAC,uBAAuB,aAAa,CAAA;AAAA,EACrC,CAAC,+BAA+B,aAAa,CAAA;AAAA,EAC7C,CAAC,gCAAgC,SAAS,CAAA;AAAA,EAC1C,CAAC,gBAAgB,SAAS,CAAA;AAAA,EAC1B,CAAC,iBAAiB,SAAS,CAAA;AAAA,EAC3B,CAAC,iBAAiB,OAAO,CAAA;AAAA,EACzB,CAAC,eAAe,WAAW,CAAA;AAAA,EAC3B,CAAC,0BAA0B,WAAW,CAAA;AAAA,EACtC,CAAC,gBAAgB,SAAS,CAAA;AAAA,EAC1B,CAAC,gBAAgB,QAAQ,CAAA;AAAA,EACzB,CAAC,qBAAqB,aAAa,CAAA;AAAA,EACnC,CAAC,kBAAkB,UAAU,CAAA;AAAA,EAC7B,CAAC,sBAAsB,UAAU,CAAA;AAAA,EACjC,CAAC,gBAAgB,OAAO,CAAA;AAAA,EACxB,CAAC,iBAAiB,UAAU,CAAA;AAAA,EAC5B,CAAC,mBAAmB,SAAS,CAAA;AAAA,EAC7B,CAAC,eAAe,SAAS,CAAA;AAAA,EACzB,CAAC,iBAAiB,aAAa,CAAA;AAAA,EAC/B,CAAC,kBAAkB,QAAQ,CAAA;AAAA,EAC3B,CAAC,mBAAmB,QAAQ,CAAA;AAAA,EAC5B,CAAC,YAAY,MAAM,CAAA;AAAA,EACnB,CAAC,iBAAiB,QAAQ,CAAA;AAAA,EAC1B,CAAC,oBAAoB,aAAa,CAAA;AAAA,EAClC,CAAC,gBAAgB,UAAU,CAAA;AAAA,EAC3B,CAAC,gBAAgB,SAAS,CAAA;AAAA,EAC1B,CAAC,cAAc,QAAQ,CAAA;AAAA,EACvB,CAAC,mBAAmB,YAAY,CAAA;AAAA,EAChC,CAAC,kBAAkB,UAAU,CAAA;AAAA,EAC7B,CAAC,mBAAmB,SAAS,CAAA;AAAA,EAC7B,CAAC,qBAAqB,WAAW,CAAA;AAAA,EACjC,CAAC,YAAY,KAAK,CAAA;AAAA,EAClB,CAAC,gBAAgB,SAAS,CAAA;AAAA,EAC1B,CAAC,YAAY,OAAO,CAAA;AAAA,EACpB,CAAC,oBAAoB,OAAO,CAAA;AAAA,EAC5B,CAAC,gBAAgB,SAAS,CAAA;AAAA,EAC1B,CAAC,YAAY,MAAM,CAAA;AAAA,EACnB,CAAC,YAAY,QAAQ,CAAA;AAAA,EACrB,CAAC,iBAAiB,OAAO;AAC3B;;;AC7JO,SAAS,sBAAsB,UAAA,EAA4B;AAChE,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,KAAK,CAAA,IAAK,iBAAA,EAAmB;AAC/C,IAAA,IAAI,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA,EAAG,OAAO,KAAA;AAAA,EAC5C;AACA,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA;AAClC,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,CAAA,EAAG,OAAO,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACrD,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,WAAA,CAAY,SAAiB,IAAA,EAAyD;AAC7F,EAAA,IAAI,MAAA,GAAS,OAAA;AACb,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,CAAA,CAAA,EAAI,GAAG,GAAG,CAAA,EAAG;AAC/B,MAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,MAAA,MAAA,GAAS,OAAO,UAAA,CAAW,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAA,EAAK,kBAAA,CAAmB,KAAK,CAAC,CAAA;AAAA,IAClE;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAaA,SAAS,oBAAA,CAAqB,OAAe,UAAA,EAAyC;AACpF,EAAA,IAAI,UAAU,SAAA,EAAW;AACvB,IAAA,OAAO,UAAA,KAAe,oBAAA;AAAA,EACxB;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAA,CACP,KAAA,EACA,IAAA,EACA,UAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAW,iBAAiB,KAAK,CAAA;AACvC,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,IAAI,QAAA,CAAS,UAAA,IAAc,oBAAA,CAAqB,KAAA,EAAO,UAAU,CAAA,EAAG;AAClE,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,QAAA,CAAS,UAAA,EAAY,IAAI,CAAA;AACjD,IAAA,IAAI,KAAK,OAAO,GAAA;AAAA,EAClB;AACA,EAAA,IAAI,SAAS,iBAAA,EAAmB;AAC9B,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,QAAA,CAAS,iBAAA,EAAmB,IAAI,CAAA;AACxD,IAAA,IAAI,KAAK,OAAO,GAAA;AAAA,EAClB;AACA,EAAA,OAAO,IAAA;AACT;AAQA,IAAM,iBAAA,GAAoB,mBAAA;AAE1B,SAAS,aAAa,KAAA,EAA+B;AACnD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,IAAA;AACtC,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,IAAA;AACxC;AAIA,SAAS,WAAW,KAAA,EAAqD;AACvE,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,mCAAmC,CAAA;AAC7D,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,CAAC,KAAK,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,OAAO,IAAA;AAC7C,EAAA,OAAO,EAAE,KAAK,KAAA,CAAM,CAAC,GAAG,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,EAAE;AACzC;AAqBO,SAAS,eAAe,IAAA,EAAyC;AACtE,EAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,KAAK,IAAA,EAAM,SAAA,EAAW,cAAa,GAAI,IAAA;AACnE,EAAA,MAAM,KAAA,GAAQ,sBAAsB,UAAU,CAAA;AAO9C,EAAA,IAAI,UAAA,CAAW,UAAA,CAAW,aAAa,CAAA,EAAG;AACxC,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA;AACzC,IAAA,IAAI,QAAA,IAAY,YAAA,IAAgB,iBAAA,CAAkB,IAAA,CAAK,QAAQ,CAAA,EAAG;AAChE,MAAA,OAAO,CAAA,mBAAA,EAAsB,YAAY,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAA,IACvD;AACA,IAAA,OAAO,UAAA,CAAW,WAAW,EAAE,MAAA,EAAQ,cAAc,GAAA,EAAK,SAAA,EAAW,IAAA,EAAK,EAAG,UAAU,CAAA;AAAA,EACzF;AAGA,EAAA,IACE,WAAW,UAAA,CAAW,cAAc,KACpC,UAAA,CAAW,UAAA,CAAW,8BAA8B,CAAA,EACpD;AACA,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,MAAA,CAAO,OAAO,CAAA;AAC3C,IAAA,IAAI,SAAS,OAAO,OAAA;AACpB,IAAA,OAAO,UAAA,CAAW,WAAW,EAAE,MAAA,EAAQ,cAAc,GAAA,EAAK,SAAA,EAAW,MAAM,CAAA;AAAA,EAC7E;AAGA,EAAA,IAAI,eAAe,oBAAA,EAAsB;AACvC,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,MAAA,CAAO,MAAM,CAAA;AACzC,IAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,eAAe,sBAAA,EAAwB;AACzC,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,IAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,OAAO,MAAA,KAAW,QAAA,EAAU;AAChD,MAAA,MAAM,MAAA,GAAS,YAAA,CAAc,MAAA,CAAmC,MAAM,CAAA;AACtE,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB;AACA,IAAA,OAAO,gBAAA,CAAiB,QAAQ,iBAAA,IAAqB,IAAA;AAAA,EACvD;AAGA,EAAA,IAAI,eAAe,iCAAA,EAAmC;AACpD,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,IAAA,IAAI,OAAA,IAAW,IAAA,IAAQ,OAAO,OAAA,KAAY,QAAA,EAAU;AAClD,MAAA,MAAM,UAAA,GAAa,YAAA,CAAc,OAAA,CAAoC,GAAG,CAAA;AACxE,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAMC,OAAAA,GAAS,WAAW,UAAU,CAAA;AACpC,QAAA,IAAIA,OAAAA,EAAQ;AACV,UAAA,OAAO,CAAA,2BAAA,EAA8BA,OAAAA,CAAO,GAAG,CAAA,CAAA,EAAIA,QAAO,IAAI,CAAA,CAAA;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,eAAe,kCAAA,EAAoC;AACrD,IAAA,MAAMA,OAAAA,GAAS,WAAW,GAAG,CAAA;AAC7B,IAAA,IAAIA,OAAAA,EAAQ;AACV,MAAA,OAAO,CAAA,2BAAA,EAA8BA,OAAAA,CAAO,GAAG,CAAA,CAAA,EAAIA,QAAO,IAAI,CAAA,CAAA;AAAA,IAChE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAMA,EAAA,IAAI,eAAe,4BAAA,EAA8B;AAC/C,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAC3B,IAAA,IAAI,WAAA,IAAe,IAAA,IAAQ,OAAO,WAAA,KAAgB,QAAA,EAAU;AAC1D,MAAA,MAAM,IAAA,GAAO,YAAA,CAAc,WAAA,CAAwC,IAAI,CAAA;AACvE,MAAA,IAAI,IAAA,EAAM,OAAO,CAAA,6BAAA,EAAgC,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA;AAAA,IAC3E;AACA,IAAA,OAAO,gBAAA,CAAiB,SAAS,iBAAA,IAAqB,IAAA;AAAA,EACxD;AAMA,EAAA,IAAI,eAAe,sBAAA,EAAwB;AACzC,IAAA,OAAO,YAAA,CAAa,OAAO,YAAY,CAAA;AAAA,EACzC;AACA,EAAA,IAAI,eAAe,mBAAA,EAAqB;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,UAAA,CAAW,UAAA,CAAW,gBAAgB,CAAA,EAAG;AAC3C,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,MAAA,CAAO,OAAO,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA;AACrC,IAAA,IAAI,WAAW,IAAA,EAAM,OAAO,CAAA,EAAG,OAAO,GAAG,IAAI,CAAA,CAAA;AAC7C,IAAA,IAAI,SAAS,OAAO,OAAA;AAAA,EAEtB;AAKA,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,MAAA,CAAO,GAAG,CAAA;AACzC,EAAA,IAAI,WAAW,OAAO,SAAA;AAItB,EAAA,OAAO,UAAA,CAAW,OAAO,EAAE,MAAA,EAAQ,cAAc,GAAA,EAAK,SAAA,EAAW,IAAA,EAAK,EAAG,UAAU,CAAA;AACrF;;;ACvNA,SAAS,iBAAiB,KAAA,EAAyB;AACjD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,IAAA,GAAO,MAAA,GAAS,CAAA;AAC5D;AAEA,SAAS,mBAAmB,MAAA,EAA0C;AACpE,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,CAAO,MAAA,KAAW,WAAW,MAAA,CAAO,MAAA,CAAO,MAAK,GAAI,EAAA;AAC1E,EAAA,MAAM,QAAQ,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,GAAW,OAAO,KAAA,GAAQ,CAAA;AAChE,EAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,KAAA,GAAQ,CAAA;AACtC;AAEA,SAAS,qBAAqB,MAAA,EAA0C;AACtE,EAAA,OAAO,gBAAA,CAAiB,MAAA,CAAO,KAAK,CAAA,IAAK,OAAO,IAAA,IAAQ,IAAA;AAC1D;AAEA,SAAS,wBAAwB,MAAA,EAA0C;AACzE,EAAA,OAAO,gBAAA,CAAiB,OAAO,MAAM,CAAA;AACvC;AAEA,SAAS,wBAAwB,MAAA,EAA0C;AACzE,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,SAAiB,IAAA,CAAK,IAAA,GAAO,MAAA,GAAS,CAAA;AAC1D,EAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AAC5C,IAAA,MAAM,QAAS,IAAA,CAAiC,KAAA;AAChD,IAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,IAAA,GAAO,MAAA,GAAS,CAAA;AAAA,EAC5D;AACA,EAAA,OAAO,KAAA;AACT;AAEO,IAAM,yBAAA,GACX,OAAO,MAAA,CAAO;AAAA,EACZ,oBAAA,EAAsB,kBAAA;AAAA,EACtB,uBAAA,EAAyB,oBAAA;AAAA,EACzB,oBAAA,EAAsB,uBAAA;AAAA,EACtB,sBAAA,EAAwB;AAC1B,CAAC;AASI,SAAS,qBAAA,CAAsB,YAAoB,MAAA,EAA0B;AAClF,EAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,OAAO,MAAA,KAAW,UAAU,OAAO,KAAA;AAC1D,EAAA,MAAM,IAAA,GAAO,0BAA0B,UAAU,CAAA;AACjD,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,OAAO,KAAK,MAAiC,CAAA;AAC/C;;;ACrDO,IAAM,oBAAA,GAAuB,CAAC,MAAA,EAAQ,QAAA,EAAU,UAAU,eAAe;AAsBzE,SAAS,gBAAgB,IAAA,EAA6C;AAC3E,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,KAAA;AAC3C,EAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IACZ,CAAC,UAAU,CAAC,KAAA,CAAM,OAAQ,oBAAA,CAA2C,QAAA,CAAS,MAAM,GAAG;AAAA,GACzF;AACF;;;ACWO,IAAM,qBAAA,GAAwB;AAE9B,IAAM,UAAA,GAAmC,OAAO,MAAA,CAAO;AAAA,EAC5D;AAAA,IACE,EAAA,EAAI,SAAA;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,YAAA,EAAc,CAAC,aAAa,CAAA;AAAA,IAC5B,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,EAAA,EAAI,MAAA;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAc,CAAC,WAAW,CAAA;AAAA,IAC1B,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,EAAA,EAAI,UAAA;AAAA,IACJ,IAAA,EAAM,UAAA;AAAA,IACN,YAAA,EAAc,CAAC,cAAc,CAAA;AAAA,IAC7B,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,WAAA;AAAA,IACN,YAAA,EAAc,CAAC,YAAY,CAAA;AAAA,IAC3B,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,EAAA,EAAI,UAAA;AAAA,IACJ,IAAA,EAAM,UAAA;AAAA,IACN,YAAA,EAAc,CAAC,aAAa,CAAA;AAAA,IAC5B,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc,CAAC,WAAW,CAAA;AAAA,IAC1B,OAAA,EAAS;AAAA;AAEb,CAAC;AAED,IAAM,gBAAA,GAAmD,IAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAG1F,SAAS,iBAAiB,EAAA,EAAmC;AAClE,EAAA,OAAO,gBAAA,CAAiB,IAAI,EAAE,CAAA;AAChC;AAOO,SAAS,mBAAmB,QAAA,EAAyC;AAC1E,EAAA,MAAM,IAAA,GAAO,SAAS,WAAA,EAAY;AAClC,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,KAAA,MAAW,MAAA,IAAU,UAAU,YAAA,EAAc;AAC3C,MAAA,IAAI,SAAS,MAAA,IAAU,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,MAAM,EAAE,CAAA,EAAG;AAClD,QAAA,OAAO,SAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAaO,SAAS,wBAAwB,OAAA,EAA4B;AAClE,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAMA,OAAAA,GAAS,IAAI,GAAA,CAAI,OAAO,CAAA;AAC9B,IAAA,QAAA,GAAWA,OAAAA,CAAO,QAAA;AAClB,IAAA,OAAA,GAAU,CAAA,EAAGA,OAAAA,CAAO,QAAQ,CAAA,EAAA,EAAKA,QAAO,QAAQ,CAAA,CAAA;AAAA,EAClD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,qBAAA;AAAA,MACJ,IAAA,EAAM,OAAA;AAAA,MACN,cAAc,EAAC;AAAA,MACf,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,mBAAmB,QAAQ,CAAA;AAC3C,EAAA,IAAI,SAAS,OAAO,OAAA;AAEpB,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,qBAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,cAAc,EAAC;AAAA,IACf;AAAA,GACF;AACF;;;AC9IO,IAAM,sBAAA,GAAyB;AAY/B,SAAS,kBAAkB,CAAA,EAA8B;AAC9D,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,EAAE,WAAA,EAAa,MAAA,EAAA;AACnB,EAAA,IAAI,EAAE,QAAA,EAAU,MAAA,EAAA;AAChB,EAAA,IAAI,CAAA,CAAE,gBAAgB,CAAA,EAAG,MAAA,EAAA;AACzB,EAAA,IAAI,CAAA,CAAE,iBAAiB,CAAA,EAAG,MAAA,EAAA;AAC1B,EAAA,IAAI,CAAA,CAAE,aAAa,CAAA,EAAG,MAAA,EAAA;AACtB,EAAA,IAAI,CAAA,CAAE,qBAAqB,CAAA,EAAG,MAAA,EAAA;AAC9B,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,oBAAoB,CAAA,EAA8B;AAChE,EAAA,OAAO,KAAK,KAAA,CAAO,iBAAA,CAAkB,CAAC,CAAA,GAAI,yBAA0B,GAAG,CAAA;AACzE;;;ACrBO,IAAM,oBAAA,GAAuB;AAC7B,IAAM,UAAA,GAAa;AA0B1B,SAAS,eAAe,KAAA,EAA2C;AACjE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,IAAA,GAAO,MAAA,GAAS,CAAA;AAC5D;AAMO,SAAS,qBAAqB,MAAA,EAA8C;AACjF,EAAA,OAAO;AAAA,IACL,QAAQ,MAAA,CAAO,SAAA;AAAA,IACf,UAAU,MAAA,CAAO,WAAA;AAAA,IACjB,OAAO,MAAA,CAAO,QAAA;AAAA,IACd,eAAA,EAAiB,OAAO,oBAAA,GAAuB,CAAA;AAAA,IAC/C,MAAA,EAAQ,OAAO,UAAA,IAAc,UAAA;AAAA,IAC7B,SAAA,EAAW,OAAO,cAAA,GAAiB;AAAA,GACrC;AACF;AAMO,SAAS,yBAAyB,OAAA,EAA0C;AACjF,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAa,EAAC;AACxC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,EAAC;AAClC,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAa,EAAC;AACxC,EAAA,MAAM,oBAAA,GAAuB,UAAU,MAAA,CAAO,CAAC,MAAuB,CAAC,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AAClF,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,cAAA,CAAe,OAAA,CAAQ,MAAM,CAAA;AAAA,IACxC,WAAA,EAAa,cAAA,CAAe,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAC5C,QAAA,EAAU,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAAA,IACtC,oBAAA;AAAA,IACA,YAAY,MAAA,CAAO,MAAA;AAAA,IACnB,gBAAgB,SAAA,CAAU;AAAA,GAC5B;AACF;AAGO,SAAS,uBAAuB,OAAA,EAAgC;AACrE,EAAA,OAAO,oBAAA,CAAqB,wBAAA,CAAyB,OAAO,CAAC,CAAA;AAC/D;AAGO,SAAS,sBAAsB,KAAA,EAAiD;AACrF,EAAA,MAAM,MAAM,WAAA,IAAe,KAAA,GAAQ,qBAAqB,KAAK,CAAA,GAAI,uBAAuB,KAAK,CAAA;AAC7F,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA,EAAG;AAClC,IAAA,IAAI,CAAA,EAAG,CAAA,EAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA;AACT;;;AC9EO,SAAS,oBACd,SAAA,EACe;AACf,EAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,MAAA,KAAW,GAAG,OAAO,MAAA;AAEjD,EAAA,MAAM,SAAS,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,OAAO,CAAA;AACjD,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAEhC,EAAA,MAAM,UAAU,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,IAAI,CAAA;AACrD,EAAA,IAAI,SAAS,OAAO,OAAA;AAEpB,EAAA,OAAO,CAAC,GAAG,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,CAAA,CAAE,SAAA,IAAa,IAAI,aAAA,CAAc,CAAA,CAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAA;AAC3F;ACvBO,SAAS,aAAa,GAAA,EAAa;AACxC,EAAA,OAAO,CAAC,KAAA,KAA2B;AACjC,IAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,SAAA,CAAU,QAAW,EAAE,WAAA,EAAa,YAAY,CAAA;AAC3E,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,CAAA,IAAK,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxC,MAAA,KAAA,EAAA;AACA,MAAA,IAAI,KAAA,GAAQ,KAAK,OAAO,KAAA;AAAA,IAC1B;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AACF;AAGO,IAAM,YAAYD,KAAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,kCAAkC,aAAa;AAGlF,IAAM,cAAA,GAAiBA,MAAE,MAAA,EAAO,CAAE,SAAS,EAAE,MAAA,EAAQ,MAAM;AAG3D,IAAM,cAAcA,KAAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,mBAAmB,gBAAgB;AAGxE,IAAM,YAAYA,KAAAA,CACtB,MAAA,EAAO,CACP,KAAA,CAAM,mDAAmD,aAAa;AAGlE,IAAM,oBAAoBA,KAAAA,CAC9B,MAAA,EAAO,CACP,KAAA,CAAM,uCAAuC,6BAA6B;AAGtE,IAAM,SAAA,GAAYA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA;AAM7B,IAAM,eAAA,GAAkBA,MAAE,MAAA,CAAO;AAAA,EACtC,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK;AACP,CAAC;AAOM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,KAAA,EAAOA,KAAAA,CAAE,OAAA,CAAQ,mCAAmC,EAAE,QAAA,EAAS;AAAA,EAC/D,MAAA,EAAQA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,CAAO,EAAE,GAAA,EAAKA,KAAAA,CAAE,MAAA,EAAO,EAAG,CAAC;AAC/C,CAAC;;;ACpDM,IAAM,mCAAA,GAAsCA,MAAE,MAAA,CAAO;AAAA,EAC1D,WAAA,EAAa,eAAA;AAAA,EACb,SAAA,EAAW;AACb,CAAC;ACHM,IAAM,uBAAA,GAA0BA,MAAE,MAAA,CAAO;AAAA,EAC9C,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO,eAAA;AAAA,EACP,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,MAAA,CAAO,YAAA,CAAa,EAAE,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA,EAC7D,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,GAAI,CAAA,CAAE,QAAA,EAAS;AAAA,EACjE,SAAA,EAAW;AACb,CAAC;ACGM,IAAM,uBAAA,GAA0BA,MAAE,MAAA,CAAO;AAAA,EAC9C,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW,cAAA;AAAA,EACX,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,aAAa,GAAG,CAAA,EAAG,oCAAoC,CAAA,CAAE,QAAA;AACnF,CAAC;AAcM,SAAS,4BAA4B,WAAA,EAAqB;AAC/D,EAAA,OAAO,wBAAwB,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,CAAO,YAAY,WAAA,EAAa;AAAA,IAChF,OAAA,EAAS,4BAAA;AAAA,IACT,IAAA,EAAM,CAAC,SAAS;AAAA,GACjB,CAAA;AACH;AC3BO,IAAM,mBAAA,GAAsBA,MAAE,MAAA,CAAO;AAAA,EAC1C,GAAA,EAAK,SAAA;AAAA,EACL,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,EACjB,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,QAAA,EAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,EACjB,OAAA,EAASA,MAAE,OAAA,EAAQ;AAAA,EACnB,UAAA,EAAY,cAAA;AAAA,EACZ,eAAA,EAAiBA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EACtC,iBAAA,EAAmB,cAAA,CAAe,QAAA,EAAS,CAAE,QAAA;AAC/C,CAAC;AAUM,IAAM,uBAAA,GAA0BA,MAAE,MAAA,CAAO;AAAA,EAC9C,KAAA,EAAOA,KAAAA,CAAE,KAAA,CAAM,mBAAmB,CAAA;AAAA,EAClC,MAAA,EAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACrB,CAAC;AAQM,IAAM,2BAAA,GAA8BA,MAAE,MAAA,CAAO;AAAA,EAClD,GAAA,EAAK,SAAA;AAAA,EACL,OAAA,EAAS,cAAA;AAAA,EACT,MAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA;AAC9B,CAAC;AASM,IAAM,aAAA,GAAgB,CAAC,iBAAiB;AC3CxC,IAAM,eAAA,GAAkBA,MAAE,MAAA,CAAO;AAAA,EACtC,GAAA,EAAK,SAAA;AAAA,EACL,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,EACjB,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACxB,CAAC;AAID,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EAClC,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA,EACb,KAAA,EAAO,eAAA;AAAA,EACP,SAAA,EAAW,cAAA;AAAA,EACX,SAAA,EAAWA,MAAE,MAAA;AACf,CAAC,CAAA;AASM,IAAM,kBAAA,GAAqB,mBAAmB,MAAA,CAAO;AAAA,EAC1D,MAAA,EAAQA,KAAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACxB,KAAA,EAAOA,KAAAA,CAAE,OAAA,CAAQ,MAAM,EAAE,QAAA,EAAS;AAAA,EAClC,OAAA,EAASA,MAAE,MAAA,CAAOA,KAAAA,CAAE,QAAO,EAAGA,KAAAA,CAAE,SAAS;AAC3C,CAAC;AAuBM,IAAM,wBAAA,GAA2B,mBAAmB,MAAA,CAAO;AAAA,EAChE,MAAA,EAAQA,KAAAA,CAAE,OAAA,CAAQ,YAAY,CAAA;AAAA,EAC9B,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,EAChB,GAAA,EAAK,YAAY,QAAA,EAAS;AAAA,EAC1B,GAAA,EAAK,UAAU,QAAA,EAAS;AAAA,EACxB,OAAA,EAASA,MAAE,MAAA,CAAOA,KAAAA,CAAE,QAAO,EAAGA,KAAAA,CAAE,SAAS;AAC3C,CAAC;AAkBM,IAAM,oBAAA,GAAuBA,KAAAA,CAAE,kBAAA,CAAmB,QAAA,EAAU;AAAA,EACjE,kBAAA;AAAA,EACA;AACF,CAAC;AAkBM,IAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA,EAC3C,KAAA,EAAOA,KAAAA,CAAE,KAAA,CAAM,oBAAoB,CAAA;AAAA,EACnC,MAAA,EAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACrB,CAAC;AAwBD,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EAChC,SAAA,EAAW,cAAA;AAAA,EACX,MAAA,EAAQA,KAAAA,CAAE,KAAA,CAAM,CAACA,KAAAA,CAAE,OAAA,CAAQ,MAAM,CAAA,EAAGA,KAAAA,CAAE,OAAA,CAAQ,YAAY,CAAC,CAAC,CAAA;AAAA,EAC5D,EAAA,EAAIA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC;AACtB,CAAC,CAAA;AAYD,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,MAAM,CAAA,GAAI,UAAA;AACV,EAAA,MAAM,GAAA,GACJ,OAAO,CAAA,CAAE,IAAA,KAAS,aACd,CAAA,CAAE,IAAA,CAAK,SAAS,kBAAA,CAAmB,KAAK,CAAC,CAAC,CAAA,GACzC,EAAE,MAAA,CAAsB,IAAA,CAAK,OAAO,OAAO,CAAA,CAAE,SAAS,QAAQ,CAAA;AAIrE,EAAA,IAAI,MAAM,GAAA,CAAI,MAAA;AACd,EAAA,OAAO,MAAM,CAAA,IAAK,GAAA,CAAI,WAAW,GAAA,GAAM,CAAC,MAAM,EAAA,EAAI,GAAA,EAAA;AAClD,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AACjE;AAEA,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,GAAG,IAAI,KAAA,CAAM,KAAA,CAAA,CAAO,KAAA,CAAM,MAAA,GAAS,KAAK,CAAC,CAAA;AAC/F,EAAA,MAAM,CAAA,GAAI,UAAA;AACV,EAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,UAAA,EAAY;AAChC,IAAA,OAAO,mBAAmB,MAAA,CAAO,CAAA,CAAE,IAAA,CAAK,MAAM,CAAC,CAAC,CAAA;AAAA,EAClD;AACA,EAAA,OAAQ,EAAE,MAAA,CAAsB,IAAA,CAAK,QAAQ,QAAQ,CAAA,CAAE,SAAS,OAAO,CAAA;AACzE;AAEO,SAAS,iBAAiB,MAAA,EAA4B;AAC3D,EAAA,OAAO,WAAA,CAAY,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAC3C;AAEO,SAAS,iBAAiB,OAAA,EAA6B;AAC5D,EAAA,MAAM,IAAA,GAAO,cAAc,OAAO,CAAA;AAClC,EAAA,MAAMC,OAAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACvC,EAAA,OAAO,gBAAA,CAAiB,MAAMA,OAAM,CAAA;AACtC;ACnLO,IAAM,gCAAA,GAAmCD,MAAE,MAAA,CAAO;AAAA,EACvD,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,IAAI,GAAI,CAAA;AAAA,EAC1D,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,GAAI,CAAA,CAAE,QAAA,EAAS;AAAA,EACnE,YAAA,EAAc,UAAU,QAAA,EAAS;AAAA,EACjC,YAAA,EAAcA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,GAAI,CAAA,CAAE,QAAA,EAAS;AAAA,EACtE,aAAA,EAAe,UAAU,QAAA,EAAS;AAAA,EAClC,QAAA,EAAU,eAAe,QAAA,EAAS;AAAA,EAClC,SAAA,EAAW,eAAe,QAAA,EAAS;AAAA,EACnC,MAAA,EAAQ,iBAAiB,QAAA,EAAS;AAAA,EAClC,SAAA,EAAW;AACb,CAAC;ACVM,IAAM,yBAAA,GAA4BA,MAAE,MAAA,CAAO;AAAA,EAChD,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,IAAI,GAAI,CAAA;AAAA,EAC1D,MAAA,EAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,EAAE,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA,EAAS;AAAA,EAC9D,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,GAAI,CAAA,CAAE,QAAA,EAAS;AAAA,EACrE,SAAA,EAAW,gBAAgB,QAAA,EAAS;AAAA,EACpC,SAAA,EAAW;AACb,CAAC;ACNM,IAAM,4BAAA,GAA+BA,MAAE,MAAA,CAAO;AAAA,EACnD,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,IAAI,GAAI,CAAA;AAAA,EACjE,cAAA,EAAgB,UAAU,QAAA,EAAS;AAAA,EACnC,MAAA,EAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,GAAI,CAAA,CAAE,QAAA,EAAS;AAAA,EAChE,YAAA,EAAcA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,GAAI,CAAA,CAAE,QAAA,EAAS;AAAA,EACtE,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,EAAE,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA,EAAS;AAAA,EAC7D,UAAA,EAAYA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAK,CAAA,CAAE,QAAA,EAAS;AAAA,EACtE,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAK,CAAA,CAAE,QAAA,EAAS;AAAA,EACvE,QAAA,EAAUA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC/B,SAAA,EAAW,eAAe,QAAA,EAAS;AAAA,EACnC,OAAA,EAAS,eAAe,QAAA,EAAS;AAAA,EACjC,MAAA,EAAQ,iBAAiB,QAAA,EAAS;AAAA,EAClC,SAAA,EAAW;AACb,CAAC;ACRM,IAAM,kCAAA,GAAqCA,MAAE,MAAA,CAAO;AAAA,EACzD,QAAA,EAAUA,MAAE,MAAA,EAAO;AAAA,EACnB,GAAA,EAAK,SAAA;AAAA,EACL,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,EAAE,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA,EAAS;AAAA,EAC7D,OAAA,EAAS,UAAU,QAAA,EAAS;AAAA,EAC5B,SAAA,EAAWA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAChC,SAAA,EAAW;AACb,CAAC;ACZM,IAAM,wBAAA,GAA2BA,MAAE,MAAA,CAAO;AAAA,EAC/C,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,IAAI,GAAI,CAAA;AAAA,EAC3D,MAAA,EAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,GAAI,CAAA,CAAE,QAAA,EAAS;AAAA,EAChE,SAAA,EAAW,UAAU,QAAA,EAAS;AAAA,EAC9B,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAK,CAAA,CAAE,QAAA,EAAS;AAAA,EACvE,SAAA,EAAW,eAAe,QAAA,EAAS;AAAA,EACnC,SAAA,EAAW;AACb,CAAC;ACFM,IAAM,2BAAA,GAA8BA,MAAE,MAAA,CAAO;AAAA,EAClD,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,MAAA,CAAO,YAAA,CAAa,EAAE,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA,EACxD,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,SAAA,EAAW;AACb,CAAC;ACHM,IAAM,2BAAA,GAA8BA,MAAE,MAAA,CAAO;AAAA,EAClD,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,IAAI,GAAI,CAAA;AAAA,EAC7D,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EAC/B,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,IAAI,GAAI,CAAA;AAAA,EAC3D,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAK,CAAA,CAAE,QAAA,EAAS;AAAA,EACvE,cAAA,EAAgBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACpC,aAAA,EAAeA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACnC,QAAA,EAAUA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC/B,SAAA,EAAW,cAAA;AAAA,EACX,OAAA,EAAS,eAAe,QAAA,EAAS;AAAA,EACjC,MAAA,EAAQA,MAAE,KAAA,CAAM,eAAe,EAAE,GAAA,CAAI,EAAE,EAAE,QAAA,EAAS;AAAA,EAClD,MAAA,EAAQ,iBAAiB,QAAA,EAAS;AAAA,EAClC,SAAA,EAAW;AACb,CAAC;ACbM,IAAM,0BAAA,GAA6BA,MAAE,MAAA,CAAO;AAAA,EACjD,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,IAAI,GAAI,CAAA;AAAA,EAC1D,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAK,CAAA,CAAE,QAAA,EAAS;AAAA,EACvE,GAAA,EAAK,UAAU,QAAA,EAAS;AAAA,EACxB,QAAA,EAAU,gBAAgB,QAAA,EAAS;AAAA,EACnC,SAAA,EAAW,eAAe,QAAA,EAAS;AAAA,EACnC,OAAA,EAAS,eAAe,QAAA,EAAS;AAAA,EACjC,MAAA,EAAQ,iBAAiB,QAAA,EAAS;AAAA,EAClC,SAAA,EAAW;AACb,CAAC;ACfM,IAAM,uBAAA,GAA0BA,MAAE,MAAA,CAAO;AAAA,EAC9C,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,IAAI,GAAI,CAAA;AAAA,EAC1D,GAAA,EAAK,UAAU,QAAA;AACjB,CAAC;AAKM,IAAM,8BAAA,GAAiCA,MAAE,MAAA,CAAO;AAAA,EACrD,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,IAAI,GAAI,CAAA;AAAA,EAC3D,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,GAAI,CAAA,CAAE,QAAA,EAAS;AAAA,EACnE,GAAA,EAAK,UAAU,QAAA,EAAS;AAAA,EACxB,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAK,CAAA,CAAE,QAAA,EAAS;AAAA,EACvE,OAAA,EAASA,MAAE,KAAA,CAAM,uBAAuB,EAAE,GAAA,CAAI,EAAE,EAAE,QAAA,EAAS;AAAA,EAC3D,WAAA,EAAa,eAAe,QAAA,EAAS;AAAA,EACrC,SAAA,EAAW;AACb,CAAC;ACVM,IAAM,uBAAA,GAA0BA,MAAE,MAAA,CAAO;AAAA,EAC9C,QAAA,EAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA,CAAE,QAAA,EAAS;AAAA,EAClE,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAK,CAAA,CAAE,QAAA,EAAS;AAAA,EACjE,QAAA,EAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,GAAI,CAAA,CAAE,QAAA,EAAS;AAAA,EAClE,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,EAAE,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA,EAAS;AAAA,EACjE,UAAA,EAAYA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,EAAE,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA,EAAS;AAAA,EAClE,QAAA,EAAUA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC/B,MAAA,EAAQA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,QAAA,EAAS;AAAA,EAC7C,kBAAA,EAAoBA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACxD,KAAA,EAAOA,MAAE,KAAA,CAAM,iBAAiB,EAAE,GAAA,CAAI,CAAC,EAAE,QAAA,EAAS;AAAA,EAClD,MAAA,EAAQ,iBAAiB,QAAA,EAAS;AAAA,EAClC,YAAA,EAAcA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EACnC,SAAA,EAAW;AACb,CAAC;ACdM,IAAM,wBAAA,GAA2BA,MAAE,MAAA,CAAO;AAAA,EAC/C,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,MAAA,CAAO,YAAA,CAAa,EAAE,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA,EACxD,QAAA,EAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,SAAA,EAAW;AACb,CAAC;ACTM,IAAM,+BAAA,GAAkCA,MAAE,MAAA,CAAO;AAAA,EACtD,YAAA,EAAcA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,IAAI,GAAI,CAAA;AAAA,EAClE,eAAA,EAAiB,UAAU,QAAA,EAAS;AAAA,EACpC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,GAAI,CAAA,CAAE,QAAA,EAAS;AAAA,EAC9D,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,GAAI,CAAA,CAAE,QAAA,EAAS;AAAA,EAC/D,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,CAAO,YAAA,CAAa,GAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAK,CAAA,CAAE,QAAA,EAAS;AAAA,EACvE,SAAA,EAAW,eAAe,QAAA,EAAS;AAAA,EACnC,OAAA,EAAS,eAAe,QAAA,EAAS;AAAA,EACjC,SAAA,EAAW;AACb,CAAC;;;ACJM,IAAM,gBAAA,GAA2B","file":"index.cjs","sourcesContent":["export type ContinentCode = 'AF' | 'AN' | 'AS' | 'EU' | 'NA' | 'OC' | 'SA';\n\nexport const CONTINENTS: ReadonlyArray<{ code: ContinentCode; name: string }> = [\n { code: 'AF', name: 'Africa' },\n { code: 'AN', name: 'Antarctica' },\n { code: 'AS', name: 'Asia' },\n { code: 'EU', name: 'Europe' },\n { code: 'NA', name: 'North America' },\n { code: 'OC', name: 'Oceania' },\n { code: 'SA', name: 'South America' },\n];\n\nconst COUNTRY_TO_CONTINENT: Record<string, ContinentCode> = {\n AD: 'EU',\n AE: 'AS',\n AF: 'AS',\n AG: 'NA',\n AL: 'EU',\n AM: 'AS',\n AO: 'AF',\n AR: 'SA',\n AT: 'EU',\n AU: 'OC',\n AZ: 'AS',\n BA: 'EU',\n BB: 'NA',\n BD: 'AS',\n BE: 'EU',\n BF: 'AF',\n BG: 'EU',\n BH: 'AS',\n BI: 'AF',\n BJ: 'AF',\n BN: 'AS',\n BO: 'SA',\n BR: 'SA',\n BS: 'NA',\n BT: 'AS',\n BW: 'AF',\n BY: 'EU',\n BZ: 'NA',\n CA: 'NA',\n CD: 'AF',\n CF: 'AF',\n CG: 'AF',\n CH: 'EU',\n CI: 'AF',\n CL: 'SA',\n CM: 'AF',\n CN: 'AS',\n CO: 'SA',\n CR: 'NA',\n CU: 'NA',\n CV: 'AF',\n CY: 'AS',\n CZ: 'EU',\n DE: 'EU',\n DJ: 'AF',\n DK: 'EU',\n DM: 'NA',\n DO: 'NA',\n DZ: 'AF',\n EC: 'SA',\n EE: 'EU',\n EG: 'AF',\n ER: 'AF',\n ES: 'EU',\n ET: 'AF',\n FI: 'EU',\n FJ: 'OC',\n FR: 'EU',\n GA: 'AF',\n GB: 'EU',\n GD: 'NA',\n GE: 'AS',\n GH: 'AF',\n GM: 'AF',\n GN: 'AF',\n GQ: 'AF',\n GR: 'EU',\n GT: 'NA',\n GW: 'AF',\n GY: 'SA',\n HK: 'AS',\n HN: 'NA',\n HR: 'EU',\n HT: 'NA',\n HU: 'EU',\n ID: 'AS',\n IE: 'EU',\n IL: 'AS',\n IN: 'AS',\n IQ: 'AS',\n IR: 'AS',\n IS: 'EU',\n IT: 'EU',\n JM: 'NA',\n JO: 'AS',\n JP: 'AS',\n KE: 'AF',\n KG: 'AS',\n KH: 'AS',\n KM: 'AF',\n KN: 'NA',\n KP: 'AS',\n KR: 'AS',\n KW: 'AS',\n KZ: 'AS',\n LA: 'AS',\n LB: 'AS',\n LC: 'NA',\n LI: 'EU',\n LK: 'AS',\n LR: 'AF',\n LS: 'AF',\n LT: 'EU',\n LU: 'EU',\n LV: 'EU',\n LY: 'AF',\n MA: 'AF',\n MC: 'EU',\n MD: 'EU',\n ME: 'EU',\n MG: 'AF',\n MK: 'EU',\n ML: 'AF',\n MM: 'AS',\n MN: 'AS',\n MO: 'AS',\n MR: 'AF',\n MT: 'EU',\n MU: 'AF',\n MV: 'AS',\n MW: 'AF',\n MX: 'NA',\n MY: 'AS',\n MZ: 'AF',\n NA: 'AF',\n NE: 'AF',\n NG: 'AF',\n NI: 'NA',\n NL: 'EU',\n NO: 'EU',\n NP: 'AS',\n NZ: 'OC',\n OM: 'AS',\n PA: 'NA',\n PE: 'SA',\n PG: 'OC',\n PH: 'AS',\n PK: 'AS',\n PL: 'EU',\n PR: 'NA',\n PS: 'AS',\n PT: 'EU',\n PY: 'SA',\n QA: 'AS',\n RO: 'EU',\n RS: 'EU',\n RU: 'EU',\n RW: 'AF',\n SA: 'AS',\n SB: 'OC',\n SC: 'AF',\n SD: 'AF',\n SE: 'EU',\n SG: 'AS',\n SI: 'EU',\n SK: 'EU',\n SL: 'AF',\n SM: 'EU',\n SN: 'AF',\n SO: 'AF',\n SR: 'SA',\n SS: 'AF',\n ST: 'AF',\n SV: 'NA',\n SY: 'AS',\n SZ: 'AF',\n TD: 'AF',\n TG: 'AF',\n TH: 'AS',\n TJ: 'AS',\n TL: 'AS',\n TM: 'AS',\n TN: 'AF',\n TO: 'OC',\n TR: 'AS',\n TT: 'NA',\n TW: 'AS',\n TZ: 'AF',\n UA: 'EU',\n UG: 'AF',\n US: 'NA',\n UY: 'SA',\n UZ: 'AS',\n VA: 'EU',\n VC: 'NA',\n VE: 'SA',\n VN: 'AS',\n VU: 'OC',\n WS: 'OC',\n XK: 'EU',\n YE: 'AS',\n ZA: 'AF',\n ZM: 'AF',\n ZW: 'AF',\n};\n\nexport function getContinent(countryCode: string): ContinentCode | null {\n if (!countryCode) return null;\n return COUNTRY_TO_CONTINENT[countryCode.toUpperCase()] ?? null;\n}\n","/** ISO 3166-1 country list for local fallback when GeoNames is unavailable. */\nexport const COUNTRIES: ReadonlyArray<{ code: string; name: string }> = [\n { code: 'AF', name: 'Afghanistan' },\n { code: 'AL', name: 'Albania' },\n { code: 'DZ', name: 'Algeria' },\n { code: 'AD', name: 'Andorra' },\n { code: 'AO', name: 'Angola' },\n { code: 'AG', name: 'Antigua and Barbuda' },\n { code: 'AR', name: 'Argentina' },\n { code: 'AM', name: 'Armenia' },\n { code: 'AU', name: 'Australia' },\n { code: 'AT', name: 'Austria' },\n { code: 'AZ', name: 'Azerbaijan' },\n { code: 'BS', name: 'Bahamas' },\n { code: 'BH', name: 'Bahrain' },\n { code: 'BD', name: 'Bangladesh' },\n { code: 'BB', name: 'Barbados' },\n { code: 'BY', name: 'Belarus' },\n { code: 'BE', name: 'Belgium' },\n { code: 'BZ', name: 'Belize' },\n { code: 'BJ', name: 'Benin' },\n { code: 'BT', name: 'Bhutan' },\n { code: 'BO', name: 'Bolivia' },\n { code: 'BA', name: 'Bosnia and Herzegovina' },\n { code: 'BW', name: 'Botswana' },\n { code: 'BR', name: 'Brazil' },\n { code: 'BN', name: 'Brunei' },\n { code: 'BG', name: 'Bulgaria' },\n { code: 'BF', name: 'Burkina Faso' },\n { code: 'BI', name: 'Burundi' },\n { code: 'CV', name: 'Cabo Verde' },\n { code: 'KH', name: 'Cambodia' },\n { code: 'CM', name: 'Cameroon' },\n { code: 'CA', name: 'Canada' },\n { code: 'CF', name: 'Central African Republic' },\n { code: 'TD', name: 'Chad' },\n { code: 'CL', name: 'Chile' },\n { code: 'CN', name: 'China' },\n { code: 'CO', name: 'Colombia' },\n { code: 'KM', name: 'Comoros' },\n { code: 'CG', name: 'Congo' },\n { code: 'CD', name: 'Congo (DRC)' },\n { code: 'CR', name: 'Costa Rica' },\n { code: 'CI', name: \"Cote d'Ivoire\" },\n { code: 'HR', name: 'Croatia' },\n { code: 'CU', name: 'Cuba' },\n { code: 'CY', name: 'Cyprus' },\n { code: 'CZ', name: 'Czechia' },\n { code: 'DK', name: 'Denmark' },\n { code: 'DJ', name: 'Djibouti' },\n { code: 'DM', name: 'Dominica' },\n { code: 'DO', name: 'Dominican Republic' },\n { code: 'EC', name: 'Ecuador' },\n { code: 'EG', name: 'Egypt' },\n { code: 'SV', name: 'El Salvador' },\n { code: 'GQ', name: 'Equatorial Guinea' },\n { code: 'ER', name: 'Eritrea' },\n { code: 'EE', name: 'Estonia' },\n { code: 'SZ', name: 'Eswatini' },\n { code: 'ET', name: 'Ethiopia' },\n { code: 'FJ', name: 'Fiji' },\n { code: 'FI', name: 'Finland' },\n { code: 'FR', name: 'France' },\n { code: 'GA', name: 'Gabon' },\n { code: 'GM', name: 'Gambia' },\n { code: 'GE', name: 'Georgia' },\n { code: 'DE', name: 'Germany' },\n { code: 'GH', name: 'Ghana' },\n { code: 'GR', name: 'Greece' },\n { code: 'GD', name: 'Grenada' },\n { code: 'GT', name: 'Guatemala' },\n { code: 'GN', name: 'Guinea' },\n { code: 'GW', name: 'Guinea-Bissau' },\n { code: 'GY', name: 'Guyana' },\n { code: 'HT', name: 'Haiti' },\n { code: 'HN', name: 'Honduras' },\n { code: 'HU', name: 'Hungary' },\n { code: 'IS', name: 'Iceland' },\n { code: 'IN', name: 'India' },\n { code: 'ID', name: 'Indonesia' },\n { code: 'IR', name: 'Iran' },\n { code: 'IQ', name: 'Iraq' },\n { code: 'IE', name: 'Ireland' },\n { code: 'IL', name: 'Israel' },\n { code: 'IT', name: 'Italy' },\n { code: 'JM', name: 'Jamaica' },\n { code: 'JP', name: 'Japan' },\n { code: 'JO', name: 'Jordan' },\n { code: 'KZ', name: 'Kazakhstan' },\n { code: 'KE', name: 'Kenya' },\n { code: 'KI', name: 'Kiribati' },\n { code: 'KP', name: 'North Korea' },\n { code: 'KR', name: 'South Korea' },\n { code: 'KW', name: 'Kuwait' },\n { code: 'KG', name: 'Kyrgyzstan' },\n { code: 'LA', name: 'Laos' },\n { code: 'LV', name: 'Latvia' },\n { code: 'LB', name: 'Lebanon' },\n { code: 'LS', name: 'Lesotho' },\n { code: 'LR', name: 'Liberia' },\n { code: 'LY', name: 'Libya' },\n { code: 'LI', name: 'Liechtenstein' },\n { code: 'LT', name: 'Lithuania' },\n { code: 'LU', name: 'Luxembourg' },\n { code: 'MG', name: 'Madagascar' },\n { code: 'MW', name: 'Malawi' },\n { code: 'MY', name: 'Malaysia' },\n { code: 'MV', name: 'Maldives' },\n { code: 'ML', name: 'Mali' },\n { code: 'MT', name: 'Malta' },\n { code: 'MH', name: 'Marshall Islands' },\n { code: 'MR', name: 'Mauritania' },\n { code: 'MU', name: 'Mauritius' },\n { code: 'MX', name: 'Mexico' },\n { code: 'FM', name: 'Micronesia' },\n { code: 'MD', name: 'Moldova' },\n { code: 'MC', name: 'Monaco' },\n { code: 'MN', name: 'Mongolia' },\n { code: 'ME', name: 'Montenegro' },\n { code: 'MA', name: 'Morocco' },\n { code: 'MZ', name: 'Mozambique' },\n { code: 'MM', name: 'Myanmar' },\n { code: 'NA', name: 'Namibia' },\n { code: 'NR', name: 'Nauru' },\n { code: 'NP', name: 'Nepal' },\n { code: 'NL', name: 'Netherlands' },\n { code: 'NZ', name: 'New Zealand' },\n { code: 'NI', name: 'Nicaragua' },\n { code: 'NE', name: 'Niger' },\n { code: 'NG', name: 'Nigeria' },\n { code: 'MK', name: 'North Macedonia' },\n { code: 'NO', name: 'Norway' },\n { code: 'OM', name: 'Oman' },\n { code: 'PK', name: 'Pakistan' },\n { code: 'PW', name: 'Palau' },\n { code: 'PS', name: 'Palestine' },\n { code: 'PA', name: 'Panama' },\n { code: 'PG', name: 'Papua New Guinea' },\n { code: 'PY', name: 'Paraguay' },\n { code: 'PE', name: 'Peru' },\n { code: 'PH', name: 'Philippines' },\n { code: 'PL', name: 'Poland' },\n { code: 'PT', name: 'Portugal' },\n { code: 'QA', name: 'Qatar' },\n { code: 'RO', name: 'Romania' },\n { code: 'RU', name: 'Russia' },\n { code: 'RW', name: 'Rwanda' },\n { code: 'KN', name: 'Saint Kitts and Nevis' },\n { code: 'LC', name: 'Saint Lucia' },\n { code: 'VC', name: 'Saint Vincent and the Grenadines' },\n { code: 'WS', name: 'Samoa' },\n { code: 'SM', name: 'San Marino' },\n { code: 'ST', name: 'Sao Tome and Principe' },\n { code: 'SA', name: 'Saudi Arabia' },\n { code: 'SN', name: 'Senegal' },\n { code: 'RS', name: 'Serbia' },\n { code: 'SC', name: 'Seychelles' },\n { code: 'SL', name: 'Sierra Leone' },\n { code: 'SG', name: 'Singapore' },\n { code: 'SK', name: 'Slovakia' },\n { code: 'SI', name: 'Slovenia' },\n { code: 'SB', name: 'Solomon Islands' },\n { code: 'SO', name: 'Somalia' },\n { code: 'ZA', name: 'South Africa' },\n { code: 'SS', name: 'South Sudan' },\n { code: 'ES', name: 'Spain' },\n { code: 'LK', name: 'Sri Lanka' },\n { code: 'SD', name: 'Sudan' },\n { code: 'SR', name: 'Suriname' },\n { code: 'SE', name: 'Sweden' },\n { code: 'CH', name: 'Switzerland' },\n { code: 'SY', name: 'Syria' },\n { code: 'TW', name: 'Taiwan' },\n { code: 'TJ', name: 'Tajikistan' },\n { code: 'TZ', name: 'Tanzania' },\n { code: 'TH', name: 'Thailand' },\n { code: 'TL', name: 'Timor-Leste' },\n { code: 'TG', name: 'Togo' },\n { code: 'TO', name: 'Tonga' },\n { code: 'TT', name: 'Trinidad and Tobago' },\n { code: 'TN', name: 'Tunisia' },\n { code: 'TR', name: 'Turkey' },\n { code: 'TM', name: 'Turkmenistan' },\n { code: 'TV', name: 'Tuvalu' },\n { code: 'UG', name: 'Uganda' },\n { code: 'UA', name: 'Ukraine' },\n { code: 'AE', name: 'United Arab Emirates' },\n { code: 'GB', name: 'United Kingdom' },\n { code: 'US', name: 'United States' },\n { code: 'UY', name: 'Uruguay' },\n { code: 'UZ', name: 'Uzbekistan' },\n { code: 'VU', name: 'Vanuatu' },\n { code: 'VA', name: 'Vatican City' },\n { code: 'VE', name: 'Venezuela' },\n { code: 'VN', name: 'Vietnam' },\n { code: 'YE', name: 'Yemen' },\n { code: 'ZM', name: 'Zambia' },\n { code: 'ZW', name: 'Zimbabwe' },\n] as const;\n","/**\n * Employment-type taxonomy. Mirrors `id.sifa.defs#employmentType.knownValues`\n * from sifa-lexicons. Surfaces both a flat NSID→label map (for read-only\n * display) and a grouped structure (for editor dropdowns).\n */\n\nexport interface EmploymentTypeOption {\n value: string;\n label: string;\n}\n\nexport interface EmploymentTypeGroup {\n label: string;\n items: EmploymentTypeOption[];\n}\n\nexport const EMPLOYMENT_TYPE_GROUPS: EmploymentTypeGroup[] = [\n {\n label: 'Employee',\n items: [\n { value: 'id.sifa.defs#fullTime', label: 'Full-time' },\n { value: 'id.sifa.defs#partTime', label: 'Part-time' },\n { value: 'id.sifa.defs#temporary', label: 'Temporary' },\n { value: 'id.sifa.defs#seasonal', label: 'Seasonal' },\n ],\n },\n {\n label: 'Independent',\n items: [\n { value: 'id.sifa.defs#contract', label: 'Contract' },\n { value: 'id.sifa.defs#freelance', label: 'Freelance' },\n { value: 'id.sifa.defs#selfEmployed', label: 'Self-employed' },\n { value: 'id.sifa.defs#independentWork', label: 'Independent work' },\n ],\n },\n {\n label: 'Training & early-career',\n items: [\n { value: 'id.sifa.defs#internship', label: 'Internship' },\n { value: 'id.sifa.defs#apprenticeship', label: 'Apprenticeship' },\n { value: 'id.sifa.defs#fellowship', label: 'Fellowship' },\n { value: 'id.sifa.defs#trainee', label: 'Trainee' },\n ],\n },\n {\n label: 'Other',\n items: [{ value: 'id.sifa.defs#volunteer', label: 'Volunteer' }],\n },\n];\n\nexport const EMPLOYMENT_TYPE_LABELS: Record<string, string> = Object.fromEntries(\n EMPLOYMENT_TYPE_GROUPS.flatMap((g) => g.items).map((o) => [o.value, o.label]),\n);\n\n/** Resolve a label for an employment-type token. Falls back to the raw value. */\nexport function getEmploymentTypeLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return EMPLOYMENT_TYPE_LABELS[value] ?? value;\n}\n","/** Two-level industry/domain taxonomy for profile classification. */\n\nexport interface IndustryOption {\n value: string;\n labelKey: string;\n domains: { value: string; labelKey: string }[];\n}\n\nexport const INDUSTRY_OPTIONS: IndustryOption[] = [\n {\n value: 'id.sifa.defs#industryTechnology',\n labelKey: 'industryTechnology',\n domains: [\n { value: 'id.sifa.defs#domainSoftwareEngineering', labelKey: 'domainSoftwareEngineering' },\n { value: 'id.sifa.defs#domainDataScience', labelKey: 'domainDataScience' },\n { value: 'id.sifa.defs#domainCybersecurity', labelKey: 'domainCybersecurity' },\n { value: 'id.sifa.defs#domainDevops', labelKey: 'domainDevops' },\n { value: 'id.sifa.defs#domainProductDesign', labelKey: 'domainProductDesign' },\n { value: 'id.sifa.defs#domainGameDev', labelKey: 'domainGameDev' },\n ],\n },\n {\n value: 'id.sifa.defs#industryFinance',\n labelKey: 'industryFinance',\n domains: [\n { value: 'id.sifa.defs#domainBanking', labelKey: 'domainBanking' },\n { value: 'id.sifa.defs#domainFintech', labelKey: 'domainFintech' },\n { value: 'id.sifa.defs#domainInsurance', labelKey: 'domainInsurance' },\n { value: 'id.sifa.defs#domainInvestmentMgmt', labelKey: 'domainInvestmentMgmt' },\n ],\n },\n {\n value: 'id.sifa.defs#industryHealthcare',\n labelKey: 'industryHealthcare',\n domains: [\n { value: 'id.sifa.defs#domainClinicalResearch', labelKey: 'domainClinicalResearch' },\n { value: 'id.sifa.defs#domainHealthtech', labelKey: 'domainHealthtech' },\n { value: 'id.sifa.defs#domainPharma', labelKey: 'domainPharma' },\n ],\n },\n {\n value: 'id.sifa.defs#industryEducation',\n labelKey: 'industryEducation',\n domains: [\n { value: 'id.sifa.defs#domainHigherEd', labelKey: 'domainHigherEd' },\n { value: 'id.sifa.defs#domainEdtech', labelKey: 'domainEdtech' },\n { value: 'id.sifa.defs#domainPrimarySecondary', labelKey: 'domainPrimarySecondary' },\n ],\n },\n {\n value: 'id.sifa.defs#industryMedia',\n labelKey: 'industryMedia',\n domains: [\n { value: 'id.sifa.defs#domainJournalism', labelKey: 'domainJournalism' },\n { value: 'id.sifa.defs#domainFilmVideo', labelKey: 'domainFilmVideo' },\n { value: 'id.sifa.defs#domainGaming', labelKey: 'domainGaming' },\n { value: 'id.sifa.defs#domainAdvertising', labelKey: 'domainAdvertising' },\n ],\n },\n {\n value: 'id.sifa.defs#industryRetail',\n labelKey: 'industryRetail',\n domains: [\n { value: 'id.sifa.defs#domainEcommerce', labelKey: 'domainEcommerce' },\n { value: 'id.sifa.defs#domainSupplyChain', labelKey: 'domainSupplyChain' },\n ],\n },\n {\n value: 'id.sifa.defs#industryManufacturing',\n labelKey: 'industryManufacturing',\n domains: [\n { value: 'id.sifa.defs#domainAutomotive', labelKey: 'domainAutomotive' },\n { value: 'id.sifa.defs#domainAerospace', labelKey: 'domainAerospace' },\n { value: 'id.sifa.defs#domainHardware', labelKey: 'domainHardware' },\n ],\n },\n {\n value: 'id.sifa.defs#industryEnergy',\n labelKey: 'industryEnergy',\n domains: [\n { value: 'id.sifa.defs#domainRenewables', labelKey: 'domainRenewables' },\n { value: 'id.sifa.defs#domainOilGas', labelKey: 'domainOilGas' },\n { value: 'id.sifa.defs#domainClimateTech', labelKey: 'domainClimateTech' },\n ],\n },\n {\n value: 'id.sifa.defs#industryGovernment',\n labelKey: 'industryGovernment',\n domains: [\n { value: 'id.sifa.defs#domainPublicPolicy', labelKey: 'domainPublicPolicy' },\n { value: 'id.sifa.defs#domainDefense', labelKey: 'domainDefense' },\n ],\n },\n {\n value: 'id.sifa.defs#industryLegal',\n labelKey: 'industryLegal',\n domains: [\n { value: 'id.sifa.defs#domainIpLaw', labelKey: 'domainIpLaw' },\n { value: 'id.sifa.defs#domainCompliance', labelKey: 'domainCompliance' },\n ],\n },\n {\n value: 'id.sifa.defs#industryConsulting',\n labelKey: 'industryConsulting',\n domains: [\n { value: 'id.sifa.defs#domainManagementConsulting', labelKey: 'domainManagementConsulting' },\n { value: 'id.sifa.defs#domainDevrel', labelKey: 'domainDevrel' },\n { value: 'id.sifa.defs#domainHrRecruitment', labelKey: 'domainHrRecruitment' },\n ],\n },\n {\n value: 'id.sifa.defs#industryNonprofit',\n labelKey: 'industryNonprofit',\n domains: [\n { value: 'id.sifa.defs#domainHumanRights', labelKey: 'domainHumanRights' },\n { value: 'id.sifa.defs#domainOpenSource', labelKey: 'domainOpenSource' },\n ],\n },\n {\n value: 'id.sifa.defs#industryRealEstate',\n labelKey: 'industryRealEstate',\n domains: [{ value: 'id.sifa.defs#domainProptech', labelKey: 'domainProptech' }],\n },\n {\n value: 'id.sifa.defs#industryTransport',\n labelKey: 'industryTransport',\n domains: [\n { value: 'id.sifa.defs#domainAutonomousVehicles', labelKey: 'domainAutonomousVehicles' },\n { value: 'id.sifa.defs#domainLogistics', labelKey: 'domainLogistics' },\n ],\n },\n {\n value: 'id.sifa.defs#industryAgriculture',\n labelKey: 'industryAgriculture',\n domains: [\n { value: 'id.sifa.defs#domainAgritech', labelKey: 'domainAgritech' },\n { value: 'id.sifa.defs#domainFoodTech', labelKey: 'domainFoodTech' },\n ],\n },\n {\n value: 'id.sifa.defs#industryHospitality',\n labelKey: 'industryHospitality',\n domains: [\n { value: 'id.sifa.defs#domainHotels', labelKey: 'domainHotels' },\n { value: 'id.sifa.defs#domainTravelTourism', labelKey: 'domainTravelTourism' },\n { value: 'id.sifa.defs#domainFoodBeverage', labelKey: 'domainFoodBeverage' },\n ],\n },\n {\n value: 'id.sifa.defs#industryTelecom',\n labelKey: 'industryTelecom',\n domains: [\n { value: 'id.sifa.defs#domainNetworkInfra', labelKey: 'domainNetworkInfra' },\n { value: 'id.sifa.defs#domainMobileServices', labelKey: 'domainMobileServices' },\n ],\n },\n {\n value: 'id.sifa.defs#industryMining',\n labelKey: 'industryMining',\n domains: [\n { value: 'id.sifa.defs#domainExtraction', labelKey: 'domainExtraction' },\n { value: 'id.sifa.defs#domainGeological', labelKey: 'domainGeological' },\n ],\n },\n {\n value: 'id.sifa.defs#industryFashion',\n labelKey: 'industryFashion',\n domains: [\n { value: 'id.sifa.defs#domainFashionDesign', labelKey: 'domainFashionDesign' },\n { value: 'id.sifa.defs#domainTextileManufacturing', labelKey: 'domainTextileManufacturing' },\n ],\n },\n {\n value: 'id.sifa.defs#industryMaritime',\n labelKey: 'industryMaritime',\n domains: [\n { value: 'id.sifa.defs#domainShipping', labelKey: 'domainShipping' },\n { value: 'id.sifa.defs#domainPortOperations', labelKey: 'domainPortOperations' },\n { value: 'id.sifa.defs#domainNavalArchitecture', labelKey: 'domainNavalArchitecture' },\n ],\n },\n {\n value: 'id.sifa.defs#industryOther',\n labelKey: 'industryOther',\n domains: [],\n },\n];\n\n/** Find the industry option for a given industry value. */\nexport function findIndustry(value: string | undefined | null): IndustryOption | undefined {\n if (!value) return undefined;\n return INDUSTRY_OPTIONS.find((i) => i.value === value);\n}\n\n/** Get the label key for an industry or domain token, falling back to the raw value. */\nexport function getIndustryLabelKey(value: string): string {\n for (const industry of INDUSTRY_OPTIONS) {\n if (industry.value === value) return industry.labelKey;\n for (const domain of industry.domains) {\n if (domain.value === value) return domain.labelKey;\n }\n }\n return value;\n}\n","/**\n * \"Open to\" taxonomy. Mirrors `id.sifa.defs#openToWorkStatus.knownValues` from\n * sifa-lexicons. Surfaces a single source of truth for the editor (where the\n * user picks values) and the IdentityCard (where badges are rendered).\n *\n * Shape matches `INDUSTRY_OPTIONS`: `{ value, labelKey }` so consumers can run\n * `labelKey` through their own i18n layer (e.g. next-intl `useTranslations`).\n */\n\nexport type OpenToGroup = 'work' | 'mentorship' | 'peer';\n\nexport interface OpenToOption {\n value: string;\n labelKey: string;\n token: string;\n group: OpenToGroup;\n}\n\nexport const OPEN_TO_OPTIONS: OpenToOption[] = [\n {\n value: 'id.sifa.defs#fullTimeRoles',\n labelKey: 'fullTimeRoles',\n token: 'fullTime',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#partTimeRoles',\n labelKey: 'partTimeRoles',\n token: 'partTime',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#contractRoles',\n labelKey: 'contractRoles',\n token: 'contract',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#commissions',\n labelKey: 'commissions',\n token: 'commissions',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#boardPositions',\n labelKey: 'boardPositions',\n token: 'board',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#mentoringOthers',\n labelKey: 'mentoringOthers',\n token: 'mentor',\n group: 'mentorship',\n },\n {\n value: 'id.sifa.defs#beingMentored',\n labelKey: 'beingMentored',\n token: 'mentee',\n group: 'mentorship',\n },\n {\n value: 'id.sifa.defs#collaborations',\n labelKey: 'collaborations',\n token: 'collab',\n group: 'peer',\n },\n];\n\n/** Map short token (e.g. \"fullTime\") -> lex value (e.g. \"id.sifa.defs#fullTimeRoles\"). */\nexport const OPEN_TO_TOKEN_TO_VALUE: Record<string, string> = Object.fromEntries(\n OPEN_TO_OPTIONS.map((o) => [o.token, o.value]),\n);\n\n/** Map lex value -> short token. */\nexport const OPEN_TO_VALUE_TO_TOKEN: Record<string, string> = Object.fromEntries(\n OPEN_TO_OPTIONS.map((o) => [o.value, o.token]),\n);\n\n/** All valid tokens, useful for runtime validation. */\nexport const OPEN_TO_TOKENS: readonly string[] = OPEN_TO_OPTIONS.map((o) => o.token);\n\n/** Resolve a token to its lex value, returning `undefined` if unknown. */\nexport function openToTokenToValue(token: string | undefined | null): string | undefined {\n if (!token) return undefined;\n return OPEN_TO_TOKEN_TO_VALUE[token];\n}\n\n/** Resolve a lex value to its token, returning `undefined` if unknown. */\nexport function openToValueToToken(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return OPEN_TO_VALUE_TO_TOKEN[value];\n}\n\n/**\n * Legacy aliases — tokens the lexicon used to expose but doesn't anymore.\n * Records written before the lexicon migration may still carry them; resolve\n * them to the closest current `labelKey` for display.\n */\nconst OPEN_TO_LEGACY_ALIASES: Record<string, string> = {\n 'id.sifa.defs#mentoring': 'mentoringOthers',\n};\n\nconst OPEN_TO_LABEL_KEY_MAP: Record<string, string> = {\n ...Object.fromEntries(OPEN_TO_OPTIONS.map((o) => [o.value, o.labelKey])),\n ...OPEN_TO_LEGACY_ALIASES,\n};\n\n/**\n * Resolve a `labelKey` for an `openToWorkStatus` token. Returns `undefined`\n * for tokens not in the canonical set or the legacy alias map, so callers\n * can choose their own fallback (e.g. render the raw value).\n */\nexport function getOpenToLabelKey(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return OPEN_TO_LABEL_KEY_MAP[value];\n}\n","/**\n * Workplace-type taxonomy. Mirrors `id.sifa.defs#workplaceType.knownValues`\n * from sifa-lexicons. `remote` is retained for legacy records but the scoped\n * variants (`remoteLocal`, `remoteRegion`, `remoteGlobal`) are preferred for\n * new records per the lexicon description.\n */\n\nexport interface WorkplaceTypeOption {\n value: string;\n label: string;\n}\n\nexport const WORKPLACE_TYPE_OPTIONS: WorkplaceTypeOption[] = [\n { value: 'id.sifa.defs#onSite', label: 'On-site' },\n { value: 'id.sifa.defs#hybrid', label: 'Hybrid' },\n { value: 'id.sifa.defs#remoteLocal', label: 'Remote (same country)' },\n { value: 'id.sifa.defs#remoteRegion', label: 'Remote (same region)' },\n { value: 'id.sifa.defs#remoteGlobal', label: 'Remote (anywhere)' },\n];\n\nexport const WORKPLACE_TYPE_LABELS: Record<string, string> = {\n ...Object.fromEntries(WORKPLACE_TYPE_OPTIONS.map((o) => [o.value, o.label])),\n 'id.sifa.defs#remote': 'Remote',\n};\n\n/** Resolve a label for a workplace-type token. Falls back to the raw value. */\nexport function getWorkplaceTypeLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return WORKPLACE_TYPE_LABELS[value] ?? value;\n}\n","/**\n * Platform identifiers, labels, and URL helpers used in profile external accounts.\n *\n * This file is intentionally data-only -- icon mapping is platform-specific\n * (React DOM components on web, React Native components on mobile) and lives\n * in the consumer.\n */\n\nexport const PLATFORM_LABELS = {\n bluesky: 'Bluesky',\n github: 'GitHub',\n codeberg: 'Codeberg',\n gitlab: 'GitLab',\n forgejo: 'Forgejo',\n gitea: 'Gitea',\n linkedin: 'LinkedIn',\n youtube: 'YouTube',\n twitter: 'X (Twitter)',\n instagram: 'Instagram',\n substack: 'Substack',\n tangled: 'Tangled',\n dns: 'Domain',\n website: 'Website',\n rss: 'RSS',\n fediverse: 'Fediverse',\n orcid: 'ORCID',\n keyoxide: 'Keyoxide',\n} as const;\n\nexport type PlatformId = keyof typeof PLATFORM_LABELS;\n\nexport function isKnownPlatform(platform: string): platform is PlatformId {\n return platform in PLATFORM_LABELS;\n}\n\nexport function getPlatformLabel(platform: string): string {\n return isKnownPlatform(platform) ? PLATFORM_LABELS[platform] : PLATFORM_LABELS.website;\n}\n\n/** Platforms excluded from the \"Add Links\" dropdown (auto-derived or not accepted by API). */\nconst EXCLUDED_FROM_DROPDOWN = new Set<PlatformId>(['bluesky', 'dns', 'tangled']);\n\n/** Platforms available in the \"Add Links\" dropdown. */\nexport const PLATFORM_OPTIONS: ReadonlyArray<{ value: PlatformId; label: string }> = (\n Object.entries(PLATFORM_LABELS) as [PlatformId, string][]\n)\n .filter(([value]) => !EXCLUDED_FROM_DROPDOWN.has(value))\n .map(([value, label]) => ({ value, label }));\n\n/**\n * Build a favicon URL for a given site URL using Google's public favicon service.\n * Returns `null` if the URL cannot be parsed.\n */\nexport function getFaviconUrl(siteUrl: string): string | null {\n try {\n const { hostname } = new URL(siteUrl);\n return `https://www.google.com/s2/favicons?domain=${encodeURIComponent(hostname)}&sz=32`;\n } catch {\n return null;\n }\n}\n","export const SKILL_CATEGORIES = [\n { value: 'technical', label: 'Technical' },\n { value: 'business', label: 'Business' },\n { value: 'creative', label: 'Creative' },\n { value: 'interpersonal', label: 'Interpersonal' },\n { value: 'industry', label: 'Industry' },\n { value: 'community', label: 'Community' },\n { value: 'security', label: 'Security' },\n] as const;\n\nexport type SkillCategory = (typeof SKILL_CATEGORIES)[number]['value'];\n\nexport const CATEGORY_ORDER: ReadonlyArray<SkillCategory> = SKILL_CATEGORIES.map((c) => c.value);\n\nexport const CATEGORY_LABELS: Record<SkillCategory | 'other', string> = {\n ...(Object.fromEntries(SKILL_CATEGORIES.map((c) => [c.value, c.label])) as Record<\n SkillCategory,\n string\n >),\n other: 'Other',\n};\n","import type { ProfileSkill } from '../types/index.js';\n\nimport { CATEGORY_ORDER } from './skill-categories.js';\n\nexport type MergedProfileSkill = ProfileSkill & {\n mergedRkeys: string[];\n positionRkeys?: string[];\n};\n\n/**\n * Collapses skills that resolve to the same name (case-insensitive, trimmed).\n *\n * LinkedIn import creates one skill record per (skill, position) pair, so a\n * profile can have several \"Ruby\" rows. We surface them as a single chip with\n * all underlying rkeys exposed via `mergedRkeys` so edit/delete can fan out.\n */\nexport function dedupeSkills(skills: ProfileSkill[]): MergedProfileSkill[] {\n const groups = new Map<string, MergedProfileSkill>();\n\n for (const skill of skills) {\n const key = skill.name.trim().toLowerCase();\n const existing = groups.get(key);\n const positions = (skill as ProfileSkill & { positionRkeys?: string[] }).positionRkeys ?? [];\n\n if (!existing) {\n groups.set(key, {\n ...skill,\n mergedRkeys: [skill.rkey],\n positionRkeys: [...positions],\n });\n continue;\n }\n\n existing.mergedRkeys.push(skill.rkey);\n if (!existing.category && skill.category) existing.category = skill.category;\n if ((skill.endorsementCount ?? 0) > (existing.endorsementCount ?? 0)) {\n existing.endorsementCount = skill.endorsementCount;\n }\n if (skill.endorsed) existing.endorsed = true;\n if (skill.activityBacked) existing.activityBacked = true;\n const merged = new Set([...(existing.positionRkeys ?? []), ...positions]);\n existing.positionRkeys = Array.from(merged);\n }\n\n return Array.from(groups.values());\n}\n\n/**\n * Groups skills by category in CATEGORY_ORDER, with unknown/empty categories\n * collected under \"other\". Within each group: sorted by endorsementCount desc,\n * then alphabetical by name. Empty groups are omitted.\n */\nexport function groupSkillsByCategory<T extends ProfileSkill>(skills: T[]): [string, T[]][] {\n const grouped = new Map<string, T[]>();\n\n for (const skill of skills) {\n const normalised = skill.category?.toLowerCase().trim() ?? '';\n const key = (CATEGORY_ORDER as readonly string[]).includes(normalised) ? normalised : 'other';\n const bucket = grouped.get(key) ?? [];\n bucket.push(skill);\n grouped.set(key, bucket);\n }\n\n for (const [, groupSkills] of grouped) {\n groupSkills.sort((a, b) => {\n const countDiff = (b.endorsementCount ?? 0) - (a.endorsementCount ?? 0);\n if (countDiff !== 0) return countDiff;\n return a.name.localeCompare(b.name);\n });\n }\n\n const ordered: [string, T[]][] = [];\n for (const cat of CATEGORY_ORDER) {\n const group = grouped.get(cat);\n if (group?.length) ordered.push([cat, group]);\n }\n const otherGroup = grouped.get('other');\n if (otherGroup?.length) ordered.push(['other', otherGroup]);\n\n return ordered;\n}\n","/**\n * App-category taxonomy for AT Protocol apps tracked by Sifa.\n *\n * Categories group apps by what kind of activity they produce (Posts, Photos,\n * Code, ...). They drive the pill-size icon shown in `<AppPill>` and the\n * fallback glyph used in activity-card headers when no app-specific logo\n * exists.\n *\n * This file is intentionally data-only -- icon mapping is renderer-specific\n * (React DOM Phosphor components on web, React Native components on mobile)\n * and lives in the consumer. The `phosphorIcon` field is the Phosphor icon\n * NAME, not a component reference.\n *\n * Categories are an internal grouping; we do not surface this taxonomy in\n * public-facing copy.\n */\n\nexport const APP_CATEGORIES = {\n Articles: { phosphorIcon: 'Article' },\n Chat: { phosphorIcon: 'ChatsCircle' },\n Code: { phosphorIcon: 'Code' },\n Endorsements: { phosphorIcon: 'HandHeart' },\n Events: { phosphorIcon: 'CalendarBlank' },\n Links: { phosphorIcon: 'LinkSimple' },\n Lists: { phosphorIcon: 'ListBullets' },\n Music: { phosphorIcon: 'MusicNote' },\n Pages: { phosphorIcon: 'Browser' },\n Pastes: { phosphorIcon: 'Clipboard' },\n Photos: { phosphorIcon: 'Camera' },\n Places: { phosphorIcon: 'MapPin' },\n Posts: { phosphorIcon: 'ChatCircle' },\n 'Q&A': { phosphorIcon: 'Question' },\n Research: { phosphorIcon: 'Path' },\n Reviews: { phosphorIcon: 'Star' },\n Social: { phosphorIcon: 'UsersThree' },\n Verification: { phosphorIcon: 'Key' },\n Video: { phosphorIcon: 'VideoCamera' },\n} as const;\n\nexport type AppCategoryId = keyof typeof APP_CATEGORIES;\n\nexport const APP_CATEGORY_IDS = Object.keys(APP_CATEGORIES) as AppCategoryId[];\n\nexport function isAppCategory(value: string): value is AppCategoryId {\n return Object.prototype.hasOwnProperty.call(APP_CATEGORIES, value);\n}\n\nexport function getAppCategoryIcon(category: AppCategoryId): string {\n return APP_CATEGORIES[category].phosphorIcon;\n}\n","/**\n * Maps every AT Protocol app Sifa tracks to its `AppCategoryId`. Single source\n * of truth for what category an app belongs to; sifa-api and sifa-web both\n * import from here.\n *\n * Add a new app: pick the category whose generic glyph best represents the\n * activity. If no existing category fits, add a new one to APP_CATEGORIES\n * rather than introducing a per-app override.\n */\n\nimport type { AppCategoryId } from './app-categories.js';\n\nexport const APP_CATEGORY_MAP = {\n // Backend-scanned (sifa-api APP_REGISTRY)\n bluesky: 'Posts',\n tangled: 'Code',\n github: 'Code',\n smokesignal: 'Events',\n flashes: 'Photos',\n grain: 'Photos',\n whitewind: 'Articles',\n frontpage: 'Links',\n pastesphere: 'Pastes',\n standard: 'Articles',\n aetheros: 'Pages',\n roomy: 'Social',\n keytrace: 'Verification',\n popfeed: 'Reviews',\n streamplace: 'Video',\n semble: 'Research',\n youandme: 'Social',\n leaflet: 'Articles',\n colibri: 'Social',\n collectivesocial: 'Lists',\n bookhive: 'Reviews',\n beaconbits: 'Places',\n passports: 'Places',\n asq: 'Q&A',\n spark: 'Posts',\n nooki: 'Social',\n atstore: 'Reviews',\n plyr: 'Music',\n anisota: 'Posts',\n atfund: 'Endorsements',\n crate: 'Articles',\n\n // Web-only (rendered in pills/cards via sifa-web atproto-apps.ts;\n // no backend scan collection yet)\n linkat: 'Links',\n kipclip: 'Links',\n statusphere: 'Social',\n margin: 'Research',\n} as const satisfies Record<string, AppCategoryId>;\n\nexport type KnownAppId = keyof typeof APP_CATEGORY_MAP;\n\nexport function isKnownAppId(appId: string): appId is KnownAppId {\n return Object.prototype.hasOwnProperty.call(APP_CATEGORY_MAP, appId);\n}\n\nexport function categoryForApp(appId: string): AppCategoryId | undefined {\n return isKnownAppId(appId) ? APP_CATEGORY_MAP[appId] : undefined;\n}\n","{\n \"$schema\": \"https://sifa.id/schemas/activity-tiers/v1.json\",\n \"version\": \"1.0.0\",\n \"updated\": \"2026-05-28\",\n \"tiers\": {\n \"creation\": {\n \"label\": \"Made\",\n \"description\": \"Substantive records the actor authored: posts, articles, repos, galleries, livestreams, RSVPs, CV entries. Surfaced on the public profile and in the network timeline.\",\n \"shownOnPublicProfile\": true\n },\n \"action\": {\n \"label\": \"Did\",\n \"description\": \"Engagement records (likes, reposts, follows, votes, stars, reactions). Visible to the actor on the 'What is public about me' page and on the originating app, but not surfaced on the Sifa public profile.\",\n \"shownOnPublicProfile\": false\n },\n \"filtered\": {\n \"label\": null,\n \"description\": \"Configuration, infrastructure, moderation, game state, ephemeral consumption signals (bookmarks, highlights), and other records Sifa does not display anywhere. The records remain public on the actor's PDS regardless.\",\n \"shownOnPublicProfile\": false\n }\n },\n \"lexicons\": {\n \"app.bsky.feed.post\": {\n \"tier\": \"creation\",\n \"app\": \"bluesky\",\n \"notes\": \"Ambiguous: many posts are casual, but the lexicon also carries long-form posts and threads. Treated as creation; empty quote-posts (no text + record embed) are filtered at the consumer layer, not here.\"\n },\n \"app.bsky.feed.like\": { \"tier\": \"action\", \"app\": \"bluesky\" },\n \"app.bsky.feed.repost\": { \"tier\": \"action\", \"app\": \"bluesky\" },\n \"app.bsky.feed.generator\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"Feed generator definition record, not personal activity.\"\n },\n \"app.bsky.graph.follow\": { \"tier\": \"action\", \"app\": \"bluesky\" },\n \"app.bsky.graph.block\": { \"tier\": \"filtered\", \"app\": \"bluesky\", \"notes\": \"Moderation record.\" },\n \"app.bsky.graph.mute\": { \"tier\": \"filtered\", \"app\": \"bluesky\", \"notes\": \"Moderation record.\" },\n \"app.bsky.graph.listblock\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"Moderation record.\"\n },\n \"app.bsky.graph.listitem\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"List membership; rendered via the parent list, not as standalone activity.\"\n },\n \"app.bsky.graph.list\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"User-curated list metadata; not surfaced as profile activity.\"\n },\n \"app.bsky.graph.starterpack\": { \"tier\": \"filtered\", \"app\": \"bluesky\" },\n \"app.bsky.actor.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"Profile metadata record.\"\n },\n\n \"sh.tangled.repo\": { \"tier\": \"creation\", \"app\": \"tangled\" },\n \"sh.tangled.repo.issue\": { \"tier\": \"creation\", \"app\": \"tangled\" },\n \"sh.tangled.repo.pull\": { \"tier\": \"creation\", \"app\": \"tangled\" },\n \"sh.tangled.feed.star\": { \"tier\": \"action\", \"app\": \"tangled\" },\n \"sh.tangled.graph.follow\": { \"tier\": \"action\", \"app\": \"tangled\" },\n \"sh.tangled.actor.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"tangled\",\n \"notes\": \"Profile metadata record.\"\n },\n\n \"community.lexicon.calendar.rsvp\": {\n \"tier\": \"creation\",\n \"app\": \"smokesignal\",\n \"notes\": \"Ambiguous: RSVPs are reactions to events, but they are public commitments and the only Smoke Signal record Sifa scans today. Classified as creation.\"\n },\n \"events.smokesignal.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"smokesignal\",\n \"notes\": \"Profile metadata record.\"\n },\n\n \"blue.flashes.feed.post\": { \"tier\": \"creation\", \"app\": \"flashes\" },\n\n \"social.grain.gallery\": { \"tier\": \"creation\", \"app\": \"grain\" },\n \"social.grain.gallery.item\": {\n \"tier\": \"filtered\",\n \"app\": \"grain\",\n \"notes\": \"Item-within-gallery; rendered via parent gallery.\"\n },\n \"social.grain.photo\": {\n \"tier\": \"filtered\",\n \"app\": \"grain\",\n \"notes\": \"Raw photo asset; surfaced via the gallery that references it.\"\n },\n \"social.grain.photo.exif\": {\n \"tier\": \"filtered\",\n \"app\": \"grain\",\n \"notes\": \"EXIF metadata for a photo.\"\n },\n \"social.grain.story\": {\n \"tier\": \"filtered\",\n \"app\": \"grain\",\n \"notes\": \"Ephemeral story format.\"\n },\n\n \"com.whtwnd.blog.entry\": { \"tier\": \"creation\", \"app\": \"whitewind\" },\n\n \"fyi.unravel.frontpage.post\": { \"tier\": \"creation\", \"app\": \"frontpage\" },\n \"fyi.unravel.frontpage.vote\": { \"tier\": \"action\", \"app\": \"frontpage\" },\n\n \"social.psky.feed.post\": { \"tier\": \"creation\", \"app\": \"picosky\" },\n\n \"link.pastesphere.snippet\": { \"tier\": \"creation\", \"app\": \"pastesphere\" },\n\n \"site.standard.document\": { \"tier\": \"creation\", \"app\": \"standard\" },\n\n \"computer.aetheros.page\": { \"tier\": \"creation\", \"app\": \"aetheros\" },\n\n \"space.roomy.space.personal\": { \"tier\": \"creation\", \"app\": \"roomy\" },\n\n \"dev.keytrace.claim\": { \"tier\": \"creation\", \"app\": \"keytrace\" },\n\n \"social.popfeed.feed.review\": { \"tier\": \"creation\", \"app\": \"popfeed\" },\n \"social.popfeed.feed.post\": { \"tier\": \"creation\", \"app\": \"popfeed\" },\n \"social.popfeed.feed.note\": { \"tier\": \"creation\", \"app\": \"popfeed\" },\n \"social.popfeed.feed.like\": { \"tier\": \"action\", \"app\": \"popfeed\" },\n \"social.popfeed.challenge.participation\": {\n \"tier\": \"filtered\",\n \"app\": \"popfeed\",\n \"notes\": \"Challenge participation tracking.\"\n },\n \"social.popfeed.actor.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"popfeed\",\n \"notes\": \"Profile metadata record.\"\n },\n\n \"place.stream.livestream\": { \"tier\": \"creation\", \"app\": \"streamplace\" },\n \"place.stream.broadcast.origin\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Broadcast origin/infrastructure record.\"\n },\n \"place.stream.key\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Stream key — sensitive infrastructure record.\"\n },\n \"place.stream.metadata.configuration\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Stream configuration metadata.\"\n },\n \"place.stream.chat.message\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Ephemeral chat message.\"\n },\n \"place.stream.chat.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Chat profile metadata.\"\n },\n\n \"app.sidetrail.trail\": { \"tier\": \"creation\", \"app\": \"semble\" },\n \"app.sidetrail.walk\": { \"tier\": \"creation\", \"app\": \"semble\" },\n\n \"at.youandme.connection\": { \"tier\": \"creation\", \"app\": \"youandme\" },\n\n \"pub.leaflet.comment\": { \"tier\": \"creation\", \"app\": \"leaflet\" },\n \"pub.leaflet.interactions.recommend\": { \"tier\": \"action\", \"app\": \"leaflet\" },\n \"pub.leaflet.authFullPermissions\": {\n \"tier\": \"filtered\",\n \"app\": \"leaflet\",\n \"notes\": \"OAuth permission record.\"\n },\n\n \"social.colibri.membership\": { \"tier\": \"creation\", \"app\": \"colibri\" },\n \"social.colibri.message\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Chat message — high-volume conversational signal, not portfolio.\"\n },\n \"social.colibri.reaction\": { \"tier\": \"filtered\", \"app\": \"colibri\", \"notes\": \"Chat reaction.\" },\n \"social.colibri.channel\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Channel definition.\"\n },\n \"social.colibri.community\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Community definition.\"\n },\n \"social.colibri.approval\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Moderation approval record.\"\n },\n \"social.colibri.category\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Category metadata.\"\n },\n \"social.colibri.channel.read\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Read-state marker.\"\n },\n \"social.colibri.actor.data\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Actor metadata.\"\n },\n \"social.colibri.richtext.facet\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Richtext facet sub-record.\"\n },\n\n \"app.collectivesocial.feed.list\": {\n \"tier\": \"creation\",\n \"app\": \"collectivesocial\",\n \"notes\": \"Auto-created default Inbox lists are filtered at the consumer layer via isDefault=true predicate.\"\n },\n\n \"net.alternativeproto.vote\": {\n \"tier\": \"action\",\n \"notes\": \"Vote record on a third-party protocol.\"\n },\n \"network.cosmik.collection\": {\n \"tier\": \"filtered\",\n \"notes\": \"Stale registry id — Cosmik formerly in app registry.\"\n },\n \"network.cosmik.collectionLink\": { \"tier\": \"filtered\" },\n \"network.cosmik.connection\": { \"tier\": \"filtered\" },\n \"network.cosmik.follow\": { \"tier\": \"filtered\" },\n \"network.cosmik.card\": { \"tier\": \"filtered\", \"notes\": \"Link-in-bio card; consumption signal.\" },\n\n \"social.pinksky.app.preference\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"Pinkleap (Bluesky client) app preferences.\"\n },\n\n \"at.margin.bookmark\": {\n \"tier\": \"filtered\",\n \"notes\": \"Bookmark — consumption signal, not creation.\"\n },\n \"at.margin.highlight\": {\n \"tier\": \"filtered\",\n \"notes\": \"Highlight — consumption signal, not creation.\"\n },\n \"community.lexicon.bookmarks.bookmark\": {\n \"tier\": \"filtered\",\n \"notes\": \"Bookmark — consumption signal.\"\n },\n \"blue.linkat.board\": { \"tier\": \"filtered\", \"notes\": \"Link-in-bio board; consumption signal.\" },\n\n \"dev.skyboard.board\": { \"tier\": \"filtered\", \"notes\": \"Skyboard task-board metadata.\" },\n \"dev.skyboard.op\": { \"tier\": \"filtered\", \"notes\": \"Skyboard operation log.\" },\n \"dev.skyboard.task\": { \"tier\": \"filtered\", \"notes\": \"Skyboard task record.\" },\n\n \"net.anisota.player.state\": { \"tier\": \"filtered\", \"notes\": \"Anisota game player state.\" },\n \"xyz.statusphere.status\": {\n \"tier\": \"filtered\",\n \"notes\": \"Statusphere emoji status — leisure signal.\"\n },\n\n \"id.sifa.profile.self\": {\n \"tier\": \"creation\",\n \"app\": \"sifa\",\n \"notes\": \"Sifa professional profile root.\"\n },\n \"id.sifa.profile.position\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.education\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.skill\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.certification\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.project\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.volunteering\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.publication\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.course\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.honor\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.language\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.externalAccount\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.location\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.endorsement\": {\n \"tier\": \"creation\",\n \"app\": \"sifa\",\n \"notes\": \"Endorsement authored by the actor about another profile.\"\n },\n \"id.sifa.endorsement.confirmation\": {\n \"tier\": \"action\",\n \"app\": \"sifa\",\n \"notes\": \"Confirmation/acceptance of an endorsement received.\"\n },\n \"id.sifa.graph.follow\": { \"tier\": \"action\", \"app\": \"sifa\" },\n \"id.sifa.graph.connection\": {\n \"tier\": \"creation\",\n \"app\": \"sifa\",\n \"notes\": \"Mutual professional connection record.\"\n },\n \"id.sifa.project.self\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.project.member\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.project.membership\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.meeting\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.authProfile\": { \"tier\": \"filtered\", \"app\": \"sifa\", \"notes\": \"OAuth scope record.\" },\n \"id.sifa.authProfileAccess\": {\n \"tier\": \"filtered\",\n \"app\": \"sifa\",\n \"notes\": \"OAuth profile-access record.\"\n },\n \"id.sifa.authProject\": { \"tier\": \"filtered\", \"app\": \"sifa\", \"notes\": \"OAuth scope record.\" },\n \"id.sifa.authConnection\": { \"tier\": \"filtered\", \"app\": \"sifa\", \"notes\": \"OAuth scope record.\" },\n \"id.sifa.authMeet\": { \"tier\": \"filtered\", \"app\": \"sifa\", \"notes\": \"OAuth scope record.\" },\n\n \"forum.barazo.post\": { \"tier\": \"creation\", \"app\": \"barazo\" },\n \"forum.barazo.community.member\": { \"tier\": \"creation\", \"app\": \"barazo\" },\n \"forum.barazo.reputation.event\": { \"tier\": \"creation\", \"app\": \"barazo\" },\n \"forum.barazo.reaction\": { \"tier\": \"action\", \"app\": \"barazo\" },\n \"forum.barazo.reply\": {\n \"tier\": \"action\",\n \"app\": \"barazo\",\n \"notes\": \"Short conversational reply — engagement signal.\"\n },\n \"forum.barazo.flag\": { \"tier\": \"filtered\", \"app\": \"barazo\", \"notes\": \"Moderation flag.\" }\n }\n}\n","import { z } from 'zod';\n\nimport rawTaxonomy from './activity-tiers.json' with { type: 'json' };\n\nexport type ActivityTier = 'creation' | 'action' | 'filtered';\n\nexport interface TierMeta {\n label: string | null;\n description: string;\n shownOnPublicProfile: boolean;\n}\n\nexport interface LexiconEntry {\n tier: ActivityTier;\n app?: string;\n notes?: string;\n}\n\nexport interface ActivityTaxonomy {\n version: string;\n updated: string;\n tiers: Record<ActivityTier, TierMeta>;\n lexicons: Record<string, LexiconEntry>;\n}\n\nconst tierMetaSchema = z.object({\n label: z.string().nullable(),\n description: z.string(),\n shownOnPublicProfile: z.boolean(),\n});\n\nconst lexiconEntrySchema = z.object({\n tier: z.enum(['creation', 'action', 'filtered']),\n app: z.string().optional(),\n notes: z.string().optional(),\n});\n\nconst taxonomySchema = z.object({\n version: z.string(),\n updated: z.string(),\n tiers: z.object({\n creation: tierMetaSchema,\n action: tierMetaSchema,\n filtered: tierMetaSchema,\n }),\n lexicons: z.record(z.string(), lexiconEntrySchema),\n});\n\nconst parsed: ActivityTaxonomy = taxonomySchema.parse(rawTaxonomy);\n\nexport const ACTIVITY_TIERS: Readonly<ActivityTaxonomy> = Object.freeze(parsed);\n\n/**\n * Returns the activity tier for a given AT Protocol NSID.\n * Returns 'filtered' for unknown/unclassified NSIDs (safe default — won't\n * leak unknown records to public profile surfaces).\n */\nexport function getActivityTier(nsid: string): ActivityTier {\n if (!nsid) return 'filtered';\n const entry = ACTIVITY_TIERS.lexicons[nsid];\n return entry ? entry.tier : 'filtered';\n}\n\n/**\n * Returns the full lexicon entry (tier + app + notes), or null if unknown.\n */\nexport function getLexiconEntry(nsid: string): LexiconEntry | null {\n if (!nsid) return null;\n const entry = ACTIVITY_TIERS.lexicons[nsid];\n return entry ?? null;\n}\n\n/**\n * Returns tier metadata (label, description, public visibility).\n */\nexport function getTierMeta(tier: ActivityTier): TierMeta {\n return ACTIVITY_TIERS.tiers[tier];\n}\n\n/**\n * Returns the taxonomy version + updated date for diagnostics and\n * version-skew detection between SDK consumers and the canonical taxonomy.\n */\nexport function getActivityTaxonomyVersion(): { version: string; updated: string } {\n return { version: ACTIVITY_TIERS.version, updated: ACTIVITY_TIERS.updated };\n}\n","/**\n * Format a date string as a relative time (e.g. \"5m ago\", \"3d ago\").\n * Returns an empty string for invalid or future dates.\n */\nexport function formatRelativeTime(dateString: string): string {\n const date = new Date(dateString);\n if (isNaN(date.getTime())) return '';\n\n const now = Date.now();\n const diffMs = now - date.getTime();\n if (diffMs < 0) return '';\n\n const seconds = Math.floor(diffMs / 1000);\n if (seconds < 60) return `${seconds}s ago`;\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days}d ago`;\n\n const months = Math.floor(days / 30);\n if (months < 12) return `${months}mo ago`;\n\n const years = Math.floor(months / 12);\n return `${years}y ago`;\n}\n","/**\n * Sort profile section items from newest to oldest.\n *\n * Rules:\n * - Items with no end date (ongoing/current) sort to the top.\n * - Primary sort: end date descending (newest first).\n * - Secondary sort: start date descending (newest first).\n * - Items with no dates sort to the bottom.\n *\n * Date strings are ISO-ish (\"2024\", \"2024-03\", \"2024-03-15\") and\n * lexicographic comparison works correctly for them.\n */\n\ninterface DateRange {\n startDate?: string;\n endDate?: string;\n current?: boolean;\n}\n\ntype DateExtractor<T> = (item: T) => DateRange;\n\nconst FAR_FUTURE = '9999-12-31';\nconst FAR_PAST = '0000-01-01';\n\nexport function sortByDateDesc<T>(items: T[], extract: DateExtractor<T>): T[] {\n return [...items].sort((a, b) => {\n const da = extract(a);\n const db = extract(b);\n\n const endA = da.current ? FAR_FUTURE : (da.endDate ?? '');\n const endB = db.current ? FAR_FUTURE : (db.endDate ?? '');\n\n // Items with any date beat items with no dates at all\n const hasDateA = endA || da.startDate;\n const hasDateB = endB || db.startDate;\n if (hasDateA && !hasDateB) return -1;\n if (!hasDateA && hasDateB) return 1;\n\n // Primary: end date descending\n if (endA !== endB) return endB.localeCompare(endA);\n\n // Secondary: start date descending\n const startA = da.startDate ?? FAR_PAST;\n const startB = db.startDate ?? FAR_PAST;\n return startB.localeCompare(startA);\n });\n}\n\n/**\n * Convenience extractor for items that use `startDate` / `endDate` fields directly.\n * Used by volunteering, projects, and other sections that still use startDate/endDate.\n */\nexport function dateRangeExtractor<\n T extends { startDate?: string; endDate?: string; current?: boolean },\n>(item: T): DateRange {\n return { startDate: item.startDate, endDate: item.endDate, current: item.current };\n}\n\n/**\n * Extractor for lexicon-aligned items that use `startedAt` / `endedAt` fields.\n * Used by positions and education (current derived from !endedAt).\n */\nexport function lexiconDateExtractor<T extends { startedAt?: string; endedAt?: string }>(\n item: T,\n): DateRange {\n return { startDate: item.startedAt, endDate: item.endedAt, current: !item.endedAt };\n}\n\n/**\n * Convenience extractor for items with a single `date` field.\n */\nexport function singleDateExtractor<T extends { date?: string }>(item: T): DateRange {\n return { endDate: item.date };\n}\n\n/**\n * Extractor for certifications which use `issueDate` / `expiryDate`.\n */\nexport function certDateExtractor<T extends { issueDate?: string; expiryDate?: string }>(\n item: T,\n): DateRange {\n return { startDate: item.issueDate, endDate: item.expiryDate ?? item.issueDate };\n}\n","/**\n * Sanitize raw user input into a valid AT Protocol identifier (handle or DID).\n *\n * Handles common mistakes:\n * - Pasting a full Bluesky profile URL\n * - Pasting a raw HTTPS URL to a PDS domain\n * - Using an at:// URI\n * - Prefixing with @\n * - Entering a bare username without .bsky.social\n */\nexport function sanitizeHandleInput(raw: string): string {\n let identifier = raw\n .trim()\n .replace(/^https?:\\/\\/bsky\\.app\\/profile\\//i, '')\n .replace(/^at:\\/\\//i, '')\n .replace(/^@/, '')\n .replace(/^https?:\\/\\//i, '');\n if (!identifier.startsWith('did:')) {\n identifier = identifier.split('/')[0] ?? identifier;\n }\n identifier = identifier.replace(/\\.$/, '');\n if (!identifier.startsWith('did:')) {\n identifier = identifier.toLowerCase();\n }\n\n // Auto-append .bsky.social for bare usernames (no dots, not a DID)\n if (identifier && !identifier.startsWith('did:') && !identifier.includes('.')) {\n identifier = `${identifier}.bsky.social`;\n }\n\n return identifier;\n}\n","import type { LocationValue } from '../types/index.js';\n\n/**\n * Format a LocationValue for display.\n *\n * Prefers `locality` (the community.lexicon.location.address field) and\n * falls back to the legacy `city` slot so values produced before the\n * sifa-api alias migration still render correctly during the additive\n * transition window.\n */\nexport function formatLocation(loc: LocationValue | null | undefined): string {\n if (!loc) return '';\n const locality = loc.locality ?? loc.city;\n const parts = [locality, loc.region, loc.country].filter(Boolean);\n if (loc.postalCode && !locality) {\n return `${loc.postalCode}, ${loc.country}`;\n }\n return parts.join(', ');\n}\n\n/** Parse a display string back into a LocationValue (best-effort for legacy data) */\nexport function parseLocationString(str: string): LocationValue | null {\n if (!str.trim()) return null;\n const parts = str\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n if (parts.length >= 3) {\n return {\n city: parts[0],\n region: parts[1],\n country: parts[parts.length - 1]!,\n };\n }\n if (parts.length === 2) {\n return {\n city: parts[0],\n country: parts[1]!,\n };\n }\n return { country: parts[0]! };\n}\n\n/** Convert ISO 3166-1 alpha-2 country code to flag emoji */\nexport function countryCodeToFlag(code: string | undefined): string {\n if (!code || code.length !== 2) return '';\n const upper = code.toUpperCase();\n const a = upper.codePointAt(0);\n const b = upper.codePointAt(1);\n if (a === undefined || b === undefined) return '';\n return String.fromCodePoint(a - 0x41 + 0x1f1e6, b - 0x41 + 0x1f1e6);\n}\n","import type { PdsProviderInfo } from '../types/index.js';\n\nexport interface PdsProvider {\n name: string;\n profileUrl: string;\n host?: string;\n}\n\nconst BSKY_PROFILE_BASE = 'https://bsky.app/profile/';\n\nconst PDS_PROVIDERS: { suffix: string; name: string }[] = [\n { suffix: '.bsky.social', name: 'bluesky' },\n { suffix: '.blacksky.app', name: 'blacksky' },\n { suffix: '.eurosky.social', name: 'eurosky' },\n { suffix: '.northsky.social', name: 'northsky' },\n];\n\nconst KNOWN_PROVIDER_NAMES = new Set(PDS_PROVIDERS.map((p) => p.name));\n\nconst ICON_ONLY_PROVIDERS = new Set(['selfhosted-social', 'selfhosted']);\n\nexport function pdsProviderFromApi(\n apiProvider: PdsProviderInfo | null | undefined,\n handle: string,\n): PdsProvider | null {\n if (!apiProvider) return null;\n if (ICON_ONLY_PROVIDERS.has(apiProvider.name)) {\n return { name: apiProvider.name, profileUrl: '', host: apiProvider.host };\n }\n if (!KNOWN_PROVIDER_NAMES.has(apiProvider.name)) return null;\n return {\n name: apiProvider.name,\n profileUrl: `${BSKY_PROFILE_BASE}${handle}`,\n host: apiProvider.host,\n };\n}\n\nexport function getHandleStem(handle: string): string {\n const lower = handle.toLowerCase();\n for (const provider of PDS_PROVIDERS) {\n if (lower.endsWith(provider.suffix) && lower.length > provider.suffix.length) {\n return handle.slice(0, -provider.suffix.length);\n }\n }\n return handle;\n}\n\nexport function getDisplayLabel(displayName: string | undefined, handle: string): string {\n if (displayName) return displayName;\n return getHandleStem(handle);\n}\n\n/**\n * Combine optional structured name fields (`id.sifa.profile.self.givenName`,\n * `familyName`) into a single string in Schema.org `Person` order — given\n * before family. Returns `undefined` when both are absent so callers can\n * fall back to `displayName`. Whitespace-only inputs are treated as absent.\n * Does not impose cultural ordering: users whose preferred presentation\n * differs (e.g. Eastern name order) should set `displayName` accordingly,\n * which this helper deliberately does not consult.\n */\nexport function formatStructuredName(\n givenName: string | undefined,\n familyName: string | undefined,\n): string | undefined {\n const given = givenName?.trim();\n const family = familyName?.trim();\n if (given && family) return `${given} ${family}`;\n return given || family || undefined;\n}\n\nconst PDS_DISPLAY_NAMES: Record<string, string> = {\n bluesky: 'Bluesky',\n blacksky: 'BlackSky',\n eurosky: 'EuroSky',\n northsky: 'NorthSky',\n 'selfhosted-social': 'Self-hosted',\n selfhosted: 'Self-hosted',\n};\n\nexport function getPdsDisplayName(providerName: string): string {\n return PDS_DISPLAY_NAMES[providerName] ?? providerName;\n}\n\nexport function detectPdsProvider(handle: string): PdsProvider | null {\n const lower = handle.toLowerCase();\n for (const provider of PDS_PROVIDERS) {\n if (lower.endsWith(provider.suffix)) {\n return {\n name: provider.name,\n profileUrl: `${BSKY_PROFILE_BASE}${handle}`,\n };\n }\n }\n return null;\n}\n","const COMBINING_MARK = /\\p{M}/u;\nconst BIDI_CONTROLS = /[--]/gu;\n\n/**\n * Limit runs of Unicode combining marks (`\\p{M}`) to at most `maxPerBase`\n * marks following any single base character. Defuses \"Zalgo\" text where\n * dozens of stacked combining marks render outside the line box and bleed\n * into neighbouring UI.\n *\n * `maxPerBase` defaults to 4 — high enough to preserve legitimate stacks\n * in Thai, Arabic, Vietnamese, and IPA, low enough to neutralise the\n * vertical-overflow attack vector.\n */\nexport function limitCombiningMarks(value: string, maxPerBase = 4): string {\n if (!value || !COMBINING_MARK.test(value)) return value;\n\n let out = '';\n let combiningRun = 0;\n for (const char of value) {\n if (/\\p{M}/u.test(char)) {\n if (combiningRun < maxPerBase) {\n out += char;\n combiningRun += 1;\n }\n } else {\n out += char;\n combiningRun = 0;\n }\n }\n return out;\n}\n\n/**\n * Sanitise untrusted display text from PDS records before rendering in UI:\n * - strips bidi formatting controls (LRM/RLM/LRE/RLE/PDF/LRO/RLO/LRI/RLI/FSI/PDI)\n * that can hijack reading order or crash `next/og` (see Satori LRM+emoji bug)\n * - limits stacked combining marks (Zalgo defence)\n *\n * Preserves ZWJ (U+200D) so emoji sequences keep rendering.\n */\nexport function sanitizeDisplayText(value: string, maxCombiningPerBase = 4): string {\n if (!value) return value;\n return limitCombiningMarks(value.replace(BIDI_CONTROLS, ''), maxCombiningPerBase);\n}\n","const ELLIPSIS = '\\u2026';\n\n/**\n * Truncate a string to at most `maxLen` grapheme clusters, appending an\n * ellipsis when the string was shortened. Grapheme-aware so it never splits\n * emoji sequences (ZWJ, regional indicators, combining marks, surrogate pairs).\n */\nexport function truncateGraphemes(value: string, maxLen: number): string {\n if (maxLen <= 0) return '';\n const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n const graphemes = Array.from(segmenter.segment(value), (s) => s.segment);\n if (graphemes.length <= maxLen) return value;\n if (maxLen === 1) return ELLIPSIS;\n return graphemes.slice(0, maxLen - 1).join('') + ELLIPSIS;\n}\n","/**\n * Format a date as a relative time string (e.g. \"2 minutes ago\", \"3 days ago\").\n */\nexport function formatDistanceToNow(date: Date): string {\n const seconds = Math.floor((Date.now() - date.getTime()) / 1000);\n if (seconds < 60) return 'just now';\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d ago`;\n\n const weeks = Math.floor(days / 7);\n if (weeks < 5) return `${weeks}w ago`;\n\n const months = Math.floor(days / 30);\n return `${months}mo ago`;\n}\n","/**\n * WCAG 2.2 contrast ratio utilities for validating publication theme colors.\n * Implements the relative luminance and contrast ratio formulas from\n * https://www.w3.org/TR/WCAG22/#dfn-relative-luminance\n */\n\nexport interface RgbColor {\n r: number;\n g: number;\n b: number;\n}\n\n/**\n * Return true when the value is an RgbColor with all channels as integers in [0, 255].\n * Use this before passing untrusted data to the luminance / contrast functions.\n */\nexport function isValidRgbColor(value: unknown): value is RgbColor {\n if (value == null || typeof value !== 'object') return false;\n const { r, g, b } = value as Record<string, unknown>;\n return (\n typeof r === 'number' &&\n typeof g === 'number' &&\n typeof b === 'number' &&\n Number.isFinite(r) &&\n Number.isFinite(g) &&\n Number.isFinite(b) &&\n r >= 0 &&\n r <= 255 &&\n g >= 0 &&\n g <= 255 &&\n b >= 0 &&\n b <= 255\n );\n}\n\n/**\n * Serialize an RgbColor to a CSS `rgb(...)` string.\n * Channels are floored to integers to prevent sub-pixel drift.\n */\nexport function rgbToString(color: RgbColor): string {\n return `rgb(${Math.floor(color.r)}, ${Math.floor(color.g)}, ${Math.floor(color.b)})`;\n}\n\n/**\n * Calculate relative luminance of an sRGB color per WCAG 2.2.\n * Input channels must be numbers in [0, 255].\n */\nexport function relativeLuminance(color: RgbColor): number {\n const [rs, gs, bs] = [color.r / 255, color.g / 255, color.b / 255];\n\n const r = rs <= 0.04045 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const g = gs <= 0.04045 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const b = bs <= 0.04045 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/**\n * Calculate WCAG 2.2 contrast ratio between two colors.\n * Returns a value between 1 (identical) and 21 (black/white).\n */\nexport function contrastRatio(color1: RgbColor, color2: RgbColor): number {\n const l1 = relativeLuminance(color1);\n const l2 = relativeLuminance(color2);\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * Check if two colors meet WCAG 2.2 AA contrast requirement (4.5:1 for normal text).\n */\nexport function meetsContrastAA(foreground: RgbColor, background: RgbColor): boolean {\n return contrastRatio(foreground, background) >= 4.5;\n}\n","/**\n * URL patterns per app, mirroring the sifa-web registry.\n *\n * These describe how to build a clickable URL for an activity card given\n * the author's handle/did and the record rkey. The patterns are templates\n * with `{handle}`, `{did}`, and `{rkey}` placeholders; each variable is\n * URI-encoded when interpolated.\n *\n * Tier semantics:\n * - `urlPattern`: per-item URL (a specific post/event/repo). Preferred.\n * - `profileUrlPattern`: per-user profile URL on the app. Fallback.\n *\n * Apps without either pattern are not clickable.\n */\nexport interface AppUrlPatterns {\n urlPattern?: string;\n profileUrlPattern?: string;\n}\n\nexport const APP_URL_PATTERNS: Readonly<Record<string, AppUrlPatterns>> = Object.freeze({\n bluesky: {\n urlPattern: 'https://bsky.app/profile/{handle}/post/{rkey}',\n profileUrlPattern: 'https://bsky.app/profile/{handle}',\n },\n tangled: {\n profileUrlPattern: 'https://tangled.sh/{handle}',\n },\n smokesignal: {\n urlPattern: 'https://smokesignal.events/{did}/{rkey}',\n profileUrlPattern: 'https://smokesignal.events/{did}',\n },\n whitewind: {\n urlPattern: 'https://whtwnd.com/{handle}/{rkey}',\n profileUrlPattern: 'https://whtwnd.com/{handle}',\n },\n frontpage: {\n urlPattern: 'https://frontpage.fyi/post/{did}/{rkey}',\n profileUrlPattern: 'https://frontpage.fyi/profile/{did}',\n },\n linkat: {\n profileUrlPattern: 'https://linkat.blue/{handle}',\n },\n pastesphere: {\n urlPattern: 'https://pastesphere.link/user/{handle}/snippet/{rkey}',\n profileUrlPattern: 'https://pastesphere.link/user/{handle}',\n },\n kipclip: {\n profileUrlPattern: 'https://kipclip.com/{handle}',\n },\n keytrace: {\n profileUrlPattern: 'https://keytrace.dev/@{handle}',\n },\n sifa: {\n profileUrlPattern: 'https://sifa.id/p/{handle}',\n },\n popfeed: {\n urlPattern: 'https://popfeed.social/profile/{handle}',\n profileUrlPattern: 'https://popfeed.social/profile/{handle}',\n },\n streamplace: {\n profileUrlPattern: 'https://stream.place/{handle}',\n },\n semble: {\n profileUrlPattern: 'https://semble.so/profile/{handle}',\n },\n grain: {\n urlPattern: 'https://grain.social/profile/{did}/gallery/{rkey}',\n profileUrlPattern: 'https://grain.social/profile/{did}',\n },\n youandme: { profileUrlPattern: 'https://youandme.at' },\n // anisota: upgraded with per-record URL pattern below.\n margin: { profileUrlPattern: 'https://margin.at' },\n beaconbits: { profileUrlPattern: 'https://beaconbits.app' },\n bookhive: { profileUrlPattern: 'https://bookhive.buzz/profile/{handle}' },\n colibri: { profileUrlPattern: 'https://colibri.social' },\n collectivesocial: { profileUrlPattern: 'https://app.collectivesocial.app' },\n github: {},\n asq: {\n // Questions live at /q/{did}/{rkey}. Answer cards build their own URL\n // from the parsed subject.uri (which points to the question), so the\n // pattern below is invoked only for question records.\n urlPattern: 'https://asq.fyi/q/{did}/{rkey}',\n profileUrlPattern: 'https://asq.fyi',\n },\n passports: {\n // Per-record URLs don't exist on passports.social — its SvelteKit routes\n // stop at /profile/{handle}/{passport_slug}. Profile-level fallback only.\n profileUrlPattern: 'https://passports.social/profile/{handle}',\n },\n leaflet: {\n // Per-document URLs are short and rkey-only: https://leaflet.pub/{rkey}.\n // Each publication has its own base_path subdomain (e.g. zzstoatzz.leaflet.pub)\n // but the canonical short URL renders the same document. There is no\n // per-user profile route on leaflet.pub, so the profile fallback points\n // at the marketing site.\n urlPattern: 'https://leaflet.pub/{rkey}',\n profileUrlPattern: 'https://leaflet.pub',\n },\n spark: {\n // Verified live: GET /post/{did}/{rkey} returns 200.\n urlPattern: 'https://sprk.so/post/{did}/{rkey}',\n profileUrlPattern: 'https://sprk.so/profile/{handle}',\n },\n anisota: {\n urlPattern: 'https://anisota.net/post/{did}/{rkey}',\n profileUrlPattern: 'https://anisota.net/profile/{handle}',\n },\n nooki: {\n // Per-post URLs use slug-based routing (e.g. /post/{slug}), not rkey —\n // can't be constructed from a record. Profile fallback only.\n profileUrlPattern: 'https://nooki.me/user/{handle}',\n },\n atstore: {\n // atstore.fyi has no user-profile pages (the legacy `/@{handle}` pattern\n // resolved to a 404), and no per-review deep link exists. The per-product\n // page (https://atstore.fyi/products/{slug}) is the most specific URL\n // available — resolveCardUrl builds it from record.listingMeta.slug,\n // which sifa-api enriches by resolving the review's `subject` to the\n // referenced listing.detail record.\n profileUrlPattern: 'https://atstore.fyi',\n },\n plyr: {\n // SPA — per-record URLs require JS routing. plyr.fm doesn't expose a\n // public per-handle profile page server-side either; falls back to root.\n profileUrlPattern: 'https://plyr.fm',\n },\n atfund: {\n // at.fund is auth-gated — `/give/{did}` 307s to `/` when not signed in,\n // and there's no public per-endorsement permalink. Profile fallback only,\n // pointing at the main /give listing.\n profileUrlPattern: 'https://www.at.fund/give',\n },\n crate: {\n // Crate (app.crate.social) is an authoring dashboard with no public\n // per-record viewer or per-handle profile page — records are designed to\n // render on the maker's own site. `content` cards link out via\n // record.canonicalUrl (handled in resolveCardUrl); `note` records have no\n // public URL and render non-clickable. So no app-level pattern applies.\n },\n});\n\n/**\n * Map collection NSID prefixes to app ids. Order matters: longer / more\n * specific prefixes must come before broader ones.\n */\nexport const COLLECTION_TO_APP: ReadonlyArray<readonly [prefix: string, appId: string]> = [\n ['app.bsky.', 'bluesky'],\n ['sh.tangled.', 'tangled'],\n ['events.smokesignal.', 'smokesignal'],\n ['community.lexicon.calendar.', 'smokesignal'],\n ['community.lexicon.bookmarks.', 'kipclip'],\n ['com.kipclip.', 'kipclip'],\n ['blue.flashes.', 'flashes'],\n ['social.grain.', 'grain'],\n ['com.whtwnd.', 'whitewind'],\n ['fyi.unravel.frontpage.', 'frontpage'],\n ['social.psky.', 'picosky'],\n ['blue.linkat.', 'linkat'],\n ['link.pastesphere.', 'pastesphere'],\n ['site.standard.', 'standard'],\n ['computer.aetheros.', 'aetheros'],\n ['space.roomy.', 'roomy'],\n ['dev.keytrace.', 'keytrace'],\n ['social.popfeed.', 'popfeed'],\n ['app.popsky.', 'popfeed'],\n ['place.stream.', 'streamplace'],\n ['app.sidetrail.', 'semble'],\n ['network.cosmik.', 'cosmik'],\n ['id.sifa.', 'sifa'],\n ['forum.barazo.', 'barazo'],\n ['xyz.statusphere.', 'statusphere'],\n ['at.youandme.', 'youandme'],\n ['net.anisota.', 'anisota'],\n ['at.margin.', 'margin'],\n ['app.beaconbits.', 'beaconbits'],\n ['buzz.bookhive.', 'bookhive'],\n ['social.colibri.', 'colibri'],\n ['social.passports.', 'passports'],\n ['fyi.asq.', 'asq'],\n ['pub.leaflet.', 'leaflet'],\n ['so.sprk.', 'spark'],\n ['community.nooki.', 'nooki'],\n ['fyi.atstore.', 'atstore'],\n ['fm.plyr.', 'plyr'],\n ['fund.at.', 'atfund'],\n ['social.crate.', 'crate'],\n];\n","import { APP_URL_PATTERNS, COLLECTION_TO_APP } from './app-url-patterns.js';\n\n/**\n * An activity item as consumed by the Sifa activity-card components and\n * the sifa-api external-URL health scanner. The shape mirrors the props\n * the cards already use, so the resolver returns the same URL the UI\n * renders.\n */\nexport interface ActivityItemForUrl {\n /** Collection NSID, e.g. \"sh.tangled.graph.repo\". */\n collection: string;\n /** The raw record from the PDS / API. */\n record: Record<string, unknown>;\n /** Full at-uri of the record (used by collections that derive URL from uri). */\n uri: string;\n /** Record key. */\n rkey: string;\n /** DID of the author of the record. */\n authorDid: string;\n /** Optional handle (cards prefer handle in URL paths when available). */\n authorHandle?: string;\n}\n\n/**\n * Map a collection NSID to its app id, mirroring the sifa-web prefix map.\n *\n * Falls back to the first two NSID segments (e.g. \"org.hyperboards\") when\n * the prefix is not registered, matching the existing card behaviour.\n */\nexport function getAppIdForCollection(collection: string): string {\n for (const [prefix, appId] of COLLECTION_TO_APP) {\n if (collection.startsWith(prefix)) return appId;\n }\n const parts = collection.split('.');\n if (parts.length >= 2) return `${parts[0]}.${parts[1]}`;\n return collection;\n}\n\nfunction interpolate(pattern: string, vars: Record<string, string | undefined>): string | null {\n let result = pattern;\n for (const [key, value] of Object.entries(vars)) {\n if (result.includes(`{${key}}`)) {\n if (!value) return null;\n result = result.replaceAll(`{${key}}`, encodeURIComponent(value));\n }\n }\n return result;\n}\n\n/**\n * Whether the per-item `urlPattern` for `appId` is appropriate for `collection`.\n *\n * For bluesky, the per-item URL pattern only matches `app.bsky.feed.post` —\n * other `app.bsky.*` collections (`actor.status`, `graph.cancellation`, etc.)\n * use rkeys that would 404 at `bsky.app/profile/{handle}/post/{rkey}`. Fall\n * back to the profile URL for those. See sifa-web#1070 / sifa-web#1073.\n *\n * When `collection` is undefined we err on the safe side for bluesky and\n * prefer the profile URL.\n */\nfunction shouldUseItemPattern(appId: string, collection: string | undefined): boolean {\n if (appId === 'bluesky') {\n return collection === 'app.bsky.feed.post';\n }\n return true;\n}\n\nfunction patternUrl(\n appId: string,\n vars: { handle?: string; did?: string; rkey?: string },\n collection?: string,\n): string | null {\n const patterns = APP_URL_PATTERNS[appId];\n if (!patterns) return null;\n\n if (patterns.urlPattern && shouldUseItemPattern(appId, collection)) {\n const url = interpolate(patterns.urlPattern, vars);\n if (url) return url;\n }\n if (patterns.profileUrlPattern) {\n const url = interpolate(patterns.profileUrlPattern, vars);\n if (url) return url;\n }\n return null;\n}\n\n/**\n * Valid tangled repo slug: alphanumeric, dot, dash, underscore. No whitespace,\n * slashes, or URL-encodable special characters. Multi-segment aggregate `name`\n * values produce 404 URLs, so callers fall back to the profile URL when\n * invalid. See sifa-web#1071 / sifa-web#1072.\n */\nconst TANGLED_REPO_SLUG = /^[a-zA-Z0-9._-]+$/;\n\nfunction stringOrNull(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\n// at://did:plc:xxx/community.lexicon.calendar.event/rkey\n// -> { did: \"did:plc:xxx\", rkey: \"rkey\" }\nfunction parseAtUri(atUri: string): { did: string; rkey: string } | null {\n const match = atUri.match(/^at:\\/\\/(did:[^/]+)\\/[^/]+\\/(.+)$/);\n if (!match || !match[1] || !match[2]) return null;\n return { did: match[1], rkey: match[2] };\n}\n\n/**\n * Resolve the canonical clickable URL for an activity item — the same URL\n * the activity-card UI in sifa-web renders.\n *\n * Returns `null` when no link is appropriate (the card would render\n * non-clickable, or hide itself entirely).\n *\n * Used by:\n * - sifa-web activity cards (single source of truth for href)\n * - sifa-api external-URL health scanner (must match what the UI links to,\n * so broken-link detection lines up with what users actually click)\n *\n * Resolution order:\n * 1. Per-collection bespoke logic (tangled, kipclip, margin, smokesignal\n * rsvp, standard documents). These mirror the inline logic in the\n * individual card components.\n * 2. Generic `record.url` field (used by hyperboards and similar).\n * 3. Pattern-based per-item / profile URL from the registry.\n */\nexport function resolveCardUrl(item: ActivityItemForUrl): string | null {\n const { collection, record, uri, rkey, authorDid, authorHandle } = item;\n const appId = getAppIdForCollection(collection);\n\n // --- Per-collection bespoke logic (mirrors the card components) ---\n\n // Tangled: prefer per-repo URL `https://tangled.sh/{handle}/{record.name}`.\n // Only when record.name is a valid repo slug — multi-segment aggregate names\n // (whitespace, slashes, special chars) would 404. See sifa-web#1071.\n if (collection.startsWith('sh.tangled.')) {\n const repoName = stringOrNull(record.name);\n if (repoName && authorHandle && TANGLED_REPO_SLUG.test(repoName)) {\n return `https://tangled.sh/${authorHandle}/${repoName}`;\n }\n return patternUrl('tangled', { handle: authorHandle, did: authorDid, rkey }, collection);\n }\n\n // Kipclip / community.lexicon.bookmarks: the bookmark subject IS the URL\n if (\n collection.startsWith('com.kipclip.') ||\n collection.startsWith('community.lexicon.bookmarks.')\n ) {\n const subject = stringOrNull(record.subject);\n if (subject) return subject;\n return patternUrl('kipclip', { handle: authorHandle, did: authorDid, rkey });\n }\n\n // Margin bookmark: card returns null entirely without record.source\n if (collection === 'at.margin.bookmark') {\n const source = stringOrNull(record.source);\n if (source) return source;\n return null;\n }\n\n // Margin annotation: target.source -> fall back to margin app URL\n if (collection === 'at.margin.annotation') {\n const target = record.target;\n if (target != null && typeof target === 'object') {\n const source = stringOrNull((target as Record<string, unknown>).source);\n if (source) return source;\n }\n return APP_URL_PATTERNS.margin?.profileUrlPattern ?? null;\n }\n\n // Smokesignal RSVP: parse the linked event uri\n if (collection === 'community.lexicon.calendar.rsvp') {\n const subject = record.subject;\n if (subject != null && typeof subject === 'object') {\n const subjectUri = stringOrNull((subject as Record<string, unknown>).uri);\n if (subjectUri) {\n const parsed = parseAtUri(subjectUri);\n if (parsed) {\n return `https://smokesignal.events/${parsed.did}/${parsed.rkey}`;\n }\n }\n }\n return null;\n }\n\n // Smokesignal event itself: use item's own uri\n if (collection === 'community.lexicon.calendar.event') {\n const parsed = parseAtUri(uri);\n if (parsed) {\n return `https://smokesignal.events/${parsed.did}/${parsed.rkey}`;\n }\n return null;\n }\n\n // atstore reviews: no per-review URL exists on atstore.fyi, and user profile\n // pages don't exist either. Deep-link to the reviewed product instead.\n // The slug comes from record.listingMeta (enriched by sifa-api from the\n // review's `subject` at-uri → fyi.atstore.listing.detail record).\n if (collection === 'fyi.atstore.listing.review') {\n const listingMeta = record.listingMeta;\n if (listingMeta != null && typeof listingMeta === 'object') {\n const slug = stringOrNull((listingMeta as Record<string, unknown>).slug);\n if (slug) return `https://atstore.fyi/products/${encodeURIComponent(slug)}`;\n }\n return APP_URL_PATTERNS.atstore?.profileUrlPattern ?? null;\n }\n\n // Crate content: link to the canonical published location the maker\n // recorded (a YouTube/podcast/personal-site URL). Crate is an authoring\n // dashboard with no public per-record viewer, so `note` records — which\n // carry no canonicalUrl — render non-clickable (null).\n if (collection === 'social.crate.content') {\n return stringOrNull(record.canonicalUrl);\n }\n if (collection === 'social.crate.note') {\n return null;\n }\n\n // Standard documents: siteUrl + path (or just siteUrl)\n if (collection.startsWith('site.standard.')) {\n const siteUrl = stringOrNull(record.siteUrl);\n const path = stringOrNull(record.path);\n if (siteUrl && path) return `${siteUrl}${path}`;\n if (siteUrl) return siteUrl;\n // Fall through to generic record.url / patterns\n }\n\n // --- Generic fallbacks ---\n\n // record.url is a common ad-hoc per-item URL (hyperboards, etc.)\n const recordUrl = stringOrNull(record.url);\n if (recordUrl) return recordUrl;\n\n // Pattern-based fallback. Pass `collection` so app-specific guards (bluesky\n // restricting /post/{rkey} to app.bsky.feed.post) can apply.\n return patternUrl(appId, { handle: authorHandle, did: authorDid, rkey }, collection);\n}\n","/**\n * Per-collection visibility rules for activity items.\n *\n * These rules express \"this record has nothing meaningful to render as a card\"\n * — e.g. a BookHive shelf-add with no review/stars, or a BeaconBits pin with\n * no shout. They are a UX/card concern, distinct from the api-side blocklists\n * in sifa-api/atproto-app-registry that exclude whole collections (likes,\n * follows, games) or filter spammy record shapes (empty quote posts).\n *\n * Used in two places:\n * - sifa-api's activity feed pagination, so a page-of-N returns N visible\n * items rather than silently-dropped placeholders.\n * - sifa-web's activity-feed component (and as defense-in-depth in the card\n * components themselves), so the client never relies on a stale api.\n *\n * Adding a new rule = one PR to this file. Unknown collections default to\n * visible, so the rule set is purely additive — adding a rule can only ever\n * hide more, never expose what was hidden before.\n */\n\ntype VisibilityPredicate = (record: Record<string, unknown>) => boolean;\n\nfunction isNonEmptyString(value: unknown): boolean {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction bookhiveHasOpinion(record: Record<string, unknown>): boolean {\n const review = typeof record.review === 'string' ? record.review.trim() : '';\n const stars = typeof record.stars === 'number' ? record.stars : 0;\n return review.length > 0 || stars > 0;\n}\n\nfunction beaconbitsHasContent(record: Record<string, unknown>): boolean {\n return isNonEmptyString(record.shout) || record.post != null;\n}\n\nfunction marginBookmarkHasSource(record: Record<string, unknown>): boolean {\n return isNonEmptyString(record.source);\n}\n\nfunction marginAnnotationHasBody(record: Record<string, unknown>): boolean {\n const body = record.body;\n if (typeof body === 'string') return body.trim().length > 0;\n if (body != null && typeof body === 'object') {\n const value = (body as Record<string, unknown>).value;\n return typeof value === 'string' && value.trim().length > 0;\n }\n return false;\n}\n\nexport const ACTIVITY_VISIBILITY_RULES: Readonly<Record<string, VisibilityPredicate>> =\n Object.freeze({\n 'buzz.bookhive.book': bookhiveHasOpinion,\n 'app.beaconbits.beacon': beaconbitsHasContent,\n 'at.margin.bookmark': marginBookmarkHasSource,\n 'at.margin.annotation': marginAnnotationHasBody,\n });\n\n/**\n * Return true if the activity item should render a card in the timeline.\n * Records that fail the rule for their collection are dropped silently —\n * they exist in the user's PDS but carry no card-worthy content.\n *\n * Unknown collections (no registered rule) default to visible.\n */\nexport function isVisibleActivityItem(collection: string, record: unknown): boolean {\n if (record === null || typeof record !== 'object') return false;\n const rule = ACTIVITY_VISIBILITY_RULES[collection];\n if (!rule) return true;\n return rule(record as Record<string, unknown>);\n}\n","/**\n * Adult-content gating for Bluesky activity items.\n *\n * Bluesky's official moderation labeler attaches content labels to\n * `app.bsky.feed.defs#postView.labels`. The four sex-and-violence labels\n * below are the ones we hide by default on Sifa: media is replaced with an\n * `<AdultContentWarning>` placeholder card in sifa-web. Authenticated\n * viewers can reveal per-card; anonymous viewers cannot.\n *\n * The list mirrors Bluesky's own globalLabelStrings; if the official set\n * grows (e.g. a new `extreme-violence` label), update this constant.\n *\n * Why a constant + predicate live in the SDK: the same logic needs to run\n * in sifa-web today and sifa-app tomorrow, and the API only forwards the\n * raw labels — the hide decision is a client concern.\n */\n\nexport const ADULT_CONTENT_LABELS = ['porn', 'sexual', 'nudity', 'graphic-media'] as const;\n\nexport type AdultContentLabel = (typeof ADULT_CONTENT_LABELS)[number];\n\n/**\n * A single label entry as emitted by `app.bsky.feed.defs#postView.labels`.\n * Matches `com.atproto.label.defs#label` (the on-wire shape after the AppView\n * resolves a `postView`). `neg: true` marks a retraction.\n */\nexport interface ActivityLabel {\n val: string;\n src: string;\n uri: string;\n cts?: string;\n neg?: boolean;\n}\n\n/**\n * Return true if the item carries at least one adult-content label that is\n * not negated. Items without a `labels` field (every non-Bluesky source,\n * legacy responses) are treated as safe.\n */\nexport function hasAdultContent(item: { labels?: ActivityLabel[] }): boolean {\n const labels = item.labels;\n if (!labels || labels.length === 0) return false;\n return labels.some(\n (label) => !label.neg && (ADULT_CONTENT_LABELS as readonly string[]).includes(label.val),\n );\n}\n","/**\n * Publisher registry — single source of truth for apps that publish documents\n * through the shared `site.standard.*` namespace (Leaflet, Pckt, Offprint, …).\n *\n * Why this exists:\n * A document published via Leaflet, Pckt, Offprint, etc. lives canonically as a\n * `site.standard.document` record. The publisher is metadata, identifiable from\n * the publication's hostname. The activity-card, the publication merger in\n * sifa-api, and the external-URL health scanner all need the same hostname →\n * publisher mapping. Keeping it in one place stops the registry from drifting.\n *\n * What lives here:\n * - `id` — stable appId, also keys sifa-web's branding (logo, color)\n * - `name` — display name\n * - `hostSuffixes` — hostnames that identify a publication URL as this publisher\n * - `homeUrl` — last-resort URL when no per-document URL is available\n *\n * What does NOT live here:\n * - Logo components, color tokens, React chrome — those belong in sifa-web\n * keyed by `id`.\n * - Per-document URL construction — Standard documents are always\n * `${publication.url}${document.path}`. The publisher doesn't change that.\n */\n\nexport interface Publisher {\n /**\n * Stable identifier. Used as the `appId` across Sifa so that sifa-web's\n * `getAppMeta(id)` lookup yields the right logo and color, and so that\n * activity-stat rows tag correctly.\n */\n id: string;\n\n /** Display name shown in pills and headers. */\n name: string;\n\n /**\n * Hostnames that identify a publication URL as belonging to this publisher.\n * Matches the publication URL's hostname when it equals the suffix\n * (e.g. `leaflet.pub`) OR ends with it as a dotted suffix\n * (e.g. `notesbyarielm.leaflet.pub`).\n *\n * Allow multiple entries to future-proof against rebrands or aliases.\n */\n hostSuffixes: readonly string[];\n\n /** Public homepage of the publisher, used as a profile-level fallback URL. */\n homeUrl: string;\n}\n\n/**\n * Neutral fallback used when no branded publisher matches.\n *\n * Synthetic publishers returned by `getPublisherFromSiteUrl` use this `id` but\n * carry the document's own hostname in `name`, so cards can still show e.g.\n * \"feeds.byarielm.fyi\" as the publisher label.\n */\nexport const STANDARD_PUBLISHER_ID = 'standard' as const;\n\nexport const PUBLISHERS: readonly Publisher[] = Object.freeze([\n {\n id: 'leaflet',\n name: 'Leaflet',\n hostSuffixes: ['leaflet.pub'],\n homeUrl: 'https://leaflet.pub',\n },\n {\n id: 'pckt',\n name: 'pckt',\n hostSuffixes: ['pckt.blog'],\n homeUrl: 'https://pckt.blog',\n },\n {\n id: 'offprint',\n name: 'Offprint',\n hostSuffixes: ['offprint.app'],\n homeUrl: 'https://offprint.app',\n },\n {\n id: 'whitewind',\n name: 'WhiteWind',\n hostSuffixes: ['whtwnd.com'],\n homeUrl: 'https://whtwnd.com',\n },\n {\n id: 'unthread',\n name: 'Unthread',\n hostSuffixes: ['unthread.at'],\n homeUrl: 'https://unthread.at',\n },\n {\n id: 'blento',\n name: 'Blento',\n hostSuffixes: ['blento.io'],\n homeUrl: 'https://blento.io',\n },\n]);\n\nconst PUBLISHERS_BY_ID: ReadonlyMap<string, Publisher> = new Map(PUBLISHERS.map((p) => [p.id, p]));\n\n/** Lookup a registered publisher by id. Returns `undefined` for unknown ids. */\nexport function getPublisherById(id: string): Publisher | undefined {\n return PUBLISHERS_BY_ID.get(id);\n}\n\n/**\n * Match a hostname against the registry. Returns the registered publisher when\n * the hostname equals or is a dotted-subdomain of any of its `hostSuffixes`.\n * Returns `undefined` when no match is found (caller decides on the fallback).\n */\nexport function getPublisherByHost(hostname: string): Publisher | undefined {\n const host = hostname.toLowerCase();\n for (const publisher of PUBLISHERS) {\n for (const suffix of publisher.hostSuffixes) {\n if (host === suffix || host.endsWith(`.${suffix}`)) {\n return publisher;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Resolve the publisher for a publication's site URL.\n *\n * - On a branded host: returns the registered `Publisher` verbatim.\n * - On any other valid URL: returns a synthetic neutral publisher with\n * `id: 'standard'`, `name: <hostname>`, `hostSuffixes: []`, and the URL\n * as `homeUrl`. Cards can therefore always render a meaningful pill label.\n * - On an unparseable string: returns the same neutral shape with the raw\n * input as `name` and `homeUrl` (defensive — should never happen for data\n * coming from a valid `site.standard.publication`).\n */\nexport function getPublisherFromSiteUrl(siteUrl: string): Publisher {\n let hostname: string;\n let homeUrl: string;\n try {\n const parsed = new URL(siteUrl);\n hostname = parsed.hostname;\n homeUrl = `${parsed.protocol}//${parsed.hostname}`;\n } catch {\n return {\n id: STANDARD_PUBLISHER_ID,\n name: siteUrl,\n hostSuffixes: [],\n homeUrl: siteUrl,\n };\n }\n\n const matched = getPublisherByHost(hostname);\n if (matched) return matched;\n\n return {\n id: STANDARD_PUBLISHER_ID,\n name: hostname,\n hostSuffixes: [],\n homeUrl,\n };\n}\n","/**\n * Profile completeness scoring.\n *\n * Six binary signals, equal weight: headline filled, about filled, has at least\n * one position, education, skill, certification.\n *\n * Score: integer 0..6. Percent: round(score / 6 * 100) -- discrete values\n * {0, 17, 33, 50, 67, 83, 100}.\n *\n * Canonical source of truth for completeness scoring across Sifa clients.\n * sifa-api computes the underlying `ProfileCompletion` shape inline (in SQL\n * for admin-stats queries, in route handlers elsewhere) but defers scoring\n * to this module.\n */\n\nexport const COMPLETENESS_MAX_SCORE = 6;\n\nexport interface ProfileCompletion {\n hasHeadline: boolean;\n hasAbout: boolean;\n positionCount: number;\n educationCount: number;\n skillCount: number;\n certificationCount: number;\n}\n\n/** Pure-TS computation of the 0..6 score. */\nexport function completenessScore(c: ProfileCompletion): number {\n let filled = 0;\n if (c.hasHeadline) filled++;\n if (c.hasAbout) filled++;\n if (c.positionCount > 0) filled++;\n if (c.educationCount > 0) filled++;\n if (c.skillCount > 0) filled++;\n if (c.certificationCount > 0) filled++;\n return filled;\n}\n\n/** Completion as a rounded 0..100 integer percent (matches API serialisation). */\nexport function completenessPercent(c: ProfileCompletion): number {\n return Math.round((completenessScore(c) / COMPLETENESS_MAX_SCORE) * 100);\n}\n","/**\n * Profile dimensions -- the routing signal used by the Sifa homepage to choose\n * between the V3 \"still building\" and V4 \"established\" variants.\n *\n * Six binary signals, equal weight: avatar, headline, about, current position,\n * minimum-skill threshold, and at least one education entry. The routing\n * threshold itself (e.g. \">= 4 of 6 -> ESTABLISHED\") lives in the consumer\n * because different surfaces may want to cut at different bars over time.\n *\n * Canonical source of truth for dimension scoring across Sifa clients.\n * sifa-api computes the underlying `ProfileDimensionInputs` shape inline\n * (in SQL on the session route) but defers scoring to this module so the\n * frontend and backend cannot drift on what \"filled\" means.\n *\n * See `docs/plans/2026-04-27-homepage-variants.md` (sifa-web) for the\n * history of why these six were chosen over the original eight.\n */\n\nimport type { Profile, ProfilePosition } from '../types/index.js';\n\nexport const DIMENSIONS_MAX_SCORE = 6;\nexport const MIN_SKILLS = 3;\n\nexport type DimensionKey =\n | 'avatar'\n | 'headline'\n | 'about'\n | 'currentPosition'\n | 'skills'\n | 'education';\n\nexport type DimensionMap = Record<DimensionKey, boolean>;\n\n/**\n * Minimal raw inputs needed to compute the dimension map. sifa-api can\n * populate this from a single composite SQL query without loading the full\n * Profile shape, which is the whole point of putting this in the SDK.\n */\nexport interface ProfileDimensionInputs {\n hasAvatar: boolean;\n hasHeadline: boolean;\n hasAbout: boolean;\n currentPositionCount: number;\n skillCount: number;\n educationCount: number;\n}\n\nfunction nonEmptyString(value: string | undefined | null): boolean {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\n/**\n * Pure-TS computation of the 6-key boolean map from minimal inputs.\n * Use this when you already have aggregate counts (e.g. server-side).\n */\nexport function dimensionsFromInputs(inputs: ProfileDimensionInputs): DimensionMap {\n return {\n avatar: inputs.hasAvatar,\n headline: inputs.hasHeadline,\n about: inputs.hasAbout,\n currentPosition: inputs.currentPositionCount > 0,\n skills: inputs.skillCount >= MIN_SKILLS,\n education: inputs.educationCount > 0,\n };\n}\n\n/**\n * Derives `ProfileDimensionInputs` from a full Profile. Use this on the\n * client when you already have the profile loaded.\n */\nexport function profileToDimensionInputs(profile: Profile): ProfileDimensionInputs {\n const positions = profile.positions ?? [];\n const skills = profile.skills ?? [];\n const education = profile.education ?? [];\n const currentPositionCount = positions.filter((p: ProfilePosition) => !p.endedAt).length;\n return {\n hasAvatar: nonEmptyString(profile.avatar),\n hasHeadline: nonEmptyString(profile.headline),\n hasAbout: nonEmptyString(profile.about),\n currentPositionCount,\n skillCount: skills.length,\n educationCount: education.length,\n };\n}\n\n/** Convenience: full Profile -> dimension boolean map. */\nexport function getFilledDimensionsMap(profile: Profile): DimensionMap {\n return dimensionsFromInputs(profileToDimensionInputs(profile));\n}\n\n/** Count of filled dimensions, 0..6. Accepts either raw inputs or a full Profile. */\nexport function countFilledDimensions(input: ProfileDimensionInputs | Profile): number {\n const map = 'hasAvatar' in input ? dimensionsFromInputs(input) : getFilledDimensionsMap(input);\n let n = 0;\n for (const v of Object.values(map)) {\n if (v) n++;\n }\n return n;\n}\n","/**\n * Canonical rule for picking the \"primary\" position to surface on profile cards,\n * social previews, and structured-data outputs.\n *\n * Without this shared helper, different surfaces (visible hero, OG image,\n * <meta description>, JSON-LD) re-derived \"primary\" inconsistently and diverged\n * for users with multiple concurrent roles.\n *\n * Rules (in order):\n * 1. A position the user explicitly flagged `primary` AND that is still active.\n * 2. Otherwise, the active position with the most recent `startedAt`.\n * 3. Otherwise, undefined (no active position).\n */\n\nexport interface PrimaryPositionCandidate {\n startedAt?: string;\n endedAt?: string;\n primary?: boolean;\n}\n\nexport function pickPrimaryPosition<T extends PrimaryPositionCandidate>(\n positions: readonly T[] | undefined,\n): T | undefined {\n if (!positions || positions.length === 0) return undefined;\n\n const active = positions.filter((p) => !p.endedAt);\n if (active.length === 0) return undefined;\n\n const flagged = active.find((p) => p.primary === true);\n if (flagged) return flagged;\n\n return [...active].sort((a, b) => (b.startedAt ?? '').localeCompare(a.startedAt ?? ''))[0];\n}\n","import { z } from 'zod';\n\n/**\n * Grapheme-aware refinement matching the AT Protocol lexicon `maxGraphemes`\n * constraint. JS strings are sequences of UTF-16 code units, but lexicon\n * `maxGraphemes` counts user-perceived characters (grapheme clusters), so\n * emoji sequences, regional indicators, ZWJ joins, and combining marks all\n * count as one unit each. We use `Intl.Segmenter` to enforce this correctly.\n */\nexport function maxGraphemes(max: number) {\n return (value: string): boolean => {\n const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n let count = 0;\n for (const _ of segmenter.segment(value)) {\n count++;\n if (count > max) return false;\n }\n return true;\n };\n}\n\n/** Decentralized identifier, AT Protocol `format: did`. */\nexport const didSchema = z.string().regex(/^did:[a-z]+:[a-zA-Z0-9._:%-]+$/, 'Invalid DID');\n\n/** RFC 3339 datetime with timezone offset, AT Protocol `format: datetime`. */\nexport const datetimeSchema = z.string().datetime({ offset: true });\n\n/** Generic AT-URI, AT Protocol `format: at-uri`. */\nexport const atUriSchema = z.string().regex(/^at:\\/\\/[^\\s]+$/, 'Invalid AT-URI');\n\n/** Content identifier, AT Protocol `format: cid`. Loose validation -- accepts CIDv0 and CIDv1. */\nexport const cidSchema = z\n .string()\n .regex(/^(Qm[1-9A-HJ-NP-Za-km-z]{44}|b[A-Za-z0-9+/=]+)$/, 'Invalid CID');\n\n/** BCP 47 language tag, AT Protocol `format: language`. */\nexport const languageTagSchema = z\n .string()\n .regex(/^[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*$/, 'Invalid BCP 47 language tag');\n\n/** Generic URI, AT Protocol `format: uri`. */\nexport const uriSchema = z.string().url();\n\n/**\n * StrongRef shape from `com.atproto.repo.strongRef` -- pins a record by both\n * AT-URI (identity) and CID (version).\n */\nexport const strongRefSchema = z.object({\n uri: atUriSchema,\n cid: cidSchema,\n});\n\n/**\n * Self-labels shape from `com.atproto.label.defs#selfLabels`. Modelled\n * permissively because clients rarely construct this directly; the AppView\n * handles label validation.\n */\nexport const selfLabelsSchema = z.object({\n $type: z.literal('com.atproto.label.defs#selfLabels').optional(),\n values: z.array(z.object({ val: z.string() })),\n});\n","import { z } from 'zod';\n\nimport { datetimeSchema, strongRefSchema } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.endorsement.confirmation` records.\n * Lives in the endorsee's PDS to approve display of an endorsement.\n */\nexport const EndorsementConfirmationRecordSchema = z.object({\n endorsement: strongRefSchema,\n createdAt: datetimeSchema,\n});\n\nexport type EndorsementConfirmationRecord = z.infer<typeof EndorsementConfirmationRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes, strongRefSchema } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.endorsement` records. Lives in the endorser's PDS;\n * the endorser identity is implicit (whoever owns the repository).\n */\nexport const EndorsementRecordSchema = z.object({\n subject: didSchema,\n skill: strongRefSchema,\n skillName: z.string().min(1).refine(maxGraphemes(64)).max(640),\n comment: z.string().refine(maxGraphemes(300)).max(3000).optional(),\n createdAt: datetimeSchema,\n});\n\nexport type EndorsementRecord = z.infer<typeof EndorsementRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.graph.follow` records.\n *\n * One-way professional follow; the record lives in the follower's PDS. Per\n * iter-1 decisions (`plans/2026-06-01-in-sifa-follow-primitive.md`), this is\n * a **distinct** graph from `app.bsky.graph.follow`, not a superset — but\n * the required field shape (`subject` + `createdAt`) is intentionally\n * identical so generic Bluesky `listRecords` consumers get usable records.\n *\n * `note` is a Sifa addition: an optional reason for the follow (\"why I\n * followed\"). Capped at 200 graphemes to match other profile-flavored\n * lexicon fields.\n */\nexport const GraphFollowRecordSchema = z.object({\n subject: didSchema,\n createdAt: datetimeSchema,\n note: z.string().refine(maxGraphemes(200), 'note must be at most 200 graphemes').optional(),\n});\n\nexport type GraphFollowRecord = z.infer<typeof GraphFollowRecordSchema>;\n\n/**\n * Build a `GraphFollowRecordSchema` that rejects self-follow at the Zod\n * layer (CLAUDE.md mandatory standards #3 — input validation; sifa-api#673\n * E8 — defence in depth).\n *\n * Use this on the **client side** when constructing a new follow record\n * (the follower DID is the authenticated user). The plain\n * {@link GraphFollowRecordSchema} stays without the refine so firehose\n * consumers can validate records without context.\n */\nexport function makeGraphFollowRecordSchema(followerDid: string) {\n return GraphFollowRecordSchema.refine((record) => record.subject !== followerDid, {\n message: 'Self-follow is not allowed',\n path: ['subject'],\n });\n}\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema } from './shared.js';\n\n/**\n * Profile row shared across `/api/following`, `/api/profile/:handleOrDid/mutuals`,\n * and `/api/me/bluesky-suggestions`. Matches the existing `FollowProfile` TS\n * interface byte-for-byte but adds runtime validation for the SDK's pagination\n * helpers and the upcoming `sifa-app` consumer (where we can't trust the wire).\n *\n * Per `sifa-api#674` PR body: mutuals + bluesky-suggestions reuse this shape\n * exactly, so a single Zod schema covers all three endpoints.\n */\nexport const FollowProfileSchema = z.object({\n did: didSchema,\n handle: z.string(),\n displayName: z.string().optional(),\n headline: z.string().optional(),\n avatarUrl: z.string().optional(),\n source: z.string(),\n claimed: z.boolean(),\n followedAt: datetimeSchema,\n blueskyVerified: z.boolean().optional(),\n blueskyVerifiedAt: datetimeSchema.nullable().optional(),\n});\n\nexport type FollowProfileItem = z.infer<typeof FollowProfileSchema>;\n\n/**\n * Cursor-paginated page of {@link FollowProfileSchema} rows. Used by mutuals\n * + bluesky-suggestions. The legacy `/api/following` endpoint uses a different\n * wrapper key (`follows` instead of `items`) and is intentionally NOT covered\n * by this schema.\n */\nexport const FollowProfilePageSchema = z.object({\n items: z.array(FollowProfileSchema),\n cursor: z.string().nullable(),\n});\n\nexport type FollowProfilePage = z.infer<typeof FollowProfilePageSchema>;\n\n/**\n * Per-flag allowlist row returned by `GET /api/admin/feature-allowlists/:flag`.\n * Mirrors the `feature_allowlists` table; `note` is optional free-form text.\n */\nexport const FeatureAllowlistEntrySchema = z.object({\n did: didSchema,\n addedAt: datetimeSchema,\n note: z.string().nullable().optional(),\n});\n\nexport type FeatureAllowlistEntry = z.infer<typeof FeatureAllowlistEntrySchema>;\n\n/**\n * Known feature flags accepted by the admin allowlist endpoints. Mirrors the\n * server-side `FEATURE_FLAGS` const in `sifa-api`. Kept as a `const` tuple so\n * consumers can `as const`-narrow when building UIs.\n */\nexport const FEATURE_FLAGS = ['FEED_V5_ENABLED'] as const;\nexport type FeatureFlag = (typeof FEATURE_FLAGS)[number];\n","import { z } from 'zod';\n\nimport { atUriSchema, cidSchema, datetimeSchema, didSchema } from './shared.js';\n\n/**\n * Feed item from `GET /api/following/feed`. Discriminated on `source`:\n *\n * - `sifa`: a Sifa-native event (e.g. profile update, endorsement).\n * - `atmosphere`: a curated creation event from another ATproto app\n * (Barazo post, etc.). Payload is the hydrated `app.bsky.embed.*#view`\n * shape, NOT the raw record (per memory `sifa-hydrated-view-embed-types`).\n *\n * Both variants share `actor`, `indexedAt`, and `id` (the materialized\n * `feed_events.id` row identifier, used in the cursor).\n */\nexport const FeedActorSchema = z.object({\n did: didSchema,\n handle: z.string(),\n displayName: z.string().optional(),\n avatarUrl: z.string().optional(),\n});\n\nexport type FeedActor = z.infer<typeof FeedActorSchema>;\n\nconst FeedItemBaseSchema = z.object({\n id: z.string(),\n actor: FeedActorSchema,\n indexedAt: datetimeSchema,\n eventType: z.string(),\n});\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport const SifaFeedItemSchema = FeedItemBaseSchema.extend({\n source: z.literal('sifa'),\n appId: z.literal('sifa').optional(),\n payload: z.record(z.string(), z.unknown()),\n});\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport type SifaFeedItem = z.infer<typeof SifaFeedItemSchema>;\n\n/**\n * ATmosphere feed item. `payload` is intentionally permissive: it carries\n * a hydrated `app.bsky.embed.*#view` shape that varies by source app. The\n * AppView resolves the hydration; clients render via the existing\n * embed-view union (mirrors `sifa-web/src/components/stream/`).\n *\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport const AtmosphereFeedItemSchema = FeedItemBaseSchema.extend({\n source: z.literal('atmosphere'),\n appId: z.string(),\n uri: atUriSchema.optional(),\n cid: cidSchema.optional(),\n payload: z.record(z.string(), z.unknown()),\n});\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport type AtmosphereFeedItem = z.infer<typeof AtmosphereFeedItemSchema>;\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport const FollowFeedItemSchema = z.discriminatedUnion('source', [\n SifaFeedItemSchema,\n AtmosphereFeedItemSchema,\n]);\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport type FollowFeedItem = z.infer<typeof FollowFeedItemSchema>;\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport const FollowFeedPageSchema = z.object({\n items: z.array(FollowFeedItemSchema),\n cursor: z.string().nullable(),\n});\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport type FollowFeedPage = z.infer<typeof FollowFeedPageSchema>;\n\n/**\n * Composite feed cursor `(indexedAt DESC, source, id)`. Encoded as a\n * URL-safe base64 string so it survives `URLSearchParams` round-trips\n * without further encoding. Decoupling encode/decode from the API call\n * lets consumers persist cursors (e.g. for \"jump-back-here\" UX) and\n * lets us unit-test the format.\n */\nexport interface FeedCursor {\n indexedAt: string;\n source: 'sifa' | 'atmosphere';\n id: string;\n}\n\nconst FeedCursorSchema = z.object({\n indexedAt: datetimeSchema,\n source: z.union([z.literal('sifa'), z.literal('atmosphere')]),\n id: z.string().min(1),\n});\n\ninterface BufferLike {\n from: (input: string, encoding: 'utf-8' | 'base64') => { toString: (encoding: string) => string };\n}\n\ninterface Base64Global {\n btoa?: (input: string) => string;\n atob?: (input: string) => string;\n Buffer?: BufferLike;\n}\n\nfunction toBase64Url(input: string): string {\n const g = globalThis as unknown as Base64Global;\n const b64: string =\n typeof g.btoa === 'function'\n ? g.btoa(unescape(encodeURIComponent(input)))\n : (g.Buffer as BufferLike).from(input, 'utf-8').toString('base64');\n // Strip up to 2 trailing '=' (base64 padding). CodeQL flags `/=+$/` as a\n // polynomial regex on tainted input; we don't accept tainted input here,\n // but the deterministic loop sidesteps the alert.\n let end = b64.length;\n while (end > 0 && b64.charCodeAt(end - 1) === 61) end--;\n return b64.slice(0, end).replace(/\\+/g, '-').replace(/\\//g, '_');\n}\n\nfunction fromBase64Url(input: string): string {\n const padded = input.replace(/-/g, '+').replace(/_/g, '/') + '==='.slice((input.length + 3) % 4);\n const g = globalThis as unknown as Base64Global;\n if (typeof g.atob === 'function') {\n return decodeURIComponent(escape(g.atob(padded)));\n }\n return (g.Buffer as BufferLike).from(padded, 'base64').toString('utf-8');\n}\n\nexport function encodeFeedCursor(cursor: FeedCursor): string {\n return toBase64Url(JSON.stringify(cursor));\n}\n\nexport function decodeFeedCursor(encoded: string): FeedCursor {\n const json = fromBase64Url(encoded);\n const parsed: unknown = JSON.parse(json);\n return FeedCursorSchema.parse(parsed);\n}\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes, selfLabelsSchema, uriSchema } from './shared.js';\n\n/** Zod schema for `id.sifa.profile.certification` records. */\nexport const ProfileCertificationRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n authority: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n authorityDid: didSchema.optional(),\n credentialId: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n credentialUrl: uriSchema.optional(),\n issuedAt: datetimeSchema.optional(),\n expiresAt: datetimeSchema.optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileCertificationRecord = z.infer<typeof ProfileCertificationRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, maxGraphemes, strongRefSchema } from './shared.js';\n\n/** Zod schema for `id.sifa.profile.course` records. */\nexport const ProfileCourseRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(200)).max(2000),\n number: z.string().refine(maxGraphemes(50)).max(500).optional(),\n institution: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n education: strongRefSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileCourseRecord = z.infer<typeof ProfileCourseRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes, selfLabelsSchema } from './shared.js';\n\n/** Zod schema for `id.sifa.profile.education` records. */\nexport const ProfileEducationRecordSchema = z.object({\n institution: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n institutionDid: didSchema.optional(),\n degree: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n fieldOfStudy: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n grade: z.string().refine(maxGraphemes(50)).max(500).optional(),\n activities: z.string().refine(maxGraphemes(1000)).max(10000).optional(),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n location: z.unknown().optional(),\n startedAt: datetimeSchema.optional(),\n endedAt: datetimeSchema.optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileEducationRecord = z.infer<typeof ProfileEducationRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, maxGraphemes, uriSchema } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.profile.externalAccount` records.\n *\n * `platform` is advisory (`knownValues` in the lexicon) -- known values live\n * under `id.sifa.defs#platform*` but unknown values are accepted.\n */\nexport const ProfileExternalAccountRecordSchema = z.object({\n platform: z.string(),\n url: uriSchema,\n label: z.string().refine(maxGraphemes(64)).max(640).optional(),\n feedUrl: uriSchema.optional(),\n isPrimary: z.boolean().optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileExternalAccountRecord = z.infer<typeof ProfileExternalAccountRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes } from './shared.js';\n\n/** Zod schema for `id.sifa.profile.honor` records. */\nexport const ProfileHonorRecordSchema = z.object({\n title: z.string().min(1).refine(maxGraphemes(200)).max(2000),\n issuer: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n issuerDid: didSchema.optional(),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n awardedAt: datetimeSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileHonorRecord = z.infer<typeof ProfileHonorRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, maxGraphemes } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.profile.language` records.\n *\n * `proficiency` is advisory (`knownValues` in the lexicon) -- known values\n * are the five-level LinkedIn-compatible scale under `id.sifa.defs#*`.\n */\nexport const ProfileLanguageRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(64)).max(640),\n proficiency: z.string().optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileLanguageRecord = z.infer<typeof ProfileLanguageRecordSchema>;\n","import { z } from 'zod';\n\nimport {\n datetimeSchema,\n didSchema,\n maxGraphemes,\n selfLabelsSchema,\n strongRefSchema,\n} from './shared.js';\n\n/** Zod schema for `id.sifa.profile.position` records. */\nexport const ProfilePositionRecordSchema = z.object({\n company: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n companyDid: didSchema.optional(),\n title: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n employmentType: z.string().optional(),\n workplaceType: z.string().optional(),\n location: z.unknown().optional(),\n startedAt: datetimeSchema,\n endedAt: datetimeSchema.optional(),\n skills: z.array(strongRefSchema).max(50).optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfilePositionRecord = z.infer<typeof ProfilePositionRecordSchema>;\n","import { z } from 'zod';\n\nimport {\n datetimeSchema,\n maxGraphemes,\n selfLabelsSchema,\n strongRefSchema,\n uriSchema,\n} from './shared.js';\n\n/** Zod schema for `id.sifa.profile.project` records. */\nexport const ProfileProjectRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n url: uriSchema.optional(),\n position: strongRefSchema.optional(),\n startedAt: datetimeSchema.optional(),\n endedAt: datetimeSchema.optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileProjectRecord = z.infer<typeof ProfileProjectRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes, uriSchema } from './shared.js';\n\n/** Author shape from `id.sifa.profile.publication#author`. */\nexport const PublicationAuthorSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n did: didSchema.optional(),\n});\n\nexport type PublicationAuthor = z.infer<typeof PublicationAuthorSchema>;\n\n/** Zod schema for `id.sifa.profile.publication` records. */\nexport const ProfilePublicationRecordSchema = z.object({\n title: z.string().min(1).refine(maxGraphemes(200)).max(2000),\n publisher: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n url: uriSchema.optional(),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n authors: z.array(PublicationAuthorSchema).max(50).optional(),\n publishedAt: datetimeSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfilePublicationRecord = z.infer<typeof ProfilePublicationRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, languageTagSchema, maxGraphemes, selfLabelsSchema } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.profile.self` records. Singleton (record key `self`).\n *\n * `knownValues` on `openTo` and `preferredWorkplace` are advisory per the\n * lexicon spec -- unknown values are allowed, but documented options live\n * under the `id.sifa.defs#*` namespace.\n */\nexport const ProfileSelfRecordSchema = z.object({\n headline: z.string().refine(maxGraphemes(120)).max(1200).optional(),\n about: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n industry: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n givenName: z.string().refine(maxGraphemes(64)).max(640).optional(),\n familyName: z.string().refine(maxGraphemes(64)).max(640).optional(),\n location: z.unknown().optional(),\n openTo: z.array(z.string()).max(10).optional(),\n preferredWorkplace: z.array(z.string()).max(3).optional(),\n langs: z.array(languageTagSchema).max(3).optional(),\n labels: selfLabelsSchema.optional(),\n discoverable: z.boolean().optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileSelfRecord = z.infer<typeof ProfileSelfRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, maxGraphemes } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.profile.skill` records.\n *\n * `category` is advisory (`knownValues` in the lexicon) -- known values live\n * under `id.sifa.defs#*` but unknown values are accepted.\n */\nexport const ProfileSkillRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(64)).max(640),\n category: z.string().optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileSkillRecord = z.infer<typeof ProfileSkillRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes } from './shared.js';\n\n/** Zod schema for `id.sifa.profile.volunteering` records. */\nexport const ProfileVolunteeringRecordSchema = z.object({\n organization: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n organizationDid: didSchema.optional(),\n role: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n cause: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n startedAt: datetimeSchema.optional(),\n endedAt: datetimeSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileVolunteeringRecord = z.infer<typeof ProfileVolunteeringRecordSchema>;\n","/**\n * Sifa SDK -- public client library for the Sifa AppView on AT Protocol.\n *\n * Pre-1.0: the public API is unstable and may change in any minor release.\n *\n * @see https://github.com/singi-labs/sifa-sdk\n */\n\ndeclare const __SIFA_SDK_VERSION__: string;\n\nexport const SIFA_SDK_VERSION: string = __SIFA_SDK_VERSION__;\n\nexport type {\n ActiveApp,\n Endorsement,\n EndorsementData,\n ExternalAccount,\n ExternalAccountKeytraceClaim,\n FeedItem,\n LanguageProficiency,\n LocationValue,\n PdsProviderInfo,\n Profile,\n ProfileCertification,\n ProfileCourse,\n ProfileEducation,\n ProfileHonor,\n ProfileIndustry,\n ProfileLanguage,\n ProfileLocation,\n ProfileOverrideSource,\n ProfilePosition,\n ProfileProject,\n ProfilePublication,\n ProfileSkill,\n ProfileVolunteering,\n PublicationContributor,\n SkillRef,\n SkillSuggestion,\n TrustStat,\n VerifiedAccount,\n} from './types/index.js';\n\nexport {\n ACTIVITY_TIERS,\n APP_CATEGORIES,\n APP_CATEGORY_IDS,\n APP_CATEGORY_MAP,\n CATEGORY_LABELS,\n CATEGORY_ORDER,\n CONTINENTS,\n COUNTRIES,\n EMPLOYMENT_TYPE_GROUPS,\n EMPLOYMENT_TYPE_LABELS,\n INDUSTRY_OPTIONS,\n OPEN_TO_OPTIONS,\n OPEN_TO_TOKENS,\n OPEN_TO_TOKEN_TO_VALUE,\n OPEN_TO_VALUE_TO_TOKEN,\n categoryForApp,\n findIndustry,\n getActivityTaxonomyVersion,\n getActivityTier,\n getAppCategoryIcon,\n getEmploymentTypeLabel,\n getIndustryLabelKey,\n getLexiconEntry,\n getOpenToLabelKey,\n openToTokenToValue,\n openToValueToToken,\n getTierMeta,\n getWorkplaceTypeLabel,\n isAppCategory,\n isKnownAppId,\n PLATFORM_LABELS,\n PLATFORM_OPTIONS,\n SKILL_CATEGORIES,\n WORKPLACE_TYPE_LABELS,\n WORKPLACE_TYPE_OPTIONS,\n dedupeSkills,\n getContinent,\n getFaviconUrl,\n getPlatformLabel,\n groupSkillsByCategory,\n isKnownPlatform,\n type ActivityTaxonomy,\n type ActivityTier,\n type AppCategoryId,\n type ContinentCode,\n type EmploymentTypeGroup,\n type EmploymentTypeOption,\n type IndustryOption,\n type KnownAppId,\n type LexiconEntry,\n type MergedProfileSkill,\n type OpenToGroup,\n type OpenToOption,\n type PlatformId,\n type SkillCategory,\n type TierMeta,\n type WorkplaceTypeOption,\n} from './taxonomy/index.js';\n\nexport {\n certDateExtractor,\n contrastRatio,\n countryCodeToFlag,\n dateRangeExtractor,\n detectPdsProvider,\n formatDistanceToNow,\n formatLocation,\n formatRelativeTime,\n getDisplayLabel,\n getHandleStem,\n getPdsDisplayName,\n isValidRgbColor,\n lexiconDateExtractor,\n limitCombiningMarks,\n meetsContrastAA,\n parseLocationString,\n pdsProviderFromApi,\n relativeLuminance,\n rgbToString,\n sanitizeDisplayText,\n sanitizeHandleInput,\n singleDateExtractor,\n sortByDateDesc,\n truncateGraphemes,\n type PdsProvider,\n type RgbColor,\n} from './format/index.js';\n\nexport {\n ACTIVITY_VISIBILITY_RULES,\n ADULT_CONTENT_LABELS,\n APP_URL_PATTERNS,\n COLLECTION_TO_APP,\n getAppIdForCollection,\n hasAdultContent,\n isVisibleActivityItem,\n resolveCardUrl,\n type ActivityItemForUrl,\n type ActivityLabel,\n type AdultContentLabel,\n type AppUrlPatterns,\n} from './cards/index.js';\n\nexport {\n PUBLISHERS,\n STANDARD_PUBLISHER_ID,\n getPublisherById,\n getPublisherByHost,\n getPublisherFromSiteUrl,\n type Publisher,\n} from './publishers/index.js';\n\nexport {\n COMPLETENESS_MAX_SCORE,\n completenessPercent,\n completenessScore,\n DIMENSIONS_MAX_SCORE,\n MIN_SKILLS,\n countFilledDimensions,\n dimensionsFromInputs,\n getFilledDimensionsMap,\n pickPrimaryPosition,\n profileToDimensionInputs,\n type DimensionKey,\n type DimensionMap,\n type PrimaryPositionCandidate,\n type ProfileCompletion,\n type ProfileDimensionInputs,\n} from './logic/index.js';\n\nexport {\n AtmosphereFeedItemSchema,\n EndorsementConfirmationRecordSchema,\n EndorsementRecordSchema,\n FEATURE_FLAGS,\n FeatureAllowlistEntrySchema,\n FeedActorSchema,\n FollowFeedItemSchema,\n FollowFeedPageSchema,\n FollowProfilePageSchema,\n FollowProfileSchema,\n GraphFollowRecordSchema,\n ProfileCertificationRecordSchema,\n ProfileCourseRecordSchema,\n ProfileEducationRecordSchema,\n ProfileExternalAccountRecordSchema,\n ProfileHonorRecordSchema,\n ProfileLanguageRecordSchema,\n ProfilePositionRecordSchema,\n ProfileProjectRecordSchema,\n ProfilePublicationRecordSchema,\n ProfileSelfRecordSchema,\n ProfileSkillRecordSchema,\n ProfileVolunteeringRecordSchema,\n PublicationAuthorSchema,\n SifaFeedItemSchema,\n atUriSchema,\n cidSchema,\n datetimeSchema,\n decodeFeedCursor,\n didSchema,\n encodeFeedCursor,\n languageTagSchema,\n makeGraphFollowRecordSchema,\n maxGraphemes,\n selfLabelsSchema,\n strongRefSchema,\n uriSchema,\n type AtmosphereFeedItem,\n type EndorsementConfirmationRecord,\n type EndorsementRecord,\n type FeatureAllowlistEntry,\n type FeatureFlag,\n type FeedActor,\n type FeedCursor,\n type FollowFeedItem,\n type FollowFeedPage,\n type FollowProfileItem,\n type FollowProfilePage,\n type GraphFollowRecord,\n type SifaFeedItem,\n type ProfileCertificationRecord,\n type ProfileCourseRecord,\n type ProfileEducationRecord,\n type ProfileExternalAccountRecord,\n type ProfileHonorRecord,\n type ProfileLanguageRecord,\n type ProfilePositionRecord,\n type ProfileProjectRecord,\n type ProfilePublicationRecord,\n type ProfileSelfRecord,\n type ProfileSkillRecord,\n type ProfileVolunteeringRecord,\n type PublicationAuthor,\n} from './schemas/index.js';\n"]}
|