@pol-studios/db 1.0.53 → 1.0.55
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/{DataLayerContext-DND_nO5a.d.ts → DataLayerContext-C7cJtiO8.d.ts} +1 -1
- package/dist/auth/context.js +4 -4
- package/dist/auth/hooks.js +5 -5
- package/dist/auth/index.js +5 -5
- package/dist/{chunk-FIAXWEBK.js → chunk-7YGDT46S.js} +4 -4
- package/dist/{chunk-D55QGM4P.js → chunk-AA3VUWTP.js} +113 -17
- package/dist/chunk-AA3VUWTP.js.map +1 -0
- package/dist/{chunk-3Q74DK5K.js → chunk-AKCNWHXV.js} +2 -2
- package/dist/{chunk-UJWETW36.js → chunk-AKIRHA4Q.js} +527 -418
- package/dist/chunk-AKIRHA4Q.js.map +1 -0
- package/dist/{chunk-FMYXG4VN.js → chunk-BRFFTGVJ.js} +2 -2
- package/dist/{chunk-YA6MUTA7.js → chunk-FI6JAD5G.js} +3 -3
- package/dist/chunk-JOULSXOI.js +415 -0
- package/dist/chunk-JOULSXOI.js.map +1 -0
- package/dist/{chunk-OKYHI6JG.js → chunk-LF3V3ERS.js} +3 -3
- package/dist/{chunk-FZJX2FZS.js → chunk-OC6S4XFL.js} +10 -18
- package/dist/chunk-OC6S4XFL.js.map +1 -0
- package/dist/{chunk-DP3YEVSX.js → chunk-WILXD5X3.js} +3 -3
- package/dist/{chunk-ZGQ7Q4ZU.js → chunk-WM25QE7E.js} +2 -2
- package/dist/{chunk-WQLIGVQR.js → chunk-WSKBZIEI.js} +4 -1
- package/dist/chunk-WSKBZIEI.js.map +1 -0
- package/dist/chunk-YUX6RGLZ.js +1858 -0
- package/dist/chunk-YUX6RGLZ.js.map +1 -0
- package/dist/{chunk-Z3EJX3VG.js → chunk-Z456IHCB.js} +3 -3
- package/dist/hooks/index.d.ts +2 -2
- package/dist/hooks/index.js +2 -2
- package/dist/{index-bMBDRkMF.d.ts → index-jVYdTeWx.d.ts} +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +13 -13
- package/dist/index.native.d.ts +61 -7
- package/dist/index.native.js +13 -13
- package/dist/index.web.d.ts +6 -6
- package/dist/index.web.js +13 -13
- package/dist/mutation/index.js +3 -3
- package/dist/parser/index.js +3 -3
- package/dist/query/index.js +4 -4
- package/dist/realtime/index.js +3 -3
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.js +4 -4
- package/dist/{useDbCount-BGSlyv-F.d.ts → useDbCount-DHLJzmkO.d.ts} +1 -1
- package/dist/{useResolveFeedback-DLvQD0Wl.d.ts → useResolveFeedback-B0UcYWVI.d.ts} +3 -3
- package/dist/with-auth/index.js +7 -7
- package/package.json +5 -3
- package/dist/chunk-CTRY7JDP.js +0 -4112
- package/dist/chunk-CTRY7JDP.js.map +0 -1
- package/dist/chunk-D55QGM4P.js.map +0 -1
- package/dist/chunk-FZJX2FZS.js.map +0 -1
- package/dist/chunk-INEUG6MC.js +0 -521
- package/dist/chunk-INEUG6MC.js.map +0 -1
- package/dist/chunk-UJWETW36.js.map +0 -1
- package/dist/chunk-WQLIGVQR.js.map +0 -1
- /package/dist/{chunk-FIAXWEBK.js.map → chunk-7YGDT46S.js.map} +0 -0
- /package/dist/{chunk-3Q74DK5K.js.map → chunk-AKCNWHXV.js.map} +0 -0
- /package/dist/{chunk-FMYXG4VN.js.map → chunk-BRFFTGVJ.js.map} +0 -0
- /package/dist/{chunk-YA6MUTA7.js.map → chunk-FI6JAD5G.js.map} +0 -0
- /package/dist/{chunk-OKYHI6JG.js.map → chunk-LF3V3ERS.js.map} +0 -0
- /package/dist/{chunk-DP3YEVSX.js.map → chunk-WILXD5X3.js.map} +0 -0
- /package/dist/{chunk-ZGQ7Q4ZU.js.map → chunk-WM25QE7E.js.map} +0 -0
- /package/dist/{chunk-Z3EJX3VG.js.map → chunk-Z456IHCB.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../node_modules/.pnpm/xregexp@5.1.1/node_modules/xregexp/tools/output/categories.js","../../../../node_modules/.pnpm/xregexp@5.1.1/node_modules/xregexp/tools/output/properties.js","../../../../node_modules/.pnpm/xregexp@5.1.1/node_modules/xregexp/tools/output/scripts.js","../../../../node_modules/.pnpm/xregexp@5.1.1/node_modules/xregexp/src/xregexp.js","../../../../node_modules/.pnpm/xregexp@5.1.1/node_modules/xregexp/src/addons/build.js","../../../../node_modules/.pnpm/xregexp@5.1.1/node_modules/xregexp/src/addons/matchrecursive.js","../../../../node_modules/.pnpm/xregexp@5.1.1/node_modules/xregexp/src/addons/unicode-base.js","../../../../node_modules/.pnpm/xregexp@5.1.1/node_modules/xregexp/src/addons/unicode-categories.js","../../../../node_modules/.pnpm/xregexp@5.1.1/node_modules/xregexp/src/addons/unicode-properties.js","../../../../node_modules/.pnpm/xregexp@5.1.1/node_modules/xregexp/src/addons/unicode-scripts.js","../../../../node_modules/.pnpm/xregexp@5.1.1/node_modules/xregexp/src/index.js","../../../../node_modules/.pnpm/is-what@4.1.16/node_modules/is-what/dist/index.js","../../../../node_modules/.pnpm/merge-anything@5.1.7/node_modules/merge-anything/dist/index.js","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/query-types.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/extract-paths-from-filter.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/remove-first-path-element.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/group-paths-recursive.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/parse-select-param.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/remove-alias-from-declaration.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/fetch/build-select-statement.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/fetch/dedupe.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/fetch/build-normalized-query.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/fetch/build-mutation-fetcher-response.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/get.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/is-plain-object.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/get-table-from-url.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/like-query-builder.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/get-table.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/cache-data-types.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/response-types.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/encode-object.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/sort-search-param.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/is-postgrest-builder.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/is-postgrest-transform-builder.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/set-filter-value.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/is-iso-date-string.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/parse-value.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/parse-order-by-key.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/parse-order-by.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/find-filters.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/cursor-pagination-fetcher.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/delete-fetcher.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/mutate/should-revalidate-relation.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/mutate/should-revalidate-table.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/mutate/transformers.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/delete-item.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/fetcher.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/insert-fetcher.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/binary-search.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/if-date-get-time.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/sorted-comparator.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/find-index-ordered.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/mutate-item.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/offset-pagination-fetcher.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/filter/denormalize.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/filter-filter-definitions-by-paths.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/is-object.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/like-postgrest-builder.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/operators.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/find-last-index.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/lib/is-not-null.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/postgrest-query-parser.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/postgrest-filter.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/postgrest-parser.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/update-fetcher.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/upsert-fetcher.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/upsert-item.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-core@0.12.3_patch_hash=pk7qqc22n5ajzpk5ax7g6nuane_@supabase+postgrest-js@2.81.1/node_modules/@supabase-cache-helpers/postgrest-core/src/revalidate-tables.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/cache/use-delete-item.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/lib/use-postgrest-filter-cache.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/lib/key.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/lib/use-queries-for-table-loader.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/cache/use-mutate-item.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/cache/use-revalidate-tables.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/cache/use-upsert-item.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/mutate/use-delete-many-mutation.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/mutate/use-delete-mutation.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/mutate/use-insert-mutation.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/mutate/get-user-response.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/mutate/use-update-mutation.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/mutate/use-upsert-mutation.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/query/build-query-opts.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/query/fetch.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/query/prefetch.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/query/use-query.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/subscribe/use-subscription-query.ts","../../../../node_modules/.pnpm/@supabase-cache-helpers+postgrest-react-query@1.13.6_@supabase+postgrest-js@2.81.1_@tanstack+_yc5q7qvczk7zvppefoodrwog4i/node_modules/@supabase-cache-helpers/postgrest-react-query/src/subscribe/use-subscription.ts"],"sourcesContent":["module.exports = [\n {\n 'name': 'C',\n 'alias': 'Other',\n 'isBmpLast': true,\n 'bmp': '\\0-\\x1F\\x7F-\\x9F\\xAD\\u0378\\u0379\\u0380-\\u0383\\u038B\\u038D\\u03A2\\u0530\\u0557\\u0558\\u058B\\u058C\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EE\\u05F5-\\u0605\\u061C\\u06DD\\u070E\\u070F\\u074B\\u074C\\u07B2-\\u07BF\\u07FB\\u07FC\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F\\u086B-\\u086F\\u088F-\\u0897\\u08E2\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FF\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A77-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0AF8\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B54\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0BFF\\u0C0D\\u0C11\\u0C29\\u0C3A\\u0C3B\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5B\\u0C5C\\u0C5E\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C76\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDC\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0CFF\\u0D0D\\u0D11\\u0D45\\u0D49\\u0D50-\\u0D53\\u0D64\\u0D65\\u0D80\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DE5\\u0DF0\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E8B\\u0EA4\\u0EA6\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F6\\u13F7\\u13FE\\u13FF\\u169D-\\u169F\\u16F9-\\u16FF\\u1716-\\u171E\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180E\\u181A-\\u181F\\u1879-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE\\u1AAF\\u1ACF-\\u1AFF\\u1B4D-\\u1B4F\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C89-\\u1C8F\\u1CBB\\u1CBC\\u1CC8-\\u1CCF\\u1CFB-\\u1CFF\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20C1-\\u20CF\\u20F1-\\u20FF\\u218C-\\u218F\\u2427-\\u243F\\u244B-\\u245F\\u2B74\\u2B75\\u2B96\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E5E-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u3130\\u318F\\u31E4-\\u31EF\\u321F\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA6F8-\\uA6FF\\uA7CB-\\uA7CF\\uA7D2\\uA7D4\\uA7DA-\\uA7F1\\uA82D-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C6-\\uA8CD\\uA8DA-\\uA8DF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F\\uAB6C-\\uAB6F\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uF8FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC3-\\uFBD2\\uFD90\\uFD91\\uFDC8-\\uFDCE\\uFDD0-\\uFDEF\\uFE1A-\\uFE1F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD-\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFFB\\uFFFE\\uFFFF',\n 'astral': '\\uD800[\\uDC0C\\uDC27\\uDC3B\\uDC3E\\uDC4E\\uDC4F\\uDC5E-\\uDC7F\\uDCFB-\\uDCFF\\uDD03-\\uDD06\\uDD34-\\uDD36\\uDD8F\\uDD9D-\\uDD9F\\uDDA1-\\uDDCF\\uDDFE-\\uDE7F\\uDE9D-\\uDE9F\\uDED1-\\uDEDF\\uDEFC-\\uDEFF\\uDF24-\\uDF2C\\uDF4B-\\uDF4F\\uDF7B-\\uDF7F\\uDF9E\\uDFC4-\\uDFC7\\uDFD6-\\uDFFF]|\\uD801[\\uDC9E\\uDC9F\\uDCAA-\\uDCAF\\uDCD4-\\uDCD7\\uDCFC-\\uDCFF\\uDD28-\\uDD2F\\uDD64-\\uDD6E\\uDD7B\\uDD8B\\uDD93\\uDD96\\uDDA2\\uDDB2\\uDDBA\\uDDBD-\\uDDFF\\uDF37-\\uDF3F\\uDF56-\\uDF5F\\uDF68-\\uDF7F\\uDF86\\uDFB1\\uDFBB-\\uDFFF]|\\uD802[\\uDC06\\uDC07\\uDC09\\uDC36\\uDC39-\\uDC3B\\uDC3D\\uDC3E\\uDC56\\uDC9F-\\uDCA6\\uDCB0-\\uDCDF\\uDCF3\\uDCF6-\\uDCFA\\uDD1C-\\uDD1E\\uDD3A-\\uDD3E\\uDD40-\\uDD7F\\uDDB8-\\uDDBB\\uDDD0\\uDDD1\\uDE04\\uDE07-\\uDE0B\\uDE14\\uDE18\\uDE36\\uDE37\\uDE3B-\\uDE3E\\uDE49-\\uDE4F\\uDE59-\\uDE5F\\uDEA0-\\uDEBF\\uDEE7-\\uDEEA\\uDEF7-\\uDEFF\\uDF36-\\uDF38\\uDF56\\uDF57\\uDF73-\\uDF77\\uDF92-\\uDF98\\uDF9D-\\uDFA8\\uDFB0-\\uDFFF]|\\uD803[\\uDC49-\\uDC7F\\uDCB3-\\uDCBF\\uDCF3-\\uDCF9\\uDD28-\\uDD2F\\uDD3A-\\uDE5F\\uDE7F\\uDEAA\\uDEAE\\uDEAF\\uDEB2-\\uDEFF\\uDF28-\\uDF2F\\uDF5A-\\uDF6F\\uDF8A-\\uDFAF\\uDFCC-\\uDFDF\\uDFF7-\\uDFFF]|\\uD804[\\uDC4E-\\uDC51\\uDC76-\\uDC7E\\uDCBD\\uDCC3-\\uDCCF\\uDCE9-\\uDCEF\\uDCFA-\\uDCFF\\uDD35\\uDD48-\\uDD4F\\uDD77-\\uDD7F\\uDDE0\\uDDF5-\\uDDFF\\uDE12\\uDE3F-\\uDE7F\\uDE87\\uDE89\\uDE8E\\uDE9E\\uDEAA-\\uDEAF\\uDEEB-\\uDEEF\\uDEFA-\\uDEFF\\uDF04\\uDF0D\\uDF0E\\uDF11\\uDF12\\uDF29\\uDF31\\uDF34\\uDF3A\\uDF45\\uDF46\\uDF49\\uDF4A\\uDF4E\\uDF4F\\uDF51-\\uDF56\\uDF58-\\uDF5C\\uDF64\\uDF65\\uDF6D-\\uDF6F\\uDF75-\\uDFFF]|\\uD805[\\uDC5C\\uDC62-\\uDC7F\\uDCC8-\\uDCCF\\uDCDA-\\uDD7F\\uDDB6\\uDDB7\\uDDDE-\\uDDFF\\uDE45-\\uDE4F\\uDE5A-\\uDE5F\\uDE6D-\\uDE7F\\uDEBA-\\uDEBF\\uDECA-\\uDEFF\\uDF1B\\uDF1C\\uDF2C-\\uDF2F\\uDF47-\\uDFFF]|\\uD806[\\uDC3C-\\uDC9F\\uDCF3-\\uDCFE\\uDD07\\uDD08\\uDD0A\\uDD0B\\uDD14\\uDD17\\uDD36\\uDD39\\uDD3A\\uDD47-\\uDD4F\\uDD5A-\\uDD9F\\uDDA8\\uDDA9\\uDDD8\\uDDD9\\uDDE5-\\uDDFF\\uDE48-\\uDE4F\\uDEA3-\\uDEAF\\uDEF9-\\uDFFF]|\\uD807[\\uDC09\\uDC37\\uDC46-\\uDC4F\\uDC6D-\\uDC6F\\uDC90\\uDC91\\uDCA8\\uDCB7-\\uDCFF\\uDD07\\uDD0A\\uDD37-\\uDD39\\uDD3B\\uDD3E\\uDD48-\\uDD4F\\uDD5A-\\uDD5F\\uDD66\\uDD69\\uDD8F\\uDD92\\uDD99-\\uDD9F\\uDDAA-\\uDEDF\\uDEF9-\\uDFAF\\uDFB1-\\uDFBF\\uDFF2-\\uDFFE]|\\uD808[\\uDF9A-\\uDFFF]|\\uD809[\\uDC6F\\uDC75-\\uDC7F\\uDD44-\\uDFFF]|[\\uD80A\\uD80E-\\uD810\\uD812-\\uD819\\uD824-\\uD82A\\uD82D\\uD82E\\uD830-\\uD832\\uD83F\\uD87B-\\uD87D\\uD87F\\uD885-\\uDB3F\\uDB41-\\uDBFF][\\uDC00-\\uDFFF]|\\uD80B[\\uDC00-\\uDF8F\\uDFF3-\\uDFFF]|\\uD80D[\\uDC2F-\\uDFFF]|\\uD811[\\uDE47-\\uDFFF]|\\uD81A[\\uDE39-\\uDE3F\\uDE5F\\uDE6A-\\uDE6D\\uDEBF\\uDECA-\\uDECF\\uDEEE\\uDEEF\\uDEF6-\\uDEFF\\uDF46-\\uDF4F\\uDF5A\\uDF62\\uDF78-\\uDF7C\\uDF90-\\uDFFF]|\\uD81B[\\uDC00-\\uDE3F\\uDE9B-\\uDEFF\\uDF4B-\\uDF4E\\uDF88-\\uDF8E\\uDFA0-\\uDFDF\\uDFE5-\\uDFEF\\uDFF2-\\uDFFF]|\\uD821[\\uDFF8-\\uDFFF]|\\uD823[\\uDCD6-\\uDCFF\\uDD09-\\uDFFF]|\\uD82B[\\uDC00-\\uDFEF\\uDFF4\\uDFFC\\uDFFF]|\\uD82C[\\uDD23-\\uDD4F\\uDD53-\\uDD63\\uDD68-\\uDD6F\\uDEFC-\\uDFFF]|\\uD82F[\\uDC6B-\\uDC6F\\uDC7D-\\uDC7F\\uDC89-\\uDC8F\\uDC9A\\uDC9B\\uDCA0-\\uDFFF]|\\uD833[\\uDC00-\\uDEFF\\uDF2E\\uDF2F\\uDF47-\\uDF4F\\uDFC4-\\uDFFF]|\\uD834[\\uDCF6-\\uDCFF\\uDD27\\uDD28\\uDD73-\\uDD7A\\uDDEB-\\uDDFF\\uDE46-\\uDEDF\\uDEF4-\\uDEFF\\uDF57-\\uDF5F\\uDF79-\\uDFFF]|\\uD835[\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]|\\uD836[\\uDE8C-\\uDE9A\\uDEA0\\uDEB0-\\uDFFF]|\\uD837[\\uDC00-\\uDEFF\\uDF1F-\\uDFFF]|\\uD838[\\uDC07\\uDC19\\uDC1A\\uDC22\\uDC25\\uDC2B-\\uDCFF\\uDD2D-\\uDD2F\\uDD3E\\uDD3F\\uDD4A-\\uDD4D\\uDD50-\\uDE8F\\uDEAF-\\uDEBF\\uDEFA-\\uDEFE\\uDF00-\\uDFFF]|\\uD839[\\uDC00-\\uDFDF\\uDFE7\\uDFEC\\uDFEF\\uDFFF]|\\uD83A[\\uDCC5\\uDCC6\\uDCD7-\\uDCFF\\uDD4C-\\uDD4F\\uDD5A-\\uDD5D\\uDD60-\\uDFFF]|\\uD83B[\\uDC00-\\uDC70\\uDCB5-\\uDD00\\uDD3E-\\uDDFF\\uDE04\\uDE20\\uDE23\\uDE25\\uDE26\\uDE28\\uDE33\\uDE38\\uDE3A\\uDE3C-\\uDE41\\uDE43-\\uDE46\\uDE48\\uDE4A\\uDE4C\\uDE50\\uDE53\\uDE55\\uDE56\\uDE58\\uDE5A\\uDE5C\\uDE5E\\uDE60\\uDE63\\uDE65\\uDE66\\uDE6B\\uDE73\\uDE78\\uDE7D\\uDE7F\\uDE8A\\uDE9C-\\uDEA0\\uDEA4\\uDEAA\\uDEBC-\\uDEEF\\uDEF2-\\uDFFF]|\\uD83C[\\uDC2C-\\uDC2F\\uDC94-\\uDC9F\\uDCAF\\uDCB0\\uDCC0\\uDCD0\\uDCF6-\\uDCFF\\uDDAE-\\uDDE5\\uDE03-\\uDE0F\\uDE3C-\\uDE3F\\uDE49-\\uDE4F\\uDE52-\\uDE5F\\uDE66-\\uDEFF]|\\uD83D[\\uDED8-\\uDEDC\\uDEED-\\uDEEF\\uDEFD-\\uDEFF\\uDF74-\\uDF7F\\uDFD9-\\uDFDF\\uDFEC-\\uDFEF\\uDFF1-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE\\uDCAF\\uDCB2-\\uDCFF\\uDE54-\\uDE5F\\uDE6E\\uDE6F\\uDE75-\\uDE77\\uDE7D-\\uDE7F\\uDE87-\\uDE8F\\uDEAD-\\uDEAF\\uDEBB-\\uDEBF\\uDEC6-\\uDECF\\uDEDA-\\uDEDF\\uDEE8-\\uDEEF\\uDEF7-\\uDEFF\\uDF93\\uDFCB-\\uDFEF\\uDFFA-\\uDFFF]|\\uD869[\\uDEE0-\\uDEFF]|\\uD86D[\\uDF39-\\uDF3F]|\\uD86E[\\uDC1E\\uDC1F]|\\uD873[\\uDEA2-\\uDEAF]|\\uD87A[\\uDFE1-\\uDFFF]|\\uD87E[\\uDE1E-\\uDFFF]|\\uD884[\\uDF4B-\\uDFFF]|\\uDB40[\\uDC00-\\uDCFF\\uDDF0-\\uDFFF]'\n },\n {\n 'name': 'Cc',\n 'alias': 'Control',\n 'bmp': '\\0-\\x1F\\x7F-\\x9F'\n },\n {\n 'name': 'Cf',\n 'alias': 'Format',\n 'bmp': '\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u0890\\u0891\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB',\n 'astral': '\\uD804[\\uDCBD\\uDCCD]|\\uD80D[\\uDC30-\\uDC38]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]'\n },\n {\n 'name': 'Cn',\n 'alias': 'Unassigned',\n 'bmp': '\\u0378\\u0379\\u0380-\\u0383\\u038B\\u038D\\u03A2\\u0530\\u0557\\u0558\\u058B\\u058C\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EE\\u05F5-\\u05FF\\u070E\\u074B\\u074C\\u07B2-\\u07BF\\u07FB\\u07FC\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F\\u086B-\\u086F\\u088F\\u0892-\\u0897\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FF\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A77-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0AF8\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B54\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0BFF\\u0C0D\\u0C11\\u0C29\\u0C3A\\u0C3B\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5B\\u0C5C\\u0C5E\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C76\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDC\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0CFF\\u0D0D\\u0D11\\u0D45\\u0D49\\u0D50-\\u0D53\\u0D64\\u0D65\\u0D80\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DE5\\u0DF0\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E8B\\u0EA4\\u0EA6\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F6\\u13F7\\u13FE\\u13FF\\u169D-\\u169F\\u16F9-\\u16FF\\u1716-\\u171E\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u181A-\\u181F\\u1879-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE\\u1AAF\\u1ACF-\\u1AFF\\u1B4D-\\u1B4F\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C89-\\u1C8F\\u1CBB\\u1CBC\\u1CC8-\\u1CCF\\u1CFB-\\u1CFF\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u2065\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20C1-\\u20CF\\u20F1-\\u20FF\\u218C-\\u218F\\u2427-\\u243F\\u244B-\\u245F\\u2B74\\u2B75\\u2B96\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E5E-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u3130\\u318F\\u31E4-\\u31EF\\u321F\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA6F8-\\uA6FF\\uA7CB-\\uA7CF\\uA7D2\\uA7D4\\uA7DA-\\uA7F1\\uA82D-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C6-\\uA8CD\\uA8DA-\\uA8DF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F\\uAB6C-\\uAB6F\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uD7FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC3-\\uFBD2\\uFD90\\uFD91\\uFDC8-\\uFDCE\\uFDD0-\\uFDEF\\uFE1A-\\uFE1F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD\\uFEFE\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFF8\\uFFFE\\uFFFF',\n 'astral': '\\uD800[\\uDC0C\\uDC27\\uDC3B\\uDC3E\\uDC4E\\uDC4F\\uDC5E-\\uDC7F\\uDCFB-\\uDCFF\\uDD03-\\uDD06\\uDD34-\\uDD36\\uDD8F\\uDD9D-\\uDD9F\\uDDA1-\\uDDCF\\uDDFE-\\uDE7F\\uDE9D-\\uDE9F\\uDED1-\\uDEDF\\uDEFC-\\uDEFF\\uDF24-\\uDF2C\\uDF4B-\\uDF4F\\uDF7B-\\uDF7F\\uDF9E\\uDFC4-\\uDFC7\\uDFD6-\\uDFFF]|\\uD801[\\uDC9E\\uDC9F\\uDCAA-\\uDCAF\\uDCD4-\\uDCD7\\uDCFC-\\uDCFF\\uDD28-\\uDD2F\\uDD64-\\uDD6E\\uDD7B\\uDD8B\\uDD93\\uDD96\\uDDA2\\uDDB2\\uDDBA\\uDDBD-\\uDDFF\\uDF37-\\uDF3F\\uDF56-\\uDF5F\\uDF68-\\uDF7F\\uDF86\\uDFB1\\uDFBB-\\uDFFF]|\\uD802[\\uDC06\\uDC07\\uDC09\\uDC36\\uDC39-\\uDC3B\\uDC3D\\uDC3E\\uDC56\\uDC9F-\\uDCA6\\uDCB0-\\uDCDF\\uDCF3\\uDCF6-\\uDCFA\\uDD1C-\\uDD1E\\uDD3A-\\uDD3E\\uDD40-\\uDD7F\\uDDB8-\\uDDBB\\uDDD0\\uDDD1\\uDE04\\uDE07-\\uDE0B\\uDE14\\uDE18\\uDE36\\uDE37\\uDE3B-\\uDE3E\\uDE49-\\uDE4F\\uDE59-\\uDE5F\\uDEA0-\\uDEBF\\uDEE7-\\uDEEA\\uDEF7-\\uDEFF\\uDF36-\\uDF38\\uDF56\\uDF57\\uDF73-\\uDF77\\uDF92-\\uDF98\\uDF9D-\\uDFA8\\uDFB0-\\uDFFF]|\\uD803[\\uDC49-\\uDC7F\\uDCB3-\\uDCBF\\uDCF3-\\uDCF9\\uDD28-\\uDD2F\\uDD3A-\\uDE5F\\uDE7F\\uDEAA\\uDEAE\\uDEAF\\uDEB2-\\uDEFF\\uDF28-\\uDF2F\\uDF5A-\\uDF6F\\uDF8A-\\uDFAF\\uDFCC-\\uDFDF\\uDFF7-\\uDFFF]|\\uD804[\\uDC4E-\\uDC51\\uDC76-\\uDC7E\\uDCC3-\\uDCCC\\uDCCE\\uDCCF\\uDCE9-\\uDCEF\\uDCFA-\\uDCFF\\uDD35\\uDD48-\\uDD4F\\uDD77-\\uDD7F\\uDDE0\\uDDF5-\\uDDFF\\uDE12\\uDE3F-\\uDE7F\\uDE87\\uDE89\\uDE8E\\uDE9E\\uDEAA-\\uDEAF\\uDEEB-\\uDEEF\\uDEFA-\\uDEFF\\uDF04\\uDF0D\\uDF0E\\uDF11\\uDF12\\uDF29\\uDF31\\uDF34\\uDF3A\\uDF45\\uDF46\\uDF49\\uDF4A\\uDF4E\\uDF4F\\uDF51-\\uDF56\\uDF58-\\uDF5C\\uDF64\\uDF65\\uDF6D-\\uDF6F\\uDF75-\\uDFFF]|\\uD805[\\uDC5C\\uDC62-\\uDC7F\\uDCC8-\\uDCCF\\uDCDA-\\uDD7F\\uDDB6\\uDDB7\\uDDDE-\\uDDFF\\uDE45-\\uDE4F\\uDE5A-\\uDE5F\\uDE6D-\\uDE7F\\uDEBA-\\uDEBF\\uDECA-\\uDEFF\\uDF1B\\uDF1C\\uDF2C-\\uDF2F\\uDF47-\\uDFFF]|\\uD806[\\uDC3C-\\uDC9F\\uDCF3-\\uDCFE\\uDD07\\uDD08\\uDD0A\\uDD0B\\uDD14\\uDD17\\uDD36\\uDD39\\uDD3A\\uDD47-\\uDD4F\\uDD5A-\\uDD9F\\uDDA8\\uDDA9\\uDDD8\\uDDD9\\uDDE5-\\uDDFF\\uDE48-\\uDE4F\\uDEA3-\\uDEAF\\uDEF9-\\uDFFF]|\\uD807[\\uDC09\\uDC37\\uDC46-\\uDC4F\\uDC6D-\\uDC6F\\uDC90\\uDC91\\uDCA8\\uDCB7-\\uDCFF\\uDD07\\uDD0A\\uDD37-\\uDD39\\uDD3B\\uDD3E\\uDD48-\\uDD4F\\uDD5A-\\uDD5F\\uDD66\\uDD69\\uDD8F\\uDD92\\uDD99-\\uDD9F\\uDDAA-\\uDEDF\\uDEF9-\\uDFAF\\uDFB1-\\uDFBF\\uDFF2-\\uDFFE]|\\uD808[\\uDF9A-\\uDFFF]|\\uD809[\\uDC6F\\uDC75-\\uDC7F\\uDD44-\\uDFFF]|[\\uD80A\\uD80E-\\uD810\\uD812-\\uD819\\uD824-\\uD82A\\uD82D\\uD82E\\uD830-\\uD832\\uD83F\\uD87B-\\uD87D\\uD87F\\uD885-\\uDB3F\\uDB41-\\uDB7F][\\uDC00-\\uDFFF]|\\uD80B[\\uDC00-\\uDF8F\\uDFF3-\\uDFFF]|\\uD80D[\\uDC2F\\uDC39-\\uDFFF]|\\uD811[\\uDE47-\\uDFFF]|\\uD81A[\\uDE39-\\uDE3F\\uDE5F\\uDE6A-\\uDE6D\\uDEBF\\uDECA-\\uDECF\\uDEEE\\uDEEF\\uDEF6-\\uDEFF\\uDF46-\\uDF4F\\uDF5A\\uDF62\\uDF78-\\uDF7C\\uDF90-\\uDFFF]|\\uD81B[\\uDC00-\\uDE3F\\uDE9B-\\uDEFF\\uDF4B-\\uDF4E\\uDF88-\\uDF8E\\uDFA0-\\uDFDF\\uDFE5-\\uDFEF\\uDFF2-\\uDFFF]|\\uD821[\\uDFF8-\\uDFFF]|\\uD823[\\uDCD6-\\uDCFF\\uDD09-\\uDFFF]|\\uD82B[\\uDC00-\\uDFEF\\uDFF4\\uDFFC\\uDFFF]|\\uD82C[\\uDD23-\\uDD4F\\uDD53-\\uDD63\\uDD68-\\uDD6F\\uDEFC-\\uDFFF]|\\uD82F[\\uDC6B-\\uDC6F\\uDC7D-\\uDC7F\\uDC89-\\uDC8F\\uDC9A\\uDC9B\\uDCA4-\\uDFFF]|\\uD833[\\uDC00-\\uDEFF\\uDF2E\\uDF2F\\uDF47-\\uDF4F\\uDFC4-\\uDFFF]|\\uD834[\\uDCF6-\\uDCFF\\uDD27\\uDD28\\uDDEB-\\uDDFF\\uDE46-\\uDEDF\\uDEF4-\\uDEFF\\uDF57-\\uDF5F\\uDF79-\\uDFFF]|\\uD835[\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]|\\uD836[\\uDE8C-\\uDE9A\\uDEA0\\uDEB0-\\uDFFF]|\\uD837[\\uDC00-\\uDEFF\\uDF1F-\\uDFFF]|\\uD838[\\uDC07\\uDC19\\uDC1A\\uDC22\\uDC25\\uDC2B-\\uDCFF\\uDD2D-\\uDD2F\\uDD3E\\uDD3F\\uDD4A-\\uDD4D\\uDD50-\\uDE8F\\uDEAF-\\uDEBF\\uDEFA-\\uDEFE\\uDF00-\\uDFFF]|\\uD839[\\uDC00-\\uDFDF\\uDFE7\\uDFEC\\uDFEF\\uDFFF]|\\uD83A[\\uDCC5\\uDCC6\\uDCD7-\\uDCFF\\uDD4C-\\uDD4F\\uDD5A-\\uDD5D\\uDD60-\\uDFFF]|\\uD83B[\\uDC00-\\uDC70\\uDCB5-\\uDD00\\uDD3E-\\uDDFF\\uDE04\\uDE20\\uDE23\\uDE25\\uDE26\\uDE28\\uDE33\\uDE38\\uDE3A\\uDE3C-\\uDE41\\uDE43-\\uDE46\\uDE48\\uDE4A\\uDE4C\\uDE50\\uDE53\\uDE55\\uDE56\\uDE58\\uDE5A\\uDE5C\\uDE5E\\uDE60\\uDE63\\uDE65\\uDE66\\uDE6B\\uDE73\\uDE78\\uDE7D\\uDE7F\\uDE8A\\uDE9C-\\uDEA0\\uDEA4\\uDEAA\\uDEBC-\\uDEEF\\uDEF2-\\uDFFF]|\\uD83C[\\uDC2C-\\uDC2F\\uDC94-\\uDC9F\\uDCAF\\uDCB0\\uDCC0\\uDCD0\\uDCF6-\\uDCFF\\uDDAE-\\uDDE5\\uDE03-\\uDE0F\\uDE3C-\\uDE3F\\uDE49-\\uDE4F\\uDE52-\\uDE5F\\uDE66-\\uDEFF]|\\uD83D[\\uDED8-\\uDEDC\\uDEED-\\uDEEF\\uDEFD-\\uDEFF\\uDF74-\\uDF7F\\uDFD9-\\uDFDF\\uDFEC-\\uDFEF\\uDFF1-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE\\uDCAF\\uDCB2-\\uDCFF\\uDE54-\\uDE5F\\uDE6E\\uDE6F\\uDE75-\\uDE77\\uDE7D-\\uDE7F\\uDE87-\\uDE8F\\uDEAD-\\uDEAF\\uDEBB-\\uDEBF\\uDEC6-\\uDECF\\uDEDA-\\uDEDF\\uDEE8-\\uDEEF\\uDEF7-\\uDEFF\\uDF93\\uDFCB-\\uDFEF\\uDFFA-\\uDFFF]|\\uD869[\\uDEE0-\\uDEFF]|\\uD86D[\\uDF39-\\uDF3F]|\\uD86E[\\uDC1E\\uDC1F]|\\uD873[\\uDEA2-\\uDEAF]|\\uD87A[\\uDFE1-\\uDFFF]|\\uD87E[\\uDE1E-\\uDFFF]|\\uD884[\\uDF4B-\\uDFFF]|\\uDB40[\\uDC00\\uDC02-\\uDC1F\\uDC80-\\uDCFF\\uDDF0-\\uDFFF]|[\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]'\n },\n {\n 'name': 'Co',\n 'alias': 'Private_Use',\n 'bmp': '\\uE000-\\uF8FF',\n 'astral': '[\\uDB80-\\uDBBE\\uDBC0-\\uDBFE][\\uDC00-\\uDFFF]|[\\uDBBF\\uDBFF][\\uDC00-\\uDFFD]'\n },\n {\n 'name': 'Cs',\n 'alias': 'Surrogate',\n 'bmp': '\\uD800-\\uDFFF'\n },\n {\n 'name': 'L',\n 'alias': 'Letter',\n 'bmp': 'A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05D0-\\u05EA\\u05EF-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u0870-\\u0887\\u0889-\\u088E\\u08A0-\\u08C9\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C5D\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D04-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u1711\\u171F-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1878\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4C\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1CFA\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312F\\u3131-\\u318E\\u31A0-\\u31BF\\u31F0-\\u31FF\\u3400-\\u4DBF\\u4E00-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7CA\\uA7D0\\uA7D1\\uA7D3\\uA7D5-\\uA7D9\\uA7F2-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA8FE\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB69\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n 'astral': '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF2D-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDD70-\\uDD7A\\uDD7C-\\uDD8A\\uDD8C-\\uDD92\\uDD94\\uDD95\\uDD97-\\uDDA1\\uDDA3-\\uDDB1\\uDDB3-\\uDDB9\\uDDBB\\uDDBC\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67\\uDF80-\\uDF85\\uDF87-\\uDFB0\\uDFB2-\\uDFBA]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE35\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDD00-\\uDD23\\uDE80-\\uDEA9\\uDEB0\\uDEB1\\uDF00-\\uDF1C\\uDF27\\uDF30-\\uDF45\\uDF70-\\uDF81\\uDFB0-\\uDFC4\\uDFE0-\\uDFF6]|\\uD804[\\uDC03-\\uDC37\\uDC71\\uDC72\\uDC75\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD44\\uDD47\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC5F-\\uDC61\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDEB8\\uDF00-\\uDF1A\\uDF40-\\uDF46]|\\uD806[\\uDC00-\\uDC2B\\uDCA0-\\uDCDF\\uDCFF-\\uDD06\\uDD09\\uDD0C-\\uDD13\\uDD15\\uDD16\\uDD18-\\uDD2F\\uDD3F\\uDD41\\uDDA0-\\uDDA7\\uDDAA-\\uDDD0\\uDDE1\\uDDE3\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE89\\uDE9D\\uDEB0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46\\uDD60-\\uDD65\\uDD67\\uDD68\\uDD6A-\\uDD89\\uDD98\\uDEE0-\\uDEF2\\uDFB0]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|\\uD80B[\\uDF90-\\uDFF0]|[\\uD80C\\uD81C-\\uD820\\uD822\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879\\uD880-\\uD883][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE70-\\uDEBE\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDE40-\\uDE7F\\uDF00-\\uDF4A\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1\\uDFE3]|\\uD821[\\uDC00-\\uDFF7]|\\uD823[\\uDC00-\\uDCD5\\uDD00-\\uDD08]|\\uD82B[\\uDFF0-\\uDFF3\\uDFF5-\\uDFFB\\uDFFD\\uDFFE]|\\uD82C[\\uDC00-\\uDD22\\uDD50-\\uDD52\\uDD64-\\uDD67\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD837[\\uDF00-\\uDF1E]|\\uD838[\\uDD00-\\uDD2C\\uDD37-\\uDD3D\\uDD4E\\uDE90-\\uDEAD\\uDEC0-\\uDEEB]|\\uD839[\\uDFE0-\\uDFE6\\uDFE8-\\uDFEB\\uDFED\\uDFEE\\uDFF0-\\uDFFE]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43\\uDD4B]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDEDF\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF38\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uD884[\\uDC00-\\uDF4A]'\n },\n {\n 'name': 'LC',\n 'alias': 'Cased_Letter',\n 'bmp': 'A-Za-z\\xB5\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u01BA\\u01BC-\\u01BF\\u01C4-\\u0293\\u0295-\\u02AF\\u0370-\\u0373\\u0376\\u0377\\u037B-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0560-\\u0588\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FD-\\u10FF\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1D00-\\u1D2B\\u1D6B-\\u1D77\\u1D79-\\u1D9A\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2134\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C7B\\u2C7E-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA640-\\uA66D\\uA680-\\uA69B\\uA722-\\uA76F\\uA771-\\uA787\\uA78B-\\uA78E\\uA790-\\uA7CA\\uA7D0\\uA7D1\\uA7D3\\uA7D5-\\uA7D9\\uA7F5\\uA7F6\\uA7FA\\uAB30-\\uAB5A\\uAB60-\\uAB68\\uAB70-\\uABBF\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF21-\\uFF3A\\uFF41-\\uFF5A',\n 'astral': '\\uD801[\\uDC00-\\uDC4F\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD70-\\uDD7A\\uDD7C-\\uDD8A\\uDD8C-\\uDD92\\uDD94\\uDD95\\uDD97-\\uDDA1\\uDDA3-\\uDDB1\\uDDB3-\\uDDB9\\uDDBB\\uDDBC]|\\uD803[\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD806[\\uDCA0-\\uDCDF]|\\uD81B[\\uDE40-\\uDE7F]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD837[\\uDF00-\\uDF09\\uDF0B-\\uDF1E]|\\uD83A[\\uDD00-\\uDD43]'\n },\n {\n 'name': 'Ll',\n 'alias': 'Lowercase_Letter',\n 'bmp': 'a-z\\xB5\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F-\\u0293\\u0295-\\u02AF\\u0371\\u0373\\u0377\\u037B-\\u037D\\u0390\\u03AC-\\u03CE\\u03D0\\u03D1\\u03D5-\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF-\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430-\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0525\\u0527\\u0529\\u052B\\u052D\\u052F\\u0560-\\u0588\\u10D0-\\u10FA\\u10FD-\\u10FF\\u13F8-\\u13FD\\u1C80-\\u1C88\\u1D00-\\u1D2B\\u1D6B-\\u1D77\\u1D79-\\u1D9A\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95-\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF-\\u1F07\\u1F10-\\u1F15\\u1F20-\\u1F27\\u1F30-\\u1F37\\u1F40-\\u1F45\\u1F50-\\u1F57\\u1F60-\\u1F67\\u1F70-\\u1F7D\\u1F80-\\u1F87\\u1F90-\\u1F97\\u1FA0-\\u1FA7\\u1FB0-\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2-\\u1FC4\\u1FC6\\u1FC7\\u1FD0-\\u1FD3\\u1FD6\\u1FD7\\u1FE0-\\u1FE7\\u1FF2-\\u1FF4\\u1FF6\\u1FF7\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146-\\u2149\\u214E\\u2184\\u2C30-\\u2C5F\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76-\\u2C7B\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2CEC\\u2CEE\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA661\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA699\\uA69B\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F-\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F\\uA771-\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uA78E\\uA791\\uA793-\\uA795\\uA797\\uA799\\uA79B\\uA79D\\uA79F\\uA7A1\\uA7A3\\uA7A5\\uA7A7\\uA7A9\\uA7AF\\uA7B5\\uA7B7\\uA7B9\\uA7BB\\uA7BD\\uA7BF\\uA7C1\\uA7C3\\uA7C8\\uA7CA\\uA7D1\\uA7D3\\uA7D5\\uA7D7\\uA7D9\\uA7F6\\uA7FA\\uAB30-\\uAB5A\\uAB60-\\uAB68\\uAB70-\\uABBF\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF41-\\uFF5A',\n 'astral': '\\uD801[\\uDC28-\\uDC4F\\uDCD8-\\uDCFB\\uDD97-\\uDDA1\\uDDA3-\\uDDB1\\uDDB3-\\uDDB9\\uDDBB\\uDDBC]|\\uD803[\\uDCC0-\\uDCF2]|\\uD806[\\uDCC0-\\uDCDF]|\\uD81B[\\uDE60-\\uDE7F]|\\uD835[\\uDC1A-\\uDC33\\uDC4E-\\uDC54\\uDC56-\\uDC67\\uDC82-\\uDC9B\\uDCB6-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDCEA-\\uDD03\\uDD1E-\\uDD37\\uDD52-\\uDD6B\\uDD86-\\uDD9F\\uDDBA-\\uDDD3\\uDDEE-\\uDE07\\uDE22-\\uDE3B\\uDE56-\\uDE6F\\uDE8A-\\uDEA5\\uDEC2-\\uDEDA\\uDEDC-\\uDEE1\\uDEFC-\\uDF14\\uDF16-\\uDF1B\\uDF36-\\uDF4E\\uDF50-\\uDF55\\uDF70-\\uDF88\\uDF8A-\\uDF8F\\uDFAA-\\uDFC2\\uDFC4-\\uDFC9\\uDFCB]|\\uD837[\\uDF00-\\uDF09\\uDF0B-\\uDF1E]|\\uD83A[\\uDD22-\\uDD43]'\n },\n {\n 'name': 'Lm',\n 'alias': 'Modifier_Letter',\n 'bmp': '\\u02B0-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0374\\u037A\\u0559\\u0640\\u06E5\\u06E6\\u07F4\\u07F5\\u07FA\\u081A\\u0824\\u0828\\u08C9\\u0971\\u0E46\\u0EC6\\u10FC\\u17D7\\u1843\\u1AA7\\u1C78-\\u1C7D\\u1D2C-\\u1D6A\\u1D78\\u1D9B-\\u1DBF\\u2071\\u207F\\u2090-\\u209C\\u2C7C\\u2C7D\\u2D6F\\u2E2F\\u3005\\u3031-\\u3035\\u303B\\u309D\\u309E\\u30FC-\\u30FE\\uA015\\uA4F8-\\uA4FD\\uA60C\\uA67F\\uA69C\\uA69D\\uA717-\\uA71F\\uA770\\uA788\\uA7F2-\\uA7F4\\uA7F8\\uA7F9\\uA9CF\\uA9E6\\uAA70\\uAADD\\uAAF3\\uAAF4\\uAB5C-\\uAB5F\\uAB69\\uFF70\\uFF9E\\uFF9F',\n 'astral': '\\uD801[\\uDF80-\\uDF85\\uDF87-\\uDFB0\\uDFB2-\\uDFBA]|\\uD81A[\\uDF40-\\uDF43]|\\uD81B[\\uDF93-\\uDF9F\\uDFE0\\uDFE1\\uDFE3]|\\uD82B[\\uDFF0-\\uDFF3\\uDFF5-\\uDFFB\\uDFFD\\uDFFE]|\\uD838[\\uDD37-\\uDD3D]|\\uD83A\\uDD4B'\n },\n {\n 'name': 'Lo',\n 'alias': 'Other_Letter',\n 'bmp': '\\xAA\\xBA\\u01BB\\u01C0-\\u01C3\\u0294\\u05D0-\\u05EA\\u05EF-\\u05F2\\u0620-\\u063F\\u0641-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u0800-\\u0815\\u0840-\\u0858\\u0860-\\u086A\\u0870-\\u0887\\u0889-\\u088E\\u08A0-\\u08C8\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0972-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C5D\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D04-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E45\\u0E81\\u0E82\\u0E84\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u1100-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u1711\\u171F-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17DC\\u1820-\\u1842\\u1844-\\u1878\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1B05-\\u1B33\\u1B45-\\u1B4C\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C77\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1CFA\\u2135-\\u2138\\u2D30-\\u2D67\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3006\\u303C\\u3041-\\u3096\\u309F\\u30A1-\\u30FA\\u30FF\\u3105-\\u312F\\u3131-\\u318E\\u31A0-\\u31BF\\u31F0-\\u31FF\\u3400-\\u4DBF\\u4E00-\\uA014\\uA016-\\uA48C\\uA4D0-\\uA4F7\\uA500-\\uA60B\\uA610-\\uA61F\\uA62A\\uA62B\\uA66E\\uA6A0-\\uA6E5\\uA78F\\uA7F7\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA8FE\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9E0-\\uA9E4\\uA9E7-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA6F\\uAA71-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB\\uAADC\\uAAE0-\\uAAEA\\uAAF2\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF66-\\uFF6F\\uFF71-\\uFF9D\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n 'astral': '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF2D-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC50-\\uDC9D\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE35\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDD00-\\uDD23\\uDE80-\\uDEA9\\uDEB0\\uDEB1\\uDF00-\\uDF1C\\uDF27\\uDF30-\\uDF45\\uDF70-\\uDF81\\uDFB0-\\uDFC4\\uDFE0-\\uDFF6]|\\uD804[\\uDC03-\\uDC37\\uDC71\\uDC72\\uDC75\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD44\\uDD47\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC5F-\\uDC61\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDEB8\\uDF00-\\uDF1A\\uDF40-\\uDF46]|\\uD806[\\uDC00-\\uDC2B\\uDCFF-\\uDD06\\uDD09\\uDD0C-\\uDD13\\uDD15\\uDD16\\uDD18-\\uDD2F\\uDD3F\\uDD41\\uDDA0-\\uDDA7\\uDDAA-\\uDDD0\\uDDE1\\uDDE3\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE89\\uDE9D\\uDEB0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46\\uDD60-\\uDD65\\uDD67\\uDD68\\uDD6A-\\uDD89\\uDD98\\uDEE0-\\uDEF2\\uDFB0]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|\\uD80B[\\uDF90-\\uDFF0]|[\\uD80C\\uD81C-\\uD820\\uD822\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879\\uD880-\\uD883][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE70-\\uDEBE\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF4A\\uDF50]|\\uD821[\\uDC00-\\uDFF7]|\\uD823[\\uDC00-\\uDCD5\\uDD00-\\uDD08]|\\uD82C[\\uDC00-\\uDD22\\uDD50-\\uDD52\\uDD64-\\uDD67\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD837\\uDF0A|\\uD838[\\uDD00-\\uDD2C\\uDD4E\\uDE90-\\uDEAD\\uDEC0-\\uDEEB]|\\uD839[\\uDFE0-\\uDFE6\\uDFE8-\\uDFEB\\uDFED\\uDFEE\\uDFF0-\\uDFFE]|\\uD83A[\\uDC00-\\uDCC4]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDEDF\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF38\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uD884[\\uDC00-\\uDF4A]'\n },\n {\n 'name': 'Lt',\n 'alias': 'Titlecase_Letter',\n 'bmp': '\\u01C5\\u01C8\\u01CB\\u01F2\\u1F88-\\u1F8F\\u1F98-\\u1F9F\\u1FA8-\\u1FAF\\u1FBC\\u1FCC\\u1FFC'\n },\n {\n 'name': 'Lu',\n 'alias': 'Uppercase_Letter',\n 'bmp': 'A-Z\\xC0-\\xD6\\xD8-\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E\\u038F\\u0391-\\u03A1\\u03A3-\\u03AB\\u03CF\\u03D2-\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0528\\u052A\\u052C\\u052E\\u0531-\\u0556\\u10A0-\\u10C5\\u10C7\\u10CD\\u13A0-\\u13F5\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1FB8-\\u1FBB\\u1FC8-\\u1FCB\\u1FD8-\\u1FDB\\u1FE8-\\u1FEC\\u1FF8-\\u1FFB\\u2102\\u2107\\u210B-\\u210D\\u2110-\\u2112\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u2130-\\u2133\\u213E\\u213F\\u2145\\u2183\\u2C00-\\u2C2F\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA698\\uA69A\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA796\\uA798\\uA79A\\uA79C\\uA79E\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA-\\uA7AE\\uA7B0-\\uA7B4\\uA7B6\\uA7B8\\uA7BA\\uA7BC\\uA7BE\\uA7C0\\uA7C2\\uA7C4-\\uA7C7\\uA7C9\\uA7D0\\uA7D6\\uA7D8\\uA7F5\\uFF21-\\uFF3A',\n 'astral': '\\uD801[\\uDC00-\\uDC27\\uDCB0-\\uDCD3\\uDD70-\\uDD7A\\uDD7C-\\uDD8A\\uDD8C-\\uDD92\\uDD94\\uDD95]|\\uD803[\\uDC80-\\uDCB2]|\\uD806[\\uDCA0-\\uDCBF]|\\uD81B[\\uDE40-\\uDE5F]|\\uD835[\\uDC00-\\uDC19\\uDC34-\\uDC4D\\uDC68-\\uDC81\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB5\\uDCD0-\\uDCE9\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD38\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD6C-\\uDD85\\uDDA0-\\uDDB9\\uDDD4-\\uDDED\\uDE08-\\uDE21\\uDE3C-\\uDE55\\uDE70-\\uDE89\\uDEA8-\\uDEC0\\uDEE2-\\uDEFA\\uDF1C-\\uDF34\\uDF56-\\uDF6E\\uDF90-\\uDFA8\\uDFCA]|\\uD83A[\\uDD00-\\uDD21]'\n },\n {\n 'name': 'M',\n 'alias': 'Mark',\n 'bmp': '\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u07FD\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u0898-\\u089F\\u08CA-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u09FE\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0AFA-\\u0AFF\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B55-\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C04\\u0C3C\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D00-\\u0D03\\u0D3B\\u0D3C\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D81-\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1715\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u180F\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ACE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF4\\u1CF7-\\u1CF9\\u1DC0-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA82C\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA8FF\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F',\n 'astral': '\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD803[\\uDD24-\\uDD27\\uDEAB\\uDEAC\\uDF46-\\uDF50\\uDF82-\\uDF85]|\\uD804[\\uDC00-\\uDC02\\uDC38-\\uDC46\\uDC70\\uDC73\\uDC74\\uDC7F-\\uDC82\\uDCB0-\\uDCBA\\uDCC2\\uDD00-\\uDD02\\uDD27-\\uDD34\\uDD45\\uDD46\\uDD73\\uDD80-\\uDD82\\uDDB3-\\uDDC0\\uDDC9-\\uDDCC\\uDDCE\\uDDCF\\uDE2C-\\uDE37\\uDE3E\\uDEDF-\\uDEEA\\uDF00-\\uDF03\\uDF3B\\uDF3C\\uDF3E-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC35-\\uDC46\\uDC5E\\uDCB0-\\uDCC3\\uDDAF-\\uDDB5\\uDDB8-\\uDDC0\\uDDDC\\uDDDD\\uDE30-\\uDE40\\uDEAB-\\uDEB7\\uDF1D-\\uDF2B]|\\uD806[\\uDC2C-\\uDC3A\\uDD30-\\uDD35\\uDD37\\uDD38\\uDD3B-\\uDD3E\\uDD40\\uDD42\\uDD43\\uDDD1-\\uDDD7\\uDDDA-\\uDDE0\\uDDE4\\uDE01-\\uDE0A\\uDE33-\\uDE39\\uDE3B-\\uDE3E\\uDE47\\uDE51-\\uDE5B\\uDE8A-\\uDE99]|\\uD807[\\uDC2F-\\uDC36\\uDC38-\\uDC3F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6\\uDD31-\\uDD36\\uDD3A\\uDD3C\\uDD3D\\uDD3F-\\uDD45\\uDD47\\uDD8A-\\uDD8E\\uDD90\\uDD91\\uDD93-\\uDD97\\uDEF3-\\uDEF6]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF4F\\uDF51-\\uDF87\\uDF8F-\\uDF92\\uDFE4\\uDFF0\\uDFF1]|\\uD82F[\\uDC9D\\uDC9E]|\\uD833[\\uDF00-\\uDF2D\\uDF30-\\uDF46]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A\\uDD30-\\uDD36\\uDEAE\\uDEEC-\\uDEEF]|\\uD83A[\\uDCD0-\\uDCD6\\uDD44-\\uDD4A]|\\uDB40[\\uDD00-\\uDDEF]'\n },\n {\n 'name': 'Mc',\n 'alias': 'Spacing_Mark',\n 'bmp': '\\u0903\\u093B\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u094F\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u1715\\u1734\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u1A19\\u1A1A\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1BE7\\u1BEA-\\u1BEC\\u1BEE\\u1BF2\\u1BF3\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF7\\u302E\\u302F\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BE-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uAA7D\\uAAEB\\uAAEE\\uAAEF\\uAAF5\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC',\n 'astral': '\\uD804[\\uDC00\\uDC02\\uDC82\\uDCB0-\\uDCB2\\uDCB7\\uDCB8\\uDD2C\\uDD45\\uDD46\\uDD82\\uDDB3-\\uDDB5\\uDDBF\\uDDC0\\uDDCE\\uDE2C-\\uDE2E\\uDE32\\uDE33\\uDE35\\uDEE0-\\uDEE2\\uDF02\\uDF03\\uDF3E\\uDF3F\\uDF41-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63]|\\uD805[\\uDC35-\\uDC37\\uDC40\\uDC41\\uDC45\\uDCB0-\\uDCB2\\uDCB9\\uDCBB-\\uDCBE\\uDCC1\\uDDAF-\\uDDB1\\uDDB8-\\uDDBB\\uDDBE\\uDE30-\\uDE32\\uDE3B\\uDE3C\\uDE3E\\uDEAC\\uDEAE\\uDEAF\\uDEB6\\uDF20\\uDF21\\uDF26]|\\uD806[\\uDC2C-\\uDC2E\\uDC38\\uDD30-\\uDD35\\uDD37\\uDD38\\uDD3D\\uDD40\\uDD42\\uDDD1-\\uDDD3\\uDDDC-\\uDDDF\\uDDE4\\uDE39\\uDE57\\uDE58\\uDE97]|\\uD807[\\uDC2F\\uDC3E\\uDCA9\\uDCB1\\uDCB4\\uDD8A-\\uDD8E\\uDD93\\uDD94\\uDD96\\uDEF5\\uDEF6]|\\uD81B[\\uDF51-\\uDF87\\uDFF0\\uDFF1]|\\uD834[\\uDD65\\uDD66\\uDD6D-\\uDD72]'\n },\n {\n 'name': 'Me',\n 'alias': 'Enclosing_Mark',\n 'bmp': '\\u0488\\u0489\\u1ABE\\u20DD-\\u20E0\\u20E2-\\u20E4\\uA670-\\uA672'\n },\n {\n 'name': 'Mn',\n 'alias': 'Nonspacing_Mark',\n 'bmp': '\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u07FD\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u0898-\\u089F\\u08CA-\\u08E1\\u08E3-\\u0902\\u093A\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0957\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u09FE\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0AFA-\\u0AFF\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B55\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C00\\u0C04\\u0C3C\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D00\\u0D01\\u0D3B\\u0D3C\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0D81\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732\\u1733\\u1752\\u1753\\u1772\\u1773\\u17B4\\u17B5\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u180F\\u1885\\u1886\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A1B\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1AB0-\\u1ABD\\u1ABF-\\u1ACE\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1BAB-\\u1BAD\\u1BE6\\u1BE8\\u1BE9\\u1BED\\u1BEF-\\u1BF1\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302D\\u3099\\u309A\\uA66F\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA82C\\uA8C4\\uA8C5\\uA8E0-\\uA8F1\\uA8FF\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uA9BD\\uA9E5\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAA7C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEC\\uAAED\\uAAF6\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F',\n 'astral': '\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD803[\\uDD24-\\uDD27\\uDEAB\\uDEAC\\uDF46-\\uDF50\\uDF82-\\uDF85]|\\uD804[\\uDC01\\uDC38-\\uDC46\\uDC70\\uDC73\\uDC74\\uDC7F-\\uDC81\\uDCB3-\\uDCB6\\uDCB9\\uDCBA\\uDCC2\\uDD00-\\uDD02\\uDD27-\\uDD2B\\uDD2D-\\uDD34\\uDD73\\uDD80\\uDD81\\uDDB6-\\uDDBE\\uDDC9-\\uDDCC\\uDDCF\\uDE2F-\\uDE31\\uDE34\\uDE36\\uDE37\\uDE3E\\uDEDF\\uDEE3-\\uDEEA\\uDF00\\uDF01\\uDF3B\\uDF3C\\uDF40\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC38-\\uDC3F\\uDC42-\\uDC44\\uDC46\\uDC5E\\uDCB3-\\uDCB8\\uDCBA\\uDCBF\\uDCC0\\uDCC2\\uDCC3\\uDDB2-\\uDDB5\\uDDBC\\uDDBD\\uDDBF\\uDDC0\\uDDDC\\uDDDD\\uDE33-\\uDE3A\\uDE3D\\uDE3F\\uDE40\\uDEAB\\uDEAD\\uDEB0-\\uDEB5\\uDEB7\\uDF1D-\\uDF1F\\uDF22-\\uDF25\\uDF27-\\uDF2B]|\\uD806[\\uDC2F-\\uDC37\\uDC39\\uDC3A\\uDD3B\\uDD3C\\uDD3E\\uDD43\\uDDD4-\\uDDD7\\uDDDA\\uDDDB\\uDDE0\\uDE01-\\uDE0A\\uDE33-\\uDE38\\uDE3B-\\uDE3E\\uDE47\\uDE51-\\uDE56\\uDE59-\\uDE5B\\uDE8A-\\uDE96\\uDE98\\uDE99]|\\uD807[\\uDC30-\\uDC36\\uDC38-\\uDC3D\\uDC3F\\uDC92-\\uDCA7\\uDCAA-\\uDCB0\\uDCB2\\uDCB3\\uDCB5\\uDCB6\\uDD31-\\uDD36\\uDD3A\\uDD3C\\uDD3D\\uDD3F-\\uDD45\\uDD47\\uDD90\\uDD91\\uDD95\\uDD97\\uDEF3\\uDEF4]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF4F\\uDF8F-\\uDF92\\uDFE4]|\\uD82F[\\uDC9D\\uDC9E]|\\uD833[\\uDF00-\\uDF2D\\uDF30-\\uDF46]|\\uD834[\\uDD67-\\uDD69\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A\\uDD30-\\uDD36\\uDEAE\\uDEEC-\\uDEEF]|\\uD83A[\\uDCD0-\\uDCD6\\uDD44-\\uDD4A]|\\uDB40[\\uDD00-\\uDDEF]'\n },\n {\n 'name': 'N',\n 'alias': 'Number',\n 'bmp': '0-9\\xB2\\xB3\\xB9\\xBC-\\xBE\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u09F4-\\u09F9\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0B72-\\u0B77\\u0BE6-\\u0BF2\\u0C66-\\u0C6F\\u0C78-\\u0C7E\\u0CE6-\\u0CEF\\u0D58-\\u0D5E\\u0D66-\\u0D78\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F33\\u1040-\\u1049\\u1090-\\u1099\\u1369-\\u137C\\u16EE-\\u16F0\\u17E0-\\u17E9\\u17F0-\\u17F9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19DA\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u2182\\u2185-\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3007\\u3021-\\u3029\\u3038-\\u303A\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA620-\\uA629\\uA6E6-\\uA6EF\\uA830-\\uA835\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19',\n 'astral': '\\uD800[\\uDD07-\\uDD33\\uDD40-\\uDD78\\uDD8A\\uDD8B\\uDEE1-\\uDEFB\\uDF20-\\uDF23\\uDF41\\uDF4A\\uDFD1-\\uDFD5]|\\uD801[\\uDCA0-\\uDCA9]|\\uD802[\\uDC58-\\uDC5F\\uDC79-\\uDC7F\\uDCA7-\\uDCAF\\uDCFB-\\uDCFF\\uDD16-\\uDD1B\\uDDBC\\uDDBD\\uDDC0-\\uDDCF\\uDDD2-\\uDDFF\\uDE40-\\uDE48\\uDE7D\\uDE7E\\uDE9D-\\uDE9F\\uDEEB-\\uDEEF\\uDF58-\\uDF5F\\uDF78-\\uDF7F\\uDFA9-\\uDFAF]|\\uD803[\\uDCFA-\\uDCFF\\uDD30-\\uDD39\\uDE60-\\uDE7E\\uDF1D-\\uDF26\\uDF51-\\uDF54\\uDFC5-\\uDFCB]|\\uD804[\\uDC52-\\uDC6F\\uDCF0-\\uDCF9\\uDD36-\\uDD3F\\uDDD0-\\uDDD9\\uDDE1-\\uDDF4\\uDEF0-\\uDEF9]|\\uD805[\\uDC50-\\uDC59\\uDCD0-\\uDCD9\\uDE50-\\uDE59\\uDEC0-\\uDEC9\\uDF30-\\uDF3B]|\\uD806[\\uDCE0-\\uDCF2\\uDD50-\\uDD59]|\\uD807[\\uDC50-\\uDC6C\\uDD50-\\uDD59\\uDDA0-\\uDDA9\\uDFC0-\\uDFD4]|\\uD809[\\uDC00-\\uDC6E]|\\uD81A[\\uDE60-\\uDE69\\uDEC0-\\uDEC9\\uDF50-\\uDF59\\uDF5B-\\uDF61]|\\uD81B[\\uDE80-\\uDE96]|\\uD834[\\uDEE0-\\uDEF3\\uDF60-\\uDF78]|\\uD835[\\uDFCE-\\uDFFF]|\\uD838[\\uDD40-\\uDD49\\uDEF0-\\uDEF9]|\\uD83A[\\uDCC7-\\uDCCF\\uDD50-\\uDD59]|\\uD83B[\\uDC71-\\uDCAB\\uDCAD-\\uDCAF\\uDCB1-\\uDCB4\\uDD01-\\uDD2D\\uDD2F-\\uDD3D]|\\uD83C[\\uDD00-\\uDD0C]|\\uD83E[\\uDFF0-\\uDFF9]'\n },\n {\n 'name': 'Nd',\n 'alias': 'Decimal_Number',\n 'bmp': '0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19',\n 'astral': '\\uD801[\\uDCA0-\\uDCA9]|\\uD803[\\uDD30-\\uDD39]|\\uD804[\\uDC66-\\uDC6F\\uDCF0-\\uDCF9\\uDD36-\\uDD3F\\uDDD0-\\uDDD9\\uDEF0-\\uDEF9]|\\uD805[\\uDC50-\\uDC59\\uDCD0-\\uDCD9\\uDE50-\\uDE59\\uDEC0-\\uDEC9\\uDF30-\\uDF39]|\\uD806[\\uDCE0-\\uDCE9\\uDD50-\\uDD59]|\\uD807[\\uDC50-\\uDC59\\uDD50-\\uDD59\\uDDA0-\\uDDA9]|\\uD81A[\\uDE60-\\uDE69\\uDEC0-\\uDEC9\\uDF50-\\uDF59]|\\uD835[\\uDFCE-\\uDFFF]|\\uD838[\\uDD40-\\uDD49\\uDEF0-\\uDEF9]|\\uD83A[\\uDD50-\\uDD59]|\\uD83E[\\uDFF0-\\uDFF9]'\n },\n {\n 'name': 'Nl',\n 'alias': 'Letter_Number',\n 'bmp': '\\u16EE-\\u16F0\\u2160-\\u2182\\u2185-\\u2188\\u3007\\u3021-\\u3029\\u3038-\\u303A\\uA6E6-\\uA6EF',\n 'astral': '\\uD800[\\uDD40-\\uDD74\\uDF41\\uDF4A\\uDFD1-\\uDFD5]|\\uD809[\\uDC00-\\uDC6E]'\n },\n {\n 'name': 'No',\n 'alias': 'Other_Number',\n 'bmp': '\\xB2\\xB3\\xB9\\xBC-\\xBE\\u09F4-\\u09F9\\u0B72-\\u0B77\\u0BF0-\\u0BF2\\u0C78-\\u0C7E\\u0D58-\\u0D5E\\u0D70-\\u0D78\\u0F2A-\\u0F33\\u1369-\\u137C\\u17F0-\\u17F9\\u19DA\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u215F\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA830-\\uA835',\n 'astral': '\\uD800[\\uDD07-\\uDD33\\uDD75-\\uDD78\\uDD8A\\uDD8B\\uDEE1-\\uDEFB\\uDF20-\\uDF23]|\\uD802[\\uDC58-\\uDC5F\\uDC79-\\uDC7F\\uDCA7-\\uDCAF\\uDCFB-\\uDCFF\\uDD16-\\uDD1B\\uDDBC\\uDDBD\\uDDC0-\\uDDCF\\uDDD2-\\uDDFF\\uDE40-\\uDE48\\uDE7D\\uDE7E\\uDE9D-\\uDE9F\\uDEEB-\\uDEEF\\uDF58-\\uDF5F\\uDF78-\\uDF7F\\uDFA9-\\uDFAF]|\\uD803[\\uDCFA-\\uDCFF\\uDE60-\\uDE7E\\uDF1D-\\uDF26\\uDF51-\\uDF54\\uDFC5-\\uDFCB]|\\uD804[\\uDC52-\\uDC65\\uDDE1-\\uDDF4]|\\uD805[\\uDF3A\\uDF3B]|\\uD806[\\uDCEA-\\uDCF2]|\\uD807[\\uDC5A-\\uDC6C\\uDFC0-\\uDFD4]|\\uD81A[\\uDF5B-\\uDF61]|\\uD81B[\\uDE80-\\uDE96]|\\uD834[\\uDEE0-\\uDEF3\\uDF60-\\uDF78]|\\uD83A[\\uDCC7-\\uDCCF]|\\uD83B[\\uDC71-\\uDCAB\\uDCAD-\\uDCAF\\uDCB1-\\uDCB4\\uDD01-\\uDD2D\\uDD2F-\\uDD3D]|\\uD83C[\\uDD00-\\uDD0C]'\n },\n {\n 'name': 'P',\n 'alias': 'Punctuation',\n 'bmp': '!-#%-\\\\*,-\\\\/:;\\\\?@\\\\[-\\\\]_\\\\{\\\\}\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061D-\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u09FD\\u0A76\\u0AF0\\u0C77\\u0C84\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1B7D\\u1B7E\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E4F\\u2E52-\\u2E5D\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65',\n 'astral': '\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD803[\\uDEAD\\uDF55-\\uDF59\\uDF86-\\uDF89]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC8\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5A\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDEB9\\uDF3C-\\uDF3E]|\\uD806[\\uDC3B\\uDD44-\\uDD46\\uDDE2\\uDE3F-\\uDE46\\uDE9A-\\uDE9C\\uDE9E-\\uDEA2]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71\\uDEF7\\uDEF8\\uDFFF]|\\uD809[\\uDC70-\\uDC74]|\\uD80B[\\uDFF1\\uDFF2]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD81B[\\uDE97-\\uDE9A\\uDFE2]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]'\n },\n {\n 'name': 'Pc',\n 'alias': 'Connector_Punctuation',\n 'bmp': '_\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F'\n },\n {\n 'name': 'Pd',\n 'alias': 'Dash_Punctuation',\n 'bmp': '\\\\-\\u058A\\u05BE\\u1400\\u1806\\u2010-\\u2015\\u2E17\\u2E1A\\u2E3A\\u2E3B\\u2E40\\u2E5D\\u301C\\u3030\\u30A0\\uFE31\\uFE32\\uFE58\\uFE63\\uFF0D',\n 'astral': '\\uD803\\uDEAD'\n },\n {\n 'name': 'Pe',\n 'alias': 'Close_Punctuation',\n 'bmp': '\\\\)\\\\]\\\\}\\u0F3B\\u0F3D\\u169C\\u2046\\u207E\\u208E\\u2309\\u230B\\u232A\\u2769\\u276B\\u276D\\u276F\\u2771\\u2773\\u2775\\u27C6\\u27E7\\u27E9\\u27EB\\u27ED\\u27EF\\u2984\\u2986\\u2988\\u298A\\u298C\\u298E\\u2990\\u2992\\u2994\\u2996\\u2998\\u29D9\\u29DB\\u29FD\\u2E23\\u2E25\\u2E27\\u2E29\\u2E56\\u2E58\\u2E5A\\u2E5C\\u3009\\u300B\\u300D\\u300F\\u3011\\u3015\\u3017\\u3019\\u301B\\u301E\\u301F\\uFD3E\\uFE18\\uFE36\\uFE38\\uFE3A\\uFE3C\\uFE3E\\uFE40\\uFE42\\uFE44\\uFE48\\uFE5A\\uFE5C\\uFE5E\\uFF09\\uFF3D\\uFF5D\\uFF60\\uFF63'\n },\n {\n 'name': 'Pf',\n 'alias': 'Final_Punctuation',\n 'bmp': '\\xBB\\u2019\\u201D\\u203A\\u2E03\\u2E05\\u2E0A\\u2E0D\\u2E1D\\u2E21'\n },\n {\n 'name': 'Pi',\n 'alias': 'Initial_Punctuation',\n 'bmp': '\\xAB\\u2018\\u201B\\u201C\\u201F\\u2039\\u2E02\\u2E04\\u2E09\\u2E0C\\u2E1C\\u2E20'\n },\n {\n 'name': 'Po',\n 'alias': 'Other_Punctuation',\n 'bmp': '!-#%-\\'\\\\*,\\\\.\\\\/:;\\\\?@\\\\\\xA1\\xA7\\xB6\\xB7\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061D-\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u09FD\\u0A76\\u0AF0\\u0C77\\u0C84\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u166E\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u1805\\u1807-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1B7D\\u1B7E\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2016\\u2017\\u2020-\\u2027\\u2030-\\u2038\\u203B-\\u203E\\u2041-\\u2043\\u2047-\\u2051\\u2053\\u2055-\\u205E\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00\\u2E01\\u2E06-\\u2E08\\u2E0B\\u2E0E-\\u2E16\\u2E18\\u2E19\\u2E1B\\u2E1E\\u2E1F\\u2E2A-\\u2E2E\\u2E30-\\u2E39\\u2E3C-\\u2E3F\\u2E41\\u2E43-\\u2E4F\\u2E52-\\u2E54\\u3001-\\u3003\\u303D\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFE10-\\uFE16\\uFE19\\uFE30\\uFE45\\uFE46\\uFE49-\\uFE4C\\uFE50-\\uFE52\\uFE54-\\uFE57\\uFE5F-\\uFE61\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF07\\uFF0A\\uFF0C\\uFF0E\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3C\\uFF61\\uFF64\\uFF65',\n 'astral': '\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD803[\\uDF55-\\uDF59\\uDF86-\\uDF89]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC8\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5A\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDEB9\\uDF3C-\\uDF3E]|\\uD806[\\uDC3B\\uDD44-\\uDD46\\uDDE2\\uDE3F-\\uDE46\\uDE9A-\\uDE9C\\uDE9E-\\uDEA2]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71\\uDEF7\\uDEF8\\uDFFF]|\\uD809[\\uDC70-\\uDC74]|\\uD80B[\\uDFF1\\uDFF2]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD81B[\\uDE97-\\uDE9A\\uDFE2]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]'\n },\n {\n 'name': 'Ps',\n 'alias': 'Open_Punctuation',\n 'bmp': '\\\\(\\\\[\\\\{\\u0F3A\\u0F3C\\u169B\\u201A\\u201E\\u2045\\u207D\\u208D\\u2308\\u230A\\u2329\\u2768\\u276A\\u276C\\u276E\\u2770\\u2772\\u2774\\u27C5\\u27E6\\u27E8\\u27EA\\u27EC\\u27EE\\u2983\\u2985\\u2987\\u2989\\u298B\\u298D\\u298F\\u2991\\u2993\\u2995\\u2997\\u29D8\\u29DA\\u29FC\\u2E22\\u2E24\\u2E26\\u2E28\\u2E42\\u2E55\\u2E57\\u2E59\\u2E5B\\u3008\\u300A\\u300C\\u300E\\u3010\\u3014\\u3016\\u3018\\u301A\\u301D\\uFD3F\\uFE17\\uFE35\\uFE37\\uFE39\\uFE3B\\uFE3D\\uFE3F\\uFE41\\uFE43\\uFE47\\uFE59\\uFE5B\\uFE5D\\uFF08\\uFF3B\\uFF5B\\uFF5F\\uFF62'\n },\n {\n 'name': 'S',\n 'alias': 'Symbol',\n 'bmp': '\\\\$\\\\+<->\\\\^`\\\\|~\\xA2-\\xA6\\xA8\\xA9\\xAC\\xAE-\\xB1\\xB4\\xB8\\xD7\\xF7\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u03F6\\u0482\\u058D-\\u058F\\u0606-\\u0608\\u060B\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u07FE\\u07FF\\u0888\\u09F2\\u09F3\\u09FA\\u09FB\\u0AF1\\u0B70\\u0BF3-\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0E3F\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u166D\\u17DB\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u20A0-\\u20C0\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116-\\u2118\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u2140-\\u2144\\u214A-\\u214D\\u214F\\u218A\\u218B\\u2190-\\u2307\\u230C-\\u2328\\u232B-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u2767\\u2794-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2B73\\u2B76-\\u2B95\\u2B97-\\u2BFF\\u2CE5-\\u2CEA\\u2E50\\u2E51\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u309B\\u309C\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uA828-\\uA82B\\uA836-\\uA839\\uAA77-\\uAA79\\uAB5B\\uAB6A\\uAB6B\\uFB29\\uFBB2-\\uFBC2\\uFD40-\\uFD4F\\uFDCF\\uFDFC-\\uFDFF\\uFE62\\uFE64-\\uFE66\\uFE69\\uFF04\\uFF0B\\uFF1C-\\uFF1E\\uFF3E\\uFF40\\uFF5C\\uFF5E\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFFC\\uFFFD',\n 'astral': '\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9C\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD805\\uDF3F|\\uD807[\\uDFD5-\\uDFF1]|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD833[\\uDF50-\\uDFC3]|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDEA\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD838[\\uDD4F\\uDEFF]|\\uD83B[\\uDCAC\\uDCB0\\uDD2E\\uDEF0\\uDEF1]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD0D-\\uDDAD\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDE60-\\uDE65\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED7\\uDEDD-\\uDEEC\\uDEF0-\\uDEFC\\uDF00-\\uDF73\\uDF80-\\uDFD8\\uDFE0-\\uDFEB\\uDFF0]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDCB0\\uDCB1\\uDD00-\\uDE53\\uDE60-\\uDE6D\\uDE70-\\uDE74\\uDE78-\\uDE7C\\uDE80-\\uDE86\\uDE90-\\uDEAC\\uDEB0-\\uDEBA\\uDEC0-\\uDEC5\\uDED0-\\uDED9\\uDEE0-\\uDEE7\\uDEF0-\\uDEF6\\uDF00-\\uDF92\\uDF94-\\uDFCA]'\n },\n {\n 'name': 'Sc',\n 'alias': 'Currency_Symbol',\n 'bmp': '\\\\$\\xA2-\\xA5\\u058F\\u060B\\u07FE\\u07FF\\u09F2\\u09F3\\u09FB\\u0AF1\\u0BF9\\u0E3F\\u17DB\\u20A0-\\u20C0\\uA838\\uFDFC\\uFE69\\uFF04\\uFFE0\\uFFE1\\uFFE5\\uFFE6',\n 'astral': '\\uD807[\\uDFDD-\\uDFE0]|\\uD838\\uDEFF|\\uD83B\\uDCB0'\n },\n {\n 'name': 'Sk',\n 'alias': 'Modifier_Symbol',\n 'bmp': '\\\\^`\\xA8\\xAF\\xB4\\xB8\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u0888\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u309B\\u309C\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uAB5B\\uAB6A\\uAB6B\\uFBB2-\\uFBC2\\uFF3E\\uFF40\\uFFE3',\n 'astral': '\\uD83C[\\uDFFB-\\uDFFF]'\n },\n {\n 'name': 'Sm',\n 'alias': 'Math_Symbol',\n 'bmp': '\\\\+<->\\\\|~\\xAC\\xB1\\xD7\\xF7\\u03F6\\u0606-\\u0608\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u2118\\u2140-\\u2144\\u214B\\u2190-\\u2194\\u219A\\u219B\\u21A0\\u21A3\\u21A6\\u21AE\\u21CE\\u21CF\\u21D2\\u21D4\\u21F4-\\u22FF\\u2320\\u2321\\u237C\\u239B-\\u23B3\\u23DC-\\u23E1\\u25B7\\u25C1\\u25F8-\\u25FF\\u266F\\u27C0-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u27FF\\u2900-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2AFF\\u2B30-\\u2B44\\u2B47-\\u2B4C\\uFB29\\uFE62\\uFE64-\\uFE66\\uFF0B\\uFF1C-\\uFF1E\\uFF5C\\uFF5E\\uFFE2\\uFFE9-\\uFFEC',\n 'astral': '\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD83B[\\uDEF0\\uDEF1]'\n },\n {\n 'name': 'So',\n 'alias': 'Other_Symbol',\n 'bmp': '\\xA6\\xA9\\xAE\\xB0\\u0482\\u058D\\u058E\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u09FA\\u0B70\\u0BF3-\\u0BF8\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u166D\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116\\u2117\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u214A\\u214C\\u214D\\u214F\\u218A\\u218B\\u2195-\\u2199\\u219C-\\u219F\\u21A1\\u21A2\\u21A4\\u21A5\\u21A7-\\u21AD\\u21AF-\\u21CD\\u21D0\\u21D1\\u21D3\\u21D5-\\u21F3\\u2300-\\u2307\\u230C-\\u231F\\u2322-\\u2328\\u232B-\\u237B\\u237D-\\u239A\\u23B4-\\u23DB\\u23E2-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u25B6\\u25B8-\\u25C0\\u25C2-\\u25F7\\u2600-\\u266E\\u2670-\\u2767\\u2794-\\u27BF\\u2800-\\u28FF\\u2B00-\\u2B2F\\u2B45\\u2B46\\u2B4D-\\u2B73\\u2B76-\\u2B95\\u2B97-\\u2BFF\\u2CE5-\\u2CEA\\u2E50\\u2E51\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA828-\\uA82B\\uA836\\uA837\\uA839\\uAA77-\\uAA79\\uFD40-\\uFD4F\\uFDCF\\uFDFD-\\uFDFF\\uFFE4\\uFFE8\\uFFED\\uFFEE\\uFFFC\\uFFFD',\n 'astral': '\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9C\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD805\\uDF3F|\\uD807[\\uDFD5-\\uDFDC\\uDFE1-\\uDFF1]|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD833[\\uDF50-\\uDFC3]|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDEA\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD838\\uDD4F|\\uD83B[\\uDCAC\\uDD2E]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD0D-\\uDDAD\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDE60-\\uDE65\\uDF00-\\uDFFA]|\\uD83D[\\uDC00-\\uDED7\\uDEDD-\\uDEEC\\uDEF0-\\uDEFC\\uDF00-\\uDF73\\uDF80-\\uDFD8\\uDFE0-\\uDFEB\\uDFF0]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDCB0\\uDCB1\\uDD00-\\uDE53\\uDE60-\\uDE6D\\uDE70-\\uDE74\\uDE78-\\uDE7C\\uDE80-\\uDE86\\uDE90-\\uDEAC\\uDEB0-\\uDEBA\\uDEC0-\\uDEC5\\uDED0-\\uDED9\\uDEE0-\\uDEE7\\uDEF0-\\uDEF6\\uDF00-\\uDF92\\uDF94-\\uDFCA]'\n },\n {\n 'name': 'Z',\n 'alias': 'Separator',\n 'bmp': ' \\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000'\n },\n {\n 'name': 'Zl',\n 'alias': 'Line_Separator',\n 'bmp': '\\u2028'\n },\n {\n 'name': 'Zp',\n 'alias': 'Paragraph_Separator',\n 'bmp': '\\u2029'\n },\n {\n 'name': 'Zs',\n 'alias': 'Space_Separator',\n 'bmp': ' \\xA0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000'\n }\n];\n","module.exports = [\n {\n 'name': 'ASCII',\n 'bmp': '\\0-\\x7F'\n },\n {\n 'name': 'Alphabetic',\n 'bmp': 'A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0345\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05B0-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05EF-\\u05F2\\u0610-\\u061A\\u0620-\\u0657\\u0659-\\u065F\\u066E-\\u06D3\\u06D5-\\u06DC\\u06E1-\\u06E8\\u06ED-\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710-\\u073F\\u074D-\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0817\\u081A-\\u082C\\u0840-\\u0858\\u0860-\\u086A\\u0870-\\u0887\\u0889-\\u088E\\u08A0-\\u08C9\\u08D4-\\u08DF\\u08E3-\\u08E9\\u08F0-\\u093B\\u093D-\\u094C\\u094E-\\u0950\\u0955-\\u0963\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD-\\u09C4\\u09C7\\u09C8\\u09CB\\u09CC\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09F0\\u09F1\\u09FC\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B\\u0A4C\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A70-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB\\u0ACC\\u0AD0\\u0AE0-\\u0AE3\\u0AF9-\\u0AFC\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D-\\u0B44\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD0\\u0BD7\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4C\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C5D\\u0C60-\\u0C63\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCC\\u0CD5\\u0CD6\\u0CDD\\u0CDE\\u0CE0-\\u0CE3\\u0CF1\\u0CF2\\u0D00-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D4E\\u0D54-\\u0D57\\u0D5F-\\u0D63\\u0D7A-\\u0D7F\\u0D81-\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E46\\u0E4D\\u0E81\\u0E82\\u0E84\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0ECD\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F81\\u0F88-\\u0F97\\u0F99-\\u0FBC\\u1000-\\u1036\\u1038\\u103B-\\u103F\\u1050-\\u108F\\u109A-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u1713\\u171F-\\u1733\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17B3\\u17B6-\\u17C8\\u17D7\\u17DC\\u1820-\\u1878\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u1938\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A61-\\u1A74\\u1AA7\\u1ABF\\u1AC0\\u1ACC-\\u1ACE\\u1B00-\\u1B33\\u1B35-\\u1B43\\u1B45-\\u1B4C\\u1B80-\\u1BA9\\u1BAC-\\u1BAF\\u1BBA-\\u1BE5\\u1BE7-\\u1BF1\\u1C00-\\u1C36\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1CFA\\u1D00-\\u1DBF\\u1DE7-\\u1DF4\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u24B6-\\u24E9\\u2C00-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312F\\u3131-\\u318E\\u31A0-\\u31BF\\u31F0-\\u31FF\\u3400-\\u4DBF\\u4E00-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA674-\\uA67B\\uA67F-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7CA\\uA7D0\\uA7D1\\uA7D3\\uA7D5-\\uA7D9\\uA7F2-\\uA805\\uA807-\\uA827\\uA840-\\uA873\\uA880-\\uA8C3\\uA8C5\\uA8F2-\\uA8F7\\uA8FB\\uA8FD-\\uA8FF\\uA90A-\\uA92A\\uA930-\\uA952\\uA960-\\uA97C\\uA980-\\uA9B2\\uA9B4-\\uA9BF\\uA9CF\\uA9E0-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA60-\\uAA76\\uAA7A-\\uAABE\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF5\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB69\\uAB70-\\uABEA\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n 'astral': '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF2D-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDD70-\\uDD7A\\uDD7C-\\uDD8A\\uDD8C-\\uDD92\\uDD94\\uDD95\\uDD97-\\uDDA1\\uDDA3-\\uDDB1\\uDDB3-\\uDDB9\\uDDBB\\uDDBC\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67\\uDF80-\\uDF85\\uDF87-\\uDFB0\\uDFB2-\\uDFBA]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE35\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDD00-\\uDD27\\uDE80-\\uDEA9\\uDEAB\\uDEAC\\uDEB0\\uDEB1\\uDF00-\\uDF1C\\uDF27\\uDF30-\\uDF45\\uDF70-\\uDF81\\uDFB0-\\uDFC4\\uDFE0-\\uDFF6]|\\uD804[\\uDC00-\\uDC45\\uDC71-\\uDC75\\uDC82-\\uDCB8\\uDCC2\\uDCD0-\\uDCE8\\uDD00-\\uDD32\\uDD44-\\uDD47\\uDD50-\\uDD72\\uDD76\\uDD80-\\uDDBF\\uDDC1-\\uDDC4\\uDDCE\\uDDCF\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE34\\uDE37\\uDE3E\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEE8\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D-\\uDF44\\uDF47\\uDF48\\uDF4B\\uDF4C\\uDF50\\uDF57\\uDF5D-\\uDF63]|\\uD805[\\uDC00-\\uDC41\\uDC43-\\uDC45\\uDC47-\\uDC4A\\uDC5F-\\uDC61\\uDC80-\\uDCC1\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDB5\\uDDB8-\\uDDBE\\uDDD8-\\uDDDD\\uDE00-\\uDE3E\\uDE40\\uDE44\\uDE80-\\uDEB5\\uDEB8\\uDF00-\\uDF1A\\uDF1D-\\uDF2A\\uDF40-\\uDF46]|\\uD806[\\uDC00-\\uDC38\\uDCA0-\\uDCDF\\uDCFF-\\uDD06\\uDD09\\uDD0C-\\uDD13\\uDD15\\uDD16\\uDD18-\\uDD35\\uDD37\\uDD38\\uDD3B\\uDD3C\\uDD3F-\\uDD42\\uDDA0-\\uDDA7\\uDDAA-\\uDDD7\\uDDDA-\\uDDDF\\uDDE1\\uDDE3\\uDDE4\\uDE00-\\uDE32\\uDE35-\\uDE3E\\uDE50-\\uDE97\\uDE9D\\uDEB0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC3E\\uDC40\\uDC72-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD36\\uDD3A\\uDD3C\\uDD3D\\uDD3F-\\uDD41\\uDD43\\uDD46\\uDD47\\uDD60-\\uDD65\\uDD67\\uDD68\\uDD6A-\\uDD8E\\uDD90\\uDD91\\uDD93-\\uDD96\\uDD98\\uDEE0-\\uDEF6\\uDFB0]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|\\uD80B[\\uDF90-\\uDFF0]|[\\uD80C\\uD81C-\\uD820\\uD822\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879\\uD880-\\uD883][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE70-\\uDEBE\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDE40-\\uDE7F\\uDF00-\\uDF4A\\uDF4F-\\uDF87\\uDF8F-\\uDF9F\\uDFE0\\uDFE1\\uDFE3\\uDFF0\\uDFF1]|\\uD821[\\uDC00-\\uDFF7]|\\uD823[\\uDC00-\\uDCD5\\uDD00-\\uDD08]|\\uD82B[\\uDFF0-\\uDFF3\\uDFF5-\\uDFFB\\uDFFD\\uDFFE]|\\uD82C[\\uDC00-\\uDD22\\uDD50-\\uDD52\\uDD64-\\uDD67\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9E]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD837[\\uDF00-\\uDF1E]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A\\uDD00-\\uDD2C\\uDD37-\\uDD3D\\uDD4E\\uDE90-\\uDEAD\\uDEC0-\\uDEEB]|\\uD839[\\uDFE0-\\uDFE6\\uDFE8-\\uDFEB\\uDFED\\uDFEE\\uDFF0-\\uDFFE]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43\\uDD47\\uDD4B]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD83C[\\uDD30-\\uDD49\\uDD50-\\uDD69\\uDD70-\\uDD89]|\\uD869[\\uDC00-\\uDEDF\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF38\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uD884[\\uDC00-\\uDF4A]'\n },\n {\n 'name': 'Any',\n 'isBmpLast': true,\n 'bmp': '\\0-\\uFFFF',\n 'astral': '[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]'\n },\n {\n 'name': 'Default_Ignorable_Code_Point',\n 'bmp': '\\xAD\\u034F\\u061C\\u115F\\u1160\\u17B4\\u17B5\\u180B-\\u180F\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u3164\\uFE00-\\uFE0F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8',\n 'astral': '\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|[\\uDB40-\\uDB43][\\uDC00-\\uDFFF]'\n },\n {\n 'name': 'Lowercase',\n 'bmp': 'a-z\\xAA\\xB5\\xBA\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F-\\u0293\\u0295-\\u02B8\\u02C0\\u02C1\\u02E0-\\u02E4\\u0345\\u0371\\u0373\\u0377\\u037A-\\u037D\\u0390\\u03AC-\\u03CE\\u03D0\\u03D1\\u03D5-\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF-\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430-\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0525\\u0527\\u0529\\u052B\\u052D\\u052F\\u0560-\\u0588\\u10D0-\\u10FA\\u10FD-\\u10FF\\u13F8-\\u13FD\\u1C80-\\u1C88\\u1D00-\\u1DBF\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95-\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF-\\u1F07\\u1F10-\\u1F15\\u1F20-\\u1F27\\u1F30-\\u1F37\\u1F40-\\u1F45\\u1F50-\\u1F57\\u1F60-\\u1F67\\u1F70-\\u1F7D\\u1F80-\\u1F87\\u1F90-\\u1F97\\u1FA0-\\u1FA7\\u1FB0-\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2-\\u1FC4\\u1FC6\\u1FC7\\u1FD0-\\u1FD3\\u1FD6\\u1FD7\\u1FE0-\\u1FE7\\u1FF2-\\u1FF4\\u1FF6\\u1FF7\\u2071\\u207F\\u2090-\\u209C\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146-\\u2149\\u214E\\u2170-\\u217F\\u2184\\u24D0-\\u24E9\\u2C30-\\u2C5F\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76-\\u2C7D\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2CEC\\u2CEE\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA661\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA699\\uA69B-\\uA69D\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F-\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F-\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uA78E\\uA791\\uA793-\\uA795\\uA797\\uA799\\uA79B\\uA79D\\uA79F\\uA7A1\\uA7A3\\uA7A5\\uA7A7\\uA7A9\\uA7AF\\uA7B5\\uA7B7\\uA7B9\\uA7BB\\uA7BD\\uA7BF\\uA7C1\\uA7C3\\uA7C8\\uA7CA\\uA7D1\\uA7D3\\uA7D5\\uA7D7\\uA7D9\\uA7F6\\uA7F8-\\uA7FA\\uAB30-\\uAB5A\\uAB5C-\\uAB68\\uAB70-\\uABBF\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF41-\\uFF5A',\n 'astral': '\\uD801[\\uDC28-\\uDC4F\\uDCD8-\\uDCFB\\uDD97-\\uDDA1\\uDDA3-\\uDDB1\\uDDB3-\\uDDB9\\uDDBB\\uDDBC\\uDF80\\uDF83-\\uDF85\\uDF87-\\uDFB0\\uDFB2-\\uDFBA]|\\uD803[\\uDCC0-\\uDCF2]|\\uD806[\\uDCC0-\\uDCDF]|\\uD81B[\\uDE60-\\uDE7F]|\\uD835[\\uDC1A-\\uDC33\\uDC4E-\\uDC54\\uDC56-\\uDC67\\uDC82-\\uDC9B\\uDCB6-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDCEA-\\uDD03\\uDD1E-\\uDD37\\uDD52-\\uDD6B\\uDD86-\\uDD9F\\uDDBA-\\uDDD3\\uDDEE-\\uDE07\\uDE22-\\uDE3B\\uDE56-\\uDE6F\\uDE8A-\\uDEA5\\uDEC2-\\uDEDA\\uDEDC-\\uDEE1\\uDEFC-\\uDF14\\uDF16-\\uDF1B\\uDF36-\\uDF4E\\uDF50-\\uDF55\\uDF70-\\uDF88\\uDF8A-\\uDF8F\\uDFAA-\\uDFC2\\uDFC4-\\uDFC9\\uDFCB]|\\uD837[\\uDF00-\\uDF09\\uDF0B-\\uDF1E]|\\uD83A[\\uDD22-\\uDD43]'\n },\n {\n 'name': 'Noncharacter_Code_Point',\n 'bmp': '\\uFDD0-\\uFDEF\\uFFFE\\uFFFF',\n 'astral': '[\\uD83F\\uD87F\\uD8BF\\uD8FF\\uD93F\\uD97F\\uD9BF\\uD9FF\\uDA3F\\uDA7F\\uDABF\\uDAFF\\uDB3F\\uDB7F\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]'\n },\n {\n 'name': 'Uppercase',\n 'bmp': 'A-Z\\xC0-\\xD6\\xD8-\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E\\u038F\\u0391-\\u03A1\\u03A3-\\u03AB\\u03CF\\u03D2-\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0528\\u052A\\u052C\\u052E\\u0531-\\u0556\\u10A0-\\u10C5\\u10C7\\u10CD\\u13A0-\\u13F5\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1FB8-\\u1FBB\\u1FC8-\\u1FCB\\u1FD8-\\u1FDB\\u1FE8-\\u1FEC\\u1FF8-\\u1FFB\\u2102\\u2107\\u210B-\\u210D\\u2110-\\u2112\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u2130-\\u2133\\u213E\\u213F\\u2145\\u2160-\\u216F\\u2183\\u24B6-\\u24CF\\u2C00-\\u2C2F\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA698\\uA69A\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA796\\uA798\\uA79A\\uA79C\\uA79E\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA-\\uA7AE\\uA7B0-\\uA7B4\\uA7B6\\uA7B8\\uA7BA\\uA7BC\\uA7BE\\uA7C0\\uA7C2\\uA7C4-\\uA7C7\\uA7C9\\uA7D0\\uA7D6\\uA7D8\\uA7F5\\uFF21-\\uFF3A',\n 'astral': '\\uD801[\\uDC00-\\uDC27\\uDCB0-\\uDCD3\\uDD70-\\uDD7A\\uDD7C-\\uDD8A\\uDD8C-\\uDD92\\uDD94\\uDD95]|\\uD803[\\uDC80-\\uDCB2]|\\uD806[\\uDCA0-\\uDCBF]|\\uD81B[\\uDE40-\\uDE5F]|\\uD835[\\uDC00-\\uDC19\\uDC34-\\uDC4D\\uDC68-\\uDC81\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB5\\uDCD0-\\uDCE9\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD38\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD6C-\\uDD85\\uDDA0-\\uDDB9\\uDDD4-\\uDDED\\uDE08-\\uDE21\\uDE3C-\\uDE55\\uDE70-\\uDE89\\uDEA8-\\uDEC0\\uDEE2-\\uDEFA\\uDF1C-\\uDF34\\uDF56-\\uDF6E\\uDF90-\\uDFA8\\uDFCA]|\\uD83A[\\uDD00-\\uDD21]|\\uD83C[\\uDD30-\\uDD49\\uDD50-\\uDD69\\uDD70-\\uDD89]'\n },\n {\n 'name': 'White_Space',\n 'bmp': '\\t-\\r \\x85\\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000'\n }\n];\n","module.exports = [\n {\n 'name': 'Adlam',\n 'astral': '\\uD83A[\\uDD00-\\uDD4B\\uDD50-\\uDD59\\uDD5E\\uDD5F]'\n },\n {\n 'name': 'Ahom',\n 'astral': '\\uD805[\\uDF00-\\uDF1A\\uDF1D-\\uDF2B\\uDF30-\\uDF46]'\n },\n {\n 'name': 'Anatolian_Hieroglyphs',\n 'astral': '\\uD811[\\uDC00-\\uDE46]'\n },\n {\n 'name': 'Arabic',\n 'bmp': '\\u0600-\\u0604\\u0606-\\u060B\\u060D-\\u061A\\u061C-\\u061E\\u0620-\\u063F\\u0641-\\u064A\\u0656-\\u066F\\u0671-\\u06DC\\u06DE-\\u06FF\\u0750-\\u077F\\u0870-\\u088E\\u0890\\u0891\\u0898-\\u08E1\\u08E3-\\u08FF\\uFB50-\\uFBC2\\uFBD3-\\uFD3D\\uFD40-\\uFD8F\\uFD92-\\uFDC7\\uFDCF\\uFDF0-\\uFDFF\\uFE70-\\uFE74\\uFE76-\\uFEFC',\n 'astral': '\\uD803[\\uDE60-\\uDE7E]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB\\uDEF0\\uDEF1]'\n },\n {\n 'name': 'Armenian',\n 'bmp': '\\u0531-\\u0556\\u0559-\\u058A\\u058D-\\u058F\\uFB13-\\uFB17'\n },\n {\n 'name': 'Avestan',\n 'astral': '\\uD802[\\uDF00-\\uDF35\\uDF39-\\uDF3F]'\n },\n {\n 'name': 'Balinese',\n 'bmp': '\\u1B00-\\u1B4C\\u1B50-\\u1B7E'\n },\n {\n 'name': 'Bamum',\n 'bmp': '\\uA6A0-\\uA6F7',\n 'astral': '\\uD81A[\\uDC00-\\uDE38]'\n },\n {\n 'name': 'Bassa_Vah',\n 'astral': '\\uD81A[\\uDED0-\\uDEED\\uDEF0-\\uDEF5]'\n },\n {\n 'name': 'Batak',\n 'bmp': '\\u1BC0-\\u1BF3\\u1BFC-\\u1BFF'\n },\n {\n 'name': 'Bengali',\n 'bmp': '\\u0980-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09FE'\n },\n {\n 'name': 'Bhaiksuki',\n 'astral': '\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC45\\uDC50-\\uDC6C]'\n },\n {\n 'name': 'Bopomofo',\n 'bmp': '\\u02EA\\u02EB\\u3105-\\u312F\\u31A0-\\u31BF'\n },\n {\n 'name': 'Brahmi',\n 'astral': '\\uD804[\\uDC00-\\uDC4D\\uDC52-\\uDC75\\uDC7F]'\n },\n {\n 'name': 'Braille',\n 'bmp': '\\u2800-\\u28FF'\n },\n {\n 'name': 'Buginese',\n 'bmp': '\\u1A00-\\u1A1B\\u1A1E\\u1A1F'\n },\n {\n 'name': 'Buhid',\n 'bmp': '\\u1740-\\u1753'\n },\n {\n 'name': 'Canadian_Aboriginal',\n 'bmp': '\\u1400-\\u167F\\u18B0-\\u18F5',\n 'astral': '\\uD806[\\uDEB0-\\uDEBF]'\n },\n {\n 'name': 'Carian',\n 'astral': '\\uD800[\\uDEA0-\\uDED0]'\n },\n {\n 'name': 'Caucasian_Albanian',\n 'astral': '\\uD801[\\uDD30-\\uDD63\\uDD6F]'\n },\n {\n 'name': 'Chakma',\n 'astral': '\\uD804[\\uDD00-\\uDD34\\uDD36-\\uDD47]'\n },\n {\n 'name': 'Cham',\n 'bmp': '\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA5C-\\uAA5F'\n },\n {\n 'name': 'Cherokee',\n 'bmp': '\\u13A0-\\u13F5\\u13F8-\\u13FD\\uAB70-\\uABBF'\n },\n {\n 'name': 'Chorasmian',\n 'astral': '\\uD803[\\uDFB0-\\uDFCB]'\n },\n {\n 'name': 'Common',\n 'bmp': '\\0-@\\\\[-`\\\\{-\\xA9\\xAB-\\xB9\\xBB-\\xBF\\xD7\\xF7\\u02B9-\\u02DF\\u02E5-\\u02E9\\u02EC-\\u02FF\\u0374\\u037E\\u0385\\u0387\\u0605\\u060C\\u061B\\u061F\\u0640\\u06DD\\u08E2\\u0964\\u0965\\u0E3F\\u0FD5-\\u0FD8\\u10FB\\u16EB-\\u16ED\\u1735\\u1736\\u1802\\u1803\\u1805\\u1CD3\\u1CE1\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5-\\u1CF7\\u1CFA\\u2000-\\u200B\\u200E-\\u2064\\u2066-\\u2070\\u2074-\\u207E\\u2080-\\u208E\\u20A0-\\u20C0\\u2100-\\u2125\\u2127-\\u2129\\u212C-\\u2131\\u2133-\\u214D\\u214F-\\u215F\\u2189-\\u218B\\u2190-\\u2426\\u2440-\\u244A\\u2460-\\u27FF\\u2900-\\u2B73\\u2B76-\\u2B95\\u2B97-\\u2BFF\\u2E00-\\u2E5D\\u2FF0-\\u2FFB\\u3000-\\u3004\\u3006\\u3008-\\u3020\\u3030-\\u3037\\u303C-\\u303F\\u309B\\u309C\\u30A0\\u30FB\\u30FC\\u3190-\\u319F\\u31C0-\\u31E3\\u3220-\\u325F\\u327F-\\u32CF\\u32FF\\u3358-\\u33FF\\u4DC0-\\u4DFF\\uA700-\\uA721\\uA788-\\uA78A\\uA830-\\uA839\\uA92E\\uA9CF\\uAB5B\\uAB6A\\uAB6B\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFEFF\\uFF01-\\uFF20\\uFF3B-\\uFF40\\uFF5B-\\uFF65\\uFF70\\uFF9E\\uFF9F\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFF9-\\uFFFD',\n 'astral': '\\uD800[\\uDD00-\\uDD02\\uDD07-\\uDD33\\uDD37-\\uDD3F\\uDD90-\\uDD9C\\uDDD0-\\uDDFC\\uDEE1-\\uDEFB]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD833[\\uDF50-\\uDFC3]|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD66\\uDD6A-\\uDD7A\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDEA\\uDEE0-\\uDEF3\\uDF00-\\uDF56\\uDF60-\\uDF78]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDFCB\\uDFCE-\\uDFFF]|\\uD83B[\\uDC71-\\uDCB4\\uDD01-\\uDD3D]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD00-\\uDDAD\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDE60-\\uDE65\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED7\\uDEDD-\\uDEEC\\uDEF0-\\uDEFC\\uDF00-\\uDF73\\uDF80-\\uDFD8\\uDFE0-\\uDFEB\\uDFF0]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDCB0\\uDCB1\\uDD00-\\uDE53\\uDE60-\\uDE6D\\uDE70-\\uDE74\\uDE78-\\uDE7C\\uDE80-\\uDE86\\uDE90-\\uDEAC\\uDEB0-\\uDEBA\\uDEC0-\\uDEC5\\uDED0-\\uDED9\\uDEE0-\\uDEE7\\uDEF0-\\uDEF6\\uDF00-\\uDF92\\uDF94-\\uDFCA\\uDFF0-\\uDFF9]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]'\n },\n {\n 'name': 'Coptic',\n 'bmp': '\\u03E2-\\u03EF\\u2C80-\\u2CF3\\u2CF9-\\u2CFF'\n },\n {\n 'name': 'Cuneiform',\n 'astral': '\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC70-\\uDC74\\uDC80-\\uDD43]'\n },\n {\n 'name': 'Cypriot',\n 'astral': '\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F]'\n },\n {\n 'name': 'Cypro_Minoan',\n 'astral': '\\uD80B[\\uDF90-\\uDFF2]'\n },\n {\n 'name': 'Cyrillic',\n 'bmp': '\\u0400-\\u0484\\u0487-\\u052F\\u1C80-\\u1C88\\u1D2B\\u1D78\\u2DE0-\\u2DFF\\uA640-\\uA69F\\uFE2E\\uFE2F'\n },\n {\n 'name': 'Deseret',\n 'astral': '\\uD801[\\uDC00-\\uDC4F]'\n },\n {\n 'name': 'Devanagari',\n 'bmp': '\\u0900-\\u0950\\u0955-\\u0963\\u0966-\\u097F\\uA8E0-\\uA8FF'\n },\n {\n 'name': 'Dives_Akuru',\n 'astral': '\\uD806[\\uDD00-\\uDD06\\uDD09\\uDD0C-\\uDD13\\uDD15\\uDD16\\uDD18-\\uDD35\\uDD37\\uDD38\\uDD3B-\\uDD46\\uDD50-\\uDD59]'\n },\n {\n 'name': 'Dogra',\n 'astral': '\\uD806[\\uDC00-\\uDC3B]'\n },\n {\n 'name': 'Duployan',\n 'astral': '\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9C-\\uDC9F]'\n },\n {\n 'name': 'Egyptian_Hieroglyphs',\n 'astral': '\\uD80C[\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E\\uDC30-\\uDC38]'\n },\n {\n 'name': 'Elbasan',\n 'astral': '\\uD801[\\uDD00-\\uDD27]'\n },\n {\n 'name': 'Elymaic',\n 'astral': '\\uD803[\\uDFE0-\\uDFF6]'\n },\n {\n 'name': 'Ethiopic',\n 'bmp': '\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u137C\\u1380-\\u1399\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E',\n 'astral': '\\uD839[\\uDFE0-\\uDFE6\\uDFE8-\\uDFEB\\uDFED\\uDFEE\\uDFF0-\\uDFFE]'\n },\n {\n 'name': 'Georgian',\n 'bmp': '\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u10FF\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u2D00-\\u2D25\\u2D27\\u2D2D'\n },\n {\n 'name': 'Glagolitic',\n 'bmp': '\\u2C00-\\u2C5F',\n 'astral': '\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]'\n },\n {\n 'name': 'Gothic',\n 'astral': '\\uD800[\\uDF30-\\uDF4A]'\n },\n {\n 'name': 'Grantha',\n 'astral': '\\uD804[\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]'\n },\n {\n 'name': 'Greek',\n 'bmp': '\\u0370-\\u0373\\u0375-\\u0377\\u037A-\\u037D\\u037F\\u0384\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03E1\\u03F0-\\u03FF\\u1D26-\\u1D2A\\u1D5D-\\u1D61\\u1D66-\\u1D6A\\u1DBF\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FC4\\u1FC6-\\u1FD3\\u1FD6-\\u1FDB\\u1FDD-\\u1FEF\\u1FF2-\\u1FF4\\u1FF6-\\u1FFE\\u2126\\uAB65',\n 'astral': '\\uD800[\\uDD40-\\uDD8E\\uDDA0]|\\uD834[\\uDE00-\\uDE45]'\n },\n {\n 'name': 'Gujarati',\n 'bmp': '\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AF1\\u0AF9-\\u0AFF'\n },\n {\n 'name': 'Gunjala_Gondi',\n 'astral': '\\uD807[\\uDD60-\\uDD65\\uDD67\\uDD68\\uDD6A-\\uDD8E\\uDD90\\uDD91\\uDD93-\\uDD98\\uDDA0-\\uDDA9]'\n },\n {\n 'name': 'Gurmukhi',\n 'bmp': '\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A76'\n },\n {\n 'name': 'Han',\n 'bmp': '\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u3005\\u3007\\u3021-\\u3029\\u3038-\\u303B\\u3400-\\u4DBF\\u4E00-\\u9FFF\\uF900-\\uFA6D\\uFA70-\\uFAD9',\n 'astral': '\\uD81B[\\uDFE2\\uDFE3\\uDFF0\\uDFF1]|[\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879\\uD880-\\uD883][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDEDF\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF38\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uD884[\\uDC00-\\uDF4A]'\n },\n {\n 'name': 'Hangul',\n 'bmp': '\\u1100-\\u11FF\\u302E\\u302F\\u3131-\\u318E\\u3200-\\u321E\\u3260-\\u327E\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC'\n },\n {\n 'name': 'Hanifi_Rohingya',\n 'astral': '\\uD803[\\uDD00-\\uDD27\\uDD30-\\uDD39]'\n },\n {\n 'name': 'Hanunoo',\n 'bmp': '\\u1720-\\u1734'\n },\n {\n 'name': 'Hatran',\n 'astral': '\\uD802[\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDCFB-\\uDCFF]'\n },\n {\n 'name': 'Hebrew',\n 'bmp': '\\u0591-\\u05C7\\u05D0-\\u05EA\\u05EF-\\u05F4\\uFB1D-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFB4F'\n },\n {\n 'name': 'Hiragana',\n 'bmp': '\\u3041-\\u3096\\u309D-\\u309F',\n 'astral': '\\uD82C[\\uDC01-\\uDD1F\\uDD50-\\uDD52]|\\uD83C\\uDE00'\n },\n {\n 'name': 'Imperial_Aramaic',\n 'astral': '\\uD802[\\uDC40-\\uDC55\\uDC57-\\uDC5F]'\n },\n {\n 'name': 'Inherited',\n 'bmp': '\\u0300-\\u036F\\u0485\\u0486\\u064B-\\u0655\\u0670\\u0951-\\u0954\\u1AB0-\\u1ACE\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DFF\\u200C\\u200D\\u20D0-\\u20F0\\u302A-\\u302D\\u3099\\u309A\\uFE00-\\uFE0F\\uFE20-\\uFE2D',\n 'astral': '\\uD800[\\uDDFD\\uDEE0]|\\uD804\\uDF3B|\\uD833[\\uDF00-\\uDF2D\\uDF30-\\uDF46]|\\uD834[\\uDD67-\\uDD69\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD]|\\uDB40[\\uDD00-\\uDDEF]'\n },\n {\n 'name': 'Inscriptional_Pahlavi',\n 'astral': '\\uD802[\\uDF60-\\uDF72\\uDF78-\\uDF7F]'\n },\n {\n 'name': 'Inscriptional_Parthian',\n 'astral': '\\uD802[\\uDF40-\\uDF55\\uDF58-\\uDF5F]'\n },\n {\n 'name': 'Javanese',\n 'bmp': '\\uA980-\\uA9CD\\uA9D0-\\uA9D9\\uA9DE\\uA9DF'\n },\n {\n 'name': 'Kaithi',\n 'astral': '\\uD804[\\uDC80-\\uDCC2\\uDCCD]'\n },\n {\n 'name': 'Kannada',\n 'bmp': '\\u0C80-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDD\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2'\n },\n {\n 'name': 'Katakana',\n 'bmp': '\\u30A1-\\u30FA\\u30FD-\\u30FF\\u31F0-\\u31FF\\u32D0-\\u32FE\\u3300-\\u3357\\uFF66-\\uFF6F\\uFF71-\\uFF9D',\n 'astral': '\\uD82B[\\uDFF0-\\uDFF3\\uDFF5-\\uDFFB\\uDFFD\\uDFFE]|\\uD82C[\\uDC00\\uDD20-\\uDD22\\uDD64-\\uDD67]'\n },\n {\n 'name': 'Kayah_Li',\n 'bmp': '\\uA900-\\uA92D\\uA92F'\n },\n {\n 'name': 'Kharoshthi',\n 'astral': '\\uD802[\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE35\\uDE38-\\uDE3A\\uDE3F-\\uDE48\\uDE50-\\uDE58]'\n },\n {\n 'name': 'Khitan_Small_Script',\n 'astral': '\\uD81B\\uDFE4|\\uD822[\\uDF00-\\uDFFF]|\\uD823[\\uDC00-\\uDCD5]'\n },\n {\n 'name': 'Khmer',\n 'bmp': '\\u1780-\\u17DD\\u17E0-\\u17E9\\u17F0-\\u17F9\\u19E0-\\u19FF'\n },\n {\n 'name': 'Khojki',\n 'astral': '\\uD804[\\uDE00-\\uDE11\\uDE13-\\uDE3E]'\n },\n {\n 'name': 'Khudawadi',\n 'astral': '\\uD804[\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9]'\n },\n {\n 'name': 'Lao',\n 'bmp': '\\u0E81\\u0E82\\u0E84\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF'\n },\n {\n 'name': 'Latin',\n 'bmp': 'A-Za-z\\xAA\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02B8\\u02E0-\\u02E4\\u1D00-\\u1D25\\u1D2C-\\u1D5C\\u1D62-\\u1D65\\u1D6B-\\u1D77\\u1D79-\\u1DBE\\u1E00-\\u1EFF\\u2071\\u207F\\u2090-\\u209C\\u212A\\u212B\\u2132\\u214E\\u2160-\\u2188\\u2C60-\\u2C7F\\uA722-\\uA787\\uA78B-\\uA7CA\\uA7D0\\uA7D1\\uA7D3\\uA7D5-\\uA7D9\\uA7F2-\\uA7FF\\uAB30-\\uAB5A\\uAB5C-\\uAB64\\uAB66-\\uAB69\\uFB00-\\uFB06\\uFF21-\\uFF3A\\uFF41-\\uFF5A',\n 'astral': '\\uD801[\\uDF80-\\uDF85\\uDF87-\\uDFB0\\uDFB2-\\uDFBA]|\\uD837[\\uDF00-\\uDF1E]'\n },\n {\n 'name': 'Lepcha',\n 'bmp': '\\u1C00-\\u1C37\\u1C3B-\\u1C49\\u1C4D-\\u1C4F'\n },\n {\n 'name': 'Limbu',\n 'bmp': '\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1940\\u1944-\\u194F'\n },\n {\n 'name': 'Linear_A',\n 'astral': '\\uD801[\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]'\n },\n {\n 'name': 'Linear_B',\n 'astral': '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA]'\n },\n {\n 'name': 'Lisu',\n 'bmp': '\\uA4D0-\\uA4FF',\n 'astral': '\\uD807\\uDFB0'\n },\n {\n 'name': 'Lycian',\n 'astral': '\\uD800[\\uDE80-\\uDE9C]'\n },\n {\n 'name': 'Lydian',\n 'astral': '\\uD802[\\uDD20-\\uDD39\\uDD3F]'\n },\n {\n 'name': 'Mahajani',\n 'astral': '\\uD804[\\uDD50-\\uDD76]'\n },\n {\n 'name': 'Makasar',\n 'astral': '\\uD807[\\uDEE0-\\uDEF8]'\n },\n {\n 'name': 'Malayalam',\n 'bmp': '\\u0D00-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4F\\u0D54-\\u0D63\\u0D66-\\u0D7F'\n },\n {\n 'name': 'Mandaic',\n 'bmp': '\\u0840-\\u085B\\u085E'\n },\n {\n 'name': 'Manichaean',\n 'astral': '\\uD802[\\uDEC0-\\uDEE6\\uDEEB-\\uDEF6]'\n },\n {\n 'name': 'Marchen',\n 'astral': '\\uD807[\\uDC70-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]'\n },\n {\n 'name': 'Masaram_Gondi',\n 'astral': '\\uD807[\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD36\\uDD3A\\uDD3C\\uDD3D\\uDD3F-\\uDD47\\uDD50-\\uDD59]'\n },\n {\n 'name': 'Medefaidrin',\n 'astral': '\\uD81B[\\uDE40-\\uDE9A]'\n },\n {\n 'name': 'Meetei_Mayek',\n 'bmp': '\\uAAE0-\\uAAF6\\uABC0-\\uABED\\uABF0-\\uABF9'\n },\n {\n 'name': 'Mende_Kikakui',\n 'astral': '\\uD83A[\\uDC00-\\uDCC4\\uDCC7-\\uDCD6]'\n },\n {\n 'name': 'Meroitic_Cursive',\n 'astral': '\\uD802[\\uDDA0-\\uDDB7\\uDDBC-\\uDDCF\\uDDD2-\\uDDFF]'\n },\n {\n 'name': 'Meroitic_Hieroglyphs',\n 'astral': '\\uD802[\\uDD80-\\uDD9F]'\n },\n {\n 'name': 'Miao',\n 'astral': '\\uD81B[\\uDF00-\\uDF4A\\uDF4F-\\uDF87\\uDF8F-\\uDF9F]'\n },\n {\n 'name': 'Modi',\n 'astral': '\\uD805[\\uDE00-\\uDE44\\uDE50-\\uDE59]'\n },\n {\n 'name': 'Mongolian',\n 'bmp': '\\u1800\\u1801\\u1804\\u1806-\\u1819\\u1820-\\u1878\\u1880-\\u18AA',\n 'astral': '\\uD805[\\uDE60-\\uDE6C]'\n },\n {\n 'name': 'Mro',\n 'astral': '\\uD81A[\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDE6E\\uDE6F]'\n },\n {\n 'name': 'Multani',\n 'astral': '\\uD804[\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA9]'\n },\n {\n 'name': 'Myanmar',\n 'bmp': '\\u1000-\\u109F\\uA9E0-\\uA9FE\\uAA60-\\uAA7F'\n },\n {\n 'name': 'Nabataean',\n 'astral': '\\uD802[\\uDC80-\\uDC9E\\uDCA7-\\uDCAF]'\n },\n {\n 'name': 'Nandinagari',\n 'astral': '\\uD806[\\uDDA0-\\uDDA7\\uDDAA-\\uDDD7\\uDDDA-\\uDDE4]'\n },\n {\n 'name': 'New_Tai_Lue',\n 'bmp': '\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u19DE\\u19DF'\n },\n {\n 'name': 'Newa',\n 'astral': '\\uD805[\\uDC00-\\uDC5B\\uDC5D-\\uDC61]'\n },\n {\n 'name': 'Nko',\n 'bmp': '\\u07C0-\\u07FA\\u07FD-\\u07FF'\n },\n {\n 'name': 'Nushu',\n 'astral': '\\uD81B\\uDFE1|\\uD82C[\\uDD70-\\uDEFB]'\n },\n {\n 'name': 'Nyiakeng_Puachue_Hmong',\n 'astral': '\\uD838[\\uDD00-\\uDD2C\\uDD30-\\uDD3D\\uDD40-\\uDD49\\uDD4E\\uDD4F]'\n },\n {\n 'name': 'Ogham',\n 'bmp': '\\u1680-\\u169C'\n },\n {\n 'name': 'Ol_Chiki',\n 'bmp': '\\u1C50-\\u1C7F'\n },\n {\n 'name': 'Old_Hungarian',\n 'astral': '\\uD803[\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDCFA-\\uDCFF]'\n },\n {\n 'name': 'Old_Italic',\n 'astral': '\\uD800[\\uDF00-\\uDF23\\uDF2D-\\uDF2F]'\n },\n {\n 'name': 'Old_North_Arabian',\n 'astral': '\\uD802[\\uDE80-\\uDE9F]'\n },\n {\n 'name': 'Old_Permic',\n 'astral': '\\uD800[\\uDF50-\\uDF7A]'\n },\n {\n 'name': 'Old_Persian',\n 'astral': '\\uD800[\\uDFA0-\\uDFC3\\uDFC8-\\uDFD5]'\n },\n {\n 'name': 'Old_Sogdian',\n 'astral': '\\uD803[\\uDF00-\\uDF27]'\n },\n {\n 'name': 'Old_South_Arabian',\n 'astral': '\\uD802[\\uDE60-\\uDE7F]'\n },\n {\n 'name': 'Old_Turkic',\n 'astral': '\\uD803[\\uDC00-\\uDC48]'\n },\n {\n 'name': 'Old_Uyghur',\n 'astral': '\\uD803[\\uDF70-\\uDF89]'\n },\n {\n 'name': 'Oriya',\n 'bmp': '\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B55-\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B77'\n },\n {\n 'name': 'Osage',\n 'astral': '\\uD801[\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB]'\n },\n {\n 'name': 'Osmanya',\n 'astral': '\\uD801[\\uDC80-\\uDC9D\\uDCA0-\\uDCA9]'\n },\n {\n 'name': 'Pahawh_Hmong',\n 'astral': '\\uD81A[\\uDF00-\\uDF45\\uDF50-\\uDF59\\uDF5B-\\uDF61\\uDF63-\\uDF77\\uDF7D-\\uDF8F]'\n },\n {\n 'name': 'Palmyrene',\n 'astral': '\\uD802[\\uDC60-\\uDC7F]'\n },\n {\n 'name': 'Pau_Cin_Hau',\n 'astral': '\\uD806[\\uDEC0-\\uDEF8]'\n },\n {\n 'name': 'Phags_Pa',\n 'bmp': '\\uA840-\\uA877'\n },\n {\n 'name': 'Phoenician',\n 'astral': '\\uD802[\\uDD00-\\uDD1B\\uDD1F]'\n },\n {\n 'name': 'Psalter_Pahlavi',\n 'astral': '\\uD802[\\uDF80-\\uDF91\\uDF99-\\uDF9C\\uDFA9-\\uDFAF]'\n },\n {\n 'name': 'Rejang',\n 'bmp': '\\uA930-\\uA953\\uA95F'\n },\n {\n 'name': 'Runic',\n 'bmp': '\\u16A0-\\u16EA\\u16EE-\\u16F8'\n },\n {\n 'name': 'Samaritan',\n 'bmp': '\\u0800-\\u082D\\u0830-\\u083E'\n },\n {\n 'name': 'Saurashtra',\n 'bmp': '\\uA880-\\uA8C5\\uA8CE-\\uA8D9'\n },\n {\n 'name': 'Sharada',\n 'astral': '\\uD804[\\uDD80-\\uDDDF]'\n },\n {\n 'name': 'Shavian',\n 'astral': '\\uD801[\\uDC50-\\uDC7F]'\n },\n {\n 'name': 'Siddham',\n 'astral': '\\uD805[\\uDD80-\\uDDB5\\uDDB8-\\uDDDD]'\n },\n {\n 'name': 'SignWriting',\n 'astral': '\\uD836[\\uDC00-\\uDE8B\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]'\n },\n {\n 'name': 'Sinhala',\n 'bmp': '\\u0D81-\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2-\\u0DF4',\n 'astral': '\\uD804[\\uDDE1-\\uDDF4]'\n },\n {\n 'name': 'Sogdian',\n 'astral': '\\uD803[\\uDF30-\\uDF59]'\n },\n {\n 'name': 'Sora_Sompeng',\n 'astral': '\\uD804[\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9]'\n },\n {\n 'name': 'Soyombo',\n 'astral': '\\uD806[\\uDE50-\\uDEA2]'\n },\n {\n 'name': 'Sundanese',\n 'bmp': '\\u1B80-\\u1BBF\\u1CC0-\\u1CC7'\n },\n {\n 'name': 'Syloti_Nagri',\n 'bmp': '\\uA800-\\uA82C'\n },\n {\n 'name': 'Syriac',\n 'bmp': '\\u0700-\\u070D\\u070F-\\u074A\\u074D-\\u074F\\u0860-\\u086A'\n },\n {\n 'name': 'Tagalog',\n 'bmp': '\\u1700-\\u1715\\u171F'\n },\n {\n 'name': 'Tagbanwa',\n 'bmp': '\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773'\n },\n {\n 'name': 'Tai_Le',\n 'bmp': '\\u1950-\\u196D\\u1970-\\u1974'\n },\n {\n 'name': 'Tai_Tham',\n 'bmp': '\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA0-\\u1AAD'\n },\n {\n 'name': 'Tai_Viet',\n 'bmp': '\\uAA80-\\uAAC2\\uAADB-\\uAADF'\n },\n {\n 'name': 'Takri',\n 'astral': '\\uD805[\\uDE80-\\uDEB9\\uDEC0-\\uDEC9]'\n },\n {\n 'name': 'Tamil',\n 'bmp': '\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BFA',\n 'astral': '\\uD807[\\uDFC0-\\uDFF1\\uDFFF]'\n },\n {\n 'name': 'Tangsa',\n 'astral': '\\uD81A[\\uDE70-\\uDEBE\\uDEC0-\\uDEC9]'\n },\n {\n 'name': 'Tangut',\n 'astral': '\\uD81B\\uDFE0|[\\uD81C-\\uD820][\\uDC00-\\uDFFF]|\\uD821[\\uDC00-\\uDFF7]|\\uD822[\\uDC00-\\uDEFF]|\\uD823[\\uDD00-\\uDD08]'\n },\n {\n 'name': 'Telugu',\n 'bmp': '\\u0C00-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3C-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C5D\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C77-\\u0C7F'\n },\n {\n 'name': 'Thaana',\n 'bmp': '\\u0780-\\u07B1'\n },\n {\n 'name': 'Thai',\n 'bmp': '\\u0E01-\\u0E3A\\u0E40-\\u0E5B'\n },\n {\n 'name': 'Tibetan',\n 'bmp': '\\u0F00-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F97\\u0F99-\\u0FBC\\u0FBE-\\u0FCC\\u0FCE-\\u0FD4\\u0FD9\\u0FDA'\n },\n {\n 'name': 'Tifinagh',\n 'bmp': '\\u2D30-\\u2D67\\u2D6F\\u2D70\\u2D7F'\n },\n {\n 'name': 'Tirhuta',\n 'astral': '\\uD805[\\uDC80-\\uDCC7\\uDCD0-\\uDCD9]'\n },\n {\n 'name': 'Toto',\n 'astral': '\\uD838[\\uDE90-\\uDEAE]'\n },\n {\n 'name': 'Ugaritic',\n 'astral': '\\uD800[\\uDF80-\\uDF9D\\uDF9F]'\n },\n {\n 'name': 'Vai',\n 'bmp': '\\uA500-\\uA62B'\n },\n {\n 'name': 'Vithkuqi',\n 'astral': '\\uD801[\\uDD70-\\uDD7A\\uDD7C-\\uDD8A\\uDD8C-\\uDD92\\uDD94\\uDD95\\uDD97-\\uDDA1\\uDDA3-\\uDDB1\\uDDB3-\\uDDB9\\uDDBB\\uDDBC]'\n },\n {\n 'name': 'Wancho',\n 'astral': '\\uD838[\\uDEC0-\\uDEF9\\uDEFF]'\n },\n {\n 'name': 'Warang_Citi',\n 'astral': '\\uD806[\\uDCA0-\\uDCF2\\uDCFF]'\n },\n {\n 'name': 'Yezidi',\n 'astral': '\\uD803[\\uDE80-\\uDEA9\\uDEAB-\\uDEAD\\uDEB0\\uDEB1]'\n },\n {\n 'name': 'Yi',\n 'bmp': '\\uA000-\\uA48C\\uA490-\\uA4C6'\n },\n {\n 'name': 'Zanabazar_Square',\n 'astral': '\\uD806[\\uDE00-\\uDE47]'\n }\n];\n","/*!\n * XRegExp 5.1.1\n * <xregexp.com>\n * Steven Levithan (c) 2007-present MIT License\n */\n\n/**\n * XRegExp provides augmented, extensible regular expressions. You get additional regex syntax and\n * flags, beyond what browsers support natively. XRegExp is also a regex utility belt with tools to\n * make your client-side grepping simpler and more powerful, while freeing you from related\n * cross-browser inconsistencies.\n */\n\n// ==--------------------------==\n// Private stuff\n// ==--------------------------==\n\n// Property name used for extended regex instance data\nconst REGEX_DATA = 'xregexp';\n// Optional features that can be installed and uninstalled\nconst features = {\n astral: false,\n namespacing: true\n};\n// Storage for fixed/extended native methods\nconst fixed = {};\n// Storage for regexes cached by `XRegExp.cache`\nlet regexCache = {};\n// Storage for pattern details cached by the `XRegExp` constructor\nlet patternCache = {};\n// Storage for regex syntax tokens added internally or by `XRegExp.addToken`\nconst tokens = [];\n// Token scopes\nconst defaultScope = 'default';\nconst classScope = 'class';\n// Regexes that match native regex syntax, including octals\nconst nativeTokens = {\n // Any native multicharacter token in default scope, or any single character\n 'default': /\\\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\\d*|x[\\dA-Fa-f]{2}|u(?:[\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|c[A-Za-z]|[\\s\\S])|\\(\\?(?:[:=!]|<[=!])|[?*+]\\?|{\\d+(?:,\\d*)?}\\??|[\\s\\S]/,\n // Any native multicharacter token in character class scope, or any single character\n 'class': /\\\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\\dA-Fa-f]{2}|u(?:[\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|c[A-Za-z]|[\\s\\S])|[\\s\\S]/\n};\n// Any backreference or dollar-prefixed character in replacement strings\nconst replacementToken = /\\$(?:\\{([^\\}]+)\\}|<([^>]+)>|(\\d\\d?|[\\s\\S]?))/g;\n// Check for correct `exec` handling of nonparticipating capturing groups\nconst correctExecNpcg = /()??/.exec('')[1] === undefined;\n// Check for ES6 `flags` prop support\nconst hasFlagsProp = /x/.flags !== undefined;\n\nfunction hasNativeFlag(flag) {\n // Can't check based on the presence of properties/getters since browsers might support such\n // properties even when they don't support the corresponding flag in regex construction (tested\n // in Chrome 48, where `'unicode' in /x/` is true but trying to construct a regex with flag `u`\n // throws an error)\n let isSupported = true;\n try {\n // Can't use regex literals for testing even in a `try` because regex literals with\n // unsupported flags cause a compilation error in IE\n new RegExp('', flag);\n\n // Work around a broken/incomplete IE11 polyfill for sticky introduced in core-js 3.6.0\n if (flag === 'y') {\n // Using function to avoid babel transform to regex literal\n const gy = (() => 'gy')();\n const incompleteY = '.a'.replace(new RegExp('a', gy), '.') === '..';\n if (incompleteY) {\n isSupported = false;\n }\n }\n } catch (exception) {\n isSupported = false;\n }\n return isSupported;\n}\n// Check for ES2021 `d` flag support\nconst hasNativeD = hasNativeFlag('d');\n// Check for ES2018 `s` flag support\nconst hasNativeS = hasNativeFlag('s');\n// Check for ES6 `u` flag support\nconst hasNativeU = hasNativeFlag('u');\n// Check for ES6 `y` flag support\nconst hasNativeY = hasNativeFlag('y');\n// Tracker for known flags, including addon flags\nconst registeredFlags = {\n d: hasNativeD,\n g: true,\n i: true,\n m: true,\n s: hasNativeS,\n u: hasNativeU,\n y: hasNativeY\n};\n// Flags to remove when passing to native `RegExp` constructor\nconst nonnativeFlags = hasNativeS ? /[^dgimsuy]+/g : /[^dgimuy]+/g;\n\n/**\n * Attaches extended data and `XRegExp.prototype` properties to a regex object.\n *\n * @private\n * @param {RegExp} regex Regex to augment.\n * @param {Array} captureNames Array with capture names, or `null`.\n * @param {String} xSource XRegExp pattern used to generate `regex`, or `null` if N/A.\n * @param {String} xFlags XRegExp flags used to generate `regex`, or `null` if N/A.\n * @param {Boolean} [isInternalOnly=false] Whether the regex will be used only for internal\n * operations, and never exposed to users. For internal-only regexes, we can improve perf by\n * skipping some operations like attaching `XRegExp.prototype` properties.\n * @returns {!RegExp} Augmented regex.\n */\nfunction augment(regex, captureNames, xSource, xFlags, isInternalOnly) {\n regex[REGEX_DATA] = {\n captureNames\n };\n\n if (isInternalOnly) {\n return regex;\n }\n\n // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value\n if (regex.__proto__) {\n regex.__proto__ = XRegExp.prototype;\n } else {\n for (const p in XRegExp.prototype) {\n // An `XRegExp.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since this\n // is performance sensitive, and enumerable `Object.prototype` or `RegExp.prototype`\n // extensions exist on `regex.prototype` anyway\n regex[p] = XRegExp.prototype[p];\n }\n }\n\n regex[REGEX_DATA].source = xSource;\n // Emulate the ES6 `flags` prop by ensuring flags are in alphabetical order\n regex[REGEX_DATA].flags = xFlags ? xFlags.split('').sort().join('') : xFlags;\n\n return regex;\n}\n\n/**\n * Removes any duplicate characters from the provided string.\n *\n * @private\n * @param {String} str String to remove duplicate characters from.\n * @returns {string} String with any duplicate characters removed.\n */\nfunction clipDuplicates(str) {\n return str.replace(/([\\s\\S])(?=[\\s\\S]*\\1)/g, '');\n}\n\n/**\n * Copies a regex object while preserving extended data and augmenting with `XRegExp.prototype`\n * properties. The copy has a fresh `lastIndex` property (set to zero). Allows adding and removing\n * flags g and y while copying the regex.\n *\n * @private\n * @param {RegExp} regex Regex to copy.\n * @param {Object} [options] Options object with optional properties:\n * - `addG` {Boolean} Add flag g while copying the regex.\n * - `addY` {Boolean} Add flag y while copying the regex.\n * - `removeG` {Boolean} Remove flag g while copying the regex.\n * - `removeY` {Boolean} Remove flag y while copying the regex.\n * - `isInternalOnly` {Boolean} Whether the copied regex will be used only for internal\n * operations, and never exposed to users. For internal-only regexes, we can improve perf by\n * skipping some operations like attaching `XRegExp.prototype` properties.\n * - `source` {String} Overrides `<regex>.source`, for special cases.\n * @returns {RegExp} Copy of the provided regex, possibly with modified flags.\n */\nfunction copyRegex(regex, options) {\n if (!XRegExp.isRegExp(regex)) {\n throw new TypeError('Type RegExp expected');\n }\n\n const xData = regex[REGEX_DATA] || {};\n let flags = getNativeFlags(regex);\n let flagsToAdd = '';\n let flagsToRemove = '';\n let xregexpSource = null;\n let xregexpFlags = null;\n\n options = options || {};\n\n if (options.removeG) {flagsToRemove += 'g';}\n if (options.removeY) {flagsToRemove += 'y';}\n if (flagsToRemove) {\n flags = flags.replace(new RegExp(`[${flagsToRemove}]+`, 'g'), '');\n }\n\n if (options.addG) {flagsToAdd += 'g';}\n if (options.addY) {flagsToAdd += 'y';}\n if (flagsToAdd) {\n flags = clipDuplicates(flags + flagsToAdd);\n }\n\n if (!options.isInternalOnly) {\n if (xData.source !== undefined) {\n xregexpSource = xData.source;\n }\n // null or undefined; don't want to add to `flags` if the previous value was null, since\n // that indicates we're not tracking original precompilation flags\n if (xData.flags != null) {\n // Flags are only added for non-internal regexes by `XRegExp.globalize`. Flags are never\n // removed for non-internal regexes, so don't need to handle it\n xregexpFlags = flagsToAdd ? clipDuplicates(xData.flags + flagsToAdd) : xData.flags;\n }\n }\n\n // Augment with `XRegExp.prototype` properties, but use the native `RegExp` constructor to avoid\n // searching for special tokens. That would be wrong for regexes constructed by `RegExp`, and\n // unnecessary for regexes constructed by `XRegExp` because the regex has already undergone the\n // translation to native regex syntax\n regex = augment(\n new RegExp(options.source || regex.source, flags),\n hasNamedCapture(regex) ? xData.captureNames.slice(0) : null,\n xregexpSource,\n xregexpFlags,\n options.isInternalOnly\n );\n\n return regex;\n}\n\n/**\n * Converts hexadecimal to decimal.\n *\n * @private\n * @param {String} hex\n * @returns {number}\n */\nfunction dec(hex) {\n return parseInt(hex, 16);\n}\n\n/**\n * Returns a pattern that can be used in a native RegExp in place of an ignorable token such as an\n * inline comment or whitespace with flag x. This is used directly as a token handler function\n * passed to `XRegExp.addToken`.\n *\n * @private\n * @param {String} match Match arg of `XRegExp.addToken` handler\n * @param {String} scope Scope arg of `XRegExp.addToken` handler\n * @param {String} flags Flags arg of `XRegExp.addToken` handler\n * @returns {string} Either '' or '(?:)', depending on which is needed in the context of the match.\n */\nfunction getContextualTokenSeparator(match, scope, flags) {\n const matchEndPos = match.index + match[0].length;\n const precedingChar = match.input[match.index - 1];\n const followingChar = match.input[matchEndPos];\n if (\n // No need to separate tokens if at the beginning or end of a group, before or after a\n // group, or before or after a `|`\n /^[()|]$/.test(precedingChar) ||\n /^[()|]$/.test(followingChar) ||\n // No need to separate tokens if at the beginning or end of the pattern\n match.index === 0 ||\n matchEndPos === match.input.length ||\n // No need to separate tokens if at the beginning of a noncapturing group or lookaround.\n // Looks only at the last 4 chars (at most) for perf when constructing long regexes.\n /\\(\\?(?:[:=!]|<[=!])$/.test(match.input.substring(match.index - 4, match.index)) ||\n // Avoid separating tokens when the following token is a quantifier\n isQuantifierNext(match.input, matchEndPos, flags)\n ) {\n return '';\n }\n // Keep tokens separated. This avoids e.g. inadvertedly changing `\\1 1` or `\\1(?#)1` to `\\11`.\n // This also ensures all tokens remain as discrete atoms, e.g. it prevents converting the\n // syntax error `(? :` into `(?:`.\n return '(?:)';\n}\n\n/**\n * Returns native `RegExp` flags used by a regex object.\n *\n * @private\n * @param {RegExp} regex Regex to check.\n * @returns {string} Native flags in use.\n */\nfunction getNativeFlags(regex) {\n return hasFlagsProp ?\n regex.flags :\n // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation\n // with an empty string) allows this to continue working predictably when\n // `XRegExp.proptotype.toString` is overridden\n /\\/([a-z]*)$/i.exec(RegExp.prototype.toString.call(regex))[1];\n}\n\n/**\n * Determines whether a regex has extended instance data used to track capture names.\n *\n * @private\n * @param {RegExp} regex Regex to check.\n * @returns {boolean} Whether the regex uses named capture.\n */\nfunction hasNamedCapture(regex) {\n return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames);\n}\n\n/**\n * Converts decimal to hexadecimal.\n *\n * @private\n * @param {Number|String} dec\n * @returns {string}\n */\nfunction hex(dec) {\n return parseInt(dec, 10).toString(16);\n}\n\n/**\n * Checks whether the next nonignorable token after the specified position is a quantifier.\n *\n * @private\n * @param {String} pattern Pattern to search within.\n * @param {Number} pos Index in `pattern` to search at.\n * @param {String} flags Flags used by the pattern.\n * @returns {Boolean} Whether the next nonignorable token is a quantifier.\n */\nfunction isQuantifierNext(pattern, pos, flags) {\n const inlineCommentPattern = '\\\\(\\\\?#[^)]*\\\\)';\n const lineCommentPattern = '#[^#\\\\n]*';\n const quantifierPattern = '[?*+]|{\\\\d+(?:,\\\\d*)?}';\n const regex = flags.includes('x') ?\n // Ignore any leading whitespace, line comments, and inline comments\n new RegExp(`^(?:\\\\s|${lineCommentPattern}|${inlineCommentPattern})*(?:${quantifierPattern})`) :\n // Ignore any leading inline comments\n new RegExp(`^(?:${inlineCommentPattern})*(?:${quantifierPattern})`);\n return regex.test(pattern.slice(pos));\n}\n\n/**\n * Determines whether a value is of the specified type, by resolving its internal [[Class]].\n *\n * @private\n * @param {*} value Object to check.\n * @param {String} type Type to check for, in TitleCase.\n * @returns {boolean} Whether the object matches the type.\n */\nfunction isType(value, type) {\n return Object.prototype.toString.call(value) === `[object ${type}]`;\n}\n\n/**\n * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow\n * the ES5 abstract operation `ToObject`.\n *\n * @private\n * @param {*} value Object to check and return.\n * @returns {*} The provided object.\n */\nfunction nullThrows(value) {\n // null or undefined\n if (value == null) {\n throw new TypeError('Cannot convert null or undefined to object');\n }\n\n return value;\n}\n\n/**\n * Adds leading zeros if shorter than four characters. Used for fixed-length hexadecimal values.\n *\n * @private\n * @param {String} str\n * @returns {string}\n */\nfunction pad4(str) {\n while (str.length < 4) {\n str = `0${str}`;\n }\n return str;\n}\n\n/**\n * Checks for flag-related errors, and strips/applies flags in a leading mode modifier. Offloads\n * the flag preparation logic from the `XRegExp` constructor.\n *\n * @private\n * @param {String} pattern Regex pattern, possibly with a leading mode modifier.\n * @param {String} flags Any combination of flags.\n * @returns {!Object} Object with properties `pattern` and `flags`.\n */\nfunction prepareFlags(pattern, flags) {\n // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags\n if (clipDuplicates(flags) !== flags) {\n throw new SyntaxError(`Invalid duplicate regex flag ${flags}`);\n }\n\n // Strip and apply a leading mode modifier with any combination of flags except `dgy`\n pattern = pattern.replace(/^\\(\\?([\\w$]+)\\)/, ($0, $1) => {\n if (/[dgy]/.test($1)) {\n throw new SyntaxError(`Cannot use flags dgy in mode modifier ${$0}`);\n }\n // Allow duplicate flags within the mode modifier\n flags = clipDuplicates(flags + $1);\n return '';\n });\n\n // Throw on unknown native or nonnative flags\n for (const flag of flags) {\n if (!registeredFlags[flag]) {\n throw new SyntaxError(`Unknown regex flag ${flag}`);\n }\n }\n\n return {\n pattern,\n flags\n };\n}\n\n/**\n * Prepares an options object from the given value.\n *\n * @private\n * @param {String|Object} value Value to convert to an options object.\n * @returns {Object} Options object.\n */\nfunction prepareOptions(value) {\n const options = {};\n\n if (isType(value, 'String')) {\n XRegExp.forEach(value, /[^\\s,]+/, (match) => {\n options[match] = true;\n });\n\n return options;\n }\n\n return value;\n}\n\n/**\n * Registers a flag so it doesn't throw an 'unknown flag' error.\n *\n * @private\n * @param {String} flag Single-character flag to register.\n */\nfunction registerFlag(flag) {\n if (!/^[\\w$]$/.test(flag)) {\n throw new Error('Flag must be a single character A-Za-z0-9_$');\n }\n\n registeredFlags[flag] = true;\n}\n\n/**\n * Runs built-in and custom regex syntax tokens in reverse insertion order at the specified\n * position, until a match is found.\n *\n * @private\n * @param {String} pattern Original pattern from which an XRegExp object is being built.\n * @param {String} flags Flags being used to construct the regex.\n * @param {Number} pos Position to search for tokens within `pattern`.\n * @param {Number} scope Regex scope to apply: 'default' or 'class'.\n * @param {Object} context Context object to use for token handler functions.\n * @returns {Object} Object with properties `matchLength`, `output`, and `reparse`; or `null`.\n */\nfunction runTokens(pattern, flags, pos, scope, context) {\n let i = tokens.length;\n const leadChar = pattern[pos];\n let result = null;\n let match;\n let t;\n\n // Run in reverse insertion order\n while (i--) {\n t = tokens[i];\n if (\n (t.leadChar && t.leadChar !== leadChar) ||\n (t.scope !== scope && t.scope !== 'all') ||\n (t.flag && !flags.includes(t.flag))\n ) {\n continue;\n }\n\n match = XRegExp.exec(pattern, t.regex, pos, 'sticky');\n if (match) {\n result = {\n matchLength: match[0].length,\n output: t.handler.call(context, match, scope, flags),\n reparse: t.reparse\n };\n // Finished with token tests\n break;\n }\n }\n\n return result;\n}\n\n/**\n * Enables or disables implicit astral mode opt-in. When enabled, flag A is automatically added to\n * all new regexes created by XRegExp. This causes an error to be thrown when creating regexes if\n * the Unicode Base addon is not available, since flag A is registered by that addon.\n *\n * @private\n * @param {Boolean} on `true` to enable; `false` to disable.\n */\nfunction setAstral(on) {\n features.astral = on;\n}\n\n/**\n * Adds named capture groups to the `groups` property of match arrays. See here for details:\n * https://github.com/tc39/proposal-regexp-named-groups\n *\n * @private\n * @param {Boolean} on `true` to enable; `false` to disable.\n */\nfunction setNamespacing(on) {\n features.namespacing = on;\n}\n\n// ==--------------------------==\n// Constructor\n// ==--------------------------==\n\n/**\n * Creates an extended regular expression object for matching text with a pattern. Differs from a\n * native regular expression in that additional syntax and flags are supported. The returned object\n * is in fact a native `RegExp` and works with all native methods.\n *\n * @class XRegExp\n * @constructor\n * @param {String|RegExp} pattern Regex pattern string, or an existing regex object to copy.\n * @param {String} [flags] Any combination of flags.\n * Native flags:\n * - `d` - indices for capturing groups (ES2021)\n * - `g` - global\n * - `i` - ignore case\n * - `m` - multiline anchors\n * - `u` - unicode (ES6)\n * - `y` - sticky (Firefox 3+, ES6)\n * Additional XRegExp flags:\n * - `n` - named capture only\n * - `s` - dot matches all (aka singleline) - works even when not natively supported\n * - `x` - free-spacing and line comments (aka extended)\n * - `A` - 21-bit Unicode properties (aka astral) - requires the Unicode Base addon\n * Flags cannot be provided when constructing one `RegExp` from another.\n * @returns {RegExp} Extended regular expression object.\n * @example\n *\n * // With named capture and flag x\n * XRegExp(`(?<year> [0-9]{4} ) -? # year\n * (?<month> [0-9]{2} ) -? # month\n * (?<day> [0-9]{2} ) # day`, 'x');\n *\n * // Providing a regex object copies it. Native regexes are recompiled using native (not XRegExp)\n * // syntax. Copies maintain extended data, are augmented with `XRegExp.prototype` properties, and\n * // have fresh `lastIndex` properties (set to zero).\n * XRegExp(/regex/);\n */\nfunction XRegExp(pattern, flags) {\n if (XRegExp.isRegExp(pattern)) {\n if (flags !== undefined) {\n throw new TypeError('Cannot supply flags when copying a RegExp');\n }\n return copyRegex(pattern);\n }\n\n // Copy the argument behavior of `RegExp`\n pattern = pattern === undefined ? '' : String(pattern);\n flags = flags === undefined ? '' : String(flags);\n\n if (XRegExp.isInstalled('astral') && !flags.includes('A')) {\n // This causes an error to be thrown if the Unicode Base addon is not available\n flags += 'A';\n }\n\n if (!patternCache[pattern]) {\n patternCache[pattern] = {};\n }\n\n if (!patternCache[pattern][flags]) {\n const context = {\n hasNamedCapture: false,\n captureNames: []\n };\n let scope = defaultScope;\n let output = '';\n let pos = 0;\n let result;\n\n // Check for flag-related errors, and strip/apply flags in a leading mode modifier\n const applied = prepareFlags(pattern, flags);\n let appliedPattern = applied.pattern;\n const appliedFlags = applied.flags;\n\n // Use XRegExp's tokens to translate the pattern to a native regex pattern.\n // `appliedPattern.length` may change on each iteration if tokens use `reparse`\n while (pos < appliedPattern.length) {\n do {\n // Check for custom tokens at the current position\n result = runTokens(appliedPattern, appliedFlags, pos, scope, context);\n // If the matched token used the `reparse` option, splice its output into the\n // pattern before running tokens again at the same position\n if (result && result.reparse) {\n appliedPattern = appliedPattern.slice(0, pos) +\n result.output +\n appliedPattern.slice(pos + result.matchLength);\n }\n } while (result && result.reparse);\n\n if (result) {\n output += result.output;\n pos += (result.matchLength || 1);\n } else {\n // Get the native token at the current position\n const [token] = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky');\n output += token;\n pos += token.length;\n if (token === '[' && scope === defaultScope) {\n scope = classScope;\n } else if (token === ']' && scope === classScope) {\n scope = defaultScope;\n }\n }\n }\n\n patternCache[pattern][flags] = {\n // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty\n // groups are sometimes inserted during regex transpilation in order to keep tokens\n // separated. However, more than one empty group in a row is never needed.\n pattern: output.replace(/(?:\\(\\?:\\))+/g, '(?:)'),\n // Strip all but native flags\n flags: appliedFlags.replace(nonnativeFlags, ''),\n // `context.captureNames` has an item for each capturing group, even if unnamed\n captures: context.hasNamedCapture ? context.captureNames : null\n };\n }\n\n const generated = patternCache[pattern][flags];\n return augment(\n new RegExp(generated.pattern, generated.flags),\n generated.captures,\n pattern,\n flags\n );\n}\n\n// Add `RegExp.prototype` to the prototype chain\nXRegExp.prototype = new RegExp();\n\n// ==--------------------------==\n// Public properties\n// ==--------------------------==\n\n/**\n * The XRegExp version number as a string containing three dot-separated parts. For example,\n * '2.0.0-beta-3'.\n *\n * @static\n * @memberOf XRegExp\n * @type String\n */\nXRegExp.version = '5.1.1';\n\n// ==--------------------------==\n// Public methods\n// ==--------------------------==\n\n// Intentionally undocumented; used in tests and addons\nXRegExp._clipDuplicates = clipDuplicates;\nXRegExp._hasNativeFlag = hasNativeFlag;\nXRegExp._dec = dec;\nXRegExp._hex = hex;\nXRegExp._pad4 = pad4;\n\n/**\n * Extends XRegExp syntax and allows custom flags. This is used internally and can be used to\n * create XRegExp addons. If more than one token can match the same string, the last added wins.\n *\n * @memberOf XRegExp\n * @param {RegExp} regex Regex object that matches the new token.\n * @param {Function} handler Function that returns a new pattern string (using native regex syntax)\n * to replace the matched token within all future XRegExp regexes. Has access to persistent\n * properties of the regex being built, through `this`. Invoked with three arguments:\n * - The match array, with named backreference properties.\n * - The regex scope where the match was found: 'default' or 'class'.\n * - The flags used by the regex, including any flags in a leading mode modifier.\n * The handler function becomes part of the XRegExp construction process, so be careful not to\n * construct XRegExps within the function or you will trigger infinite recursion.\n * @param {Object} [options] Options object with optional properties:\n * - `scope` {String} Scope where the token applies: 'default', 'class', or 'all'.\n * - `flag` {String} Single-character flag that triggers the token. This also registers the\n * flag, which prevents XRegExp from throwing an 'unknown flag' error when the flag is used.\n * - `optionalFlags` {String} Any custom flags checked for within the token `handler` that are\n * not required to trigger the token. This registers the flags, to prevent XRegExp from\n * throwing an 'unknown flag' error when any of the flags are used.\n * - `reparse` {Boolean} Whether the `handler` function's output should not be treated as\n * final, and instead be reparseable by other tokens (including the current token). Allows\n * token chaining or deferring.\n * - `leadChar` {String} Single character that occurs at the beginning of any successful match\n * of the token (not always applicable). This doesn't change the behavior of the token unless\n * you provide an erroneous value. However, providing it can increase the token's performance\n * since the token can be skipped at any positions where this character doesn't appear.\n * @example\n *\n * // Basic usage: Add \\a for the ALERT control code\n * XRegExp.addToken(\n * /\\\\a/,\n * () => '\\\\x07',\n * {scope: 'all'}\n * );\n * XRegExp('\\\\a[\\\\a-\\\\n]+').test('\\x07\\n\\x07'); // -> true\n *\n * // Add the U (ungreedy) flag from PCRE and RE2, which reverses greedy and lazy quantifiers.\n * // Since `scope` is not specified, it uses 'default' (i.e., transformations apply outside of\n * // character classes only)\n * XRegExp.addToken(\n * /([?*+]|{\\d+(?:,\\d*)?})(\\??)/,\n * (match) => `${match[1]}${match[2] ? '' : '?'}`,\n * {flag: 'U'}\n * );\n * XRegExp('a+', 'U').exec('aaa')[0]; // -> 'a'\n * XRegExp('a+?', 'U').exec('aaa')[0]; // -> 'aaa'\n */\nXRegExp.addToken = (regex, handler, options) => {\n options = options || {};\n let {optionalFlags} = options;\n\n if (options.flag) {\n registerFlag(options.flag);\n }\n\n if (optionalFlags) {\n optionalFlags = optionalFlags.split('');\n for (const flag of optionalFlags) {\n registerFlag(flag);\n }\n }\n\n // Add to the private list of syntax tokens\n tokens.push({\n regex: copyRegex(regex, {\n addG: true,\n addY: hasNativeY,\n isInternalOnly: true\n }),\n handler,\n scope: options.scope || defaultScope,\n flag: options.flag,\n reparse: options.reparse,\n leadChar: options.leadChar\n });\n\n // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and flags\n // might now produce different results\n XRegExp.cache.flush('patterns');\n};\n\n/**\n * Caches and returns the result of calling `XRegExp(pattern, flags)`. On any subsequent call with\n * the same pattern and flag combination, the cached copy of the regex is returned.\n *\n * @memberOf XRegExp\n * @param {String} pattern Regex pattern string.\n * @param {String} [flags] Any combination of XRegExp flags.\n * @returns {RegExp} Cached XRegExp object.\n * @example\n *\n * let match;\n * while (match = XRegExp.cache('.', 'gs').exec('abc')) {\n * // The regex is compiled once only\n * }\n */\nXRegExp.cache = (pattern, flags) => {\n if (!regexCache[pattern]) {\n regexCache[pattern] = {};\n }\n return regexCache[pattern][flags] || (\n regexCache[pattern][flags] = XRegExp(pattern, flags)\n );\n};\n\n// Intentionally undocumented; used in tests\nXRegExp.cache.flush = (cacheName) => {\n if (cacheName === 'patterns') {\n // Flush the pattern cache used by the `XRegExp` constructor\n patternCache = {};\n } else {\n // Flush the regex cache populated by `XRegExp.cache`\n regexCache = {};\n }\n};\n\n/**\n * Escapes any regular expression metacharacters, for use when matching literal strings. The result\n * can safely be used at any position within a regex that uses any flags.\n *\n * @memberOf XRegExp\n * @param {String} str String to escape.\n * @returns {string} String with regex metacharacters escaped.\n * @example\n *\n * XRegExp.escape('Escaped? <.>');\n * // -> 'Escaped\\?\\u0020<\\.>'\n */\n// Following are the contexts where each metacharacter needs to be escaped because it would\n// otherwise have a special meaning, change the meaning of surrounding characters, or cause an\n// error. Context 'default' means outside character classes only.\n// - `\\` - context: all\n// - `[()*+?.$|` - context: default\n// - `]` - context: default with flag u or if forming the end of a character class\n// - `{}` - context: default with flag u or if part of a valid/complete quantifier pattern\n// - `,` - context: default if in a position that causes an unescaped `{` to turn into a quantifier.\n// Ex: `/^a{1\\,2}$/` matches `'a{1,2}'`, but `/^a{1,2}$/` matches `'a'` or `'aa'`\n// - `#` and <whitespace> - context: default with flag x\n// - `^` - context: default, and context: class if it's the first character in the class\n// - `-` - context: class if part of a valid character class range\nXRegExp.escape = (str) => String(nullThrows(str)).\n // Escape most special chars with a backslash\n replace(/[\\\\\\[\\]{}()*+?.^$|]/g, '\\\\$&').\n // Convert to \\uNNNN for special chars that can't be escaped when used with ES6 flag `u`\n replace(/[\\s#\\-,]/g, (match) => `\\\\u${pad4(hex(match.charCodeAt(0)))}`);\n\n/**\n * Executes a regex search in a specified string. Returns a match array or `null`. If the provided\n * regex uses named capture, named capture properties are included on the match array's `groups`\n * property. Optional `pos` and `sticky` arguments specify the search start position, and whether\n * the match must start at the specified position only. The `lastIndex` property of the provided\n * regex is not used, but is updated for compatibility. Also fixes browser bugs compared to the\n * native `RegExp.prototype.exec` and can be used reliably cross-browser.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp} regex Regex to search with.\n * @param {Number} [pos=0] Zero-based index at which to start the search.\n * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position\n * only. The string `'sticky'` is accepted as an alternative to `true`.\n * @returns {Array} Match array with named capture properties on the `groups` object, or `null`. If\n * the `namespacing` feature is off, named capture properties are directly on the match array.\n * @example\n *\n * // Basic use, with named capturing group\n * let match = XRegExp.exec('U+2620', XRegExp('U\\\\+(?<hex>[0-9A-F]{4})'));\n * match.groups.hex; // -> '2620'\n *\n * // With pos and sticky, in a loop\n * let pos = 3, result = [], match;\n * while (match = XRegExp.exec('<1><2><3><4>5<6>', /<(\\d)>/, pos, 'sticky')) {\n * result.push(match[1]);\n * pos = match.index + match[0].length;\n * }\n * // result -> ['2', '3', '4']\n */\nXRegExp.exec = (str, regex, pos, sticky) => {\n let cacheKey = 'g';\n let addY = false;\n let fakeY = false;\n let match;\n\n addY = hasNativeY && !!(sticky || (regex.sticky && sticky !== false));\n if (addY) {\n cacheKey += 'y';\n } else if (sticky) {\n // Simulate sticky matching by appending an empty capture to the original regex. The\n // resulting regex will succeed no matter what at the current index (set with `lastIndex`),\n // and will not search the rest of the subject string. We'll know that the original regex\n // has failed if that last capture is `''` rather than `undefined` (i.e., if that last\n // capture participated in the match).\n fakeY = true;\n cacheKey += 'FakeY';\n }\n\n regex[REGEX_DATA] = regex[REGEX_DATA] || {};\n\n // Shares cached copies with `XRegExp.match`/`replace`\n const r2 = regex[REGEX_DATA][cacheKey] || (\n regex[REGEX_DATA][cacheKey] = copyRegex(regex, {\n addG: true,\n addY,\n source: fakeY ? `${regex.source}|()` : undefined,\n removeY: sticky === false,\n isInternalOnly: true\n })\n );\n\n pos = pos || 0;\n r2.lastIndex = pos;\n\n // Fixed `exec` required for `lastIndex` fix, named backreferences, etc.\n match = fixed.exec.call(r2, str);\n\n // Get rid of the capture added by the pseudo-sticky matcher if needed. An empty string means\n // the original regexp failed (see above).\n if (fakeY && match && match.pop() === '') {\n match = null;\n }\n\n if (regex.global) {\n regex.lastIndex = match ? r2.lastIndex : 0;\n }\n\n return match;\n};\n\n/**\n * Executes a provided function once per regex match. Searches always start at the beginning of the\n * string and continue until the end, regardless of the state of the regex's `global` property and\n * initial `lastIndex`.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp} regex Regex to search with.\n * @param {Function} callback Function to execute for each match. Invoked with four arguments:\n * - The match array, with named backreference properties.\n * - The zero-based match index.\n * - The string being traversed.\n * - The regex object being used to traverse the string.\n * @example\n *\n * // Extracts every other digit from a string\n * const evens = [];\n * XRegExp.forEach('1a2345', /\\d/, (match, i) => {\n * if (i % 2) evens.push(+match[0]);\n * });\n * // evens -> [2, 4]\n */\nXRegExp.forEach = (str, regex, callback) => {\n let pos = 0;\n let i = -1;\n let match;\n\n while ((match = XRegExp.exec(str, regex, pos))) {\n // Because `regex` is provided to `callback`, the function could use the deprecated/\n // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since `XRegExp.exec`\n // doesn't use `lastIndex` to set the search position, this can't lead to an infinite loop,\n // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of\n // regexes, mutating the regex will not have any effect on the iteration or matched strings,\n // which is a nice side effect that brings extra safety.\n callback(match, ++i, str, regex);\n\n pos = match.index + (match[0].length || 1);\n }\n};\n\n/**\n * Copies a regex object and adds flag `g`. The copy maintains extended data, is augmented with\n * `XRegExp.prototype` properties, and has a fresh `lastIndex` property (set to zero). Native\n * regexes are not recompiled using XRegExp syntax.\n *\n * @memberOf XRegExp\n * @param {RegExp} regex Regex to globalize.\n * @returns {RegExp} Copy of the provided regex with flag `g` added.\n * @example\n *\n * const globalCopy = XRegExp.globalize(/regex/);\n * globalCopy.global; // -> true\n */\nXRegExp.globalize = (regex) => copyRegex(regex, {addG: true});\n\n/**\n * Installs optional features according to the specified options. Can be undone using\n * `XRegExp.uninstall`.\n *\n * @memberOf XRegExp\n * @param {Object|String} options Options object or string.\n * @example\n *\n * // With an options object\n * XRegExp.install({\n * // Enables support for astral code points in Unicode addons (implicitly sets flag A)\n * astral: true,\n *\n * // Adds named capture groups to the `groups` property of matches\n * namespacing: true\n * });\n *\n * // With an options string\n * XRegExp.install('astral namespacing');\n */\nXRegExp.install = (options) => {\n options = prepareOptions(options);\n\n if (!features.astral && options.astral) {\n setAstral(true);\n }\n\n if (!features.namespacing && options.namespacing) {\n setNamespacing(true);\n }\n};\n\n/**\n * Checks whether an individual optional feature is installed.\n *\n * @memberOf XRegExp\n * @param {String} feature Name of the feature to check. One of:\n * - `astral`\n * - `namespacing`\n * @returns {boolean} Whether the feature is installed.\n * @example\n *\n * XRegExp.isInstalled('astral');\n */\nXRegExp.isInstalled = (feature) => !!(features[feature]);\n\n/**\n * Returns `true` if an object is a regex; `false` if it isn't. This works correctly for regexes\n * created in another frame, when `instanceof` and `constructor` checks would fail.\n *\n * @memberOf XRegExp\n * @param {*} value Object to check.\n * @returns {boolean} Whether the object is a `RegExp` object.\n * @example\n *\n * XRegExp.isRegExp('string'); // -> false\n * XRegExp.isRegExp(/regex/i); // -> true\n * XRegExp.isRegExp(RegExp('^', 'm')); // -> true\n * XRegExp.isRegExp(XRegExp('(?s).')); // -> true\n */\nXRegExp.isRegExp = (value) => Object.prototype.toString.call(value) === '[object RegExp]';\n// Same as `isType(value, 'RegExp')`, but avoiding that function call here for perf since\n// `isRegExp` is used heavily by internals including regex construction\n\n/**\n * Returns the first matched string, or in global mode, an array containing all matched strings.\n * This is essentially a more convenient re-implementation of `String.prototype.match` that gives\n * the result types you actually want (string instead of `exec`-style array in match-first mode,\n * and an empty array instead of `null` when no matches are found in match-all mode). It also lets\n * you override flag g and ignore `lastIndex`, and fixes browser bugs.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp} regex Regex to search with.\n * @param {String} [scope='one'] Use 'one' to return the first match as a string. Use 'all' to\n * return an array of all matched strings. If not explicitly specified and `regex` uses flag g,\n * `scope` is 'all'.\n * @returns {String|Array} In match-first mode: First match as a string, or `null`. In match-all\n * mode: Array of all matched strings, or an empty array.\n * @example\n *\n * // Match first\n * XRegExp.match('abc', /\\w/); // -> 'a'\n * XRegExp.match('abc', /\\w/g, 'one'); // -> 'a'\n * XRegExp.match('abc', /x/g, 'one'); // -> null\n *\n * // Match all\n * XRegExp.match('abc', /\\w/g); // -> ['a', 'b', 'c']\n * XRegExp.match('abc', /\\w/, 'all'); // -> ['a', 'b', 'c']\n * XRegExp.match('abc', /x/, 'all'); // -> []\n */\nXRegExp.match = (str, regex, scope) => {\n const global = (regex.global && scope !== 'one') || scope === 'all';\n const cacheKey = ((global ? 'g' : '') + (regex.sticky ? 'y' : '')) || 'noGY';\n\n regex[REGEX_DATA] = regex[REGEX_DATA] || {};\n\n // Shares cached copies with `XRegExp.exec`/`replace`\n const r2 = regex[REGEX_DATA][cacheKey] || (\n regex[REGEX_DATA][cacheKey] = copyRegex(regex, {\n addG: !!global,\n removeG: scope === 'one',\n isInternalOnly: true\n })\n );\n\n const result = String(nullThrows(str)).match(r2);\n\n if (regex.global) {\n regex.lastIndex = (\n (scope === 'one' && result) ?\n // Can't use `r2.lastIndex` since `r2` is nonglobal in this case\n (result.index + result[0].length) : 0\n );\n }\n\n return global ? (result || []) : (result && result[0]);\n};\n\n/**\n * Retrieves the matches from searching a string using a chain of regexes that successively search\n * within previous matches. The provided `chain` array can contain regexes and or objects with\n * `regex` and `backref` properties. When a backreference is specified, the named or numbered\n * backreference is passed forward to the next regex or returned.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {Array} chain Regexes that each search for matches within preceding results.\n * @returns {Array} Matches by the last regex in the chain, or an empty array.\n * @example\n *\n * // Basic usage; matches numbers within <b> tags\n * XRegExp.matchChain('1 <b>2</b> 3 <b>4 a 56</b>', [\n * XRegExp('(?is)<b>.*?</b>'),\n * /\\d+/\n * ]);\n * // -> ['2', '4', '56']\n *\n * // Passing forward and returning specific backreferences\n * const html = `<a href=\"http://xregexp.com/api/\">XRegExp</a>\n * <a href=\"http://www.google.com/\">Google</a>`;\n * XRegExp.matchChain(html, [\n * {regex: /<a href=\"([^\"]+)\">/i, backref: 1},\n * {regex: XRegExp('(?i)^https?://(?<domain>[^/?#]+)'), backref: 'domain'}\n * ]);\n * // -> ['xregexp.com', 'www.google.com']\n */\nXRegExp.matchChain = (str, chain) => (function recurseChain(values, level) {\n const item = chain[level].regex ? chain[level] : {regex: chain[level]};\n const matches = [];\n\n function addMatch(match) {\n if (item.backref) {\n const ERR_UNDEFINED_GROUP = `Backreference to undefined group: ${item.backref}`;\n const isNamedBackref = isNaN(item.backref);\n\n if (isNamedBackref && XRegExp.isInstalled('namespacing')) {\n // `groups` has `null` as prototype, so using `in` instead of `hasOwnProperty`\n if (!(match.groups && item.backref in match.groups)) {\n throw new ReferenceError(ERR_UNDEFINED_GROUP);\n }\n } else if (!match.hasOwnProperty(item.backref)) {\n throw new ReferenceError(ERR_UNDEFINED_GROUP);\n }\n\n const backrefValue = isNamedBackref && XRegExp.isInstalled('namespacing') ?\n match.groups[item.backref] :\n match[item.backref];\n\n matches.push(backrefValue || '');\n } else {\n matches.push(match[0]);\n }\n }\n\n for (const value of values) {\n XRegExp.forEach(value, item.regex, addMatch);\n }\n\n return ((level === chain.length - 1) || !matches.length) ?\n matches :\n recurseChain(matches, level + 1);\n}([str], 0));\n\n/**\n * Returns a new string with one or all matches of a pattern replaced. The pattern can be a string\n * or regex, and the replacement can be a string or a function to be called for each match. To\n * perform a global search and replace, use the optional `scope` argument or include flag g if using\n * a regex. Replacement strings can use `$<n>` or `${n}` for named and numbered backreferences.\n * Replacement functions can use named backreferences via the last argument. Also fixes browser bugs\n * compared to the native `String.prototype.replace` and can be used reliably cross-browser.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp|String} search Search pattern to be replaced.\n * @param {String|Function} replacement Replacement string or a function invoked to create it.\n * Replacement strings can include special replacement syntax:\n * - $$ - Inserts a literal $ character.\n * - $&, $0 - Inserts the matched substring.\n * - $` - Inserts the string that precedes the matched substring (left context).\n * - $' - Inserts the string that follows the matched substring (right context).\n * - $n, $nn - Where n/nn are digits referencing an existing capturing group, inserts\n * backreference n/nn.\n * - $<n>, ${n} - Where n is a name or any number of digits that reference an existing capturing\n * group, inserts backreference n.\n * Replacement functions are invoked with three or more arguments:\n * - args[0] - The matched substring (corresponds to `$&` above). If the `namespacing` feature\n * is off, named backreferences are accessible as properties of this argument.\n * - args[1..n] - One argument for each backreference (corresponding to `$1`, `$2`, etc. above).\n * If the regex has no capturing groups, no arguments appear in this position.\n * - args[n+1] - The zero-based index of the match within the entire search string.\n * - args[n+2] - The total string being searched.\n * - args[n+3] - If the the search pattern is a regex with named capturing groups, the last\n * argument is the groups object. Its keys are the backreference names and its values are the\n * backreference values. If the `namespacing` feature is off, this argument is not present.\n * @param {String} [scope] Use 'one' to replace the first match only, or 'all'. Defaults to 'one'.\n * Defaults to 'all' if using a regex with flag g.\n * @returns {String} New string with one or all matches replaced.\n * @example\n *\n * // Regex search, using named backreferences in replacement string\n * const name = XRegExp('(?<first>\\\\w+) (?<last>\\\\w+)');\n * XRegExp.replace('John Smith', name, '$<last>, $<first>');\n * // -> 'Smith, John'\n *\n * // Regex search, using named backreferences in replacement function\n * XRegExp.replace('John Smith', name, (...args) => {\n * const groups = args[args.length - 1];\n * return `${groups.last}, ${groups.first}`;\n * });\n * // -> 'Smith, John'\n *\n * // String search, with replace-all\n * XRegExp.replace('RegExp builds RegExps', 'RegExp', 'XRegExp', 'all');\n * // -> 'XRegExp builds XRegExps'\n */\nXRegExp.replace = (str, search, replacement, scope) => {\n const isRegex = XRegExp.isRegExp(search);\n const global = (search.global && scope !== 'one') || scope === 'all';\n const cacheKey = ((global ? 'g' : '') + (search.sticky ? 'y' : '')) || 'noGY';\n let s2 = search;\n\n if (isRegex) {\n search[REGEX_DATA] = search[REGEX_DATA] || {};\n\n // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used, `search`'s\n // `lastIndex` isn't updated *during* replacement iterations\n s2 = search[REGEX_DATA][cacheKey] || (\n search[REGEX_DATA][cacheKey] = copyRegex(search, {\n addG: !!global,\n removeG: scope === 'one',\n isInternalOnly: true\n })\n );\n } else if (global) {\n s2 = new RegExp(XRegExp.escape(String(search)), 'g');\n }\n\n // Fixed `replace` required for named backreferences, etc.\n const result = fixed.replace.call(nullThrows(str), s2, replacement);\n\n if (isRegex && search.global) {\n // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)\n search.lastIndex = 0;\n }\n\n return result;\n};\n\n/**\n * Performs batch processing of string replacements. Used like `XRegExp.replace`, but accepts an\n * array of replacement details. Later replacements operate on the output of earlier replacements.\n * Replacement details are accepted as an array with a regex or string to search for, the\n * replacement string or function, and an optional scope of 'one' or 'all'. Uses the XRegExp\n * replacement text syntax, which supports named backreference properties via `$<name>` or\n * `${name}`.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {Array} replacements Array of replacement detail arrays.\n * @returns {String} New string with all replacements.\n * @example\n *\n * str = XRegExp.replaceEach(str, [\n * [XRegExp('(?<name>a)'), 'z$<name>'],\n * [/b/gi, 'y'],\n * [/c/g, 'x', 'one'], // scope 'one' overrides /g\n * [/d/, 'w', 'all'], // scope 'all' overrides lack of /g\n * ['e', 'v', 'all'], // scope 'all' allows replace-all for strings\n * [/f/g, (match) => match.toUpperCase()]\n * ]);\n */\nXRegExp.replaceEach = (str, replacements) => {\n for (const r of replacements) {\n str = XRegExp.replace(str, r[0], r[1], r[2]);\n }\n\n return str;\n};\n\n/**\n * Splits a string into an array of strings using a regex or string separator. Matches of the\n * separator are not included in the result array. However, if `separator` is a regex that contains\n * capturing groups, backreferences are spliced into the result each time `separator` is matched.\n * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably\n * cross-browser.\n *\n * @memberOf XRegExp\n * @param {String} str String to split.\n * @param {RegExp|String} separator Regex or string to use for separating the string.\n * @param {Number} [limit] Maximum number of items to include in the result array.\n * @returns {Array} Array of substrings.\n * @example\n *\n * // Basic use\n * XRegExp.split('a b c', ' ');\n * // -> ['a', 'b', 'c']\n *\n * // With limit\n * XRegExp.split('a b c', ' ', 2);\n * // -> ['a', 'b']\n *\n * // Backreferences in result array\n * XRegExp.split('..word1..', /([a-z]+)(\\d+)/i);\n * // -> ['..', 'word', '1', '..']\n */\nXRegExp.split = (str, separator, limit) => fixed.split.call(nullThrows(str), separator, limit);\n\n/**\n * Executes a regex search in a specified string. Returns `true` or `false`. Optional `pos` and\n * `sticky` arguments specify the search start position, and whether the match must start at the\n * specified position only. The `lastIndex` property of the provided regex is not used, but is\n * updated for compatibility. Also fixes browser bugs compared to the native\n * `RegExp.prototype.test` and can be used reliably cross-browser.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp} regex Regex to search with.\n * @param {Number} [pos=0] Zero-based index at which to start the search.\n * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position\n * only. The string `'sticky'` is accepted as an alternative to `true`.\n * @returns {boolean} Whether the regex matched the provided value.\n * @example\n *\n * // Basic use\n * XRegExp.test('abc', /c/); // -> true\n *\n * // With pos and sticky\n * XRegExp.test('abc', /c/, 0, 'sticky'); // -> false\n * XRegExp.test('abc', /c/, 2, 'sticky'); // -> true\n */\n// Do this the easy way :-)\nXRegExp.test = (str, regex, pos, sticky) => !!XRegExp.exec(str, regex, pos, sticky);\n\n/**\n * Uninstalls optional features according to the specified options. Used to undo the actions of\n * `XRegExp.install`.\n *\n * @memberOf XRegExp\n * @param {Object|String} options Options object or string.\n * @example\n *\n * // With an options object\n * XRegExp.uninstall({\n * // Disables support for astral code points in Unicode addons (unless enabled per regex)\n * astral: true,\n *\n * // Don't add named capture groups to the `groups` property of matches\n * namespacing: true\n * });\n *\n * // With an options string\n * XRegExp.uninstall('astral namespacing');\n */\nXRegExp.uninstall = (options) => {\n options = prepareOptions(options);\n\n if (features.astral && options.astral) {\n setAstral(false);\n }\n\n if (features.namespacing && options.namespacing) {\n setNamespacing(false);\n }\n};\n\n/**\n * Returns an XRegExp object that is the union of the given patterns. Patterns can be provided as\n * regex objects or strings. Metacharacters are escaped in patterns provided as strings.\n * Backreferences in provided regex objects are automatically renumbered to work correctly within\n * the larger combined pattern. Native flags used by provided regexes are ignored in favor of the\n * `flags` argument.\n *\n * @memberOf XRegExp\n * @param {Array} patterns Regexes and strings to combine.\n * @param {String} [flags] Any combination of XRegExp flags.\n * @param {Object} [options] Options object with optional properties:\n * - `conjunction` {String} Type of conjunction to use: 'or' (default) or 'none'.\n * @returns {RegExp} Union of the provided regexes and strings.\n * @example\n *\n * XRegExp.union(['a+b*c', /(dogs)\\1/, /(cats)\\1/], 'i');\n * // -> /a\\+b\\*c|(dogs)\\1|(cats)\\2/i\n *\n * XRegExp.union([/man/, /bear/, /pig/], 'i', {conjunction: 'none'});\n * // -> /manbearpig/i\n */\nXRegExp.union = (patterns, flags, options) => {\n options = options || {};\n const conjunction = options.conjunction || 'or';\n let numCaptures = 0;\n let numPriorCaptures;\n let captureNames;\n\n function rewrite(match, paren, backref) {\n const name = captureNames[numCaptures - numPriorCaptures];\n\n // Capturing group\n if (paren) {\n ++numCaptures;\n // If the current capture has a name, preserve the name\n if (name) {\n return `(?<${name}>`;\n }\n // Backreference\n } else if (backref) {\n // Rewrite the backreference\n return `\\\\${+backref + numPriorCaptures}`;\n }\n\n return match;\n }\n\n if (!(isType(patterns, 'Array') && patterns.length)) {\n throw new TypeError('Must provide a nonempty array of patterns to merge');\n }\n\n const parts = /(\\()(?!\\?)|\\\\([1-9]\\d*)|\\\\[\\s\\S]|\\[(?:[^\\\\\\]]|\\\\[\\s\\S])*\\]/g;\n const output = [];\n for (const pattern of patterns) {\n if (XRegExp.isRegExp(pattern)) {\n numPriorCaptures = numCaptures;\n captureNames = (pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames) || [];\n\n // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns are\n // independently valid; helps keep this simple. Named captures are put back\n output.push(XRegExp(pattern.source).source.replace(parts, rewrite));\n } else {\n output.push(XRegExp.escape(pattern));\n }\n }\n\n const separator = conjunction === 'none' ? '' : '|';\n return XRegExp(output.join(separator), flags);\n};\n\n// ==--------------------------==\n// Fixed/extended native methods\n// ==--------------------------==\n\n/**\n * Adds named capture support (with backreferences returned as `result.name`), and fixes browser\n * bugs in the native `RegExp.prototype.exec`. Use via `XRegExp.exec`.\n *\n * @memberOf RegExp\n * @param {String} str String to search.\n * @returns {Array} Match array with named backreference properties, or `null`.\n */\nfixed.exec = function(str) {\n const origLastIndex = this.lastIndex;\n const match = RegExp.prototype.exec.apply(this, arguments);\n\n if (match) {\n // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating capturing\n // groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of older IEs. IE 9\n // in standards mode follows the spec.\n if (!correctExecNpcg && match.length > 1 && match.includes('')) {\n const r2 = copyRegex(this, {\n removeG: true,\n isInternalOnly: true\n });\n // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed\n // matching due to characters outside the match\n String(str).slice(match.index).replace(r2, (...args) => {\n const len = args.length;\n // Skip index 0 and the last 2\n for (let i = 1; i < len - 2; ++i) {\n if (args[i] === undefined) {\n match[i] = undefined;\n }\n }\n });\n }\n\n // Attach named capture properties\n if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) {\n let groupsObject = match;\n if (XRegExp.isInstalled('namespacing')) {\n // https://tc39.github.io/proposal-regexp-named-groups/#sec-regexpbuiltinexec\n match.groups = Object.create(null);\n groupsObject = match.groups;\n }\n // Skip index 0\n for (let i = 1; i < match.length; ++i) {\n const name = this[REGEX_DATA].captureNames[i - 1];\n if (name) {\n groupsObject[name] = match[i];\n }\n }\n // Preserve any existing `groups` obj that came from native ES2018 named capture\n } else if (!match.groups && XRegExp.isInstalled('namespacing')) {\n match.groups = undefined;\n }\n\n // Fix browsers that increment `lastIndex` after zero-length matches\n if (this.global && !match[0].length && (this.lastIndex > match.index)) {\n this.lastIndex = match.index;\n }\n }\n\n if (!this.global) {\n // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)\n this.lastIndex = origLastIndex;\n }\n\n return match;\n};\n\n/**\n * Fixes browser bugs in the native `RegExp.prototype.test`.\n *\n * @memberOf RegExp\n * @param {String} str String to search.\n * @returns {boolean} Whether the regex matched the provided value.\n */\nfixed.test = function(str) {\n // Do this the easy way :-)\n return !!fixed.exec.call(this, str);\n};\n\n/**\n * Adds named capture support (with backreferences returned as `result.name`), and fixes browser\n * bugs in the native `String.prototype.match`.\n *\n * @memberOf String\n * @param {RegExp|*} regex Regex to search with. If not a regex object, it is passed to `RegExp`.\n * @returns {Array} If `regex` uses flag g, an array of match strings or `null`. Without flag g,\n * the result of calling `regex.exec(this)`.\n */\nfixed.match = function(regex) {\n if (!XRegExp.isRegExp(regex)) {\n // Use the native `RegExp` rather than `XRegExp`\n regex = new RegExp(regex);\n } else if (regex.global) {\n const result = String.prototype.match.apply(this, arguments);\n // Fixes IE bug\n regex.lastIndex = 0;\n\n return result;\n }\n\n return fixed.exec.call(regex, nullThrows(this));\n};\n\n/**\n * Adds support for `${n}` (or `$<n>`) tokens for named and numbered backreferences in replacement\n * text, and provides named backreferences to replacement functions as `arguments[0].name`. Also\n * fixes browser bugs in replacement text syntax when performing a replacement using a nonregex\n * search value, and the value of a replacement regex's `lastIndex` property during replacement\n * iterations and upon completion. Note that this doesn't support SpiderMonkey's proprietary third\n * (`flags`) argument. Use via `XRegExp.replace`.\n *\n * @memberOf String\n * @param {RegExp|String} search Search pattern to be replaced.\n * @param {String|Function} replacement Replacement string or a function invoked to create it.\n * @returns {string} New string with one or all matches replaced.\n */\nfixed.replace = function(search, replacement) {\n const isRegex = XRegExp.isRegExp(search);\n let origLastIndex;\n let captureNames;\n let result;\n\n if (isRegex) {\n if (search[REGEX_DATA]) {\n ({captureNames} = search[REGEX_DATA]);\n }\n // Only needed if `search` is nonglobal\n origLastIndex = search.lastIndex;\n } else {\n search += ''; // Type-convert\n }\n\n // Don't use `typeof`; some older browsers return 'function' for regex objects\n if (isType(replacement, 'Function')) {\n // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement\n // functions isn't type-converted to a string\n result = String(this).replace(search, (...args) => {\n if (captureNames) {\n let groupsObject;\n\n if (XRegExp.isInstalled('namespacing')) {\n // https://tc39.github.io/proposal-regexp-named-groups/#sec-regexpbuiltinexec\n groupsObject = Object.create(null);\n args.push(groupsObject);\n } else {\n // Change the `args[0]` string primitive to a `String` object that can store\n // properties. This really does need to use `String` as a constructor\n args[0] = new String(args[0]);\n [groupsObject] = args;\n }\n\n // Store named backreferences\n for (let i = 0; i < captureNames.length; ++i) {\n if (captureNames[i]) {\n groupsObject[captureNames[i]] = args[i + 1];\n }\n }\n }\n // ES6 specs the context for replacement functions as `undefined`\n return replacement(...args);\n });\n } else {\n // Ensure that the last value of `args` will be a string when given nonstring `this`,\n // while still throwing on null or undefined context\n result = String(nullThrows(this)).replace(search, (...args) => {\n return String(replacement).replace(replacementToken, replacer);\n\n function replacer($0, bracketed, angled, dollarToken) {\n bracketed = bracketed || angled;\n\n // ES2018 added a new trailing `groups` arg that's passed to replacement functions\n // when the search regex uses native named capture\n const numNonCaptureArgs = isType(args[args.length - 1], 'Object') ? 4 : 3;\n const numCaptures = args.length - numNonCaptureArgs;\n\n // Handle named or numbered backreference with curly or angled braces: ${n}, $<n>\n if (bracketed) {\n // Handle backreference to numbered capture, if `bracketed` is an integer. Use\n // `0` for the entire match. Any number of leading zeros may be used.\n if (/^\\d+$/.test(bracketed)) {\n // Type-convert and drop leading zeros\n const n = +bracketed;\n if (n <= numCaptures) {\n return args[n] || '';\n }\n }\n\n // Handle backreference to named capture. If the name does not refer to an\n // existing capturing group, it's an error. Also handles the error for numbered\n // backference that does not refer to an existing group.\n // Using `indexOf` since having groups with the same name is already an error,\n // otherwise would need `lastIndexOf`.\n const n = captureNames ? captureNames.indexOf(bracketed) : -1;\n if (n < 0) {\n throw new SyntaxError(`Backreference to undefined group ${$0}`);\n }\n return args[n + 1] || '';\n }\n\n // Handle `$`-prefixed variable\n // Handle space/blank first because type conversion with `+` drops space padding\n // and converts spaces and empty strings to `0`\n if (dollarToken === '' || dollarToken === ' ') {\n throw new SyntaxError(`Invalid token ${$0}`);\n }\n if (dollarToken === '&' || +dollarToken === 0) { // $&, $0 (not followed by 1-9), $00\n return args[0];\n }\n if (dollarToken === '$') { // $$\n return '$';\n }\n if (dollarToken === '`') { // $` (left context)\n return args[args.length - 1].slice(0, args[args.length - 2]);\n }\n if (dollarToken === \"'\") { // $' (right context)\n return args[args.length - 1].slice(args[args.length - 2] + args[0].length);\n }\n\n // Handle numbered backreference without braces\n // Type-convert and drop leading zero\n dollarToken = +dollarToken;\n // XRegExp behavior for `$n` and `$nn`:\n // - Backrefs end after 1 or 2 digits. Use `${..}` or `$<..>` for more digits.\n // - `$1` is an error if no capturing groups.\n // - `$10` is an error if less than 10 capturing groups. Use `${1}0` or `$<1>0`\n // instead.\n // - `$01` is `$1` if at least one capturing group, else it's an error.\n // - `$0` (not followed by 1-9) and `$00` are the entire match.\n // Native behavior, for comparison:\n // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+.\n // - `$1` is a literal `$1` if no capturing groups.\n // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups.\n // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`.\n // - `$0` is a literal `$0`.\n if (!isNaN(dollarToken)) {\n if (dollarToken > numCaptures) {\n throw new SyntaxError(`Backreference to undefined group ${$0}`);\n }\n return args[dollarToken] || '';\n }\n\n // `$` followed by an unsupported char is an error, unlike native JS\n throw new SyntaxError(`Invalid token ${$0}`);\n }\n });\n }\n\n if (isRegex) {\n if (search.global) {\n // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)\n search.lastIndex = 0;\n } else {\n // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)\n search.lastIndex = origLastIndex;\n }\n }\n\n return result;\n};\n\n/**\n * Fixes browser bugs in the native `String.prototype.split`. Use via `XRegExp.split`.\n *\n * @memberOf String\n * @param {RegExp|String} separator Regex or string to use for separating the string.\n * @param {Number} [limit] Maximum number of items to include in the result array.\n * @returns {!Array} Array of substrings.\n */\nfixed.split = function(separator, limit) {\n if (!XRegExp.isRegExp(separator)) {\n // Browsers handle nonregex split correctly, so use the faster native method\n return String.prototype.split.apply(this, arguments);\n }\n\n const str = String(this);\n const output = [];\n const origLastIndex = separator.lastIndex;\n let lastLastIndex = 0;\n let lastLength;\n\n // Values for `limit`, per the spec:\n // If undefined: pow(2,32) - 1\n // If 0, Infinity, or NaN: 0\n // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32);\n // If negative number: pow(2,32) - floor(abs(limit))\n // If other: Type-convert, then use the above rules\n // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63, unless\n // Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+\n limit = (limit === undefined ? -1 : limit) >>> 0;\n\n XRegExp.forEach(str, separator, (match) => {\n // This condition is not the same as `if (match[0].length)`\n if ((match.index + match[0].length) > lastLastIndex) {\n output.push(str.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < str.length) {\n Array.prototype.push.apply(output, match.slice(1));\n }\n lastLength = match[0].length;\n lastLastIndex = match.index + lastLength;\n }\n });\n\n if (lastLastIndex === str.length) {\n if (!separator.test('') || lastLength) {\n output.push('');\n }\n } else {\n output.push(str.slice(lastLastIndex));\n }\n\n separator.lastIndex = origLastIndex;\n return output.length > limit ? output.slice(0, limit) : output;\n};\n\n// ==--------------------------==\n// Built-in syntax/flag tokens\n// ==--------------------------==\n\n/*\n * Letter escapes that natively match literal characters: `\\a`, `\\A`, etc. These should be\n * SyntaxErrors but are allowed in web reality. XRegExp makes them errors for cross-browser\n * consistency and to reserve their syntax, but lets them be superseded by addons.\n */\nXRegExp.addToken(\n /\\\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|x(?![\\dA-Fa-f]{2}))/,\n (match, scope) => {\n // \\B is allowed in default scope only\n if (match[1] === 'B' && scope === defaultScope) {\n return match[0];\n }\n throw new SyntaxError(`Invalid escape ${match[0]}`);\n },\n {\n scope: 'all',\n leadChar: '\\\\'\n }\n);\n\n/*\n * Unicode code point escape with curly braces: `\\u{N..}`. `N..` is any one or more digit\n * hexadecimal number from 0-10FFFF, and can include leading zeros. Requires the native ES6 `u` flag\n * to support code points greater than U+FFFF. Avoids converting code points above U+FFFF to\n * surrogate pairs (which could be done without flag `u`), since that could lead to broken behavior\n * if you follow a `\\u{N..}` token that references a code point above U+FFFF with a quantifier, or\n * if you use the same in a character class.\n */\nXRegExp.addToken(\n /\\\\u{([\\dA-Fa-f]+)}/,\n (match, scope, flags) => {\n const code = dec(match[1]);\n if (code > 0x10FFFF) {\n throw new SyntaxError(`Invalid Unicode code point ${match[0]}`);\n }\n if (code <= 0xFFFF) {\n // Converting to \\uNNNN avoids needing to escape the literal character and keep it\n // separate from preceding tokens\n return `\\\\u${pad4(hex(code))}`;\n }\n // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling\n if (hasNativeU && flags.includes('u')) {\n return match[0];\n }\n throw new SyntaxError('Cannot use Unicode code point above \\\\u{FFFF} without flag u');\n },\n {\n scope: 'all',\n leadChar: '\\\\'\n }\n);\n\n/*\n * Comment pattern: `(?# )`. Inline comments are an alternative to the line comments allowed in\n * free-spacing mode (flag x).\n */\nXRegExp.addToken(\n /\\(\\?#[^)]*\\)/,\n getContextualTokenSeparator,\n {leadChar: '('}\n);\n\n/*\n * Whitespace and line comments, in free-spacing mode (aka extended mode, flag x) only.\n */\nXRegExp.addToken(\n /\\s+|#[^\\n]*\\n?/,\n getContextualTokenSeparator,\n {flag: 'x'}\n);\n\n/*\n * Dot, in dotAll mode (aka singleline mode, flag s) only.\n */\nif (!hasNativeS) {\n XRegExp.addToken(\n /\\./,\n () => '[\\\\s\\\\S]',\n {\n flag: 's',\n leadChar: '.'\n }\n );\n}\n\n/*\n * Named backreference: `\\k<name>`. Backreference names can use RegExpIdentifierName characters\n * only. Also allows numbered backreferences as `\\k<n>`.\n */\nXRegExp.addToken(\n /\\\\k<([^>]+)>/,\n function(match) {\n // Groups with the same name is an error, else would need `lastIndexOf`\n const index = isNaN(match[1]) ? (this.captureNames.indexOf(match[1]) + 1) : +match[1];\n const endIndex = match.index + match[0].length;\n if (!index || index > this.captureNames.length) {\n throw new SyntaxError(`Backreference to undefined group ${match[0]}`);\n }\n // Keep backreferences separate from subsequent literal numbers. This avoids e.g.\n // inadvertedly changing `(?<n>)\\k<n>1` to `()\\11`.\n return `\\\\${index}${\n endIndex === match.input.length || isNaN(match.input[endIndex]) ?\n '' : '(?:)'\n }`;\n },\n {leadChar: '\\\\'}\n);\n\n/*\n * Numbered backreference or octal, plus any following digits: `\\0`, `\\11`, etc. Octals except `\\0`\n * not followed by 0-9 and backreferences to unopened capture groups throw an error. Other matches\n * are returned unaltered. IE < 9 doesn't support backreferences above `\\99` in regex syntax.\n */\nXRegExp.addToken(\n /\\\\(\\d+)/,\n function(match, scope) {\n if (\n !(\n scope === defaultScope &&\n /^[1-9]/.test(match[1]) &&\n +match[1] <= this.captureNames.length\n ) &&\n match[1] !== '0'\n ) {\n throw new SyntaxError(`Cannot use octal escape or backreference to undefined group ${match[0]}`);\n }\n return match[0];\n },\n {\n scope: 'all',\n leadChar: '\\\\'\n }\n);\n\n/*\n * Named capturing group; match the opening delimiter only: `(?<name>`. Capture names can use the\n * RegExpIdentifierName characters only. Names can't be integers. Supports Python-style\n * `(?P<name>` as an alternate syntax to avoid issues in some older versions of Opera which natively\n * supported the Python-style syntax. Otherwise, XRegExp might treat numbered backreferences to\n * Python-style named capture as octals.\n */\nXRegExp.addToken(\n /\\(\\?P?<([\\p{ID_Start}$_][\\p{ID_Continue}$_\\u200C\\u200D]*)>/u,\n function(match) {\n if (!XRegExp.isInstalled('namespacing') && (match[1] === 'length' || match[1] === '__proto__')) {\n throw new SyntaxError(`Cannot use reserved word as capture name ${match[0]}`);\n }\n if (this.captureNames.includes(match[1])) {\n throw new SyntaxError(`Cannot use same name for multiple groups ${match[0]}`);\n }\n this.captureNames.push(match[1]);\n this.hasNamedCapture = true;\n return '(';\n },\n {leadChar: '('}\n);\n\n/*\n * Capturing group; match the opening parenthesis only. Required for support of named capturing\n * groups. Also adds named capture only mode (flag n).\n */\nXRegExp.addToken(\n /\\((?!\\?)/,\n function(match, scope, flags) {\n if (flags.includes('n')) {\n return '(?:';\n }\n this.captureNames.push(null);\n return '(';\n },\n {\n optionalFlags: 'n',\n leadChar: '('\n }\n);\n\nexport default XRegExp;\n","/*!\n * XRegExp.build 5.1.1\n * <xregexp.com>\n * Steven Levithan (c) 2012-present MIT License\n */\n\nexport default (XRegExp) => {\n const REGEX_DATA = 'xregexp';\n const subParts = /(\\()(?!\\?)|\\\\([1-9]\\d*)|\\\\[\\s\\S]|\\[(?:[^\\\\\\]]|\\\\[\\s\\S])*\\]/g;\n const parts = XRegExp.union([/\\({{([\\w$]+)}}\\)|{{([\\w$]+)}}/, subParts], 'g', {\n conjunction: 'or'\n });\n\n /**\n * Strips a leading `^` and trailing unescaped `$`, if both are present.\n *\n * @private\n * @param {String} pattern Pattern to process.\n * @returns {String} Pattern with edge anchors removed.\n */\n function deanchor(pattern) {\n // Allow any number of empty noncapturing groups before/after anchors, because regexes\n // built/generated by XRegExp sometimes include them\n const leadingAnchor = /^(?:\\(\\?:\\))*\\^/;\n const trailingAnchor = /\\$(?:\\(\\?:\\))*$/;\n\n if (\n leadingAnchor.test(pattern) &&\n trailingAnchor.test(pattern) &&\n // Ensure that the trailing `$` isn't escaped\n trailingAnchor.test(pattern.replace(/\\\\[\\s\\S]/g, ''))\n ) {\n return pattern.replace(leadingAnchor, '').replace(trailingAnchor, '');\n }\n\n return pattern;\n }\n\n /**\n * Converts the provided value to an XRegExp. Native RegExp flags are not preserved.\n *\n * @private\n * @param {String|RegExp} value Value to convert.\n * @param {Boolean} [addFlagX] Whether to apply the `x` flag in cases when `value` is not\n * already a regex generated by XRegExp\n * @returns {RegExp} XRegExp object with XRegExp syntax applied.\n */\n function asXRegExp(value, addFlagX) {\n const flags = addFlagX ? 'x' : '';\n return XRegExp.isRegExp(value) ?\n (value[REGEX_DATA] && value[REGEX_DATA].captureNames ?\n // Don't recompile, to preserve capture names\n value :\n // Recompile as XRegExp\n XRegExp(value.source, flags)\n ) :\n // Compile string as XRegExp\n XRegExp(value, flags);\n }\n\n function interpolate(substitution) {\n return substitution instanceof RegExp ? substitution : XRegExp.escape(substitution);\n }\n\n function reduceToSubpatternsObject(subpatterns, interpolated, subpatternIndex) {\n subpatterns[`subpattern${subpatternIndex}`] = interpolated;\n return subpatterns;\n }\n\n function embedSubpatternAfter(raw, subpatternIndex, rawLiterals) {\n const hasSubpattern = subpatternIndex < rawLiterals.length - 1;\n return raw + (hasSubpattern ? `{{subpattern${subpatternIndex}}}` : '');\n }\n\n /**\n * Provides tagged template literals that create regexes with XRegExp syntax and flags. The\n * provided pattern is handled as a raw string, so backslashes don't need to be escaped.\n *\n * Interpolation of strings and regexes shares the features of `XRegExp.build`. Interpolated\n * patterns are treated as atomic units when quantified, interpolated strings have their special\n * characters escaped, a leading `^` and trailing unescaped `$` are stripped from interpolated\n * regexes if both are present, and any backreferences within an interpolated regex are\n * rewritten to work within the overall pattern.\n *\n * @memberOf XRegExp\n * @param {String} [flags] Any combination of XRegExp flags.\n * @returns {Function} Handler for template literals that construct regexes with XRegExp syntax.\n * @example\n *\n * XRegExp.tag()`\\b\\w+\\b`.test('word'); // -> true\n *\n * const hours = /1[0-2]|0?[1-9]/;\n * const minutes = /(?<minutes>[0-5][0-9])/;\n * const time = XRegExp.tag('x')`\\b ${hours} : ${minutes} \\b`;\n * time.test('10:59'); // -> true\n * XRegExp.exec('10:59', time).groups.minutes; // -> '59'\n *\n * const backref1 = /(a)\\1/;\n * const backref2 = /(b)\\1/;\n * XRegExp.tag()`${backref1}${backref2}`.test('aabb'); // -> true\n */\n XRegExp.tag = (flags) => (literals, ...substitutions) => {\n const subpatterns = substitutions.map(interpolate).reduce(reduceToSubpatternsObject, {});\n const pattern = literals.raw.map(embedSubpatternAfter).join('');\n return XRegExp.build(pattern, subpatterns, flags);\n };\n\n /**\n * Builds regexes using named subpatterns, for readability and pattern reuse. Backreferences in\n * the outer pattern and provided subpatterns are automatically renumbered to work correctly.\n * Native flags used by provided subpatterns are ignored in favor of the `flags` argument.\n *\n * @memberOf XRegExp\n * @param {String} pattern XRegExp pattern using `{{name}}` for embedded subpatterns. Allows\n * `({{name}})` as shorthand for `(?<name>{{name}})`. Patterns cannot be embedded within\n * character classes.\n * @param {Object} subs Lookup object for named subpatterns. Values can be strings or regexes. A\n * leading `^` and trailing unescaped `$` are stripped from subpatterns, if both are present.\n * @param {String} [flags] Any combination of XRegExp flags.\n * @returns {RegExp} Regex with interpolated subpatterns.\n * @example\n *\n * const time = XRegExp.build('(?x)^ {{hours}} ({{minutes}}) $', {\n * hours: XRegExp.build('{{h12}} : | {{h24}}', {\n * h12: /1[0-2]|0?[1-9]/,\n * h24: /2[0-3]|[01][0-9]/\n * }, 'x'),\n * minutes: /^[0-5][0-9]$/\n * });\n * time.test('10:59'); // -> true\n * XRegExp.exec('10:59', time).groups.minutes; // -> '59'\n */\n XRegExp.build = (pattern, subs, flags) => {\n flags = flags || '';\n // Used with `asXRegExp` calls for `pattern` and subpatterns in `subs`, to work around how\n // some browsers convert `RegExp('\\n')` to a regex that contains the literal characters `\\`\n // and `n`. See more details at <https://github.com/slevithan/xregexp/pull/163>.\n const addFlagX = flags.includes('x');\n const inlineFlags = /^\\(\\?([\\w$]+)\\)/.exec(pattern);\n // Add flags within a leading mode modifier to the overall pattern's flags\n if (inlineFlags) {\n flags = XRegExp._clipDuplicates(flags + inlineFlags[1]);\n }\n\n const data = {};\n for (const p in subs) {\n if (subs.hasOwnProperty(p)) {\n // Passing to XRegExp enables extended syntax and ensures independent validity,\n // lest an unescaped `(`, `)`, `[`, or trailing `\\` breaks the `(?:)` wrapper. For\n // subpatterns provided as native regexes, it dies on octals and adds the property\n // used to hold extended regex instance data, for simplicity.\n const sub = asXRegExp(subs[p], addFlagX);\n data[p] = {\n // Deanchoring allows embedding independently useful anchored regexes. If you\n // really need to keep your anchors, double them (i.e., `^^...$$`).\n pattern: deanchor(sub.source),\n names: sub[REGEX_DATA].captureNames || []\n };\n }\n }\n\n // Passing to XRegExp dies on octals and ensures the outer pattern is independently valid;\n // helps keep this simple. Named captures will be put back.\n const patternAsRegex = asXRegExp(pattern, addFlagX);\n\n // 'Caps' is short for 'captures'\n let numCaps = 0;\n let numPriorCaps;\n let numOuterCaps = 0;\n const outerCapsMap = [0];\n const outerCapNames = patternAsRegex[REGEX_DATA].captureNames || [];\n const output = patternAsRegex.source.replace(parts, ($0, $1, $2, $3, $4) => {\n const subName = $1 || $2;\n let capName;\n let intro;\n let localCapIndex;\n // Named subpattern\n if (subName) {\n if (!data.hasOwnProperty(subName)) {\n throw new ReferenceError(`Undefined property ${$0}`);\n }\n // Named subpattern was wrapped in a capturing group\n if ($1) {\n capName = outerCapNames[numOuterCaps];\n outerCapsMap[++numOuterCaps] = ++numCaps;\n // If it's a named group, preserve the name. Otherwise, use the subpattern name\n // as the capture name\n intro = `(?<${capName || subName}>`;\n } else {\n intro = '(?:';\n }\n numPriorCaps = numCaps;\n const rewrittenSubpattern = data[subName].pattern.replace(subParts, (match, paren, backref) => {\n // Capturing group\n if (paren) {\n capName = data[subName].names[numCaps - numPriorCaps];\n ++numCaps;\n // If the current capture has a name, preserve the name\n if (capName) {\n return `(?<${capName}>`;\n }\n // Backreference\n } else if (backref) {\n localCapIndex = +backref - 1;\n // Rewrite the backreference\n return data[subName].names[localCapIndex] ?\n // Need to preserve the backreference name in case using flag `n`\n `\\\\k<${data[subName].names[localCapIndex]}>` :\n `\\\\${+backref + numPriorCaps}`;\n }\n return match;\n });\n return `${intro}${rewrittenSubpattern})`;\n }\n // Capturing group\n if ($3) {\n capName = outerCapNames[numOuterCaps];\n outerCapsMap[++numOuterCaps] = ++numCaps;\n // If the current capture has a name, preserve the name\n if (capName) {\n return `(?<${capName}>`;\n }\n // Backreference\n } else if ($4) {\n localCapIndex = +$4 - 1;\n // Rewrite the backreference\n return outerCapNames[localCapIndex] ?\n // Need to preserve the backreference name in case using flag `n`\n `\\\\k<${outerCapNames[localCapIndex]}>` :\n `\\\\${outerCapsMap[+$4]}`;\n }\n return $0;\n });\n\n return XRegExp(output, flags);\n };\n};\n","/*!\n * XRegExp.matchRecursive 5.1.1\n * <xregexp.com>\n * Steven Levithan (c) 2009-present MIT License\n */\n\nexport default (XRegExp) => {\n\n /**\n * Returns a match detail object composed of the provided values.\n *\n * @private\n */\n function row(name, value, start, end) {\n return {\n name,\n value,\n start,\n end\n };\n }\n\n /**\n * Returns an array of match strings between outermost left and right delimiters, or an array of\n * objects with detailed match parts and position data. By default, an error is thrown if\n * delimiters are unbalanced within the subject string.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {String} left Left delimiter as an XRegExp pattern.\n * @param {String} right Right delimiter as an XRegExp pattern.\n * @param {String} [flags] Any combination of XRegExp flags, used for the left and right delimiters.\n * @param {Object} [options] Options object with optional properties:\n * - `valueNames` {Array} Providing `valueNames` changes the return value from an array of\n * matched strings to an array of objects that provide the value and start/end positions\n * for the matched strings as well as the matched delimiters and unmatched string segments.\n * To use this extended information mode, provide an array of 4 strings that name the parts\n * to be returned:\n * 1. String segments outside of (before, between, and after) matches.\n * 2. Matched outermost left delimiters.\n * 3. Matched text between the outermost left and right delimiters.\n * 4. Matched outermost right delimiters.\n * Taken together, these parts include the entire subject string if used with flag g.\n * Use `null` for any of these values to omit unneeded parts from the returned results.\n * - `escapeChar` {String} Single char used to escape delimiters within the subject string.\n * - `unbalanced` {String} Handling mode for unbalanced delimiters. Options are:\n * - 'error' - throw (default)\n * - 'skip' - unbalanced delimiters are treated as part of the text between delimiters, and\n * searches continue at the end of the unbalanced delimiter.\n * - 'skip-lazy' - unbalanced delimiters are treated as part of the text between delimiters,\n * and searches continue one character after the start of the unbalanced delimiter.\n * @returns {Array} Array of matches, or an empty array.\n * @example\n *\n * // Basic usage\n * const str1 = '(t((e))s)t()(ing)';\n * XRegExp.matchRecursive(str1, '\\\\(', '\\\\)', 'g');\n * // -> ['t((e))s', '', 'ing']\n *\n * // Extended information mode with valueNames\n * const str2 = 'Here is <div> <div>an</div></div> example';\n * XRegExp.matchRecursive(str2, '<div\\\\s*>', '</div>', 'gi', {\n * valueNames: ['between', 'left', 'match', 'right']\n * });\n * // -> [\n * // {name: 'between', value: 'Here is ', start: 0, end: 8},\n * // {name: 'left', value: '<div>', start: 8, end: 13},\n * // {name: 'match', value: ' <div>an</div>', start: 13, end: 27},\n * // {name: 'right', value: '</div>', start: 27, end: 33},\n * // {name: 'between', value: ' example', start: 33, end: 41}\n * // ]\n *\n * // Omitting unneeded parts with null valueNames, and using escapeChar\n * const str3 = '...{1}.\\\\{{function(x,y){return {y:x}}}';\n * XRegExp.matchRecursive(str3, '{', '}', 'g', {\n * valueNames: ['literal', null, 'value', null],\n * escapeChar: '\\\\'\n * });\n * // -> [\n * // {name: 'literal', value: '...', start: 0, end: 3},\n * // {name: 'value', value: '1', start: 4, end: 5},\n * // {name: 'literal', value: '.\\\\{', start: 6, end: 9},\n * // {name: 'value', value: 'function(x,y){return {y:x}}', start: 10, end: 37}\n * // ]\n *\n * // Sticky mode via flag y\n * const str4 = '<1><<<2>>><3>4<5>';\n * XRegExp.matchRecursive(str4, '<', '>', 'gy');\n * // -> ['1', '<<2>>', '3']\n *\n * // Skipping unbalanced delimiters instead of erroring\n * const str5 = 'Here is <div> <div>an</div> unbalanced example';\n * XRegExp.matchRecursive(str5, '<div\\\\s*>', '</div>', 'gi', {\n * unbalanced: 'skip'\n * });\n * // -> ['an']\n */\n XRegExp.matchRecursive = (str, left, right, flags, options) => {\n flags = flags || '';\n options = options || {};\n const global = flags.includes('g');\n const sticky = flags.includes('y');\n // Flag `y` is handled manually\n const basicFlags = flags.replace(/y/g, '');\n left = XRegExp(left, basicFlags);\n right = XRegExp(right, basicFlags);\n\n let esc;\n let {escapeChar} = options;\n if (escapeChar) {\n if (escapeChar.length > 1) {\n throw new Error('Cannot use more than one escape character');\n }\n escapeChar = XRegExp.escape(escapeChar);\n // Example of concatenated `esc` regex:\n // `escapeChar`: '%'\n // `left`: '<'\n // `right`: '>'\n // Regex is: /(?:%[\\S\\s]|(?:(?!<|>)[^%])+)+/\n esc = new RegExp(\n `(?:${escapeChar}[\\\\S\\\\s]|(?:(?!${\n // Using `XRegExp.union` safely rewrites backreferences in `left` and `right`.\n // Intentionally not passing `basicFlags` to `XRegExp.union` since any syntax\n // transformation resulting from those flags was already applied to `left` and\n // `right` when they were passed through the XRegExp constructor above.\n XRegExp.union([left, right], '', {conjunction: 'or'}).source\n })[^${escapeChar}])+)+`,\n // Flags `dgy` not needed here\n flags.replace(XRegExp._hasNativeFlag('s') ? /[^imsu]/g : /[^imu]/g, '')\n );\n }\n\n let openTokens = 0;\n let delimStart = 0;\n let delimEnd = 0;\n let lastOuterEnd = 0;\n let outerStart;\n let innerStart;\n let leftMatch;\n let rightMatch;\n const vN = options.valueNames;\n const output = [];\n\n while (true) {\n // If using an escape character, advance to the delimiter's next starting position,\n // skipping any escaped characters in between\n if (escapeChar) {\n delimEnd += (XRegExp.exec(str, esc, delimEnd, 'sticky') || [''])[0].length;\n }\n\n leftMatch = XRegExp.exec(str, left, delimEnd);\n rightMatch = XRegExp.exec(str, right, delimEnd);\n // Keep the leftmost match only\n if (leftMatch && rightMatch) {\n if (leftMatch.index <= rightMatch.index) {\n rightMatch = null;\n } else {\n leftMatch = null;\n }\n }\n\n // Paths (LM: leftMatch, RM: rightMatch, OT: openTokens):\n // LM | RM | OT | Result\n // 1 | 0 | 1 | loop\n // 1 | 0 | 0 | loop\n // 0 | 1 | 1 | loop\n // 0 | 1 | 0 | throw\n // 0 | 0 | 1 | throw\n // 0 | 0 | 0 | break\n // The paths above don't include the sticky mode special case. The loop ends after the\n // first completed match if not `global`.\n if (leftMatch || rightMatch) {\n delimStart = (leftMatch || rightMatch).index;\n delimEnd = delimStart + (leftMatch || rightMatch)[0].length;\n } else if (!openTokens) {\n break;\n }\n if (sticky && !openTokens && delimStart > lastOuterEnd) {\n break;\n }\n if (leftMatch) {\n if (!openTokens) {\n outerStart = delimStart;\n innerStart = delimEnd;\n }\n openTokens += 1;\n } else if (rightMatch && openTokens) {\n openTokens -= 1;\n if (!openTokens) {\n if (vN) {\n if (vN[0] && outerStart > lastOuterEnd) {\n output.push(row(vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart));\n }\n if (vN[1]) {\n output.push(row(vN[1], str.slice(outerStart, innerStart), outerStart, innerStart));\n }\n if (vN[2]) {\n output.push(row(vN[2], str.slice(innerStart, delimStart), innerStart, delimStart));\n }\n if (vN[3]) {\n output.push(row(vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd));\n }\n } else {\n output.push(str.slice(innerStart, delimStart));\n }\n lastOuterEnd = delimEnd;\n if (!global) {\n break;\n }\n }\n // Found unbalanced delimiter\n } else {\n const unbalanced = options.unbalanced || 'error';\n if (unbalanced === 'skip' || unbalanced === 'skip-lazy') {\n if (rightMatch) {\n rightMatch = null;\n // No `leftMatch` for unbalanced left delimiter because we've reached the string end\n } else {\n if (unbalanced === 'skip') {\n const outerStartDelimLength = XRegExp.exec(str, left, outerStart, 'sticky')[0].length;\n delimEnd = outerStart + (outerStartDelimLength || 1);\n } else {\n delimEnd = outerStart + 1;\n }\n openTokens = 0;\n }\n } else if (unbalanced === 'error') {\n const delimSide = rightMatch ? 'right' : 'left';\n const errorPos = rightMatch ? delimStart : outerStart;\n throw new Error(`Unbalanced ${delimSide} delimiter found in string at position ${errorPos}`);\n } else {\n throw new Error(`Unsupported value for unbalanced: ${unbalanced}`);\n }\n }\n\n // If the delimiter matched an empty string, avoid an infinite loop\n if (delimStart === delimEnd) {\n delimEnd += 1;\n }\n }\n\n if (global && output.length > 0 && !sticky && vN && vN[0] && str.length > lastOuterEnd) {\n output.push(row(vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length));\n }\n\n return output;\n };\n};\n","/*!\n * XRegExp Unicode Base 5.1.1\n * <xregexp.com>\n * Steven Levithan (c) 2008-present MIT License\n */\n\nexport default (XRegExp) => {\n\n /**\n * Adds base support for Unicode matching:\n * - Adds syntax `\\p{..}` for matching Unicode tokens. Tokens can be inverted using `\\P{..}` or\n * `\\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the\n * braces for token names that are a single letter (e.g. `\\pL` or `PL`).\n * - Adds flag A (astral), which enables 21-bit Unicode support.\n * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data.\n *\n * Unicode Base relies on externally provided Unicode character data. Official addons are\n * available to provide data for Unicode categories, scripts, and properties.\n *\n * @requires XRegExp\n */\n\n // ==--------------------------==\n // Private stuff\n // ==--------------------------==\n\n // Storage for Unicode data\n const unicode = {};\n const unicodeTypes = {};\n\n // Reuse utils\n const dec = XRegExp._dec;\n const hex = XRegExp._hex;\n const pad4 = XRegExp._pad4;\n\n // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed\n function normalize(name) {\n return name.replace(/[- _]+/g, '').toLowerCase();\n }\n\n // Gets the decimal code of a literal code unit, \\xHH, \\uHHHH, or a backslash-escaped literal\n function charCode(chr) {\n const esc = /^\\\\[xu](.+)/.exec(chr);\n return esc ?\n dec(esc[1]) :\n chr.charCodeAt(chr[0] === '\\\\' ? 1 : 0);\n }\n\n // Inverts a list of ordered BMP characters and ranges\n function invertBmp(range) {\n let output = '';\n let lastEnd = -1;\n\n XRegExp.forEach(\n range,\n /(\\\\x..|\\\\u....|\\\\?[\\s\\S])(?:-(\\\\x..|\\\\u....|\\\\?[\\s\\S]))?/,\n (m) => {\n const start = charCode(m[1]);\n if (start > (lastEnd + 1)) {\n output += `\\\\u${pad4(hex(lastEnd + 1))}`;\n if (start > (lastEnd + 2)) {\n output += `-\\\\u${pad4(hex(start - 1))}`;\n }\n }\n lastEnd = charCode(m[2] || m[1]);\n }\n );\n\n if (lastEnd < 0xFFFF) {\n output += `\\\\u${pad4(hex(lastEnd + 1))}`;\n if (lastEnd < 0xFFFE) {\n output += '-\\\\uFFFF';\n }\n }\n\n return output;\n }\n\n // Generates an inverted BMP range on first use\n function cacheInvertedBmp(slug) {\n const prop = 'b!';\n return (\n unicode[slug][prop] ||\n (unicode[slug][prop] = invertBmp(unicode[slug].bmp))\n );\n }\n\n // Combines and optionally negates BMP and astral data\n function buildAstral(slug, isNegated) {\n const item = unicode[slug];\n let combined = '';\n\n if (item.bmp && !item.isBmpLast) {\n combined = `[${item.bmp}]${item.astral ? '|' : ''}`;\n }\n if (item.astral) {\n combined += item.astral;\n }\n if (item.isBmpLast && item.bmp) {\n combined += `${item.astral ? '|' : ''}[${item.bmp}]`;\n }\n\n // Astral Unicode tokens always match a code point, never a code unit\n return isNegated ?\n `(?:(?!${combined})(?:[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\0-\\uFFFF]))` :\n `(?:${combined})`;\n }\n\n // Builds a complete astral pattern on first use\n function cacheAstral(slug, isNegated) {\n const prop = isNegated ? 'a!' : 'a=';\n return (\n unicode[slug][prop] ||\n (unicode[slug][prop] = buildAstral(slug, isNegated))\n );\n }\n\n // ==--------------------------==\n // Core functionality\n // ==--------------------------==\n\n /*\n * Add astral mode (flag A) and Unicode token syntax: `\\p{..}`, `\\P{..}`, `\\p{^..}`, `\\pC`.\n */\n XRegExp.addToken(\n // Use `*` instead of `+` to avoid capturing `^` as the token name in `\\p{^}`\n /\\\\([pP])(?:{(\\^?)(?:(\\w+)=)?([^}]*)}|([A-Za-z]))/,\n (match, scope, flags) => {\n const ERR_DOUBLE_NEG = 'Invalid double negation ';\n const ERR_UNKNOWN_NAME = 'Unknown Unicode token ';\n const ERR_UNKNOWN_REF = 'Unicode token missing data ';\n const ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token ';\n const ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes';\n const [\n fullToken,\n pPrefix,\n caretNegation,\n typePrefix,\n tokenName,\n tokenSingleCharName\n ] = match;\n // Negated via \\P{..} or \\p{^..}\n let isNegated = pPrefix === 'P' || !!caretNegation;\n // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A\n const isAstralMode = flags.includes('A');\n // Token lookup name. Check `tokenSingleCharName` first to avoid passing `undefined`\n // via `\\p{}`\n let slug = normalize(tokenSingleCharName || tokenName);\n // Token data object\n let item = unicode[slug];\n\n if (pPrefix === 'P' && caretNegation) {\n throw new SyntaxError(ERR_DOUBLE_NEG + fullToken);\n }\n if (!unicode.hasOwnProperty(slug)) {\n throw new SyntaxError(ERR_UNKNOWN_NAME + fullToken);\n }\n\n if (typePrefix) {\n if (!(unicodeTypes[typePrefix] && unicodeTypes[typePrefix][slug])) {\n throw new SyntaxError(ERR_UNKNOWN_NAME + fullToken);\n }\n }\n\n // Switch to the negated form of the referenced Unicode token\n if (item.inverseOf) {\n slug = normalize(item.inverseOf);\n if (!unicode.hasOwnProperty(slug)) {\n throw new ReferenceError(`${ERR_UNKNOWN_REF + fullToken} -> ${item.inverseOf}`);\n }\n item = unicode[slug];\n isNegated = !isNegated;\n }\n\n if (!(item.bmp || isAstralMode)) {\n throw new SyntaxError(ERR_ASTRAL_ONLY + fullToken);\n }\n if (isAstralMode) {\n if (scope === 'class') {\n throw new SyntaxError(ERR_ASTRAL_IN_CLASS);\n }\n\n return cacheAstral(slug, isNegated);\n }\n\n return scope === 'class' ?\n (isNegated ? cacheInvertedBmp(slug) : item.bmp) :\n `${(isNegated ? '[^' : '[') + item.bmp}]`;\n },\n {\n scope: 'all',\n optionalFlags: 'A',\n leadChar: '\\\\'\n }\n );\n\n /**\n * Adds to the list of Unicode tokens that XRegExp regexes can match via `\\p` or `\\P`.\n *\n * @memberOf XRegExp\n * @param {Array} data Objects with named character ranges. Each object may have properties\n * `name`, `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are\n * optional, although one of `bmp` or `astral` is required (unless `inverseOf` is set). If\n * `astral` is absent, the `bmp` data is used for BMP and astral modes. If `bmp` is absent,\n * the name errors in BMP mode but works in astral mode. If both `bmp` and `astral` are\n * provided, the `bmp` data only is used in BMP mode, and the combination of `bmp` and\n * `astral` data is used in astral mode. `isBmpLast` is needed when a token matches orphan\n * high surrogates *and* uses surrogate pairs to match astral code points. The `bmp` and\n * `astral` data should be a combination of literal characters and `\\xHH` or `\\uHHHH` escape\n * sequences, with hyphens to create ranges. Any regex metacharacters in the data should be\n * escaped, apart from range-creating hyphens. The `astral` data can additionally use\n * character classes and alternation, and should use surrogate pairs to represent astral code\n * points. `inverseOf` can be used to avoid duplicating character data if a Unicode token is\n * defined as the exact inverse of another token.\n * @param {String} [typePrefix] Enables optionally using this type as a prefix for all of the\n * provided Unicode tokens, e.g. if given `'Type'`, then `\\p{TokenName}` can also be written\n * as `\\p{Type=TokenName}`.\n * @example\n *\n * // Basic use\n * XRegExp.addUnicodeData([{\n * name: 'XDigit',\n * alias: 'Hexadecimal',\n * bmp: '0-9A-Fa-f'\n * }]);\n * XRegExp('\\\\p{XDigit}:\\\\p{Hexadecimal}+').test('0:3D'); // -> true\n */\n XRegExp.addUnicodeData = (data, typePrefix) => {\n const ERR_NO_NAME = 'Unicode token requires name';\n const ERR_NO_DATA = 'Unicode token has no character data ';\n\n if (typePrefix) {\n // Case sensitive to match ES2018\n unicodeTypes[typePrefix] = {};\n }\n\n for (const item of data) {\n if (!item.name) {\n throw new Error(ERR_NO_NAME);\n }\n if (!(item.inverseOf || item.bmp || item.astral)) {\n throw new Error(ERR_NO_DATA + item.name);\n }\n\n const normalizedName = normalize(item.name);\n unicode[normalizedName] = item;\n if (typePrefix) {\n unicodeTypes[typePrefix][normalizedName] = true;\n }\n\n if (item.alias) {\n const normalizedAlias = normalize(item.alias);\n unicode[normalizedAlias] = item;\n if (typePrefix) {\n unicodeTypes[typePrefix][normalizedAlias] = true;\n }\n }\n }\n\n // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and\n // flags might now produce different results\n XRegExp.cache.flush('patterns');\n };\n\n /**\n * @ignore\n *\n * Return a reference to the internal Unicode definition structure for the given Unicode\n * Property if the given name is a legal Unicode Property for use in XRegExp `\\p` or `\\P` regex\n * constructs.\n *\n * @memberOf XRegExp\n * @param {String} name Name by which the Unicode Property may be recognized (case-insensitive),\n * e.g. `'N'` or `'Number'`. The given name is matched against all registered Unicode\n * Properties and Property Aliases.\n * @returns {Object} Reference to definition structure when the name matches a Unicode Property.\n *\n * @note\n * For more info on Unicode Properties, see also http://unicode.org/reports/tr18/#Categories.\n *\n * @note\n * This method is *not* part of the officially documented API and may change or be removed in\n * the future. It is meant for userland code that wishes to reuse the (large) internal Unicode\n * structures set up by XRegExp.\n */\n XRegExp._getUnicodeProperty = (name) => {\n const slug = normalize(name);\n return unicode[slug];\n };\n};\n","/*!\n * XRegExp Unicode Categories 5.1.1\n * <xregexp.com>\n * Steven Levithan (c) 2010-present MIT License\n * Unicode data by Mathias Bynens <mathiasbynens.be>\n */\n\nimport categories from '../../tools/output/categories';\n\nexport default (XRegExp) => {\n\n /**\n * Adds support for Unicode's general categories. E.g., `\\p{Lu}` or `\\p{Uppercase Letter}`. See\n * category descriptions in UAX #44 <http://unicode.org/reports/tr44/#GC_Values_Table>. Token\n * names are case insensitive, and any spaces, hyphens, and underscores are ignored.\n *\n * Uses Unicode 14.0.0.\n *\n * @requires XRegExp, Unicode Base\n */\n\n if (!XRegExp.addUnicodeData) {\n throw new ReferenceError('Unicode Base must be loaded before Unicode Categories');\n }\n\n XRegExp.addUnicodeData(categories);\n};\n","/*!\n * XRegExp Unicode Properties 5.1.1\n * <xregexp.com>\n * Steven Levithan (c) 2012-present MIT License\n * Unicode data by Mathias Bynens <mathiasbynens.be>\n */\n\nimport properties from '../../tools/output/properties';\n\nexport default (XRegExp) => {\n\n /**\n * Adds properties to meet the UTS #18 Level 1 RL1.2 requirements for Unicode regex support. See\n * <http://unicode.org/reports/tr18/#RL1.2>. Following are definitions of these properties from\n * UAX #44 <http://unicode.org/reports/tr44/>:\n *\n * - Alphabetic\n * Characters with the Alphabetic property. Generated from: Lowercase + Uppercase + Lt + Lm +\n * Lo + Nl + Other_Alphabetic.\n *\n * - Default_Ignorable_Code_Point\n * For programmatic determination of default ignorable code points. New characters that should\n * be ignored in rendering (unless explicitly supported) will be assigned in these ranges,\n * permitting programs to correctly handle the default rendering of such characters when not\n * otherwise supported.\n *\n * - Lowercase\n * Characters with the Lowercase property. Generated from: Ll + Other_Lowercase.\n *\n * - Noncharacter_Code_Point\n * Code points permanently reserved for internal use.\n *\n * - Uppercase\n * Characters with the Uppercase property. Generated from: Lu + Other_Uppercase.\n *\n * - White_Space\n * Spaces, separator characters and other control characters which should be treated by\n * programming languages as \"white space\" for the purpose of parsing elements.\n *\n * The properties ASCII, Any, and Assigned are also included but are not defined in UAX #44. UTS\n * #18 RL1.2 additionally requires support for Unicode scripts and general categories. These are\n * included in XRegExp's Unicode Categories and Unicode Scripts addons.\n *\n * Token names are case insensitive, and any spaces, hyphens, and underscores are ignored.\n *\n * Uses Unicode 14.0.0.\n *\n * @requires XRegExp, Unicode Base\n */\n\n if (!XRegExp.addUnicodeData) {\n throw new ReferenceError('Unicode Base must be loaded before Unicode Properties');\n }\n\n const unicodeData = properties;\n\n // Add non-generated data\n unicodeData.push({\n name: 'Assigned',\n // Since this is defined as the inverse of Unicode category Cn (Unassigned), the Unicode\n // Categories addon is required to use this property\n inverseOf: 'Cn'\n });\n\n XRegExp.addUnicodeData(unicodeData);\n};\n","/*!\n * XRegExp Unicode Scripts 5.1.1\n * <xregexp.com>\n * Steven Levithan (c) 2010-present MIT License\n * Unicode data by Mathias Bynens <mathiasbynens.be>\n */\n\nimport scripts from '../../tools/output/scripts';\n\nexport default (XRegExp) => {\n\n /**\n * Adds support for all Unicode scripts. E.g., `\\p{Latin}`. Token names are case insensitive,\n * and any spaces, hyphens, and underscores are ignored.\n *\n * Uses Unicode 14.0.0.\n *\n * @requires XRegExp, Unicode Base\n */\n\n if (!XRegExp.addUnicodeData) {\n throw new ReferenceError('Unicode Base must be loaded before Unicode Scripts');\n }\n\n XRegExp.addUnicodeData(scripts, 'Script');\n};\n","import XRegExp from './xregexp';\n\nimport build from './addons/build';\nimport matchRecursive from './addons/matchrecursive';\nimport unicodeBase from './addons/unicode-base';\nimport unicodeCategories from './addons/unicode-categories';\nimport unicodeProperties from './addons/unicode-properties';\nimport unicodeScripts from './addons/unicode-scripts';\n\nbuild(XRegExp);\nmatchRecursive(XRegExp);\nunicodeBase(XRegExp);\nunicodeCategories(XRegExp);\nunicodeProperties(XRegExp);\nunicodeScripts(XRegExp);\n\nexport default XRegExp;\n","function getType(payload) {\n return Object.prototype.toString.call(payload).slice(8, -1);\n}\n\nfunction isAnyObject(payload) {\n return getType(payload) === \"Object\";\n}\n\nfunction isArray(payload) {\n return getType(payload) === \"Array\";\n}\n\nfunction isBlob(payload) {\n return getType(payload) === \"Blob\";\n}\n\nfunction isBoolean(payload) {\n return getType(payload) === \"Boolean\";\n}\n\nfunction isDate(payload) {\n return getType(payload) === \"Date\" && !isNaN(payload);\n}\n\nfunction isEmptyArray(payload) {\n return isArray(payload) && payload.length === 0;\n}\n\nfunction isPlainObject(payload) {\n if (getType(payload) !== \"Object\")\n return false;\n const prototype = Object.getPrototypeOf(payload);\n return !!prototype && prototype.constructor === Object && prototype === Object.prototype;\n}\n\nfunction isEmptyObject(payload) {\n return isPlainObject(payload) && Object.keys(payload).length === 0;\n}\n\nfunction isEmptyString(payload) {\n return payload === \"\";\n}\n\nfunction isError(payload) {\n return getType(payload) === \"Error\" || payload instanceof Error;\n}\n\nfunction isFile(payload) {\n return getType(payload) === \"File\";\n}\n\nfunction isFullArray(payload) {\n return isArray(payload) && payload.length > 0;\n}\n\nfunction isFullObject(payload) {\n return isPlainObject(payload) && Object.keys(payload).length > 0;\n}\n\nfunction isString(payload) {\n return getType(payload) === \"String\";\n}\n\nfunction isFullString(payload) {\n return isString(payload) && payload !== \"\";\n}\n\nfunction isFunction(payload) {\n return typeof payload === \"function\";\n}\n\nfunction isType(payload, type) {\n if (!(type instanceof Function)) {\n throw new TypeError(\"Type must be a function\");\n }\n if (!Object.prototype.hasOwnProperty.call(type, \"prototype\")) {\n throw new TypeError(\"Type is not a class\");\n }\n const name = type.name;\n return getType(payload) === name || Boolean(payload && payload.constructor === type);\n}\n\nfunction isInstanceOf(value, classOrClassName) {\n if (typeof classOrClassName === \"function\") {\n for (let p = value; p; p = Object.getPrototypeOf(p)) {\n if (isType(p, classOrClassName)) {\n return true;\n }\n }\n return false;\n } else {\n for (let p = value; p; p = Object.getPrototypeOf(p)) {\n if (getType(p) === classOrClassName) {\n return true;\n }\n }\n return false;\n }\n}\n\nfunction isMap(payload) {\n return getType(payload) === \"Map\";\n}\n\nfunction isNaNValue(payload) {\n return getType(payload) === \"Number\" && isNaN(payload);\n}\n\nfunction isNumber(payload) {\n return getType(payload) === \"Number\" && !isNaN(payload);\n}\n\nfunction isNegativeNumber(payload) {\n return isNumber(payload) && payload < 0;\n}\n\nfunction isNull(payload) {\n return getType(payload) === \"Null\";\n}\n\nfunction isOneOf(a, b, c, d, e) {\n return (value) => a(value) || b(value) || !!c && c(value) || !!d && d(value) || !!e && e(value);\n}\n\nfunction isUndefined(payload) {\n return getType(payload) === \"Undefined\";\n}\n\nconst isNullOrUndefined = isOneOf(isNull, isUndefined);\n\nfunction isObject(payload) {\n return isPlainObject(payload);\n}\n\nfunction isObjectLike(payload) {\n return isAnyObject(payload);\n}\n\nfunction isPositiveNumber(payload) {\n return isNumber(payload) && payload > 0;\n}\n\nfunction isSymbol(payload) {\n return getType(payload) === \"Symbol\";\n}\n\nfunction isPrimitive(payload) {\n return isBoolean(payload) || isNull(payload) || isUndefined(payload) || isNumber(payload) || isString(payload) || isSymbol(payload);\n}\n\nfunction isPromise(payload) {\n return getType(payload) === \"Promise\";\n}\n\nfunction isRegExp(payload) {\n return getType(payload) === \"RegExp\";\n}\n\nfunction isSet(payload) {\n return getType(payload) === \"Set\";\n}\n\nfunction isWeakMap(payload) {\n return getType(payload) === \"WeakMap\";\n}\n\nfunction isWeakSet(payload) {\n return getType(payload) === \"WeakSet\";\n}\n\nexport { getType, isAnyObject, isArray, isBlob, isBoolean, isDate, isEmptyArray, isEmptyObject, isEmptyString, isError, isFile, isFullArray, isFullObject, isFullString, isFunction, isInstanceOf, isMap, isNaNValue, isNegativeNumber, isNull, isNullOrUndefined, isNumber, isObject, isObjectLike, isOneOf, isPlainObject, isPositiveNumber, isPrimitive, isPromise, isRegExp, isSet, isString, isSymbol, isType, isUndefined, isWeakMap, isWeakSet };\n","import { isArray, isPlainObject, isSymbol } from 'is-what';\n\nfunction concatArrays(originVal, newVal) {\n if (isArray(originVal) && isArray(newVal)) {\n return originVal.concat(newVal);\n }\n return newVal;\n}\n\nfunction assignProp(carry, key, newVal, originalObject) {\n const propType = {}.propertyIsEnumerable.call(originalObject, key) ? \"enumerable\" : \"nonenumerable\";\n if (propType === \"enumerable\")\n carry[key] = newVal;\n if (propType === \"nonenumerable\") {\n Object.defineProperty(carry, key, {\n value: newVal,\n enumerable: false,\n writable: true,\n configurable: true\n });\n }\n}\nfunction mergeRecursively(origin, newComer, compareFn) {\n if (!isPlainObject(newComer))\n return newComer;\n let newObject = {};\n if (isPlainObject(origin)) {\n const props2 = Object.getOwnPropertyNames(origin);\n const symbols2 = Object.getOwnPropertySymbols(origin);\n newObject = [...props2, ...symbols2].reduce((carry, key) => {\n const targetVal = origin[key];\n if (!isSymbol(key) && !Object.getOwnPropertyNames(newComer).includes(key) || isSymbol(key) && !Object.getOwnPropertySymbols(newComer).includes(key)) {\n assignProp(\n carry,\n key,\n targetVal,\n origin\n );\n }\n return carry;\n }, {});\n }\n const props = Object.getOwnPropertyNames(newComer);\n const symbols = Object.getOwnPropertySymbols(newComer);\n const result = [...props, ...symbols].reduce((carry, key) => {\n let newVal = newComer[key];\n const targetVal = isPlainObject(origin) ? origin[key] : void 0;\n if (targetVal !== void 0 && isPlainObject(newVal)) {\n newVal = mergeRecursively(targetVal, newVal, compareFn);\n }\n const propToAssign = compareFn ? compareFn(targetVal, newVal, key) : newVal;\n assignProp(\n carry,\n key,\n propToAssign,\n newComer\n );\n return carry;\n }, newObject);\n return result;\n}\nfunction merge(object, ...otherObjects) {\n return otherObjects.reduce((result, newComer) => {\n return mergeRecursively(result, newComer);\n }, object);\n}\nfunction mergeAndCompare(compareFn, object, ...otherObjects) {\n return otherObjects.reduce((result, newComer) => {\n return mergeRecursively(result, newComer, compareFn);\n }, object);\n}\nfunction mergeAndConcat(object, ...otherObjects) {\n return otherObjects.reduce((result, newComer) => {\n return mergeRecursively(result, newComer, concatArrays);\n }, object);\n}\n\nexport { concatArrays, merge, mergeAndCompare, mergeAndConcat };\n","/**\n * A function that validates whether the given input is an object of type Type\n * @returns true if obj is of type Type, false if not\n */\nexport type FilterFn<Type extends Record<string, unknown>> = (\n obj: unknown,\n) => obj is Type;\n\n/**\n * The supported value types\n */\nexport type ValueType = number | string | boolean | null | Date | object;\n\n/**\n * A function implementing a FilterOperators\n * @param columnValue the value of the input object to test the filter against\n * @param filterValue the value of the filter, e.g. in .eq('colname', 'filterValue'), 'filterValue' would be the filterValue\n * @returns true if the filter applies, false if not\n */\nexport type OperatorFn = (columnValue: any, filterValue: any) => boolean;\n\n/**\n * All supported operators of PostgREST\n */\nexport type FilterOperator =\n | 'or'\n | 'eq'\n | 'neq'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'like'\n | 'ilike'\n | 'is'\n | 'in'\n | 'cs'\n | 'cd'\n | 'fts'\n | 'plfts';\n\n/**\n * An object describing a selected path of a query\n *\n */\nexport type Path = {\n /**\n * The aliased path if a column or relation name mapping is used within the path\n */\n alias?: string;\n /**\n * The \"real\" path of a column\n */\n path: string;\n /**\n * The full declaration of a column that includes alias, hints and inner joins\n */\n declaration: string;\n /**\n * The aggregate function applied to the path\n */\n aggregate?: string;\n};\n\n/**\n * A decomposed filter applied to a query\n */\nexport type FilterDefinition = {\n /**\n * The path to which the filter is applied\n */\n path: string;\n /**\n * The aliased path if a column or relation name mapping is used\n */\n alias?: string;\n /**\n * The operator that is applied\n */\n operator: FilterOperator;\n /**\n * Whether or not to negate the results of the filter, e.g. when .not('name', 'eq', 'Paris') is applied\n */\n negate: boolean;\n /**\n * The value of the filter\n */\n value: ValueType;\n};\n\n/**\n * A json representation of PostgREST filters that are applied to a query\n */\nexport type FilterDefinitions = (\n | { or: FilterDefinitions }\n | { and: FilterDefinitions }\n | FilterDefinition\n)[];\n\ntype ArrayElement<ArrayType extends readonly unknown[]> =\n ArrayType extends readonly (infer ElementType)[] ? ElementType : never;\n\nexport const isAndFilter = (\n f: ArrayElement<FilterDefinitions>,\n): f is { and: FilterDefinitions } =>\n Array.isArray((f as { and: FilterDefinitions }).and);\n\nexport const isOrFilter = (\n f: ArrayElement<FilterDefinitions>,\n): f is { or: FilterDefinitions } =>\n Array.isArray((f as { or: FilterDefinitions }).or);\n\nexport const isFilterDefinition = (\n f: ArrayElement<FilterDefinitions>,\n): f is FilterDefinition => !isAndFilter(f) && !isOrFilter(f);\n\nexport type OrderDefinition = {\n column: string;\n ascending: boolean;\n nullsFirst: boolean;\n foreignTable?: string;\n};\n","import {\n type FilterDefinitions,\n type Path,\n isAndFilter,\n isFilterDefinition,\n isOrFilter,\n} from './query-types';\n\nexport const extractPathsFromFilters = (f: FilterDefinitions, p: Path[]) => {\n return f.reduce<Path[]>((prev, filter) => {\n if (isAndFilter(filter)) {\n prev.push(...extractPathsFromFilters(filter.and, p));\n } else if (isOrFilter(filter)) {\n prev.push(...extractPathsFromFilters(filter.or, p));\n } else if (isFilterDefinition(filter)) {\n const relatedPath = p.find((p) => p.path === filter.path);\n const pathElements = filter.path.split('.');\n const aliasElements = filter.alias?.split('.');\n const declaration = pathElements\n .map(\n (el, idx) =>\n `${aliasElements && aliasElements[idx] !== el ? `${aliasElements[idx]}:` : ''}${el}`,\n )\n .join('.');\n prev.push({\n path: filter.path,\n alias: filter.alias,\n declaration: relatedPath ? relatedPath.declaration : declaration,\n });\n }\n return prev;\n }, []);\n};\n","import type { Path } from './query-types';\n\nexport const removeFirstPathElement = (p: Path): Path => {\n const aliasWithoutFirstElement = p.alias\n ? p.alias.split('.').slice(1).join('.')\n : undefined;\n const pathWithoutFirstEelment = p.path.split('.').slice(1).join('.');\n\n return {\n declaration: p.declaration.split('.').slice(1).join('.'),\n path: pathWithoutFirstEelment,\n alias:\n aliasWithoutFirstElement &&\n (aliasWithoutFirstElement.split('.').length > 1 ||\n aliasWithoutFirstElement !== pathWithoutFirstEelment)\n ? aliasWithoutFirstElement\n : undefined,\n };\n};\n","import type { Path } from './query-types';\nimport { removeFirstPathElement } from './remove-first-path-element';\n\nexport type NestedPath = {\n alias?: string;\n path: string;\n declaration: string;\n paths: (Path | NestedPath)[];\n};\n\nexport const isNestedPath = (p: Path | NestedPath): p is NestedPath =>\n Array.isArray((p as NestedPath).paths);\n\n// group paths by first path elements declaration\n// returns [Path, Path, NestedPath, NestedPath, Path]\nexport const groupPathsRecursive = (paths: Path[]): (Path | NestedPath)[] => {\n const grouped = paths.reduce<(Path | NestedPath)[]>((prev, curr) => {\n const levels = curr.path.split('.').length;\n if (levels === 1) {\n prev.push(curr);\n return prev;\n }\n\n // if has more than one level left,\n const firstLevelDeclaration = curr.declaration.split('.')[0];\n const indexOfNested = prev.findIndex(\n (p) => isNestedPath(p) && p.declaration === firstLevelDeclaration,\n );\n const pathWithoutCurrentLevel = removeFirstPathElement(curr);\n if (indexOfNested !== -1) {\n // add to nested\n (prev[indexOfNested] as NestedPath).paths.push(pathWithoutCurrentLevel);\n return prev;\n }\n // create nested\n prev.push({\n declaration: firstLevelDeclaration,\n path: curr.path.split('.')[0],\n paths: [pathWithoutCurrentLevel],\n ...(curr.alias ? { alias: curr.alias.split('.')[0] } : {}),\n });\n return prev;\n }, []);\n\n return grouped.map((p) =>\n isNestedPath(p) ? { ...p, paths: groupPathsRecursive(p.paths) } : p,\n );\n};\n","import XRegExp from 'xregexp';\n\nimport type { Path } from './query-types';\n\nexport const parseSelectParam = (s: string, currentPath?: Path): Path[] => {\n s = s.replace(/\\s/g, '');\n\n let result;\n try {\n result = XRegExp.matchRecursive(`,${s}`, '([^,\\\\(]+)\\\\(', '\\\\)', 'g', {\n valueNames: {\n '0': null,\n '1': 'tableName',\n '2': 'selectedColumns',\n '3': null,\n },\n }).map((item) => {\n if (\n item.name === 'tableName' &&\n item.value &&\n !item.value.startsWith(',')\n ) {\n item.value = ',' + item.value;\n }\n return item;\n });\n } catch (e) {\n const path = currentPath?.path\n ? `${currentPath?.declaration} with alias ${currentPath?.alias} at path ${currentPath?.path}`\n : 'root';\n throw new Error(`Unable to parse ${s} at ${path}`, {\n cause: e,\n });\n }\n\n const foreignTables = result.reduce((prev, curr, idx, matches) => {\n if (curr.name === 'selectedColumns' && curr.value.length > 0) {\n const name = matches[idx - 1].value.slice(1, -1);\n prev = { ...prev, [name]: curr.value };\n }\n return prev;\n }, {});\n\n const columns = s\n .replace(\n new RegExp(\n `${Object.entries(foreignTables)\n .map(([table, selectedColumns]) =>\n `${table}(${selectedColumns})`\n .replace(/\\(/g, '\\\\(')\n .replace(/\\)/g, '\\\\)')\n .replace(/\\*/g, '\\\\*'),\n )\n .join('|')}`,\n 'g',\n ),\n '',\n )\n .replace(/(,)\\1+/g, ',')\n .split(',')\n .filter((c) => c.length > 0)\n .map((c) => {\n const split = c.split(':');\n const hasAlias = split.length > 1;\n\n const aggregateSplit = split[hasAlias ? 1 : 0].split('.');\n const hasAggregate =\n aggregateSplit.length > 1 && aggregateSplit[1].endsWith('()');\n\n return {\n declaration: [currentPath?.declaration, c].filter(Boolean).join('.'),\n alias:\n hasAlias || currentPath?.alias\n ? [currentPath?.alias ?? currentPath?.path, split[0]]\n .filter(Boolean)\n .join('.')\n : undefined,\n path: [\n currentPath?.path,\n hasAggregate ? aggregateSplit[0] : split[hasAlias ? 1 : 0],\n ]\n .filter(Boolean)\n .join('.'),\n ...(hasAggregate ? { aggregate: aggregateSplit[1].slice(0, -2) } : {}),\n };\n });\n\n return [\n ...columns,\n ...Object.entries(foreignTables).flatMap(\n ([currentDeclaration, selectedColumns]) => {\n // example for declaration\n // alias:organisation!contact_organisation_id_fkey!inner\n const aliasSplit = currentDeclaration.split(':');\n\n const currentAliasElem =\n aliasSplit.length > 1 ? aliasSplit[0] : undefined;\n\n const currentPathDeclaration = aliasSplit[aliasSplit.length - 1];\n const currentPathElem = currentPathDeclaration.split('!')[0];\n\n const path = [currentPath?.path, currentPathElem]\n .filter(Boolean)\n .join('.');\n\n const alias = [\n currentPath?.alias ?? currentPath?.path,\n currentAliasElem ?? currentPathElem,\n ]\n .filter(Boolean)\n .join('.');\n\n const declaration = [currentPath?.declaration, currentDeclaration]\n .filter(Boolean)\n .join('.');\n\n return parseSelectParam(`${selectedColumns}`, {\n path,\n alias: currentPath?.alias || currentAliasElem ? alias : undefined,\n declaration,\n });\n },\n ),\n ];\n};\n","// removes alias from every level of declaration\nexport const removeAliasFromDeclaration = (d: string) =>\n d\n .split('.')\n .map((el) => el.split(':').pop() as string)\n .join('.');\n","import {\n type NestedPath,\n groupPathsRecursive,\n isNestedPath,\n} from '../lib/group-paths-recursive';\nimport type { Path } from '../lib/query-types';\n\n// Transforms a list of Path[] into a select statement\nexport const buildSelectStatement = (paths: Path[]): string => {\n return buildSelectStatementFromGroupedPaths(groupPathsRecursive(paths));\n};\n\n// Transforms a list of (Path | NestedPath)[] grouped statements into a select statement\nexport const buildSelectStatementFromGroupedPaths = (\n paths: (Path | NestedPath)[],\n): string =>\n paths\n .map((i) => {\n if (isNestedPath(i)) {\n return `${i.declaration}(${buildSelectStatement(i.paths)})`;\n }\n return `${i.alias ? `${i.alias}:` : ''}${i.path}`;\n })\n .join(',');\n","import { type NestedPath, isNestedPath } from '../lib/group-paths-recursive';\nimport type { Path } from '../lib/query-types';\n\nexport const DEDUPE_ALIAS_PREFIX = 'd';\n\nexport const dedupeGroupedPathsRecursive = (\n grouped: (Path | NestedPath)[],\n): (Path | NestedPath)[] => {\n const dedupeCounters = new Map<string, number>();\n\n return grouped.map((p, idx, a) => {\n // never dedupe non-nested paths because even if there is a duplicate we always want to dedupe the nested path instead\n // e.g. inbox_id,inbox_id(name) should be deduped to inbox_id,d_0_inbox_id:inbox_id(name)\n if (!isNestedPath(p)) return p;\n\n // dedupe current nested path if there is another path with the same `path`\n if (a.some((i, itemIdx) => i.path === p.path && idx !== itemIdx)) {\n const counter = dedupeCounters.get(p.path) || 0;\n dedupeCounters.set(p.path, counter + 1);\n const alias = [DEDUPE_ALIAS_PREFIX, counter, p.path].join('_');\n return {\n ...p,\n alias,\n declaration: `${alias}:${p.declaration}`,\n paths: dedupeGroupedPathsRecursive(p.paths),\n };\n }\n\n return {\n ...p,\n paths: dedupeGroupedPathsRecursive(p.paths),\n };\n });\n};\n","import { extractPathsFromFilters } from '../lib/extract-paths-from-filter';\nimport {\n type NestedPath,\n groupPathsRecursive,\n} from '../lib/group-paths-recursive';\nimport { parseSelectParam } from '../lib/parse-select-param';\nimport type { FilterDefinitions, Path } from '../lib/query-types';\nimport { removeAliasFromDeclaration } from '../lib/remove-alias-from-declaration';\nimport { buildSelectStatementFromGroupedPaths } from './build-select-statement';\nimport { dedupeGroupedPathsRecursive } from './dedupe';\n\nexport type BuildNormalizedQueryOps<Q extends string = '*'> = {\n query?: Q | null;\n // if true, will not add any paths from the cache to the query\n disabled?: boolean;\n queriesForTable: () => { paths: Path[]; filters: FilterDefinitions }[];\n};\n\nexport type BuildNormalizedQueryReturn = {\n // The joint select query\n selectQuery: string;\n // All paths the user is querying for\n groupedUserQueryPaths: (NestedPath | Path)[] | null;\n // All paths the user is querying for + all paths that are currently loaded into the cache\n groupedPaths: (NestedPath | Path)[];\n};\n\n/**\n * returns select statement that includes the users query + all paths currently loaded into cache to later perform a \"smart update\"\n *\n * the select statement does not contain any user-defined aliases. only custom ones to dedupe.\n * without deduping, we would not be able to query inbox_id,inbox:inbox_id(name),\n * because it will result in a select of inbox_id,inbox_id(name), which does not work.\n * to dedupe, we add a custom alias to the query, e.g. dedupe_0:inbox_id,inbox_id(name)\n * we then later remove them when normalizing the data\n **/\nexport const buildNormalizedQuery = <Q extends string = '*'>({\n query,\n disabled,\n queriesForTable,\n}: BuildNormalizedQueryOps<Q>): BuildNormalizedQueryReturn | null => {\n // parse user query\n const userQueryPaths = query ? parseSelectParam(query) : null;\n\n // unique set of declaration without paths.\n // alias not needed for paths\n // declaration without alias!\n const paths: Path[] = userQueryPaths\n ? userQueryPaths.map((q) => ({\n declaration: removeAliasFromDeclaration(q.declaration),\n path: q.path,\n }))\n : [];\n\n if (!disabled) {\n for (const tableQuery of queriesForTable()) {\n for (const filterPath of extractPathsFromFilters(\n tableQuery.filters,\n tableQuery.paths,\n )) {\n // add paths used in filter\n const path = tableQuery.paths.find(\n (p) => p.path === filterPath.path && p.alias === filterPath.alias,\n ) ?? {\n path: filterPath.path,\n declaration: filterPath.path,\n };\n // add unique\n if (\n paths.every(\n (p) =>\n removeAliasFromDeclaration(p.declaration) !==\n removeAliasFromDeclaration(path.declaration),\n )\n ) {\n // do not use alias\n paths.push({\n path: path.path,\n declaration: removeAliasFromDeclaration(path.declaration),\n });\n }\n }\n // add paths used in query\n for (const path of tableQuery.paths) {\n if (\n paths.every(\n (p) =>\n removeAliasFromDeclaration(p.declaration) !==\n removeAliasFromDeclaration(path.declaration),\n ) &&\n // do not add agg functions\n !path.declaration.endsWith('.count') &&\n // do not add wildcard queries\n !path.declaration.endsWith('*')\n ) {\n paths.push({\n path: path.path,\n declaration: removeAliasFromDeclaration(path.declaration),\n });\n }\n }\n }\n }\n\n const groupedPaths = groupPathsRecursive(paths);\n const groupedDedupedPaths = dedupeGroupedPathsRecursive(groupedPaths);\n\n const selectQuery = buildSelectStatementFromGroupedPaths(groupedDedupedPaths);\n if (selectQuery.length === 0) return null;\n return {\n selectQuery,\n groupedUserQueryPaths: userQueryPaths\n ? groupPathsRecursive(userQueryPaths)\n : null,\n groupedPaths: groupedDedupedPaths,\n };\n};\n","import { flatten } from 'flat';\n\nimport { get } from '../lib/get';\nimport { type NestedPath, isNestedPath } from '../lib/group-paths-recursive';\nimport { isPlainObject } from '../lib/is-plain-object';\nimport type { Path } from '../lib/query-types';\nimport type { BuildNormalizedQueryReturn } from './build-normalized-query';\n\n/**\n * The parsed response of the mutation fetcher\n **/\nexport type MutationFetcherResponse<R> = {\n /**\n * Normalized response. A flat json object with a depth of 1, where the keys are the full json paths.\n **/\n normalizedData: R;\n /**\n * Result of the query passed by the user\n **/\n userQueryData?: R;\n};\n\nexport const buildMutationFetcherResponse = <R>(\n /**\n * response of the select query built by `buildNormalizedQuery`. contains dedupe aliases.\n **/\n input: R,\n {\n groupedPaths,\n groupedUserQueryPaths,\n }: Pick<BuildNormalizedQueryReturn, 'groupedPaths' | 'groupedUserQueryPaths'>,\n): MutationFetcherResponse<R> => {\n return {\n normalizedData: normalizeResponse<R>(groupedPaths, input),\n userQueryData: groupedUserQueryPaths\n ? buildUserQueryData<R>(groupedUserQueryPaths, groupedPaths, input)\n : undefined,\n };\n};\n\n/**\n * Normalize the response by removing the dedupe alias and flattening it\n **/\nexport const normalizeResponse = <R>(\n groups: (Path | NestedPath)[],\n obj: R,\n): R => {\n if (groups.some((p) => p.path === '*')) {\n // if wildcard, add every non nested value\n // for every nested value, check if groups contains a nested path for it. if not, also add it.\n // reason is that the wildcard does not select relations\n\n Object.entries(obj as Record<string, unknown>).forEach(([k, v]) => {\n if (typeof v === 'object' || Array.isArray(v)) {\n if (!groups.some((g) => isNestedPath(g) && g.path === k)) {\n groups.push({\n path: k,\n declaration: k,\n });\n }\n } else if (!groups.some((g) => g.path === k)) {\n groups.push({\n path: k,\n declaration: k,\n });\n }\n });\n }\n\n return groups.reduce<R>((prev, curr) => {\n // prefer alias over path because of dedupe alias\n const value = get(obj, curr.alias || curr.path);\n\n if (typeof value === 'undefined') return prev;\n if (value === null) {\n return {\n ...prev,\n // add hint to path if it has dedupe alias\n // can happen if the same relation is queried multiple times via different fkeys\n [`${curr.path}${\n curr.alias?.startsWith('d_') && curr.declaration.split('!').length > 1\n ? `!${curr.declaration.split('!')[1]}`\n : ''\n }`]: value,\n };\n }\n if (!isNestedPath(curr)) {\n return {\n ...prev,\n ...flatten({\n [curr.path]:\n value !== null &&\n (isPlainObject(value) || (Array.isArray(value) && value.length > 0))\n ? flatten(value)\n : value,\n }),\n };\n }\n if (Array.isArray(value)) {\n return {\n ...prev,\n ...(flatten({\n [curr.path]: value.map((v) => normalizeResponse(curr.paths, v)),\n }) as R),\n };\n }\n return {\n ...prev,\n ...flatten({\n // add hint to path if it has dedupe alias\n // can happen if the same relation is queried multiple times via different fkeys\n [`${curr.path}${\n curr.alias?.startsWith('d_') && curr.declaration.split('!').length > 1\n ? `!${curr.declaration.split('!')[1]}`\n : ''\n }`]: normalizeResponse(curr.paths, value as Record<string, unknown>),\n }),\n };\n }, {} as R);\n};\n\n/**\n * Build userQueryData from response\n *\n * note that `paths` is reflecting `obj`, not `userQueryPaths`.\n * iterate over `userQueryPaths` and find the corresponding path in `paths`.\n * Then, get value using the found alias and path from `obj`.\n **/\nconst buildUserQueryData = <R>(\n userQueryGroups: (Path | NestedPath)[],\n pathGroups: (Path | NestedPath)[],\n obj: R,\n): R => {\n if (pathGroups.some((p) => p.path === '*')) {\n // if wildcard, add every non nested value\n // for every nested value, check if pathGroups contains a nested path for it. if not, also add it.\n // reason is that the wildcard does not select relations\n\n Object.entries(obj as Record<string, unknown>).forEach(([k, v]) => {\n if (typeof v === 'object' || Array.isArray(v)) {\n if (!pathGroups.some((g) => isNestedPath(g) && g.path === k)) {\n pathGroups.push({\n path: k,\n declaration: k,\n });\n }\n } else if (!pathGroups.some((g) => g.path === k)) {\n pathGroups.push({\n path: k,\n declaration: k,\n });\n }\n });\n }\n\n if (userQueryGroups.some((p) => p.path === '*')) {\n // if wildcard, add every non nested value\n // for every nested value, check if pathGroups contains a nested path for it. if not, also add it.\n // reason is that the wildcard does not select relations\n\n Object.entries(obj as Record<string, unknown>).forEach(([k, v]) => {\n if (typeof v === 'object' || Array.isArray(v)) {\n if (!pathGroups.some((g) => isNestedPath(g) && g.path === k)) {\n userQueryGroups.push({\n path: k,\n declaration: k,\n });\n }\n } else if (!userQueryGroups.some((g) => g.path === k)) {\n userQueryGroups.push({\n path: k,\n declaration: k,\n });\n }\n });\n }\n\n return userQueryGroups.reduce<R>((prev, curr) => {\n if (curr.path === '*') return prev;\n // paths is reflecting the obj\n const inputPath = pathGroups.find(\n (p) => p.path === curr.path && isNestedPath(p) === isNestedPath(curr),\n );\n if (!inputPath) {\n // should never happen though since userQueryPaths is a subset of paths\n throw new Error(`Path ${curr.path} not found in response paths`);\n }\n const value = get(obj, inputPath.alias || inputPath.path);\n\n if (typeof value === 'undefined') return prev;\n if (value === null || !isNestedPath(curr) || !isNestedPath(inputPath)) {\n (prev as Record<string, unknown>)[curr.alias ? curr.alias : curr.path] =\n value;\n } else if (Array.isArray(value)) {\n (prev as Record<string, unknown>)[curr.alias ? curr.alias : curr.path] =\n value.map((v) => buildUserQueryData(curr.paths, inputPath.paths, v));\n } else {\n (prev as Record<string, unknown>)[curr.alias ? curr.alias : curr.path] =\n buildUserQueryData(\n curr.paths,\n inputPath.paths,\n value as Record<string, unknown>,\n );\n }\n return prev;\n }, {} as R);\n};\n","export const get = (obj: any, path: string, defaultValue: any = undefined) => {\n const split = path.split(/((?:\\.|,|\\[|\\]|->>|->)+)/g);\n let result: any = obj;\n for (let i = -1; i < split.length; i += 2) {\n const separator = split[i];\n let key: string | number = split[i + 1];\n if (!key) {\n continue;\n }\n if (separator?.endsWith('->') || separator?.endsWith('->>')) {\n if (/^\\d+$/.test(key)) {\n key = Number.parseInt(key, 10);\n }\n }\n if (separator?.endsWith('->>')) {\n result = `${result ? result[key] : result}`;\n } else {\n result = result ? result[key] : result;\n }\n }\n return result === undefined || result === obj ? defaultValue : result;\n};\n","export function isPlainObject(\n value: unknown,\n): value is Record<string, unknown> {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\n","/**\n * Parses a url and returns the table name the url is interacting with.\n *\n * For mutations, the .split('?') goes unused.\n *\n * @param url The url we are pulling the table name from\n * @returns Table name\n */\nexport const getTableFromUrl = (url: string): string => {\n // Split the url\n const split = url.toString().split('/');\n // Pop the last part of the path off and remove any params if they exist\n const table = split.pop()?.split('?').shift() as string;\n // Pop an additional position to check for rpc\n const maybeRpc = split.pop() as string;\n // Rejoin the result to include rpc otherwise just table name\n return [maybeRpc === 'rpc' ? maybeRpc : null, table]\n .filter(Boolean)\n .join('/');\n};\n","export type MaybeLikeQueryBuilder<Result> = unknown;\n\nexport type LikeQueryBuilder<Result> = {\n url: URL;\n};\n\nexport const isLikeQueryBuilder = <Result>(\n v: MaybeLikeQueryBuilder<Result>,\n): v is LikeQueryBuilder<Result> => {\n if (typeof v !== 'object' || v === null) return false;\n const obj = v as LikeQueryBuilder<Result>;\n\n return typeof obj['url'] === 'object';\n};\n","import { getTableFromUrl } from './get-table-from-url';\nimport { MaybeLikePostgrestBuilder } from './like-postgrest-builder';\nimport { isLikeQueryBuilder } from './like-query-builder';\n\nexport const getTable = <Result>(\n query: MaybeLikePostgrestBuilder<Result>,\n): string => {\n if (!isLikeQueryBuilder(query)) {\n throw new Error('Invalid PostgrestBuilder');\n }\n\n return getTableFromUrl(query['url'].pathname);\n};\n","import type { PostgrestHasMorePaginationResponse } from './response-types';\n\nexport type PostgrestPaginationCacheData<Result> = Result[][];\n\nexport const isPostgrestPaginationCacheData = <Result>(\n q: unknown,\n): q is PostgrestPaginationCacheData<Result> => {\n if (!Array.isArray(q)) return false;\n return q.length === 0 || Array.isArray(q[0]);\n};\n\nexport type PostgrestHasMorePaginationCacheData<Result> =\n PostgrestHasMorePaginationResponse<Result>[];\n\nexport const isPostgrestHasMorePaginationCacheData = <Result>(\n q: unknown,\n): q is PostgrestHasMorePaginationCacheData<Result> => {\n if (!Array.isArray(q)) return false;\n if (q.length === 0) return true;\n const firstPage = q[0];\n return (\n Array.isArray(\n (firstPage as PostgrestHasMorePaginationResponse<Result>).data,\n ) &&\n typeof (firstPage as PostgrestHasMorePaginationResponse<Result>).hasMore ===\n 'boolean'\n );\n};\n","import type {\n PostgrestMaybeSingleResponse,\n PostgrestResponse,\n PostgrestSingleResponse,\n} from '@supabase/postgrest-js';\n\n// Convencience type to not bloat up implementation\nexport type AnyPostgrestResponse<Result> =\n | PostgrestSingleResponse<Result>\n | PostgrestMaybeSingleResponse<Result>\n | PostgrestResponse<Result>;\n\nexport const isAnyPostgrestResponse = <Result>(\n q: unknown,\n): q is AnyPostgrestResponse<Result> => {\n if (!q) return false;\n return (\n typeof (q as AnyPostgrestResponse<Result>).data === 'object' ||\n Array.isArray((q as AnyPostgrestResponse<Result>).data)\n );\n};\n\nexport type PostgrestPaginationResponse<Result> = Result[];\n\nexport const isPostgrestPaginationResponse = <Result>(\n q: unknown,\n): q is PostgrestPaginationResponse<Result> => {\n return Array.isArray(q);\n};\n\nexport type PostgrestHasMorePaginationResponse<Result> = {\n data: Result[];\n hasMore: boolean;\n};\n\nexport const isPostgrestHasMorePaginationResponse = <Result>(\n q: unknown,\n): q is PostgrestHasMorePaginationResponse<Result> => {\n if (!q) return false;\n return (\n Array.isArray((q as PostgrestHasMorePaginationResponse<Result>).data) &&\n typeof (q as PostgrestHasMorePaginationResponse<Result>).hasMore ===\n 'boolean'\n );\n};\n","import { flatten, unflatten } from 'flat';\n\nimport { sortSearchParams } from './sort-search-param';\n\n/**\n * Encodes an object by url-encoding an ordered lists of all paths and their values.\n */\nexport const encodeObject = (obj: Record<string, unknown>): string => {\n const sortedEntries = Object.entries(\n flatten(obj) as Record<string, unknown>,\n ).sort(([a], [b]) => a.length - b.length);\n const bodyParams = new URLSearchParams();\n sortedEntries.forEach(([key, value]) => {\n bodyParams.append(key, String(value));\n });\n return sortSearchParams(bodyParams).toString();\n};\n\n/**\n * Decodes a URL-encoded string back into a nested object.\n * This is the reverse operation of encodeObject.\n */\nexport const decodeObject = (\n encodedString: string,\n): Record<string, unknown> => {\n const params = new URLSearchParams(encodedString);\n const flatObject: Record<string, unknown> = {};\n\n // Convert URLSearchParams back to a flat object\n params.forEach((value, key) => {\n // Try to convert string values to appropriate types\n let parsedValue: unknown = value;\n\n // Try to parse numbers\n if (/^-?\\d+$/.test(value)) {\n parsedValue = parseInt(value, 10);\n } else if (/^-?\\d+\\.\\d+$/.test(value)) {\n parsedValue = parseFloat(value);\n } else if (value === 'true') {\n parsedValue = true;\n } else if (value === 'false') {\n parsedValue = false;\n } else if (value === 'null') {\n parsedValue = null;\n }\n\n flatObject[key] = parsedValue;\n });\n\n // Unflatten the object to restore nested structure\n return unflatten(flatObject);\n};\n","export const sortSearchParams = (params: URLSearchParams) =>\n new URLSearchParams(\n Array.from(params.entries()).sort((a, b) => {\n const x = `${a[0]}${a[1]}`;\n const y = `${b[0]}${b[1]}`;\n return x > y ? 1 : -1;\n }),\n );\n","import type {\n PostgrestBuilder,\n PostgrestClientOptions,\n} from '@supabase/postgrest-js';\n\nexport const isPostgrestBuilder = <Result>(\n q: unknown,\n): q is PostgrestBuilder<PostgrestClientOptions, Result> => {\n return (\n typeof (q as PostgrestBuilder<PostgrestClientOptions, Result>)\n .throwOnError === 'function'\n );\n};\n","import type {\n PostgrestClientOptions,\n PostgrestTransformBuilder,\n} from '@supabase/postgrest-js';\nimport type { GenericSchema } from '@supabase/postgrest-js/dist/cjs/types';\n\nexport const isPostgrestTransformBuilder = <\n ClientOptions extends PostgrestClientOptions,\n Schema extends GenericSchema,\n Row extends Record<string, unknown>,\n Result,\n RelationName = unknown,\n Relationships = unknown,\n>(\n q: unknown,\n): q is PostgrestTransformBuilder<\n ClientOptions,\n Schema,\n Row,\n Result,\n RelationName,\n Relationships\n> => {\n return (\n typeof (\n q as PostgrestTransformBuilder<\n ClientOptions,\n Schema,\n Row,\n Result,\n RelationName,\n Relationships\n >\n ).abortSignal === 'function'\n );\n};\n","export const setFilterValue = (\n searchParams: URLSearchParams,\n path: string,\n op: string,\n value: string,\n) => {\n const filters = searchParams.getAll(path);\n // delete all\n searchParams.delete(path);\n\n // re-create\n for (const f of filters) {\n if (f.startsWith(`${op}.`)) {\n continue;\n }\n searchParams.append(path, f);\n }\n\n searchParams.append(path, `${op}.${value}`);\n};\n","/**\n * Check if a value is a valid ISO DateTime string\n * @param v\n * @returns\n */\nexport const isISODateString = (v: unknown): boolean =>\n typeof v === 'string' &&\n /(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))/.test(\n v,\n );\n","import { isISODateString } from './is-iso-date-string';\nimport type { ValueType } from './query-types';\n\n/**\n * Safely parse any value to a ValueType\n * @param v Any value\n * @returns a ValueType\n */\nexport const parseValue = (v: any): ValueType => {\n if (isISODateString(v)) return new Date(v);\n try {\n return JSON.parse(v);\n } catch {\n return v;\n }\n};\n","import type { OrderDefinition } from './query-types';\n\n/**\n * Parses orderByKey back to OrderDefinition\n * @param key generated by PostgrestParser\n * @returns The parsed OrderDefinition\n */\nexport const parseOrderByKey = (v: string): OrderDefinition[] => {\n return v.split('|').map((orderBy) => {\n const [tableDef, orderDef] = orderBy.split(':');\n const [foreignTableOrCol, maybeCol] = tableDef.split('.');\n const [dir, nulls] = orderDef.split('.');\n return {\n ascending: dir === 'asc',\n nullsFirst: nulls === 'nullsFirst',\n foreignTable: maybeCol ? foreignTableOrCol : undefined,\n column: maybeCol ? maybeCol : foreignTableOrCol,\n };\n });\n};\n","import { OrderDefinition } from './query-types';\n\nexport const parseOrderBy = (searchParams: URLSearchParams) => {\n const orderBy: OrderDefinition[] = [];\n searchParams.forEach((value, key) => {\n const split = key.split('.');\n if (split[split.length === 2 ? 1 : 0] === 'order') {\n // separated by ,\n const orderByDefs = value.split(',');\n orderByDefs.forEach((def) => {\n const [column, ascending, nullsFirst] = def.split('.');\n orderBy.push({\n ascending: ascending === 'asc',\n column,\n nullsFirst: nullsFirst === 'nullsfirst',\n foreignTable: split.length === 2 ? split[0] : undefined,\n });\n });\n }\n });\n\n return orderBy;\n};\n","import {\n type FilterDefinition,\n type FilterDefinitions,\n isAndFilter,\n isFilterDefinition,\n isOrFilter,\n} from './query-types';\n\n// Helper to search for filters in a filter definition\nexport const findFilters = (\n f: FilterDefinitions,\n by: Partial<FilterDefinition>,\n) => {\n const filters: FilterDefinition[] = [];\n f.forEach((filter) => {\n if (isAndFilter(filter)) {\n filters.push(...findFilters(filter.and, by));\n }\n if (isOrFilter(filter)) {\n filters.push(...findFilters(filter.or, by));\n }\n if (isFilterDefinition(filter)) {\n if (\n (typeof by.path === 'undefined' || filter.path === by.path) &&\n (typeof by.alias === 'undefined' || filter.alias === by.alias) &&\n (typeof by.value === 'undefined' || filter.value === by.value) &&\n (typeof by.negate === 'undefined' || filter.negate === by.negate) &&\n (typeof by.operator === 'undefined' || filter.operator === by.operator)\n ) {\n filters.push(filter);\n }\n }\n });\n return filters;\n};\n","import type {\n PostgrestClientOptions,\n PostgrestTransformBuilder,\n} from '@supabase/postgrest-js';\nimport { GenericSchema } from '@supabase/postgrest-js/dist/cjs/types';\n\nimport { isPlainObject } from './lib/is-plain-object';\nimport { parseOrderBy } from './lib/parse-order-by';\nimport type { PostgrestPaginationResponse } from './lib/response-types';\n\nexport type PostgrestCursorPaginationFetcher<Type, Args> = (\n args: Args,\n) => Promise<Type>;\n\nexport type PostgrestCursorPaginationKeyDecoder<Args> = (args: Args) => {\n orderBy?: string;\n uqOrderBy?: string;\n};\n\nexport const createCursorPaginationFetcher = <\n Options extends PostgrestClientOptions,\n Schema extends GenericSchema,\n Row extends Record<string, unknown>,\n Result,\n Args,\n Relationships = unknown,\n>(\n queryFactory:\n | (() => PostgrestTransformBuilder<\n Options,\n Schema,\n Row,\n Result[],\n Relationships\n >)\n | null,\n config: {\n decode: PostgrestCursorPaginationKeyDecoder<Args>;\n orderBy: string;\n uqOrderBy?: string;\n rpcArgs?: { orderBy: string; uqOrderBy?: string };\n },\n): PostgrestCursorPaginationFetcher<\n PostgrestPaginationResponse<Result>,\n Args\n> | null => {\n if (!queryFactory) return null;\n return async (args) => {\n const cursor = config.decode(args);\n\n const query = queryFactory();\n\n if (config.rpcArgs) {\n if (query['method'] === 'GET') {\n if (cursor.orderBy) {\n query['url'].searchParams.set(config.rpcArgs.orderBy, cursor.orderBy);\n }\n if (config.rpcArgs.uqOrderBy && cursor.uqOrderBy) {\n query['url'].searchParams.set(\n config.rpcArgs.uqOrderBy,\n cursor.uqOrderBy,\n );\n }\n } else {\n query['body'] = {\n ...(isPlainObject(query['body']) ? query['body'] : {}),\n [config.rpcArgs.orderBy]: cursor.orderBy,\n ...(cursor.uqOrderBy && config.rpcArgs.uqOrderBy\n ? { [config.rpcArgs.uqOrderBy]: cursor.uqOrderBy }\n : {}),\n };\n }\n\n const { data } = await query.throwOnError();\n\n // cannot be null because of .throwOnError()\n return data as Result[];\n }\n\n const orderByDef = parseOrderBy(query['url'].searchParams);\n const orderBy = orderByDef.find((o) => o.column === config.orderBy);\n\n if (!orderBy) {\n throw new Error(`No ordering key found for path ${config.orderBy}`);\n }\n\n const uqOrderBy = config.uqOrderBy\n ? orderByDef.find((o) => o.column === config.uqOrderBy)\n : null;\n\n if (cursor.orderBy && config.uqOrderBy && cursor.uqOrderBy && uqOrderBy) {\n const operator = orderBy.ascending ? 'gt' : 'lt';\n const uqOperator = uqOrderBy.ascending ? 'gt' : 'lt';\n\n query['url'].searchParams.append(\n 'or',\n `(${config.orderBy}.${operator}.\"${cursor.orderBy}\",and(${config.orderBy}.eq.\"${cursor.orderBy}\",${config.uqOrderBy}.${uqOperator}.\"${cursor.uqOrderBy}\"))`,\n );\n } else if (cursor.orderBy) {\n const operator = orderBy.ascending ? 'gt' : 'lt';\n query['url'].searchParams.append(\n config.orderBy,\n `${operator}.${cursor.orderBy}`,\n );\n }\n\n const { data, error } = await query;\n\n if (error) throw error;\n\n // cannot be null because of .throwOnError()\n return data as Result[];\n };\n};\n","import type {\n PostgrestClientOptions,\n PostgrestQueryBuilder,\n} from '@supabase/postgrest-js';\nimport { UnstableGetResult as GetResult } from '@supabase/postgrest-js';\nimport {\n GenericSchema,\n GenericTable,\n} from '@supabase/postgrest-js/dist/cjs/types';\n\nimport {\n type MutationFetcherResponse,\n buildMutationFetcherResponse,\n} from './fetch/build-mutation-fetcher-response';\nimport {\n type BuildNormalizedQueryOps,\n buildNormalizedQuery,\n} from './fetch/build-normalized-query';\n\nexport type DeleteFetcher<T extends GenericTable, R> = (\n input: Partial<T['Row']>[],\n) => Promise<MutationFetcherResponse<R>[] | null>;\n\nexport type DeleteFetcherOptions<\n O extends PostgrestClientOptions,\n S extends GenericSchema,\n T extends GenericTable,\n Re = T extends { Relationships: infer R } ? R : unknown,\n> = Parameters<PostgrestQueryBuilder<O, S, T, Re>['delete']>[0];\n\nexport const buildDeleteFetcher =\n <\n O extends PostgrestClientOptions,\n S extends GenericSchema,\n T extends GenericTable,\n RelationName,\n Re = T extends { Relationships: infer R } ? R : unknown,\n Q extends string = '*',\n R = GetResult<S, T['Row'], RelationName, Re, Q extends '*' ? '*' : Q, O>,\n >(\n qb: PostgrestQueryBuilder<O, S, T, R>,\n primaryKeys: (keyof T['Row'])[],\n opts: BuildNormalizedQueryOps<Q> &\n DeleteFetcherOptions<O, S, T, RelationName>,\n ): DeleteFetcher<T, R> =>\n async (\n input: Partial<T['Row']>[],\n ): Promise<MutationFetcherResponse<R>[] | null> => {\n let filterBuilder = qb.delete(opts);\n\n if (primaryKeys.length === 1) {\n const primaryKey = primaryKeys[0] as string;\n filterBuilder.in(\n primaryKey,\n input.map((i) => {\n const v = i[primaryKey];\n if (!v) {\n throw new Error(\n `Missing value for primary key ${primaryKey as string}`,\n );\n }\n return v;\n // TODO i wont bother with this, but maybe i can nerdsnipe somone else into it\n }) as any[],\n );\n } else {\n filterBuilder = filterBuilder.or(\n input\n .map(\n (i) =>\n `and(${primaryKeys.map((c) => {\n const v = i[c];\n if (!v) {\n throw new Error(\n `Missing value for primary key ${c as string}`,\n );\n }\n return `${c as string}.eq.${v}`;\n })})`,\n )\n .join(','),\n );\n }\n\n const primaryKeysData = input.map((i) =>\n primaryKeys.reduce<R>((prev, key) => {\n return {\n ...prev,\n [key]: i[key],\n };\n }, {} as R),\n );\n\n const query = buildNormalizedQuery<Q>(opts);\n if (query) {\n const { selectQuery, groupedUserQueryPaths, groupedPaths } = query;\n // make sure that primary keys are included in the select query\n const groupedPathsWithPrimaryKeys = groupedPaths;\n const addKeys: string[] = [];\n primaryKeys.forEach((key) => {\n if (!groupedPathsWithPrimaryKeys.find((p) => p.path === key)) {\n groupedPathsWithPrimaryKeys.push({\n declaration: key as string,\n path: key as string,\n });\n addKeys.push(key as string);\n }\n });\n const { data } = await filterBuilder\n .select([selectQuery, ...addKeys].join(','))\n .throwOnError();\n return (data as R[]).map((d) =>\n buildMutationFetcherResponse(d, {\n groupedPaths: groupedPathsWithPrimaryKeys,\n groupedUserQueryPaths,\n }),\n );\n }\n\n await filterBuilder.throwOnError();\n\n if (opts.queriesForTable().length > 0) {\n // if there is at least one query on the table we are deleting from, return primary keys\n return primaryKeysData.map((pk) => ({ normalizedData: pk }));\n }\n\n return null;\n };\n","import type { PostgrestFilter } from '../postgrest-filter';\nimport type { PostgrestQueryParserOptions } from '../postgrest-query-parser';\nimport type { DecodedKey } from './types';\n\nexport type RevalidateRelationOpt<Type> = {\n schema?: string;\n relation: string;\n relationIdColumn: string;\n fKeyColumn: keyof Type;\n};\n\nexport type RevalidateRelations<Type extends Record<string, unknown>> =\n RevalidateRelationOpt<Type>[];\n\nexport type RevalidateRelationsProps<Type extends Record<string, unknown>> = {\n input: Partial<Type>;\n decodedKey: Pick<DecodedKey, 'schema' | 'table' | 'queryKey'>;\n getPostgrestFilter: (\n query: string,\n opts?: PostgrestQueryParserOptions,\n ) => Pick<PostgrestFilter<Type>, 'applyFilters'>;\n};\n\nexport const shouldRevalidateRelation = <Type extends Record<string, unknown>>(\n relations: RevalidateRelations<Type>,\n {\n input,\n getPostgrestFilter,\n decodedKey: { schema, table, queryKey },\n }: RevalidateRelationsProps<Type>,\n): boolean =>\n Boolean(\n relations.find(\n (r) =>\n (!r.schema || r.schema === schema) &&\n r.relation === table &&\n typeof input[r.fKeyColumn] !== 'undefined' &&\n getPostgrestFilter(queryKey, {\n exclusivePaths: [r.relationIdColumn],\n }).applyFilters({\n [r.relationIdColumn]: input[r.fKeyColumn],\n }),\n ),\n );\n","import type { DecodedKey } from './types';\n\nexport type RevalidateTableOpt = { schema?: string; table: string };\n\nexport type RevalidateTables = RevalidateTableOpt[];\n\nexport type RevalidateTablesProps = {\n decodedKey: Pick<DecodedKey, 'schema' | 'table'>;\n};\n\nexport const shouldRevalidateTable = (\n tables: RevalidateTables,\n { decodedKey: { schema, table } }: RevalidateTablesProps,\n): boolean =>\n Boolean(\n tables.find((t) => (!t.schema || t.schema === schema) && t.table === table),\n );\n","import type {\n PostgrestHasMorePaginationCacheData,\n PostgrestPaginationCacheData,\n} from '../lib/cache-data-types';\n\nexport const toHasMorePaginationCacheData = <\n Type extends Record<string, unknown>,\n>(\n a: Type[],\n currentData: PostgrestHasMorePaginationCacheData<Type>,\n chunkSize: number,\n) => {\n // return array in chunks\n const hasMoreCache = currentData.map((p) => p.hasMore);\n return a.reduce<PostgrestHasMorePaginationCacheData<Type>>(\n (resultArray, item, index) => {\n // default limit is 1000\n // ref: https://github.com/supabase/supabase/discussions/3765#discussioncomment-1581021\n const chunkIndex = Math.floor(index / chunkSize);\n\n if (!resultArray[chunkIndex]) {\n let hasMore = hasMoreCache[chunkIndex];\n if (!hasMore) {\n // if new page, set to hasMore of last page\n hasMore = hasMoreCache[hasMoreCache.length - 1];\n }\n if (chunkIndex > 0) {\n // if not first page, set prev has more to true\n resultArray[chunkIndex - 1].hasMore = true;\n }\n resultArray[chunkIndex] = {\n data: [],\n hasMore:\n hasMoreCache[chunkIndex] ??\n hasMoreCache[hasMoreCache.length - 1] ??\n false,\n }; // start a new chunk\n }\n\n resultArray[chunkIndex].data.push(item);\n\n return resultArray;\n },\n [],\n );\n};\n\nexport const toPaginationCacheData = <Type extends Record<string, unknown>>(\n a: Type[],\n chunkSize: number,\n) => {\n return a.reduce<PostgrestPaginationCacheData<Type>>(\n (resultArray, item, index) => {\n // default limit is 1000\n // ref: https://github.com/supabase/supabase/discussions/3765#discussioncomment-1581021\n const chunkIndex = Math.floor(index / chunkSize);\n\n if (!resultArray[chunkIndex]) {\n resultArray[chunkIndex] = []; // start a new chunk\n }\n\n resultArray[chunkIndex].push(item);\n\n return resultArray;\n },\n [],\n );\n};\n","import {\n isPostgrestHasMorePaginationCacheData,\n isPostgrestPaginationCacheData,\n} from './lib/cache-data-types';\nimport { isAnyPostgrestResponse } from './lib/response-types';\nimport { shouldRevalidateRelation } from './mutate/should-revalidate-relation';\nimport { shouldRevalidateTable } from './mutate/should-revalidate-table';\nimport {\n toHasMorePaginationCacheData,\n toPaginationCacheData,\n} from './mutate/transformers';\nimport type { DecodedKey, MutatorFn, RevalidateOpts } from './mutate/types';\nimport type { PostgrestFilter } from './postgrest-filter';\nimport type { PostgrestQueryParserOptions } from './postgrest-query-parser';\n\nconst filterByPks = <Type extends Record<string, unknown>>(\n input: Type,\n currentData: Type[],\n primaryKeys: (keyof Type)[],\n) => {\n return currentData.filter((i) =>\n primaryKeys.some((pk) => i[pk] !== input[pk]),\n );\n};\n\nexport type DeleteItemOperation<Type extends Record<string, unknown>> = {\n table: string;\n schema: string;\n input: Type;\n primaryKeys: (keyof Type)[];\n} & RevalidateOpts<Type>;\n\nexport type DeleteItemCache<KeyType, Type extends Record<string, unknown>> = {\n /**\n * The keys currently present in the cache\n */\n cacheKeys: KeyType[];\n /**\n * Should return a PostgrestFilter for the given query.\n * This is exposed as a function so results can be cached by the cache library.\n */\n getPostgrestFilter: (\n query: string,\n opts?: PostgrestQueryParserOptions,\n ) => Pick<PostgrestFilter<Type>, 'applyFilters' | 'denormalize'>;\n /**\n * Decode a key. Should return null if not a PostgREST key.\n */\n decode: (k: KeyType) => DecodedKey | null;\n /**\n * The mutation function from the cache library\n */\n mutate: (key: KeyType, fn: MutatorFn<Type>) => Promise<void> | void;\n /**\n * The revalidation function from the cache library\n */\n revalidate: (key: KeyType) => Promise<void> | void;\n};\n\nexport const deleteItem = async <KeyType, Type extends Record<string, unknown>>(\n op: DeleteItemOperation<Type>,\n cache: DeleteItemCache<KeyType, Type>,\n) => {\n const {\n revalidateRelations: revalidateRelationsOpt,\n revalidateTables: revalidateTablesOpt,\n schema,\n table,\n } = op;\n const { cacheKeys, decode, getPostgrestFilter, mutate, revalidate } = cache;\n\n const mutations = [];\n for (const k of cacheKeys) {\n const key = decode(k);\n\n // Exit early if not a postgrest key\n if (!key) continue;\n const filter = getPostgrestFilter(key.queryKey);\n // parse input into expected target format\n if (key.schema === schema && key.table === table) {\n if (key.isHead === true) {\n mutations.push(revalidate(k));\n } else {\n const transformedInput = filter.denormalize(op.input);\n if (\n // For delete, the input has to have a value for all primary keys\n op.primaryKeys.every(\n (pk) => typeof transformedInput[pk as string] !== 'undefined',\n )\n ) {\n const limit = key.limit ?? 1000;\n mutations.push(\n mutate(k, (currentData) => {\n // Return early if undefined or null\n if (!currentData) return currentData;\n\n if (isPostgrestHasMorePaginationCacheData<Type>(currentData)) {\n return toHasMorePaginationCacheData(\n filterByPks<Type>(\n transformedInput,\n currentData.flatMap((p) => p.data),\n op.primaryKeys,\n ),\n currentData,\n limit,\n );\n } else if (isPostgrestPaginationCacheData<Type>(currentData)) {\n return toPaginationCacheData(\n filterByPks<Type>(\n transformedInput,\n currentData.flat(),\n op.primaryKeys,\n ),\n limit,\n );\n } else if (isAnyPostgrestResponse<Type>(currentData)) {\n const { data } = currentData;\n if (!Array.isArray(data)) {\n if (\n data &&\n op.primaryKeys.some(\n (pk) => transformedInput[pk] !== data[pk],\n )\n ) {\n return currentData;\n } else {\n return { data: null };\n }\n }\n\n const newData = filterByPks(\n transformedInput,\n data,\n op.primaryKeys,\n );\n\n return {\n data: newData,\n count: newData.length,\n };\n }\n }),\n );\n }\n }\n }\n\n if (\n revalidateTablesOpt &&\n shouldRevalidateTable(revalidateTablesOpt, { decodedKey: key })\n ) {\n mutations.push(revalidate(k));\n }\n\n if (\n revalidateRelationsOpt &&\n shouldRevalidateRelation(revalidateRelationsOpt, {\n input: op.input,\n getPostgrestFilter,\n decodedKey: key,\n })\n ) {\n mutations.push(revalidate(k));\n }\n }\n\n await Promise.all(mutations);\n};\n","import { isPostgrestBuilder } from './lib/is-postgrest-builder';\nimport type { AnyPostgrestResponse } from './lib/response-types';\n\nexport const fetcher = async <Result>(\n q: PromiseLike<AnyPostgrestResponse<Result>>,\n) => {\n if (isPostgrestBuilder(q)) {\n q = q.throwOnError();\n }\n return await q;\n};\n","import type {\n PostgrestClientOptions,\n PostgrestQueryBuilder,\n} from '@supabase/postgrest-js';\nimport { UnstableGetResult as GetResult } from '@supabase/postgrest-js';\nimport {\n GenericSchema,\n GenericTable,\n} from '@supabase/postgrest-js/dist/cjs/types';\n\nimport {\n type MutationFetcherResponse,\n buildMutationFetcherResponse,\n} from './fetch/build-mutation-fetcher-response';\nimport {\n type BuildNormalizedQueryOps,\n buildNormalizedQuery,\n} from './fetch/build-normalized-query';\n\nexport type InsertFetcher<T extends GenericTable, R> = (\n input: T['Insert'][],\n) => Promise<MutationFetcherResponse<R>[] | null>;\n\nexport type InsertFetcherOptions<\n O extends PostgrestClientOptions,\n S extends GenericSchema,\n T extends GenericTable,\n Re = T extends { Relationships: infer R } ? R : unknown,\n> = Parameters<PostgrestQueryBuilder<O, S, T, Re>['insert']>[1];\n\nfunction buildInsertFetcher<\n O extends PostgrestClientOptions,\n S extends GenericSchema,\n T extends GenericTable,\n RelationName,\n Re = T extends { Relationships: infer R } ? R : unknown,\n Q extends string = '*',\n R = GetResult<S, T['Row'], RelationName, Re, Q extends '*' ? '*' : Q, O>,\n>(\n qb: PostgrestQueryBuilder<O, S, T, Re>,\n opts: BuildNormalizedQueryOps<Q> & InsertFetcherOptions<O, S, T, Re>,\n): InsertFetcher<T, R> {\n return async (\n input: T['Insert'][],\n ): Promise<MutationFetcherResponse<R>[] | null> => {\n const query = buildNormalizedQuery<Q>(opts);\n if (query) {\n const { selectQuery, groupedUserQueryPaths, groupedPaths } = query;\n const { data } = await qb\n .insert(input as any, opts)\n .select(selectQuery)\n .throwOnError();\n // data cannot be null because of throwOnError()\n return (data as R[]).map((d) =>\n buildMutationFetcherResponse(d, {\n groupedUserQueryPaths,\n groupedPaths,\n }),\n );\n }\n await qb.insert(input as any).throwOnError();\n return input.map((d) => ({ normalizedData: d as R }));\n };\n}\n\nexport { buildInsertFetcher };\n","/*\n * Binary search in JavaScript.\n * Returns the index of of the element in a sorted array or (-n-1) where n is the insertion point for the new element.\n * Parameters:\n * ar - A sorted array\n * el - An element to search for\n * compare - A comparator function. The function takes two arguments: (a, b) and returns:\n * a negative number if a is less than b;\n * 0 if a is equal to b;\n * a positive number of a is greater than b.\n * The array may contain duplicate elements. If there are more than one equal elements in the array,\n * the returned value can be the index of any one of the equal elements.\n */\nexport function binarySearch<Type>(\n arr: Type[],\n el: Type,\n compare: (a: Type, b: Type) => number,\n) {\n let m = 0;\n let n = arr.length - 1;\n while (m <= n) {\n const k = (n + m) >> 1;\n const cmp = compare(el, arr[k]);\n if (cmp > 0) {\n m = k + 1;\n } else if (cmp < 0) {\n n = k - 1;\n } else {\n return k;\n }\n }\n return m;\n}\n","export const ifDateGetTime = (v: unknown) => {\n if (v instanceof Date) return v.getTime();\n if (typeof v === 'string') {\n const t = new Date(v).getTime();\n if (!isNaN(t)) return t;\n }\n return v;\n};\n","import { get as defaultGet } from './get';\nimport { ifDateGetTime } from './if-date-get-time';\nimport type { OrderDefinition } from './query-types';\n\nexport const buildSortedComparator = <Type extends Record<string, unknown>>(\n orderBy: OrderDefinition[],\n) => {\n return (a: Type, b: Type) => {\n for (const { column, ascending, nullsFirst, foreignTable } of orderBy) {\n const aValue = ifDateGetTime(\n defaultGet(\n a,\n `${foreignTable ? `${foreignTable}.` : ''}${column}`,\n null,\n ),\n );\n\n const bValue = ifDateGetTime(\n defaultGet(\n b,\n `${foreignTable ? `${foreignTable}.` : ''}${column}`,\n null,\n ),\n );\n\n // go to next if value is equals\n if (aValue === bValue) continue;\n\n // nullsFirst / nullsLast\n if (aValue === null || aValue === undefined) {\n return nullsFirst ? -1 : 1;\n }\n\n if (bValue === null || bValue === undefined) {\n return nullsFirst ? 1 : -1;\n }\n\n // otherwise, if we're ascending, lowest sorts first\n if (ascending) {\n return aValue < bValue ? -1 : 1;\n }\n\n // if descending, highest sorts first\n return aValue < bValue ? 1 : -1;\n }\n\n return 0;\n };\n};\n","import { binarySearch } from './binary-search';\nimport type { OrderDefinition } from './query-types';\nimport { buildSortedComparator } from './sorted-comparator';\n\nexport const findIndexOrdered = <Type extends Record<string, unknown>>(\n input: Type,\n currentData: Type[],\n orderBy: OrderDefinition[],\n): number => binarySearch(currentData, input, buildSortedComparator(orderBy));\n","import {\n isPostgrestHasMorePaginationCacheData,\n isPostgrestPaginationCacheData,\n} from './lib/cache-data-types';\nimport { findIndexOrdered } from './lib/find-index-ordered';\nimport { parseOrderByKey } from './lib/parse-order-by-key';\nimport type { OrderDefinition } from './lib/query-types';\nimport { isAnyPostgrestResponse } from './lib/response-types';\nimport { shouldRevalidateRelation } from './mutate/should-revalidate-relation';\nimport { shouldRevalidateTable } from './mutate/should-revalidate-table';\nimport {\n toHasMorePaginationCacheData,\n toPaginationCacheData,\n} from './mutate/transformers';\nimport type { DecodedKey, MutatorFn, RevalidateOpts } from './mutate/types';\nimport type { PostgrestFilter } from './postgrest-filter';\nimport type { PostgrestQueryParserOptions } from './postgrest-query-parser';\n\nexport const mutateOperation = <Type extends Record<string, unknown>>(\n input: Partial<Type>,\n mutate: (current: Type) => Type,\n currentData: Type[],\n primaryKeys: (keyof Type)[],\n filter: Pick<PostgrestFilter<Type>, 'apply'>,\n orderBy?: OrderDefinition[],\n) => {\n // find item\n const itemIdx = currentData.findIndex((oldItem) =>\n primaryKeys.every((pk) => oldItem[pk] === input[pk]),\n );\n\n if (itemIdx === -1) {\n // if not exists, do nothing\n return currentData;\n }\n\n let newItemIdx = itemIdx;\n const newItem = mutate(currentData[newItemIdx]);\n\n // if exists, remove\n currentData.splice(itemIdx, 1);\n\n if (orderBy && Array.isArray(orderBy) && orderBy.length > 0) {\n // if ordered, find new idx\n newItemIdx = findIndexOrdered(newItem, currentData, orderBy);\n }\n\n if (newItemIdx === -1) {\n // default to prepend\n newItemIdx = 0;\n }\n\n // check that new item is still a valid member of the list and has all required paths\n if (filter.apply(newItem)) {\n currentData.splice(newItemIdx, 0, newItem);\n }\n\n return currentData;\n};\n\nexport type MutateItemOperation<Type extends Record<string, unknown>> = {\n table: string;\n schema: string;\n input: Partial<Type>;\n mutate: (current: Type) => Type;\n primaryKeys: (keyof Type)[];\n} & RevalidateOpts<Type>;\n\nexport type MutateItemCache<KeyType, Type extends Record<string, unknown>> = {\n /**\n * The keys currently present in the cache\n */\n cacheKeys: KeyType[];\n /**\n * Should return a PostgrestFilter for the given query.\n * This is exposed as a function so results can be cached by the cache library.\n */\n getPostgrestFilter: (\n query: string,\n opts?: PostgrestQueryParserOptions,\n ) => Pick<\n PostgrestFilter<Type>,\n | 'applyFilters'\n | 'denormalize'\n | 'hasFiltersOnPaths'\n | 'applyFiltersOnPaths'\n | 'apply'\n | 'hasWildcardPath'\n | 'hasAggregatePath'\n >;\n /**\n * Decode a key. Should return null if not a PostgREST key.\n */\n decode: (k: KeyType) => DecodedKey | null;\n /**\n * The mutation function from the cache library\n */\n mutate: (key: KeyType, fn: MutatorFn<Type>) => Promise<void> | void;\n /**\n * The revalidation function from the cache library\n */\n revalidate: (key: KeyType) => Promise<void> | void;\n};\n\nexport const mutateItem = async <KeyType, Type extends Record<string, unknown>>(\n op: MutateItemOperation<Type>,\n cache: MutateItemCache<KeyType, Type>,\n) => {\n const {\n mutate: mutateInput,\n revalidateRelations: revalidateRelationsOpt,\n revalidateTables: revalidateTablesOpt,\n schema,\n table,\n primaryKeys,\n } = op;\n const { cacheKeys, decode, getPostgrestFilter, mutate, revalidate } = cache;\n\n const mutations = [];\n for (const k of cacheKeys) {\n const key = decode(k);\n\n // Exit early if not a postgrest key\n if (!key) continue;\n const filter = getPostgrestFilter(key.queryKey);\n if (key.schema === schema && key.table === table) {\n // parse input into expected target format\n const transformedInput = filter.denormalize(op.input);\n if (\n // For mutate, the input has to have a value for all primary keys\n op.primaryKeys.every(\n (pk) => typeof transformedInput[pk as string] !== 'undefined',\n ) && // allow mutate if either the filter does not apply eq filters on any pk\n (!filter.hasFiltersOnPaths(op.primaryKeys as string[]) ||\n // or input matches all pk filters\n filter.applyFiltersOnPaths(\n transformedInput,\n op.primaryKeys as string[],\n ))\n ) {\n const limit = key.limit ?? 1000;\n const orderBy = key.orderByKey\n ? parseOrderByKey(key.orderByKey)\n : undefined;\n if (\n key.isHead === true ||\n filter.hasWildcardPath ||\n filter.hasAggregatePath\n ) {\n // we cannot know whether the new item after mutating still has all paths required for a query if it contains a wildcard,\n // because we do not know what columns a table has. we must always revalidate then.\n mutations.push(revalidate(k));\n } else {\n mutations.push(\n mutate(k, (currentData) => {\n // Return early if undefined or null\n if (!currentData) return currentData;\n\n if (isPostgrestHasMorePaginationCacheData<Type>(currentData)) {\n return toHasMorePaginationCacheData(\n mutateOperation<Type>(\n transformedInput,\n mutateInput,\n currentData.flatMap((p) => p.data),\n primaryKeys,\n filter,\n orderBy,\n ),\n currentData,\n limit,\n );\n } else if (isPostgrestPaginationCacheData<Type>(currentData)) {\n return toPaginationCacheData(\n mutateOperation<Type>(\n transformedInput,\n mutateInput,\n currentData.flat(),\n primaryKeys,\n filter,\n orderBy,\n ),\n limit,\n );\n } else if (isAnyPostgrestResponse<Type>(currentData)) {\n const { data } = currentData;\n\n if (!Array.isArray(data)) {\n if (data === null) {\n return {\n data,\n count: currentData.count,\n };\n }\n const newData = mutateInput(data);\n return {\n // Check if the new data is still valid given the key\n data: filter.apply(newData) ? newData : null,\n count: currentData.count,\n };\n }\n\n const newData = mutateOperation<Type>(\n transformedInput,\n mutateInput,\n // deep copy data to avoid mutating the original\n JSON.parse(JSON.stringify(data)),\n primaryKeys,\n filter,\n orderBy,\n );\n\n return {\n data: newData,\n count: newData.length,\n };\n }\n return currentData;\n }),\n );\n }\n }\n }\n\n if (\n revalidateTablesOpt &&\n shouldRevalidateTable(revalidateTablesOpt, { decodedKey: key })\n ) {\n mutations.push(revalidate(k));\n }\n\n if (\n revalidateRelationsOpt &&\n shouldRevalidateRelation(revalidateRelationsOpt, {\n input: op.input,\n getPostgrestFilter,\n decodedKey: key,\n })\n ) {\n mutations.push(revalidate(k));\n }\n }\n await Promise.all(mutations);\n};\n","import type {\n PostgrestClientOptions,\n PostgrestTransformBuilder,\n} from '@supabase/postgrest-js';\nimport { GenericSchema } from '@supabase/postgrest-js/dist/cjs/types';\n\nimport { isPlainObject } from './lib/is-plain-object';\nimport type {\n PostgrestHasMorePaginationResponse,\n PostgrestPaginationResponse,\n} from './lib/response-types';\n\nexport type PostgrestOffsetPaginationFetcher<Type, Args> = (\n args: Args,\n) => Promise<Type>;\n\nexport type PostgrestOffsetPaginationKeyDecoder<Args> = (args: Args) => {\n limit?: number;\n offset?: number;\n};\n\nexport const createOffsetPaginationFetcher = <\n Options extends PostgrestClientOptions,\n Schema extends GenericSchema,\n Row extends Record<string, unknown>,\n Result,\n Args,\n RelationName = unknown,\n Relationships = unknown,\n>(\n queryFactory:\n | (() => PostgrestTransformBuilder<\n Options,\n Schema,\n Row,\n Result[],\n Relationships\n >)\n | null,\n {\n decode,\n pageSize,\n rpcArgs,\n }: {\n decode: PostgrestOffsetPaginationKeyDecoder<Args>;\n pageSize: number;\n rpcArgs?: { limit: string; offset: string };\n },\n): PostgrestOffsetPaginationFetcher<\n PostgrestPaginationResponse<Result>,\n Args\n> | null => {\n if (!queryFactory) return null;\n\n return async (args) => {\n const decodedKey = decode(args);\n const limit = decodedKey.limit ? decodedKey.limit : pageSize;\n const offset = decodedKey.offset ?? 0;\n\n const query = queryFactory();\n\n return rpcArgs\n ? await rpcOffsetPaginationFetcher<\n Options,\n Schema,\n Row,\n Result,\n RelationName,\n Relationships\n >(query, { limit, offset, rpcArgs })\n : await offsetPaginationFetcher<\n Options,\n Schema,\n Row,\n Result,\n RelationName,\n Relationships\n >(query, { limit, offset });\n };\n};\n\nexport const offsetPaginationFetcher = async <\n Options extends PostgrestClientOptions,\n Schema extends GenericSchema,\n Row extends Record<string, unknown>,\n Result,\n RelationName = unknown,\n Relationships = unknown,\n>(\n query: PostgrestTransformBuilder<\n Options,\n Schema,\n Row,\n Result[],\n RelationName,\n Relationships\n >,\n { limit, offset }: { limit: number; offset: number },\n) => {\n const { data } = await query.range(offset, offset + limit - 1).throwOnError();\n // cannot be null because of .throwOnError()\n return data as Result[];\n};\n\nexport const rpcOffsetPaginationFetcher = async <\n Options extends PostgrestClientOptions,\n Schema extends GenericSchema,\n Row extends Record<string, unknown>,\n Result,\n RelationName = unknown,\n Relationships = unknown,\n>(\n query: PostgrestTransformBuilder<\n Options,\n Schema,\n Row,\n Result[],\n RelationName,\n Relationships\n >,\n {\n limit,\n offset,\n rpcArgs,\n }: {\n limit: number;\n offset: number;\n rpcArgs: { limit: string; offset: string };\n },\n) => {\n if (query['method'] === 'GET') {\n query['url'].searchParams.set(rpcArgs.limit, String(limit));\n query['url'].searchParams.set(rpcArgs.offset, String(offset));\n } else {\n query['body'] = {\n ...(isPlainObject(query['body']) ? query['body'] : {}),\n [rpcArgs.limit]: limit,\n [rpcArgs.offset]: offset,\n };\n }\n\n const { data } = await query.throwOnError();\n\n // cannot be null because of .throwOnError()\n return data as Result[];\n};\n\nexport const createOffsetPaginationHasMoreFetcher = <\n Options extends PostgrestClientOptions,\n Schema extends GenericSchema,\n Row extends Record<string, unknown>,\n Result,\n Args,\n RelationName = unknown,\n Relationships = unknown,\n>(\n queryFactory:\n | (() => PostgrestTransformBuilder<\n Options,\n Schema,\n Row,\n Result[],\n RelationName,\n Relationships\n >)\n | null,\n {\n decode,\n pageSize,\n rpcArgs,\n }: {\n decode: PostgrestOffsetPaginationKeyDecoder<Args>;\n pageSize: number;\n rpcArgs?: { limit: string; offset: string };\n },\n): PostgrestOffsetPaginationFetcher<\n PostgrestHasMorePaginationResponse<Result>,\n Args\n> | null => {\n if (!queryFactory) return null;\n return async (args) => {\n const decodedKey = decode(args);\n const limit = decodedKey.limit ? decodedKey.limit : pageSize;\n const offset = decodedKey.offset ?? 0;\n const query = queryFactory();\n return rpcArgs\n ? await rpcOffsetPaginationHasMoreFetcher<\n Options,\n Schema,\n Row,\n Result,\n RelationName,\n Relationships\n >(query, {\n limit,\n offset,\n pageSize,\n rpcArgs,\n })\n : await offsetPaginationHasMoreFetcher<\n Options,\n Schema,\n Row,\n Result,\n RelationName,\n Relationships\n >(query, {\n limit,\n offset,\n pageSize,\n });\n };\n};\n\nexport const offsetPaginationHasMoreFetcher = async <\n Options extends PostgrestClientOptions,\n Schema extends GenericSchema,\n Row extends Record<string, unknown>,\n Result,\n RelationName = unknown,\n Relationships = unknown,\n>(\n query: PostgrestTransformBuilder<\n Options,\n Schema,\n Row,\n Result[],\n RelationName,\n Relationships\n >,\n {\n limit,\n offset,\n pageSize,\n }: { limit: number; offset: number; pageSize: number },\n) => {\n const { data } = await query.range(offset, offset + limit).throwOnError();\n\n let hasMore = false;\n if (data && data.length === pageSize + 1) {\n hasMore = true;\n data.pop();\n }\n return {\n // cannot be null because of .throwOnError()\n data: data as Result[],\n hasMore,\n };\n};\n\nexport const rpcOffsetPaginationHasMoreFetcher = async <\n Options extends PostgrestClientOptions,\n Schema extends GenericSchema,\n Row extends Record<string, unknown>,\n Result,\n RelationName = unknown,\n Relationships = unknown,\n>(\n query: PostgrestTransformBuilder<\n Options,\n Schema,\n Row,\n Result[],\n RelationName,\n Relationships\n >,\n {\n limit,\n offset,\n pageSize,\n rpcArgs,\n }: {\n limit: number;\n offset: number;\n pageSize: number;\n rpcArgs: { limit: string; offset: string };\n },\n) => {\n if (query['method'] === 'GET') {\n query['url'].searchParams.set(rpcArgs.limit, String(limit + 1));\n query['url'].searchParams.set(rpcArgs.offset, String(offset));\n } else {\n query['body'] = {\n ...(isPlainObject(query['body']) ? query['body'] : {}),\n [rpcArgs.limit]: limit + 1,\n [rpcArgs.offset]: offset,\n };\n }\n\n const { data } = await query.throwOnError();\n\n let hasMore = false;\n if (data && data.length === pageSize + 1) {\n hasMore = true;\n data.pop();\n }\n return {\n // cannot be null because of .throwOnError()\n data: data as Result[],\n hasMore,\n };\n};\n","import { unflatten } from 'flat';\n\nimport {\n groupPathsRecursive,\n isNestedPath,\n} from '../lib/group-paths-recursive';\nimport type { Path } from '../lib/query-types';\n\n/**\n * Denormalize a normalized response object using the paths of the target query\n **/\nexport const denormalize = <R extends Record<string, unknown>>(\n // the paths into which we need to transform\n paths: Path[],\n // the normalized response data\n obj: R,\n): R => {\n const groups = groupPathsRecursive(paths);\n\n if (groups.some((g) => g.path === '*')) {\n // if a wildcard path is present, we expand the groups with all values from the object that are not part of a nested path from `paths`.\n // This will include also unwanted values, e.g. from a join on another relation because its impossible for us to distinguish between json columns and joins.\n Object.keys(obj).forEach((k) => {\n const keyParts = k.split('.');\n if (\n keyParts.length > 1 &&\n groups.some((g) => isNestedPath(g) && g.path === keyParts[0])\n ) {\n // skip if key is actually part of a nested path from the groups\n return;\n }\n if (groups.some((g) => g.path === keyParts[0])) {\n // skip if key is already part of the groups\n return;\n }\n\n groups.push({\n declaration: keyParts[0],\n path: keyParts[0],\n });\n });\n }\n\n return groups.reduce<R>((prev, curr) => {\n // skip the wildcard since we already handled it above\n if (curr.path === '*') return prev;\n let value = obj[curr.path];\n\n if (!isNestedPath(curr)) {\n if (typeof value === 'undefined') {\n // if simple array, e.g. ['a', 'b', 'c'], unflatten\n const array = Object.entries(obj).reduce<any[]>((prev, [k, v]) => {\n // test if key is curr_path.0, curr_path.1 etc.\n if (new RegExp(`^${curr.path}.\\\\d+$`).test(k)) {\n prev.push(v);\n }\n return prev;\n }, []);\n if (array.length > 0) {\n value = array;\n }\n }\n if (typeof value === 'undefined') {\n // if json(b) column, unflatten\n let isArray = false;\n const jsonValue = Object.entries(obj).reduce<Record<string, unknown>>(\n (prev, [k, v]) => {\n if (k.startsWith(`${curr.path}.`)) {\n const key = k.slice(curr.path.length + 1);\n const maybeIdx = key.match(/^\\b\\d+\\b/);\n if (maybeIdx && isFlatNestedArray(prev)) {\n isArray = true;\n prev = {\n ...prev,\n [maybeIdx[0]]: {\n ...(prev[maybeIdx[0]] ? prev[maybeIdx[0]] : {}),\n [key.slice(maybeIdx[0].length + 1)]: v,\n },\n };\n } else {\n prev[maybeIdx ? maybeIdx[0] : key] = v;\n }\n }\n return prev;\n },\n {},\n );\n if (Object.keys(jsonValue).length > 0) {\n if (isArray) {\n value = Object.values(jsonValue).map((v) => unflatten(v));\n } else {\n value = unflatten(jsonValue);\n }\n }\n }\n if (typeof value === 'undefined') {\n return prev;\n }\n return {\n ...prev,\n [curr.alias || curr.path]: value,\n };\n }\n\n // if value is null or an empty array, the relation is not set and we can return the \"empty\" value\n if (value === null || (Array.isArray(value) && value.length === 0)) {\n return {\n ...prev,\n [curr.alias || curr.path]: value,\n };\n }\n\n let isArray = false;\n const flatNestedObjectOrArray = Object.entries(obj).reduce<\n Record<string, Record<string, unknown>> | Record<string, unknown>\n >((prev, [k, v]) => {\n const isNested =\n k.startsWith(`${curr.path}.`) ||\n (k.includes('!') &&\n k.startsWith(`${removeFirstAlias(curr.declaration)}.`));\n\n if (!isNested) return prev;\n // either set to key, or to idx.key\n // is either path.key or path!hint.key\n const flatKey = k.slice(\n (k.includes('!') ? removeFirstAlias(curr.declaration) : curr.path)\n .length + 1,\n );\n const maybeIdx = flatKey.match(/^\\b\\d+\\b/);\n if (maybeIdx && isFlatNestedArray(prev)) {\n isArray = true;\n const key = flatKey.slice(maybeIdx[0].length + 1);\n return {\n ...prev,\n [maybeIdx[0]]: {\n ...(prev[maybeIdx[0]] ? prev[maybeIdx[0]] : {}),\n [key]: v,\n },\n };\n }\n return {\n ...prev,\n [flatKey]: v,\n };\n }, {});\n\n if (Object.keys(flatNestedObjectOrArray).length === 0) return prev;\n if (isArray && isFlatNestedArray(flatNestedObjectOrArray)) {\n return {\n ...prev,\n [curr.alias || curr.path]: Object.values(flatNestedObjectOrArray).map(\n (v) => denormalize(curr.paths, v),\n ),\n };\n }\n return {\n ...prev,\n [curr.alias || curr.path]: denormalize(\n curr.paths,\n flatNestedObjectOrArray,\n ),\n };\n }, {} as R);\n};\n\n// just to make ts happy\nconst isFlatNestedArray = (\n obj: Record<string, Record<string, unknown>> | Record<string, unknown>,\n): obj is Record<string, Record<string, unknown>> => true;\n\nconst removeFirstAlias = (key: string): string => {\n const split = key.split(':');\n if (split.length === 1) return key;\n split.shift();\n return split.join(':');\n};\n","import {\n type FilterDefinitions,\n isAndFilter,\n isFilterDefinition,\n isOrFilter,\n} from './query-types';\n\nexport const filterFilterDefinitionsByPaths = (\n f: FilterDefinitions,\n paths: string[],\n) => {\n return f.reduce<FilterDefinitions>((prev, filter) => {\n if (isAndFilter(filter)) {\n const filters = filterFilterDefinitionsByPaths(filter.and, paths);\n if (filters.length > 0) {\n prev.push({ and: filters });\n }\n } else if (isOrFilter(filter)) {\n const filters = filterFilterDefinitionsByPaths(filter.or, paths);\n if (filters.length > 0) {\n prev.push({ or: filters });\n }\n } else if (isFilterDefinition(filter) && paths.includes(filter.path)) {\n prev.push(filter);\n }\n return prev;\n }, []);\n};\n","export const isObject = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && !Array.isArray(v) && v !== null;\n","export type MaybeLikePostgrestBuilder<Result> = unknown;\n\nexport type LikePostgrestBuilder<Result> = {\n url: URL;\n method: 'GET' | 'HEAD' | 'POST' | 'PATCH' | 'DELETE';\n headers: Headers;\n schema?: string;\n body?: unknown;\n};\n\nexport const isLikePostgrestBuilder = <Result>(\n v: MaybeLikePostgrestBuilder<Result>,\n): v is LikePostgrestBuilder<Result> => {\n if (typeof v !== 'object' || v === null) return false;\n const obj = v as LikePostgrestBuilder<Result>;\n\n return (\n typeof obj['url'] === 'object' &&\n typeof obj['headers'] === 'object' &&\n typeof obj['method'] === 'string'\n );\n};\n","import { deepEqual } from 'fast-equals';\n\nimport type { FilterOperator, OperatorFn } from './query-types';\n\n/**\n * Builds a regex for a (i)like postgres operator by replacing the \"%\" with a regex wildcard \".*\"\n * @param search The search value\n * @returns A RegExp representing the (i)like operation\n */\nconst buildLikeRegex = (search: string) =>\n new RegExp(`^${search.replace(/%/g, '.*')}$`);\n\n/**\n * A poor humans attempt to implement postgres text search in javascript.\n * Converts the search string into a regex before testing it against all tokens.\n */\nconst textSearch: OperatorFn = (c, v) => {\n const regExp = `^${v\n .split('&')\n .map((v: string) => v.trim().toLowerCase())\n .join('|')\n .replace(/:\\*/g, '.*')}$`;\n const tokens = c\n .match(/'(.*?)'/g)\n .map((t: string) => t.replace(/'/g, '').toLowerCase());\n return tokens.some((t: string) => new RegExp(regExp).test(t));\n};\n\n/**\n * Date instances do not work with equality operators, which is why their times are compared instead.\n *\n * ref: https://stackoverflow.com/questions/492994/compare-two-dates-with-javascript\n * @param v The input value\n * @returns If the input value is an instanceof Date, return v.getTime(), else the input value\n */\nconst ifDateGetTime = (v: any) => (v instanceof Date ? v.getTime() : v);\n\nconst enclose = (v: string, char: string) => {\n if (!v.startsWith(char)) v = `${char}${v}`;\n if (!v.endsWith(char)) v = `${v}${char}`;\n return v;\n};\n\n/**\n * An object containing all FilterOperator implementations\n */\nexport const OPERATOR_MAP: { [Key in FilterOperator]?: OperatorFn } = {\n eq: (c, v) => ifDateGetTime(c) === ifDateGetTime(v),\n neq: (c, v) => ifDateGetTime(c) !== ifDateGetTime(v),\n gt: (c, v) => c > v,\n gte: (c, v) => c >= v,\n lt: (c, v) => c < v,\n lte: (c, v) => c <= v,\n like: (c, v) => buildLikeRegex(v).test(c.toString()),\n ilike: (c, v) =>\n buildLikeRegex(v.toLowerCase()).test(c.toString().toLowerCase()),\n is: (c, v) => c === v,\n in: (c, v) => {\n const parsedValue = v.slice(1, -1).split(',');\n return parsedValue.some((i: string) => i === c);\n },\n // contains\n cs: (c, v) => {\n if (!Array.isArray(c)) return false;\n if (!Array.isArray(v)) v = v.slice(1, -1).split(',');\n return v.every((i: string) => c.some((colVal) => deepEqual(colVal, i)));\n },\n // containedBy\n cd: (c, v) => {\n if (!Array.isArray(c)) return false;\n if (!Array.isArray(v)) v = v.slice(1, -1).split(',');\n return c.every((i: string) =>\n v.some((cmpVal: any) => deepEqual(cmpVal, i)),\n );\n },\n fts: textSearch,\n plfts: (c, v) =>\n buildLikeRegex(enclose(v.toLowerCase(), '%')).test(\n c.toString().toLowerCase(),\n ),\n};\n","/**\n * Returns the index of the last element in the array where predicate is true, and -1\n * otherwise.\n * @param array The source array to search in\n * @param predicate find calls predicate once for each element of the array, in descending\n * order, until it finds one where predicate returns true. If such an element is found,\n * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.\n */\nexport function findLastIndex<T>(\n array: T[],\n predicate: (value: T, index: number, obj: T[]) => boolean,\n): number {\n let l = array.length;\n while (l--) {\n if (predicate(array[l], l, array)) return l;\n }\n return -1;\n}\n","/**\n *\n * @param i Ahhh gotta love typescript\n * @returns\n */\nexport const isNotNull = <I>(i: I | null): i is I => i !== null;\n","import { findLastIndex } from './lib/find-last-index';\nimport { isNotNull } from './lib/is-not-null';\nimport { OPERATOR_MAP } from './lib/operators';\nimport { parseSelectParam } from './lib/parse-select-param';\nimport { parseValue } from './lib/parse-value';\nimport type {\n FilterDefinition,\n FilterDefinitions,\n FilterOperator,\n Path,\n} from './lib/query-types';\n\nexport const SUPPORTED_OPERATORS = ['or', ...Object.keys(OPERATOR_MAP)];\n\nexport type PostgrestQueryParserOptions = {\n /**\n * If defined, will use only filters that apply to the given paths\n */\n exclusivePaths?: string[];\n};\n\nexport class PostgrestQueryParser {\n private readonly _params: URLSearchParams;\n\n private _filters: FilterDefinitions | undefined;\n private _paths: Path[] | undefined;\n\n constructor(\n query: string,\n public readonly opts?: PostgrestQueryParserOptions,\n ) {\n this._params = new URLSearchParams(query);\n }\n\n /**\n * Getter that returns the paths and their aliases that the query selects. Will do the computation only once.\n *\n * ```js\n * const p = new PostgrestParser(\n * supabaseClient.from(\"test\")\n * .select(\n * `name,\n * city:cities (\n * test:name\n * ),\n * countries (\n * capital,\n * population,\n * some_ref (\n * test:first,\n * second\n * )\n * )`\n * );\n * console.log(p.paths);\n * // [\n * // { alias: undefined, path: \"name\" },\n * // { alias: \"city.test\", path: \"cities.name\" },\n * // { alias: undefined, path: \"countries.capital\" },\n * // { alias: undefined, path: \"countries.population\" },\n * // {\n * // alias: \"countries.some_ref.test\",\n * // path: \"countries.some_ref.first\",\n * // },\n * // { alias: undefined, path: \"countries.some_ref.second\" },\n * // ];\n * ```\n *\n * @returns an array of paths that the query selects, containing the columns and aliases\n */\n get paths(): Path[] {\n if (!this._paths) {\n const select = this._params.get('select');\n this._paths = select ? parseSelectParam(select) : [];\n }\n return this._paths;\n }\n\n /**\n * Getter that returns the filters that this query applies in a json object.\n *\n * ```js\n * const p = new PostgrestParser(\n * supabaseClient.from(\"test\").select('*')\n * .or(\"full_name.eq.20,test.neq.true,and(full_name.eq.Test Name,email.eq.test@mail.com)\")\n * .eq(\"id\", \"123\")\n * .contains(\"id\", \"456\")\n * );\n *\n * console.log(p.filters);\n *\n * // [\n * // {\n * // or: [\n * // {\n * // path: \"full_name\",\n * // negate: false,\n * // operator: \"eq\",\n * // value: 20,\n * // },\n * // {\n * // path: \"test\",\n * // negate: false,\n * // operator: \"neq\",\n * // value: true,\n * // },\n * // {\n * // and: [\n * // {\n * // path: \"full_name\",\n * // negate: false,\n * // operator: \"eq\",\n * // value: \"Test Name\",\n * // },\n * // {\n * // path: \"email\",\n * // negate: false,\n * // operator: \"eq\",\n * // value: \"test@mail.com\",\n * // },\n * // ],\n * // },\n * // ],\n * // },\n * // {\n * // path: \"id\",\n * // negate: false,\n * // operator: \"eq\",\n * // value: 123,\n * // },\n * // {\n * // path: \"id\",\n * // negate: false,\n * // operator: \"cs\",\n * // value: 456,\n * // },\n * // ];\n * ```\n *\n * @returns a FilterDefinitions object\n */\n get filters(): FilterDefinitions {\n if (!this._filters) {\n const filters: FilterDefinitions = [];\n this._params.forEach((value, key) => {\n if (\n SUPPORTED_OPERATORS.some(\n (f) => key === f || value.split('.').includes(f),\n )\n ) {\n const filter = this.parseFilterString(`${key}.${value}`, undefined);\n if (filter !== null) filters.push(filter);\n }\n });\n this._filters = filters;\n }\n return this._filters;\n }\n\n private parseFilterString(\n filter: string,\n prefix?: string,\n ):\n | FilterDefinition\n | { or: FilterDefinitions }\n | { and: FilterDefinitions }\n | null {\n if (filter.startsWith('and(') && filter.endsWith(')')) {\n // nested and\n const andFilters = filter\n .slice(4, -1)\n .split(',')\n .map((s) => this.parseFilterString(s, prefix))\n .filter(isNotNull);\n if (andFilters.length === 0) return null;\n else return { and: andFilters };\n }\n\n const split = filter.split('.');\n\n // or\n if ([split[0], split[1]].includes('or')) {\n let foreignTable: string | undefined;\n if (split[1] === 'or') {\n // with foreign table\n foreignTable = split[0];\n }\n\n const orFilters = filter\n .slice(4 + (foreignTable ? foreignTable.length + 1 : 0), -1)\n .split(',')\n .reduce<string[]>((prev, curr, idx, filters) => {\n if (curr.startsWith('and(')) {\n // nested and\n prev = [...prev, [curr, filters[idx + 1]].join()];\n } else if (!curr.endsWith(')')) {\n prev = [...prev, curr];\n }\n return prev;\n }, [])\n .map((s) => this.parseFilterString(s, foreignTable))\n .filter(isNotNull);\n if (orFilters.length === 0) return null;\n else return { or: orFilters };\n }\n\n const operatorIdx = findLastIndex(split, (s) =>\n SUPPORTED_OPERATORS.includes(s),\n );\n if (operatorIdx === -1)\n throw new Error(\n `Could not find a valid operator in ${split.join('.')}. Supported are ${SUPPORTED_OPERATORS.join(',')}.`,\n );\n const negate = split[operatorIdx - 1] === 'not';\n\n const pathOrAlias = [\n prefix,\n ...split.slice(0, negate ? operatorIdx - 1 : operatorIdx),\n ]\n .filter(Boolean)\n .join('.')\n .replace(/\\s/g, '');\n\n let path = pathOrAlias;\n let alias;\n // filter paths can use either the real path or the alias\n // search for alias and path in paths of query\n // if none is found, its a path because the alias would need to be defined\n // in the query\n for (const p of this.paths) {\n if (p.path === pathOrAlias) {\n alias = p.alias;\n break;\n }\n if (p.alias === pathOrAlias) {\n path = p.path;\n alias = p.alias;\n break;\n }\n }\n\n if (\n this.opts &&\n Array.isArray(this.opts.exclusivePaths) &&\n !this.opts.exclusivePaths.includes(path)\n ) {\n return null;\n }\n\n const operator = split[operatorIdx] as FilterOperator;\n const value = split.slice(operatorIdx + 1).join('.');\n return {\n path,\n alias,\n negate,\n operator,\n value: parseValue(value),\n };\n }\n}\n","import { denormalize } from './filter/denormalize';\nimport { extractPathsFromFilters } from './lib/extract-paths-from-filter';\nimport { filterFilterDefinitionsByPaths } from './lib/filter-filter-definitions-by-paths';\nimport { get } from './lib/get';\nimport { isObject } from './lib/is-object';\nimport {\n MaybeLikePostgrestBuilder,\n isLikePostgrestBuilder,\n} from './lib/like-postgrest-builder';\nimport { OPERATOR_MAP } from './lib/operators';\nimport { parseValue } from './lib/parse-value';\nimport type {\n FilterDefinition,\n FilterDefinitions,\n FilterFn,\n OperatorFn,\n Path,\n ValueType,\n} from './lib/query-types';\nimport {\n PostgrestQueryParser,\n type PostgrestQueryParserOptions,\n} from './postgrest-query-parser';\n\nexport class PostgrestFilter<Result extends Record<string, unknown>> {\n private _fn: FilterFn<Result> | undefined;\n private _selectFn: FilterFn<Result> | undefined;\n private _filtersFn: FilterFn<Result> | undefined;\n private _filterPaths: Path[];\n public hasWildcardPath: boolean | undefined;\n public hasAggregatePath: boolean | undefined;\n\n constructor(\n public readonly params: { filters: FilterDefinitions; paths: Path[] },\n ) {\n this._filterPaths = extractPathsFromFilters(\n this.params.filters,\n this.params.paths,\n );\n this.hasWildcardPath = this.params.paths.some((p) =>\n p.declaration.endsWith('*'),\n );\n this.hasAggregatePath = this.params.paths.some((p) => Boolean(p.aggregate));\n }\n\n public static fromQuery(query: string, opts?: PostgrestQueryParserOptions) {\n const parser = new PostgrestQueryParser(query, opts);\n return new PostgrestFilter({\n filters: parser.filters,\n paths: parser.paths,\n });\n }\n\n public static fromBuilder<\n Result extends Record<string, unknown> = Record<string, unknown>,\n >(\n fb: MaybeLikePostgrestBuilder<Result>,\n opts?: PostgrestQueryParserOptions,\n ): PostgrestFilter<Result> {\n if (!isLikePostgrestBuilder(fb)) {\n throw new Error('Invalid PostgrestBuilder');\n }\n\n const parser = new PostgrestQueryParser(\n fb['url'].searchParams.toString(),\n opts,\n );\n return new PostgrestFilter<Result>({\n filters: parser.filters,\n paths: parser.paths,\n });\n }\n\n denormalize<Type extends Record<string, unknown>>(obj: Type): Type {\n return denormalize([...this.params.paths, ...this._filterPaths], obj);\n }\n\n apply(obj: unknown): obj is Result {\n if (!this._fn) {\n this._fn = (obj): obj is Result =>\n this.applyFilters(obj) && this.hasPaths(obj);\n }\n return this._fn(obj);\n }\n\n applyFilters(obj: unknown): obj is Result {\n if (!this._filtersFn) {\n const filterFns = this.params.filters.map((d) => this.buildFilterFn(d));\n this._filtersFn = (obj): obj is Result =>\n filterFns.every((fn) => isObject(obj) && fn(obj));\n }\n return this._filtersFn(obj);\n }\n\n hasFiltersOnPaths(paths: string[]): boolean {\n return (\n filterFilterDefinitionsByPaths(this.params.filters, paths).length > 0\n );\n }\n\n applyFiltersOnPaths(obj: unknown, paths: string[]): obj is Result {\n const filterFns = filterFilterDefinitionsByPaths(\n this.params.filters,\n paths,\n ).map((d) => this.buildFilterFn(d));\n const filtersFn = (obj: unknown): obj is Result =>\n filterFns.every((fn) => isObject(obj) && fn(obj));\n return filtersFn(obj);\n }\n\n hasPaths(obj: unknown): obj is Result {\n if (!this._selectFn) {\n this._selectFn = (obj): obj is Result =>\n this.params.paths.every((p) =>\n this.hasPathRecursive(obj, p.alias ?? p.path),\n );\n }\n return this._selectFn(obj);\n }\n\n private hasPathRecursive(obj: unknown, path: string): boolean {\n // obj is valid if v is null, because the foreign key relation can be null\n if (obj === null) return true;\n\n // normalise json operators \"->\" and \"->>\" to \".\"\n const pathElements = path.replace(/->>|->/g, '.').split('.');\n\n // we are at the deepest level\n if (pathElements.length === 1) {\n // else check if the path exists\n return typeof get(obj, pathElements[0]) !== 'undefined';\n }\n\n // go deeper\n const currentPathElement = pathElements.shift();\n const v = get(obj, currentPathElement!);\n\n // undefined means the path does not exist\n if (typeof v === 'undefined') return false;\n\n // if we have an array, check if all elements have the path\n if (Array.isArray(v)) {\n return v.every((i) => this.hasPathRecursive(i, pathElements.join('.')));\n }\n\n // if we dont have an array, continue recursively\n return this.hasPathRecursive(v, pathElements.join('.'));\n }\n\n private applyFilterFn(\n obj: object | any[],\n path: string,\n {\n filterFn,\n value,\n negate,\n }: { filterFn: OperatorFn; value: ValueType; negate: boolean },\n ): boolean {\n // parse json operators \"->\" and \"->>\" to \".\"\n const pathElements = path.replace(/->>|->/g, '.').split('.');\n\n const v = get(obj, pathElements[0]);\n\n if (typeof v === 'undefined') {\n // if obj is an array, we should apply the filter to all elements of the array\n if (Array.isArray(obj)) {\n return obj.every((o) =>\n this.applyFilterFn(o, path, { filterFn, value, negate }),\n );\n }\n return false;\n }\n\n if (pathElements.length > 1) {\n // recursively resolve json path\n return this.applyFilterFn(\n v as Record<string, unknown>,\n pathElements.slice(1).join('.'),\n {\n filterFn,\n value,\n negate,\n },\n );\n }\n\n const res = filterFn(parseValue(v), value);\n if (negate) return !res;\n return res;\n }\n\n private buildFilterFn(\n def:\n | FilterDefinition\n | { or: FilterDefinitions }\n | { and: FilterDefinitions },\n ): (obj: object) => boolean {\n if ('or' in def) {\n return (obj: object) => def.or.some((d) => this.buildFilterFn(d)(obj));\n }\n if ('and' in def) {\n return (obj: object) => def.and.every((d) => this.buildFilterFn(d)(obj));\n }\n const { operator, path, value, negate, alias } = def;\n const filterFn = OPERATOR_MAP[operator];\n if (!filterFn)\n throw new Error(\n `Unable to build filter function for ${JSON.stringify(\n def,\n )}. Operator ${operator} is not supported.`,\n );\n\n return (obj: object) =>\n this.applyFilterFn(obj, alias ?? path, { filterFn, value, negate });\n }\n}\n","import { encodeObject } from './lib/encode-object';\nimport { getTableFromUrl } from './lib/get-table-from-url';\nimport { isObject } from './lib/is-object';\nimport {\n MaybeLikePostgrestBuilder,\n isLikePostgrestBuilder,\n} from './lib/like-postgrest-builder';\nimport { parseOrderBy } from './lib/parse-order-by';\nimport type { OrderDefinition } from './lib/query-types';\nimport { sortSearchParams } from './lib/sort-search-param';\nimport {\n PostgrestQueryParser,\n type PostgrestQueryParserOptions,\n} from './postgrest-query-parser';\n\nexport class PostgrestParser<Result> extends PostgrestQueryParser {\n private readonly _url: URL;\n private readonly _headers: Headers;\n private readonly _body: object | undefined;\n private readonly _method: 'GET' | 'HEAD' | 'POST' | 'PATCH' | 'DELETE';\n\n public readonly queryKey: string;\n public readonly bodyKey: string | undefined;\n public readonly count: string | null;\n public readonly schema: string;\n public readonly table: string;\n public readonly isHead: boolean | undefined;\n public readonly limit: number | undefined;\n public readonly offset: number | undefined;\n public readonly orderBy: OrderDefinition[] = [];\n public readonly orderByKey: string;\n\n constructor(\n fb: MaybeLikePostgrestBuilder<Result>,\n public readonly opts?: PostgrestQueryParserOptions,\n ) {\n if (!isLikePostgrestBuilder(fb)) {\n throw new Error('Invalid PostgrestBuilder');\n }\n\n super(new URL(fb['url']).searchParams.toString(), opts);\n\n this._url = new URL(fb['url']);\n this._headers = fb['headers'];\n this._body = isObject(fb['body']) ? { ...fb['body'] } : undefined;\n this._method = fb['method'];\n\n this.queryKey = sortSearchParams(this._url.searchParams).toString();\n\n this.table = getTableFromUrl(this._url.toString());\n\n if (this._body) {\n this.bodyKey = encodeObject(this._body as Record<string, unknown>);\n }\n\n // 'Prefer': return=minimal|representation,count=exact|planned|estimated\n const preferHeaders: Record<string, string> = (\n this._headers.get('Prefer') || ''\n )\n .split(',')\n .reduce<Record<string, string>>((prev, curr) => {\n const s = curr.split('=');\n return {\n ...prev,\n [s[0]]: s[1],\n };\n }, {});\n this.count = preferHeaders['count'] ?? null;\n\n this.schema = fb['schema'] as string;\n\n this.isHead = this._method === 'HEAD';\n\n const limit = this._url.searchParams.get('limit');\n this.limit = limit ? Number(limit) : undefined;\n const offset = this._url.searchParams.get('offset');\n this.offset = offset ? Number(offset) : undefined;\n\n this.orderBy = parseOrderBy(this._url.searchParams);\n this.orderByKey = this.orderBy\n .map(\n ({ column, ascending, nullsFirst, foreignTable }) =>\n `${foreignTable ? `${foreignTable}.` : ''}${column}:${\n ascending ? 'asc' : 'desc'\n }.${nullsFirst ? 'nullsFirst' : 'nullsLast'}`,\n )\n .join('|');\n }\n}\n","import type {\n PostgrestClientOptions,\n PostgrestQueryBuilder,\n} from '@supabase/postgrest-js';\nimport { UnstableGetResult as GetResult } from '@supabase/postgrest-js';\nimport {\n GenericSchema,\n GenericTable,\n} from '@supabase/postgrest-js/dist/cjs/types';\n\nimport {\n type MutationFetcherResponse,\n buildMutationFetcherResponse,\n} from './fetch/build-mutation-fetcher-response';\nimport {\n type BuildNormalizedQueryOps,\n buildNormalizedQuery,\n} from './fetch/build-normalized-query';\n\nexport type UpdateFetcher<T extends GenericTable, R> = (\n input: Partial<T['Row']>,\n) => Promise<MutationFetcherResponse<R> | null>;\n\nexport type UpdateFetcherOptions<\n O extends PostgrestClientOptions,\n S extends GenericSchema,\n T extends GenericTable,\n Re = T extends { Relationships: infer R } ? R : unknown,\n> = Parameters<PostgrestQueryBuilder<O, S, T, Re>['update']>[1] & {\n stripPrimaryKeys?: boolean;\n};\n\nexport const buildUpdateFetcher =\n <\n O extends PostgrestClientOptions,\n S extends GenericSchema,\n T extends GenericTable,\n RelationName,\n Re = T extends { Relationships: infer R } ? R : unknown,\n Q extends string = '*',\n R = GetResult<S, T['Row'], RelationName, Re, Q extends '*' ? '*' : Q, O>,\n >(\n qb: PostgrestQueryBuilder<O, S, T, Re>,\n primaryKeys: (keyof T['Row'])[],\n {\n stripPrimaryKeys = true,\n ...opts\n }: BuildNormalizedQueryOps<Q> & UpdateFetcherOptions<O, S, T>,\n ): UpdateFetcher<T, R> =>\n async (\n input: Partial<T['Row']>,\n ): Promise<MutationFetcherResponse<R> | null> => {\n const payload = stripPrimaryKeys\n ? primaryKeys.reduce<typeof input>(\n (acc, key) => {\n delete acc[key];\n return acc;\n },\n { ...input },\n )\n : input;\n let filterBuilder = qb.update(payload as any, opts); // todo fix type;\n for (const key of primaryKeys) {\n const value = input[key];\n // The value can be 0 or false, so we need to check if it's null or undefined instead of falsy\n if (value === null || value === undefined)\n throw new Error(`Missing value for primary key ${String(key)}`);\n // todo fix type\n filterBuilder = filterBuilder.eq(key as string, value as any);\n }\n\n const query = buildNormalizedQuery<Q>(opts);\n if (query) {\n const { selectQuery, groupedUserQueryPaths, groupedPaths } = query;\n const { data } = await filterBuilder\n .select(selectQuery)\n .throwOnError()\n .single();\n return buildMutationFetcherResponse(data as R, {\n groupedPaths,\n groupedUserQueryPaths,\n });\n }\n await filterBuilder.throwOnError().single();\n return { normalizedData: input as R };\n };\n","import type {\n PostgrestClientOptions,\n PostgrestQueryBuilder,\n} from '@supabase/postgrest-js';\nimport { UnstableGetResult as GetResult } from '@supabase/postgrest-js';\nimport {\n GenericSchema,\n GenericTable,\n} from '@supabase/postgrest-js/dist/cjs/types';\n\nimport {\n type MutationFetcherResponse,\n buildMutationFetcherResponse,\n} from './fetch/build-mutation-fetcher-response';\nimport {\n type BuildNormalizedQueryOps,\n buildNormalizedQuery,\n} from './fetch/build-normalized-query';\n\nexport type UpsertFetcher<T extends GenericTable, R> = (\n input: T['Insert'][],\n) => Promise<MutationFetcherResponse<R>[] | null>;\n\nexport type UpsertFetcherOptions<\n O extends PostgrestClientOptions,\n S extends GenericSchema,\n T extends GenericTable,\n Re = T extends { Relationships: infer R } ? R : unknown,\n> = Parameters<PostgrestQueryBuilder<O, S, T, Re>['upsert']>[1];\n\nexport const buildUpsertFetcher =\n <\n O extends PostgrestClientOptions,\n S extends GenericSchema,\n T extends GenericTable,\n RelationName,\n Re = T extends { Relationships: infer R } ? R : unknown,\n Q extends string = '*',\n R = GetResult<S, T['Row'], RelationName, Re, Q extends '*' ? '*' : Q, O>,\n >(\n qb: PostgrestQueryBuilder<O, S, T, Re>,\n opts: BuildNormalizedQueryOps<Q> & UpsertFetcherOptions<O, S, T>,\n ): UpsertFetcher<T, R> =>\n async (\n input: T['Insert'][],\n ): Promise<MutationFetcherResponse<R>[] | null> => {\n const query = buildNormalizedQuery<Q>(opts);\n if (query) {\n const { selectQuery, groupedUserQueryPaths, groupedPaths } = query;\n const { data } = await qb\n .upsert(input as any, opts) // todo fix type\n .throwOnError()\n .select(selectQuery);\n return (data as R[]).map((d) =>\n buildMutationFetcherResponse(d, {\n groupedPaths,\n groupedUserQueryPaths,\n }),\n );\n }\n await qb\n .upsert(input as any) // todo fix type\n .throwOnError();\n return input.map((d) => ({\n normalizedData: d as R,\n }));\n };\n","import { merge as mergeAnything } from 'merge-anything';\n\nimport {\n isPostgrestHasMorePaginationCacheData,\n isPostgrestPaginationCacheData,\n} from './lib/cache-data-types';\nimport { findIndexOrdered } from './lib/find-index-ordered';\nimport { parseOrderByKey } from './lib/parse-order-by-key';\nimport type { OrderDefinition } from './lib/query-types';\nimport { isAnyPostgrestResponse } from './lib/response-types';\nimport { shouldRevalidateRelation } from './mutate/should-revalidate-relation';\nimport { shouldRevalidateTable } from './mutate/should-revalidate-table';\nimport {\n toHasMorePaginationCacheData,\n toPaginationCacheData,\n} from './mutate/transformers';\nimport type { DecodedKey, MutatorFn, RevalidateOpts } from './mutate/types';\nimport type { PostgrestFilter } from './postgrest-filter';\nimport type { PostgrestQueryParserOptions } from './postgrest-query-parser';\n\ntype MergeFn<Type extends Record<string, unknown>> = (\n current: Type,\n input: Type,\n) => Type;\n\nexport const upsert = <Type extends Record<string, unknown>>(\n input: Type,\n currentData: Type[],\n primaryKeys: (keyof Type)[],\n filter: Pick<PostgrestFilter<Type>, 'apply'>,\n mergeFn?: MergeFn<Type>,\n orderBy?: OrderDefinition[],\n) => {\n const merge = mergeFn ?? (mergeAnything as MergeFn<Type>);\n\n // find item\n const itemIdx = currentData.findIndex((oldItem) =>\n primaryKeys.every((pk) => oldItem[pk] === input[pk]),\n );\n\n let newItem = input;\n let newItemIdx = itemIdx;\n\n if (itemIdx !== -1) {\n // if exists, merge and remove\n newItem = merge(currentData[itemIdx], input) as Type;\n currentData.splice(itemIdx, 1);\n }\n\n if (orderBy && Array.isArray(orderBy) && orderBy.length > 0) {\n // if ordered, find new idx\n newItemIdx = findIndexOrdered(newItem, currentData, orderBy);\n }\n\n if (newItemIdx === -1) {\n // default to prepend\n newItemIdx = 0;\n }\n\n // check that new item is still a valid member of the list and has all required paths\n if (filter.apply(newItem)) {\n currentData.splice(newItemIdx, 0, newItem);\n }\n\n return currentData;\n};\n\nexport type UpsertItemOperation<Type extends Record<string, unknown>> = {\n table: string;\n schema: string;\n input: Type;\n primaryKeys: (keyof Type)[];\n merge?: (current: Type, input: Type) => Type;\n} & RevalidateOpts<Type>;\n\nexport type UpsertItemCache<KeyType, Type extends Record<string, unknown>> = {\n /**\n * The keys currently present in the cache\n */\n cacheKeys: KeyType[];\n /**\n * Should return a PostgrestFilter for the given query.\n * This is exposed as a function so results can be cached by the cache library.\n */\n getPostgrestFilter: (\n query: string,\n opts?: PostgrestQueryParserOptions,\n ) => Pick<\n PostgrestFilter<Type>,\n | 'applyFilters'\n | 'denormalize'\n | 'hasFiltersOnPaths'\n | 'applyFiltersOnPaths'\n | 'apply'\n | 'hasWildcardPath'\n | 'hasAggregatePath'\n >;\n /**\n * Decode a key. Should return null if not a PostgREST key.\n */\n decode: (k: KeyType) => DecodedKey | null;\n /**\n * The mutation function from the cache library\n */\n mutate: (key: KeyType, fn: MutatorFn<Type>) => Promise<void> | void;\n /**\n * The revalidation function from the cache library\n */\n revalidate: (key: KeyType) => Promise<void> | void;\n};\nexport const upsertItem = async <KeyType, Type extends Record<string, unknown>>(\n op: UpsertItemOperation<Type>,\n cache: UpsertItemCache<KeyType, Type>,\n) => {\n const {\n revalidateRelations: revalidateRelationsOpt,\n revalidateTables: revalidateTablesOpt,\n schema,\n table,\n primaryKeys,\n } = op;\n const { cacheKeys, decode, getPostgrestFilter, mutate, revalidate } = cache;\n\n const mutations = [];\n for (const k of cacheKeys) {\n const key = decode(k);\n\n // Exit early if not a postgrest key\n if (!key) continue;\n const filter = getPostgrestFilter(key.queryKey);\n if (key.schema === schema && key.table === table) {\n // parse input into expected target format\n const transformedInput = filter.denormalize(op.input);\n if (\n filter.applyFilters(transformedInput) ||\n // also allow upsert if either the filter does not apply eq filters on any pk\n !filter.hasFiltersOnPaths(op.primaryKeys as string[]) ||\n // or input matches all pk filters\n filter.applyFiltersOnPaths(transformedInput, op.primaryKeys as string[])\n ) {\n const merge = op.merge ?? (mergeAnything as MergeFn<Type>);\n const limit = key.limit ?? 1000;\n const orderBy = key.orderByKey\n ? parseOrderByKey(key.orderByKey)\n : undefined;\n\n if (\n key.isHead === true ||\n filter.hasWildcardPath ||\n filter.hasAggregatePath\n ) {\n // we cannot know whether the new item after merging still has all paths required for a query if it contains a wildcard,\n // because we do not know what columns a table has. we must always revalidate then.\n mutations.push(revalidate(k));\n } else {\n mutations.push(\n mutate(k, (currentData) => {\n // Return early if undefined or null\n if (!currentData) return currentData;\n\n if (isPostgrestHasMorePaginationCacheData<Type>(currentData)) {\n return toHasMorePaginationCacheData(\n upsert<Type>(\n transformedInput,\n currentData.flatMap((p) => p.data),\n primaryKeys,\n filter,\n merge,\n orderBy,\n ),\n currentData,\n limit,\n );\n } else if (isPostgrestPaginationCacheData<Type>(currentData)) {\n return toPaginationCacheData(\n upsert<Type>(\n transformedInput,\n currentData.flat(),\n primaryKeys,\n filter,\n merge,\n orderBy,\n ),\n limit,\n );\n } else if (isAnyPostgrestResponse<Type>(currentData)) {\n const { data } = currentData;\n\n if (!Array.isArray(data)) {\n if (data === null) {\n return {\n data,\n count: currentData.count,\n };\n }\n const newData = merge(data, transformedInput);\n return {\n // Check if the new data is still valid given the key\n data: filter.apply(newData) ? newData : null,\n count: currentData.count,\n };\n }\n\n const newData = upsert<Type>(\n transformedInput,\n // deep copy data to avoid mutating the original\n JSON.parse(JSON.stringify(data)),\n primaryKeys,\n filter,\n merge,\n orderBy,\n );\n\n return {\n data: newData,\n count: newData.length,\n };\n }\n return currentData;\n }),\n );\n }\n }\n }\n\n if (\n revalidateTablesOpt &&\n shouldRevalidateTable(revalidateTablesOpt, { decodedKey: key })\n ) {\n mutations.push(revalidate(k));\n }\n\n if (\n revalidateRelationsOpt &&\n shouldRevalidateRelation(revalidateRelationsOpt, {\n input: op.input,\n getPostgrestFilter,\n decodedKey: key,\n })\n ) {\n mutations.push(revalidate(k));\n }\n }\n await Promise.all(mutations);\n};\n","import {\n RevalidateTables,\n shouldRevalidateTable,\n} from './mutate/should-revalidate-table';\nimport type { DecodedKey } from './mutate/types';\n\nexport type RevalidateTablesOperation = RevalidateTables;\n\nexport type RevalidateTablesCache<KeyType> = {\n /**\n * The keys currently present in the cache\n */\n cacheKeys: KeyType[];\n /**\n * Decode a key. Should return null if not a PostgREST key.\n */\n decode: (k: KeyType) => DecodedKey | null;\n /**\n * The revalidation function from the cache library\n */\n revalidate: (key: KeyType) => Promise<void> | void;\n};\n\nexport const revalidateTables = async <KeyType>(\n tables: RevalidateTablesOperation,\n cache: RevalidateTablesCache<KeyType>,\n) => {\n const { cacheKeys, decode, revalidate } = cache;\n\n const mutations = [];\n for (const k of cacheKeys) {\n const key = decode(k);\n\n // Exit early if not a postgrest key\n if (!key) continue;\n\n if (shouldRevalidateTable(tables, { decodedKey: key })) {\n mutations.push(revalidate(k));\n }\n }\n\n await Promise.all(mutations);\n};\n","import {\n type DeleteItemOperation,\n deleteItem,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { flatten } from 'flat';\n\nimport { decode, usePostgrestFilterCache } from '../lib';\n\n/**\n * Convenience hook to delete an item from the react query cache. Does not make any http requests, and is supposed to be used for custom cache updates.\n * @param opts The mutation options\n * @returns void\n */\nexport function useDeleteItem<Type extends Record<string, unknown>>(\n opts: Omit<DeleteItemOperation<Type>, 'input'>,\n) {\n const queryClient = useQueryClient();\n const getPostgrestFilter = usePostgrestFilterCache();\n\n return async (input: Type) =>\n await deleteItem(\n {\n input: flatten(input) as Type,\n ...opts,\n },\n {\n cacheKeys: queryClient\n .getQueryCache()\n .getAll()\n .map((c) => c.queryKey),\n getPostgrestFilter,\n revalidate: (key) => queryClient.invalidateQueries({ queryKey: key }),\n mutate: (key, fn) => {\n queryClient.setQueriesData({ queryKey: key }, fn);\n },\n decode,\n },\n );\n}\n","import {\n PostgrestFilter,\n type PostgrestQueryParserOptions,\n encodeObject,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { useQueryClient } from '@tanstack/react-query';\n\nexport const POSTGREST_FILTER_KEY_PREFIX = 'postgrest-filter';\n\nexport const usePostgrestFilterCache = <\n R extends Record<string, unknown>,\n>() => {\n const queryClient = useQueryClient();\n\n return (query: string, opts?: PostgrestQueryParserOptions) => {\n const key = [\n POSTGREST_FILTER_KEY_PREFIX,\n query,\n opts ? encodeObject(opts) : null,\n ];\n const cacheData = queryClient.getQueryData(key);\n if (cacheData instanceof PostgrestFilter) {\n return cacheData;\n }\n const filter = PostgrestFilter.fromQuery(query, opts);\n queryClient.setQueryData(key, filter);\n return filter as PostgrestFilter<R>;\n };\n};\n","import {\n type DecodedKey,\n PostgrestParser,\n isPostgrestBuilder,\n} from '@supabase-cache-helpers/postgrest-core';\n\nexport const KEY_PREFIX = 'postgrest';\nexport const INFINITE_KEY_PREFIX = 'page';\n\nexport type DecodedReactQueryKey = DecodedKey & {\n isInfinite: boolean;\n key: string[];\n};\n\nexport const encode = <Result>(key: unknown, isInfinite: boolean): string[] => {\n if (!isPostgrestBuilder<Result>(key)) {\n throw new Error('Key is not a PostgrestBuilder');\n }\n\n const parser = new PostgrestParser<Result>(key);\n return [\n KEY_PREFIX,\n isInfinite ? INFINITE_KEY_PREFIX : 'null',\n parser.schema,\n parser.table,\n parser.queryKey,\n parser.bodyKey ?? 'null',\n `count=${parser.count}`,\n `head=${parser.isHead}`,\n parser.orderByKey,\n ];\n};\n\nexport const decode = (key: unknown): DecodedReactQueryKey | null => {\n if (!Array.isArray(key)) return null;\n\n const [\n prefix,\n infinitePrefix,\n schema,\n table,\n queryKey,\n bodyKey,\n count,\n head,\n orderByKey,\n ] = key;\n\n // Exit early if not a postgrest key\n if (prefix !== KEY_PREFIX) return null;\n\n const params = new URLSearchParams(queryKey);\n const limit = params.get('limit');\n const offset = params.get('offset');\n\n const countValue = count.replace('count=', '');\n\n return {\n limit: limit ? Number(limit) : undefined,\n offset: offset ? Number(offset) : undefined,\n bodyKey,\n count: countValue === 'null' ? null : countValue,\n isHead: head === 'head=true',\n isInfinite: infinitePrefix === INFINITE_KEY_PREFIX,\n key,\n queryKey,\n schema,\n table,\n orderByKey,\n };\n};\n","import type { BuildNormalizedQueryOps } from '@supabase-cache-helpers/postgrest-core';\nimport { useQueryClient } from '@tanstack/react-query';\n\nimport { decode } from './key';\nimport { usePostgrestFilterCache } from './use-postgrest-filter-cache';\n\nexport const useQueriesForTableLoader = (table: string) => {\n const queryClient = useQueryClient();\n const getPostgrestFilter = usePostgrestFilterCache();\n\n return () =>\n queryClient\n .getQueryCache()\n .getAll()\n .map((c) => c.queryKey)\n .reduce<ReturnType<BuildNormalizedQueryOps['queriesForTable']>>(\n (prev, curr) => {\n const decodedKey = decode(curr);\n if (decodedKey?.table === table) {\n prev.push(getPostgrestFilter(decodedKey.queryKey).params);\n }\n return prev;\n },\n [],\n );\n};\n","import {\n type MutateItemOperation,\n mutateItem,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { flatten } from 'flat';\n\nimport { decode, usePostgrestFilterCache } from '../lib';\n\n/**\n * Convenience hook to mutate an item within the react query cache. Does not make any http requests, and is supposed to be used for custom cache updates.\n * @param opts The mutation options\n * @returns void\n */\nexport function useMutateItem<Type extends Record<string, unknown>>(\n opts: Omit<MutateItemOperation<Type>, 'input' | 'mutate'>,\n): (input: Partial<Type>, mutateFn: (current: Type) => Type) => Promise<void> {\n const queryClient = useQueryClient();\n const getPostgrestFilter = usePostgrestFilterCache();\n\n return async (input: Partial<Type>, mutateFn: (current: Type) => Type) =>\n await mutateItem(\n {\n input: flatten(input) as Partial<Type>,\n mutate: mutateFn,\n ...opts,\n },\n {\n cacheKeys: queryClient\n .getQueryCache()\n .getAll()\n .map((c) => c.queryKey),\n getPostgrestFilter,\n revalidate: (key) => queryClient.invalidateQueries({ queryKey: key }),\n mutate: (key, fn) => {\n queryClient.setQueriesData({ queryKey: key }, fn);\n },\n decode,\n },\n );\n}\n","import {\n type RevalidateTablesOperation,\n revalidateTables,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { useQueryClient } from '@tanstack/react-query';\n\nimport { decode } from '../lib';\n\n/**\n * Returns a function that can be used to revalidate all queries in the cache that match the tables provided in the `RevalidateTablesOperation`\n * This hook does not make any HTTP requests and is intended to be used for custom cache revalidations.\n *\n * @param opts - The tables to revalidate\n *\n * @returns A function that will revalidate all defined tables when called.\n * **/\nexport function useRevalidateTables(\n tables: RevalidateTablesOperation,\n): () => Promise<void> {\n const queryClient = useQueryClient();\n\n return async () =>\n await revalidateTables(tables, {\n cacheKeys: queryClient\n .getQueryCache()\n .getAll()\n .map((c) => c.queryKey),\n revalidate: (key) => queryClient.invalidateQueries({ queryKey: key }),\n decode,\n });\n}\n","import {\n type UpsertItemOperation,\n upsertItem,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { flatten } from 'flat';\n\nimport { decode, usePostgrestFilterCache } from '../lib';\n\n/**\n * Convenience hook to upsert an item into the react query cache. Does not make any http requests, and is supposed to be used for custom cache updates.\n * @param opts The mutation options\n * @returns void\n */\nexport function useUpsertItem<Type extends Record<string, unknown>>(\n opts: Omit<UpsertItemOperation<Type>, 'input'>,\n) {\n const queryClient = useQueryClient();\n const getPostgrestFilter = usePostgrestFilterCache();\n\n return async (input: Type) =>\n await upsertItem(\n {\n input: flatten(input) as Type,\n ...opts,\n },\n {\n cacheKeys: queryClient\n .getQueryCache()\n .getAll()\n .map((c) => c.queryKey),\n getPostgrestFilter,\n revalidate: (key) => queryClient.invalidateQueries({ queryKey: key }),\n mutate: (key, fn) => {\n queryClient.setQueriesData({ queryKey: key }, fn);\n },\n decode,\n },\n );\n}\n","import {\n buildDeleteFetcher,\n getTable,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type {\n PostgrestClientOptions,\n PostgrestQueryBuilder,\n} from '@supabase/postgrest-js';\nimport { UnstableGetResult as GetResult } from '@supabase/postgrest-js';\nimport {\n GenericSchema,\n GenericTable,\n} from '@supabase/postgrest-js/dist/cjs/types';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { useDeleteItem } from '../cache';\nimport { useQueriesForTableLoader } from '../lib';\nimport type { UsePostgrestMutationOpts } from './types';\n\n/**\n * Hook to execute a DELETE mutation\n *\n * @param {PostgrestQueryBuilder<S, T>} qb PostgrestQueryBuilder instance for the table\n * @param {Array<keyof T['Row']>} primaryKeys Array of primary keys of the table\n * @param {string | null} query Optional PostgREST query string for the DELETE mutation\n * @param {Omit<UsePostgrestMutationOpts<S, T, 'DeleteOne', Q, R>, 'mutationFn'>} [opts] Options to configure the hook\n */\nfunction useDeleteManyMutation<\n O extends PostgrestClientOptions,\n S extends GenericSchema,\n T extends GenericTable,\n RelationName extends string,\n Re = T extends { Relationships: infer R } ? R : unknown,\n Q extends string = '*',\n R = GetResult<S, T['Row'], RelationName, Re, Q extends '*' ? '*' : Q, O>,\n>(\n qb: PostgrestQueryBuilder<O, S, T, RelationName, Re>,\n primaryKeys: (keyof T['Row'])[],\n query?: Q | null,\n opts?: Omit<\n UsePostgrestMutationOpts<'DeleteMany', S, T, RelationName, Re, Q, R>,\n 'mutationFn'\n >,\n) {\n const queriesForTable = useQueriesForTableLoader(getTable(qb));\n const deleteItem = useDeleteItem({\n ...opts,\n primaryKeys,\n table: getTable(qb),\n schema: qb.schema as string,\n });\n\n return useMutation({\n mutationFn: async (input) => {\n const result = await buildDeleteFetcher<O, S, T, RelationName, Re, Q, R>(\n qb,\n primaryKeys,\n {\n query: query ?? undefined,\n queriesForTable,\n disabled: opts?.disableAutoQuery,\n ...opts,\n },\n )(input);\n\n if (result) {\n for (const r of result) {\n deleteItem(r.normalizedData as T['Row']);\n }\n }\n\n if (!result || result.every((r) => !r.userQueryData)) return null;\n\n return result.map((r) => r.userQueryData as R);\n },\n ...opts,\n });\n}\n\nexport { useDeleteManyMutation };\n","import {\n buildDeleteFetcher,\n getTable,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type {\n PostgrestClientOptions,\n PostgrestQueryBuilder,\n} from '@supabase/postgrest-js';\nimport { UnstableGetResult as GetResult } from '@supabase/postgrest-js';\nimport {\n GenericSchema,\n GenericTable,\n} from '@supabase/postgrest-js/dist/cjs/types';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { useDeleteItem } from '../cache';\nimport { useQueriesForTableLoader } from '../lib';\nimport type { UsePostgrestMutationOpts } from './types';\n\n/**\n * Hook to execute a DELETE mutation\n *\n * @param {PostgrestQueryBuilder<S, T>} qb PostgrestQueryBuilder instance for the table\n * @param {Array<keyof T['Row']>} primaryKeys Array of primary keys of the table\n * @param {string | null} query Optional PostgREST query string for the DELETE mutation\n * @param {Omit<UsePostgrestMutationOpts<S, T, 'DeleteOne', Q, R>, 'mutationFn'>} [opts] Options to configure the hook\n */\nfunction useDeleteMutation<\n O extends PostgrestClientOptions,\n S extends GenericSchema,\n T extends GenericTable,\n RelationName extends string,\n Re = T extends { Relationships: infer R } ? R : unknown,\n Q extends string = '*',\n R = GetResult<S, T['Row'], RelationName, Re, Q extends '*' ? '*' : Q, O>,\n>(\n qb: PostgrestQueryBuilder<O, S, T, RelationName, Re>,\n primaryKeys: (keyof T['Row'])[],\n query?: Q | null,\n opts?: Omit<\n UsePostgrestMutationOpts<'DeleteOne', S, T, RelationName, Re, Q, R>,\n 'mutationFn'\n >,\n) {\n const queriesForTable = useQueriesForTableLoader(getTable(qb));\n const deleteItem = useDeleteItem({\n ...opts,\n primaryKeys,\n table: getTable(qb),\n schema: qb.schema as string,\n });\n\n return useMutation({\n mutationFn: async (input) => {\n const r = await buildDeleteFetcher<O, S, T, RelationName, Re, Q, R>(\n qb,\n primaryKeys,\n {\n query: query ?? undefined,\n queriesForTable,\n disabled: opts?.disableAutoQuery,\n ...opts,\n },\n )([input]);\n\n if (!r) return null;\n\n const result = r[0];\n\n if (result) {\n await deleteItem(result.normalizedData as T['Row']);\n }\n return result?.userQueryData ?? null;\n },\n ...opts,\n });\n}\n\nexport { useDeleteMutation };\n","import {\n buildInsertFetcher,\n getTable,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type {\n PostgrestClientOptions,\n PostgrestQueryBuilder,\n} from '@supabase/postgrest-js';\nimport { UnstableGetResult as GetResult } from '@supabase/postgrest-js';\nimport {\n GenericSchema,\n GenericTable,\n} from '@supabase/postgrest-js/dist/cjs/types';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { useUpsertItem } from '../cache';\nimport { useQueriesForTableLoader } from '../lib';\nimport { getUserResponse } from './get-user-response';\nimport type { UsePostgrestMutationOpts } from './types';\n\n/**\n * Hook to execute a INSERT mutation\n *\n * @param {PostgrestQueryBuilder<S, T>} qb PostgrestQueryBuilder instance for the table\n * @param {Array<keyof T['Row']>} primaryKeys Array of primary keys of the table\n * @param {string | null} query Optional PostgREST query string for the INSERT mutation\n * @param {Omit<UsePostgrestMutationOpts<S, T, 'Insert', Q, R>, 'mutationFn'>} [opts] Options to configure the hook\n */\nfunction useInsertMutation<\n O extends PostgrestClientOptions,\n S extends GenericSchema,\n T extends GenericTable,\n RelationName extends string,\n Re = T extends { Relationships: infer R } ? R : unknown,\n Q extends string = '*',\n R = GetResult<S, T['Row'], RelationName, Re, Q extends '*' ? '*' : Q, O>,\n>(\n qb: PostgrestQueryBuilder<O, S, T, RelationName, Re>,\n primaryKeys: (keyof T['Row'])[],\n query?: Q | null,\n opts?: Omit<\n UsePostgrestMutationOpts<'Insert', S, T, RelationName, Re, Q, R>,\n 'mutationFn'\n >,\n) {\n const queriesForTable = useQueriesForTableLoader(getTable(qb));\n const upsertItem = useUpsertItem({\n ...opts,\n primaryKeys,\n table: getTable(qb),\n schema: qb.schema as string,\n });\n\n return useMutation({\n mutationFn: async (input) => {\n const result = await buildInsertFetcher<O, S, T, RelationName, Re, Q, R>(\n qb,\n {\n query: query ?? undefined,\n queriesForTable,\n disabled: opts?.disableAutoQuery,\n ...opts,\n },\n )(input);\n\n if (result) {\n await Promise.all(\n result.map(\n async (d) => await upsertItem(d.normalizedData as T['Row']),\n ),\n );\n }\n return getUserResponse(result) ?? null;\n },\n ...opts,\n });\n}\n\nexport { useInsertMutation };\n","import type { MutationFetcherResponse } from '@supabase-cache-helpers/postgrest-core';\n\ntype Truthy<T> = T extends false | '' | 0 | null | undefined ? never : T; // from lodash\n\nexport function truthy<T>(value: T): value is Truthy<T> {\n return !!value;\n}\n\nexport const getUserResponse = <R>(\n d: MutationFetcherResponse<R>[] | null | undefined,\n) => {\n if (!d) return d;\n return d.map((r) => r.userQueryData).filter(truthy);\n};\n","import {\n buildUpdateFetcher,\n getTable,\n} from '@supabase-cache-helpers/postgrest-core';\nimport {\n PostgrestClientOptions,\n PostgrestQueryBuilder,\n} from '@supabase/postgrest-js';\nimport { UnstableGetResult as GetResult } from '@supabase/postgrest-js';\nimport {\n GenericSchema,\n GenericTable,\n} from '@supabase/postgrest-js/dist/cjs/types';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { useUpsertItem } from '../cache';\nimport { useQueriesForTableLoader } from '../lib';\nimport type { UsePostgrestMutationOpts } from './types';\n\n/**\n * Hook to execute a UPDATE mutation\n *\n * @param {PostgrestQueryBuilder<S, T>} qb PostgrestQueryBuilder instance for the table\n * @param {Array<keyof T['Row']>} primaryKeys Array of primary keys of the table\n * @param {string | null} query Optional PostgREST query string for the UPDATE mutation\n * @param {Omit<UsePostgrestMutationOpts<S, T, 'UpdateOne', Q, R>, 'mutationFn'>} [opts] Options to configure the hook\n */\nfunction useUpdateMutation<\n O extends PostgrestClientOptions,\n S extends GenericSchema,\n T extends GenericTable,\n RelationName extends string,\n Relationships = T extends { Relationships: infer R } ? R : unknown,\n Q extends string = '*',\n R = GetResult<\n S,\n T['Row'],\n RelationName,\n Relationships,\n Q extends '*' ? '*' : Q,\n O\n >,\n>(\n qb: PostgrestQueryBuilder<O, S, T, RelationName, Relationships>,\n primaryKeys: (keyof T['Row'])[],\n query?: Q | null,\n opts?: Omit<\n UsePostgrestMutationOpts<\n 'UpdateOne',\n S,\n T,\n RelationName,\n Relationships,\n Q,\n R\n >,\n 'mutationFn'\n >,\n) {\n const queriesForTable = useQueriesForTableLoader(getTable(qb));\n const upsertItem = useUpsertItem({\n ...opts,\n primaryKeys,\n table: getTable(qb),\n schema: qb.schema as string,\n });\n\n return useMutation({\n mutationFn: async (input) => {\n const result = await buildUpdateFetcher<\n O,\n S,\n T,\n RelationName,\n Relationships,\n Q,\n R\n >(qb, primaryKeys, {\n query: query ?? undefined,\n queriesForTable,\n disabled: opts?.disableAutoQuery,\n ...opts,\n })(input);\n if (result) {\n await upsertItem(result.normalizedData as T['Row']);\n }\n return result?.userQueryData ?? null;\n },\n ...opts,\n });\n}\n\nexport { useUpdateMutation };\n","import {\n buildUpsertFetcher,\n getTable,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type {\n PostgrestClientOptions,\n PostgrestQueryBuilder,\n} from '@supabase/postgrest-js';\nimport { UnstableGetResult as GetResult } from '@supabase/postgrest-js';\nimport {\n GenericSchema,\n GenericTable,\n} from '@supabase/postgrest-js/dist/cjs/types';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { useUpsertItem } from '../cache';\nimport { useQueriesForTableLoader } from '../lib';\nimport { getUserResponse } from './get-user-response';\nimport type { UsePostgrestMutationOpts } from './types';\n\n/**\n * Hook to execute a UPSERT mutation\n *\n * @param {PostgrestQueryBuilder<S, T>} qb PostgrestQueryBuilder instance for the table\n * @param {Array<keyof T['Row']>} primaryKeys Array of primary keys of the table\n * @param {string | null} query Optional PostgREST query string for the UPSERT mutation\n * @param {Omit<UsePostgrestMutationOpts<S, T, 'Upsert', Q, R>, 'mutationFn'>} [opts] Options to configure the hook\n */\nfunction useUpsertMutation<\n O extends PostgrestClientOptions,\n S extends GenericSchema,\n T extends GenericTable,\n RelationName extends string,\n Re = T extends { Relationships: infer R } ? R : unknown,\n Q extends string = '*',\n R = GetResult<S, T['Row'], RelationName, Re, Q extends '*' ? '*' : Q, O>,\n>(\n qb: PostgrestQueryBuilder<O, S, T, RelationName, Re>,\n primaryKeys: (keyof T['Row'])[],\n query?: Q | null,\n opts?: Omit<\n UsePostgrestMutationOpts<'Upsert', S, T, RelationName, Re, Q, R>,\n 'mutationFn'\n >,\n) {\n const queriesForTable = useQueriesForTableLoader(getTable(qb));\n const upsertItem = useUpsertItem({\n ...opts,\n primaryKeys,\n table: getTable(qb),\n schema: qb.schema as string,\n });\n\n return useMutation({\n mutationFn: async (input: T['Insert'][]) => {\n const data = await buildUpsertFetcher<O, S, T, RelationName, Re, Q, R>(\n qb,\n {\n query: query ?? undefined,\n queriesForTable,\n disabled: opts?.disableAutoQuery,\n ...opts,\n },\n )(input);\n if (data) {\n await Promise.all(\n data.map(async (d) => await upsertItem(d.normalizedData as T['Row'])),\n );\n }\n return getUserResponse(data) ?? null;\n },\n ...opts,\n });\n}\n\nexport { useUpsertMutation };\n","import {\n type AnyPostgrestResponse,\n isPostgrestBuilder,\n isPostgrestTransformBuilder,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type { PostgrestError } from '@supabase/postgrest-js';\nimport type { UseQueryOptions as UseReactQueryOptions } from '@tanstack/react-query';\n\nimport { encode } from '../lib/key';\n\nexport function buildQueryOpts<Result>(\n query: PromiseLike<AnyPostgrestResponse<Result>>,\n config?: Omit<\n UseReactQueryOptions<AnyPostgrestResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): UseReactQueryOptions<AnyPostgrestResponse<Result>, PostgrestError> {\n return {\n queryKey: encode<Result>(query, false),\n queryFn: async ({ signal }) => {\n if (isPostgrestTransformBuilder(query)) {\n query = query.abortSignal(signal);\n }\n if (isPostgrestBuilder(query)) {\n query = query.throwOnError();\n }\n return await query;\n },\n ...config,\n };\n}\n","import type { AnyPostgrestResponse } from '@supabase-cache-helpers/postgrest-core';\nimport type {\n PostgrestError,\n PostgrestMaybeSingleResponse,\n PostgrestResponse,\n PostgrestSingleResponse,\n} from '@supabase/postgrest-js';\nimport type { FetchQueryOptions, QueryClient } from '@tanstack/react-query';\n\nimport { buildQueryOpts } from './build-query-opts';\n\nfunction fetchQuery<Result>(\n queryClient: QueryClient,\n query: PromiseLike<PostgrestSingleResponse<Result>>,\n config?: Omit<\n FetchQueryOptions<PostgrestSingleResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): Promise<PostgrestSingleResponse<Result>>;\nfunction fetchQuery<Result>(\n queryClient: QueryClient,\n query: PromiseLike<PostgrestMaybeSingleResponse<Result>>,\n config?: Omit<\n FetchQueryOptions<PostgrestMaybeSingleResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): Promise<PostgrestMaybeSingleResponse<Result>>;\nfunction fetchQuery<Result>(\n queryClient: QueryClient,\n query: PromiseLike<PostgrestResponse<Result>>,\n config?: Omit<\n FetchQueryOptions<PostgrestResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): Promise<PostgrestResponse<Result>>;\n\nasync function fetchQuery<Result>(\n queryClient: QueryClient,\n query: PromiseLike<AnyPostgrestResponse<Result>>,\n config?: Omit<\n FetchQueryOptions<AnyPostgrestResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): Promise<AnyPostgrestResponse<Result>> {\n return await queryClient.fetchQuery<\n AnyPostgrestResponse<Result>,\n PostgrestError\n >(buildQueryOpts(query, config));\n}\n\nexport { fetchQuery };\n","import {\n type AnyPostgrestResponse,\n isPostgrestBuilder,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type {\n PostgrestError,\n PostgrestMaybeSingleResponse,\n PostgrestResponse,\n PostgrestSingleResponse,\n} from '@supabase/postgrest-js';\nimport type { FetchQueryOptions, QueryClient } from '@tanstack/react-query';\n\nimport { encode } from '../lib';\nimport { buildQueryOpts } from './build-query-opts';\n\nfunction prefetchQuery<Result>(\n queryClient: QueryClient,\n query: PromiseLike<PostgrestSingleResponse<Result>>,\n config?: Omit<\n FetchQueryOptions<PostgrestSingleResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): Promise<void>;\nfunction prefetchQuery<Result>(\n queryClient: QueryClient,\n query: PromiseLike<PostgrestMaybeSingleResponse<Result>>,\n config?: Omit<\n FetchQueryOptions<PostgrestMaybeSingleResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): Promise<void>;\nfunction prefetchQuery<Result>(\n queryClient: QueryClient,\n query: PromiseLike<PostgrestResponse<Result>>,\n config?: Omit<\n FetchQueryOptions<PostgrestResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): Promise<void>;\n\nasync function prefetchQuery<Result>(\n queryClient: QueryClient,\n query: PromiseLike<AnyPostgrestResponse<Result>>,\n config?: Omit<\n FetchQueryOptions<AnyPostgrestResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n) {\n await queryClient.prefetchQuery<AnyPostgrestResponse<Result>, PostgrestError>(\n buildQueryOpts(query, config),\n );\n}\n\nfunction fetchQueryInitialData<Result>(\n query: PromiseLike<PostgrestSingleResponse<Result>>,\n): Promise<[string[], PostgrestSingleResponse<Result>]>;\n\nfunction fetchQueryInitialData<Result>(\n query: PromiseLike<PostgrestMaybeSingleResponse<Result>>,\n): Promise<[string[], PostgrestMaybeSingleResponse<Result>]>;\n\nfunction fetchQueryInitialData<Result>(\n query: PromiseLike<PostgrestResponse<Result>>,\n): Promise<[string[], PostgrestResponse<Result>]>;\n\nasync function fetchQueryInitialData<Result>(\n query: PromiseLike<AnyPostgrestResponse<Result>>,\n): Promise<[string[], AnyPostgrestResponse<Result>]> {\n if (!isPostgrestBuilder<Result>(query)) {\n throw new Error('Query is not a PostgrestBuilder');\n }\n\n return [encode(query, false), await query.throwOnError()];\n}\n\nexport { prefetchQuery, fetchQueryInitialData };\n","import type { AnyPostgrestResponse } from '@supabase-cache-helpers/postgrest-core';\nimport type {\n PostgrestError,\n PostgrestMaybeSingleResponse,\n PostgrestResponse,\n PostgrestSingleResponse,\n} from '@supabase/postgrest-js';\nimport {\n type UseQueryOptions as UseReactQueryOptions,\n type UseQueryResult as UseReactQueryResult,\n useQuery as useReactQuery,\n} from '@tanstack/react-query';\n\nimport { buildQueryOpts } from './build-query-opts';\n\n/**\n * Applies Omit over a union, while preserving its union-ness.\n */\ntype DistributiveOmit<T, K extends keyof any> = T extends any\n ? Omit<T, K>\n : never;\n\n/**\n * Represents the return value of the `useQuery` hook when `query` is expected to return\n * a single row.\n */\nexport type UseQuerySingleReturn<Result> = DistributiveOmit<\n UseReactQueryResult<PostgrestSingleResponse<Result>['data'], PostgrestError>,\n 'refetch'\n> &\n Pick<\n UseReactQueryResult<PostgrestSingleResponse<Result>, PostgrestError>,\n 'refetch'\n > &\n Pick<PostgrestSingleResponse<Result>, 'count'>;\n\n/**\n * Represents the return value of the `useQuery` hook when `query` is expected to return\n * either a single row or an empty response.\n */\nexport type UseQueryMaybeSingleReturn<Result> = DistributiveOmit<\n UseReactQueryResult<\n PostgrestMaybeSingleResponse<Result>['data'],\n PostgrestError\n >,\n 'refetch'\n> &\n Pick<\n UseReactQueryResult<PostgrestMaybeSingleResponse<Result>, PostgrestError>,\n 'refetch'\n > &\n Pick<PostgrestMaybeSingleResponse<Result>, 'count'>;\n\n/**\n * Represents the return value of the `useQuery` hook when `query` is expected to return\n * one or more rows.\n */\nexport type UseQueryReturn<Result> = DistributiveOmit<\n UseReactQueryResult<PostgrestResponse<Result>['data'], PostgrestError>,\n 'refetch'\n> &\n Pick<\n UseReactQueryResult<PostgrestResponse<Result>, PostgrestError>,\n 'refetch'\n > &\n Pick<PostgrestResponse<Result>, 'count'>;\n\n/**\n * Represents the return value of the `useQuery` hook when the type of the query response\n * is not known.\n */\nexport type UseQueryAnyReturn<Result> = DistributiveOmit<\n UseReactQueryResult<AnyPostgrestResponse<Result>['data'], PostgrestError>,\n 'refetch'\n> &\n Pick<\n UseReactQueryResult<AnyPostgrestResponse<Result>, PostgrestError>,\n 'refetch'\n > &\n Pick<AnyPostgrestResponse<Result>, 'count'>;\n\n/**\n * React hook to execute a PostgREST query and return a single item response.\n *\n * @param {PromiseLike<PostgrestSingleResponse<Result>>} query A promise that resolves to a PostgREST single item response.\n * @param {Omit<UseReactQueryOptions<PostgrestSingleResponse<Result>, PostgrestError>, 'queryKey' | 'queryFn'>} [config] The React Query options.\n * @returns {UseQuerySingleReturn<Result>} The hook result containing the single item response data.\n */\nfunction useQuery<Result>(\n query: PromiseLike<PostgrestSingleResponse<Result>>,\n config?: Omit<\n UseReactQueryOptions<PostgrestSingleResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): UseQuerySingleReturn<Result>;\n/**\n * React hook to execute a PostgREST query and return a maybe single item response.\n *\n * @param {PromiseLike<PostgrestMaybeSingleResponse<Result>>} query A promise that resolves to a PostgREST maybe single item response.\n * @param {Omit<UseReactQueryOptions<PostgrestMaybeSingleResponse<Result>, PostgrestError>, 'queryKey' | 'queryFn'>} [config] The React Query options.\n * @returns {UseQueryMaybeSingleReturn<Result>} The hook result containing the maybe single item response data.\n */\nfunction useQuery<Result>(\n query: PromiseLike<PostgrestMaybeSingleResponse<Result>>,\n config?: Omit<\n UseReactQueryOptions<PostgrestMaybeSingleResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryMaybeSingleReturn<Result>;\n/**\n * React hook to execute a PostgREST query.\n *\n * @template Result The expected response data type.\n * @param {PromiseLike<PostgrestResponse<Result>>} query A promise that resolves to a PostgREST response.\n * @param {Omit<UseReactQueryOptions<PostgrestResponse<Result>, PostgrestError>, 'queryKey' | 'queryFn'>} [config] The React Query options.\n * @returns {UseQueryReturn<Result>} The hook result containing the response data.\n */\nfunction useQuery<Result>(\n query: PromiseLike<PostgrestResponse<Result>>,\n config?: Omit<\n UseReactQueryOptions<PostgrestResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryReturn<Result>;\n\n/**\n * React hook to execute a PostgREST query.\n *\n * @template Result The expected response data type.\n * @param {PromiseLike<AnyPostgrestResponse<Result>>} query A promise that resolves to a PostgREST response of any kind.\n * @param {Omit<UseReactQueryOptions<AnyPostgrestResponse<Result>, PostgrestError>, 'queryKey' | 'queryFn'>} [config] The React Query options.\n * @returns {UseQueryAnyReturn<Result>} The hook result containing the response data.\n */\nfunction useQuery<Result>(\n query: PromiseLike<AnyPostgrestResponse<Result>>,\n config?: Omit<\n UseReactQueryOptions<AnyPostgrestResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryAnyReturn<Result> {\n const result = useReactQuery<AnyPostgrestResponse<Result>, PostgrestError>(\n buildQueryOpts<Result>(query, config),\n );\n\n // isPending and isLoadingError are the only cases in which no data is present\n if (result.isPending || result.isLoadingError) {\n return {\n ...result,\n data: undefined,\n count: null,\n } as UseQueryAnyReturn<Result>;\n }\n\n return {\n ...result,\n data: result.data?.data,\n count: result.data?.count,\n } as UseQueryAnyReturn<Result>;\n}\n\nexport { useQuery };\n","import {\n type RevalidateOpts,\n buildNormalizedQuery,\n normalizeResponse,\n} from '@supabase-cache-helpers/postgrest-core';\nimport {\n UnstableGetResult as GetResult,\n PostgrestClientOptions,\n} from '@supabase/postgrest-js';\nimport {\n GenericSchema,\n GenericTable,\n} from '@supabase/postgrest-js/dist/cjs/types';\nimport {\n REALTIME_LISTEN_TYPES,\n REALTIME_POSTGRES_CHANGES_LISTEN_EVENT,\n type RealtimeChannel,\n type RealtimePostgresChangesFilter,\n type RealtimePostgresChangesPayload,\n type SupabaseClient,\n} from '@supabase/supabase-js';\nimport type { MutationOptions as ReactQueryMutatorOptions } from '@tanstack/react-query';\nimport { useEffect, useState } from 'react';\n\nimport { useDeleteItem, useUpsertItem } from '../cache';\nimport { useQueriesForTableLoader } from '../lib';\n\n/**\n * Options for `useSubscriptionQuery` hook\n */\nexport type UseSubscriptionQueryOpts<\n S extends GenericSchema,\n T extends GenericTable,\n RelationName extends string,\n Re = T extends { Relationships: infer R } ? R : unknown,\n Q extends string = '*',\n R = GetResult<\n S,\n T['Row'],\n RelationName,\n Re,\n Q extends '*' ? '*' : Q,\n PostgrestClientOptions\n >,\n> = RevalidateOpts<T['Row']> &\n ReactQueryMutatorOptions & {\n /**\n * A callback that will be called whenever a realtime event occurs for the given channel.\n * The callback will receive the event payload with an additional \"data\" property, which will be\n * the affected row of the event (or a modified version of it, if a select query is provided).\n */\n callback?: (\n event: RealtimePostgresChangesPayload<T['Row']> & { data: T['Row'] | R },\n ) => void | Promise<void>;\n };\n\n/**\n * A hook for subscribing to realtime Postgres events on a given channel.\n *\n * The subscription will automatically update the cache for the specified table in response\n * to incoming Postgres events, and optionally run a user-provided callback function with the\n * event and the updated data.\n *\n * This hook works by creating a Supabase Realtime channel for the specified table and\n * subscribing to Postgres changes on that channel. When an event is received, the hook\n * fetches the updated data from the database (using a `select` query generated from the cache\n * configuration), and then updates the cache accordingly.\n *\n * @param client - The Supabase client instance.\n * @param channelName - The name of the channel to subscribe to.\n * @param filter - The filter object to use when listening for changes.\n * @param primaryKeys - An array of the primary keys for the table being listened to.\n * @param query - An optional PostgREST query to use when selecting data for an event.\n * @param opts - Additional options to pass to the hook.\n * @returns An object containing the RealtimeChannel and the current status of the subscription.\n */\nfunction useSubscriptionQuery<\n S extends GenericSchema,\n T extends GenericTable,\n RelationName extends string,\n Re = T extends { Relationships: infer R } ? R : unknown,\n Q extends string = '*',\n R = GetResult<\n S,\n T['Row'],\n RelationName,\n Re,\n Q extends '*' ? '*' : Q,\n PostgrestClientOptions\n >,\n>(\n client: SupabaseClient | null,\n channelName: string,\n filter: Omit<\n RealtimePostgresChangesFilter<`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.ALL}`>,\n 'table'\n > & {\n table: RelationName;\n },\n primaryKeys: (keyof T['Row'])[],\n query?: Q extends '*' ? \"'*' is not allowed\" : Q | null,\n opts?: UseSubscriptionQueryOpts<S, T, RelationName, Re, Q, R>,\n) {\n const [status, setStatus] = useState<string>();\n const [channel, setChannel] = useState<RealtimeChannel>();\n const queriesForTable = useQueriesForTableLoader(filter.table);\n const deleteItem = useDeleteItem({\n ...opts,\n primaryKeys,\n table: filter.table,\n schema: filter.schema,\n });\n const upsertItem = useUpsertItem({\n ...opts,\n primaryKeys,\n table: filter.table,\n schema: filter.schema,\n });\n\n useEffect(() => {\n if (!client) return;\n\n const c = client\n .channel(channelName)\n .on<T['Row']>(\n REALTIME_LISTEN_TYPES.POSTGRES_CHANGES,\n filter,\n async (payload) => {\n let data: T['Row'] | R = payload.new ?? payload.old;\n const selectQuery = buildNormalizedQuery({ queriesForTable, query });\n if (\n payload.eventType !==\n REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE &&\n selectQuery\n ) {\n const qb = client\n .from(payload.table)\n .select(selectQuery.selectQuery);\n for (const pk of primaryKeys) {\n qb.eq(pk.toString(), data[pk]);\n }\n const res = await qb.single();\n if (res.data) {\n data = normalizeResponse(selectQuery.groupedPaths, res.data) as R;\n }\n }\n\n if (\n payload.eventType ===\n REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT ||\n payload.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE\n ) {\n await upsertItem(data as Record<string, unknown>);\n } else if (\n payload.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE\n ) {\n await deleteItem(payload.old);\n }\n if (opts?.callback) {\n opts.callback({\n ...payload,\n data,\n });\n }\n },\n )\n .subscribe((status: string) => setStatus(status));\n\n setChannel(c);\n\n return () => {\n if (c) c.unsubscribe();\n };\n }, []);\n\n return { channel, status };\n}\n\nexport { useSubscriptionQuery };\n","import type { RevalidateOpts } from '@supabase-cache-helpers/postgrest-core';\nimport type { GenericTable } from '@supabase/postgrest-js/dist/cjs/types';\nimport {\n REALTIME_LISTEN_TYPES,\n REALTIME_POSTGRES_CHANGES_LISTEN_EVENT,\n type RealtimePostgresChangesFilter,\n type RealtimePostgresChangesPayload,\n type SupabaseClient,\n} from '@supabase/supabase-js';\nimport type { MutationOptions as ReactQueryMutatorOptions } from '@tanstack/react-query';\nimport { useEffect, useState } from 'react';\n\nimport { useDeleteItem, useUpsertItem } from '../cache';\n\n/**\n * Options for the `useSubscription` hook.\n */\nexport type UseSubscriptionOpts<T extends GenericTable> = RevalidateOpts<\n T['Row']\n> &\n ReactQueryMutatorOptions & {\n callback?: (\n event: RealtimePostgresChangesPayload<T['Row']>,\n ) => void | Promise<void>;\n };\n\n/**\n * Hook that sets up a real-time subscription to a Postgres database table.\n *\n * @param channel - The real-time channel to subscribe to.\n * @param filter - A filter that specifies the table and conditions for the subscription.\n * @param primaryKeys - An array of primary key column names for the table.\n * @param opts - Options for the mutation function used to upsert or delete rows in the cache.\n *\n * @returns An object containing the current status of the subscription.\n */\nfunction useSubscription<T extends GenericTable>(\n client: SupabaseClient | null,\n channelName: string,\n filter: Omit<\n RealtimePostgresChangesFilter<`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.ALL}`>,\n 'table'\n > & {\n table: string;\n },\n primaryKeys: (keyof T['Row'])[],\n opts?: UseSubscriptionOpts<T>,\n) {\n const [status, setStatus] = useState<string>();\n const deleteItem = useDeleteItem({\n ...opts,\n primaryKeys,\n table: filter.table,\n schema: filter.schema,\n });\n const upsertItem = useUpsertItem({\n ...opts,\n primaryKeys,\n table: filter.table,\n schema: filter.schema,\n });\n\n useEffect(() => {\n if (!client) return;\n\n const c = client\n .channel(channelName)\n .on<T['Row']>(\n REALTIME_LISTEN_TYPES.POSTGRES_CHANGES,\n filter,\n async (payload) => {\n if (\n payload.eventType ===\n REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT ||\n payload.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE\n ) {\n await upsertItem(payload.new);\n } else if (\n payload.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE\n ) {\n await deleteItem(payload.old);\n }\n if (opts?.callback) {\n opts.callback({\n ...payload,\n });\n }\n },\n )\n .subscribe((status: string) => setStatus(status));\n\n return () => {\n if (c) c.unsubscribe();\n };\n }, []);\n\n return { status };\n}\n\nexport { useSubscription };\n"],"mappings":"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A,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,OAAO;AAAA,MACX;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,OAAO;AAAA,MACX;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,OAAO;AAAA,MACX;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,OAAO;AAAA,MACX;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,OAAO;AAAA,MACX;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,OAAO;AAAA,MACX;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,UAAU;AAA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","names":["hex","dec","n","XRegExp","REGEX_DATA","XRegExp","XRegExp","dec","hex","pad4","XRegExp","categories","XRegExp","properties","XRegExp","scripts","p","isPlainObject","flatten","decode","prev","isArray","unflatten","v","tokens","ifDateGetTime","obj","merge","decode","useQueryClient","useQueryClient","useQueryClient","useQueryClient","useQueryClient","useMutation","useMutation","useMutation","useMutation","REALTIME_LISTEN_TYPES","REALTIME_POSTGRES_CHANGES_LISTEN_EVENT","useEffect","useState","useQueryClient","__async","__spreadValues","useQueryClient","__async","__spreadValues","flatten","deleteItem","__spreadProps","getTable","upsertItem","__spreadProps","__spreadValues","useMutation","__async","__spreadValues","__async","isPostgrestBuilder","__spreadProps","__spreadValues"]}
|